Bwidget Source Code
Hex Artifact Content
Not logged in
Bounty program for improvements to Tcl and certain Tcl packages.
Tcl 2019 Conference, Houston/TX, US, Nov 4-8
Send your abstracts to [email protected]
or submit via the online form by Sep 9.

Artifact b716b47059b69df5dc596bc3dc51654b6d66b937:


0000: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0050: 20 20 6c 69 73 74 62 6f 78 2e 74 63 6c 0a 23 20    listbox.tcl.# 
0060: 20 54 68 69 73 20 66 69 6c 65 20 69 73 20 70 61   This file is pa
0070: 72 74 20 6f 66 20 55 6e 69 66 69 78 20 42 57 69  rt of Unifix BWi
0080: 64 67 65 74 20 54 6f 6f 6c 6b 69 74 0a 23 20 20  dget Toolkit.#  
0090: 24 49 64 3a 20 6c 69 73 74 62 6f 78 2e 74 63 6c  $Id: listbox.tcl
00a0: 2c 76 20 31 2e 32 31 20 32 30 30 34 2f 30 35 2f  ,v 1.21 2004/05/
00b0: 30 34 20 31 35 3a 35 37 3a 33 31 20 68 6f 62 62  04 15:57:31 hobb
00c0: 73 20 45 78 70 20 24 0a 23 20 2d 2d 2d 2d 2d 2d  s Exp $.# ------
00d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0110: 2d 2d 2d 2d 2d 2d 0a 23 20 20 49 6e 64 65 78 20  ------.#  Index 
0120: 6f 66 20 63 6f 6d 6d 61 6e 64 73 3a 0a 23 20 20  of commands:.#  
0130: 20 20 20 2d 20 4c 69 73 74 42 6f 78 3a 3a 63 72     - ListBox::cr
0140: 65 61 74 65 0a 23 20 20 20 20 20 2d 20 4c 69 73  eate.#     - Lis
0150: 74 42 6f 78 3a 3a 63 6f 6e 66 69 67 75 72 65 0a  tBox::configure.
0160: 23 20 20 20 20 20 2d 20 4c 69 73 74 42 6f 78 3a  #     - ListBox:
0170: 3a 63 67 65 74 0a 23 20 20 20 20 20 2d 20 4c 69  :cget.#     - Li
0180: 73 74 42 6f 78 3a 3a 69 6e 73 65 72 74 0a 23 20  stBox::insert.# 
0190: 20 20 20 20 2d 20 4c 69 73 74 42 6f 78 3a 3a 69      - ListBox::i
01a0: 74 65 6d 63 6f 6e 66 69 67 75 72 65 0a 23 20 20  temconfigure.#  
01b0: 20 20 20 2d 20 4c 69 73 74 42 6f 78 3a 3a 69 74     - ListBox::it
01c0: 65 6d 63 67 65 74 0a 23 20 20 20 20 20 2d 20 4c  emcget.#     - L
01d0: 69 73 74 42 6f 78 3a 3a 62 69 6e 64 54 65 78 74  istBox::bindText
01e0: 0a 23 20 20 20 20 20 2d 20 4c 69 73 74 42 6f 78  .#     - ListBox
01f0: 3a 3a 62 69 6e 64 49 6d 61 67 65 0a 23 20 20 20  ::bindImage.#   
0200: 20 20 2d 20 4c 69 73 74 42 6f 78 3a 3a 64 65 6c    - ListBox::del
0210: 65 74 65 0a 23 20 20 20 20 20 2d 20 4c 69 73 74  ete.#     - List
0220: 42 6f 78 3a 3a 6d 6f 76 65 0a 23 20 20 20 20 20  Box::move.#     
0230: 2d 20 4c 69 73 74 42 6f 78 3a 3a 72 65 6f 72 64  - ListBox::reord
0240: 65 72 0a 23 20 20 20 20 20 2d 20 4c 69 73 74 42  er.#     - ListB
0250: 6f 78 3a 3a 73 65 6c 65 63 74 69 6f 6e 0a 23 20  ox::selection.# 
0260: 20 20 20 20 2d 20 4c 69 73 74 42 6f 78 3a 3a 65      - ListBox::e
0270: 78 69 73 74 73 0a 23 20 20 20 20 20 2d 20 4c 69  xists.#     - Li
0280: 73 74 42 6f 78 3a 3a 69 6e 64 65 78 0a 23 20 20  stBox::index.#  
0290: 20 20 20 2d 20 4c 69 73 74 42 6f 78 3a 3a 69 74     - ListBox::it
02a0: 65 6d 20 2d 20 64 65 70 72 65 63 61 74 65 64 0a  em - deprecated.
02b0: 23 20 20 20 20 20 2d 20 4c 69 73 74 42 6f 78 3a  #     - ListBox:
02c0: 3a 69 74 65 6d 73 0a 23 20 20 20 20 20 2d 20 4c  :items.#     - L
02d0: 69 73 74 42 6f 78 3a 3a 73 65 65 0a 23 20 20 20  istBox::see.#   
02e0: 20 20 2d 20 4c 69 73 74 42 6f 78 3a 3a 65 64 69    - ListBox::edi
02f0: 74 0a 23 20 20 20 20 20 2d 20 4c 69 73 74 42 6f  t.#     - ListBo
0300: 78 3a 3a 78 76 69 65 77 0a 23 20 20 20 20 20 2d  x::xview.#     -
0310: 20 4c 69 73 74 42 6f 78 3a 3a 79 76 69 65 77 0a   ListBox::yview.
0320: 23 20 20 20 20 20 2d 20 4c 69 73 74 42 6f 78 3a  #     - ListBox:
0330: 3a 5f 75 70 64 61 74 65 5f 65 64 69 74 5f 73 69  :_update_edit_si
0340: 7a 65 0a 23 20 20 20 20 20 2d 20 4c 69 73 74 42  ze.#     - ListB
0350: 6f 78 3a 3a 5f 64 65 73 74 72 6f 79 0a 23 20 20  ox::_destroy.#  
0360: 20 20 20 2d 20 4c 69 73 74 42 6f 78 3a 3a 5f 73     - ListBox::_s
0370: 65 65 0a 23 20 20 20 20 20 2d 20 4c 69 73 74 42  ee.#     - ListB
0380: 6f 78 3a 3a 5f 75 70 64 61 74 65 5f 73 63 72 6f  ox::_update_scro
0390: 6c 6c 72 65 67 69 6f 6e 0a 23 20 20 20 20 20 2d  llregion.#     -
03a0: 20 4c 69 73 74 42 6f 78 3a 3a 5f 64 72 61 77 5f   ListBox::_draw_
03b0: 69 74 65 6d 0a 23 20 20 20 20 20 2d 20 4c 69 73  item.#     - Lis
03c0: 74 42 6f 78 3a 3a 5f 72 65 64 72 61 77 5f 69 74  tBox::_redraw_it
03d0: 65 6d 73 0a 23 20 20 20 20 20 2d 20 4c 69 73 74  ems.#     - List
03e0: 42 6f 78 3a 3a 5f 72 65 64 72 61 77 5f 73 65 6c  Box::_redraw_sel
03f0: 65 63 74 69 6f 6e 0a 23 20 20 20 20 20 2d 20 4c  ection.#     - L
0400: 69 73 74 42 6f 78 3a 3a 5f 72 65 64 72 61 77 5f  istBox::_redraw_
0410: 6c 69 73 74 62 6f 78 0a 23 20 20 20 20 20 2d 20  listbox.#     - 
0420: 4c 69 73 74 42 6f 78 3a 3a 5f 72 65 64 72 61 77  ListBox::_redraw
0430: 5f 69 64 6c 65 0a 23 20 20 20 20 20 2d 20 4c 69  _idle.#     - Li
0440: 73 74 42 6f 78 3a 3a 5f 72 65 73 69 7a 65 0a 23  stBox::_resize.#
0450: 20 20 20 20 20 2d 20 4c 69 73 74 42 6f 78 3a 3a       - ListBox::
0460: 5f 69 6e 69 74 5f 64 72 61 67 5f 63 6d 64 0a 23  _init_drag_cmd.#
0470: 20 20 20 20 20 2d 20 4c 69 73 74 42 6f 78 3a 3a       - ListBox::
0480: 5f 64 72 6f 70 5f 63 6d 64 0a 23 20 20 20 20 20  _drop_cmd.#     
0490: 2d 20 4c 69 73 74 42 6f 78 3a 3a 5f 6f 76 65 72  - ListBox::_over
04a0: 5f 63 6d 64 0a 23 20 20 20 20 20 2d 20 4c 69 73  _cmd.#     - Lis
04b0: 74 42 6f 78 3a 3a 5f 61 75 74 6f 5f 73 63 72 6f  tBox::_auto_scro
04c0: 6c 6c 0a 23 20 20 20 20 20 2d 20 4c 69 73 74 42  ll.#     - ListB
04d0: 6f 78 3a 3a 5f 73 63 72 6f 6c 6c 0a 23 20 2d 2d  ox::_scroll.# --
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6e 61 6d 65  ----------..name
0530: 73 70 61 63 65 20 65 76 61 6c 20 4c 69 73 74 42  space eval ListB
0540: 6f 78 20 7b 0a 20 20 20 20 57 69 64 67 65 74 3a  ox {.    Widget:
0550: 3a 64 65 66 69 6e 65 20 4c 69 73 74 42 6f 78 20  :define ListBox 
0560: 6c 69 73 74 62 6f 78 20 44 72 61 67 53 69 74 65  listbox DragSite
0570: 20 44 72 6f 70 53 69 74 65 20 44 79 6e 61 6d 69   DropSite Dynami
0580: 63 48 65 6c 70 0a 0a 20 20 20 20 6e 61 6d 65 73  cHelp..    names
0590: 70 61 63 65 20 65 76 61 6c 20 49 74 65 6d 20 7b  pace eval Item {
05a0: 0a 20 20 20 20 20 20 20 20 57 69 64 67 65 74 3a  .        Widget:
05b0: 3a 64 65 63 6c 61 72 65 20 4c 69 73 74 42 6f 78  :declare ListBox
05c0: 3a 3a 49 74 65 6d 20 7b 0a 20 20 20 20 20 20 20  ::Item {.       
05d0: 20 20 20 20 20 7b 2d 69 6e 64 65 6e 74 20 20 20       {-indent   
05e0: 20 20 49 6e 74 20 20 20 20 20 20 20 20 30 20 20    Int        0  
05f0: 20 30 20 22 25 64 20 3e 3d 20 30 22 7d 0a 20 20   0 "%d >= 0"}.  
0600: 20 20 20 20 20 20 20 20 20 20 7b 2d 74 65 78 74            {-text
0610: 20 20 20 20 20 20 20 53 74 72 69 6e 67 20 20 20         String   
0620: 20 20 22 22 20 20 30 7d 0a 20 20 20 20 20 20 20    ""  0}.       
0630: 20 20 20 20 20 7b 2d 66 6f 6e 74 20 20 20 20 20       {-font     
0640: 20 20 53 74 72 69 6e 67 20 20 20 20 20 22 22 20    String     "" 
0650: 20 30 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20   0}.            
0660: 7b 2d 66 6f 72 65 67 72 6f 75 6e 64 20 53 74 72  {-foreground Str
0670: 69 6e 67 20 20 20 20 20 22 22 20 20 30 7d 0a 20  ing     ""  0}. 
0680: 20 20 20 20 20 20 20 20 20 20 20 7b 2d 69 6d 61             {-ima
0690: 67 65 20 20 20 20 20 20 54 6b 52 65 73 6f 75 72  ge      TkResour
06a0: 63 65 20 22 22 20 20 30 20 6c 61 62 65 6c 7d 0a  ce ""  0 label}.
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 2d 77 69              {-wi
06c0: 6e 64 6f 77 20 20 20 20 20 53 74 72 69 6e 67 20  ndow     String 
06d0: 20 20 20 20 22 22 20 20 30 7d 0a 20 20 20 20 20      ""  0}.     
06e0: 20 20 20 20 20 20 20 7b 2d 64 61 74 61 20 20 20         {-data   
06f0: 20 20 20 20 53 74 72 69 6e 67 20 20 20 20 20 22      String     "
0700: 22 20 20 30 7d 0a 0a 20 20 20 20 20 20 20 20 20  "  0}..         
0710: 20 20 20 7b 2d 66 69 6c 6c 20 20 20 20 20 20 20     {-fill       
0720: 53 79 6e 6f 6e 79 6d 20 20 20 20 2d 66 6f 72 65  Synonym    -fore
0730: 67 72 6f 75 6e 64 7d 0a 20 20 20 20 20 20 20 20  ground}.        
0740: 20 20 20 20 7b 2d 66 67 20 20 20 20 20 20 20 20      {-fg        
0750: 20 53 79 6e 6f 6e 79 6d 20 20 20 20 2d 66 6f 72   Synonym    -for
0760: 65 67 72 6f 75 6e 64 7d 0a 20 20 20 20 20 20 20  eground}.       
0770: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 44 79   }.    }..    Dy
0780: 6e 61 6d 69 63 48 65 6c 70 3a 3a 69 6e 63 6c 75  namicHelp::inclu
0790: 64 65 20 4c 69 73 74 42 6f 78 3a 3a 49 74 65 6d  de ListBox::Item
07a0: 20 62 61 6c 6c 6f 6f 6e 0a 0a 20 20 20 20 57 69   balloon..    Wi
07b0: 64 67 65 74 3a 3a 74 6b 69 6e 63 6c 75 64 65 20  dget::tkinclude 
07c0: 4c 69 73 74 42 6f 78 20 63 61 6e 76 61 73 20 2e  ListBox canvas .
07d0: 63 20 5c 0a 20 20 20 20 20 20 20 20 72 65 6d 6f  c \.        remo
07e0: 76 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ve {.           
07f0: 20 2d 69 6e 73 65 72 74 77 69 64 74 68 20 2d 69   -insertwidth -i
0800: 6e 73 65 72 74 62 61 63 6b 67 72 6f 75 6e 64 20  nsertbackground 
0810: 2d 69 6e 73 65 72 74 62 6f 72 64 65 72 77 69 64  -insertborderwid
0820: 74 68 20 2d 69 6e 73 65 72 74 6f 66 66 74 69 6d  th -insertofftim
0830: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d 69  e.            -i
0840: 6e 73 65 72 74 6f 6e 74 69 6d 65 20 2d 73 65 6c  nsertontime -sel
0850: 65 63 74 62 6f 72 64 65 72 77 69 64 74 68 20 2d  ectborderwidth -
0860: 63 6c 6f 73 65 65 6e 6f 75 67 68 20 2d 63 6f 6e  closeenough -con
0870: 66 69 6e 65 20 2d 73 63 72 6f 6c 6c 72 65 67 69  fine -scrollregi
0880: 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d  on.            -
0890: 78 73 63 72 6f 6c 6c 69 6e 63 72 65 6d 65 6e 74  xscrollincrement
08a0: 20 2d 79 73 63 72 6f 6c 6c 69 6e 63 72 65 6d 65   -yscrollincreme
08b0: 6e 74 20 2d 77 69 64 74 68 20 2d 68 65 69 67 68  nt -width -heigh
08c0: 74 0a 20 20 20 20 20 20 20 20 7d 20 5c 0a 20 20  t.        } \.  
08d0: 20 20 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65        initialize
08e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d   {.            -
08f0: 72 65 6c 69 65 66 20 73 75 6e 6b 65 6e 20 2d 62  relief sunken -b
0900: 6f 72 64 65 72 77 69 64 74 68 20 32 20 2d 74 61  orderwidth 2 -ta
0910: 6b 65 66 6f 63 75 73 20 31 0a 20 20 20 20 20 20  kefocus 1.      
0920: 20 20 20 20 20 20 2d 68 69 67 68 6c 69 67 68 74        -highlight
0930: 74 68 69 63 6b 6e 65 73 73 20 31 20 2d 77 69 64  thickness 1 -wid
0940: 74 68 20 32 30 30 0a 20 20 20 20 20 20 20 20 7d  th 200.        }
0950: 0a 0a 20 20 20 20 44 72 61 67 53 69 74 65 3a 3a  ..    DragSite::
0960: 69 6e 63 6c 75 64 65 20 4c 69 73 74 42 6f 78 20  include ListBox 
0970: 22 4c 49 53 54 42 4f 58 5f 49 54 45 4d 22 20 31  "LISTBOX_ITEM" 1
0980: 0a 20 20 20 20 44 72 6f 70 53 69 74 65 3a 3a 69  .    DropSite::i
0990: 6e 63 6c 75 64 65 20 4c 69 73 74 42 6f 78 20 7b  nclude ListBox {
09a0: 0a 20 20 20 20 20 20 20 20 4c 49 53 54 42 4f 58  .        LISTBOX
09b0: 5f 49 54 45 4d 20 7b 63 6f 70 79 20 7b 7d 20 6d  _ITEM {copy {} m
09c0: 6f 76 65 20 7b 7d 7d 0a 20 20 20 20 7d 0a 0a 20  ove {}}.    }.. 
09d0: 20 20 20 57 69 64 67 65 74 3a 3a 64 65 63 6c 61     Widget::decla
09e0: 72 65 20 4c 69 73 74 42 6f 78 20 7b 0a 20 20 20  re ListBox {.   
09f0: 20 20 20 20 20 7b 2d 64 65 6c 74 61 78 20 20 20       {-deltax   
0a00: 20 20 20 20 20 20 20 20 49 6e 74 20 31 30 20 30          Int 10 0
0a10: 20 22 25 64 20 3e 3d 20 30 22 7d 0a 20 20 20 20   "%d >= 0"}.    
0a20: 20 20 20 20 7b 2d 64 65 6c 74 61 79 20 20 20 20      {-deltay    
0a30: 20 20 20 20 20 20 20 49 6e 74 20 31 35 20 30 20         Int 15 0 
0a40: 22 25 64 20 3e 3d 20 30 22 7d 0a 20 20 20 20 20  "%d >= 0"}.     
0a50: 20 20 20 7b 2d 70 61 64 78 20 20 20 20 20 20 20     {-padx       
0a60: 20 20 20 20 20 20 49 6e 74 20 32 30 20 30 20 22        Int 20 0 "
0a70: 25 64 20 3e 3d 20 30 22 7d 0a 20 20 20 20 20 20  %d >= 0"}.      
0a80: 20 20 7b 2d 66 6f 72 65 67 72 6f 75 6e 64 20 20    {-foreground  
0a90: 20 20 20 20 20 54 6b 52 65 73 6f 75 72 63 65 20       TkResource 
0aa0: 22 22 20 30 20 6c 69 73 74 62 6f 78 7d 0a 20 20  "" 0 listbox}.  
0ab0: 20 20 20 20 20 20 7b 2d 62 61 63 6b 67 72 6f 75        {-backgrou
0ac0: 6e 64 20 20 20 20 20 20 20 54 6b 52 65 73 6f 75  nd       TkResou
0ad0: 72 63 65 20 22 22 20 30 20 6c 69 73 74 62 6f 78  rce "" 0 listbox
0ae0: 7d 0a 20 20 20 20 20 20 20 20 7b 2d 73 65 6c 65  }.        {-sele
0af0: 63 74 62 61 63 6b 67 72 6f 75 6e 64 20 54 6b 52  ctbackground TkR
0b00: 65 73 6f 75 72 63 65 20 22 22 20 30 20 6c 69 73  esource "" 0 lis
0b10: 74 62 6f 78 7d 0a 20 20 20 20 20 20 20 20 7b 2d  tbox}.        {-
0b20: 73 65 6c 65 63 74 66 6f 72 65 67 72 6f 75 6e 64  selectforeground
0b30: 20 54 6b 52 65 73 6f 75 72 63 65 20 22 22 20 30   TkResource "" 0
0b40: 20 6c 69 73 74 62 6f 78 7d 0a 20 20 20 20 20 20   listbox}.      
0b50: 20 20 7b 2d 66 6f 6e 74 20 20 20 20 20 20 20 20    {-font        
0b60: 20 20 20 20 20 54 6b 52 65 73 6f 75 72 63 65 20       TkResource 
0b70: 22 22 20 30 20 6c 69 73 74 62 6f 78 7d 0a 20 20  "" 0 listbox}.  
0b80: 20 20 20 20 20 20 7b 2d 77 69 64 74 68 20 20 20        {-width   
0b90: 20 20 20 20 20 20 20 20 20 54 6b 52 65 73 6f 75           TkResou
0ba0: 72 63 65 20 22 22 20 30 20 6c 69 73 74 62 6f 78  rce "" 0 listbox
0bb0: 7d 0a 20 20 20 20 20 20 20 20 7b 2d 68 65 69 67  }.        {-heig
0bc0: 68 74 20 20 20 20 20 20 20 20 20 20 20 54 6b 52  ht           TkR
0bd0: 65 73 6f 75 72 63 65 20 22 22 20 30 20 6c 69 73  esource "" 0 lis
0be0: 74 62 6f 78 7d 0a 20 20 20 20 20 20 20 20 7b 2d  tbox}.        {-
0bf0: 72 65 64 72 61 77 20 20 20 20 20 20 20 20 20 20  redraw          
0c00: 20 42 6f 6f 6c 65 61 6e 20 31 20 20 30 7d 0a 20   Boolean 1  0}. 
0c10: 20 20 20 20 20 20 20 7b 2d 6d 75 6c 74 69 63 6f         {-multico
0c20: 6c 75 6d 6e 20 20 20 20 20 20 42 6f 6f 6c 65 61  lumn      Boolea
0c30: 6e 20 30 20 20 30 7d 0a 20 20 20 20 20 20 20 20  n 0  0}.        
0c40: 7b 2d 64 72 6f 70 6f 76 65 72 6d 6f 64 65 20 20  {-dropovermode  
0c50: 20 20 20 46 6c 61 67 20 20 20 20 22 77 70 69 22     Flag    "wpi"
0c60: 20 30 20 22 77 70 69 22 7d 0a 09 7b 2d 73 65 6c   0 "wpi"}..{-sel
0c70: 65 63 74 6d 6f 64 65 20 20 20 20 20 20 20 45 6e  ectmode       En
0c80: 75 6d 20 6e 6f 6e 65 20 31 20 7b 6e 6f 6e 65 20  um none 1 {none 
0c90: 73 69 6e 67 6c 65 20 6d 75 6c 74 69 70 6c 65 7d  single multiple}
0ca0: 7d 0a 20 20 20 20 20 20 20 20 7b 2d 66 67 20 20  }.        {-fg  
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 6e               Syn
0cc0: 6f 6e 79 6d 20 2d 66 6f 72 65 67 72 6f 75 6e 64  onym -foreground
0cd0: 7d 0a 20 20 20 20 20 20 20 20 7b 2d 62 67 20 20  }.        {-bg  
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 6e               Syn
0cf0: 6f 6e 79 6d 20 2d 62 61 63 6b 67 72 6f 75 6e 64  onym -background
0d00: 7d 0a 20 20 20 20 20 20 20 20 7b 2d 64 72 6f 70  }.        {-drop
0d10: 63 6d 64 20 20 20 20 20 20 20 20 20 20 53 74 72  cmd          Str
0d20: 69 6e 67 20 20 22 4c 69 73 74 42 6f 78 3a 3a 5f  ing  "ListBox::_
0d30: 64 72 61 67 5f 61 6e 64 5f 64 72 6f 70 22 20 30  drag_and_drop" 0
0d40: 7d 0a 20 20 20 20 20 20 20 20 7b 2d 61 75 74 6f  }.        {-auto
0d50: 66 6f 63 75 73 20 20 20 20 20 20 20 20 42 6f 6f  focus        Boo
0d60: 6c 65 61 6e 20 20 31 20 20 31 7d 0a 20 20 20 20  lean  1  1}.    
0d70: 20 20 20 20 7b 2d 73 65 6c 65 63 74 66 69 6c 6c      {-selectfill
0d80: 20 20 20 20 20 20 20 42 6f 6f 6c 65 61 6e 20 20         Boolean  
0d90: 30 20 20 31 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  0  1}.    }..   
0da0: 20 57 69 64 67 65 74 3a 3a 61 64 64 6d 61 70 20   Widget::addmap 
0db0: 4c 69 73 74 42 6f 78 20 22 22 20 2e 63 20 7b 2d  ListBox "" .c {-
0dc0: 64 65 6c 74 61 79 20 2d 79 73 63 72 6f 6c 6c 69  deltay -yscrolli
0dd0: 6e 63 72 65 6d 65 6e 74 7d 0a 0a 20 20 20 20 62  ncrement}..    b
0de0: 69 6e 64 20 4c 69 73 74 42 6f 78 20 3c 44 65 73  ind ListBox <Des
0df0: 74 72 6f 79 3e 20 20 20 5b 6c 69 73 74 20 4c 69  troy>   [list Li
0e00: 73 74 42 6f 78 3a 3a 5f 64 65 73 74 72 6f 79 20  stBox::_destroy 
0e10: 25 57 5d 0a 20 20 20 20 62 69 6e 64 20 4c 69 73  %W].    bind Lis
0e20: 74 42 6f 78 20 3c 43 6f 6e 66 69 67 75 72 65 3e  tBox <Configure>
0e30: 20 5b 6c 69 73 74 20 4c 69 73 74 42 6f 78 3a 3a   [list ListBox::
0e40: 5f 72 65 73 69 7a 65 20 20 25 57 5d 0a 20 20 20  _resize  %W].   
0e50: 20 62 69 6e 64 20 4c 69 73 74 42 6f 78 46 6f 63   bind ListBoxFoc
0e60: 75 73 20 3c 31 3e 20 20 20 20 5b 6c 69 73 74 20  us <1>    [list 
0e70: 66 6f 63 75 73 20 25 57 5d 0a 20 20 20 20 62 69  focus %W].    bi
0e80: 6e 64 20 4c 69 73 74 42 6f 78 20 3c 4b 65 79 2d  nd ListBox <Key-
0e90: 55 70 3e 20 20 20 20 5b 6c 69 73 74 20 4c 69 73  Up>    [list Lis
0ea0: 74 42 6f 78 3a 3a 5f 6b 65 79 62 6f 61 72 64 5f  tBox::_keyboard_
0eb0: 6e 61 76 69 67 61 74 69 6f 6e 20 25 57 20 2d 31  navigation %W -1
0ec0: 5d 0a 20 20 20 20 62 69 6e 64 20 4c 69 73 74 42  ].    bind ListB
0ed0: 6f 78 20 3c 4b 65 79 2d 44 6f 77 6e 3e 20 20 5b  ox <Key-Down>  [
0ee0: 6c 69 73 74 20 4c 69 73 74 42 6f 78 3a 3a 5f 6b  list ListBox::_k
0ef0: 65 79 62 6f 61 72 64 5f 6e 61 76 69 67 61 74 69  eyboard_navigati
0f00: 6f 6e 20 25 57 20 20 31 5d 0a 0a 20 20 20 20 76  on %W  1]..    v
0f10: 61 72 69 61 62 6c 65 20 5f 65 64 69 74 0a 7d 0a  ariable _edit.}.
0f20: 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..# ------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 4c 69 73 74  .#  Command List
0f80: 42 6f 78 3a 3a 63 72 65 61 74 65 0a 23 20 2d 2d  Box::create.# --
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20  ----------.proc 
0fe0: 4c 69 73 74 42 6f 78 3a 3a 63 72 65 61 74 65 20  ListBox::create 
0ff0: 7b 20 70 61 74 68 20 61 72 67 73 20 7d 20 7b 0a  { path args } {.
1000: 20 20 20 20 57 69 64 67 65 74 3a 3a 69 6e 69 74      Widget::init
1010: 20 4c 69 73 74 42 6f 78 20 24 70 61 74 68 20 24   ListBox $path $
1020: 61 72 67 73 0a 0a 20 20 20 20 76 61 72 69 61 62  args..    variab
1030: 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75 70 76  le $path.    upv
1040: 61 72 20 30 20 20 24 70 61 74 68 20 64 61 74 61  ar 0  $path data
1050: 0a 0a 20 20 20 20 66 72 61 6d 65 20 24 70 61 74  ..    frame $pat
1060: 68 20 2d 63 6c 61 73 73 20 4c 69 73 74 42 6f 78  h -class ListBox
1070: 20 2d 62 64 20 30 20 2d 68 69 67 68 6c 69 67 68   -bd 0 -highligh
1080: 74 74 68 69 63 6b 6e 65 73 73 20 30 20 2d 72 65  tthickness 0 -re
1090: 6c 69 65 66 20 66 6c 61 74 0a 20 20 20 20 23 20  lief flat.    # 
10a0: 46 6f 72 20 38 2e 34 2b 20 77 65 20 64 6f 6e 27  For 8.4+ we don'
10b0: 74 20 77 61 6e 74 20 74 6f 20 69 6e 68 65 72 69  t want to inheri
10c0: 74 20 74 68 65 20 70 61 64 64 69 6e 67 0a 20 20  t the padding.  
10d0: 20 20 63 61 74 63 68 20 7b 24 70 61 74 68 20 63    catch {$path c
10e0: 6f 6e 66 69 67 75 72 65 20 2d 70 61 64 78 20 30  onfigure -padx 0
10f0: 20 2d 70 61 64 79 20 30 7d 0a 20 20 20 20 23 20   -pady 0}.    # 
1100: 77 69 64 67 65 74 20 69 6e 66 6f 72 6d 61 74 69  widget informati
1110: 6f 6e 73 0a 20 20 20 20 73 65 74 20 64 61 74 61  ons.    set data
1120: 28 6e 72 6f 77 73 29 20 2d 31 0a 0a 20 20 20 20  (nrows) -1..    
1130: 23 20 69 74 65 6d 73 20 69 6e 66 6f 72 6d 61 74  # items informat
1140: 69 6f 6e 73 0a 20 20 20 20 73 65 74 20 64 61 74  ions.    set dat
1150: 61 28 69 74 65 6d 73 29 20 20 20 20 7b 7d 0a 20  a(items)    {}. 
1160: 20 20 20 73 65 74 20 64 61 74 61 28 73 65 6c 69     set data(seli
1170: 74 65 6d 73 29 20 7b 7d 0a 0a 20 20 20 20 23 20  tems) {}..    # 
1180: 75 70 64 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  update informati
1190: 6f 6e 73 0a 20 20 20 20 73 65 74 20 64 61 74 61  ons.    set data
11a0: 28 75 70 64 2c 6c 65 76 65 6c 29 20 20 20 30 0a  (upd,level)   0.
11b0: 20 20 20 20 73 65 74 20 64 61 74 61 28 75 70 64      set data(upd
11c0: 2c 61 66 74 65 72 69 64 29 20 22 22 0a 20 20 20  ,afterid) "".   
11d0: 20 73 65 74 20 64 61 74 61 28 75 70 64 2c 6c 65   set data(upd,le
11e0: 76 65 6c 29 20 20 20 30 0a 20 20 20 20 73 65 74  vel)   0.    set
11f0: 20 64 61 74 61 28 75 70 64 2c 64 65 6c 65 74 65   data(upd,delete
1200: 29 20 20 7b 7d 0a 0a 20 20 20 20 23 20 64 72 61  )  {}..    # dra
1210: 67 20 61 6e 64 20 64 72 6f 70 20 69 6e 66 6f 72  g and drop infor
1220: 6d 61 74 69 6f 6e 73 0a 20 20 20 20 73 65 74 20  mations.    set 
1230: 64 61 74 61 28 64 6e 64 2c 73 63 72 6f 6c 6c 29  data(dnd,scroll)
1240: 20 20 20 22 22 0a 20 20 20 20 73 65 74 20 64 61     "".    set da
1250: 74 61 28 64 6e 64 2c 61 66 74 65 72 69 64 29 20  ta(dnd,afterid) 
1260: 20 22 22 0a 20 20 20 20 73 65 74 20 64 61 74 61   "".    set data
1270: 28 64 6e 64 2c 69 74 65 6d 29 20 20 20 20 20 22  (dnd,item)     "
1280: 22 0a 0a 20 20 20 20 65 76 61 6c 20 5b 6c 69 73  "..    eval [lis
1290: 74 20 63 61 6e 76 61 73 20 24 70 61 74 68 2e 63  t canvas $path.c
12a0: 5d 20 5b 57 69 64 67 65 74 3a 3a 73 75 62 63 67  ] [Widget::subcg
12b0: 65 74 20 24 70 61 74 68 20 2e 63 5d 20 5c 0a 09  et $path .c] \..
12c0: 5b 6c 69 73 74 20 2d 78 73 63 72 6f 6c 6c 69 6e  [list -xscrollin
12d0: 63 72 65 6d 65 6e 74 20 38 5d 0a 20 20 20 20 70  crement 8].    p
12e0: 61 63 6b 20 24 70 61 74 68 2e 63 20 2d 65 78 70  ack $path.c -exp
12f0: 61 6e 64 20 79 65 73 20 2d 66 69 6c 6c 20 62 6f  and yes -fill bo
1300: 74 68 0a 0a 20 20 20 20 44 72 61 67 53 69 74 65  th..    DragSite
1310: 3a 3a 73 65 74 64 72 61 67 20 24 70 61 74 68 20  ::setdrag $path 
1320: 24 70 61 74 68 2e 63 20 4c 69 73 74 42 6f 78 3a  $path.c ListBox:
1330: 3a 5f 69 6e 69 74 5f 64 72 61 67 5f 63 6d 64 20  :_init_drag_cmd 
1340: 5c 0a 09 20 20 20 20 5b 57 69 64 67 65 74 3a 3a  \..    [Widget::
1350: 63 67 65 74 20 24 70 61 74 68 20 2d 64 72 61 67  cget $path -drag
1360: 65 6e 64 63 6d 64 5d 20 31 0a 20 20 20 20 44 72  endcmd] 1.    Dr
1370: 6f 70 53 69 74 65 3a 3a 73 65 74 64 72 6f 70 20  opSite::setdrop 
1380: 24 70 61 74 68 20 24 70 61 74 68 2e 63 20 4c 69  $path $path.c Li
1390: 73 74 42 6f 78 3a 3a 5f 6f 76 65 72 5f 63 6d 64  stBox::_over_cmd
13a0: 20 4c 69 73 74 42 6f 78 3a 3a 5f 64 72 6f 70 5f   ListBox::_drop_
13b0: 63 6d 64 20 31 0a 0a 20 20 20 20 57 69 64 67 65  cmd 1..    Widge
13c0: 74 3a 3a 63 72 65 61 74 65 20 4c 69 73 74 42 6f  t::create ListBo
13d0: 78 20 24 70 61 74 68 0a 0a 20 20 20 20 73 65 74  x $path..    set
13e0: 20 77 20 5b 57 69 64 67 65 74 3a 3a 63 67 65 74   w [Widget::cget
13f0: 20 24 70 61 74 68 20 2d 77 69 64 74 68 5d 0a 20   $path -width]. 
1400: 20 20 20 73 65 74 20 68 20 5b 57 69 64 67 65 74     set h [Widget
1410: 3a 3a 63 67 65 74 20 24 70 61 74 68 20 2d 68 65  ::cget $path -he
1420: 69 67 68 74 5d 0a 20 20 20 20 73 65 74 20 64 79  ight].    set dy
1430: 20 5b 57 69 64 67 65 74 3a 3a 63 67 65 74 20 24   [Widget::cget $
1440: 70 61 74 68 20 2d 64 65 6c 74 61 79 5d 0a 20 20  path -deltay].  
1450: 20 20 24 70 61 74 68 2e 63 20 63 6f 6e 66 69 67    $path.c config
1460: 75 72 65 20 2d 77 69 64 74 68 20 5b 65 78 70 72  ure -width [expr
1470: 20 7b 24 77 2a 38 7d 5d 20 2d 68 65 69 67 68 74   {$w*8}] -height
1480: 20 5b 65 78 70 72 20 7b 24 68 2a 24 64 79 7d 5d   [expr {$h*$dy}]
1490: 0a 0a 20 20 20 20 23 20 49 6e 73 65 72 74 20 24  ..    # Insert $
14a0: 70 61 74 68 20 69 6e 74 6f 20 74 68 65 20 63 61  path into the ca
14b0: 6e 76 61 73 20 62 69 6e 64 69 6e 67 73 2c 20 73  nvas bindings, s
14c0: 6f 20 74 68 61 74 20 61 6e 79 6f 6e 65 20 62 69  o that anyone bi
14d0: 6e 64 69 6e 67 0a 20 20 20 20 23 20 64 69 72 65  nding.    # dire
14e0: 63 74 6c 79 20 6f 6e 74 6f 20 74 68 65 20 77 69  ctly onto the wi
14f0: 64 67 65 74 20 77 69 6c 6c 20 73 65 65 20 74 68  dget will see th
1500: 65 69 72 20 62 69 6e 64 69 6e 67 73 20 61 63 74  eir bindings act
1510: 69 76 61 74 65 64 20 77 68 65 6e 0a 20 20 20 20  ivated when.    
1520: 23 20 74 68 65 20 63 61 6e 76 61 73 20 68 61 73  # the canvas has
1530: 20 66 6f 63 75 73 2e 0a 20 20 20 20 73 65 74 20   focus..    set 
1540: 62 69 6e 64 74 61 67 73 20 5b 62 69 6e 64 74 61  bindtags [bindta
1550: 67 73 20 24 70 61 74 68 2e 63 5d 0a 20 20 20 20  gs $path.c].    
1560: 73 65 74 20 62 69 6e 64 74 61 67 73 20 5b 6c 69  set bindtags [li
1570: 6e 73 65 72 74 20 24 62 69 6e 64 74 61 67 73 20  nsert $bindtags 
1580: 31 20 24 70 61 74 68 5d 0a 20 20 20 20 23 20 4c  1 $path].    # L
1590: 65 74 20 61 6e 79 20 63 6c 69 63 6b 20 77 69 74  et any click wit
15a0: 68 69 6e 20 74 68 65 20 63 61 6e 76 61 73 20 66  hin the canvas f
15b0: 6f 63 75 73 20 6f 6e 20 74 68 65 20 63 61 6e 76  ocus on the canv
15c0: 61 73 20 73 6f 20 74 68 61 74 0a 20 20 20 20 23  as so that.    #
15d0: 20 4d 6f 75 73 65 57 68 65 65 6c 20 73 63 72 6f   MouseWheel scro
15e0: 6c 6c 20 65 76 65 6e 74 73 20 77 69 6c 6c 20 62  ll events will b
15f0: 65 20 70 72 6f 70 65 72 6c 79 20 68 61 6e 64 6c  e properly handl
1600: 65 64 20 62 79 20 74 68 65 20 63 61 6e 76 61 73  ed by the canvas
1610: 2e 0a 20 20 20 20 69 66 20 7b 5b 57 69 64 67 65  ..    if {[Widge
1620: 74 3a 3a 63 67 65 74 20 24 70 61 74 68 20 2d 61  t::cget $path -a
1630: 75 74 6f 66 6f 63 75 73 5d 7d 20 7b 0a 09 6c 61  utofocus]} {..la
1640: 70 70 65 6e 64 20 62 69 6e 64 74 61 67 73 20 4c  ppend bindtags L
1650: 69 73 74 42 6f 78 46 6f 63 75 73 0a 09 42 57 69  istBoxFocus..BWi
1660: 64 67 65 74 3a 3a 62 69 6e 64 4d 6f 75 73 65 57  dget::bindMouseW
1670: 68 65 65 6c 20 24 70 61 74 68 2e 63 0a 20 20 20  heel $path.c.   
1680: 20 7d 0a 20 20 20 20 62 69 6e 64 74 61 67 73 20   }.    bindtags 
1690: 24 70 61 74 68 2e 63 20 24 62 69 6e 64 74 61 67  $path.c $bindtag
16a0: 73 0a 0a 20 20 20 20 23 20 41 64 64 20 73 6c 69  s..    # Add sli
16b0: 67 68 74 6c 79 20 6d 6f 64 69 66 69 65 64 20 75  ghtly modified u
16c0: 70 2f 64 6f 77 6e 20 62 69 6e 64 69 6e 67 73 20  p/down bindings 
16d0: 74 6f 20 74 68 65 20 63 61 6e 76 61 73 2c 20 69  to the canvas, i
16e0: 6e 20 63 61 73 65 0a 20 20 20 20 23 20 69 74 20  n case.    # it 
16f0: 67 65 74 73 20 74 68 65 20 66 6f 63 75 73 20 28  gets the focus (
1700: 6c 69 6b 65 20 77 69 74 68 20 2d 61 75 74 6f 66  like with -autof
1710: 6f 63 75 73 29 2e 0a 20 20 20 20 62 69 6e 64 20  ocus)..    bind 
1720: 24 70 61 74 68 2e 63 20 3c 4b 65 79 2d 55 70 3e  $path.c <Key-Up>
1730: 20 7b 4c 69 73 74 42 6f 78 3a 3a 5f 6b 65 79 62   {ListBox::_keyb
1740: 6f 61 72 64 5f 6e 61 76 69 67 61 74 69 6f 6e 20  oard_navigation 
1750: 5b 77 69 6e 66 6f 20 70 61 72 65 6e 74 20 25 57  [winfo parent %W
1760: 5d 20 2d 31 7d 0a 20 20 20 20 62 69 6e 64 20 24  ] -1}.    bind $
1770: 70 61 74 68 2e 63 20 3c 4b 65 79 2d 44 6f 77 6e  path.c <Key-Down
1780: 3e 20 7b 4c 69 73 74 42 6f 78 3a 3a 5f 6b 65 79  > {ListBox::_key
1790: 62 6f 61 72 64 5f 6e 61 76 69 67 61 74 69 6f 6e  board_navigation
17a0: 20 5b 77 69 6e 66 6f 20 70 61 72 65 6e 74 20 25   [winfo parent %
17b0: 57 5d 20 31 7d 0a 0a 20 20 20 20 73 77 69 74 63  W] 1}..    switc
17c0: 68 20 2d 65 78 61 63 74 20 2d 2d 20 5b 57 69 64  h -exact -- [Wid
17d0: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
17e0: 70 61 74 68 20 2d 73 65 6c 65 63 74 6d 6f 64 65  path -selectmode
17f0: 5d 20 7b 0a 09 73 69 6e 67 6c 65 20 7b 0a 09 20  ] {..single {.. 
1800: 20 20 20 24 70 61 74 68 20 62 69 6e 64 54 65 78     $path bindTex
1810: 74 20 20 3c 42 75 74 74 6f 6e 2d 31 3e 20 5b 6c  t  <Button-1> [l
1820: 69 73 74 20 4c 69 73 74 42 6f 78 3a 3a 5f 6d 6f  ist ListBox::_mo
1830: 75 73 65 5f 73 65 6c 65 63 74 20 24 70 61 74 68  use_select $path
1840: 20 73 65 74 5d 0a 09 20 20 20 20 24 70 61 74 68   set]..    $path
1850: 20 62 69 6e 64 49 6d 61 67 65 20 3c 42 75 74 74   bindImage <Butt
1860: 6f 6e 2d 31 3e 20 5b 6c 69 73 74 20 4c 69 73 74  on-1> [list List
1870: 42 6f 78 3a 3a 5f 6d 6f 75 73 65 5f 73 65 6c 65  Box::_mouse_sele
1880: 63 74 20 24 70 61 74 68 20 73 65 74 5d 0a 09 7d  ct $path set]..}
1890: 0a 09 6d 75 6c 74 69 70 6c 65 20 7b 0a 09 20 20  ..multiple {..  
18a0: 20 20 73 65 74 20 63 6d 64 20 4c 69 73 74 42 6f    set cmd ListBo
18b0: 78 3a 3a 5f 6d 75 6c 74 69 70 6c 65 5f 73 65 6c  x::_multiple_sel
18c0: 65 63 74 0a 09 20 20 20 20 24 70 61 74 68 20 62  ect..    $path b
18d0: 69 6e 64 54 65 78 74 20 3c 42 75 74 74 6f 6e 2d  indText <Button-
18e0: 31 3e 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73  1>          [lis
18f0: 74 20 24 63 6d 64 20 24 70 61 74 68 20 6e 20 25  t $cmd $path n %
1900: 78 20 25 79 5d 0a 09 20 20 20 20 24 70 61 74 68  x %y]..    $path
1910: 20 62 69 6e 64 54 65 78 74 20 3c 53 68 69 66 74   bindText <Shift
1920: 2d 42 75 74 74 6f 6e 2d 31 3e 20 20 20 20 5b 6c  -Button-1>    [l
1930: 69 73 74 20 24 63 6d 64 20 24 70 61 74 68 20 73  ist $cmd $path s
1940: 20 25 78 20 25 79 5d 0a 09 20 20 20 20 24 70 61   %x %y]..    $pa
1950: 74 68 20 62 69 6e 64 54 65 78 74 20 3c 43 6f 6e  th bindText <Con
1960: 74 72 6f 6c 2d 42 75 74 74 6f 6e 2d 31 3e 20 20  trol-Button-1>  
1970: 5b 6c 69 73 74 20 24 63 6d 64 20 24 70 61 74 68  [list $cmd $path
1980: 20 63 20 25 78 20 25 79 5d 0a 0a 09 20 20 20 20   c %x %y]...    
1990: 24 70 61 74 68 20 62 69 6e 64 49 6d 61 67 65 20  $path bindImage 
19a0: 3c 42 75 74 74 6f 6e 2d 31 3e 20 20 20 20 20 20  <Button-1>      
19b0: 20 20 20 5b 6c 69 73 74 20 24 63 6d 64 20 24 70     [list $cmd $p
19c0: 61 74 68 20 6e 20 25 78 20 25 79 5d 0a 09 20 20  ath n %x %y]..  
19d0: 20 20 24 70 61 74 68 20 62 69 6e 64 49 6d 61 67    $path bindImag
19e0: 65 20 3c 53 68 69 66 74 2d 42 75 74 74 6f 6e 2d  e <Shift-Button-
19f0: 31 3e 20 20 20 5b 6c 69 73 74 20 24 63 6d 64 20  1>   [list $cmd 
1a00: 24 70 61 74 68 20 73 20 25 78 20 25 79 5d 0a 09  $path s %x %y]..
1a10: 20 20 20 20 24 70 61 74 68 20 62 69 6e 64 49 6d      $path bindIm
1a20: 61 67 65 20 3c 43 6f 6e 74 72 6f 6c 2d 42 75 74  age <Control-But
1a30: 74 6f 6e 2d 31 3e 20 5b 6c 69 73 74 20 24 63 6d  ton-1> [list $cm
1a40: 64 20 24 70 61 74 68 20 63 20 25 78 20 25 79 5d  d $path c %x %y]
1a50: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  ..}.    }..    r
1a60: 65 74 75 72 6e 20 24 70 61 74 68 0a 7d 0a 0a 0a  eturn $path.}...
1a70: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1ac0: 20 20 43 6f 6d 6d 61 6e 64 20 4c 69 73 74 42 6f    Command ListBo
1ad0: 78 3a 3a 63 6f 6e 66 69 67 75 72 65 0a 23 20 2d  x::configure.# -
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63  -----------.proc
1b30: 20 4c 69 73 74 42 6f 78 3a 3a 63 6f 6e 66 69 67   ListBox::config
1b40: 75 72 65 20 7b 20 70 61 74 68 20 61 72 67 73 20  ure { path args 
1b50: 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20  } {.    set res 
1b60: 5b 57 69 64 67 65 74 3a 3a 63 6f 6e 66 69 67 75  [Widget::configu
1b70: 72 65 20 24 70 61 74 68 20 24 61 72 67 73 5d 0a  re $path $args].
1b80: 0a 20 20 20 20 73 65 74 20 63 68 31 20 5b 65 78  .    set ch1 [ex
1b90: 70 72 20 7b 5b 57 69 64 67 65 74 3a 3a 68 61 73  pr {[Widget::has
1ba0: 43 68 61 6e 67 65 64 20 24 70 61 74 68 20 2d 64  Changed $path -d
1bb0: 65 6c 74 61 79 20 64 79 5d 20 20 7c 0a 20 20 20  eltay dy]  |.   
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 5b 57 69 64 67 65 74 3a 3a 68 61 73 43 68 61 6e  [Widget::hasChan
1be0: 67 65 64 20 24 70 61 74 68 20 2d 70 61 64 78 20  ged $path -padx 
1bf0: 76 61 6c 5d 20 20 20 7c 0a 20 20 20 20 20 20 20  val]   |.       
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 5b 57 69 64              [Wid
1c10: 67 65 74 3a 3a 68 61 73 43 68 61 6e 67 65 64 20  get::hasChanged 
1c20: 24 70 61 74 68 20 2d 6d 75 6c 74 69 63 6f 6c 75  $path -multicolu
1c30: 6d 6e 20 76 61 6c 5d 7d 5d 0a 0a 20 20 20 20 73  mn val]}]..    s
1c40: 65 74 20 63 68 32 20 5b 65 78 70 72 20 7b 5b 57  et ch2 [expr {[W
1c50: 69 64 67 65 74 3a 3a 68 61 73 43 68 61 6e 67 65  idget::hasChange
1c60: 64 20 24 70 61 74 68 20 2d 73 65 6c 65 63 74 62  d $path -selectb
1c70: 61 63 6b 67 72 6f 75 6e 64 20 76 61 6c 5d 20 7c  ackground val] |
1c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c90: 20 20 20 20 5b 57 69 64 67 65 74 3a 3a 68 61 73      [Widget::has
1ca0: 43 68 61 6e 67 65 64 20 24 70 61 74 68 20 2d 73  Changed $path -s
1cb0: 65 6c 65 63 74 66 6f 72 65 67 72 6f 75 6e 64 20  electforeground 
1cc0: 76 61 6c 5d 7d 5d 0a 0a 20 20 20 20 73 65 74 20  val]}]..    set 
1cd0: 72 65 64 72 61 77 20 30 0a 20 20 20 20 69 66 20  redraw 0.    if 
1ce0: 7b 20 5b 57 69 64 67 65 74 3a 3a 68 61 73 43 68  { [Widget::hasCh
1cf0: 61 6e 67 65 64 20 24 70 61 74 68 20 2d 68 65 69  anged $path -hei
1d00: 67 68 74 20 68 5d 20 7d 20 7b 0a 20 20 20 20 20  ght h] } {.     
1d10: 20 20 20 24 70 61 74 68 2e 63 20 63 6f 6e 66 69     $path.c confi
1d20: 67 75 72 65 20 2d 68 65 69 67 68 74 20 5b 65 78  gure -height [ex
1d30: 70 72 20 7b 24 68 2a 24 64 79 7d 5d 0a 20 20 20  pr {$h*$dy}].   
1d40: 20 20 20 20 20 73 65 74 20 72 65 64 72 61 77 20       set redraw 
1d50: 31 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b  1.    }.    if {
1d60: 20 5b 57 69 64 67 65 74 3a 3a 68 61 73 43 68 61   [Widget::hasCha
1d70: 6e 67 65 64 20 24 70 61 74 68 20 2d 77 69 64 74  nged $path -widt
1d80: 68 20 77 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20  h w] } {.       
1d90: 20 24 70 61 74 68 2e 63 20 63 6f 6e 66 69 67 75   $path.c configu
1da0: 72 65 20 2d 77 69 64 74 68 20 5b 65 78 70 72 20  re -width [expr 
1db0: 7b 24 77 2a 38 7d 5d 0a 20 20 20 20 20 20 20 20  {$w*8}].        
1dc0: 73 65 74 20 72 65 64 72 61 77 20 31 0a 20 20 20  set redraw 1.   
1dd0: 20 7d 0a 0a 20 20 20 20 69 66 20 7b 20 5b 57 69   }..    if { [Wi
1de0: 64 67 65 74 3a 3a 68 61 73 43 68 61 6e 67 65 64  dget::hasChanged
1df0: 20 24 70 61 74 68 20 2d 62 61 63 6b 67 72 6f 75   $path -backgrou
1e00: 6e 64 20 62 67 5d 20 7d 20 7b 0a 20 20 20 20 20  nd bg] } {.     
1e10: 20 20 20 24 70 61 74 68 2e 63 20 69 74 65 6d 63     $path.c itemc
1e20: 6f 6e 66 69 67 75 72 65 20 62 6f 78 20 2d 66 69  onfigure box -fi
1e30: 6c 6c 20 24 62 67 0a 20 20 20 20 7d 0a 0a 20 20  ll $bg.    }..  
1e40: 20 20 69 66 20 7b 20 21 24 72 65 64 72 61 77 20    if { !$redraw 
1e50: 7d 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b  } {.        if {
1e60: 20 24 63 68 31 20 7d 20 7b 0a 20 20 20 20 20 20   $ch1 } {.      
1e70: 20 20 20 20 20 20 5f 72 65 64 72 61 77 5f 69 64        _redraw_id
1e80: 6c 65 20 24 70 61 74 68 20 32 0a 20 20 20 20 20  le $path 2.     
1e90: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 24 63     } elseif { $c
1ea0: 68 32 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  h2 } {.         
1eb0: 20 20 20 5f 72 65 64 72 61 77 5f 69 64 6c 65 20     _redraw_idle 
1ec0: 24 70 61 74 68 20 31 0a 20 20 20 20 20 20 20 20  $path 1.        
1ed0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  }.    }..    if 
1ee0: 7b 20 5b 57 69 64 67 65 74 3a 3a 68 61 73 43 68  { [Widget::hasCh
1ef0: 61 6e 67 65 64 20 24 70 61 74 68 20 2d 72 65 64  anged $path -red
1f00: 72 61 77 20 62 6f 6f 6c 5d 20 26 26 20 24 62 6f  raw bool] && $bo
1f10: 6f 6c 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 76  ol } {.        v
1f20: 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20 20  ariable $path.  
1f30: 20 20 20 20 20 20 75 70 76 61 72 20 30 20 20 24        upvar 0  $
1f40: 70 61 74 68 20 64 61 74 61 0a 20 20 20 20 20 20  path data.      
1f50: 20 20 73 65 74 20 6c 76 6c 20 24 64 61 74 61 28    set lvl $data(
1f60: 75 70 64 2c 6c 65 76 65 6c 29 0a 20 20 20 20 20  upd,level).     
1f70: 20 20 20 73 65 74 20 64 61 74 61 28 75 70 64 2c     set data(upd,
1f80: 6c 65 76 65 6c 29 20 30 0a 20 20 20 20 20 20 20  level) 0.       
1f90: 20 5f 72 65 64 72 61 77 5f 69 64 6c 65 20 24 70   _redraw_idle $p
1fa0: 61 74 68 20 24 6c 76 6c 0a 20 20 20 20 7d 0a 20  ath $lvl.    }. 
1fb0: 20 20 20 73 65 74 20 66 6f 72 63 65 20 5b 57 69     set force [Wi
1fc0: 64 67 65 74 3a 3a 68 61 73 43 68 61 6e 67 65 64  dget::hasChanged
1fd0: 20 24 70 61 74 68 20 2d 64 72 61 67 65 6e 64 63   $path -dragendc
1fe0: 6d 64 20 64 72 61 67 65 6e 64 5d 0a 20 20 20 20  md dragend].    
1ff0: 44 72 61 67 53 69 74 65 3a 3a 73 65 74 64 72 61  DragSite::setdra
2000: 67 20 24 70 61 74 68 20 24 70 61 74 68 2e 63 20  g $path $path.c 
2010: 4c 69 73 74 42 6f 78 3a 3a 5f 69 6e 69 74 5f 64  ListBox::_init_d
2020: 72 61 67 5f 63 6d 64 20 24 64 72 61 67 65 6e 64  rag_cmd $dragend
2030: 20 24 66 6f 72 63 65 0a 20 20 20 20 44 72 6f 70   $force.    Drop
2040: 53 69 74 65 3a 3a 73 65 74 64 72 6f 70 20 24 70  Site::setdrop $p
2050: 61 74 68 20 24 70 61 74 68 2e 63 20 4c 69 73 74  ath $path.c List
2060: 42 6f 78 3a 3a 5f 6f 76 65 72 5f 63 6d 64 20 4c  Box::_over_cmd L
2070: 69 73 74 42 6f 78 3a 3a 5f 64 72 6f 70 5f 63 6d  istBox::_drop_cm
2080: 64 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72  d..    return $r
2090: 65 73 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d  es.}...# -------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e0: 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64  -----.#  Command
20f0: 20 4c 69 73 74 42 6f 78 3a 3a 63 67 65 74 0a 23   ListBox::cget.#
2100: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72  -------------.pr
2150: 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 63 67 65 74  oc ListBox::cget
2160: 20 7b 20 70 61 74 68 20 6f 70 74 69 6f 6e 20 7d   { path option }
2170: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 57   {.    return [W
2180: 69 64 67 65 74 3a 3a 63 67 65 74 20 24 70 61 74  idget::cget $pat
2190: 68 20 24 6f 70 74 69 6f 6e 5d 0a 7d 0a 0a 0a 23  h $option].}...#
21a0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
21b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
21f0: 20 43 6f 6d 6d 61 6e 64 20 4c 69 73 74 42 6f 78   Command ListBox
2200: 3a 3a 69 6e 73 65 72 74 0a 23 20 2d 2d 2d 2d 2d  ::insert.# -----
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 4c 69 73  -------.proc Lis
2260: 74 42 6f 78 3a 3a 69 6e 73 65 72 74 20 7b 20 70  tBox::insert { p
2270: 61 74 68 20 69 6e 64 65 78 20 69 74 65 6d 20 61  ath index item a
2280: 72 67 73 20 7d 20 7b 0a 20 20 20 20 76 61 72 69  rgs } {.    vari
2290: 61 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75  able $path.    u
22a0: 70 76 61 72 20 30 20 20 24 70 61 74 68 20 64 61  pvar 0  $path da
22b0: 74 61 0a 0a 20 20 20 20 73 65 74 20 69 74 65 6d  ta..    set item
22c0: 20 5b 57 69 64 67 65 74 3a 3a 6e 65 78 74 49 6e   [Widget::nextIn
22d0: 64 65 78 20 24 70 61 74 68 20 24 69 74 65 6d 5d  dex $path $item]
22e0: 0a 0a 20 20 20 20 69 66 20 7b 20 5b 6c 73 65 61  ..    if { [lsea
22f0: 72 63 68 20 2d 65 78 61 63 74 20 24 64 61 74 61  rch -exact $data
2300: 28 69 74 65 6d 73 29 20 24 69 74 65 6d 5d 20 21  (items) $item] !
2310: 3d 20 2d 31 20 7d 20 7b 0a 20 20 20 20 20 20 20  = -1 } {.       
2320: 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72   return -code er
2330: 72 6f 72 20 22 69 74 65 6d 20 5c 22 24 69 74 65  ror "item \"$ite
2340: 6d 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69 73  m\" already exis
2350: 74 73 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 57  ts".    }..    W
2360: 69 64 67 65 74 3a 3a 69 6e 69 74 20 4c 69 73 74  idget::init List
2370: 42 6f 78 3a 3a 49 74 65 6d 20 24 70 61 74 68 2e  Box::Item $path.
2380: 24 69 74 65 6d 20 24 61 72 67 73 0a 0a 20 20 20  $item $args..   
2390: 20 73 65 74 20 64 61 74 61 28 69 74 65 6d 73 29   set data(items)
23a0: 20 5b 6c 69 6e 73 65 72 74 20 24 64 61 74 61 28   [linsert $data(
23b0: 69 74 65 6d 73 29 20 24 69 6e 64 65 78 20 24 69  items) $index $i
23c0: 74 65 6d 5d 0a 20 20 20 20 73 65 74 20 64 61 74  tem].    set dat
23d0: 61 28 75 70 64 2c 63 72 65 61 74 65 2c 24 69 74  a(upd,create,$it
23e0: 65 6d 29 20 24 69 74 65 6d 0a 0a 20 20 20 20 5f  em) $item..    _
23f0: 72 65 64 72 61 77 5f 69 64 6c 65 20 24 70 61 74  redraw_idle $pat
2400: 68 20 32 0a 20 20 20 20 72 65 74 75 72 6e 20 24  h 2.    return $
2410: 69 74 65 6d 0a 7d 0a 0a 23 20 42 61 73 74 69 65  item.}..# Bastie
2420: 6e 20 43 68 65 76 72 65 75 78 20 28 62 61 63 68  n Chevreux (bach
2430: 40 6d 77 67 64 6e 61 2e 63 6f 6d 29 0a 23 20 54  @mwgdna.com).# T
2440: 68 65 20 6d 75 6c 74 69 70 6c 65 69 6e 73 65 72  he multipleinser
2450: 74 20 63 6f 6d 6d 61 6e 64 20 70 65 72 66 6f 72  t command perfor
2460: 6d 73 20 69 6e 73 65 72 74 73 20 73 65 76 65 72  ms inserts sever
2470: 61 6c 20 69 74 65 6d 73 20 61 74 20 6f 6e 63 65  al items at once
2480: 20 69 6e 74 6f 0a 23 20 20 74 68 65 20 6c 69 73   into.#  the lis
2490: 74 2e 20 49 74 20 69 73 20 66 61 73 74 65 72 20  t. It is faster 
24a0: 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 69 6e 73  than calling ins
24b0: 65 72 74 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ert multiple tim
24c0: 65 73 20 61 73 20 69 74 20 75 73 65 73 20 74 68  es as it uses th
24d0: 65 0a 23 20 20 57 69 64 67 65 74 3a 3a 63 6f 70  e.#  Widget::cop
24e0: 79 69 6e 69 74 20 63 6f 6d 6d 61 6e 64 20 66 6f  yinit command fo
24f0: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
2500: 6c 6c 20 69 74 65 6d 73 20 61 66 74 65 72 20 74  ll items after t
2510: 68 65 20 31 73 74 2e 20 54 68 65 20 0a 23 20 20  he 1st. The .#  
2520: 73 70 65 65 64 75 70 20 66 61 63 74 6f 72 20 69  speedup factor i
2530: 73 20 62 65 74 77 65 65 6e 20 32 20 61 6e 64 20  s between 2 and 
2540: 33 20 66 6f 72 20 74 79 70 69 63 61 6c 20 75 73  3 for typical us
2550: 61 67 65 2c 20 62 75 74 20 63 6f 75 6c 64 20 62  age, but could b
2560: 65 20 68 69 67 68 65 72 0a 23 20 20 66 6f 72 20  e higher.#  for 
2570: 69 6e 73 65 72 74 73 20 77 69 74 68 20 6d 61 6e  inserts with man
2580: 79 20 6f 70 74 69 6f 6e 73 2e 0a 23 0a 23 20 53  y options..#.# S
2590: 79 6e 74 61 78 3a 20 70 61 74 68 20 61 6e 64 20  yntax: path and 
25a0: 69 6e 64 65 78 20 61 72 65 20 61 73 20 69 6e 20  index are as in 
25b0: 74 68 65 20 69 6e 73 65 72 74 20 63 6f 6d 6d 61  the insert comma
25c0: 6e 64 0a 23 09 61 72 67 73 20 69 73 20 61 20 6c  nd.#.args is a l
25d0: 69 73 74 20 6f 66 20 65 76 65 6e 20 6e 75 6d 62  ist of even numb
25e0: 65 72 65 64 20 65 6c 65 6d 65 6e 74 73 20 77 68  ered elements wh
25f0: 65 72 65 20 74 68 65 20 31 73 74 20 6f 66 20 65  ere the 1st of e
2600: 61 63 68 20 70 61 69 72 0a 23 09 63 6f 72 72 65  ach pair.#.corre
2610: 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 69 74  sponds to the it
2620: 65 6d 20 6f 66 20 27 69 6e 73 65 72 74 27 20 61  em of 'insert' a
2630: 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 74 6f  nd the second to
2640: 20 61 72 67 73 20 6f 66 20 27 69 6e 73 65 72 74   args of 'insert
2650: 27 2e 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  '..# -----------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26a0: 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 4c 69 73  -.#  Command Lis
26b0: 74 42 6f 78 3a 3a 6d 75 6c 74 69 70 6c 65 69 6e  tBox::multiplein
26c0: 73 65 72 74 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  sert.# ---------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2710: 2d 2d 2d 0a 70 72 6f 63 20 4c 69 73 74 42 6f 78  ---.proc ListBox
2720: 3a 3a 6d 75 6c 74 69 70 6c 65 69 6e 73 65 72 74  ::multipleinsert
2730: 20 7b 20 70 61 74 68 20 69 6e 64 65 78 20 61 72   { path index ar
2740: 67 73 20 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  gs } {.    varia
2750: 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75 70  ble $path.    up
2760: 76 61 72 20 30 20 20 24 70 61 74 68 20 64 61 74  var 0  $path dat
2770: 61 0a 0a 20 20 20 20 23 20 49 66 20 77 65 20 67  a..    # If we g
2780: 6f 74 20 6f 6e 6c 79 20 6f 6e 65 20 6c 69 73 74  ot only one list
2790: 20 61 73 20 61 72 67 2c 20 74 61 6b 65 20 74 68   as arg, take th
27a0: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
27b0: 61 73 20 61 72 67 73 0a 20 20 20 20 23 20 54 68  as args.    # Th
27c0: 69 73 20 65 6e 61 62 6c 65 73 20 63 61 6c 6c 65  is enables calle
27d0: 72 73 20 74 6f 20 75 73 65 20 0a 20 20 20 20 23  rs to use .    #
27e0: 09 24 6c 69 73 74 20 6d 75 6c 74 69 70 6c 65 69  .$list multiplei
27f0: 6e 73 65 72 74 20 69 6e 64 65 78 20 24 74 68 65  nsert index $the
2800: 6c 69 73 74 0a 20 20 20 20 23 20 69 6e 73 74 65  list.    # inste
2810: 61 64 20 6f 66 0a 20 20 20 20 23 09 65 76 61 6c  ad of.    #.eval
2820: 20 24 6c 69 73 74 20 6d 75 6c 74 69 70 6c 65 69   $list multiplei
2830: 6e 73 65 72 74 20 69 6e 64 65 78 20 24 74 68 65  nsert index $the
2840: 6c 69 73 74 0a 0a 20 20 20 20 69 66 20 7b 5b 6c  list..    if {[l
2850: 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20 3d 3d  length $args] ==
2860: 20 31 7d 20 7b 0a 09 73 65 74 20 61 72 67 73 20   1} {..set args 
2870: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d  [lindex $args 0]
2880: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20  .    }..    set 
2890: 63 6f 75 6e 74 20 30 0a 20 20 20 20 66 6f 72 65  count 0.    fore
28a0: 61 63 68 20 7b 69 74 65 6d 20 69 61 72 67 73 7d  ach {item iargs}
28b0: 20 24 61 72 67 73 20 7b 0a 09 69 66 20 7b 20 5b   $args {..if { [
28c0: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24  lsearch -exact $
28d0: 64 61 74 61 28 69 74 65 6d 73 29 20 24 69 74 65  data(items) $ite
28e0: 6d 5d 20 21 3d 20 2d 31 20 7d 20 7b 0a 09 20 20  m] != -1 } {..  
28f0: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65    return -code e
2900: 72 72 6f 72 20 22 69 74 65 6d 20 5c 22 24 69 74  rror "item \"$it
2910: 65 6d 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69  em\" already exi
2920: 73 74 73 22 0a 09 7d 0a 09 0a 09 69 66 20 7b 24  sts"..}....if {$
2930: 63 6f 75 6e 74 3d 3d 30 7d 20 7b 0a 09 20 20 20  count==0} {..   
2940: 20 57 69 64 67 65 74 3a 3a 69 6e 69 74 20 4c 69   Widget::init Li
2950: 73 74 42 6f 78 3a 3a 49 74 65 6d 20 24 70 61 74  stBox::Item $pat
2960: 68 2e 24 69 74 65 6d 20 24 69 61 72 67 73 0a 09  h.$item $iargs..
2970: 20 20 20 20 73 65 74 20 66 69 72 73 74 70 61 74      set firstpat
2980: 68 20 24 70 61 74 68 2e 24 69 74 65 6d 0a 09 7d  h $path.$item..}
2990: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 57 69 64   else {..    Wid
29a0: 67 65 74 3a 3a 63 6f 70 79 69 6e 69 74 20 4c 69  get::copyinit Li
29b0: 73 74 42 6f 78 3a 3a 49 74 65 6d 20 24 66 69 72  stBox::Item $fir
29c0: 73 74 70 61 74 68 20 24 70 61 74 68 2e 24 69 74  stpath $path.$it
29d0: 65 6d 20 24 69 61 72 67 73 0a 09 7d 0a 0a 09 73  em $iargs..}...s
29e0: 65 74 20 64 61 74 61 28 69 74 65 6d 73 29 20 5b  et data(items) [
29f0: 6c 69 6e 73 65 72 74 20 24 64 61 74 61 28 69 74  linsert $data(it
2a00: 65 6d 73 29 20 24 69 6e 64 65 78 20 24 69 74 65  ems) $index $ite
2a10: 6d 5d 0a 09 73 65 74 20 64 61 74 61 28 75 70 64  m]..set data(upd
2a20: 2c 63 72 65 61 74 65 2c 24 69 74 65 6d 29 20 24  ,create,$item) $
2a30: 69 74 65 6d 0a 0a 09 69 6e 63 72 20 63 6f 75 6e  item...incr coun
2a40: 74 0a 20 20 20 20 7d 0a 0a 20 20 20 20 5f 72 65  t.    }..    _re
2a50: 64 72 61 77 5f 69 64 6c 65 20 24 70 61 74 68 20  draw_idle $path 
2a60: 32 0a 20 20 20 20 72 65 74 75 72 6e 20 24 69 74  2.    return $it
2a70: 65 6d 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d  em.}..# --------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ac0: 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20  ----.#  Command 
2ad0: 4c 69 73 74 42 6f 78 3a 3a 69 74 65 6d 63 6f 6e  ListBox::itemcon
2ae0: 66 69 67 75 72 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d  figure.# -------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b30: 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 4c 69 73 74 42  -----.proc ListB
2b40: 6f 78 3a 3a 69 74 65 6d 63 6f 6e 66 69 67 75 72  ox::itemconfigur
2b50: 65 20 7b 20 70 61 74 68 20 69 74 65 6d 20 61 72  e { path item ar
2b60: 67 73 20 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  gs } {.    varia
2b70: 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75 70  ble $path.    up
2b80: 76 61 72 20 30 20 20 24 70 61 74 68 20 64 61 74  var 0  $path dat
2b90: 61 0a 0a 20 20 20 20 69 66 20 7b 20 5b 6c 73 65  a..    if { [lse
2ba0: 61 72 63 68 20 2d 65 78 61 63 74 20 24 64 61 74  arch -exact $dat
2bb0: 61 28 69 74 65 6d 73 29 20 24 69 74 65 6d 5d 20  a(items) $item] 
2bc0: 3d 3d 20 2d 31 20 7d 20 7b 0a 20 20 20 20 20 20  == -1 } {.      
2bd0: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65    return -code e
2be0: 72 72 6f 72 20 22 69 74 65 6d 20 5c 22 24 69 74  rror "item \"$it
2bf0: 65 6d 5c 22 20 64 6f 65 73 20 6e 6f 74 20 65 78  em\" does not ex
2c00: 69 73 74 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ist".    }..    
2c10: 73 65 74 20 6f 6c 64 69 6e 64 20 5b 57 69 64 67  set oldind [Widg
2c20: 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70  et::getoption $p
2c30: 61 74 68 2e 24 69 74 65 6d 20 2d 69 6e 64 65 6e  ath.$item -inden
2c40: 74 5d 0a 0a 20 20 20 20 73 65 74 20 72 65 73 20  t]..    set res 
2c50: 20 20 5b 57 69 64 67 65 74 3a 3a 63 6f 6e 66 69    [Widget::confi
2c60: 67 75 72 65 20 24 70 61 74 68 2e 24 69 74 65 6d  gure $path.$item
2c70: 20 24 61 72 67 73 5d 0a 20 20 20 20 73 65 74 20   $args].    set 
2c80: 63 68 69 6e 64 20 5b 57 69 64 67 65 74 3a 3a 68  chind [Widget::h
2c90: 61 73 43 68 61 6e 67 65 64 20 24 70 61 74 68 2e  asChanged $path.
2ca0: 24 69 74 65 6d 20 2d 69 6e 64 65 6e 74 20 69 6e  $item -indent in
2cb0: 64 65 6e 74 5d 0a 20 20 20 20 73 65 74 20 63 68  dent].    set ch
2cc0: 77 20 20 20 5b 57 69 64 67 65 74 3a 3a 68 61 73  w   [Widget::has
2cd0: 43 68 61 6e 67 65 64 20 24 70 61 74 68 2e 24 69  Changed $path.$i
2ce0: 74 65 6d 20 2d 77 69 6e 64 6f 77 20 77 69 6e 5d  tem -window win]
2cf0: 0a 20 20 20 20 73 65 74 20 63 68 69 20 20 20 5b  .    set chi   [
2d00: 57 69 64 67 65 74 3a 3a 68 61 73 43 68 61 6e 67  Widget::hasChang
2d10: 65 64 20 24 70 61 74 68 2e 24 69 74 65 6d 20 2d  ed $path.$item -
2d20: 69 6d 61 67 65 20 20 69 6d 67 5d 0a 20 20 20 20  image  img].    
2d30: 73 65 74 20 63 68 74 20 20 20 5b 57 69 64 67 65  set cht   [Widge
2d40: 74 3a 3a 68 61 73 43 68 61 6e 67 65 64 20 24 70  t::hasChanged $p
2d50: 61 74 68 2e 24 69 74 65 6d 20 2d 74 65 78 74 20  ath.$item -text 
2d60: 74 78 74 5d 0a 20 20 20 20 73 65 74 20 63 68 66  txt].    set chf
2d70: 20 20 20 5b 57 69 64 67 65 74 3a 3a 68 61 73 43     [Widget::hasC
2d80: 68 61 6e 67 65 64 20 24 70 61 74 68 2e 24 69 74  hanged $path.$it
2d90: 65 6d 20 2d 66 6f 6e 74 20 66 6e 74 5d 0a 20 20  em -font fnt].  
2da0: 20 20 73 65 74 20 63 68 66 67 20 20 5b 57 69 64    set chfg  [Wid
2db0: 67 65 74 3a 3a 68 61 73 43 68 61 6e 67 65 64 20  get::hasChanged 
2dc0: 24 70 61 74 68 2e 24 69 74 65 6d 20 2d 66 6f 72  $path.$item -for
2dd0: 65 67 72 6f 75 6e 64 20 66 67 5d 0a 20 20 20 20  eground fg].    
2de0: 73 65 74 20 69 64 6e 20 20 20 5b 24 70 61 74 68  set idn   [$path
2df0: 2e 63 20 66 69 6e 64 20 77 69 74 68 74 61 67 20  .c find withtag 
2e00: 6e 3a 24 69 74 65 6d 5d 0a 0a 20 20 20 20 5f 73  n:$item]..    _s
2e10: 65 74 5f 68 65 6c 70 20 24 70 61 74 68 20 24 69  et_help $path $i
2e20: 74 65 6d 0a 0a 20 20 20 20 69 66 20 7b 20 24 69  tem..    if { $i
2e30: 64 6e 20 3d 3d 20 22 22 20 7d 20 7b 0a 20 20 20  dn == "" } {.   
2e40: 20 20 20 20 20 23 20 69 74 65 6d 20 69 73 20 6e       # item is n
2e50: 6f 74 20 64 72 61 77 6e 20 79 65 74 0a 20 20 20  ot drawn yet.   
2e60: 20 20 20 20 20 5f 72 65 64 72 61 77 5f 69 64 6c       _redraw_idl
2e70: 65 20 24 70 61 74 68 20 32 0a 20 20 20 20 20 20  e $path 2.      
2e80: 20 20 72 65 74 75 72 6e 20 24 72 65 73 0a 20 20    return $res.  
2e90: 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 6f 6c 64    }..    set old
2ea0: 62 20 20 20 5b 24 70 61 74 68 2e 63 20 62 62 6f  b   [$path.c bbo
2eb0: 78 20 24 69 64 6e 5d 0a 20 20 20 20 73 65 74 20  x $idn].    set 
2ec0: 63 6f 6f 72 64 73 20 5b 24 70 61 74 68 2e 63 20  coords [$path.c 
2ed0: 63 6f 6f 72 64 73 20 24 69 64 6e 5d 0a 20 20 20  coords $idn].   
2ee0: 20 73 65 74 20 70 61 64 78 20 20 20 5b 57 69 64   set padx   [Wid
2ef0: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
2f00: 70 61 74 68 20 2d 70 61 64 78 5d 0a 20 20 20 20  path -padx].    
2f10: 73 65 74 20 78 30 20 20 20 20 20 5b 65 78 70 72  set x0     [expr
2f20: 20 7b 5b 6c 69 6e 64 65 78 20 24 63 6f 6f 72 64   {[lindex $coord
2f30: 73 20 30 5d 2d 24 70 61 64 78 2d 24 6f 6c 64 69  s 0]-$padx-$oldi
2f40: 6e 64 2b 24 69 6e 64 65 6e 74 7d 5d 0a 20 20 20  nd+$indent}].   
2f50: 20 73 65 74 20 79 30 20 20 20 20 20 5b 6c 69 6e   set y0     [lin
2f60: 64 65 78 20 24 63 6f 6f 72 64 73 20 31 5d 0a 20  dex $coords 1]. 
2f70: 20 20 20 69 66 20 7b 20 24 63 68 77 20 7c 7c 20     if { $chw || 
2f80: 24 63 68 69 20 7d 20 7b 0a 20 20 20 20 20 20 20  $chi } {.       
2f90: 20 23 20 2d 77 69 6e 64 6f 77 20 6f 72 20 2d 69   # -window or -i
2fa0: 6d 61 67 65 20 6d 6f 64 69 66 69 65 64 0a 20 20  mage modified.  
2fb0: 20 20 20 20 20 20 73 65 74 20 69 64 69 20 20 5b        set idi  [
2fc0: 24 70 61 74 68 2e 63 20 66 69 6e 64 20 77 69 74  $path.c find wit
2fd0: 68 74 61 67 20 69 3a 24 69 74 65 6d 5d 0a 20 20  htag i:$item].  
2fe0: 20 20 20 20 20 20 73 65 74 20 74 79 70 65 20 5b        set type [
2ff0: 6c 69 6e 64 65 78 20 5b 24 70 61 74 68 2e 63 20  lindex [$path.c 
3000: 67 65 74 74 61 67 73 20 24 69 64 69 5d 20 30 5d  gettags $idi] 0]
3010: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 73  .        if { [s
3020: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 77 69  tring length $wi
3030: 6e 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  n] } {.         
3040: 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20     if { [string 
3050: 65 71 75 61 6c 20 24 74 79 70 65 20 22 77 69 6e  equal $type "win
3060: 22 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  "] } {.         
3070: 20 20 20 20 20 20 20 24 70 61 74 68 2e 63 20 69         $path.c i
3080: 74 65 6d 63 6f 6e 66 69 67 75 72 65 20 24 69 64  temconfigure $id
3090: 69 20 2d 77 69 6e 64 6f 77 20 24 77 69 6e 0a 20  i -window $win. 
30a0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
30b0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
30c0: 20 20 20 20 24 70 61 74 68 2e 63 20 64 65 6c 65      $path.c dele
30d0: 74 65 20 24 69 64 69 0a 20 20 20 20 20 20 20 20  te $idi.        
30e0: 20 20 20 20 20 20 20 20 24 70 61 74 68 2e 63 20          $path.c 
30f0: 63 72 65 61 74 65 20 77 69 6e 64 6f 77 20 24 78  create window $x
3100: 30 20 24 79 30 20 2d 77 69 6e 64 6f 77 20 24 77  0 $y0 -window $w
3110: 69 6e 20 2d 61 6e 63 68 6f 72 20 77 20 5c 0a 09  in -anchor w \..
3120: 09 20 20 20 20 2d 74 61 67 73 20 5b 6c 69 73 74  .    -tags [list
3130: 20 77 69 6e 20 69 3a 24 69 74 65 6d 5d 0a 20 20   win i:$item].  
3140: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3150: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 5b      } elseif { [
3160: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69  string length $i
3170: 6d 67 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  mg] } {.        
3180: 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67      if { [string
3190: 20 65 71 75 61 6c 20 24 74 79 70 65 20 22 69 6d   equal $type "im
31a0: 67 22 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  g"] } {.        
31b0: 20 20 20 20 20 20 20 20 24 70 61 74 68 2e 63 20          $path.c 
31c0: 69 74 65 6d 63 6f 6e 66 69 67 75 72 65 20 24 69  itemconfigure $i
31d0: 64 69 20 2d 69 6d 61 67 65 20 24 69 6d 67 0a 20  di -image $img. 
31e0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
31f0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
3200: 20 20 20 20 24 70 61 74 68 2e 63 20 64 65 6c 65      $path.c dele
3210: 74 65 20 24 69 64 69 0a 20 20 20 20 20 20 20 20  te $idi.        
3220: 20 20 20 20 20 20 20 20 24 70 61 74 68 2e 63 20          $path.c 
3230: 63 72 65 61 74 65 20 69 6d 61 67 65 20 24 78 30  create image $x0
3240: 20 24 79 30 20 2d 69 6d 61 67 65 20 24 69 6d 67   $y0 -image $img
3250: 20 2d 61 6e 63 68 6f 72 20 77 20 5c 0a 09 09 20   -anchor w \... 
3260: 20 20 20 2d 74 61 67 73 20 5b 6c 69 73 74 20 69     -tags [list i
3270: 6d 67 20 69 3a 24 69 74 65 6d 5d 0a 20 20 20 20  mg i:$item].    
3280: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3290: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
32a0: 20 20 20 20 20 20 20 24 70 61 74 68 2e 63 20 64         $path.c d
32b0: 65 6c 65 74 65 20 24 69 64 69 0a 20 20 20 20 20  elete $idi.     
32c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
32d0: 69 66 20 7b 20 24 63 68 74 20 7c 7c 20 24 63 68  if { $cht || $ch
32e0: 66 20 7c 7c 20 24 63 68 66 67 20 7d 20 7b 0a 20  f || $chfg } {. 
32f0: 20 20 20 20 20 20 20 23 20 2d 74 65 78 74 20 6f         # -text o
3300: 72 20 2d 66 6f 6e 74 20 6d 6f 64 69 66 69 65 64  r -font modified
3310: 2c 20 6f 72 20 2d 66 6f 72 65 67 72 6f 75 6e 64  , or -foreground
3320: 20 6d 6f 64 69 66 69 65 64 0a 20 20 20 20 20 20   modified.      
3330: 20 20 73 65 74 20 66 6e 74 20 5b 5f 67 65 74 6f    set fnt [_geto
3340: 70 74 69 6f 6e 20 24 70 61 74 68 20 24 69 74 65  ption $path $ite
3350: 6d 20 2d 66 6f 6e 74 5d 0a 20 20 20 20 20 20 20  m -font].       
3360: 20 73 65 74 20 66 67 20 20 5b 5f 67 65 74 6f 70   set fg  [_getop
3370: 74 69 6f 6e 20 24 70 61 74 68 20 24 69 74 65 6d  tion $path $item
3380: 20 2d 66 6f 72 65 67 72 6f 75 6e 64 5d 0a 20 20   -foreground].  
3390: 20 20 20 20 20 20 24 70 61 74 68 2e 63 20 69 74        $path.c it
33a0: 65 6d 63 6f 6e 66 69 67 75 72 65 20 24 69 64 6e  emconfigure $idn
33b0: 20 2d 74 65 78 74 20 24 74 78 74 20 2d 66 6f 6e   -text $txt -fon
33c0: 74 20 24 66 6e 74 20 2d 66 69 6c 6c 20 24 66 67  t $fnt -fill $fg
33d0: 0a 20 20 20 20 20 20 20 20 5f 72 65 64 72 61 77  .        _redraw
33e0: 5f 69 64 6c 65 20 24 70 61 74 68 20 31 0a 20 20  _idle $path 1.  
33f0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b 20 24 63    }..    if { $c
3400: 68 69 6e 64 20 7d 20 7b 0a 20 20 20 20 20 20 20  hind } {.       
3410: 20 23 20 2d 69 6e 64 65 6e 74 20 6d 6f 64 69 66   # -indent modif
3420: 69 65 64 0a 20 20 20 20 20 20 20 20 24 70 61 74  ied.        $pat
3430: 68 2e 63 20 63 6f 6f 72 64 73 20 24 69 64 6e 20  h.c coords $idn 
3440: 5b 65 78 70 72 20 7b 24 78 30 2b 24 70 61 64 78  [expr {$x0+$padx
3450: 7d 5d 20 24 79 30 0a 20 20 20 20 20 20 20 20 24  }] $y0.        $
3460: 70 61 74 68 2e 63 20 63 6f 6f 72 64 73 20 69 3a  path.c coords i:
3470: 24 69 74 65 6d 20 24 78 30 20 24 79 30 0a 20 20  $item $x0 $y0.  
3480: 20 20 20 20 20 20 5f 72 65 64 72 61 77 5f 69 64        _redraw_id
3490: 6c 65 20 24 70 61 74 68 20 31 0a 20 20 20 20 7d  le $path 1.    }
34a0: 0a 0a 20 20 20 20 69 66 20 7b 20 5b 57 69 64 67  ..    if { [Widg
34b0: 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70  et::getoption $p
34c0: 61 74 68 20 2d 6d 75 6c 74 69 63 6f 6c 75 6d 6e  ath -multicolumn
34d0: 5d 20 26 26 20 28 24 63 68 74 20 7c 7c 20 24 63  ] && ($cht || $c
34e0: 68 66 20 7c 7c 20 24 63 68 69 6e 64 29 20 7d 20  hf || $chind) } 
34f0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 62 62  {.        set bb
3500: 6f 78 20 5b 24 70 61 74 68 2e 63 20 62 62 6f 78  ox [$path.c bbox
3510: 20 24 69 64 6e 5d 0a 20 20 20 20 20 20 20 20 69   $idn].        i
3520: 66 20 7b 20 5b 6c 69 6e 64 65 78 20 24 62 62 6f  f { [lindex $bbo
3530: 78 20 32 5d 20 3e 20 5b 6c 69 6e 64 65 78 20 24  x 2] > [lindex $
3540: 6f 6c 64 62 20 32 5d 20 7d 20 7b 0a 20 20 20 20  oldb 2] } {.    
3550: 20 20 20 20 20 20 20 20 5f 72 65 64 72 61 77 5f          _redraw_
3560: 69 64 6c 65 20 24 70 61 74 68 20 32 0a 20 20 20  idle $path 2.   
3570: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3580: 20 20 72 65 74 75 72 6e 20 24 72 65 73 0a 7d 0a    return $res.}.
3590: 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..# ------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 4c 69 73 74  .#  Command List
35f0: 42 6f 78 3a 3a 69 74 65 6d 63 67 65 74 0a 23 20  Box::itemcget.# 
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f  ------------.pro
3650: 63 20 4c 69 73 74 42 6f 78 3a 3a 69 74 65 6d 63  c ListBox::itemc
3660: 67 65 74 20 7b 20 70 61 74 68 20 69 74 65 6d 20  get { path item 
3670: 6f 70 74 69 6f 6e 20 7d 20 7b 0a 20 20 20 20 72  option } {.    r
3680: 65 74 75 72 6e 20 5b 57 69 64 67 65 74 3a 3a 63  eturn [Widget::c
3690: 67 65 74 20 24 70 61 74 68 2e 24 69 74 65 6d 20  get $path.$item 
36a0: 24 6f 70 74 69 6f 6e 5d 0a 7d 0a 0a 0a 23 20 2d  $option].}...# -
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43  -----------.#  C
3700: 6f 6d 6d 61 6e 64 20 4c 69 73 74 42 6f 78 3a 3a  ommand ListBox::
3710: 62 69 6e 64 54 65 78 74 0a 23 20 2d 2d 2d 2d 2d  bindText.# -----
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 4c 69 73  -------.proc Lis
3770: 74 42 6f 78 3a 3a 62 69 6e 64 54 65 78 74 20 7b  tBox::bindText {
3780: 20 70 61 74 68 20 65 76 65 6e 74 20 73 63 72 69   path event scri
3790: 70 74 20 7d 20 7b 0a 20 20 20 20 69 66 20 7b 20  pt } {.    if { 
37a0: 24 73 63 72 69 70 74 20 21 3d 20 22 22 20 7d 20  $script != "" } 
37b0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61  {.        set ma
37c0: 70 20 5b 6c 69 73 74 20 25 57 20 24 70 61 74 68  p [list %W $path
37d0: 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 63  ].        set sc
37e0: 72 69 70 74 20 5b 73 74 72 69 6e 67 20 6d 61 70  ript [string map
37f0: 20 24 6d 61 70 20 24 73 63 72 69 70 74 5d 0a 09   $map $script]..
3800: 61 70 70 65 6e 64 20 73 63 72 69 70 74 20 22 20  append script " 
3810: 5c 5b 4c 69 73 74 42 6f 78 3a 3a 5f 67 65 74 5f  \[ListBox::_get_
3820: 63 75 72 72 65 6e 74 20 5b 6c 69 73 74 20 24 70  current [list $p
3830: 61 74 68 5d 5c 5d 22 0a 20 20 20 20 7d 0a 20 20  ath]\]".    }.  
3840: 20 20 24 70 61 74 68 2e 63 20 62 69 6e 64 20 22    $path.c bind "
3850: 63 6c 69 63 6b 22 20 24 65 76 65 6e 74 20 24 73  click" $event $s
3860: 63 72 69 70 74 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d  cript.}...# ----
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d  --------.#  Comm
38c0: 61 6e 64 20 4c 69 73 74 42 6f 78 3a 3a 62 69 6e  and ListBox::bin
38d0: 64 49 6d 61 67 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d  dImage.# -------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 4c 69 73 74 42  -----.proc ListB
3930: 6f 78 3a 3a 62 69 6e 64 49 6d 61 67 65 20 7b 20  ox::bindImage { 
3940: 70 61 74 68 20 65 76 65 6e 74 20 73 63 72 69 70  path event scrip
3950: 74 20 7d 20 7b 0a 20 20 20 20 69 66 20 7b 20 24  t } {.    if { $
3960: 73 63 72 69 70 74 20 21 3d 20 22 22 20 7d 20 7b  script != "" } {
3970: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 70  .        set map
3980: 20 5b 6c 69 73 74 20 25 57 20 24 70 61 74 68 5d   [list %W $path]
3990: 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 63 72  .        set scr
39a0: 69 70 74 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  ipt [string map 
39b0: 24 6d 61 70 20 24 73 63 72 69 70 74 5d 0a 09 61  $map $script]..a
39c0: 70 70 65 6e 64 20 73 63 72 69 70 74 20 22 20 5c  ppend script " \
39d0: 5b 4c 69 73 74 42 6f 78 3a 3a 5f 67 65 74 5f 63  [ListBox::_get_c
39e0: 75 72 72 65 6e 74 20 5b 6c 69 73 74 20 24 70 61  urrent [list $pa
39f0: 74 68 5d 5c 5d 22 0a 20 20 20 20 7d 0a 20 20 20  th]\]".    }.   
3a00: 20 24 70 61 74 68 2e 63 20 62 69 6e 64 20 22 69   $path.c bind "i
3a10: 6d 67 22 20 24 65 76 65 6e 74 20 24 73 63 72 69  mg" $event $scri
3a20: 70 74 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d  pt.}...# -------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a70: 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64  -----.#  Command
3a80: 20 4c 69 73 74 42 6f 78 3a 3a 64 65 6c 65 74 65   ListBox::delete
3a90: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3ae0: 70 72 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 64 65  proc ListBox::de
3af0: 6c 65 74 65 20 7b 20 70 61 74 68 20 61 72 67 73  lete { path args
3b00: 20 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c   } {.    variabl
3b10: 65 20 24 70 61 74 68 0a 20 20 20 20 75 70 76 61  e $path.    upva
3b20: 72 20 30 20 20 24 70 61 74 68 20 64 61 74 61 0a  r 0  $path data.
3b30: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 6c 69 74  .    foreach lit
3b40: 65 6d 73 20 24 61 72 67 73 20 7b 0a 20 20 20 20  ems $args {.    
3b50: 20 20 20 20 66 6f 72 65 61 63 68 20 69 74 65 6d      foreach item
3b60: 20 24 6c 69 74 65 6d 73 20 7b 0a 20 20 20 20 20   $litems {.     
3b70: 20 20 20 20 20 20 20 73 65 74 20 69 64 78 20 5b         set idx [
3b80: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24  lsearch -exact $
3b90: 64 61 74 61 28 69 74 65 6d 73 29 20 24 69 74 65  data(items) $ite
3ba0: 6d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  m].            i
3bb0: 66 20 7b 20 24 69 64 78 20 21 3d 20 2d 31 20 7d  f { $idx != -1 }
3bc0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3bd0: 20 20 20 73 65 74 20 64 61 74 61 28 69 74 65 6d     set data(item
3be0: 73 29 20 5b 6c 72 65 70 6c 61 63 65 20 24 64 61  s) [lreplace $da
3bf0: 74 61 28 69 74 65 6d 73 29 20 24 69 64 78 20 24  ta(items) $idx $
3c00: 69 64 78 5d 0a 20 20 20 20 20 20 20 20 20 20 20  idx].           
3c10: 20 20 20 20 20 57 69 64 67 65 74 3a 3a 64 65 73       Widget::des
3c20: 74 72 6f 79 20 24 70 61 74 68 2e 24 69 74 65 6d  troy $path.$item
3c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3c40: 20 69 66 20 7b 20 5b 69 6e 66 6f 20 65 78 69 73   if { [info exis
3c50: 74 73 20 64 61 74 61 28 75 70 64 2c 63 72 65 61  ts data(upd,crea
3c60: 74 65 2c 24 69 74 65 6d 29 5d 20 7d 20 7b 0a 20  te,$item)] } {. 
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 20 20 20 75 6e 73 65 74 20 64 61 74 61 28 75 70     unset data(up
3c90: 64 2c 63 72 65 61 74 65 2c 24 69 74 65 6d 29 0a  d,create,$item).
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
3cd0: 70 65 6e 64 20 64 61 74 61 28 75 70 64 2c 64 65  pend data(upd,de
3ce0: 6c 65 74 65 29 20 24 69 74 65 6d 0a 20 20 20 20  lete) $item.    
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3d00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3d10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3d20: 20 73 65 74 20 73 65 6c 20 24 64 61 74 61 28 73   set sel $data(s
3d30: 65 6c 69 74 65 6d 73 29 0a 20 20 20 20 73 65 74  elitems).    set
3d40: 20 64 61 74 61 28 73 65 6c 69 74 65 6d 73 29 20   data(selitems) 
3d50: 7b 7d 0a 20 20 20 20 65 76 61 6c 20 5b 6c 69 73  {}.    eval [lis
3d60: 74 20 73 65 6c 65 63 74 69 6f 6e 20 24 70 61 74  t selection $pat
3d70: 68 20 73 65 74 5d 20 24 73 65 6c 0a 20 20 20 20  h set] $sel.    
3d80: 5f 72 65 64 72 61 77 5f 69 64 6c 65 20 24 70 61  _redraw_idle $pa
3d90: 74 68 20 32 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d  th 2.}...# -----
3da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3de0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61  -------.#  Comma
3df0: 6e 64 20 4c 69 73 74 42 6f 78 3a 3a 6d 6f 76 65  nd ListBox::move
3e00: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
3e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3e50: 70 72 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 6d 6f  proc ListBox::mo
3e60: 76 65 20 7b 20 70 61 74 68 20 69 74 65 6d 20 69  ve { path item i
3e70: 6e 64 65 78 20 7d 20 7b 0a 20 20 20 20 76 61 72  ndex } {.    var
3e80: 69 61 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20  iable $path.    
3e90: 75 70 76 61 72 20 30 20 20 24 70 61 74 68 20 64  upvar 0  $path d
3ea0: 61 74 61 0a 0a 20 20 20 20 69 66 20 7b 20 5b 73  ata..    if { [s
3eb0: 65 74 20 69 64 78 20 5b 6c 73 65 61 72 63 68 20  et idx [lsearch 
3ec0: 2d 65 78 61 63 74 20 24 64 61 74 61 28 69 74 65  -exact $data(ite
3ed0: 6d 73 29 20 24 69 74 65 6d 5d 5d 20 3d 3d 20 2d  ms) $item]] == -
3ee0: 31 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 72 65  1 } {.        re
3ef0: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72  turn -code error
3f00: 20 22 69 74 65 6d 20 5c 22 24 69 74 65 6d 5c 22   "item \"$item\"
3f10: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 22   does not exist"
3f20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20  .    }..    set 
3f30: 64 61 74 61 28 69 74 65 6d 73 29 20 5b 6c 69 6e  data(items) [lin
3f40: 73 65 72 74 20 5b 6c 72 65 70 6c 61 63 65 20 24  sert [lreplace $
3f50: 64 61 74 61 28 69 74 65 6d 73 29 20 24 69 64 78  data(items) $idx
3f60: 20 24 69 64 78 5d 20 24 69 6e 64 65 78 20 24 69   $idx] $index $i
3f70: 74 65 6d 5d 0a 0a 20 20 20 20 5f 72 65 64 72 61  tem]..    _redra
3f80: 77 5f 69 64 6c 65 20 24 70 61 74 68 20 32 0a 7d  w_idle $path 2.}
3f90: 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...# -----------
3fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fe0: 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 4c 69 73  -.#  Command Lis
3ff0: 74 42 6f 78 3a 3a 72 65 6f 72 64 65 72 0a 23 20  tBox::reorder.# 
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f  ------------.pro
4050: 63 20 4c 69 73 74 42 6f 78 3a 3a 72 65 6f 72 64  c ListBox::reord
4060: 65 72 20 7b 20 70 61 74 68 20 6e 65 77 6f 72 64  er { path neword
4070: 65 72 20 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  er } {.    varia
4080: 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75 70  ble $path.    up
4090: 76 61 72 20 30 20 20 24 70 61 74 68 20 64 61 74  var 0  $path dat
40a0: 61 0a 0a 20 20 20 20 73 65 74 20 64 61 74 61 28  a..    set data(
40b0: 69 74 65 6d 73 29 20 5b 42 57 69 64 67 65 74 3a  items) [BWidget:
40c0: 3a 6c 72 65 6f 72 64 65 72 20 24 64 61 74 61 28  :lreorder $data(
40d0: 69 74 65 6d 73 29 20 24 6e 65 77 6f 72 64 65 72  items) $neworder
40e0: 5d 0a 20 20 20 20 5f 72 65 64 72 61 77 5f 69 64  ].    _redraw_id
40f0: 6c 65 20 24 70 61 74 68 20 32 0a 7d 0a 0a 0a 23  le $path 2.}...#
4100: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
4150: 20 43 6f 6d 6d 61 6e 64 20 4c 69 73 74 42 6f 78   Command ListBox
4160: 3a 3a 73 65 6c 65 63 74 69 6f 6e 0a 23 20 2d 2d  ::selection.# --
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20  ----------.proc 
41c0: 4c 69 73 74 42 6f 78 3a 3a 73 65 6c 65 63 74 69  ListBox::selecti
41d0: 6f 6e 20 7b 20 70 61 74 68 20 63 6d 64 20 61 72  on { path cmd ar
41e0: 67 73 20 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  gs } {.    varia
41f0: 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75 70  ble $path.    up
4200: 76 61 72 20 30 20 20 24 70 61 74 68 20 64 61 74  var 0  $path dat
4210: 61 0a 0a 20 20 20 20 73 77 69 74 63 68 20 2d 2d  a..    switch --
4220: 20 24 63 6d 64 20 7b 0a 20 20 20 20 20 20 20 20   $cmd {.        
4230: 73 65 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20  set {.          
4240: 20 20 73 65 74 20 64 61 74 61 28 73 65 6c 69 74    set data(selit
4250: 65 6d 73 29 20 7b 7d 0a 20 20 20 20 20 20 20 20  ems) {}.        
4260: 20 20 20 20 66 6f 72 65 61 63 68 20 69 74 65 6d      foreach item
4270: 20 24 61 72 67 73 20 7b 0a 20 20 20 20 20 20 20   $args {.       
4280: 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 6c           if { [l
4290: 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 64  search -exact $d
42a0: 61 74 61 28 73 65 6c 69 74 65 6d 73 29 20 24 69  ata(selitems) $i
42b0: 74 65 6d 5d 20 3d 3d 20 2d 31 20 7d 20 7b 0a 20  tem] == -1 } {. 
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 20 20 20 69 66 20 7b 20 5b 6c 73 65 61 72 63 68     if { [lsearch
42e0: 20 2d 65 78 61 63 74 20 24 64 61 74 61 28 69 74   -exact $data(it
42f0: 65 6d 73 29 20 24 69 74 65 6d 5d 20 21 3d 20 2d  ems) $item] != -
4300: 31 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  1 } {.          
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
4320: 70 70 65 6e 64 20 64 61 74 61 28 73 65 6c 69 74  ppend data(selit
4330: 65 6d 73 29 20 24 69 74 65 6d 0a 20 20 20 20 20  ems) $item.     
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4360: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
4370: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4380: 20 20 20 61 64 64 20 7b 0a 20 20 20 20 20 20 20     add {.       
4390: 20 20 20 20 20 66 6f 72 65 61 63 68 20 69 74 65       foreach ite
43a0: 6d 20 24 61 72 67 73 20 7b 0a 20 20 20 20 20 20  m $args {.      
43b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b            if { [
43c0: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24  lsearch -exact $
43d0: 64 61 74 61 28 73 65 6c 69 74 65 6d 73 29 20 24  data(selitems) $
43e0: 69 74 65 6d 5d 20 3d 3d 20 2d 31 20 7d 20 7b 0a  item] == -1 } {.
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 69 66 20 7b 20 5b 6c 73 65 61 72 63      if { [lsearc
4410: 68 20 2d 65 78 61 63 74 20 24 64 61 74 61 28 69  h -exact $data(i
4420: 74 65 6d 73 29 20 24 69 74 65 6d 5d 20 21 3d 20  tems) $item] != 
4430: 2d 31 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  -1 } {.         
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
4450: 61 70 70 65 6e 64 20 64 61 74 61 28 73 65 6c 69  append data(seli
4460: 74 65 6d 73 29 20 24 69 74 65 6d 0a 20 20 20 20  tems) $item.    
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4480: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
4490: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
44a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
44b0: 20 20 20 20 72 65 6d 6f 76 65 20 7b 0a 20 20 20      remove {.   
44c0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
44d0: 20 69 74 65 6d 20 24 61 72 67 73 20 7b 0a 20 20   item $args {.  
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
44f0: 20 7b 20 5b 73 65 74 20 69 64 78 20 5b 6c 73 65   { [set idx [lse
4500: 61 72 63 68 20 2d 65 78 61 63 74 20 24 64 61 74  arch -exact $dat
4510: 61 28 73 65 6c 69 74 65 6d 73 29 20 24 69 74 65  a(selitems) $ite
4520: 6d 5d 5d 20 21 3d 20 2d 31 20 7d 20 7b 0a 20 20  m]] != -1 } {.  
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 73 65 74 20 64 61 74 61 28 73 65 6c 69 74    set data(selit
4550: 65 6d 73 29 20 5b 6c 72 65 70 6c 61 63 65 20 24  ems) [lreplace $
4560: 64 61 74 61 28 73 65 6c 69 74 65 6d 73 29 20 24  data(selitems) $
4570: 69 64 78 20 24 69 64 78 5d 0a 20 20 20 20 20 20  idx $idx].      
4580: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
45a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6c 65 61    }.        clea
45b0: 72 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r {.            
45c0: 73 65 74 20 64 61 74 61 28 73 65 6c 69 74 65 6d  set data(selitem
45d0: 73 29 20 7b 7d 0a 20 20 20 20 20 20 20 20 7d 0a  s) {}.        }.
45e0: 20 20 20 20 20 20 20 20 67 65 74 20 7b 0a 20 20          get {.  
45f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4600: 20 24 64 61 74 61 28 73 65 6c 69 74 65 6d 73 29   $data(selitems)
4610: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4620: 20 20 20 69 6e 63 6c 75 64 65 73 20 7b 0a 20 20     includes {.  
4630: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
4640: 20 5b 65 78 70 72 20 7b 5b 6c 73 65 61 72 63 68   [expr {[lsearch
4650: 20 2d 65 78 61 63 74 20 24 64 61 74 61 28 73 65   -exact $data(se
4660: 6c 69 74 65 6d 73 29 20 24 61 72 67 73 5d 20 21  litems) $args] !
4670: 3d 20 2d 31 7d 5d 0a 20 20 20 20 20 20 20 20 7d  = -1}].        }
4680: 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
4690: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   {.            r
46a0: 65 74 75 72 6e 0a 20 20 20 20 20 20 20 20 7d 0a  eturn.        }.
46b0: 20 20 20 20 7d 0a 0a 20 20 20 20 5f 72 65 64 72      }..    _redr
46c0: 61 77 5f 69 64 6c 65 20 24 70 61 74 68 20 31 0a  aw_idle $path 1.
46d0: 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...# ----------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4720: 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 4c 69  --.#  Command Li
4730: 73 74 42 6f 78 3a 3a 65 78 69 73 74 73 0a 23 20  stBox::exists.# 
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f  ------------.pro
4790: 63 20 4c 69 73 74 42 6f 78 3a 3a 65 78 69 73 74  c ListBox::exist
47a0: 73 20 7b 20 70 61 74 68 20 69 74 65 6d 20 7d 20  s { path item } 
47b0: 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 24  {.    variable $
47c0: 70 61 74 68 0a 20 20 20 20 75 70 76 61 72 20 30  path.    upvar 0
47d0: 20 20 24 70 61 74 68 20 64 61 74 61 0a 0a 20 20    $path data..  
47e0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
47f0: 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20  [lsearch -exact 
4800: 24 64 61 74 61 28 69 74 65 6d 73 29 20 24 69 74  $data(items) $it
4810: 65 6d 5d 20 21 3d 20 2d 31 7d 5d 0a 7d 0a 0a 0a  em] != -1}].}...
4820: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
4870: 20 20 43 6f 6d 6d 61 6e 64 20 4c 69 73 74 42 6f    Command ListBo
4880: 78 3a 3a 69 6e 64 65 78 0a 23 20 2d 2d 2d 2d 2d  x::index.# -----
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 4c 69 73  -------.proc Lis
48e0: 74 42 6f 78 3a 3a 69 6e 64 65 78 20 7b 20 70 61  tBox::index { pa
48f0: 74 68 20 69 74 65 6d 20 7d 20 7b 0a 20 20 20 20  th item } {.    
4900: 76 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20  variable $path. 
4910: 20 20 20 75 70 76 61 72 20 30 20 20 24 70 61 74     upvar 0  $pat
4920: 68 20 64 61 74 61 0a 20 20 20 20 69 66 20 7b 5b  h data.    if {[
4930: 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24 69 74  string equal $it
4940: 65 6d 20 22 61 63 74 69 76 65 22 5d 7d 20 7b 20  em "active"]} { 
4950: 72 65 74 75 72 6e 20 5b 24 70 61 74 68 20 73 65  return [$path se
4960: 6c 65 63 74 69 6f 6e 20 67 65 74 5d 20 7d 0a 20  lection get] }. 
4970: 20 20 20 72 65 74 75 72 6e 20 5b 6c 73 65 61 72     return [lsear
4980: 63 68 20 2d 65 78 61 63 74 20 24 64 61 74 61 28  ch -exact $data(
4990: 69 74 65 6d 73 29 20 24 69 74 65 6d 5d 0a 7d 0a  items) $item].}.
49a0: 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..# ------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 0a 23 20 20 4c 69 73 74 42 6f 78 3a 3a 66 69 6e  .#  ListBox::fin
4a00: 64 0a 23 20 20 20 20 20 52 65 74 75 72 6e 73 20  d.#     Returns 
4a10: 74 68 65 20 69 74 65 6d 20 67 69 76 65 6e 20 61  the item given a
4a20: 20 70 6f 73 69 74 69 6f 6e 2e 0a 23 20 20 66 69   position..#  fi
4a30: 6e 64 49 6e 66 6f 20 20 20 20 20 40 78 2c 79 20  ndInfo     @x,y 
4a40: 3f 63 6f 6e 66 69 6e 65 3f 0a 23 20 20 20 20 20  ?confine?.#     
4a50: 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 4e 75            lineNu
4a60: 6d 62 65 72 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  mber.# ---------
4a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ab0: 2d 2d 2d 0a 70 72 6f 63 20 4c 69 73 74 42 6f 78  ---.proc ListBox
4ac0: 3a 3a 66 69 6e 64 20 7b 70 61 74 68 20 66 69 6e  ::find {path fin
4ad0: 64 49 6e 66 6f 20 7b 63 6f 6e 66 69 6e 65 20 22  dInfo {confine "
4ae0: 22 7d 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62  "}} {.    variab
4af0: 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75 70 76  le $path.    upv
4b00: 61 72 20 30 20 20 24 70 61 74 68 20 77 69 64 67  ar 0  $path widg
4b10: 65 74 44 61 74 61 0a 0a 20 20 20 20 69 66 20 7b  etData..    if {
4b20: 5b 72 65 67 65 78 70 20 2d 2d 20 7b 5e 40 28 5b  [regexp -- {^@([
4b30: 30 2d 39 5d 2b 29 2c 28 5b 30 2d 39 5d 2b 29 24  0-9]+),([0-9]+)$
4b40: 7d 20 24 66 69 6e 64 49 6e 66 6f 20 6d 61 74 63  } $findInfo matc
4b50: 68 20 78 20 79 5d 7d 20 7b 0a 20 20 20 20 20 20  h x y]} {.      
4b60: 20 20 73 65 74 20 78 20 5b 24 70 61 74 68 2e 63    set x [$path.c
4b70: 20 63 61 6e 76 61 73 78 20 24 78 5d 0a 20 20 20   canvasx $x].   
4b80: 20 20 20 20 20 73 65 74 20 79 20 5b 24 70 61 74       set y [$pat
4b90: 68 2e 63 20 63 61 6e 76 61 73 79 20 24 79 5d 0a  h.c canvasy $y].
4ba0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 72      } elseif {[r
4bb0: 65 67 65 78 70 20 2d 2d 20 7b 5e 5b 30 2d 39 5d  egexp -- {^[0-9]
4bc0: 2b 24 7d 20 24 66 69 6e 64 49 6e 66 6f 20 6c 69  +$} $findInfo li
4bd0: 6e 65 4e 75 6d 62 65 72 5d 7d 20 7b 0a 20 20 20  neNumber]} {.   
4be0: 20 20 20 20 20 73 65 74 20 64 79 20 5b 57 69 64       set dy [Wid
4bf0: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
4c00: 70 61 74 68 20 2d 64 65 6c 74 61 79 5d 0a 20 20  path -deltay].  
4c10: 20 20 20 20 20 20 73 65 74 20 79 20 20 5b 65 78        set y  [ex
4c20: 70 72 20 7b 24 64 79 2a 28 24 6c 69 6e 65 4e 75  pr {$dy*($lineNu
4c30: 6d 62 65 72 2b 30 2e 35 29 7d 5d 0a 20 20 20 20  mber+0.5)}].    
4c40: 20 20 20 20 73 65 74 20 63 6f 6e 66 69 6e 65 20      set confine 
4c50: 22 22 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  "".    } else {.
4c60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
4c70: 63 6f 64 65 20 65 72 72 6f 72 20 22 69 6e 76 61  code error "inva
4c80: 6c 69 64 20 66 69 6e 64 20 73 70 65 63 20 5c 22  lid find spec \"
4c90: 24 66 69 6e 64 49 6e 66 6f 5c 22 22 0a 20 20 20  $findInfo\"".   
4ca0: 20 7d 0a 0a 20 20 20 20 73 65 74 20 66 6f 75 6e   }..    set foun
4cb0: 64 20 30 0a 20 20 20 20 73 65 74 20 78 69 20 20  d 0.    set xi  
4cc0: 20 20 30 0a 20 20 20 20 66 6f 72 65 61 63 68 20    0.    foreach 
4cd0: 78 73 20 24 77 69 64 67 65 74 44 61 74 61 28 78  xs $widgetData(x
4ce0: 6c 69 73 74 29 20 7b 0a 20 20 20 20 20 20 20 20  list) {.        
4cf0: 69 66 20 7b 24 78 20 3c 3d 20 24 78 73 7d 20 7b  if {$x <= $xs} {
4d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
4d10: 65 61 63 68 20 69 64 20 5b 24 70 61 74 68 2e 63  each id [$path.c
4d20: 20 66 69 6e 64 20 6f 76 65 72 6c 61 70 70 69 6e   find overlappin
4d30: 67 20 24 78 69 20 24 79 20 24 78 73 20 24 79 5d  g $xi $y $xs $y]
4d40: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4d50: 20 20 20 73 65 74 20 6c 74 61 67 73 20 5b 24 70     set ltags [$p
4d60: 61 74 68 2e 63 20 67 65 74 74 61 67 73 20 24 69  ath.c gettags $i
4d70: 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d].             
4d80: 20 20 20 73 65 74 20 69 74 65 6d 20 20 5b 6c 69     set item  [li
4d90: 6e 64 65 78 20 24 6c 74 61 67 73 20 30 5d 0a 20  ndex $ltags 0]. 
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4db0: 66 20 7b 20 5b 73 74 72 69 6e 67 20 65 71 75 61  f { [string equa
4dc0: 6c 20 24 69 74 65 6d 20 22 69 74 65 6d 22 5d 20  l $item "item"] 
4dd0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
4de0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
4df0: 65 71 75 61 6c 20 24 69 74 65 6d 20 22 69 6d 67  equal $item "img
4e00: 22 5d 20 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  "]  ||.         
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
4e20: 69 6e 67 20 65 71 75 61 6c 20 24 69 74 65 6d 20  ing equal $item 
4e30: 22 77 69 6e 22 5d 20 7d 20 7b 0a 20 20 20 20 20  "win"] } {.     
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
4e50: 20 69 74 65 6d 20 69 73 20 74 68 65 20 6c 61 62   item is the lab
4e60: 65 6c 20 6f 72 20 69 6d 61 67 65 2f 77 69 6e 64  el or image/wind
4e70: 6f 77 20 6f 66 20 74 68 65 20 6e 6f 64 65 0a 20  ow of the node. 
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 73 65 74 20 69 74 65 6d 20 5b 73 74 72     set item [str
4ea0: 69 6e 67 20 72 61 6e 67 65 20 5b 6c 69 6e 64 65  ing range [linde
4eb0: 78 20 24 6c 74 61 67 73 20 31 5d 20 32 20 65 6e  x $ltags 1] 2 en
4ec0: 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d].             
4ed0: 20 20 20 20 20 20 20 73 65 74 20 66 6f 75 6e 64         set found
4ee0: 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   1.             
4ef0: 20 20 20 20 20 20 20 62 72 65 61 6b 0a 20 20 20         break.   
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
4f10: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4f20: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 0a 20           break. 
4f30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4f40: 20 73 65 74 20 20 78 69 20 20 24 78 73 0a 20 20   set  xi  $xs.  
4f50: 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b 24 66 6f    }..    if {$fo
4f60: 75 6e 64 7d 20 7b 0a 20 20 20 20 20 20 20 20 69  und} {.        i
4f70: 66 20 7b 5b 73 74 72 69 6e 67 20 65 71 75 61 6c  f {[string equal
4f80: 20 24 63 6f 6e 66 69 6e 65 20 22 63 6f 6e 66 69   $confine "confi
4f90: 6e 65 22 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20  ne"]} {.        
4fa0: 20 20 20 20 23 20 74 65 73 74 20 69 66 20 78 20      # test if x 
4fb0: 73 74 61 6e 64 20 69 6e 73 69 64 65 20 6e 6f 64  stand inside nod
4fc0: 65 20 62 62 6f 78 0a 20 20 20 20 20 20 20 20 20  e bbox.         
4fd0: 20 20 20 73 65 74 20 78 69 20 5b 65 78 70 72 20     set xi [expr 
4fe0: 7b 5b 6c 69 6e 64 65 78 20 5b 24 70 61 74 68 2e  {[lindex [$path.
4ff0: 63 20 63 6f 6f 72 64 73 20 6e 3a 24 69 74 65 6d  c coords n:$item
5000: 5d 20 30 5d 2d 5b 57 69 64 67 65 74 3a 3a 67 65  ] 0]-[Widget::ge
5010: 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 70  toption $path -p
5020: 61 64 78 5d 7d 5d 0a 20 20 20 20 20 20 20 20 20  adx]}].         
5030: 20 20 20 73 65 74 20 78 73 20 5b 6c 69 6e 64 65     set xs [linde
5040: 78 20 5b 24 70 61 74 68 2e 63 20 62 62 6f 78 20  x [$path.c bbox 
5050: 6e 3a 24 69 74 65 6d 5d 20 32 5d 0a 20 20 20 20  n:$item] 2].    
5060: 20 20 20 20 20 20 20 20 69 66 20 7b 24 78 20 3e          if {$x >
5070: 3d 20 24 78 69 20 26 26 20 24 78 20 3c 3d 20 24  = $xi && $x <= $
5080: 78 73 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  xs} {.          
5090: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 69 74        return $it
50a0: 65 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  em.            }
50b0: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
50c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
50d0: 74 75 72 6e 20 24 69 74 65 6d 0a 20 20 20 20 20  turn $item.     
50e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
50f0: 65 74 75 72 6e 20 22 22 0a 7d 0a 0a 0a 23 20 2d  eturn "".}...# -
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43  -----------.#  C
5150: 6f 6d 6d 61 6e 64 20 4c 69 73 74 42 6f 78 3a 3a  ommand ListBox::
5160: 69 74 65 6d 20 2d 20 64 65 70 72 65 63 61 74 65  item - deprecate
5170: 64 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  d.# ------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51c0: 0a 70 72 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 69  .proc ListBox::i
51d0: 74 65 6d 20 7b 20 70 61 74 68 20 66 69 72 73 74  tem { path first
51e0: 20 7b 6c 61 73 74 20 22 22 7d 20 7d 20 7b 0a 20   {last ""} } {. 
51f0: 20 20 20 76 61 72 69 61 62 6c 65 20 24 70 61 74     variable $pat
5200: 68 0a 20 20 20 20 75 70 76 61 72 20 30 20 20 24  h.    upvar 0  $
5210: 70 61 74 68 20 64 61 74 61 0a 0a 20 20 20 20 69  path data..    i
5220: 66 20 7b 20 21 5b 73 74 72 69 6e 67 20 6c 65 6e  f { ![string len
5230: 67 74 68 20 24 6c 61 73 74 5d 20 7d 20 7b 0a 20  gth $last] } {. 
5240: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
5250: 69 6e 64 65 78 20 24 64 61 74 61 28 69 74 65 6d  index $data(item
5260: 73 29 20 24 66 69 72 73 74 5d 0a 20 20 20 20 7d  s) $first].    }
5270: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
5280: 72 65 74 75 72 6e 20 5b 6c 72 61 6e 67 65 20 24  return [lrange $
5290: 64 61 74 61 28 69 74 65 6d 73 29 20 24 66 69 72  data(items) $fir
52a0: 73 74 20 24 6c 61 73 74 5d 0a 20 20 20 20 7d 0a  st $last].    }.
52b0: 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...# ----------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5300: 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 4c 69  --.#  Command Li
5310: 73 74 42 6f 78 3a 3a 69 74 65 6d 73 0a 23 20 2d  stBox::items.# -
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63  -----------.proc
5370: 20 4c 69 73 74 42 6f 78 3a 3a 69 74 65 6d 73 20   ListBox::items 
5380: 7b 20 70 61 74 68 20 7b 66 69 72 73 74 20 22 22  { path {first ""
5390: 7d 20 7b 6c 61 73 74 20 22 22 7d 7d 20 7b 0a 20  } {last ""}} {. 
53a0: 20 20 20 76 61 72 69 61 62 6c 65 20 24 70 61 74     variable $pat
53b0: 68 0a 20 20 20 20 75 70 76 61 72 20 30 20 20 24  h.    upvar 0  $
53c0: 70 61 74 68 20 64 61 74 61 0a 0a 20 20 20 20 69  path data..    i
53d0: 66 20 7b 20 21 5b 73 74 72 69 6e 67 20 6c 65 6e  f { ![string len
53e0: 67 74 68 20 24 66 69 72 73 74 5d 20 7d 20 7b 0a  gth $first] } {.
53f0: 09 72 65 74 75 72 6e 20 24 64 61 74 61 28 69 74  .return $data(it
5400: 65 6d 73 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ems).    }..    
5410: 69 66 20 7b 20 21 5b 73 74 72 69 6e 67 20 6c 65  if { ![string le
5420: 6e 67 74 68 20 24 6c 61 73 74 5d 20 7d 20 7b 0a  ngth $last] } {.
5430: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
5440: 6c 69 6e 64 65 78 20 24 64 61 74 61 28 69 74 65  lindex $data(ite
5450: 6d 73 29 20 24 66 69 72 73 74 5d 0a 20 20 20 20  ms) $first].    
5460: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
5470: 20 72 65 74 75 72 6e 20 5b 6c 72 61 6e 67 65 20   return [lrange 
5480: 24 64 61 74 61 28 69 74 65 6d 73 29 20 24 66 69  $data(items) $fi
5490: 72 73 74 20 24 6c 61 73 74 5d 0a 20 20 20 20 7d  rst $last].    }
54a0: 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}...# ---------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54f0: 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 4c  ---.#  Command L
5500: 69 73 74 42 6f 78 3a 3a 73 65 65 0a 23 20 2d 2d  istBox::see.# --
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20  ----------.proc 
5560: 4c 69 73 74 42 6f 78 3a 3a 73 65 65 20 7b 20 70  ListBox::see { p
5570: 61 74 68 20 69 74 65 6d 20 7d 20 7b 0a 20 20 20  ath item } {.   
5580: 20 76 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a   variable $path.
5590: 20 20 20 20 75 70 76 61 72 20 30 20 20 24 70 61      upvar 0  $pa
55a0: 74 68 20 64 61 74 61 0a 0a 20 20 20 20 69 66 20  th data..    if 
55b0: 7b 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70  { [Widget::getop
55c0: 74 69 6f 6e 20 24 70 61 74 68 20 2d 72 65 64 72  tion $path -redr
55d0: 61 77 5d 20 26 26 20 24 64 61 74 61 28 75 70 64  aw] && $data(upd
55e0: 2c 61 66 74 65 72 69 64 29 20 21 3d 20 22 22 20  ,afterid) != "" 
55f0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 61 66 74 65  } {.        afte
5600: 72 20 63 61 6e 63 65 6c 20 24 64 61 74 61 28 75  r cancel $data(u
5610: 70 64 2c 61 66 74 65 72 69 64 29 0a 20 20 20 20  pd,afterid).    
5620: 20 20 20 20 5f 72 65 64 72 61 77 5f 6c 69 73 74      _redraw_list
5630: 62 6f 78 20 24 70 61 74 68 0a 20 20 20 20 7d 0a  box $path.    }.
5640: 20 20 20 20 73 65 74 20 69 64 6e 20 5b 24 70 61      set idn [$pa
5650: 74 68 2e 63 20 66 69 6e 64 20 77 69 74 68 74 61  th.c find withta
5660: 67 20 6e 3a 24 69 74 65 6d 5d 0a 20 20 20 20 69  g n:$item].    i
5670: 66 20 7b 20 24 69 64 6e 20 21 3d 20 22 22 20 7d  f { $idn != "" }
5680: 20 7b 0a 20 20 20 20 20 20 20 20 4c 69 73 74 42   {.        ListB
5690: 6f 78 3a 3a 5f 73 65 65 20 24 70 61 74 68 20 24  ox::_see $path $
56a0: 69 64 6e 20 72 69 67 68 74 0a 20 20 20 20 20 20  idn right.      
56b0: 20 20 4c 69 73 74 42 6f 78 3a 3a 5f 73 65 65 20    ListBox::_see 
56c0: 24 70 61 74 68 20 24 69 64 6e 20 6c 65 66 74 0a  $path $idn left.
56d0: 20 20 20 20 7d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d      }.}...# ----
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d  --------.#  Comm
5730: 61 6e 64 20 4c 69 73 74 42 6f 78 3a 3a 65 64 69  and ListBox::edi
5740: 74 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.# ------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 0a 70 72 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 65  .proc ListBox::e
57a0: 64 69 74 20 7b 20 70 61 74 68 20 69 74 65 6d 20  dit { path item 
57b0: 74 65 78 74 20 7b 76 65 72 69 66 79 63 6d 64 20  text {verifycmd 
57c0: 22 22 7d 20 7b 63 6c 69 63 6b 72 65 73 20 30 7d  ""} {clickres 0}
57d0: 20 7b 73 65 6c 65 63 74 20 31 7d 7d 20 7b 0a 20   {select 1}} {. 
57e0: 20 20 20 76 61 72 69 61 62 6c 65 20 5f 65 64 69     variable _edi
57f0: 74 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 24  t.    variable $
5800: 70 61 74 68 0a 20 20 20 20 75 70 76 61 72 20 30  path.    upvar 0
5810: 20 20 24 70 61 74 68 20 64 61 74 61 0a 0a 20 20    $path data..  
5820: 20 20 69 66 20 7b 20 5b 57 69 64 67 65 74 3a 3a    if { [Widget::
5830: 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 20  getoption $path 
5840: 2d 72 65 64 72 61 77 5d 20 26 26 20 24 64 61 74  -redraw] && $dat
5850: 61 28 75 70 64 2c 61 66 74 65 72 69 64 29 20 21  a(upd,afterid) !
5860: 3d 20 22 22 20 7d 20 7b 0a 20 20 20 20 20 20 20  = "" } {.       
5870: 20 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 64   after cancel $d
5880: 61 74 61 28 75 70 64 2c 61 66 74 65 72 69 64 29  ata(upd,afterid)
5890: 0a 20 20 20 20 20 20 20 20 5f 72 65 64 72 61 77  .        _redraw
58a0: 5f 6c 69 73 74 62 6f 78 20 24 70 61 74 68 0a 20  _listbox $path. 
58b0: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 69 64 6e     }.    set idn
58c0: 20 5b 24 70 61 74 68 2e 63 20 66 69 6e 64 20 77   [$path.c find w
58d0: 69 74 68 74 61 67 20 6e 3a 24 69 74 65 6d 5d 0a  ithtag n:$item].
58e0: 20 20 20 20 69 66 20 7b 20 24 69 64 6e 20 21 3d      if { $idn !=
58f0: 20 22 22 20 7d 20 7b 0a 20 20 20 20 20 20 20 20   "" } {.        
5900: 4c 69 73 74 42 6f 78 3a 3a 5f 73 65 65 20 24 70  ListBox::_see $p
5910: 61 74 68 20 24 69 64 6e 20 72 69 67 68 74 0a 20  ath $idn right. 
5920: 20 20 20 20 20 20 20 4c 69 73 74 42 6f 78 3a 3a         ListBox::
5930: 5f 73 65 65 20 24 70 61 74 68 20 24 69 64 6e 20  _see $path $idn 
5940: 6c 65 66 74 0a 0a 20 20 20 20 20 20 20 20 73 65  left..        se
5950: 74 20 6f 6c 64 66 67 20 20 5b 24 70 61 74 68 2e  t oldfg  [$path.
5960: 63 20 69 74 65 6d 63 67 65 74 20 24 69 64 6e 20  c itemcget $idn 
5970: 2d 66 69 6c 6c 5d 0a 20 20 20 20 20 20 20 20 73  -fill].        s
5980: 65 74 20 73 62 67 20 20 20 20 5b 57 69 64 67 65  et sbg    [Widge
5990: 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61  t::getoption $pa
59a0: 74 68 20 2d 73 65 6c 65 63 74 62 61 63 6b 67 72  th -selectbackgr
59b0: 6f 75 6e 64 5d 0a 20 20 20 20 20 20 20 20 73 65  ound].        se
59c0: 74 20 63 6f 6f 72 64 73 20 5b 24 70 61 74 68 2e  t coords [$path.
59d0: 63 20 63 6f 6f 72 64 73 20 24 69 64 6e 5d 0a 20  c coords $idn]. 
59e0: 20 20 20 20 20 20 20 73 65 74 20 78 20 20 20 20         set x    
59f0: 20 20 5b 6c 69 6e 64 65 78 20 24 63 6f 6f 72 64    [lindex $coord
5a00: 73 20 30 5d 0a 20 20 20 20 20 20 20 20 73 65 74  s 0].        set
5a10: 20 79 20 20 20 20 20 20 5b 6c 69 6e 64 65 78 20   y      [lindex 
5a20: 24 63 6f 6f 72 64 73 20 31 5d 0a 20 20 20 20 20  $coords 1].     
5a30: 20 20 20 73 65 74 20 62 64 20 20 20 20 20 5b 65     set bd     [e
5a40: 78 70 72 20 7b 5b 24 70 61 74 68 2e 63 20 63 67  xpr {[$path.c cg
5a50: 65 74 20 2d 62 6f 72 64 65 72 77 69 64 74 68 5d  et -borderwidth]
5a60: 2b 5b 24 70 61 74 68 2e 63 20 63 67 65 74 20 2d  +[$path.c cget -
5a70: 68 69 67 68 6c 69 67 68 74 74 68 69 63 6b 6e 65  highlightthickne
5a80: 73 73 5d 7d 5d 0a 20 20 20 20 20 20 20 20 73 65  ss]}].        se
5a90: 74 20 77 20 20 20 20 20 20 5b 65 78 70 72 20 7b  t w      [expr {
5aa0: 5b 77 69 6e 66 6f 20 77 69 64 74 68 20 24 70 61  [winfo width $pa
5ab0: 74 68 5d 20 2d 20 32 2a 24 62 64 7d 5d 0a 20 20  th] - 2*$bd}].  
5ac0: 20 20 20 20 20 20 73 65 74 20 77 6d 61 78 20 20        set wmax  
5ad0: 20 5b 65 78 70 72 20 7b 5b 24 70 61 74 68 2e 63   [expr {[$path.c
5ae0: 20 63 61 6e 76 61 73 78 20 24 77 5d 2d 24 78 7d   canvasx $w]-$x}
5af0: 5d 0a 0a 09 24 70 61 74 68 2e 63 20 69 74 65 6d  ]...$path.c item
5b00: 63 6f 6e 66 69 67 75 72 65 20 24 69 64 6e 20 20  configure $idn  
5b10: 20 20 2d 66 69 6c 6c 20 5b 57 69 64 67 65 74 3a    -fill [Widget:
5b20: 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68  :getoption $path
5b30: 20 2d 62 61 63 6b 67 72 6f 75 6e 64 5d 0a 20 20   -background].  
5b40: 20 20 20 20 20 20 24 70 61 74 68 2e 63 20 69 74        $path.c it
5b50: 65 6d 63 6f 6e 66 69 67 75 72 65 20 73 3a 24 69  emconfigure s:$i
5b60: 74 65 6d 20 2d 66 69 6c 6c 20 7b 7d 20 2d 6f 75  tem -fill {} -ou
5b70: 74 6c 69 6e 65 20 7b 7d 0a 0a 20 20 20 20 20 20  tline {}..      
5b80: 20 20 73 65 74 20 5f 65 64 69 74 28 74 65 78 74    set _edit(text
5b90: 29 20 24 74 65 78 74 0a 20 20 20 20 20 20 20 20  ) $text.        
5ba0: 73 65 74 20 5f 65 64 69 74 28 77 61 69 74 29 20  set _edit(wait) 
5bb0: 30 0a 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  0..        set f
5bc0: 72 61 6d 65 20 20 5b 66 72 61 6d 65 20 24 70 61  rame  [frame $pa
5bd0: 74 68 2e 65 64 69 74 20 5c 0a 20 20 20 20 20 20  th.edit \.      
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bf0: 20 20 2d 72 65 6c 69 65 66 20 66 6c 61 74 20 2d    -relief flat -
5c00: 62 6f 72 64 65 72 77 69 64 74 68 20 30 20 2d 68  borderwidth 0 -h
5c10: 69 67 68 6c 69 67 68 74 74 68 69 63 6b 6e 65 73  ighlightthicknes
5c20: 73 20 30 20 5c 0a 20 20 20 20 20 20 20 20 20 20  s 0 \.          
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 62                -b
5c40: 61 63 6b 67 72 6f 75 6e 64 20 5b 57 69 64 67 65  ackground [Widge
5c50: 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61  t::getoption $pa
5c60: 74 68 20 2d 62 61 63 6b 67 72 6f 75 6e 64 5d 5d  th -background]]
5c70: 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 6e 74  .        set ent
5c80: 20 20 20 20 5b 65 6e 74 72 79 20 24 66 72 61 6d      [entry $fram
5c90: 65 2e 65 64 69 74 20 5c 0a 20 20 20 20 20 20 20  e.edit \.       
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 20 2d 77 69 64 74 68 20 20 20 20 20 20 20 20 20   -width         
5cc0: 20 20 20 20 20 30 20 20 20 20 20 5c 0a 20 20 20       0     \.   
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 20 20 20 20 20 2d 72 65 6c 69 65 66 20 20 20 20       -relief    
5cf0: 20 20 20 20 20 20 20 20 20 73 6f 6c 69 64 20 5c           solid \
5d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5d10: 20 20 20 20 20 20 20 20 20 2d 62 6f 72 64 65 72           -border
5d20: 77 69 64 74 68 20 20 20 20 20 20 20 20 31 20 20  width        1  
5d30: 20 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20     \.           
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 68 69               -hi
5d50: 67 68 6c 69 67 68 74 74 68 69 63 6b 6e 65 73 73  ghlightthickness
5d60: 20 30 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20   0     \.       
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 2d 66 6f 72 65 67 72 6f 75 6e 64 20 20 20 20   -foreground    
5d90: 20 20 20 20 20 5b 5f 67 65 74 6f 70 74 69 6f 6e       [_getoption
5da0: 20 24 70 61 74 68 20 24 69 74 65 6d 20 2d 66 6f   $path $item -fo
5db0: 72 65 67 72 6f 75 6e 64 5d 20 5c 0a 20 20 20 20  reground] \.    
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 2d 62 61 63 6b 67 72 6f 75 6e 64 20      -background 
5de0: 20 20 20 20 20 20 20 20 5b 57 69 64 67 65 74 3a          [Widget:
5df0: 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68  :getoption $path
5e00: 20 2d 62 61 63 6b 67 72 6f 75 6e 64 5d 20 5c 0a   -background] \.
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e20: 20 20 20 20 20 20 20 20 2d 73 65 6c 65 63 74 66          -selectf
5e30: 6f 72 65 67 72 6f 75 6e 64 20 20 20 5b 57 69 64  oreground   [Wid
5e40: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
5e50: 70 61 74 68 20 2d 73 65 6c 65 63 74 66 6f 72 65  path -selectfore
5e60: 67 72 6f 75 6e 64 5d 20 5c 0a 20 20 20 20 20 20  ground] \.      
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 2d 73 65 6c 65 63 74 62 61 63 6b 67 72 6f    -selectbackgro
5e90: 75 6e 64 20 20 20 24 73 62 67 20 20 5c 0a 20 20  und   $sbg  \.  
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5eb0: 20 20 20 20 20 20 2d 66 6f 6e 74 20 20 20 20 20        -font     
5ec0: 20 20 20 20 20 20 20 20 20 20 5b 5f 67 65 74 6f            [_geto
5ed0: 70 74 69 6f 6e 20 24 70 61 74 68 20 24 69 74 65  ption $path $ite
5ee0: 6d 20 2d 66 6f 6e 74 5d 20 5c 0a 20 20 20 20 20  m -font] \.     
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f00: 20 20 20 2d 74 65 78 74 76 61 72 69 61 62 6c 65     -textvariable
5f10: 20 20 20 20 20 20 20 4c 69 73 74 42 6f 78 3a 3a         ListBox::
5f20: 5f 65 64 69 74 28 74 65 78 74 29 5d 0a 20 20 20  _edit(text)].   
5f30: 20 20 20 20 20 70 61 63 6b 20 24 65 6e 74 20 2d       pack $ent -
5f40: 69 70 61 64 78 20 38 20 2d 61 6e 63 68 6f 72 20  ipadx 8 -anchor 
5f50: 77 0a 0a 20 20 20 20 20 20 20 20 73 65 74 20 69  w..        set i
5f60: 64 77 20 5b 24 70 61 74 68 2e 63 20 63 72 65 61  dw [$path.c crea
5f70: 74 65 20 77 69 6e 64 6f 77 20 24 78 20 24 79 20  te window $x $y 
5f80: 2d 77 69 6e 64 6f 77 20 24 66 72 61 6d 65 20 2d  -window $frame -
5f90: 61 6e 63 68 6f 72 20 77 5d 0a 20 20 20 20 20 20  anchor w].      
5fa0: 20 20 74 72 61 63 65 20 76 61 72 69 61 62 6c 65    trace variable
5fb0: 20 4c 69 73 74 42 6f 78 3a 3a 5f 65 64 69 74 28   ListBox::_edit(
5fc0: 74 65 78 74 29 20 77 20 5b 6c 69 73 74 20 4c 69  text) w [list Li
5fd0: 73 74 42 6f 78 3a 3a 5f 75 70 64 61 74 65 5f 65  stBox::_update_e
5fe0: 64 69 74 5f 73 69 7a 65 20 24 70 61 74 68 20 24  dit_size $path $
5ff0: 65 6e 74 20 24 69 64 77 20 24 77 6d 61 78 5d 0a  ent $idw $wmax].
6000: 20 20 20 20 20 20 20 20 74 6b 77 61 69 74 20 76          tkwait v
6010: 69 73 69 62 69 6c 69 74 79 20 24 65 6e 74 0a 20  isibility $ent. 
6020: 20 20 20 20 20 20 20 67 72 61 62 20 20 24 66 72         grab  $fr
6030: 61 6d 65 0a 20 20 20 20 20 20 20 20 42 57 69 64  ame.        BWid
6040: 67 65 74 3a 3a 66 6f 63 75 73 20 73 65 74 20 24  get::focus set $
6050: 65 6e 74 0a 20 20 20 20 20 20 20 20 5f 75 70 64  ent.        _upd
6060: 61 74 65 5f 65 64 69 74 5f 73 69 7a 65 20 24 70  ate_edit_size $p
6070: 61 74 68 20 24 65 6e 74 20 24 69 64 77 20 24 77  ath $ent $idw $w
6080: 6d 61 78 0a 20 20 20 20 20 20 20 20 75 70 64 61  max.        upda
6090: 74 65 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20  te.        if { 
60a0: 24 73 65 6c 65 63 74 20 7d 20 7b 0a 20 20 20 20  $select } {.    
60b0: 20 20 20 20 20 20 20 20 24 65 6e 74 20 73 65 6c          $ent sel
60c0: 65 63 74 69 6f 6e 20 72 61 6e 67 65 20 30 20 65  ection range 0 e
60d0: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  nd.            $
60e0: 65 6e 74 20 69 63 75 72 73 6f 72 20 65 6e 64 0a  ent icursor end.
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 24 65 6e 74              $ent
6100: 20 78 76 69 65 77 20 65 6e 64 0a 20 20 20 20 20   xview end.     
6110: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 62 69     }..        bi
6120: 6e 64 74 61 67 73 20 24 65 6e 74 20 5b 6c 69 73  ndtags $ent [lis
6130: 74 20 24 65 6e 74 20 45 6e 74 72 79 5d 0a 20 20  t $ent Entry].  
6140: 20 20 20 20 20 20 62 69 6e 64 20 24 65 6e 74 20        bind $ent 
6150: 3c 45 73 63 61 70 65 3e 20 7b 73 65 74 20 4c 69  <Escape> {set Li
6160: 73 74 42 6f 78 3a 3a 5f 65 64 69 74 28 77 61 69  stBox::_edit(wai
6170: 74 29 20 30 7d 0a 20 20 20 20 20 20 20 20 62 69  t) 0}.        bi
6180: 6e 64 20 24 65 6e 74 20 3c 52 65 74 75 72 6e 3e  nd $ent <Return>
6190: 20 7b 73 65 74 20 4c 69 73 74 42 6f 78 3a 3a 5f   {set ListBox::_
61a0: 65 64 69 74 28 77 61 69 74 29 20 31 7d 0a 09 69  edit(wait) 1}..i
61b0: 66 20 7b 20 24 63 6c 69 63 6b 72 65 73 20 3d 3d  f { $clickres ==
61c0: 20 30 20 7c 7c 20 24 63 6c 69 63 6b 72 65 73 20   0 || $clickres 
61d0: 3d 3d 20 31 20 7d 20 7b 0a 09 20 20 20 20 62 69  == 1 } {..    bi
61e0: 6e 64 20 24 66 72 61 6d 65 20 3c 42 75 74 74 6f  nd $frame <Butto
61f0: 6e 3e 20 20 5b 6c 69 73 74 20 73 65 74 20 4c 69  n>  [list set Li
6200: 73 74 42 6f 78 3a 3a 5f 65 64 69 74 28 77 61 69  stBox::_edit(wai
6210: 74 29 20 24 63 6c 69 63 6b 72 65 73 5d 0a 09 7d  t) $clickres]..}
6220: 0a 0a 20 20 20 20 20 20 20 20 73 65 74 20 6f 6b  ..        set ok
6230: 20 30 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65   0.        while
6240: 20 7b 20 21 24 6f 6b 20 7d 20 7b 0a 20 20 20 20   { !$ok } {.    
6250: 20 20 20 20 20 20 20 20 74 6b 77 61 69 74 20 76          tkwait v
6260: 61 72 69 61 62 6c 65 20 4c 69 73 74 42 6f 78 3a  ariable ListBox:
6270: 3a 5f 65 64 69 74 28 77 61 69 74 29 0a 20 20 20  :_edit(wait).   
6280: 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 21 24           if { !$
6290: 5f 65 64 69 74 28 77 61 69 74 29 20 7c 7c 20 5b  _edit(wait) || [
62a0: 6c 6c 65 6e 67 74 68 20 24 76 65 72 69 66 79 63  llength $verifyc
62b0: 6d 64 5d 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20  md]==0 ||.      
62c0: 20 20 20 20 20 20 20 20 20 20 20 5b 75 70 6c 65             [uple
62d0: 76 65 6c 20 5c 23 30 20 24 76 65 72 69 66 79 63  vel \#0 $verifyc
62e0: 6d 64 20 5b 6c 69 73 74 20 24 5f 65 64 69 74 28  md [list $_edit(
62f0: 74 65 78 74 29 5d 5d 20 7d 20 7b 0a 20 20 20 20  text)]] } {.    
6300: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
6310: 6f 6b 20 31 0a 20 20 20 20 20 20 20 20 20 20 20  ok 1.           
6320: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
6330: 20 20 20 20 20 74 72 61 63 65 20 76 64 65 6c 65       trace vdele
6340: 74 65 20 4c 69 73 74 42 6f 78 3a 3a 5f 65 64 69  te ListBox::_edi
6350: 74 28 74 65 78 74 29 20 77 20 5b 6c 69 73 74 20  t(text) w [list 
6360: 4c 69 73 74 42 6f 78 3a 3a 5f 75 70 64 61 74 65  ListBox::_update
6370: 5f 65 64 69 74 5f 73 69 7a 65 20 24 70 61 74 68  _edit_size $path
6380: 20 24 65 6e 74 20 24 69 64 77 20 24 77 6d 61 78   $ent $idw $wmax
6390: 5d 0a 20 20 20 20 20 20 20 20 67 72 61 62 20 72  ].        grab r
63a0: 65 6c 65 61 73 65 20 24 66 72 61 6d 65 0a 20 20  elease $frame.  
63b0: 20 20 20 20 20 20 42 57 69 64 67 65 74 3a 3a 66        BWidget::f
63c0: 6f 63 75 73 20 72 65 6c 65 61 73 65 20 24 65 6e  ocus release $en
63d0: 74 0a 20 20 20 20 20 20 20 20 64 65 73 74 72 6f  t.        destro
63e0: 79 20 24 66 72 61 6d 65 0a 20 20 20 20 20 20 20  y $frame.       
63f0: 20 24 70 61 74 68 2e 63 20 64 65 6c 65 74 65 20   $path.c delete 
6400: 24 69 64 77 0a 20 20 20 20 20 20 20 20 24 70 61  $idw.        $pa
6410: 74 68 2e 63 20 69 74 65 6d 63 6f 6e 66 69 67 75  th.c itemconfigu
6420: 72 65 20 24 69 64 6e 20 20 20 20 2d 66 69 6c 6c  re $idn    -fill
6430: 20 24 6f 6c 64 66 67 0a 20 20 20 20 20 20 20 20   $oldfg.        
6440: 24 70 61 74 68 2e 63 20 69 74 65 6d 63 6f 6e 66  $path.c itemconf
6450: 69 67 75 72 65 20 73 3a 24 69 74 65 6d 20 2d 66  igure s:$item -f
6460: 69 6c 6c 20 24 73 62 67 20 2d 6f 75 74 6c 69 6e  ill $sbg -outlin
6470: 65 20 24 73 62 67 0a 0a 20 20 20 20 20 20 20 20  e $sbg..        
6480: 69 66 20 7b 20 24 5f 65 64 69 74 28 77 61 69 74  if { $_edit(wait
6490: 29 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ) } {.          
64a0: 20 20 72 65 74 75 72 6e 20 24 5f 65 64 69 74 28    return $_edit(
64b0: 74 65 78 74 29 0a 20 20 20 20 20 20 20 20 7d 0a  text).        }.
64c0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
64d0: 20 22 22 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d   "".}...# ------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6520: 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e  ------.#  Comman
6530: 64 20 4c 69 73 74 42 6f 78 3a 3a 78 76 69 65 77  d ListBox::xview
6540: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6590: 70 72 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 78 76  proc ListBox::xv
65a0: 69 65 77 20 7b 20 70 61 74 68 20 61 72 67 73 20  iew { path args 
65b0: 7d 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5b  } {.    return [
65c0: 65 76 61 6c 20 5b 6c 69 6e 73 65 72 74 20 24 61  eval [linsert $a
65d0: 72 67 73 20 30 20 24 70 61 74 68 2e 63 20 78 76  rgs 0 $path.c xv
65e0: 69 65 77 5d 5d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d  iew]].}...# ----
65f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6630: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d  --------.#  Comm
6640: 61 6e 64 20 4c 69 73 74 42 6f 78 3a 3a 79 76 69  and ListBox::yvi
6650: 65 77 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ew.# -----------
6660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66a0: 2d 0a 70 72 6f 63 20 4c 69 73 74 42 6f 78 3a 3a  -.proc ListBox::
66b0: 79 76 69 65 77 20 7b 20 70 61 74 68 20 61 72 67  yview { path arg
66c0: 73 20 7d 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  s } {.    return
66d0: 20 5b 65 76 61 6c 20 5b 6c 69 6e 73 65 72 74 20   [eval [linsert 
66e0: 24 61 72 67 73 20 30 20 24 70 61 74 68 2e 63 20  $args 0 $path.c 
66f0: 79 76 69 65 77 5d 5d 0a 7d 0a 0a 0a 70 72 6f 63  yview]].}...proc
6700: 20 4c 69 73 74 42 6f 78 3a 3a 67 65 74 63 61 6e   ListBox::getcan
6710: 76 61 73 20 7b 20 70 61 74 68 20 7d 20 7b 0a 20  vas { path } {. 
6720: 20 20 20 72 65 74 75 72 6e 20 24 70 61 74 68 2e     return $path.
6730: 63 0a 7d 0a 0a 0a 70 72 6f 63 20 4c 69 73 74 42  c.}...proc ListB
6740: 6f 78 3a 3a 63 75 72 73 65 6c 65 63 74 69 6f 6e  ox::curselection
6750: 20 7b 20 70 61 74 68 20 7d 20 7b 0a 20 20 20 20   { path } {.    
6760: 72 65 74 75 72 6e 20 5b 24 70 61 74 68 20 73 65  return [$path se
6770: 6c 65 63 74 69 6f 6e 20 67 65 74 5d 0a 7d 0a 0a  lection get].}..
6780: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
6790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
67d0: 23 20 20 43 6f 6d 6d 61 6e 64 20 4c 69 73 74 42  #  Command ListB
67e0: 6f 78 3a 3a 5f 75 70 64 61 74 65 5f 65 64 69 74  ox::_update_edit
67f0: 5f 73 69 7a 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d  _size.# --------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6840: 2d 2d 2d 2d 0a 70 72 6f 63 20 4c 69 73 74 42 6f  ----.proc ListBo
6850: 78 3a 3a 5f 75 70 64 61 74 65 5f 65 64 69 74 5f  x::_update_edit_
6860: 73 69 7a 65 20 7b 20 70 61 74 68 20 65 6e 74 72  size { path entr
6870: 79 20 69 64 77 20 77 6d 61 78 20 61 72 67 73 20  y idw wmax args 
6880: 7d 20 7b 0a 20 20 20 20 73 65 74 20 65 6e 74 77  } {.    set entw
6890: 20 5b 77 69 6e 66 6f 20 72 65 71 77 69 64 74 68   [winfo reqwidth
68a0: 20 24 65 6e 74 72 79 5d 0a 20 20 20 20 69 66 20   $entry].    if 
68b0: 7b 20 24 65 6e 74 77 20 3e 3d 20 24 77 6d 61 78  { $entw >= $wmax
68c0: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 24 70 61   } {.        $pa
68d0: 74 68 2e 63 20 69 74 65 6d 63 6f 6e 66 69 67 75  th.c itemconfigu
68e0: 72 65 20 24 69 64 77 20 2d 77 69 64 74 68 20 24  re $idw -width $
68f0: 77 6d 61 78 0a 20 20 20 20 7d 20 65 6c 73 65 20  wmax.    } else 
6900: 7b 0a 20 20 20 20 20 20 20 20 24 70 61 74 68 2e  {.        $path.
6910: 63 20 69 74 65 6d 63 6f 6e 66 69 67 75 72 65 20  c itemconfigure 
6920: 24 69 64 77 20 2d 77 69 64 74 68 20 30 0a 20 20  $idw -width 0.  
6930: 20 20 7d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d    }.}...# ------
6940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6980: 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e  ------.#  Comman
6990: 64 20 4c 69 73 74 42 6f 78 3a 3a 5f 67 65 74 6f  d ListBox::_geto
69a0: 70 74 69 6f 6e 0a 23 20 20 20 20 20 52 65 74 75  ption.#     Retu
69b0: 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  rns the value of
69c0: 20 6f 70 74 69 6f 6e 20 66 6f 72 20 6e 6f 64 65   option for node
69d0: 2e 20 49 66 20 65 6d 70 74 79 2c 20 72 65 74 75  . If empty, retu
69e0: 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 74 68  rned value is th
69f0: 6f 73 65 0a 23 20 20 6f 66 20 74 68 65 20 4c 69  ose.#  of the Li
6a00: 73 74 42 6f 78 2e 0a 23 20 2d 2d 2d 2d 2d 2d 2d  stBox..# -------
6a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a50: 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 4c 69 73 74 42  -----.proc ListB
6a60: 6f 78 3a 3a 5f 67 65 74 6f 70 74 69 6f 6e 20 7b  ox::_getoption {
6a70: 20 70 61 74 68 20 69 74 65 6d 20 6f 70 74 69 6f   path item optio
6a80: 6e 20 7d 20 7b 0a 20 20 20 20 73 65 74 20 76 61  n } {.    set va
6a90: 6c 75 65 20 5b 57 69 64 67 65 74 3a 3a 67 65 74  lue [Widget::get
6aa0: 6f 70 74 69 6f 6e 20 24 70 61 74 68 2e 24 69 74  option $path.$it
6ab0: 65 6d 20 24 6f 70 74 69 6f 6e 5d 0a 20 20 20 20  em $option].    
6ac0: 69 66 20 7b 21 5b 73 74 72 69 6e 67 20 6c 65 6e  if {![string len
6ad0: 67 74 68 20 24 76 61 6c 75 65 5d 7d 20 7b 0a 20  gth $value]} {. 
6ae0: 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65         set value
6af0: 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74   [Widget::getopt
6b00: 69 6f 6e 20 24 70 61 74 68 20 24 6f 70 74 69 6f  ion $path $optio
6b10: 6e 5d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  n].    }.    ret
6b20: 75 72 6e 20 24 76 61 6c 75 65 0a 7d 0a 0a 0a 23  urn $value.}...#
6b30: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
6b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
6b80: 20 43 6f 6d 6d 61 6e 64 20 4c 69 73 74 42 6f 78   Command ListBox
6b90: 3a 3a 5f 64 65 73 74 72 6f 79 0a 23 20 2d 2d 2d  ::_destroy.# ---
6ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 4c  ---------.proc L
6bf0: 69 73 74 42 6f 78 3a 3a 5f 64 65 73 74 72 6f 79  istBox::_destroy
6c00: 20 7b 20 70 61 74 68 20 7d 20 7b 0a 20 20 20 20   { path } {.    
6c10: 76 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20  variable $path. 
6c20: 20 20 20 75 70 76 61 72 20 30 20 20 24 70 61 74     upvar 0  $pat
6c30: 68 20 64 61 74 61 0a 0a 20 20 20 20 69 66 20 7b  h data..    if {
6c40: 20 24 64 61 74 61 28 75 70 64 2c 61 66 74 65 72   $data(upd,after
6c50: 69 64 29 20 21 3d 20 22 22 20 7d 20 7b 0a 20 20  id) != "" } {.  
6c60: 20 20 20 20 20 20 61 66 74 65 72 20 63 61 6e 63        after canc
6c70: 65 6c 20 24 64 61 74 61 28 75 70 64 2c 61 66 74  el $data(upd,aft
6c80: 65 72 69 64 29 0a 20 20 20 20 7d 0a 20 20 20 20  erid).    }.    
6c90: 69 66 20 7b 20 24 64 61 74 61 28 64 6e 64 2c 61  if { $data(dnd,a
6ca0: 66 74 65 72 69 64 29 20 21 3d 20 22 22 20 7d 20  fterid) != "" } 
6cb0: 7b 0a 20 20 20 20 20 20 20 20 61 66 74 65 72 20  {.        after 
6cc0: 63 61 6e 63 65 6c 20 24 64 61 74 61 28 64 6e 64  cancel $data(dnd
6cd0: 2c 61 66 74 65 72 69 64 29 0a 20 20 20 20 7d 0a  ,afterid).    }.
6ce0: 20 20 20 20 66 6f 72 65 61 63 68 20 69 74 65 6d      foreach item
6cf0: 20 24 64 61 74 61 28 69 74 65 6d 73 29 20 7b 0a   $data(items) {.
6d00: 20 20 20 20 20 20 20 20 57 69 64 67 65 74 3a 3a          Widget::
6d10: 64 65 73 74 72 6f 79 20 24 70 61 74 68 2e 24 69  destroy $path.$i
6d20: 74 65 6d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 57  tem.    }..    W
6d30: 69 64 67 65 74 3a 3a 64 65 73 74 72 6f 79 20 24  idget::destroy $
6d40: 70 61 74 68 0a 20 20 20 20 75 6e 73 65 74 20 64  path.    unset d
6d50: 61 74 61 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d  ata.}...# ------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6da0: 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e  ------.#  Comman
6db0: 64 20 4c 69 73 74 42 6f 78 3a 3a 5f 73 65 65 0a  d ListBox::_see.
6dc0: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70  --------------.p
6e10: 72 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 5f 73 65  roc ListBox::_se
6e20: 65 20 7b 20 70 61 74 68 20 69 64 6e 20 73 69 64  e { path idn sid
6e30: 65 20 7d 20 7b 0a 20 20 20 20 73 65 74 20 62 62  e } {.    set bb
6e40: 6f 78 20 5b 24 70 61 74 68 2e 63 20 62 62 6f 78  ox [$path.c bbox
6e50: 20 24 69 64 6e 5d 0a 20 20 20 20 73 65 74 20 73   $idn].    set s
6e60: 63 72 6c 20 5b 24 70 61 74 68 2e 63 20 63 67 65  crl [$path.c cge
6e70: 74 20 2d 73 63 72 6f 6c 6c 72 65 67 69 6f 6e 5d  t -scrollregion]
6e80: 0a 0a 20 20 20 20 73 65 74 20 79 6d 61 78 20 5b  ..    set ymax [
6e90: 6c 69 6e 64 65 78 20 24 73 63 72 6c 20 33 5d 0a  lindex $scrl 3].
6ea0: 20 20 20 20 73 65 74 20 64 79 20 20 20 5b 24 70      set dy   [$p
6eb0: 61 74 68 2e 63 20 63 67 65 74 20 2d 79 73 63 72  ath.c cget -yscr
6ec0: 6f 6c 6c 69 6e 63 72 65 6d 65 6e 74 5d 0a 20 20  ollincrement].  
6ed0: 20 20 73 65 74 20 79 76 20 20 20 5b 24 70 61 74    set yv   [$pat
6ee0: 68 2e 63 20 79 76 69 65 77 5d 0a 20 20 20 20 73  h.c yview].    s
6ef0: 65 74 20 79 76 30 20 20 5b 65 78 70 72 20 7b 72  et yv0  [expr {r
6f00: 6f 75 6e 64 28 5b 6c 69 6e 64 65 78 20 24 79 76  ound([lindex $yv
6f10: 20 30 5d 2a 24 79 6d 61 78 2f 24 64 79 29 7d 5d   0]*$ymax/$dy)}]
6f20: 0a 20 20 20 20 73 65 74 20 79 76 31 20 20 5b 65  .    set yv1  [e
6f30: 78 70 72 20 7b 72 6f 75 6e 64 28 5b 6c 69 6e 64  xpr {round([lind
6f40: 65 78 20 24 79 76 20 31 5d 2a 24 79 6d 61 78 2f  ex $yv 1]*$ymax/
6f50: 24 64 79 29 7d 5d 0a 20 20 20 20 73 65 74 20 79  $dy)}].    set y
6f60: 20 20 20 20 5b 65 78 70 72 20 7b 69 6e 74 28 5b      [expr {int([
6f70: 6c 69 6e 64 65 78 20 5b 24 70 61 74 68 2e 63 20  lindex [$path.c 
6f80: 63 6f 6f 72 64 73 20 24 69 64 6e 5d 20 31 5d 2f  coords $idn] 1]/
6f90: 24 64 79 29 7d 5d 0a 20 20 20 20 69 66 20 7b 20  $dy)}].    if { 
6fa0: 24 79 20 3c 20 24 79 76 30 20 7d 20 7b 0a 20 20  $y < $yv0 } {.  
6fb0: 20 20 20 20 20 20 24 70 61 74 68 2e 63 20 79 76        $path.c yv
6fc0: 69 65 77 20 73 63 72 6f 6c 6c 20 5b 65 78 70 72  iew scroll [expr
6fd0: 20 7b 24 79 2d 24 79 76 30 7d 5d 20 75 6e 69 74   {$y-$yv0}] unit
6fe0: 73 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b  s.    } elseif {
6ff0: 20 24 79 20 3e 3d 20 24 79 76 31 20 7d 20 7b 0a   $y >= $yv1 } {.
7000: 20 20 20 20 20 20 20 20 24 70 61 74 68 2e 63 20          $path.c 
7010: 79 76 69 65 77 20 73 63 72 6f 6c 6c 20 5b 65 78  yview scroll [ex
7020: 70 72 20 7b 24 79 2d 24 79 76 31 2b 31 7d 5d 20  pr {$y-$yv1+1}] 
7030: 75 6e 69 74 73 0a 20 20 20 20 7d 0a 0a 20 20 20  units.    }..   
7040: 20 73 65 74 20 78 6d 61 78 20 5b 6c 69 6e 64 65   set xmax [linde
7050: 78 20 24 73 63 72 6c 20 32 5d 0a 20 20 20 20 73  x $scrl 2].    s
7060: 65 74 20 64 78 20 20 20 5b 24 70 61 74 68 2e 63  et dx   [$path.c
7070: 20 63 67 65 74 20 2d 78 73 63 72 6f 6c 6c 69 6e   cget -xscrollin
7080: 63 72 65 6d 65 6e 74 5d 0a 20 20 20 20 73 65 74  crement].    set
7090: 20 78 76 20 20 20 5b 24 70 61 74 68 2e 63 20 78   xv   [$path.c x
70a0: 76 69 65 77 5d 0a 20 20 20 20 69 66 20 7b 20 5b  view].    if { [
70b0: 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24 73 69  string equal $si
70c0: 64 65 20 22 72 69 67 68 74 22 5d 20 7d 20 7b 0a  de "right"] } {.
70d0: 20 20 20 20 20 20 20 20 73 65 74 20 78 76 31 20          set xv1 
70e0: 5b 65 78 70 72 20 7b 72 6f 75 6e 64 28 5b 6c 69  [expr {round([li
70f0: 6e 64 65 78 20 24 78 76 20 31 5d 2a 24 78 6d 61  ndex $xv 1]*$xma
7100: 78 2f 24 64 78 29 7d 5d 0a 20 20 20 20 20 20 20  x/$dx)}].       
7110: 20 73 65 74 20 78 31 20 20 5b 65 78 70 72 20 7b   set x1  [expr {
7120: 69 6e 74 28 5b 6c 69 6e 64 65 78 20 24 62 62 6f  int([lindex $bbo
7130: 78 20 32 5d 2f 24 64 78 29 7d 5d 0a 20 20 20 20  x 2]/$dx)}].    
7140: 20 20 20 20 69 66 20 7b 20 24 78 31 20 3e 3d 20      if { $x1 >= 
7150: 24 78 76 31 20 7d 20 7b 0a 20 20 20 20 20 20 20  $xv1 } {.       
7160: 20 20 20 20 20 24 70 61 74 68 2e 63 20 78 76 69       $path.c xvi
7170: 65 77 20 73 63 72 6f 6c 6c 20 5b 65 78 70 72 20  ew scroll [expr 
7180: 7b 24 78 31 2d 24 78 76 31 2b 31 7d 5d 20 75 6e  {$x1-$xv1+1}] un
7190: 69 74 73 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  its.        }.  
71a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
71b0: 20 20 20 73 65 74 20 78 76 30 20 5b 65 78 70 72     set xv0 [expr
71c0: 20 7b 72 6f 75 6e 64 28 5b 6c 69 6e 64 65 78 20   {round([lindex 
71d0: 24 78 76 20 30 5d 2a 24 78 6d 61 78 2f 24 64 78  $xv 0]*$xmax/$dx
71e0: 29 7d 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20  )}].        set 
71f0: 78 30 20 20 5b 65 78 70 72 20 7b 69 6e 74 28 5b  x0  [expr {int([
7200: 6c 69 6e 64 65 78 20 24 62 62 6f 78 20 30 5d 2f  lindex $bbox 0]/
7210: 24 64 78 29 7d 5d 0a 20 20 20 20 20 20 20 20 69  $dx)}].        i
7220: 66 20 7b 20 24 78 30 20 3c 20 24 78 76 30 20 7d  f { $x0 < $xv0 }
7230: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 24   {.            $
7240: 70 61 74 68 2e 63 20 78 76 69 65 77 20 73 63 72  path.c xview scr
7250: 6f 6c 6c 20 5b 65 78 70 72 20 7b 24 78 30 2d 24  oll [expr {$x0-$
7260: 78 76 30 7d 5d 20 75 6e 69 74 73 0a 20 20 20 20  xv0}] units.    
7270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 0a      }.    }.}...
7280: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
7290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
72c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
72d0: 20 20 43 6f 6d 6d 61 6e 64 20 4c 69 73 74 42 6f    Command ListBo
72e0: 78 3a 3a 5f 75 70 64 61 74 65 5f 73 63 72 6f 6c  x::_update_scrol
72f0: 6c 72 65 67 69 6f 6e 0a 23 20 2d 2d 2d 2d 2d 2d  lregion.# ------
7300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7340: 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 4c 69 73 74  ------.proc List
7350: 42 6f 78 3a 3a 5f 75 70 64 61 74 65 5f 73 63 72  Box::_update_scr
7360: 6f 6c 6c 72 65 67 69 6f 6e 20 7b 20 70 61 74 68  ollregion { path
7370: 20 7d 20 7b 0a 20 20 20 20 73 65 74 20 62 64 20   } {.    set bd 
7380: 20 20 5b 24 70 61 74 68 2e 63 20 63 67 65 74 20    [$path.c cget 
7390: 2d 62 6f 72 64 65 72 77 69 64 74 68 5d 0a 20 20  -borderwidth].  
73a0: 20 20 73 65 74 20 68 74 20 20 20 5b 24 70 61 74    set ht   [$pat
73b0: 68 2e 63 20 63 67 65 74 20 2d 68 69 67 68 6c 69  h.c cget -highli
73c0: 67 68 74 74 68 69 63 6b 6e 65 73 73 5d 0a 20 20  ghtthickness].  
73d0: 20 20 73 65 74 20 62 64 20 20 20 5b 65 78 70 72    set bd   [expr
73e0: 20 7b 32 2a 28 24 62 64 20 2b 20 24 68 74 29 7d   {2*($bd + $ht)}
73f0: 5d 0a 20 20 20 20 73 65 74 20 77 20 20 20 20 5b  ].    set w    [
7400: 65 78 70 72 20 7b 5b 77 69 6e 66 6f 20 77 69 64  expr {[winfo wid
7410: 74 68 20 20 24 70 61 74 68 5d 20 2d 20 24 62 64  th  $path] - $bd
7420: 7d 5d 0a 20 20 20 20 73 65 74 20 68 20 20 20 20  }].    set h    
7430: 5b 65 78 70 72 20 7b 5b 77 69 6e 66 6f 20 68 65  [expr {[winfo he
7440: 69 67 68 74 20 24 70 61 74 68 5d 20 2d 20 24 62  ight $path] - $b
7450: 64 7d 5d 0a 20 20 20 20 73 65 74 20 78 69 6e 63  d}].    set xinc
7460: 20 5b 24 70 61 74 68 2e 63 20 63 67 65 74 20 2d   [$path.c cget -
7470: 78 73 63 72 6f 6c 6c 69 6e 63 72 65 6d 65 6e 74  xscrollincrement
7480: 5d 0a 20 20 20 20 73 65 74 20 79 69 6e 63 20 5b  ].    set yinc [
7490: 24 70 61 74 68 2e 63 20 63 67 65 74 20 2d 79 73  $path.c cget -ys
74a0: 63 72 6f 6c 6c 69 6e 63 72 65 6d 65 6e 74 5d 0a  crollincrement].
74b0: 20 20 20 20 73 65 74 20 62 62 6f 78 20 5b 24 70      set bbox [$p
74c0: 61 74 68 2e 63 20 62 62 6f 78 20 69 74 65 6d 20  ath.c bbox item 
74d0: 77 69 6e 20 69 6d 67 5d 0a 20 20 20 20 69 66 20  win img].    if 
74e0: 7b 20 5b 6c 6c 65 6e 67 74 68 20 24 62 62 6f 78  { [llength $bbox
74f0: 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65  ] } {.        se
7500: 74 20 78 73 20 5b 6c 69 6e 64 65 78 20 24 62 62  t xs [lindex $bb
7510: 6f 78 20 32 5d 0a 20 20 20 20 20 20 20 20 73 65  ox 2].        se
7520: 74 20 79 73 20 5b 6c 69 6e 64 65 78 20 24 62 62  t ys [lindex $bb
7530: 6f 78 20 33 5d 0a 0a 20 20 20 20 20 20 20 20 69  ox 3]..        i
7540: 66 20 7b 20 24 77 20 3c 20 24 78 73 20 7d 20 7b  f { $w < $xs } {
7550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
7560: 20 77 20 5b 65 78 70 72 20 7b 69 6e 74 28 24 78   w [expr {int($x
7570: 73 29 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20  s)}].           
7580: 20 69 66 20 7b 20 5b 73 65 74 20 72 20 5b 65 78   if { [set r [ex
7590: 70 72 20 7b 24 77 20 25 20 24 78 69 6e 63 7d 5d  pr {$w % $xinc}]
75a0: 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] } {.          
75b0: 20 20 20 20 20 20 73 65 74 20 77 20 5b 65 78 70        set w [exp
75c0: 72 20 7b 24 77 2b 24 78 69 6e 63 2d 24 72 7d 5d  r {$w+$xinc-$r}]
75d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
75e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
75f0: 20 69 66 20 7b 20 24 68 20 3c 20 24 79 73 20 7d   if { $h < $ys }
7600: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
7610: 65 74 20 68 20 5b 65 78 70 72 20 7b 69 6e 74 28  et h [expr {int(
7620: 24 79 73 29 7d 5d 0a 20 20 20 20 20 20 20 20 20  $ys)}].         
7630: 20 20 20 69 66 20 7b 20 5b 73 65 74 20 72 20 5b     if { [set r [
7640: 65 78 70 72 20 7b 24 68 20 25 20 24 79 69 6e 63  expr {$h % $yinc
7650: 7d 5d 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  }]] } {.        
7660: 20 20 20 20 20 20 20 20 73 65 74 20 68 20 5b 65          set h [e
7670: 78 70 72 20 7b 24 68 2b 24 79 69 6e 63 2d 24 72  xpr {$h+$yinc-$r
7680: 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }].            }
7690: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
76a0: 0a 0a 20 20 20 20 24 70 61 74 68 2e 63 20 63 6f  ..    $path.c co
76b0: 6e 66 69 67 75 72 65 20 2d 73 63 72 6f 6c 6c 72  nfigure -scrollr
76c0: 65 67 69 6f 6e 20 5b 6c 69 73 74 20 30 20 30 20  egion [list 0 0 
76d0: 24 77 20 24 68 5d 0a 7d 0a 0a 0a 70 72 6f 63 20  $w $h].}...proc 
76e0: 4c 69 73 74 42 6f 78 3a 3a 5f 75 70 64 61 74 65  ListBox::_update
76f0: 5f 73 65 6c 65 63 74 5f 66 69 6c 6c 20 7b 20 70  _select_fill { p
7700: 61 74 68 20 7d 20 7b 0a 20 20 20 20 76 61 72 69  ath } {.    vari
7710: 61 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75  able $path.    u
7720: 70 76 61 72 20 30 20 20 24 70 61 74 68 20 64 61  pvar 0  $path da
7730: 74 61 0a 0a 20 20 20 20 73 65 74 20 77 69 64 74  ta..    set widt
7740: 68 20 5b 77 69 6e 66 6f 20 77 69 64 74 68 20 24  h [winfo width $
7750: 70 61 74 68 5d 0a 0a 20 20 20 20 66 6f 72 65 61  path]..    forea
7760: 63 68 20 69 74 65 6d 20 24 64 61 74 61 28 69 74  ch item $data(it
7770: 65 6d 73 29 20 7b 0a 20 20 20 20 20 20 20 20 73  ems) {.        s
7780: 65 74 20 62 62 6f 78 20 5b 24 70 61 74 68 2e 63  et bbox [$path.c
7790: 20 62 62 6f 78 20 6e 3a 24 69 74 65 6d 5d 0a 20   bbox n:$item]. 
77a0: 20 20 20 20 20 20 20 73 65 74 20 62 62 6f 78 20         set bbox 
77b0: 5b 6c 69 73 74 20 30 20 5b 6c 69 6e 64 65 78 20  [list 0 [lindex 
77c0: 24 62 62 6f 78 20 31 5d 20 24 77 69 64 74 68 20  $bbox 1] $width 
77d0: 5b 6c 69 6e 64 65 78 20 24 62 62 6f 78 20 33 5d  [lindex $bbox 3]
77e0: 5d 0a 20 20 20 20 20 20 20 20 24 70 61 74 68 2e  ].        $path.
77f0: 63 20 63 6f 6f 72 64 73 20 62 3a 24 69 74 65 6d  c coords b:$item
7800: 20 24 62 62 6f 78 0a 20 20 20 20 7d 0a 0a 20 20   $bbox.    }..  
7810: 20 20 5f 72 65 64 72 61 77 5f 73 65 6c 65 63 74    _redraw_select
7820: 69 6f 6e 20 24 70 61 74 68 0a 7d 0a 0a 0a 23 20  ion $path.}...# 
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20  ------------.#  
7880: 43 6f 6d 6d 61 6e 64 20 4c 69 73 74 42 6f 78 3a  Command ListBox:
7890: 3a 5f 64 72 61 77 5f 69 74 65 6d 0a 23 20 2d 2d  :_draw_item.# --
78a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20  ----------.proc 
78f0: 4c 69 73 74 42 6f 78 3a 3a 5f 64 72 61 77 5f 69  ListBox::_draw_i
7900: 74 65 6d 20 7b 70 61 74 68 20 69 74 65 6d 20 78  tem {path item x
7910: 30 20 78 31 20 79 20 62 67 20 73 65 6c 66 69 6c  0 x1 y bg selfil
7920: 6c 20 6d 75 6c 74 69 20 77 77 7d 20 7b 0a 20 20  l multi ww} {.  
7930: 20 20 73 65 74 20 69 6e 64 65 6e 74 20 20 5b 57    set indent  [W
7940: 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e  idget::getoption
7950: 20 24 70 61 74 68 2e 24 69 74 65 6d 20 2d 69 6e   $path.$item -in
7960: 64 65 6e 74 5d 0a 20 20 20 20 73 65 74 20 69 20  dent].    set i 
7970: 5b 24 70 61 74 68 2e 63 20 63 72 65 61 74 65 20  [$path.c create 
7980: 74 65 78 74 20 5b 65 78 70 72 20 7b 24 78 31 2b  text [expr {$x1+
7990: 24 69 6e 64 65 6e 74 7d 5d 20 24 79 20 5c 0a 20  $indent}] $y \. 
79a0: 20 20 20 20 20 20 20 2d 74 65 78 74 20 20 20 5b         -text   [
79b0: 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f  Widget::getoptio
79c0: 6e 20 24 70 61 74 68 2e 24 69 74 65 6d 20 2d 74  n $path.$item -t
79d0: 65 78 74 5d 20 5c 0a 20 20 20 20 20 20 20 20 2d  ext] \.        -
79e0: 66 69 6c 6c 20 20 20 5b 5f 67 65 74 6f 70 74 69  fill   [_getopti
79f0: 6f 6e 20 20 20 20 20 20 20 20 24 70 61 74 68 20  on        $path 
7a00: 24 69 74 65 6d 20 2d 66 6f 72 65 67 72 6f 75 6e  $item -foregroun
7a10: 64 5d 20 5c 0a 20 20 20 20 20 20 20 20 2d 66 6f  d] \.        -fo
7a20: 6e 74 20 20 20 5b 5f 67 65 74 6f 70 74 69 6f 6e  nt   [_getoption
7a30: 20 20 20 20 20 20 20 20 24 70 61 74 68 20 24 69          $path $i
7a40: 74 65 6d 20 2d 66 6f 6e 74 5d 20 5c 0a 20 20 20  tem -font] \.   
7a50: 20 20 20 20 20 2d 61 6e 63 68 6f 72 20 77 20 5c       -anchor w \
7a60: 0a 20 20 20 20 20 20 20 20 2d 74 61 67 73 20 20  .        -tags  
7a70: 20 5b 6c 69 73 74 20 69 74 65 6d 20 6e 3a 24 69   [list item n:$i
7a80: 74 65 6d 20 63 6c 69 63 6b 5d 5d 0a 0a 20 20 20  tem click]]..   
7a90: 20 69 66 20 7b 20 24 73 65 6c 66 69 6c 6c 20 26   if { $selfill &
7aa0: 26 20 21 24 6d 75 6c 74 69 20 7d 20 7b 0a 20 20  & !$multi } {.  
7ab0: 20 20 20 20 20 20 73 65 74 20 62 62 6f 78 20 20        set bbox  
7ac0: 5b 24 70 61 74 68 2e 63 20 62 62 6f 78 20 6e 3a  [$path.c bbox n:
7ad0: 24 69 74 65 6d 5d 0a 20 20 20 20 20 20 20 20 73  $item].        s
7ae0: 65 74 20 62 62 6f 78 20 20 5b 6c 69 73 74 20 30  et bbox  [list 0
7af0: 20 5b 6c 69 6e 64 65 78 20 24 62 62 6f 78 20 31   [lindex $bbox 1
7b00: 5d 20 24 77 77 20 5b 6c 69 6e 64 65 78 20 24 62  ] $ww [lindex $b
7b10: 62 6f 78 20 33 5d 5d 0a 20 20 20 20 20 20 20 20  box 3]].        
7b20: 73 65 74 20 74 61 67 73 20 20 5b 6c 69 73 74 20  set tags  [list 
7b30: 62 6f 78 20 62 3a 24 69 74 65 6d 20 63 6c 69 63  box b:$item clic
7b40: 6b 5d 0a 20 20 20 20 20 20 20 20 24 70 61 74 68  k].        $path
7b50: 2e 63 20 63 72 65 61 74 65 20 72 65 63 74 20 24  .c create rect $
7b60: 62 62 6f 78 20 2d 66 69 6c 6c 20 24 62 67 20 2d  bbox -fill $bg -
7b70: 77 69 64 74 68 20 30 20 2d 74 61 67 73 20 24 74  width 0 -tags $t
7b80: 61 67 73 0a 20 20 20 20 20 20 20 20 24 70 61 74  ags.        $pat
7b90: 68 2e 63 20 72 61 69 73 65 20 24 69 0a 20 20 20  h.c raise $i.   
7ba0: 20 7d 0a 0a 20 20 20 20 69 66 20 7b 20 5b 73 65   }..    if { [se
7bb0: 74 20 77 69 6e 20 5b 57 69 64 67 65 74 3a 3a 67  t win [Widget::g
7bc0: 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 2e 24  etoption $path.$
7bd0: 69 74 65 6d 20 2d 77 69 6e 64 6f 77 5d 5d 20 21  item -window]] !
7be0: 3d 20 22 22 20 7d 20 7b 0a 20 20 20 20 20 20 20  = "" } {.       
7bf0: 20 24 70 61 74 68 2e 63 20 63 72 65 61 74 65 20   $path.c create 
7c00: 77 69 6e 64 6f 77 20 5b 65 78 70 72 20 7b 24 78  window [expr {$x
7c10: 30 2b 24 69 6e 64 65 6e 74 7d 5d 20 24 79 20 5c  0+$indent}] $y \
7c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d 77 69  .            -wi
7c30: 6e 64 6f 77 20 24 77 69 6e 20 2d 61 6e 63 68 6f  ndow $win -ancho
7c40: 72 20 77 20 2d 74 61 67 73 20 5b 6c 69 73 74 20  r w -tags [list 
7c50: 77 69 6e 20 69 3a 24 69 74 65 6d 5d 0a 20 20 20  win i:$item].   
7c60: 20 7d 20 65 6c 73 65 69 66 20 7b 20 5b 73 65 74   } elseif { [set
7c70: 20 69 6d 67 20 5b 57 69 64 67 65 74 3a 3a 67 65   img [Widget::ge
7c80: 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 2e 24 69  toption $path.$i
7c90: 74 65 6d 20 2d 69 6d 61 67 65 5d 5d 20 21 3d 20  tem -image]] != 
7ca0: 22 22 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 24  "" } {.        $
7cb0: 70 61 74 68 2e 63 20 63 72 65 61 74 65 20 69 6d  path.c create im
7cc0: 61 67 65 20 5b 65 78 70 72 20 7b 24 78 30 2b 24  age [expr {$x0+$
7cd0: 69 6e 64 65 6e 74 7d 5d 20 24 79 20 5c 0a 20 20  indent}] $y \.  
7ce0: 20 20 20 20 20 20 20 20 20 20 2d 69 6d 61 67 65            -image
7cf0: 20 24 69 6d 67 20 2d 61 6e 63 68 6f 72 20 77 20   $img -anchor w 
7d00: 2d 74 61 67 73 20 5b 6c 69 73 74 20 69 6d 67 20  -tags [list img 
7d10: 69 3a 24 69 74 65 6d 5d 0a 20 20 20 20 7d 0a 0a  i:$item].    }..
7d20: 20 20 20 20 5f 73 65 74 5f 68 65 6c 70 20 24 70      _set_help $p
7d30: 61 74 68 20 24 69 74 65 6d 0a 7d 0a 0a 0a 23 20  ath $item.}...# 
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20  ------------.#  
7d90: 43 6f 6d 6d 61 6e 64 20 4c 69 73 74 42 6f 78 3a  Command ListBox:
7da0: 3a 5f 72 65 64 72 61 77 5f 69 74 65 6d 73 0a 23  :_redraw_items.#
7db0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72  -------------.pr
7e00: 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 5f 72 65 64  oc ListBox::_red
7e10: 72 61 77 5f 69 74 65 6d 73 20 7b 20 70 61 74 68  raw_items { path
7e20: 20 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c   } {.    variabl
7e30: 65 20 24 70 61 74 68 0a 20 20 20 20 75 70 76 61  e $path.    upva
7e40: 72 20 30 20 20 24 70 61 74 68 20 64 61 74 61 0a  r 0  $path data.
7e50: 0a 20 20 20 20 73 65 74 20 63 75 72 73 6f 72 20  .    set cursor 
7e60: 5b 24 70 61 74 68 2e 63 20 63 67 65 74 20 2d 63  [$path.c cget -c
7e70: 75 72 73 6f 72 5d 0a 20 20 20 20 24 70 61 74 68  ursor].    $path
7e80: 2e 63 20 63 6f 6e 66 69 67 75 72 65 20 2d 63 75  .c configure -cu
7e90: 72 73 6f 72 20 77 61 74 63 68 0a 20 20 20 20 75  rsor watch.    u
7ea0: 70 64 61 74 65 20 69 64 6c 65 74 61 73 6b 73 20  pdate idletasks 
7eb0: 3b 20 23 20 6d 61 6b 65 20 73 75 72 65 20 77 61  ; # make sure wa
7ec0: 74 63 68 20 63 75 72 73 6f 72 20 69 73 20 72 65  tch cursor is re
7ed0: 66 6c 65 63 74 65 64 0a 20 20 20 20 73 65 74 20  flected.    set 
7ee0: 64 78 20 20 20 5b 57 69 64 67 65 74 3a 3a 67 65  dx   [Widget::ge
7ef0: 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 64  toption $path -d
7f00: 65 6c 74 61 78 5d 0a 20 20 20 20 73 65 74 20 64  eltax].    set d
7f10: 79 20 20 20 5b 57 69 64 67 65 74 3a 3a 67 65 74  y   [Widget::get
7f20: 6f 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 64 65  option $path -de
7f30: 6c 74 61 79 5d 0a 20 20 20 20 73 65 74 20 70 61  ltay].    set pa
7f40: 64 78 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f  dx [Widget::geto
7f50: 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 70 61 64  ption $path -pad
7f60: 78 5d 0a 20 20 20 20 73 65 74 20 79 30 20 20 20  x].    set y0   
7f70: 5b 65 78 70 72 20 7b 24 64 79 2f 32 7d 5d 0a 20  [expr {$dy/2}]. 
7f80: 20 20 20 73 65 74 20 78 30 20 20 20 34 0a 20 20     set x0   4.  
7f90: 20 20 73 65 74 20 78 31 20 20 20 5b 65 78 70 72    set x1   [expr
7fa0: 20 7b 24 78 30 2b 24 70 61 64 78 7d 5d 0a 20 20   {$x0+$padx}].  
7fb0: 20 20 73 65 74 20 6e 69 74 65 6d 20 30 0a 20 20    set nitem 0.  
7fc0: 20 20 73 65 74 20 64 72 61 77 6e 20 7b 7d 0a 20    set drawn {}. 
7fd0: 20 20 20 73 65 74 20 64 61 74 61 28 78 6c 69 73     set data(xlis
7fe0: 74 29 20 7b 7d 0a 20 20 20 20 69 66 20 7b 20 5b  t) {}.    if { [
7ff0: 57 69 64 67 65 74 3a 3a 63 67 65 74 20 24 70 61  Widget::cget $pa
8000: 74 68 20 2d 6d 75 6c 74 69 63 6f 6c 75 6d 6e 5d  th -multicolumn]
8010: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74   } {.        set
8020: 20 6e 72 6f 77 73 20 24 64 61 74 61 28 6e 72 6f   nrows $data(nro
8030: 77 73 29 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ws).    } else {
8040: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 72 6f  .        set nro
8050: 77 73 20 5b 6c 6c 65 6e 67 74 68 20 24 64 61 74  ws [llength $dat
8060: 61 28 69 74 65 6d 73 29 5d 0a 20 20 20 20 7d 0a  a(items)].    }.
8070: 20 20 20 20 66 6f 72 65 61 63 68 20 69 74 65 6d      foreach item
8080: 20 24 64 61 74 61 28 75 70 64 2c 64 65 6c 65 74   $data(upd,delet
8090: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 24 70 61  e) {.        $pa
80a0: 74 68 2e 63 20 64 65 6c 65 74 65 20 69 3a 24 69  th.c delete i:$i
80b0: 74 65 6d 20 6e 3a 24 69 74 65 6d 20 73 3a 24 69  tem n:$item s:$i
80c0: 74 65 6d 20 62 3a 24 69 74 65 6d 0a 20 20 20 20  tem b:$item.    
80d0: 7d 0a 20 20 20 20 23 20 50 61 73 73 20 74 68 65  }.    # Pass the
80e0: 73 65 20 74 6f 20 5f 64 72 61 77 5f 69 74 65 6d  se to _draw_item
80f0: 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 68   so it doesn't h
8100: 61 76 65 20 74 6f 20 72 65 71 75 65 73 74 20 74  ave to request t
8110: 68 65 6d 0a 20 20 20 20 23 20 66 6f 72 20 65 61  hem.    # for ea
8120: 63 68 20 69 74 65 6d 2e 0a 20 20 20 20 73 65 74  ch item..    set
8130: 20 62 67 20 20 20 20 20 20 5b 57 69 64 67 65 74   bg      [Widget
8140: 3a 3a 63 67 65 74 20 24 70 61 74 68 20 2d 62 61  ::cget $path -ba
8150: 63 6b 67 72 6f 75 6e 64 5d 0a 20 20 20 20 73 65  ckground].    se
8160: 74 20 73 65 6c 66 69 6c 6c 20 5b 57 69 64 67 65  t selfill [Widge
8170: 74 3a 3a 63 67 65 74 20 24 70 61 74 68 20 2d 73  t::cget $path -s
8180: 65 6c 65 63 74 66 69 6c 6c 5d 0a 20 20 20 20 73  electfill].    s
8190: 65 74 20 6d 75 6c 74 69 20 20 20 5b 57 69 64 67  et multi   [Widg
81a0: 65 74 3a 3a 63 67 65 74 20 24 70 61 74 68 20 2d  et::cget $path -
81b0: 6d 75 6c 74 69 63 6f 6c 75 6d 6e 5d 0a 20 20 20  multicolumn].   
81c0: 20 73 65 74 20 77 77 20 20 20 20 20 20 5b 77 69   set ww      [wi
81d0: 6e 66 6f 20 77 69 64 74 68 20 24 70 61 74 68 5d  nfo width $path]
81e0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 69 74 65  .    foreach ite
81f0: 6d 20 24 64 61 74 61 28 69 74 65 6d 73 29 20 7b  m $data(items) {
8200: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 69  .        if { [i
8210: 6e 66 6f 20 65 78 69 73 74 73 20 64 61 74 61 28  nfo exists data(
8220: 75 70 64 2c 63 72 65 61 74 65 2c 24 69 74 65 6d  upd,create,$item
8230: 29 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  )] } {.         
8240: 20 20 20 5f 64 72 61 77 5f 69 74 65 6d 20 24 70     _draw_item $p
8250: 61 74 68 20 24 69 74 65 6d 20 24 78 30 20 24 78  ath $item $x0 $x
8260: 31 20 24 79 30 20 24 62 67 20 24 73 65 6c 66 69  1 $y0 $bg $selfi
8270: 6c 6c 20 24 6d 75 6c 74 69 20 24 77 77 0a 20 20  ll $multi $ww.  
8280: 20 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20            unset 
8290: 64 61 74 61 28 75 70 64 2c 63 72 65 61 74 65 2c  data(upd,create,
82a0: 24 69 74 65 6d 29 0a 20 20 20 20 20 20 20 20 7d  $item).        }
82b0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
82c0: 20 20 20 20 73 65 74 20 69 6e 64 65 6e 74 20 5b      set indent [
82d0: 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f  Widget::getoptio
82e0: 6e 20 24 70 61 74 68 2e 24 69 74 65 6d 20 2d 69  n $path.$item -i
82f0: 6e 64 65 6e 74 5d 0a 20 20 20 20 20 20 20 20 20  ndent].         
8300: 20 20 20 24 70 61 74 68 2e 63 20 63 6f 6f 72 64     $path.c coord
8310: 73 20 6e 3a 24 69 74 65 6d 20 5b 65 78 70 72 20  s n:$item [expr 
8320: 7b 24 78 31 2b 24 69 6e 64 65 6e 74 7d 5d 20 24  {$x1+$indent}] $
8330: 79 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  y0.            $
8340: 70 61 74 68 2e 63 20 63 6f 6f 72 64 73 20 69 3a  path.c coords i:
8350: 24 69 74 65 6d 20 5b 65 78 70 72 20 7b 24 78 30  $item [expr {$x0
8360: 2b 24 69 6e 64 65 6e 74 7d 5d 20 24 79 30 0a 20  +$indent}] $y0. 
8370: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8380: 20 69 6e 63 72 20 79 30 20 24 64 79 0a 20 20 20   incr y0 $dy.   
8390: 20 20 20 20 20 69 6e 63 72 20 6e 69 74 65 6d 0a       incr nitem.
83a0: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
83b0: 64 72 61 77 6e 20 6e 3a 24 69 74 65 6d 0a 20 20  drawn n:$item.  
83c0: 20 20 20 20 20 20 69 66 20 7b 20 24 6e 69 74 65        if { $nite
83d0: 6d 20 3d 3d 20 24 6e 72 6f 77 73 20 7d 20 7b 0a  m == $nrows } {.
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
83f0: 79 30 20 20 20 20 5b 65 78 70 72 20 7b 24 64 79  y0    [expr {$dy
8400: 2f 32 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20  /2}].           
8410: 20 73 65 74 20 62 62 6f 78 20 20 5b 65 76 61 6c   set bbox  [eval
8420: 20 5b 6c 69 6e 73 65 72 74 20 24 64 72 61 77 6e   [linsert $drawn
8430: 20 30 20 24 70 61 74 68 2e 63 20 62 62 6f 78 5d   0 $path.c bbox]
8440: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ].            se
8450: 74 20 64 72 61 77 6e 20 7b 7d 0a 20 20 20 20 20  t drawn {}.     
8460: 20 20 20 20 20 20 20 73 65 74 20 78 30 20 20 20         set x0   
8470: 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65 78 20   [expr {[lindex 
8480: 24 62 62 6f 78 20 32 5d 2b 24 64 78 7d 5d 0a 20  $bbox 2]+$dx}]. 
8490: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 78             set x
84a0: 31 20 20 20 20 5b 65 78 70 72 20 7b 24 78 30 2b  1    [expr {$x0+
84b0: 24 70 61 64 78 7d 5d 0a 20 20 20 20 20 20 20 20  $padx}].        
84c0: 20 20 20 20 73 65 74 20 6e 69 74 65 6d 20 30 0a      set nitem 0.
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
84e0: 65 6e 64 20 64 61 74 61 28 78 6c 69 73 74 29 20  end data(xlist) 
84f0: 5b 6c 69 6e 64 65 78 20 24 62 62 6f 78 20 32 5d  [lindex $bbox 2]
8500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
8510: 0a 20 20 20 20 69 66 20 7b 20 24 6e 69 74 65 6d  .    if { $nitem
8520: 20 26 26 20 24 6e 69 74 65 6d 20 3c 20 24 6e 72   && $nitem < $nr
8530: 6f 77 73 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  ows } {.        
8540: 73 65 74 20 62 62 6f 78 20 20 5b 65 76 61 6c 20  set bbox  [eval 
8550: 5b 6c 69 6e 73 65 72 74 20 24 64 72 61 77 6e 20  [linsert $drawn 
8560: 30 20 24 70 61 74 68 2e 63 20 62 62 6f 78 5d 5d  0 $path.c bbox]]
8570: 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
8580: 20 64 61 74 61 28 78 6c 69 73 74 29 20 5b 6c 69   data(xlist) [li
8590: 6e 64 65 78 20 24 62 62 6f 78 20 32 5d 0a 20 20  ndex $bbox 2].  
85a0: 20 20 7d 0a 20 20 20 20 73 65 74 20 64 61 74 61    }.    set data
85b0: 28 75 70 64 2c 64 65 6c 65 74 65 29 20 7b 7d 0a  (upd,delete) {}.
85c0: 20 20 20 20 24 70 61 74 68 2e 63 20 63 6f 6e 66      $path.c conf
85d0: 69 67 75 72 65 20 2d 63 75 72 73 6f 72 20 24 63  igure -cursor $c
85e0: 75 72 73 6f 72 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d  ursor.}...# ----
85f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8630: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d  --------.#  Comm
8640: 61 6e 64 20 4c 69 73 74 42 6f 78 3a 3a 5f 72 65  and ListBox::_re
8650: 64 72 61 77 5f 73 65 6c 65 63 74 69 6f 6e 0a 23  draw_selection.#
8660: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
8670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72  -------------.pr
86b0: 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 5f 72 65 64  oc ListBox::_red
86c0: 72 61 77 5f 73 65 6c 65 63 74 69 6f 6e 20 7b 20  raw_selection { 
86d0: 70 61 74 68 20 7d 20 7b 0a 20 20 20 20 76 61 72  path } {.    var
86e0: 69 61 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20  iable $path.    
86f0: 75 70 76 61 72 20 30 20 20 24 70 61 74 68 20 64  upvar 0  $path d
8700: 61 74 61 0a 0a 20 20 20 20 73 65 74 20 73 65 6c  ata..    set sel
8710: 62 67 20 20 20 5b 57 69 64 67 65 74 3a 3a 67 65  bg   [Widget::ge
8720: 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 73  toption $path -s
8730: 65 6c 65 63 74 62 61 63 6b 67 72 6f 75 6e 64 5d  electbackground]
8740: 0a 20 20 20 20 73 65 74 20 73 65 6c 66 67 20 20  .    set selfg  
8750: 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74   [Widget::getopt
8760: 69 6f 6e 20 24 70 61 74 68 20 2d 73 65 6c 65 63  ion $path -selec
8770: 74 66 6f 72 65 67 72 6f 75 6e 64 5d 0a 20 20 20  tforeground].   
8780: 20 73 65 74 20 73 65 6c 66 69 6c 6c 20 5b 57 69   set selfill [Wi
8790: 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20  dget::getoption 
87a0: 24 70 61 74 68 20 2d 73 65 6c 65 63 74 66 69 6c  $path -selectfil
87b0: 6c 5d 0a 20 20 20 20 73 65 74 20 6d 75 6c 74 69  l].    set multi
87c0: 20 20 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f     [Widget::geto
87d0: 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 6d 75 6c  ption $path -mul
87e0: 74 69 63 6f 6c 75 6d 6e 5d 0a 20 20 20 20 66 6f  ticolumn].    fo
87f0: 72 65 61 63 68 20 69 64 20 5b 24 70 61 74 68 2e  reach id [$path.
8800: 63 20 66 69 6e 64 20 77 69 74 68 74 61 67 20 73  c find withtag s
8810: 65 6c 5d 20 7b 0a 20 20 20 20 20 20 20 20 73 65  el] {.        se
8820: 74 20 69 74 65 6d 20 5b 73 74 72 69 6e 67 20 72  t item [string r
8830: 61 6e 67 65 20 5b 6c 69 6e 64 65 78 20 5b 24 70  ange [lindex [$p
8840: 61 74 68 2e 63 20 67 65 74 74 61 67 73 20 24 69  ath.c gettags $i
8850: 64 5d 20 31 5d 20 32 20 65 6e 64 5d 0a 20 20 20  d] 1] 2 end].   
8860: 20 20 20 20 20 24 70 61 74 68 2e 63 20 69 74 65       $path.c ite
8870: 6d 63 6f 6e 66 69 67 75 72 65 20 22 6e 3a 24 69  mconfigure "n:$i
8880: 74 65 6d 22 20 5c 0a 20 20 20 20 20 20 20 20 20  tem" \.         
8890: 20 20 20 2d 66 69 6c 6c 20 5b 5f 67 65 74 6f 70     -fill [_getop
88a0: 74 69 6f 6e 20 24 70 61 74 68 20 24 69 74 65 6d  tion $path $item
88b0: 20 2d 66 6f 72 65 67 72 6f 75 6e 64 5d 0a 20 20   -foreground].  
88c0: 20 20 7d 0a 20 20 20 20 24 70 61 74 68 2e 63 20    }.    $path.c 
88d0: 64 65 6c 65 74 65 20 73 65 6c 0a 20 20 20 20 69  delete sel.    i
88e0: 66 20 7b 24 73 65 6c 66 69 6c 6c 20 26 26 20 21  f {$selfill && !
88f0: 24 6d 75 6c 74 69 7d 20 7b 0a 09 23 20 63 61 63  $multi} {..# cac
8900: 68 65 20 77 69 6e 64 6f 77 20 77 69 64 74 68 20  he window width 
8910: 66 6f 72 20 75 73 65 20 62 65 6c 6f 77 0a 09 73  for use below..s
8920: 65 74 20 77 69 64 74 68 20 5b 77 69 6e 66 6f 20  et width [winfo 
8930: 77 69 64 74 68 20 24 70 61 74 68 5d 0a 20 20 20  width $path].   
8940: 20 7d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 69   }.    foreach i
8950: 74 65 6d 20 24 64 61 74 61 28 73 65 6c 69 74 65  tem $data(selite
8960: 6d 73 29 20 7b 0a 20 20 20 20 20 20 20 20 73 65  ms) {.        se
8970: 74 20 62 62 6f 78 20 5b 24 70 61 74 68 2e 63 20  t bbox [$path.c 
8980: 62 62 6f 78 20 22 6e 3a 24 69 74 65 6d 22 5d 0a  bbox "n:$item"].
8990: 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 6c 6c          if { [ll
89a0: 65 6e 67 74 68 20 24 62 62 6f 78 5d 20 7d 20 7b  ength $bbox] } {
89b0: 0a 09 20 20 20 20 69 66 20 7b 20 24 73 65 6c 66  ..    if { $self
89c0: 69 6c 6c 20 26 26 20 21 24 6d 75 6c 74 69 20 7d  ill && !$multi }
89d0: 20 7b 0a 09 09 23 20 57 69 74 68 20 2d 73 65 6c   {...# With -sel
89e0: 65 63 74 66 69 6c 6c 2c 20 6d 61 6b 65 20 62 6f  ectfill, make bo
89f0: 78 20 6f 63 63 75 70 79 20 66 75 6c 6c 20 77 69  x occupy full wi
8a00: 64 74 68 20 6f 66 20 77 69 64 67 65 74 0a 09 09  dth of widget...
8a10: 73 65 74 20 62 62 6f 78 20 5b 6c 69 73 74 20 30  set bbox [list 0
8a20: 20 5b 6c 69 6e 64 65 78 20 24 62 62 6f 78 20 31   [lindex $bbox 1
8a30: 5d 20 24 77 69 64 74 68 20 5b 6c 69 6e 64 65 78  ] $width [lindex
8a40: 20 24 62 62 6f 78 20 33 5d 5d 0a 09 20 20 20 20   $bbox 3]]..    
8a50: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  }.            se
8a60: 74 20 74 61 67 73 20 5b 6c 69 73 74 20 73 65 6c  t tags [list sel
8a70: 20 73 3a 24 69 74 65 6d 20 63 6c 69 63 6b 5d 0a   s:$item click].
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
8a90: 69 64 20 5b 24 70 61 74 68 2e 63 20 63 72 65 61  id [$path.c crea
8aa0: 74 65 20 72 65 63 74 61 6e 67 6c 65 20 24 62 62  te rectangle $bb
8ab0: 6f 78 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  ox \.           
8ac0: 20 20 20 20 20 2d 66 69 6c 6c 20 24 73 65 6c 62       -fill $selb
8ad0: 67 20 2d 6f 75 74 6c 69 6e 65 20 24 73 65 6c 62  g -outline $selb
8ae0: 67 20 2d 74 61 67 73 20 24 74 61 67 73 5d 0a 20  g -tags $tags]. 
8af0: 20 20 20 20 20 20 20 20 20 20 20 24 70 61 74 68             $path
8b00: 2e 63 20 69 74 65 6d 63 6f 6e 66 69 67 75 72 65  .c itemconfigure
8b10: 20 22 6e 3a 24 69 74 65 6d 22 20 2d 66 69 6c 6c   "n:$item" -fill
8b20: 20 24 73 65 6c 66 67 0a 20 20 20 20 20 20 20 20   $selfg.        
8b30: 20 20 20 20 24 70 61 74 68 2e 63 20 6c 6f 77 65      $path.c lowe
8b40: 72 20 24 69 64 0a 20 20 20 20 20 20 20 20 20 20  r $id.          
8b50: 20 20 24 70 61 74 68 2e 63 20 6c 6f 77 65 72 20    $path.c lower 
8b60: 62 3a 24 69 74 65 6d 0a 20 20 20 20 20 20 20 20  b:$item.        
8b70: 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 23 20 2d 2d  }.    }.}...# --
8b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f  ----------.#  Co
8bd0: 6d 6d 61 6e 64 20 4c 69 73 74 42 6f 78 3a 3a 5f  mmand ListBox::_
8be0: 72 65 64 72 61 77 5f 6c 69 73 74 62 6f 78 0a 23  redraw_listbox.#
8bf0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
8c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72  -------------.pr
8c40: 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 5f 72 65 64  oc ListBox::_red
8c50: 72 61 77 5f 6c 69 73 74 62 6f 78 20 7b 20 70 61  raw_listbox { pa
8c60: 74 68 20 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  th } {.    varia
8c70: 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75 70  ble $path.    up
8c80: 76 61 72 20 30 20 20 24 70 61 74 68 20 64 61 74  var 0  $path dat
8c90: 61 0a 0a 20 20 20 20 69 66 20 7b 20 5b 57 69 64  a..    if { [Wid
8ca0: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
8cb0: 70 61 74 68 20 2d 72 65 64 72 61 77 5d 20 7d 20  path -redraw] } 
8cc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20 24  {.        if { $
8cd0: 64 61 74 61 28 75 70 64 2c 6c 65 76 65 6c 29 20  data(upd,level) 
8ce0: 3d 3d 20 32 20 7d 20 7b 0a 20 20 20 20 20 20 20  == 2 } {.       
8cf0: 20 20 20 20 20 5f 72 65 64 72 61 77 5f 69 74 65       _redraw_ite
8d00: 6d 73 20 24 70 61 74 68 0a 20 20 20 20 20 20 20  ms $path.       
8d10: 20 7d 0a 20 20 20 20 20 20 20 20 5f 72 65 64 72   }.        _redr
8d20: 61 77 5f 73 65 6c 65 63 74 69 6f 6e 20 24 70 61  aw_selection $pa
8d30: 74 68 0a 20 20 20 20 20 20 20 20 5f 75 70 64 61  th.        _upda
8d40: 74 65 5f 73 63 72 6f 6c 6c 72 65 67 69 6f 6e 20  te_scrollregion 
8d50: 24 70 61 74 68 0a 20 20 20 20 20 20 20 20 69 66  $path.        if
8d60: 20 7b 5b 57 69 64 67 65 74 3a 3a 63 67 65 74 20   {[Widget::cget 
8d70: 24 70 61 74 68 20 2d 73 65 6c 65 63 74 66 69 6c  $path -selectfil
8d80: 6c 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  l]} {.          
8d90: 20 20 5f 75 70 64 61 74 65 5f 73 65 6c 65 63 74    _update_select
8da0: 5f 66 69 6c 6c 20 24 70 61 74 68 0a 20 20 20 20  _fill $path.    
8db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 65      }.        se
8dc0: 74 20 64 61 74 61 28 75 70 64 2c 6c 65 76 65 6c  t data(upd,level
8dd0: 29 20 20 20 30 0a 20 20 20 20 20 20 20 20 73 65  )   0.        se
8de0: 74 20 64 61 74 61 28 75 70 64 2c 61 66 74 65 72  t data(upd,after
8df0: 69 64 29 20 22 22 0a 20 20 20 20 7d 0a 7d 0a 0a  id) "".    }.}..
8e00: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8e50: 23 20 20 43 6f 6d 6d 61 6e 64 20 4c 69 73 74 42  #  Command ListB
8e60: 6f 78 3a 3a 5f 72 65 64 72 61 77 5f 69 64 6c 65  ox::_redraw_idle
8e70: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8ec0: 70 72 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 5f 72  proc ListBox::_r
8ed0: 65 64 72 61 77 5f 69 64 6c 65 20 7b 20 70 61 74  edraw_idle { pat
8ee0: 68 20 6c 65 76 65 6c 20 7d 20 7b 0a 20 20 20 20  h level } {.    
8ef0: 76 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20  variable $path. 
8f00: 20 20 20 75 70 76 61 72 20 30 20 20 24 70 61 74     upvar 0  $pat
8f10: 68 20 64 61 74 61 0a 0a 20 20 20 20 69 66 20 7b  h data..    if {
8f20: 20 24 64 61 74 61 28 6e 72 6f 77 73 29 20 21 3d   $data(nrows) !=
8f30: 20 2d 31 20 7d 20 7b 0a 20 20 20 20 20 20 20 20   -1 } {.        
8f40: 23 20 77 69 64 67 65 74 20 69 73 20 72 65 61 6c  # widget is real
8f50: 69 7a 65 64 0a 20 20 20 20 20 20 20 20 69 66 20  ized.        if 
8f60: 7b 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70  { [Widget::getop
8f70: 74 69 6f 6e 20 24 70 61 74 68 20 2d 72 65 64 72  tion $path -redr
8f80: 61 77 5d 20 26 26 20 24 64 61 74 61 28 75 70 64  aw] && $data(upd
8f90: 2c 61 66 74 65 72 69 64 29 20 3d 3d 20 22 22 20  ,afterid) == "" 
8fa0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
8fb0: 73 65 74 20 64 61 74 61 28 75 70 64 2c 61 66 74  set data(upd,aft
8fc0: 65 72 69 64 29 20 5c 0a 09 09 5b 61 66 74 65 72  erid) \...[after
8fd0: 20 69 64 6c 65 20 5b 6c 69 73 74 20 4c 69 73 74   idle [list List
8fe0: 42 6f 78 3a 3a 5f 72 65 64 72 61 77 5f 6c 69 73  Box::_redraw_lis
8ff0: 74 62 6f 78 20 24 70 61 74 68 5d 5d 0a 20 20 20  tbox $path]].   
9000: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9010: 20 69 66 20 7b 20 24 6c 65 76 65 6c 20 3e 20 24   if { $level > $
9020: 64 61 74 61 28 75 70 64 2c 6c 65 76 65 6c 29 20  data(upd,level) 
9030: 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  } {.        set 
9040: 64 61 74 61 28 75 70 64 2c 6c 65 76 65 6c 29 20  data(upd,level) 
9050: 24 6c 65 76 65 6c 0a 20 20 20 20 7d 0a 20 20 20  $level.    }.   
9060: 20 72 65 74 75 72 6e 20 22 22 0a 7d 0a 0a 0a 23   return "".}...#
9070: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
9080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
90c0: 20 43 6f 6d 6d 61 6e 64 20 4c 69 73 74 42 6f 78   Command ListBox
90d0: 3a 3a 5f 72 65 73 69 7a 65 0a 23 20 2d 2d 2d 2d  ::_resize.# ----
90e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 4c 69  --------.proc Li
9130: 73 74 42 6f 78 3a 3a 5f 72 65 73 69 7a 65 20 7b  stBox::_resize {
9140: 20 70 61 74 68 20 7d 20 7b 0a 20 20 20 20 76 61   path } {.    va
9150: 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20 20 20  riable $path.   
9160: 20 75 70 76 61 72 20 30 20 20 24 70 61 74 68 20   upvar 0  $path 
9170: 64 61 74 61 0a 0a 20 20 20 20 69 66 20 7b 20 5b  data..    if { [
9180: 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f  Widget::getoptio
9190: 6e 20 24 70 61 74 68 20 2d 6d 75 6c 74 69 63 6f  n $path -multico
91a0: 6c 75 6d 6e 5d 20 7d 20 7b 0a 20 20 20 20 20 20  lumn] } {.      
91b0: 20 20 73 65 74 20 62 64 20 20 20 20 5b 65 78 70    set bd    [exp
91c0: 72 20 7b 5b 24 70 61 74 68 2e 63 20 63 67 65 74  r {[$path.c cget
91d0: 20 2d 62 6f 72 64 65 72 77 69 64 74 68 5d 2b 5b   -borderwidth]+[
91e0: 24 70 61 74 68 2e 63 20 63 67 65 74 20 2d 68 69  $path.c cget -hi
91f0: 67 68 6c 69 67 68 74 74 68 69 63 6b 6e 65 73 73  ghlightthickness
9200: 5d 7d 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ]}].        set 
9210: 68 20 20 20 20 20 5b 65 78 70 72 20 7b 5b 77 69  h     [expr {[wi
9220: 6e 66 6f 20 68 65 69 67 68 74 20 24 70 61 74 68  nfo height $path
9230: 5d 20 2d 20 32 2a 24 62 64 7d 5d 0a 20 20 20 20  ] - 2*$bd}].    
9240: 20 20 20 20 73 65 74 20 6e 72 6f 77 73 20 5b 65      set nrows [e
9250: 78 70 72 20 7b 24 68 2f 5b 24 70 61 74 68 2e 63  xpr {$h/[$path.c
9260: 20 63 67 65 74 20 2d 79 73 63 72 6f 6c 6c 69 6e   cget -yscrollin
9270: 63 72 65 6d 65 6e 74 5d 7d 5d 0a 20 20 20 20 20  crement]}].     
9280: 20 20 20 69 66 20 7b 20 24 6e 72 6f 77 73 20 3d     if { $nrows =
9290: 3d 20 30 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  = 0 } {.        
92a0: 20 20 20 20 73 65 74 20 6e 72 6f 77 73 20 31 0a      set nrows 1.
92b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
92c0: 20 20 69 66 20 7b 20 24 6e 72 6f 77 73 20 21 3d    if { $nrows !=
92d0: 20 24 64 61 74 61 28 6e 72 6f 77 73 29 20 7d 20   $data(nrows) } 
92e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
92f0: 74 20 64 61 74 61 28 6e 72 6f 77 73 29 20 24 6e  t data(nrows) $n
9300: 72 6f 77 73 0a 20 20 20 20 20 20 20 20 20 20 20  rows.           
9310: 20 5f 72 65 64 72 61 77 5f 69 64 6c 65 20 24 70   _redraw_idle $p
9320: 61 74 68 20 32 0a 20 20 20 20 20 20 20 20 7d 20  ath 2.        } 
9330: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
9340: 20 20 20 5f 75 70 64 61 74 65 5f 73 63 72 6f 6c     _update_scrol
9350: 6c 72 65 67 69 6f 6e 20 24 70 61 74 68 0a 20 20  lregion $path.  
9360: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
9370: 73 65 69 66 20 7b 20 24 64 61 74 61 28 6e 72 6f  seif { $data(nro
9380: 77 73 29 20 3d 3d 20 2d 31 20 7d 20 7b 0a 20 20  ws) == -1 } {.  
9390: 20 20 20 20 20 20 23 20 66 69 72 73 74 20 43 6f        # first Co
93a0: 6e 66 69 67 75 72 65 20 65 76 65 6e 74 0a 20 20  nfigure event.  
93b0: 20 20 20 20 20 20 73 65 74 20 64 61 74 61 28 6e        set data(n
93c0: 72 6f 77 73 29 20 30 0a 20 20 20 20 20 20 20 20  rows) 0.        
93d0: 4c 69 73 74 42 6f 78 3a 3a 5f 72 65 64 72 61 77  ListBox::_redraw
93e0: 5f 6c 69 73 74 62 6f 78 20 24 70 61 74 68 0a 20  _listbox $path. 
93f0: 20 20 20 20 20 20 20 69 66 20 7b 5b 57 69 64 67         if {[Widg
9400: 65 74 3a 3a 63 67 65 74 20 24 70 61 74 68 20 2d  et::cget $path -
9410: 73 65 6c 65 63 74 66 69 6c 6c 5d 7d 20 7b 0a 20  selectfill]} {. 
9420: 20 20 20 20 20 20 20 20 20 20 20 5f 75 70 64 61             _upda
9430: 74 65 5f 73 65 6c 65 63 74 5f 66 69 6c 6c 20 24  te_select_fill $
9440: 70 61 74 68 0a 20 20 20 20 20 20 20 20 7d 0a 20  path.        }. 
9450: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
9460: 20 20 20 20 69 66 20 7b 5b 57 69 64 67 65 74 3a      if {[Widget:
9470: 3a 63 67 65 74 20 24 70 61 74 68 20 2d 73 65 6c  :cget $path -sel
9480: 65 63 74 66 69 6c 6c 5d 7d 20 7b 0a 20 20 20 20  ectfill]} {.    
9490: 20 20 20 20 20 20 20 20 5f 75 70 64 61 74 65 5f          _update_
94a0: 73 65 6c 65 63 74 5f 66 69 6c 6c 20 24 70 61 74  select_fill $pat
94b0: 68 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  h.        }..   
94c0: 20 20 20 20 20 5f 75 70 64 61 74 65 5f 73 63 72       _update_scr
94d0: 6f 6c 6c 72 65 67 69 6f 6e 20 24 70 61 74 68 0a  ollregion $path.
94e0: 20 20 20 20 7d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d      }.}...# ----
94f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9530: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d  --------.#  Comm
9540: 61 6e 64 20 4c 69 73 74 42 6f 78 3a 3a 5f 69 6e  and ListBox::_in
9550: 69 74 5f 64 72 61 67 5f 63 6d 64 0a 23 20 2d 2d  it_drag_cmd.# --
9560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
95a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20  ----------.proc 
95b0: 4c 69 73 74 42 6f 78 3a 3a 5f 69 6e 69 74 5f 64  ListBox::_init_d
95c0: 72 61 67 5f 63 6d 64 20 7b 20 70 61 74 68 20 58  rag_cmd { path X
95d0: 20 59 20 74 6f 70 20 7d 20 7b 0a 20 20 20 20 73   Y top } {.    s
95e0: 65 74 20 70 61 74 68 20 5b 77 69 6e 66 6f 20 70  et path [winfo p
95f0: 61 72 65 6e 74 20 24 70 61 74 68 5d 0a 20 20 20  arent $path].   
9600: 20 73 65 74 20 6c 74 61 67 73 20 5b 24 70 61 74   set ltags [$pat
9610: 68 2e 63 20 67 65 74 74 61 67 73 20 63 75 72 72  h.c gettags curr
9620: 65 6e 74 5d 0a 20 20 20 20 73 65 74 20 69 74 65  ent].    set ite
9630: 6d 20 20 5b 6c 69 6e 64 65 78 20 24 6c 74 61 67  m  [lindex $ltag
9640: 73 20 30 5d 0a 20 20 20 20 69 66 20 7b 20 5b 73  s 0].    if { [s
9650: 74 72 69 6e 67 20 65 71 75 61 6c 20 24 69 74 65  tring equal $ite
9660: 6d 20 22 69 74 65 6d 22 5d 20 7c 7c 0a 20 20 20  m "item"] ||.   
9670: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 65 71        [string eq
9680: 75 61 6c 20 24 69 74 65 6d 20 22 69 6d 67 22 5d  ual $item "img"]
9690: 20 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 5b 73    ||.         [s
96a0: 74 72 69 6e 67 20 65 71 75 61 6c 20 24 69 74 65  tring equal $ite
96b0: 6d 20 22 77 69 6e 22 5d 20 7d 20 7b 0a 20 20 20  m "win"] } {.   
96c0: 20 20 20 20 20 73 65 74 20 69 74 65 6d 20 5b 73       set item [s
96d0: 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 6c 69 6e  tring range [lin
96e0: 64 65 78 20 24 6c 74 61 67 73 20 31 5d 20 32 20  dex $ltags 1] 2 
96f0: 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 69 66 20  end].        if 
9700: 7b 5b 6c 6c 65 6e 67 74 68 20 5b 73 65 74 20 63  {[llength [set c
9710: 6d 64 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f  md [Widget::geto
9720: 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 64 72 61  ption $path -dra
9730: 67 69 6e 69 74 63 6d 64 5d 5d 5d 7d 20 7b 0a 20  ginitcmd]]]} {. 
9740: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9750: 6e 20 5b 75 70 6c 65 76 65 6c 20 5c 23 30 20 24  n [uplevel \#0 $
9760: 63 6d 64 20 5b 6c 69 73 74 20 24 70 61 74 68 20  cmd [list $path 
9770: 24 69 74 65 6d 20 24 74 6f 70 5d 5d 0a 20 20 20  $item $top]].   
9780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
9790: 66 20 7b 20 5b 73 65 74 20 74 79 70 65 20 5b 57  f { [set type [W
97a0: 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e  idget::getoption
97b0: 20 24 70 61 74 68 20 2d 64 72 61 67 74 79 70 65   $path -dragtype
97c0: 5d 5d 20 3d 3d 20 22 22 20 7d 20 7b 0a 20 20 20  ]] == "" } {.   
97d0: 20 20 20 20 20 20 20 20 20 73 65 74 20 74 79 70           set typ
97e0: 65 20 22 4c 49 53 54 42 4f 58 5f 49 54 45 4d 22  e "LISTBOX_ITEM"
97f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9800: 20 20 20 69 66 20 7b 20 5b 73 65 74 20 69 6d 67     if { [set img
9810: 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74   [Widget::getopt
9820: 69 6f 6e 20 24 70 61 74 68 2e 24 69 74 65 6d 20  ion $path.$item 
9830: 2d 69 6d 61 67 65 5d 5d 20 21 3d 20 22 22 20 7d  -image]] != "" }
9840: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   {.            p
9850: 61 63 6b 20 5b 6c 61 62 65 6c 20 24 74 6f 70 2e  ack [label $top.
9860: 6c 20 2d 69 6d 61 67 65 20 24 69 6d 67 20 2d 70  l -image $img -p
9870: 61 64 78 20 30 20 2d 70 61 64 79 20 30 5d 0a 20  adx 0 -pady 0]. 
9880: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9890: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 74   return [list $t
98a0: 79 70 65 20 7b 63 6f 70 79 20 6d 6f 76 65 20 6c  ype {copy move l
98b0: 69 6e 6b 7d 20 24 69 74 65 6d 5d 0a 20 20 20 20  ink} $item].    
98c0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 7b 7d 0a  }.    return {}.
98d0: 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...# ----------
98e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9920: 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 4c 69  --.#  Command Li
9930: 73 74 42 6f 78 3a 3a 5f 64 72 6f 70 5f 63 6d 64  stBox::_drop_cmd
9940: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
9950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
9990: 70 72 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 5f 64  proc ListBox::_d
99a0: 72 6f 70 5f 63 6d 64 20 7b 20 70 61 74 68 20 73  rop_cmd { path s
99b0: 6f 75 72 63 65 20 58 20 59 20 6f 70 20 74 79 70  ource X Y op typ
99c0: 65 20 64 6e 64 64 61 74 61 20 7d 20 7b 0a 20 20  e dnddata } {.  
99d0: 20 20 73 65 74 20 70 61 74 68 20 5b 77 69 6e 66    set path [winf
99e0: 6f 20 70 61 72 65 6e 74 20 24 70 61 74 68 5d 0a  o parent $path].
99f0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 24 70 61      variable $pa
9a00: 74 68 0a 20 20 20 20 75 70 76 61 72 20 30 20 20  th.    upvar 0  
9a10: 24 70 61 74 68 20 64 61 74 61 0a 0a 20 20 20 20  $path data..    
9a20: 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 6c 65 6e  if { [string len
9a30: 67 74 68 20 24 64 61 74 61 28 64 6e 64 2c 61 66  gth $data(dnd,af
9a40: 74 65 72 69 64 29 5d 20 7d 20 7b 0a 20 20 20 20  terid)] } {.    
9a50: 20 20 20 20 61 66 74 65 72 20 63 61 6e 63 65 6c      after cancel
9a60: 20 24 64 61 74 61 28 64 6e 64 2c 61 66 74 65 72   $data(dnd,after
9a70: 69 64 29 0a 20 20 20 20 20 20 20 20 73 65 74 20  id).        set 
9a80: 64 61 74 61 28 64 6e 64 2c 61 66 74 65 72 69 64  data(dnd,afterid
9a90: 29 20 22 22 0a 20 20 20 20 7d 0a 20 20 20 20 24  ) "".    }.    $
9aa0: 70 61 74 68 2e 63 20 64 65 6c 65 74 65 20 64 72  path.c delete dr
9ab0: 6f 70 0a 20 20 20 20 73 65 74 20 64 61 74 61 28  op.    set data(
9ac0: 64 6e 64 2c 73 63 72 6f 6c 6c 29 20 22 22 0a 20  dnd,scroll) "". 
9ad0: 20 20 20 69 66 20 7b 20 5b 6c 6c 65 6e 67 74 68     if { [llength
9ae0: 20 24 64 61 74 61 28 64 6e 64 2c 69 74 65 6d 29   $data(dnd,item)
9af0: 5d 20 7c 7c 20 21 5b 6c 6c 65 6e 67 74 68 20 24  ] || ![llength $
9b00: 64 61 74 61 28 69 74 65 6d 73 29 5d 20 7d 20 7b  data(items)] } {
9b10: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c  .        if {[ll
9b20: 65 6e 67 74 68 20 5b 73 65 74 20 63 6d 64 20 5b  ength [set cmd [
9b30: 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f  Widget::getoptio
9b40: 6e 20 24 70 61 74 68 20 2d 64 72 6f 70 63 6d 64  n $path -dropcmd
9b50: 5d 5d 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ]]]} {.         
9b60: 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76     return [uplev
9b70: 65 6c 20 5c 23 30 20 24 63 6d 64 20 5b 6c 69 73  el \#0 $cmd [lis
9b80: 74 20 24 70 61 74 68 20 24 73 6f 75 72 63 65 20  t $path $source 
9b90: 24 64 61 74 61 28 64 6e 64 2c 69 74 65 6d 29 20  $data(dnd,item) 
9ba0: 24 6f 70 20 24 74 79 70 65 20 24 64 6e 64 64 61  $op $type $dndda
9bb0: 74 61 5d 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20  ta]].        }. 
9bc0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
9bd0: 30 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d  0.}...# --------
9be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c20: 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20  ----.#  Command 
9c30: 4c 69 73 74 42 6f 78 3a 3a 5f 6f 76 65 72 5f 63  ListBox::_over_c
9c40: 6d 64 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  md.# -----------
9c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c90: 2d 0a 70 72 6f 63 20 4c 69 73 74 42 6f 78 3a 3a  -.proc ListBox::
9ca0: 5f 6f 76 65 72 5f 63 6d 64 20 7b 20 70 61 74 68  _over_cmd { path
9cb0: 20 73 6f 75 72 63 65 20 65 76 65 6e 74 20 58 20   source event X 
9cc0: 59 20 6f 70 20 74 79 70 65 20 64 6e 64 64 61 74  Y op type dnddat
9cd0: 61 20 7d 20 7b 0a 20 20 20 20 73 65 74 20 70 61  a } {.    set pa
9ce0: 74 68 20 5b 77 69 6e 66 6f 20 70 61 72 65 6e 74  th [winfo parent
9cf0: 20 24 70 61 74 68 5d 0a 20 20 20 20 76 61 72 69   $path].    vari
9d00: 61 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75  able $path.    u
9d10: 70 76 61 72 20 30 20 20 24 70 61 74 68 20 64 61  pvar 0  $path da
9d20: 74 61 0a 0a 20 20 20 20 69 66 20 7b 20 5b 73 74  ta..    if { [st
9d30: 72 69 6e 67 20 65 71 75 61 6c 20 24 65 76 65 6e  ring equal $even
9d40: 74 20 22 6c 65 61 76 65 22 5d 20 7d 20 7b 0a 20  t "leave"] } {. 
9d50: 20 20 20 20 20 20 20 23 20 77 65 20 6c 65 61 76         # we leav
9d60: 65 20 74 68 65 20 77 69 6e 64 6f 77 20 6c 69 73  e the window lis
9d70: 74 62 6f 78 0a 20 20 20 20 20 20 20 20 24 70 61  tbox.        $pa
9d80: 74 68 2e 63 20 64 65 6c 65 74 65 20 64 72 6f 70  th.c delete drop
9d90: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 73  .        if { [s
9da0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61  tring length $da
9db0: 74 61 28 64 6e 64 2c 61 66 74 65 72 69 64 29 5d  ta(dnd,afterid)]
9dc0: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   } {.           
9dd0: 20 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 64   after cancel $d
9de0: 61 74 61 28 64 6e 64 2c 61 66 74 65 72 69 64 29  ata(dnd,afterid)
9df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
9e00: 20 64 61 74 61 28 64 6e 64 2c 61 66 74 65 72 69   data(dnd,afteri
9e10: 64 29 20 22 22 0a 20 20 20 20 20 20 20 20 7d 0a  d) "".        }.
9e20: 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
9e30: 28 64 6e 64 2c 73 63 72 6f 6c 6c 29 20 22 22 0a  (dnd,scroll) "".
9e40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
9e50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b  .    }..    if {
9e60: 20 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24   [string equal $
9e70: 65 76 65 6e 74 20 22 65 6e 74 65 72 22 5d 20 7d  event "enter"] }
9e80: 20 7b 0a 20 20 20 20 20 20 20 20 23 20 77 65 20   {.        # we 
9e90: 65 6e 74 65 72 20 74 68 65 20 77 69 6e 64 6f 77  enter the window
9ea0: 20 6c 69 73 74 62 6f 78 20 2d 20 64 6e 64 20 64   listbox - dnd d
9eb0: 61 74 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ata initializati
9ec0: 6f 6e 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  on.        set m
9ed0: 6f 64 65 20 5b 57 69 64 67 65 74 3a 3a 67 65 74  ode [Widget::get
9ee0: 6f 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 64 72  option $path -dr
9ef0: 6f 70 6f 76 65 72 6d 6f 64 65 5d 0a 20 20 20 20  opovermode].    
9f00: 20 20 20 20 73 65 74 20 64 61 74 61 28 64 6e 64      set data(dnd
9f10: 2c 6d 6f 64 65 29 20 30 0a 20 20 20 20 20 20 20  ,mode) 0.       
9f20: 20 66 6f 72 65 61 63 68 20 63 20 7b 77 20 70 20   foreach c {w p 
9f30: 69 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  i} {.           
9f40: 20 73 65 74 20 64 61 74 61 28 64 6e 64 2c 6d 6f   set data(dnd,mo
9f50: 64 65 29 20 5b 65 78 70 72 20 7b 28 24 64 61 74  de) [expr {($dat
9f60: 61 28 64 6e 64 2c 6d 6f 64 65 29 20 3c 3c 20 31  a(dnd,mode) << 1
9f70: 29 20 7c 20 28 5b 73 74 72 69 6e 67 20 66 69 72  ) | ([string fir
9f80: 73 74 20 24 63 20 24 6d 6f 64 65 5d 20 21 3d 20  st $c $mode] != 
9f90: 2d 31 29 7d 5d 0a 20 20 20 20 20 20 20 20 7d 0a  -1)}].        }.
9fa0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 78      }..    set x
9fb0: 20 5b 65 78 70 72 20 7b 24 58 2d 5b 77 69 6e 66   [expr {$X-[winf
9fc0: 6f 20 72 6f 6f 74 78 20 24 70 61 74 68 5d 7d 5d  o rootx $path]}]
9fd0: 0a 20 20 20 20 73 65 74 20 79 20 5b 65 78 70 72  .    set y [expr
9fe0: 20 7b 24 59 2d 5b 77 69 6e 66 6f 20 72 6f 6f 74   {$Y-[winfo root
9ff0: 79 20 24 70 61 74 68 5d 7d 5d 0a 20 20 20 20 24  y $path]}].    $
a000: 70 61 74 68 2e 63 20 64 65 6c 65 74 65 20 64 72  path.c delete dr
a010: 6f 70 0a 20 20 20 20 73 65 74 20 64 61 74 61 28  op.    set data(
a020: 64 6e 64 2c 69 74 65 6d 29 20 22 22 0a 0a 20 20  dnd,item) ""..  
a030: 20 20 23 20 74 65 73 74 20 66 6f 72 20 61 75 74    # test for aut
a040: 6f 2d 73 63 72 6f 6c 6c 20 75 6e 6c 65 73 73 20  o-scroll unless 
a050: 6d 6f 64 65 20 69 73 20 77 69 64 67 65 74 20 6f  mode is widget o
a060: 6e 6c 79 0a 20 20 20 20 69 66 20 7b 20 24 64 61  nly.    if { $da
a070: 74 61 28 64 6e 64 2c 6d 6f 64 65 29 20 21 3d 20  ta(dnd,mode) != 
a080: 34 20 26 26 20 5b 5f 61 75 74 6f 5f 73 63 72 6f  4 && [_auto_scro
a090: 6c 6c 20 24 70 61 74 68 20 24 78 20 24 79 5d 20  ll $path $x $y] 
a0a0: 21 3d 20 22 22 20 7d 20 7b 0a 20 20 20 20 20 20  != "" } {.      
a0b0: 20 20 72 65 74 75 72 6e 20 32 0a 20 20 20 20 7d    return 2.    }
a0c0: 0a 0a 20 20 20 20 69 66 20 7b 20 24 64 61 74 61  ..    if { $data
a0d0: 28 64 6e 64 2c 6d 6f 64 65 29 20 26 20 34 20 7d  (dnd,mode) & 4 }
a0e0: 20 7b 0a 20 20 20 20 20 20 20 20 23 20 64 72 6f   {.        # dro
a0f0: 70 6f 76 65 72 6d 6f 64 65 20 69 6e 63 6c 75 64  povermode includ
a100: 65 73 20 77 69 64 67 65 74 0a 20 20 20 20 20 20  es widget.      
a110: 20 20 73 65 74 20 74 61 72 67 65 74 20 5b 6c 69    set target [li
a120: 73 74 20 77 69 64 67 65 74 5d 0a 20 20 20 20 20  st widget].     
a130: 20 20 20 73 65 74 20 76 6d 6f 64 65 20 20 34 0a     set vmode  4.
a140: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
a150: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 20       set target 
a160: 5b 6c 69 73 74 20 22 22 5d 0a 20 20 20 20 20 20  [list ""].      
a170: 20 20 73 65 74 20 76 6d 6f 64 65 20 20 30 0a 20    set vmode  0. 
a180: 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 20 28 24     }.    if { ($
a190: 64 61 74 61 28 64 6e 64 2c 6d 6f 64 65 29 20 26  data(dnd,mode) &
a1a0: 20 32 29 20 26 26 20 21 5b 6c 6c 65 6e 67 74 68   2) && ![llength
a1b0: 20 24 64 61 74 61 28 69 74 65 6d 73 29 5d 20 7d   $data(items)] }
a1c0: 20 7b 0a 20 20 20 20 20 20 20 20 23 20 64 72 6f   {.        # dro
a1d0: 70 6f 76 65 72 6d 6f 64 65 20 69 6e 63 6c 75 64  povermode includ
a1e0: 65 73 20 70 6f 73 69 74 69 6f 6e 20 61 6e 64 20  es position and 
a1f0: 6c 69 73 74 62 6f 78 20 69 73 20 65 6d 70 74 79  listbox is empty
a200: 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
a210: 20 74 61 72 67 65 74 20 22 22 20 30 0a 20 20 20   target "" 0.   
a220: 20 20 20 20 20 73 65 74 20 76 6d 6f 64 65 20 5b       set vmode [
a230: 65 78 70 72 20 7b 24 76 6d 6f 64 65 20 7c 20 32  expr {$vmode | 2
a240: 7d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  }].    }..    if
a250: 20 7b 20 28 24 64 61 74 61 28 64 6e 64 2c 6d 6f   { ($data(dnd,mo
a260: 64 65 29 20 26 20 33 29 20 26 26 20 5b 6c 6c 65  de) & 3) && [lle
a270: 6e 67 74 68 20 24 64 61 74 61 28 69 74 65 6d 73  ngth $data(items
a280: 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 20  )]} {.        # 
a290: 64 72 6f 70 6f 76 65 72 6d 6f 64 65 20 69 6e 63  dropovermode inc
a2a0: 6c 75 64 65 73 20 69 74 65 6d 20 6f 72 20 70 6f  ludes item or po
a2b0: 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 23  sition.        #
a2c0: 20 77 65 20 65 78 74 72 61 63 74 20 74 68 65 20   we extract the 
a2d0: 62 6f 78 20 28 78 69 2c 79 69 2c 78 73 2c 79 73  box (xi,yi,xs,ys
a2e0: 29 20 77 68 65 72 65 20 77 65 20 63 61 6e 20 66  ) where we can f
a2f0: 69 6e 64 20 69 74 65 6d 20 61 72 6f 75 6e 64 20  ind item around 
a300: 78 2c 79 0a 20 20 20 20 20 20 20 20 73 65 74 20  x,y.        set 
a310: 6c 65 6e 20 20 5b 6c 6c 65 6e 67 74 68 20 24 64  len  [llength $d
a320: 61 74 61 28 69 74 65 6d 73 29 5d 0a 20 20 20 20  ata(items)].    
a330: 20 20 20 20 73 65 74 20 78 63 20 20 20 5b 24 70      set xc   [$p
a340: 61 74 68 2e 63 20 63 61 6e 76 61 73 78 20 24 78  ath.c canvasx $x
a350: 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20 79 63  ].        set yc
a360: 20 20 20 5b 24 70 61 74 68 2e 63 20 63 61 6e 76     [$path.c canv
a370: 61 73 79 20 24 79 5d 0a 20 20 20 20 20 20 20 20  asy $y].        
a380: 73 65 74 20 64 79 20 20 20 5b 24 70 61 74 68 2e  set dy   [$path.
a390: 63 20 63 67 65 74 20 2d 79 73 63 72 6f 6c 6c 69  c cget -yscrolli
a3a0: 6e 63 72 65 6d 65 6e 74 5d 0a 20 20 20 20 20 20  ncrement].      
a3b0: 20 20 73 65 74 20 6c 69 6e 65 20 5b 65 78 70 72    set line [expr
a3c0: 20 7b 69 6e 74 28 24 79 63 2f 24 64 79 29 7d 5d   {int($yc/$dy)}]
a3d0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 79 69 20  .        set yi 
a3e0: 20 20 5b 65 78 70 72 20 7b 24 6c 69 6e 65 2a 24    [expr {$line*$
a3f0: 64 79 7d 5d 0a 20 20 20 20 20 20 20 20 73 65 74  dy}].        set
a400: 20 79 73 20 20 20 5b 65 78 70 72 20 7b 24 79 69   ys   [expr {$yi
a410: 2b 24 64 79 7d 5d 0a 20 20 20 20 20 20 20 20 73  +$dy}].        s
a420: 65 74 20 78 69 20 20 20 30 0a 20 20 20 20 20 20  et xi   0.      
a430: 20 20 73 65 74 20 70 6f 73 20 20 24 6c 69 6e 65    set pos  $line
a440: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 57  .        if { [W
a450: 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e  idget::getoption
a460: 20 24 70 61 74 68 20 2d 6d 75 6c 74 69 63 6f 6c   $path -multicol
a470: 75 6d 6e 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20  umn] } {.       
a480: 20 20 20 20 20 73 65 74 20 6e 72 6f 77 73 20 24       set nrows $
a490: 64 61 74 61 28 6e 72 6f 77 73 29 0a 20 20 20 20  data(nrows).    
a4a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
a4b0: 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 72 6f           set nro
a4c0: 77 73 20 24 6c 65 6e 0a 20 20 20 20 20 20 20 20  ws $len.        
a4d0: 7d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20 24  }.        if { $
a4e0: 6c 69 6e 65 20 3c 20 24 6e 72 6f 77 73 20 7d 20  line < $nrows } 
a4f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
a500: 72 65 61 63 68 20 78 73 20 24 64 61 74 61 28 78  reach xs $data(x
a510: 6c 69 73 74 29 20 7b 0a 20 20 20 20 20 20 20 20  list) {.        
a520: 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 78 63          if { $xc
a530: 20 3c 3d 20 24 78 73 20 7d 20 7b 0a 20 20 20 20   <= $xs } {.    
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 62 72 65 61 6b 0a 20 20 20 20 20 20 20 20 20 20  break.          
a560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a570: 20 20 20 20 20 20 20 20 73 65 74 20 20 78 69 20          set  xi 
a580: 20 24 78 73 0a 20 20 20 20 20 20 20 20 20 20 20   $xs.           
a590: 20 20 20 20 20 69 6e 63 72 20 70 6f 73 20 24 6e       incr pos $n
a5a0: 72 6f 77 73 0a 20 20 20 20 20 20 20 20 20 20 20  rows.           
a5b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
a5c0: 66 20 7b 20 24 70 6f 73 20 3c 20 24 6c 65 6e 20  f { $pos < $len 
a5d0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
a5e0: 20 20 20 20 73 65 74 20 69 74 65 6d 20 5b 6c 69      set item [li
a5f0: 6e 64 65 78 20 24 64 61 74 61 28 69 74 65 6d 73  ndex $data(items
a600: 29 20 24 70 6f 73 5d 0a 20 20 20 20 20 20 20 20  ) $pos].        
a610: 20 20 20 20 20 20 20 20 73 65 74 20 78 69 20 20          set xi  
a620: 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65 78 20   [expr {[lindex 
a630: 5b 24 70 61 74 68 2e 63 20 63 6f 6f 72 64 73 20  [$path.c coords 
a640: 6e 3a 24 69 74 65 6d 5d 20 30 5d 2d 5b 57 69 64  n:$item] 0]-[Wid
a650: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
a660: 70 61 74 68 20 2d 70 61 64 78 5d 2d 31 7d 5d 0a  path -padx]-1}].
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a680: 69 66 20 7b 20 24 64 61 74 61 28 64 6e 64 2c 6d  if { $data(dnd,m
a690: 6f 64 65 29 20 26 20 31 20 7d 20 7b 0a 20 20 20  ode) & 1 } {.   
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6b0: 20 23 20 64 72 6f 70 6f 76 65 72 6d 6f 64 65 20   # dropovermode 
a6c0: 69 6e 63 6c 75 64 65 73 20 69 74 65 6d 0a 20 20  includes item.  
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 20 6c 61 70 70 65 6e 64 20 74 61 72 67 65 74    lappend target
a6f0: 20 24 69 74 65 6d 0a 20 20 20 20 20 20 20 20 20   $item.         
a700: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76             set v
a710: 6d 6f 64 65 20 5b 65 78 70 72 20 7b 24 76 6d 6f  mode [expr {$vmo
a720: 64 65 20 7c 20 31 7d 5d 0a 20 20 20 20 20 20 20  de | 1}].       
a730: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
a740: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a750: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 74 61        lappend ta
a760: 72 67 65 74 20 22 22 0a 20 20 20 20 20 20 20 20  rget "".        
a770: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
a780: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 20             if { 
a790: 24 64 61 74 61 28 64 6e 64 2c 6d 6f 64 65 29 20  $data(dnd,mode) 
a7a0: 26 20 32 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  & 2 } {.        
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 64 72              # dr
a7c0: 6f 70 6f 76 65 72 6d 6f 64 65 20 69 6e 63 6c 75  opovermode inclu
a7d0: 64 65 73 20 70 6f 73 69 74 69 6f 6e 0a 20 20 20  des position.   
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 69 66 20 7b 20 24 79 63 20 3e 3d 20 24 79 69   if { $yc >= $yi
a800: 2b 24 64 79 2f 32 20 7d 20 7b 0a 20 20 20 20 20  +$dy/2 } {.     
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 20 20 20 23 20 70 6f 73 69 74 69 6f 6e 20 69 73     # position is
a830: 20 61 66 74 65 72 20 24 69 74 65 6d 0a 20 20 20   after $item.   
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a850: 20 20 20 20 20 69 6e 63 72 20 70 6f 73 0a 20 20       incr pos.  
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 20 20 20 20 20 20 73 65 74 20 79 6c 20 24 79 73        set yl $ys
a880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a890: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 20 20 20 20 20 20 23 20 70 6f 73 69 74 69 6f 6e        # position
a8c0: 20 69 73 20 62 65 66 6f 72 65 20 24 69 74 65 6d   is before $item
a8d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a8e0: 20 20 20 20 20 20 20 20 20 73 65 74 20 79 6c 20           set yl 
a8f0: 24 79 69 0a 20 20 20 20 20 20 20 20 20 20 20 20  $yi.            
a900: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
a920: 70 70 65 6e 64 20 74 61 72 67 65 74 20 24 70 6f  ppend target $po
a930: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
a940: 20 20 20 20 20 20 73 65 74 20 76 6d 6f 64 65 20        set vmode 
a950: 5b 65 78 70 72 20 7b 24 76 6d 6f 64 65 20 7c 20  [expr {$vmode | 
a960: 32 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  2}].            
a970: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a990: 20 6c 61 70 70 65 6e 64 20 74 61 72 67 65 74 20   lappend target 
a9a0: 22 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  "".             
a9b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
a9c0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
a9d0: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
a9e0: 64 20 74 61 72 67 65 74 20 22 22 20 22 22 0a 20  d target "" "". 
a9f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
aa00: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
aa10: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
aa20: 64 20 74 61 72 67 65 74 20 22 22 20 22 22 0a 20  d target "" "". 
aa30: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
aa40: 20 20 69 66 20 7b 20 28 24 76 6d 6f 64 65 20 26    if { ($vmode &
aa50: 20 33 29 20 3d 3d 20 33 20 7d 20 7b 0a 20 20 20   3) == 3 } {.   
aa60: 20 20 20 20 20 20 20 20 20 23 20 72 65 73 75 6c           # resul
aa70: 74 20 68 61 76 65 20 62 6f 74 68 20 69 74 65 6d  t have both item
aa80: 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 0a 20 20   and position.  
aa90: 20 20 20 20 20 20 20 20 20 20 23 20 77 65 20 63            # we c
aaa0: 6f 6d 70 75 74 65 20 77 68 61 74 20 69 73 20 74  ompute what is t
aab0: 68 65 20 70 72 65 66 65 72 72 65 64 20 6d 65 74  he preferred met
aac0: 68 6f 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  hod.            
aad0: 69 66 20 7b 20 24 79 63 2d 24 79 69 20 3c 3d 20  if { $yc-$yi <= 
aae0: 33 20 7c 7c 20 24 79 73 2d 24 79 63 20 3c 3d 20  3 || $ys-$yc <= 
aaf0: 33 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  3 } {.          
ab00: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 74 61        lappend ta
ab10: 72 67 65 74 20 22 70 6f 73 69 74 69 6f 6e 22 0a  rget "position".
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
ab30: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
ab40: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 74 61 72       lappend tar
ab50: 67 65 74 20 22 69 74 65 6d 22 0a 20 20 20 20 20  get "item".     
ab60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ab70: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
ab80: 20 7b 24 76 6d 6f 64 65 20 26 26 20 5b 6c 6c 65   {$vmode && [lle
ab90: 6e 67 74 68 20 5b 73 65 74 20 63 6d 64 20 5b 57  ngth [set cmd [W
aba0: 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e  idget::getoption
abb0: 20 24 70 61 74 68 20 2d 64 72 6f 70 6f 76 65 72   $path -dropover
abc0: 63 6d 64 5d 5d 5d 7d 20 7b 0a 20 20 20 20 20 20  cmd]]]} {.      
abd0: 20 20 23 20 75 73 65 72 2d 64 65 66 69 6e 65 64    # user-defined
abe0: 20 64 72 6f 70 6f 76 65 72 20 63 6f 6d 6d 61 6e   dropover comman
abf0: 64 0a 20 20 20 20 20 20 20 20 73 65 74 20 72 65  d.        set re
ac00: 73 20 20 20 5b 75 70 6c 65 76 65 6c 20 5c 23 30  s   [uplevel \#0
ac10: 20 24 63 6d 64 20 5b 6c 69 73 74 20 24 73 6f 75   $cmd [list $sou
ac20: 72 63 65 20 24 74 61 72 67 65 74 20 24 6f 70 20  rce $target $op 
ac30: 24 74 79 70 65 20 24 64 6e 64 64 61 74 61 5d 5d  $type $dnddata]]
ac40: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64  .        set cod
ac50: 65 20 20 5b 6c 69 6e 64 65 78 20 24 72 65 73 20  e  [lindex $res 
ac60: 30 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76  0].        set v
ac70: 6d 6f 64 65 20 30 0a 20 20 20 20 20 20 20 20 69  mode 0.        i
ac80: 66 20 7b 24 63 6f 64 65 20 26 20 31 7d 20 7b 0a  f {$code & 1} {.
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 75 70              # up
aca0: 64 61 74 65 20 76 6d 6f 64 65 0a 20 20 20 20 20  date vmode.     
acb0: 20 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 65         switch -e
acc0: 78 61 63 74 20 2d 2d 20 5b 6c 69 6e 64 65 78 20  xact -- [lindex 
acd0: 24 72 65 73 20 31 5d 20 7b 0a 20 20 20 20 20 20  $res 1] {.      
ace0: 20 20 20 20 20 20 20 20 20 20 69 74 65 6d 20 20            item  
acf0: 20 20 20 7b 73 65 74 20 76 6d 6f 64 65 20 31 7d     {set vmode 1}
ad00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ad10: 20 70 6f 73 69 74 69 6f 6e 20 7b 73 65 74 20 76   position {set v
ad20: 6d 6f 64 65 20 32 7d 0a 20 20 20 20 20 20 20 20  mode 2}.        
ad30: 20 20 20 20 20 20 20 20 77 69 64 67 65 74 20 20          widget  
ad40: 20 7b 73 65 74 20 76 6d 6f 64 65 20 34 7d 0a 20   {set vmode 4}. 
ad50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
ad60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
ad70: 65 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b  e {.        if {
ad80: 20 28 24 76 6d 6f 64 65 20 26 20 33 29 20 3d 3d   ($vmode & 3) ==
ad90: 20 33 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20   3 } {.         
ada0: 20 20 20 23 20 72 65 73 75 6c 74 20 68 61 76 65     # result have
adb0: 20 62 6f 74 68 20 69 74 65 6d 20 61 6e 64 20 70   both item and p
adc0: 6f 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  osition.        
add0: 20 20 20 20 23 20 77 65 20 63 68 6f 6f 73 65 20      # we choose 
ade0: 74 68 65 20 70 72 65 66 65 72 72 65 64 20 6d 65  the preferred me
adf0: 74 68 6f 64 0a 20 20 20 20 20 20 20 20 20 20 20  thod.           
ae00: 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 65 71   if { [string eq
ae10: 75 61 6c 20 5b 6c 69 6e 64 65 78 20 24 74 61 72  ual [lindex $tar
ae20: 67 65 74 20 33 5d 20 22 70 6f 73 69 74 69 6f 6e  get 3] "position
ae30: 22 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  "] } {.         
ae40: 20 20 20 20 20 20 20 73 65 74 20 76 6d 6f 64 65         set vmode
ae50: 20 5b 65 78 70 72 20 7b 24 76 6d 6f 64 65 20 26   [expr {$vmode &
ae60: 20 7e 31 7d 5d 0a 20 20 20 20 20 20 20 20 20 20   ~1}].          
ae70: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
ae80: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76             set v
ae90: 6d 6f 64 65 20 5b 65 78 70 72 20 7b 24 76 6d 6f  mode [expr {$vmo
aea0: 64 65 20 26 20 7e 32 7d 5d 0a 20 20 20 20 20 20  de & ~2}].      
aeb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aec0: 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20  }..        if { 
aed0: 24 64 61 74 61 28 64 6e 64 2c 6d 6f 64 65 29 20  $data(dnd,mode) 
aee0: 3d 3d 20 34 20 7c 7c 20 24 64 61 74 61 28 64 6e  == 4 || $data(dn
aef0: 64 2c 6d 6f 64 65 29 20 3d 3d 20 30 20 7d 20 7b  d,mode) == 0 } {
af00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 64  .            # d
af10: 72 6f 70 6f 76 65 72 6d 6f 64 65 20 69 73 20 77  ropovermode is w
af20: 69 64 67 65 74 20 6f 72 20 65 6d 70 74 79 20 2d  idget or empty -
af30: 20 72 65 63 61 6c 6c 20 69 73 20 6e 6f 74 20 6e   recall is not n
af40: 65 63 65 73 73 61 72 79 0a 20 20 20 20 20 20 20  ecessary.       
af50: 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 31 0a       set code 1.
af60: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
af70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
af80: 20 63 6f 64 65 20 33 0a 20 20 20 20 20 20 20 20   code 3.        
af90: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 64  }.    }..    # d
afa0: 72 61 77 20 64 6e 64 20 76 69 73 75 61 6c 20 66  raw dnd visual f
afb0: 6f 6c 6c 6f 77 69 6e 67 20 76 6d 6f 64 65 0a 20  ollowing vmode. 
afc0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
afd0: 24 64 61 74 61 28 69 74 65 6d 73 29 5d 7d 20 7b  $data(items)]} {
afe0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 76  .        if { $v
aff0: 6d 6f 64 65 20 26 20 31 20 7d 20 7b 0a 20 20 20  mode & 1 } {.   
b000: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74           set dat
b010: 61 28 64 6e 64 2c 69 74 65 6d 29 20 5b 6c 69 73  a(dnd,item) [lis
b020: 74 20 22 69 74 65 6d 22 20 5b 6c 69 6e 64 65 78  t "item" [lindex
b030: 20 24 74 61 72 67 65 74 20 31 5d 5d 0a 20 20 20   $target 1]].   
b040: 20 20 20 20 20 20 20 20 20 24 70 61 74 68 2e 63           $path.c
b050: 20 63 72 65 61 74 65 20 72 65 63 74 61 6e 67 6c   create rectangl
b060: 65 20 24 78 69 20 24 79 69 20 24 78 73 20 24 79  e $xi $yi $xs $y
b070: 73 20 2d 74 61 67 73 20 64 72 6f 70 0a 20 20 20  s -tags drop.   
b080: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20       } elseif { 
b090: 24 76 6d 6f 64 65 20 26 20 32 20 7d 20 7b 0a 20  $vmode & 2 } {. 
b0a0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
b0b0: 61 74 61 28 64 6e 64 2c 69 74 65 6d 29 20 5b 63  ata(dnd,item) [c
b0c0: 6f 6e 63 61 74 20 22 70 6f 73 69 74 69 6f 6e 22  oncat "position"
b0d0: 20 5b 6c 69 6e 64 65 78 20 24 74 61 72 67 65 74   [lindex $target
b0e0: 20 32 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20   2]].           
b0f0: 20 24 70 61 74 68 2e 63 20 63 72 65 61 74 65 20   $path.c create 
b100: 6c 69 6e 65 20 24 78 69 20 24 79 6c 20 24 78 73  line $xi $yl $xs
b110: 20 24 79 6c 20 2d 74 61 67 73 20 64 72 6f 70 0a   $yl -tags drop.
b120: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
b130: 20 7b 20 24 76 6d 6f 64 65 20 26 20 34 20 7d 20   { $vmode & 4 } 
b140: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
b150: 74 20 64 61 74 61 28 64 6e 64 2c 69 74 65 6d 29  t data(dnd,item)
b160: 20 5b 6c 69 73 74 20 22 77 69 64 67 65 74 22 5d   [list "widget"]
b170: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
b180: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
b190: 74 20 63 6f 64 65 20 5b 65 78 70 72 20 7b 24 63  t code [expr {$c
b1a0: 6f 64 65 20 26 20 32 7d 5d 0a 20 20 20 20 20 20  ode & 2}].      
b1b0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
b1c0: 66 20 7b 20 24 63 6f 64 65 20 26 20 31 20 7d 20  f { $code & 1 } 
b1d0: 7b 0a 20 20 20 20 20 20 20 20 44 72 6f 70 53 69  {.        DropSi
b1e0: 74 65 3a 3a 73 65 74 63 75 72 73 6f 72 20 62 61  te::setcursor ba
b1f0: 73 65 64 5f 61 72 72 6f 77 5f 64 6f 77 6e 0a 20  sed_arrow_down. 
b200: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
b210: 20 20 20 20 44 72 6f 70 53 69 74 65 3a 3a 73 65      DropSite::se
b220: 74 63 75 72 73 6f 72 20 64 6f 74 0a 20 20 20 20  tcursor dot.    
b230: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f  }.    return $co
b240: 64 65 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d  de.}...# -------
b250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b290: 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64  -----.#  Command
b2a0: 20 4c 69 73 74 42 6f 78 3a 3a 5f 61 75 74 6f 5f   ListBox::_auto_
b2b0: 73 63 72 6f 6c 6c 0a 23 20 2d 2d 2d 2d 2d 2d 2d  scroll.# -------
b2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b300: 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 4c 69 73 74 42  -----.proc ListB
b310: 6f 78 3a 3a 5f 61 75 74 6f 5f 73 63 72 6f 6c 6c  ox::_auto_scroll
b320: 20 7b 20 70 61 74 68 20 78 20 79 20 7d 20 7b 0a   { path x y } {.
b330: 20 20 20 20 76 61 72 69 61 62 6c 65 20 24 70 61      variable $pa
b340: 74 68 0a 20 20 20 20 75 70 76 61 72 20 30 20 20  th.    upvar 0  
b350: 24 70 61 74 68 20 64 61 74 61 0a 0a 20 20 20 20  $path data..    
b360: 73 65 74 20 78 6d 61 78 20 20 20 5b 77 69 6e 66  set xmax   [winf
b370: 6f 20 77 69 64 74 68 20 20 24 70 61 74 68 5d 0a  o width  $path].
b380: 20 20 20 20 73 65 74 20 79 6d 61 78 20 20 20 5b      set ymax   [
b390: 77 69 6e 66 6f 20 68 65 69 67 68 74 20 24 70 61  winfo height $pa
b3a0: 74 68 5d 0a 20 20 20 20 73 65 74 20 73 63 72 6f  th].    set scro
b3b0: 6c 6c 20 7b 7d 0a 20 20 20 20 69 66 20 7b 20 24  ll {}.    if { $
b3c0: 79 20 3c 3d 20 36 20 7d 20 7b 0a 20 20 20 20 20  y <= 6 } {.     
b3d0: 20 20 20 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20     if { [lindex 
b3e0: 5b 24 70 61 74 68 2e 63 20 79 76 69 65 77 5d 20  [$path.c yview] 
b3f0: 30 5d 20 3e 20 30 20 7d 20 7b 0a 20 20 20 20 20  0] > 0 } {.     
b400: 20 20 20 20 20 20 20 73 65 74 20 73 63 72 6f 6c         set scrol
b410: 6c 20 5b 6c 69 73 74 20 79 76 69 65 77 20 2d 31  l [list yview -1
b420: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 44 72  ].            Dr
b430: 6f 70 53 69 74 65 3a 3a 73 65 74 63 75 72 73 6f  opSite::setcurso
b440: 72 20 73 62 5f 75 70 5f 61 72 72 6f 77 0a 20 20  r sb_up_arrow.  
b450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
b460: 73 65 69 66 20 7b 20 24 79 20 3e 3d 20 24 79 6d  seif { $y >= $ym
b470: 61 78 2d 36 20 7d 20 7b 0a 20 20 20 20 20 20 20  ax-6 } {.       
b480: 20 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 5b 24   if { [lindex [$
b490: 70 61 74 68 2e 63 20 79 76 69 65 77 5d 20 31 5d  path.c yview] 1]
b4a0: 20 3c 20 31 20 7d 20 7b 0a 20 20 20 20 20 20 20   < 1 } {.       
b4b0: 20 20 20 20 20 73 65 74 20 73 63 72 6f 6c 6c 20       set scroll 
b4c0: 5b 6c 69 73 74 20 79 76 69 65 77 20 31 5d 0a 20  [list yview 1]. 
b4d0: 20 20 20 20 20 20 20 20 20 20 20 44 72 6f 70 53             DropS
b4e0: 69 74 65 3a 3a 73 65 74 63 75 72 73 6f 72 20 73  ite::setcursor s
b4f0: 62 5f 64 6f 77 6e 5f 61 72 72 6f 77 0a 20 20 20  b_down_arrow.   
b500: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
b510: 65 69 66 20 7b 20 24 78 20 3c 3d 20 36 20 7d 20  eif { $x <= 6 } 
b520: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b  {.        if { [
b530: 6c 69 6e 64 65 78 20 5b 24 70 61 74 68 2e 63 20  lindex [$path.c 
b540: 78 76 69 65 77 5d 20 30 5d 20 3e 20 30 20 7d 20  xview] 0] > 0 } 
b550: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
b560: 74 20 73 63 72 6f 6c 6c 20 5b 6c 69 73 74 20 78  t scroll [list x
b570: 76 69 65 77 20 2d 31 5d 0a 20 20 20 20 20 20 20  view -1].       
b580: 20 20 20 20 20 44 72 6f 70 53 69 74 65 3a 3a 73       DropSite::s
b590: 65 74 63 75 72 73 6f 72 20 73 62 5f 6c 65 66 74  etcursor sb_left
b5a0: 5f 61 72 72 6f 77 0a 20 20 20 20 20 20 20 20 7d  _arrow.        }
b5b0: 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20  .    } elseif { 
b5c0: 24 78 20 3e 3d 20 24 78 6d 61 78 2d 36 20 7d 20  $x >= $xmax-6 } 
b5d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b  {.        if { [
b5e0: 6c 69 6e 64 65 78 20 5b 24 70 61 74 68 2e 63 20  lindex [$path.c 
b5f0: 78 76 69 65 77 5d 20 31 5d 20 3c 20 31 20 7d 20  xview] 1] < 1 } 
b600: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
b610: 74 20 73 63 72 6f 6c 6c 20 5b 6c 69 73 74 20 78  t scroll [list x
b620: 76 69 65 77 20 31 5d 0a 20 20 20 20 20 20 20 20  view 1].        
b630: 20 20 20 20 44 72 6f 70 53 69 74 65 3a 3a 73 65      DropSite::se
b640: 74 63 75 72 73 6f 72 20 73 62 5f 72 69 67 68 74  tcursor sb_right
b650: 5f 61 72 72 6f 77 0a 20 20 20 20 20 20 20 20 7d  _arrow.        }
b660: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b  .    }..    if {
b670: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
b680: 24 64 61 74 61 28 64 6e 64 2c 61 66 74 65 72 69  $data(dnd,afteri
b690: 64 29 5d 20 26 26 20 21 5b 73 74 72 69 6e 67 20  d)] && ![string 
b6a0: 65 71 75 61 6c 20 24 64 61 74 61 28 64 6e 64 2c  equal $data(dnd,
b6b0: 73 63 72 6f 6c 6c 29 20 24 73 63 72 6f 6c 6c 5d  scroll) $scroll]
b6c0: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 61 66 74   } {.        aft
b6d0: 65 72 20 63 61 6e 63 65 6c 20 24 64 61 74 61 28  er cancel $data(
b6e0: 64 6e 64 2c 61 66 74 65 72 69 64 29 0a 20 20 20  dnd,afterid).   
b6f0: 20 20 20 20 20 73 65 74 20 64 61 74 61 28 64 6e       set data(dn
b700: 64 2c 61 66 74 65 72 69 64 29 20 22 22 0a 20 20  d,afterid) "".  
b710: 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 64 61 74    }..    set dat
b720: 61 28 64 6e 64 2c 73 63 72 6f 6c 6c 29 20 24 73  a(dnd,scroll) $s
b730: 63 72 6f 6c 6c 0a 20 20 20 20 69 66 20 7b 20 5b  croll.    if { [
b740: 6c 6c 65 6e 67 74 68 20 24 73 63 72 6f 6c 6c 5d  llength $scroll]
b750: 20 26 26 20 21 5b 73 74 72 69 6e 67 20 6c 65 6e   && ![string len
b760: 67 74 68 20 24 64 61 74 61 28 64 6e 64 2c 61 66  gth $data(dnd,af
b770: 74 65 72 69 64 29 5d 20 7d 20 7b 0a 20 20 20 20  terid)] } {.    
b780: 20 20 20 20 73 65 74 20 64 61 74 61 28 64 6e 64      set data(dnd
b790: 2c 61 66 74 65 72 69 64 29 20 5b 61 66 74 65 72  ,afterid) [after
b7a0: 20 32 30 30 20 5b 6c 69 73 74 20 4c 69 73 74 42   200 [list ListB
b7b0: 6f 78 3a 3a 5f 73 63 72 6f 6c 6c 20 24 70 61 74  ox::_scroll $pat
b7c0: 68 20 24 73 63 72 6f 6c 6c 5d 5d 0a 20 20 20 20  h $scroll]].    
b7d0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 64 61  }.    return $da
b7e0: 74 61 28 64 6e 64 2c 61 66 74 65 72 69 64 29 0a  ta(dnd,afterid).
b7f0: 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..# ----------
b800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b840: 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 4c  ---.#  Command L
b850: 69 73 74 42 6f 78 3a 3a 5f 6d 75 6c 74 69 70 6c  istBox::_multipl
b860: 65 5f 73 65 6c 65 63 74 0a 23 20 2d 2d 2d 2d 2d  e_select.# -----
b870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b8b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 4c 69  --------.proc Li
b8c0: 73 74 42 6f 78 3a 3a 5f 6d 75 6c 74 69 70 6c 65  stBox::_multiple
b8d0: 5f 73 65 6c 65 63 74 20 7b 20 70 61 74 68 20 6d  _select { path m
b8e0: 6f 64 65 20 78 20 79 20 69 64 78 20 7d 20 7b 0a  ode x y idx } {.
b8f0: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 24 70  .    variable $p
b900: 61 74 68 0a 20 20 20 20 75 70 76 61 72 20 30 20  ath.    upvar 0 
b910: 20 24 70 61 74 68 20 64 61 74 61 0a 0a 0a 20 20   $path data...  
b920: 20 20 69 66 20 7b 20 21 5b 69 6e 66 6f 20 65 78    if { ![info ex
b930: 69 73 74 73 20 64 61 74 61 28 61 6e 63 68 6f 72  ists data(anchor
b940: 29 5d 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69  )] || ![info exi
b950: 73 74 73 20 64 61 74 61 28 73 65 6c 5f 61 6e 63  sts data(sel_anc
b960: 68 6f 72 29 5d 20 7d 20 7b 0a 09 73 65 74 20 64  hor)] } {..set d
b970: 61 74 61 28 61 6e 63 68 6f 72 29 20 24 69 64 78  ata(anchor) $idx
b980: 0a 09 73 65 74 20 64 61 74 61 28 73 65 6c 5f 61  ..set data(sel_a
b990: 6e 63 68 6f 72 29 20 7b 7d 0a 20 20 20 20 7d 0a  nchor) {}.    }.
b9a0: 0a 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61  .    switch -exa
b9b0: 63 74 20 2d 2d 20 24 6d 6f 64 65 20 7b 0a 09 6e  ct -- $mode {..n
b9c0: 20 7b 0a 09 20 20 20 20 5f 6d 6f 75 73 65 5f 73   {..    _mouse_s
b9d0: 65 6c 65 63 74 20 24 70 61 74 68 20 73 65 74 20  elect $path set 
b9e0: 24 69 64 78 0a 09 20 20 20 20 73 65 74 20 64 61  $idx..    set da
b9f0: 74 61 28 61 6e 63 68 6f 72 29 20 24 69 64 78 0a  ta(anchor) $idx.
ba00: 09 20 20 20 20 73 65 74 20 64 61 74 61 28 73 65  .    set data(se
ba10: 6c 5f 61 6e 63 68 6f 72 29 20 7b 7d 0a 09 7d 0a  l_anchor) {}..}.
ba20: 09 63 20 7b 0a 09 20 20 20 20 73 65 74 20 6c 20  .c {..    set l 
ba30: 5b 5f 6d 6f 75 73 65 5f 73 65 6c 65 63 74 20 24  [_mouse_select $
ba40: 70 61 74 68 20 67 65 74 5d 0a 09 20 20 20 20 69  path get]..    i
ba50: 66 20 7b 20 5b 6c 73 65 61 72 63 68 20 2d 65 78  f { [lsearch -ex
ba60: 61 63 74 20 24 6c 20 24 69 64 78 5d 20 3e 3d 20  act $l $idx] >= 
ba70: 30 20 7d 20 7b 0a 09 09 5f 6d 6f 75 73 65 5f 73  0 } {..._mouse_s
ba80: 65 6c 65 63 74 20 24 70 61 74 68 20 72 65 6d 6f  elect $path remo
ba90: 76 65 20 24 69 64 78 0a 09 20 20 20 20 7d 20 65  ve $idx..    } e
baa0: 6c 73 65 20 7b 0a 09 09 5f 6d 6f 75 73 65 5f 73  lse {..._mouse_s
bab0: 65 6c 65 63 74 20 24 70 61 74 68 20 61 64 64 20  elect $path add 
bac0: 24 69 64 78 0a 09 20 20 20 20 7d 0a 09 20 20 20  $idx..    }..   
bad0: 20 73 65 74 20 64 61 74 61 28 61 6e 63 68 6f 72   set data(anchor
bae0: 29 20 24 69 64 78 0a 09 20 20 20 20 73 65 74 20  ) $idx..    set 
baf0: 64 61 74 61 28 73 65 6c 5f 61 6e 63 68 6f 72 29  data(sel_anchor)
bb00: 20 7b 7d 0a 09 7d 0a 09 73 20 7b 0a 09 20 20 20   {}..}..s {..   
bb10: 20 65 76 61 6c 20 5b 6c 69 73 74 20 24 70 61 74   eval [list $pat
bb20: 68 20 5f 6d 6f 75 73 65 5f 73 65 6c 65 63 74 20  h _mouse_select 
bb30: 72 65 6d 6f 76 65 5d 20 24 64 61 74 61 28 73 65  remove] $data(se
bb40: 6c 5f 61 6e 63 68 6f 72 29 0a 0a 09 20 20 20 20  l_anchor)...    
bb50: 73 65 74 20 69 78 20 5b 24 70 61 74 68 20 69 6e  set ix [$path in
bb60: 64 65 78 20 24 69 64 78 5d 0a 09 20 20 20 20 73  dex $idx]..    s
bb70: 65 74 20 69 61 20 5b 24 70 61 74 68 20 69 6e 64  et ia [$path ind
bb80: 65 78 20 24 64 61 74 61 28 61 6e 63 68 6f 72 29  ex $data(anchor)
bb90: 5d 0a 09 20 20 20 20 69 66 20 7b 20 24 69 78 20  ]..    if { $ix 
bba0: 3e 20 24 69 61 20 7d 20 7b 0a 09 09 73 65 74 20  > $ia } {...set 
bbb0: 69 73 74 61 72 74 20 24 69 61 0a 09 09 73 65 74  istart $ia...set
bbc0: 20 69 65 6e 64 20 24 69 78 0a 20 20 09 20 20 20   iend $ix.  .   
bbd0: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 73 65 74 20   } else {...set 
bbe0: 69 73 74 61 72 74 20 24 69 78 0a 09 09 73 65 74  istart $ix...set
bbf0: 20 69 65 6e 64 20 24 69 61 0a 20 20 09 20 20 20   iend $ia.  .   
bc00: 20 7d 0a 0a 20 20 09 20 20 20 20 66 6f 72 20 7b   }..  .    for {
bc10: 20 73 65 74 20 69 20 24 69 73 74 61 72 74 20 7d   set i $istart }
bc20: 20 7b 20 24 69 20 3c 3d 20 24 69 65 6e 64 20 7d   { $i <= $iend }
bc30: 20 7b 20 69 6e 63 72 20 69 20 7d 20 7b 0a 09 09   { incr i } {...
bc40: 73 65 74 20 6c 20 5b 24 70 61 74 68 20 73 65 6c  set l [$path sel
bc50: 65 63 74 69 6f 6e 20 67 65 74 5d 0a 09 09 73 65  ection get]...se
bc60: 74 20 74 20 5b 24 70 61 74 68 20 69 74 65 6d 73  t t [$path items
bc70: 20 24 69 5d 0a 09 09 73 65 74 20 6c 69 20 5b 6c   $i]...set li [l
bc80: 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 6c  search -exact $l
bc90: 20 24 74 5d 0a 09 09 69 66 20 7b 20 24 6c 69 20   $t]...if { $li 
bca0: 3c 20 30 20 7d 20 7b 0a 09 09 20 20 20 20 5f 6d  < 0 } {...    _m
bcb0: 6f 75 73 65 5f 73 65 6c 65 63 74 20 24 70 61 74  ouse_select $pat
bcc0: 68 20 61 64 64 20 24 74 0a 09 09 20 20 20 20 6c  h add $t...    l
bcd0: 61 70 70 65 6e 64 20 64 61 74 61 28 73 65 6c 5f  append data(sel_
bce0: 61 6e 63 68 6f 72 29 20 24 74 0a 20 09 09 7d 0a  anchor) $t. ..}.
bcf0: 20 20 09 20 20 20 20 7d 0a 20 20 20 20 20 20 20    .    }.       
bd00: 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 23 20 2d   }.    }.}...# -
bd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43  -----------.#  C
bd60: 6f 6d 6d 61 6e 64 20 4c 69 73 74 42 6f 78 3a 3a  ommand ListBox::
bd70: 5f 73 63 72 6f 6c 6c 0a 23 20 2d 2d 2d 2d 2d 2d  _scroll.# ------
bd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdc0: 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 4c 69 73 74  ------.proc List
bdd0: 42 6f 78 3a 3a 5f 73 63 72 6f 6c 6c 20 7b 20 70  Box::_scroll { p
bde0: 61 74 68 20 63 6d 64 20 64 69 72 20 7d 20 7b 0a  ath cmd dir } {.
bdf0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 24 70 61      variable $pa
be00: 74 68 0a 20 20 20 20 75 70 76 61 72 20 30 20 20  th.    upvar 0  
be10: 24 70 61 74 68 20 64 61 74 61 0a 0a 20 20 20 20  $path data..    
be20: 69 66 20 7b 20 28 24 64 69 72 20 3d 3d 20 2d 31  if { ($dir == -1
be30: 20 26 26 20 5b 6c 69 6e 64 65 78 20 5b 24 70 61   && [lindex [$pa
be40: 74 68 2e 63 20 24 63 6d 64 5d 20 30 5d 20 3e 20  th.c $cmd] 0] > 
be50: 30 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28  0) ||.         (
be60: 24 64 69 72 20 3d 3d 20 31 20 20 26 26 20 5b 6c  $dir == 1  && [l
be70: 69 6e 64 65 78 20 5b 24 70 61 74 68 2e 63 20 24  index [$path.c $
be80: 63 6d 64 5d 20 31 5d 20 3c 20 31 29 20 7d 20 7b  cmd] 1] < 1) } {
be90: 0a 20 20 20 20 20 20 20 20 24 70 61 74 68 20 24  .        $path $
bea0: 63 6d 64 20 73 63 72 6f 6c 6c 20 24 64 69 72 20  cmd scroll $dir 
beb0: 75 6e 69 74 73 0a 20 20 20 20 20 20 20 20 73 65  units.        se
bec0: 74 20 64 61 74 61 28 64 6e 64 2c 61 66 74 65 72  t data(dnd,after
bed0: 69 64 29 20 5c 0a 09 20 20 20 20 5b 61 66 74 65  id) \..    [afte
bee0: 72 20 31 30 30 20 5b 6c 69 73 74 20 4c 69 73 74  r 100 [list List
bef0: 42 6f 78 3a 3a 5f 73 63 72 6f 6c 6c 20 24 70 61  Box::_scroll $pa
bf00: 74 68 20 24 63 6d 64 20 24 64 69 72 5d 5d 0a 20  th $cmd $dir]]. 
bf10: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
bf20: 20 20 20 20 73 65 74 20 64 61 74 61 28 64 6e 64      set data(dnd
bf30: 2c 61 66 74 65 72 69 64 29 20 22 22 0a 20 20 20  ,afterid) "".   
bf40: 20 20 20 20 20 44 72 6f 70 53 69 74 65 3a 3a 73       DropSite::s
bf50: 65 74 63 75 72 73 6f 72 20 64 6f 74 0a 20 20 20  etcursor dot.   
bf60: 20 7d 0a 7d 0a 0a 23 20 4c 69 73 74 42 6f 78 3a   }.}..# ListBox:
bf70: 3a 5f 73 65 74 5f 68 65 6c 70 20 2d 2d 0a 23 0a  :_set_help --.#.
bf80: 23 09 52 65 67 69 73 74 65 72 20 64 79 6e 61 6d  #.Register dynam
bf90: 69 63 20 68 65 6c 70 20 66 6f 72 20 61 6e 20 69  ic help for an i
bfa0: 74 65 6d 20 69 6e 20 74 68 65 20 6c 69 73 74 62  tem in the listb
bfb0: 6f 78 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74  ox..#.# Argument
bfc0: 73 3a 0a 23 09 70 61 74 68 09 09 4c 69 73 74 42  s:.#.path..ListB
bfd0: 6f 78 20 74 6f 20 71 75 65 72 79 0a 23 09 69 74  ox to query.#.it
bfe0: 65 6d 09 09 49 74 65 6d 20 69 6e 20 74 68 65 20  em..Item in the 
bff0: 6c 69 73 74 62 6f 78 0a 23 20 20 20 20 20 20 20  listbox.#       
c000: 66 6f 72 63 65 09 09 4f 70 74 69 6f 6e 61 6c 20  force..Optional 
c010: 61 72 67 75 6d 65 6e 74 20 74 6f 20 66 6f 72 63  argument to forc
c020: 65 20 61 20 72 65 73 65 74 20 6f 66 20 74 68 65  e a reset of the
c030: 20 68 65 6c 70 0a 23 0a 23 20 52 65 73 75 6c 74   help.#.# Result
c040: 73 3a 0a 23 09 6e 6f 6e 65 0a 70 72 6f 63 20 4c  s:.#.none.proc L
c050: 69 73 74 42 6f 78 3a 3a 5f 73 65 74 5f 68 65 6c  istBox::_set_hel
c060: 70 20 7b 20 70 61 74 68 20 6e 6f 64 65 20 7d 20  p { path node } 
c070: 7b 0a 20 20 20 20 57 69 64 67 65 74 3a 3a 67 65  {.    Widget::ge
c080: 74 56 61 72 69 61 62 6c 65 20 24 70 61 74 68 20  tVariable $path 
c090: 68 65 6c 70 0a 0a 20 20 20 20 73 65 74 20 69 74  help..    set it
c0a0: 65 6d 20 24 70 61 74 68 2e 24 6e 6f 64 65 0a 20  em $path.$node. 
c0b0: 20 20 20 73 65 74 20 6f 70 74 73 20 5b 6c 69 73     set opts [lis
c0c0: 74 20 2d 68 65 6c 70 74 79 70 65 20 2d 68 65 6c  t -helptype -hel
c0d0: 70 74 65 78 74 20 2d 68 65 6c 70 76 61 72 5d 0a  ptext -helpvar].
c0e0: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 63 74 79      foreach {cty
c0f0: 20 63 74 78 20 63 76 7d 20 5b 65 76 61 6c 20 5b   ctx cv} [eval [
c100: 6c 69 6e 73 65 72 74 20 24 6f 70 74 73 20 30 20  linsert $opts 0 
c110: 57 69 64 67 65 74 3a 3a 68 61 73 43 68 61 6e 67  Widget::hasChang
c120: 65 64 58 20 24 69 74 65 6d 5d 5d 20 62 72 65 61  edX $item]] brea
c130: 6b 0a 20 20 20 20 73 65 74 20 74 65 78 74 20 5b  k.    set text [
c140: 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f  Widget::getoptio
c150: 6e 20 24 69 74 65 6d 20 2d 68 65 6c 70 74 65 78  n $item -helptex
c160: 74 5d 0a 0a 20 20 20 20 23 23 20 49 66 20 77 65  t]..    ## If we
c170: 27 76 65 20 6e 65 76 65 72 20 73 65 74 20 68 65  've never set he
c180: 6c 70 20 66 6f 72 20 74 68 69 73 20 69 74 65 6d  lp for this item
c190: 20 62 65 66 6f 72 65 2c 20 61 6e 64 20 74 65 78   before, and tex
c1a0: 74 20 69 73 20 6e 6f 74 20 62 6c 61 6e 6b 2c 0a  t is not blank,.
c1b0: 20 20 20 20 23 23 20 77 65 20 6e 65 65 64 20 74      ## we need t
c1c0: 6f 20 73 65 74 75 70 20 68 65 6c 70 2e 20 20 57  o setup help.  W
c1d0: 65 20 61 6c 73 6f 20 6e 65 65 64 20 74 6f 20 72  e also need to r
c1e0: 65 73 65 74 20 68 65 6c 70 20 69 66 20 61 6e 79  eset help if any
c1f0: 20 6f 66 20 74 68 65 0a 20 20 20 20 23 23 20 6f   of the.    ## o
c200: 70 74 69 6f 6e 73 20 68 61 76 65 20 63 68 61 6e  ptions have chan
c210: 67 65 64 2e 0a 20 20 20 20 69 66 20 7b 20 28 21  ged..    if { (!
c220: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 68 65 6c  [info exists hel
c230: 70 28 24 6e 6f 64 65 29 5d 20 26 26 20 24 74 65  p($node)] && $te
c240: 78 74 20 21 3d 20 22 22 29 20 7c 7c 20 24 63 74  xt != "") || $ct
c250: 79 20 7c 7c 20 24 63 74 78 20 7c 7c 20 24 63 76  y || $ctx || $cv
c260: 20 7d 20 7b 0a 09 73 65 74 20 68 65 6c 70 28 24   } {..set help($
c270: 6e 6f 64 65 29 20 31 0a 09 73 65 74 20 74 79 70  node) 1..set typ
c280: 65 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70  e [Widget::getop
c290: 74 69 6f 6e 20 24 69 74 65 6d 20 2d 68 65 6c 70  tion $item -help
c2a0: 74 79 70 65 5d 0a 20 20 20 20 20 20 20 20 73 77  type].        sw
c2b0: 69 74 63 68 20 24 74 79 70 65 20 7b 0a 20 20 20  itch $type {.   
c2c0: 20 20 20 20 20 20 20 20 20 62 61 6c 6c 6f 6f 6e           balloon
c2d0: 20 7b 0a 09 09 44 79 6e 61 6d 69 63 48 65 6c 70   {...DynamicHelp
c2e0: 3a 3a 72 65 67 69 73 74 65 72 20 24 70 61 74 68  ::register $path
c2f0: 2e 63 20 62 61 6c 6c 6f 6f 6e 20 6e 3a 24 6e 6f  .c balloon n:$no
c300: 64 65 20 24 74 65 78 74 0a 09 09 44 79 6e 61 6d  de $text...Dynam
c310: 69 63 48 65 6c 70 3a 3a 72 65 67 69 73 74 65 72  icHelp::register
c320: 20 24 70 61 74 68 2e 63 20 62 61 6c 6c 6f 6f 6e   $path.c balloon
c330: 20 69 3a 24 6e 6f 64 65 20 24 74 65 78 74 0a 09   i:$node $text..
c340: 09 44 79 6e 61 6d 69 63 48 65 6c 70 3a 3a 72 65  .DynamicHelp::re
c350: 67 69 73 74 65 72 20 24 70 61 74 68 2e 63 20 62  gister $path.c b
c360: 61 6c 6c 6f 6f 6e 20 62 3a 24 6e 6f 64 65 20 24  alloon b:$node $
c370: 74 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 20  text.           
c380: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 76   }.            v
c390: 61 72 69 61 62 6c 65 20 7b 0a 09 09 73 65 74 20  ariable {...set 
c3a0: 76 61 72 20 5b 57 69 64 67 65 74 3a 3a 67 65 74  var [Widget::get
c3b0: 6f 70 74 69 6f 6e 20 24 69 74 65 6d 20 2d 68 65  option $item -he
c3c0: 6c 70 76 61 72 5d 0a 09 09 44 79 6e 61 6d 69 63  lpvar]...Dynamic
c3d0: 48 65 6c 70 3a 3a 72 65 67 69 73 74 65 72 20 24  Help::register $
c3e0: 70 61 74 68 2e 63 20 76 61 72 69 61 62 6c 65 20  path.c variable 
c3f0: 6e 3a 24 6e 6f 64 65 20 24 76 61 72 20 24 74 65  n:$node $var $te
c400: 78 74 0a 09 09 44 79 6e 61 6d 69 63 48 65 6c 70  xt...DynamicHelp
c410: 3a 3a 72 65 67 69 73 74 65 72 20 24 70 61 74 68  ::register $path
c420: 2e 63 20 76 61 72 69 61 62 6c 65 20 69 3a 24 6e  .c variable i:$n
c430: 6f 64 65 20 24 76 61 72 20 24 74 65 78 74 0a 09  ode $var $text..
c440: 09 44 79 6e 61 6d 69 63 48 65 6c 70 3a 3a 72 65  .DynamicHelp::re
c450: 67 69 73 74 65 72 20 24 70 61 74 68 2e 63 20 76  gister $path.c v
c460: 61 72 69 61 62 6c 65 20 62 3a 24 6e 6f 64 65 20  ariable b:$node 
c470: 24 76 61 72 20 24 74 65 78 74 0a 20 20 20 20 20  $var $text.     
c480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c490: 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 4c 69   }.    }.}..# Li
c4a0: 73 74 42 6f 78 3a 3a 5f 6d 6f 75 73 65 5f 73 65  stBox::_mouse_se
c4b0: 6c 65 63 74 20 2d 2d 0a 23 0a 23 20 20 20 20 20  lect --.#.#     
c4c0: 20 20 48 61 6e 64 6c 65 20 73 65 6c 65 63 74 69    Handle selecti
c4d0: 6f 6e 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74  on commands that
c4e0: 20 61 72 65 20 64 6f 6e 65 20 62 79 20 74 68 65   are done by the
c4f0: 20 6d 6f 75 73 65 2e 20 20 49 66 20 74 68 65 0a   mouse.  If the.
c500: 23 20 20 20 20 20 20 20 73 65 6c 65 63 74 69 6f  #       selectio
c510: 6e 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  n command return
c520: 73 20 74 72 75 65 2c 20 77 65 20 67 65 6e 65 72  s true, we gener
c530: 61 74 65 20 61 20 3c 3c 4c 69 73 74 62 6f 78 53  ate a <<ListboxS
c540: 65 6c 65 63 74 3e 3e 0a 23 20 20 20 20 20 20 20  elect>>.#       
c550: 65 76 65 6e 74 20 66 6f 72 20 74 68 65 20 6c 69  event for the li
c560: 73 74 62 6f 78 2e 0a 23 0a 23 20 41 72 67 75 6d  stbox..#.# Argum
c570: 65 6e 74 73 3a 0a 23 20 20 20 20 20 20 20 53 74  ents:.#       St
c580: 61 6e 64 61 72 64 20 61 72 67 75 6d 65 6e 74 73  andard arguments
c590: 20 70 61 73 73 65 64 20 74 6f 20 61 20 73 65 6c   passed to a sel
c5a0: 65 63 74 69 6f 6e 20 63 6f 6d 6d 61 6e 64 2e 0a  ection command..
c5b0: 23 0a 23 20 52 65 73 75 6c 74 73 3a 0a 23 09 6e  #.# Results:.#.n
c5c0: 6f 6e 65 0a 70 72 6f 63 20 4c 69 73 74 42 6f 78  one.proc ListBox
c5d0: 3a 3a 5f 6d 6f 75 73 65 5f 73 65 6c 65 63 74 20  ::_mouse_select 
c5e0: 7b 20 70 61 74 68 20 63 6d 64 20 61 72 67 73 20  { path cmd args 
c5f0: 7d 20 7b 0a 20 20 20 20 65 76 61 6c 20 5b 6c 69  } {.    eval [li
c600: 6e 73 65 72 74 20 24 61 72 67 73 20 30 20 73 65  nsert $args 0 se
c610: 6c 65 63 74 69 6f 6e 20 24 70 61 74 68 20 24 63  lection $path $c
c620: 6d 64 5d 0a 20 20 20 20 73 77 69 74 63 68 20 2d  md].    switch -
c630: 2d 20 24 63 6d 64 20 7b 0a 20 20 20 20 20 20 20  - $cmd {.       
c640: 20 22 61 64 64 22 20 2d 20 22 63 6c 65 61 72 22   "add" - "clear"
c650: 20 2d 20 22 72 65 6d 6f 76 65 22 20 2d 20 22 73   - "remove" - "s
c660: 65 74 22 20 7b 0a 20 20 20 20 20 20 20 20 20 20  et" {.          
c670: 20 20 65 76 65 6e 74 20 67 65 6e 65 72 61 74 65    event generate
c680: 20 24 70 61 74 68 20 3c 3c 4c 69 73 74 62 6f 78   $path <<Listbox
c690: 53 65 6c 65 63 74 3e 3e 0a 20 20 20 20 20 20 20  Select>>.       
c6a0: 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 70 72 6f   }.    }.}...pro
c6b0: 63 20 4c 69 73 74 42 6f 78 3a 3a 5f 67 65 74 5f  c ListBox::_get_
c6c0: 63 75 72 72 65 6e 74 20 7b 20 70 61 74 68 20 7d  current { path }
c6d0: 20 7b 0a 20 20 20 20 73 65 74 20 74 20 5b 24 70   {.    set t [$p
c6e0: 61 74 68 2e 63 20 67 65 74 74 61 67 73 20 63 75  ath.c gettags cu
c6f0: 72 72 65 6e 74 5d 0a 20 20 20 20 72 65 74 75 72  rrent].    retur
c700: 6e 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  n [string range 
c710: 5b 6c 69 6e 64 65 78 20 24 74 20 31 5d 20 32 20  [lindex $t 1] 2 
c720: 65 6e 64 5d 0a 7d 0a 0a 0a 23 20 4c 69 73 74 42  end].}...# ListB
c730: 6f 78 3a 3a 5f 64 72 61 67 5f 61 6e 64 5f 64 72  ox::_drag_and_dr
c740: 6f 70 20 2d 2d 0a 23 0a 23 09 41 20 64 65 66 61  op --.#.#.A defa
c750: 75 6c 74 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 68  ult command to h
c760: 61 6e 64 6c 65 20 64 72 61 67 2d 61 6e 64 2d 64  andle drag-and-d
c770: 72 6f 70 20 66 75 6e 63 74 69 6f 6e 73 20 6c 6f  rop functions lo
c780: 63 61 6c 20 74 6f 20 74 68 69 73 0a 23 20 20 20  cal to this.#   
c790: 20 20 20 20 6c 69 73 74 62 6f 78 2e 20 20 57 69      listbox.  Wi
c7a0: 74 68 20 74 68 69 73 20 61 73 20 74 68 65 20 64  th this as the d
c7b0: 65 66 61 75 6c 74 20 2d 64 72 6f 70 63 6d 64 2c  efault -dropcmd,
c7c0: 20 74 68 65 20 75 73 65 72 20 63 61 6e 20 73 69   the user can si
c7d0: 6d 70 6c 79 0a 23 20 20 20 20 20 20 20 65 6e 61  mply.#       ena
c7e0: 62 6c 65 20 64 72 61 67 2d 61 6e 64 2d 64 72 6f  ble drag-and-dro
c7f0: 70 20 61 6e 64 20 62 65 20 61 62 6c 65 20 74 6f  p and be able to
c800: 20 6d 6f 76 65 20 69 74 65 6d 73 20 77 69 74 68   move items with
c810: 69 6e 20 74 68 69 73 20 6c 69 73 74 0a 23 20 20  in this list.#  
c820: 20 20 20 20 20 77 69 74 68 20 6e 6f 20 66 75 72       with no fur
c830: 74 68 65 72 20 63 6f 64 65 2e 0a 23 0a 23 20 41  ther code..#.# A
c840: 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20 20 20 20  rguments:.#     
c850: 20 20 53 74 61 6e 64 61 72 64 20 61 72 67 75 6d    Standard argum
c860: 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 61  ents passed to a
c870: 20 64 72 6f 70 63 6d 64 2e 0a 23 0a 23 20 52 65   dropcmd..#.# Re
c880: 73 75 6c 74 73 3a 0a 23 09 6e 6f 6e 65 0a 70 72  sults:.#.none.pr
c890: 6f 63 20 4c 69 73 74 42 6f 78 3a 3a 5f 64 72 61  oc ListBox::_dra
c8a0: 67 5f 61 6e 64 5f 64 72 6f 70 20 7b 20 70 61 74  g_and_drop { pat
c8b0: 68 20 66 72 6f 6d 20 65 6e 64 49 74 65 6d 20 6f  h from endItem o
c8c0: 70 65 72 61 74 69 6f 6e 20 74 79 70 65 20 73 74  peration type st
c8d0: 61 72 74 49 74 65 6d 20 7d 20 7b 0a 20 20 20 20  artItem } {.    
c8e0: 73 65 74 20 69 74 65 6d 73 20 5b 24 70 61 74 68  set items [$path
c8f0: 20 69 74 65 6d 73 5d 0a 0a 20 20 20 20 23 23 20   items]..    ## 
c900: 54 68 69 73 20 70 72 6f 63 20 6f 6e 6c 79 20 68  This proc only h
c910: 61 6e 64 6c 65 73 20 64 72 61 67 2d 61 6e 64 2d  andles drag-and-
c920: 64 72 6f 70 20 63 6f 6d 6d 61 6e 64 73 20 77 69  drop commands wi
c930: 74 68 69 6e 20 69 74 73 65 6c 66 2e 0a 20 20 20  thin itself..   
c940: 20 23 23 20 49 66 20 74 68 65 20 77 69 64 67 65   ## If the widge
c950: 74 20 74 68 69 73 20 63 61 6d 65 20 66 72 6f 6d  t this came from
c960: 20 69 73 20 6e 6f 74 20 6f 75 72 20 77 69 64 67   is not our widg
c970: 65 74 20 28 6d 69 6e 75 73 20 74 68 65 20 63 61  et (minus the ca
c980: 6e 76 61 73 29 2c 0a 20 20 20 20 23 23 20 77 65  nvas),.    ## we
c990: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 64   don't want to d
c9a0: 6f 20 61 6e 79 74 68 69 6e 67 2e 20 20 54 68 65  o anything.  The
c9b0: 79 20 6e 65 65 64 20 74 6f 20 68 61 6e 64 6c 65  y need to handle
c9c0: 20 74 68 69 73 20 74 68 65 6d 73 65 6c 76 65 73   this themselves
c9d0: 2e 0a 20 20 20 20 69 66 20 7b 5b 77 69 6e 66 6f  ..    if {[winfo
c9e0: 20 70 61 72 65 6e 74 20 24 66 72 6f 6d 5d 20 21   parent $from] !
c9f0: 3d 20 24 70 61 74 68 7d 20 7b 20 72 65 74 75 72  = $path} { retur
ca00: 6e 20 7d 0a 0a 20 20 20 20 73 65 74 20 70 6c 61  n }..    set pla
ca10: 63 65 20 5b 6c 69 6e 64 65 78 20 24 65 6e 64 49  ce [lindex $endI
ca20: 74 65 6d 20 30 5d 0a 20 20 20 20 73 65 74 20 69  tem 0].    set i
ca30: 20 20 20 20 20 5b 6c 69 6e 64 65 78 20 24 65 6e       [lindex $en
ca40: 64 49 74 65 6d 20 31 5d 0a 0a 20 20 20 20 73 77  dItem 1]..    sw
ca50: 69 74 63 68 20 2d 2d 20 24 70 6c 61 63 65 20 7b  itch -- $place {
ca60: 0a 20 20 20 20 20 20 20 20 22 70 6f 73 69 74 69  .        "positi
ca70: 6f 6e 22 20 7b 0a 20 20 20 20 20 20 20 20 20 20  on" {.          
ca80: 20 20 73 65 74 20 69 64 78 20 24 69 0a 20 20 20    set idx $i.   
ca90: 20 20 20 20 20 7d 20 0a 0a 20 20 20 20 20 20 20       } ..       
caa0: 20 22 69 74 65 6d 22 20 7b 0a 20 20 20 20 20 20   "item" {.      
cab0: 20 20 20 20 20 20 73 65 74 20 69 64 78 20 5b 24        set idx [$
cac0: 70 61 74 68 20 69 6e 64 65 78 20 24 69 5d 0a 20  path index $i]. 
cad0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
cae0: 20 20 20 20 69 66 20 7b 24 69 64 78 20 3e 20 5b      if {$idx > [
caf0: 24 70 61 74 68 20 69 6e 64 65 78 20 24 73 74 61  $path index $sta
cb00: 72 74 49 74 65 6d 5d 7d 20 7b 20 69 6e 63 72 20  rtItem]} { incr 
cb10: 69 64 78 20 2d 31 20 7d 0a 0a 20 20 20 20 69 66  idx -1 }..    if
cb20: 20 7b 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20   {[string equal 
cb30: 24 6f 70 65 72 61 74 69 6f 6e 20 22 63 6f 70 79  $operation "copy
cb40: 22 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65  "]} {.        se
cb50: 74 20 6f 70 74 69 6f 6e 73 20 5b 57 69 64 67 65  t options [Widge
cb60: 74 3a 3a 6f 70 74 69 6f 6e 73 20 24 70 61 74 68  t::options $path
cb70: 2e 24 73 74 61 72 74 49 74 65 6d 5d 0a 20 20 20  .$startItem].   
cb80: 20 20 20 20 20 65 76 61 6c 20 5b 6c 69 6e 73 65       eval [linse
cb90: 72 74 20 24 6f 70 74 69 6f 6e 73 20 30 20 24 70  rt $options 0 $p
cba0: 61 74 68 20 69 6e 73 65 72 74 20 24 69 64 78 20  ath insert $idx 
cbb0: 24 73 74 61 72 74 49 74 65 6d 5c 23 61 75 74 6f  $startItem\#auto
cbc0: 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ].    } else {. 
cbd0: 20 20 20 20 20 20 20 24 70 61 74 68 20 6d 6f 76         $path mov
cbe0: 65 20 24 73 74 61 72 74 49 74 65 6d 20 24 69 64  e $startItem $id
cbf0: 78 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 70 72 6f 63  x.    }.}...proc
cc00: 20 4c 69 73 74 42 6f 78 3a 3a 5f 6b 65 79 62 6f   ListBox::_keybo
cc10: 61 72 64 5f 6e 61 76 69 67 61 74 69 6f 6e 20 7b  ard_navigation {
cc20: 20 70 61 74 68 20 64 69 72 20 7d 20 7b 0a 20 20   path dir } {.  
cc30: 20 20 76 61 72 69 61 62 6c 65 20 24 70 61 74 68    variable $path
cc40: 0a 20 20 20 20 75 70 76 61 72 20 30 20 20 24 70  .    upvar 0  $p
cc50: 61 74 68 20 64 61 74 61 0a 0a 20 20 20 20 73 65  ath data..    se
cc60: 74 20 73 65 6c 20 5b 24 70 61 74 68 20 69 6e 64  t sel [$path ind
cc70: 65 78 20 5b 6c 69 6e 64 65 78 20 5b 24 70 61 74  ex [lindex [$pat
cc80: 68 20 73 65 6c 65 63 74 69 6f 6e 20 67 65 74 5d  h selection get]
cc90: 20 65 6e 64 5d 5d 0a 20 20 20 20 69 66 20 7b 24   end]].    if {$
cca0: 64 69 72 20 3e 20 30 7d 20 7b 0a 09 69 6e 63 72  dir > 0} {..incr
ccb0: 20 73 65 6c 0a 09 69 66 20 7b 24 73 65 6c 20 3e   sel..if {$sel >
ccc0: 3d 20 5b 6c 6c 65 6e 67 74 68 20 24 64 61 74 61  = [llength $data
ccd0: 28 69 74 65 6d 73 29 5d 7d 20 7b 20 72 65 74 75  (items)]} { retu
cce0: 72 6e 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  rn }.    } else 
ccf0: 7b 0a 09 69 6e 63 72 20 73 65 6c 20 2d 31 0a 09  {..incr sel -1..
cd00: 69 66 20 7b 24 73 65 6c 20 3c 20 30 7d 20 7b 20  if {$sel < 0} { 
cd10: 72 65 74 75 72 6e 20 7d 0a 20 20 20 20 7d 0a 20  return }.    }. 
cd20: 20 20 20 73 65 74 20 69 74 65 6d 20 5b 6c 69 6e     set item [lin
cd30: 64 65 78 20 24 64 61 74 61 28 69 74 65 6d 73 29  dex $data(items)
cd40: 20 24 73 65 6c 5d 0a 20 20 20 20 24 70 61 74 68   $sel].    $path
cd50: 20 73 65 65 20 24 69 74 65 6d 0a 20 20 20 20 5f   see $item.    _
cd60: 6d 6f 75 73 65 5f 73 65 6c 65 63 74 20 24 70 61  mouse_select $pa
cd70: 74 68 20 73 65 74 20 24 69 74 65 6d 0a 7d 0a     th set $item.}.