TextSweep

Hex Artifact Content
Login

Artifact 2887f38129f84cdedd5c4ebf12e24a63dfa5edda:


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 74 72 65 65 2e 74 63 6c 0a 23 20 20 54 68    tree.tcl.#  Th
0060: 69 73 20 66 69 6c 65 20 69 73 20 70 61 72 74 20  is file is part 
0070: 6f 66 20 55 6e 69 66 69 78 20 42 57 69 64 67 65  of Unifix BWidge
0080: 74 20 54 6f 6f 6c 6b 69 74 0a 23 20 20 24 49 64  t Toolkit.#  $Id
0090: 3a 20 74 72 65 65 2e 74 63 6c 2c 76 20 31 2e 36  : tree.tcl,v 1.6
00a0: 30 2e 32 2e 34 20 32 30 31 31 2f 30 36 2f 32 33  0.2.4 2011/06/23
00b0: 20 30 38 3a 32 38 3a 30 34 20 6f 65 68 68 61 72   08:28:04 oehhar
00c0: 20 45 78 70 20 24 0a 23 20 2d 2d 2d 2d 2d 2d 2d   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 0a 23 20 20 49 6e 64 65 78 20 6f  -----.#  Index o
0120: 66 20 63 6f 6d 6d 61 6e 64 73 3a 0a 23 20 20 20  f commands:.#   
0130: 20 20 2d 20 54 72 65 65 3a 3a 63 72 65 61 74 65    - Tree::create
0140: 0a 23 20 20 20 20 20 2d 20 54 72 65 65 3a 3a 63  .#     - Tree::c
0150: 6f 6e 66 69 67 75 72 65 0a 23 20 20 20 20 20 2d  onfigure.#     -
0160: 20 54 72 65 65 3a 3a 63 67 65 74 0a 23 20 20 20   Tree::cget.#   
0170: 20 20 2d 20 54 72 65 65 3a 3a 69 6e 73 65 72 74    - Tree::insert
0180: 0a 23 20 20 20 20 20 2d 20 54 72 65 65 3a 3a 69  .#     - Tree::i
0190: 74 65 6d 63 6f 6e 66 69 67 75 72 65 0a 23 20 20  temconfigure.#  
01a0: 20 20 20 2d 20 54 72 65 65 3a 3a 69 74 65 6d 63     - Tree::itemc
01b0: 67 65 74 0a 23 20 20 20 20 20 2d 20 54 72 65 65  get.#     - Tree
01c0: 3a 3a 62 69 6e 64 41 72 65 61 0a 23 20 20 20 20  ::bindArea.#    
01d0: 20 2d 20 54 72 65 65 3a 3a 62 69 6e 64 54 65 78   - Tree::bindTex
01e0: 74 0a 23 20 20 20 20 20 2d 20 54 72 65 65 3a 3a  t.#     - Tree::
01f0: 62 69 6e 64 49 6d 61 67 65 0a 23 20 20 20 20 20  bindImage.#     
0200: 2d 20 54 72 65 65 3a 3a 64 65 6c 65 74 65 0a 23  - Tree::delete.#
0210: 20 20 20 20 20 2d 20 54 72 65 65 3a 3a 6d 6f 76       - Tree::mov
0220: 65 0a 23 20 20 20 20 20 2d 20 54 72 65 65 3a 3a  e.#     - Tree::
0230: 72 65 6f 72 64 65 72 0a 23 20 20 20 20 20 2d 20  reorder.#     - 
0240: 54 72 65 65 3a 3a 73 65 6c 65 63 74 69 6f 6e 0a  Tree::selection.
0250: 23 20 20 20 20 20 2d 20 54 72 65 65 3a 3a 65 78  #     - Tree::ex
0260: 69 73 74 73 0a 23 20 20 20 20 20 2d 20 54 72 65  ists.#     - Tre
0270: 65 3a 3a 70 61 72 65 6e 74 0a 23 20 20 20 20 20  e::parent.#     
0280: 2d 20 54 72 65 65 3a 3a 69 6e 64 65 78 0a 23 20  - Tree::index.# 
0290: 20 20 20 20 2d 20 54 72 65 65 3a 3a 6e 6f 64 65      - Tree::node
02a0: 73 0a 23 20 20 20 20 20 2d 20 54 72 65 65 3a 3a  s.#     - Tree::
02b0: 73 65 65 0a 23 20 20 20 20 20 2d 20 54 72 65 65  see.#     - Tree
02c0: 3a 3a 6f 70 65 6e 74 72 65 65 0a 23 20 20 20 20  ::opentree.#    
02d0: 20 2d 20 54 72 65 65 3a 3a 63 6c 6f 73 65 74 72   - Tree::closetr
02e0: 65 65 0a 23 20 20 20 20 20 2d 20 54 72 65 65 3a  ee.#     - Tree:
02f0: 3a 65 64 69 74 0a 23 20 20 20 20 20 2d 20 54 72  :edit.#     - Tr
0300: 65 65 3a 3a 78 76 69 65 77 0a 23 20 20 20 20 20  ee::xview.#     
0310: 2d 20 54 72 65 65 3a 3a 79 76 69 65 77 0a 23 20  - Tree::yview.# 
0320: 20 20 20 20 2d 20 54 72 65 65 3a 3a 5f 75 70 64      - Tree::_upd
0330: 61 74 65 5f 65 64 69 74 5f 73 69 7a 65 0a 23 20  ate_edit_size.# 
0340: 20 20 20 20 2d 20 54 72 65 65 3a 3a 5f 64 65 73      - Tree::_des
0350: 74 72 6f 79 0a 23 20 20 20 20 20 2d 20 54 72 65  troy.#     - Tre
0360: 65 3a 3a 5f 73 65 65 0a 23 20 20 20 20 20 2d 20  e::_see.#     - 
0370: 54 72 65 65 3a 3a 5f 72 65 63 65 78 70 61 6e 64  Tree::_recexpand
0380: 0a 23 20 20 20 20 20 2d 20 54 72 65 65 3a 3a 5f  .#     - Tree::_
0390: 73 75 62 64 65 6c 65 74 65 0a 23 20 20 20 20 20  subdelete.#     
03a0: 2d 20 54 72 65 65 3a 3a 5f 75 70 64 61 74 65 5f  - Tree::_update_
03b0: 73 63 72 6f 6c 6c 72 65 67 69 6f 6e 0a 23 20 20  scrollregion.#  
03c0: 20 20 20 2d 20 54 72 65 65 3a 3a 5f 63 72 6f 73     - Tree::_cros
03d0: 73 5f 65 76 65 6e 74 0a 23 20 20 20 20 20 2d 20  s_event.#     - 
03e0: 54 72 65 65 3a 3a 5f 64 72 61 77 5f 6e 6f 64 65  Tree::_draw_node
03f0: 0a 23 20 20 20 20 20 2d 20 54 72 65 65 3a 3a 5f  .#     - Tree::_
0400: 64 72 61 77 5f 73 75 62 6e 6f 64 65 73 0a 23 20  draw_subnodes.# 
0410: 20 20 20 20 2d 20 54 72 65 65 3a 3a 5f 75 70 64      - Tree::_upd
0420: 61 74 65 5f 6e 6f 64 65 73 0a 23 20 20 20 20 20  ate_nodes.#     
0430: 2d 20 54 72 65 65 3a 3a 5f 64 72 61 77 5f 74 72  - Tree::_draw_tr
0440: 65 65 0a 23 20 20 20 20 20 2d 20 54 72 65 65 3a  ee.#     - Tree:
0450: 3a 5f 72 65 64 72 61 77 5f 74 72 65 65 0a 23 20  :_redraw_tree.# 
0460: 20 20 20 20 2d 20 54 72 65 65 3a 3a 5f 72 65 64      - Tree::_red
0470: 72 61 77 5f 73 65 6c 65 63 74 69 6f 6e 0a 23 20  raw_selection.# 
0480: 20 20 20 20 2d 20 54 72 65 65 3a 3a 5f 72 65 64      - Tree::_red
0490: 72 61 77 5f 69 64 6c 65 0a 23 20 20 20 20 20 2d  raw_idle.#     -
04a0: 20 54 72 65 65 3a 3a 5f 64 72 61 67 5f 63 6d 64   Tree::_drag_cmd
04b0: 0a 23 20 20 20 20 20 2d 20 54 72 65 65 3a 3a 5f  .#     - Tree::_
04c0: 64 72 6f 70 5f 63 6d 64 0a 23 20 20 20 20 20 2d  drop_cmd.#     -
04d0: 20 54 72 65 65 3a 3a 5f 6f 76 65 72 5f 63 6d 64   Tree::_over_cmd
04e0: 0a 23 20 20 20 20 20 2d 20 54 72 65 65 3a 3a 5f  .#     - Tree::_
04f0: 61 75 74 6f 5f 73 63 72 6f 6c 6c 0a 23 20 20 20  auto_scroll.#   
0500: 20 20 2d 20 54 72 65 65 3a 3a 5f 73 63 72 6f 6c    - Tree::_scrol
0510: 6c 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  l.# ------------
0520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0560: 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c  ..namespace eval
0570: 20 54 72 65 65 20 7b 0a 20 20 20 20 57 69 64 67   Tree {.    Widg
0580: 65 74 3a 3a 64 65 66 69 6e 65 20 54 72 65 65 20  et::define Tree 
0590: 74 72 65 65 20 44 72 61 67 53 69 74 65 20 44 72  tree DragSite Dr
05a0: 6f 70 53 69 74 65 20 44 79 6e 61 6d 69 63 48 65  opSite DynamicHe
05b0: 6c 70 0a 0a 20 20 20 20 6e 61 6d 65 73 70 61 63  lp..    namespac
05c0: 65 20 65 76 61 6c 20 4e 6f 64 65 20 7b 0a 20 20  e eval Node {.  
05d0: 20 20 20 20 20 20 57 69 64 67 65 74 3a 3a 64 65        Widget::de
05e0: 63 6c 61 72 65 20 54 72 65 65 3a 3a 4e 6f 64 65  clare Tree::Node
05f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
0600: 2d 74 65 78 74 20 20 20 20 20 20 20 53 74 72 69  -text       Stri
0610: 6e 67 20 20 20 20 20 22 22 20 20 20 20 20 20 30  ng     ""      0
0620: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 2d  }.            {-
0630: 66 6f 6e 74 20 20 20 20 20 20 20 54 6b 52 65 73  font       TkRes
0640: 6f 75 72 63 65 20 22 22 20 20 20 20 20 20 30 20  ource ""      0 
0650: 6c 69 73 74 62 6f 78 7d 0a 20 20 20 20 20 20 20  listbox}.       
0660: 20 20 20 20 20 7b 2d 69 6d 61 67 65 20 20 20 20       {-image    
0670: 20 20 54 6b 52 65 73 6f 75 72 63 65 20 22 22 20    TkResource "" 
0680: 20 20 20 20 20 30 20 6c 61 62 65 6c 7d 0a 20 20       0 label}.  
0690: 20 20 20 20 20 20 20 20 20 20 7b 2d 77 69 6e 64            {-wind
06a0: 6f 77 20 20 20 20 20 53 74 72 69 6e 67 20 20 20  ow     String   
06b0: 20 20 22 22 20 20 20 20 20 20 30 7d 0a 20 20 20    ""      0}.   
06c0: 20 20 20 20 20 20 20 20 20 7b 2d 66 69 6c 6c 20           {-fill 
06d0: 20 20 20 20 20 20 54 6b 52 65 73 6f 75 72 63 65        TkResource
06e0: 20 62 6c 61 63 6b 20 20 20 30 20 7b 6c 69 73 74   black   0 {list
06f0: 62 6f 78 20 2d 66 6f 72 65 67 72 6f 75 6e 64 7d  box -foreground}
0700: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 2d  }.            {-
0710: 64 61 74 61 20 20 20 20 20 20 20 53 74 72 69 6e  data       Strin
0720: 67 20 20 20 20 20 22 22 20 20 20 20 20 20 30 7d  g     ""      0}
0730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 2d 6f  .            {-o
0740: 70 65 6e 20 20 20 20 20 20 20 42 6f 6f 6c 65 61  pen       Boolea
0750: 6e 20 20 20 20 30 20 20 20 20 20 20 20 30 7d 0a  n    0       0}.
0760: 09 20 20 20 20 7b 2d 73 65 6c 65 63 74 61 62 6c  .    {-selectabl
0770: 65 20 42 6f 6f 6c 65 61 6e 20 20 20 20 31 20 20  e Boolean    1  
0780: 20 20 20 20 20 30 7d 0a 20 20 20 20 20 20 20 20       0}.        
0790: 20 20 20 20 7b 2d 64 72 61 77 63 72 6f 73 73 20      {-drawcross 
07a0: 20 45 6e 75 6d 20 20 20 20 20 20 20 61 75 74 6f   Enum       auto
07b0: 20 20 20 20 30 20 7b 61 75 74 6f 20 61 6c 77 61      0 {auto alwa
07c0: 79 73 20 6e 65 76 65 72 20 61 6c 6c 77 61 79 73  ys never allways
07d0: 7d 7d 0a 09 20 20 20 20 7b 2d 70 61 64 78 20 20  }}..    {-padx  
07e0: 20 20 20 20 20 49 6e 74 20 20 20 20 20 20 20 20       Int        
07f0: 2d 31 20 20 20 20 20 20 30 20 22 25 64 20 3e 3d  -1      0 "%d >=
0800: 20 2d 31 22 7d 0a 09 20 20 20 20 7b 2d 64 65 6c   -1"}..    {-del
0810: 74 61 78 20 20 20 20 20 49 6e 74 20 20 20 20 20  tax     Int     
0820: 20 20 20 2d 31 20 20 20 20 20 20 30 20 22 25 64     -1      0 "%d
0830: 20 3e 3d 20 2d 31 22 7d 0a 09 20 20 20 20 7b 2d   >= -1"}..    {-
0840: 61 6e 63 68 6f 72 20 20 20 20 20 53 74 72 69 6e  anchor     Strin
0850: 67 20 20 20 20 20 22 77 22 20 20 20 20 20 30 20  g     "w"     0 
0860: 22 22 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ""}.        }.  
0870: 20 20 7d 0a 0a 20 20 20 20 44 79 6e 61 6d 69 63    }..    Dynamic
0880: 48 65 6c 70 3a 3a 69 6e 63 6c 75 64 65 20 54 72  Help::include Tr
0890: 65 65 3a 3a 4e 6f 64 65 20 62 61 6c 6c 6f 6f 6e  ee::Node balloon
08a0: 0a 0a 20 20 20 20 57 69 64 67 65 74 3a 3a 74 6b  ..    Widget::tk
08b0: 69 6e 63 6c 75 64 65 20 54 72 65 65 20 63 61 6e  include Tree can
08c0: 76 61 73 20 2e 63 20 5c 0a 09 20 20 20 20 72 65  vas .c \..    re
08d0: 6d 6f 76 65 20 20 20 20 20 7b 0a 09 2d 69 6e 73  move     {..-ins
08e0: 65 72 74 77 69 64 74 68 20 2d 69 6e 73 65 72 74  ertwidth -insert
08f0: 62 61 63 6b 67 72 6f 75 6e 64 20 2d 69 6e 73 65  background -inse
0900: 72 74 62 6f 72 64 65 72 77 69 64 74 68 20 2d 69  rtborderwidth -i
0910: 6e 73 65 72 74 6f 66 66 74 69 6d 65 0a 09 2d 69  nsertofftime..-i
0920: 6e 73 65 72 74 6f 6e 74 69 6d 65 20 2d 73 65 6c  nsertontime -sel
0930: 65 63 74 62 6f 72 64 65 72 77 69 64 74 68 20 2d  ectborderwidth -
0940: 63 6c 6f 73 65 65 6e 6f 75 67 68 20 2d 63 6f 6e  closeenough -con
0950: 66 69 6e 65 20 2d 73 63 72 6f 6c 6c 72 65 67 69  fine -scrollregi
0960: 6f 6e 0a 09 2d 78 73 63 72 6f 6c 6c 69 6e 63 72  on..-xscrollincr
0970: 65 6d 65 6e 74 20 2d 79 73 63 72 6f 6c 6c 69 6e  ement -yscrollin
0980: 63 72 65 6d 65 6e 74 20 2d 77 69 64 74 68 20 2d  crement -width -
0990: 68 65 69 67 68 74 0a 20 20 20 20 7d 20 5c 0a 09  height.    } \..
09a0: 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 20 7b      initialize {
09b0: 0a 09 2d 72 65 6c 69 65 66 20 73 75 6e 6b 65 6e  ..-relief sunken
09c0: 20 2d 62 6f 72 64 65 72 77 69 64 74 68 20 32 20   -borderwidth 2 
09d0: 2d 74 61 6b 65 66 6f 63 75 73 20 31 0a 09 2d 68  -takefocus 1..-h
09e0: 69 67 68 6c 69 67 68 74 74 68 69 63 6b 6e 65 73  ighlightthicknes
09f0: 73 20 31 20 2d 77 69 64 74 68 20 32 30 30 0a 20  s 1 -width 200. 
0a00: 20 20 20 7d 0a 0a 20 20 20 20 57 69 64 67 65 74     }..    Widget
0a10: 3a 3a 64 65 63 6c 61 72 65 20 54 72 65 65 20 7b  ::declare Tree {
0a20: 0a 20 20 20 20 20 20 20 20 7b 2d 64 65 6c 74 61  .        {-delta
0a30: 78 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 20  x           Int 
0a40: 31 30 20 30 20 22 25 64 20 3e 3d 20 30 22 7d 0a  10 0 "%d >= 0"}.
0a50: 20 20 20 20 20 20 20 20 7b 2d 64 65 6c 74 61 79          {-deltay
0a60: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 20 31             Int 1
0a70: 35 20 30 20 22 25 64 20 3e 3d 20 30 22 7d 0a 20  5 0 "%d >= 0"}. 
0a80: 20 20 20 20 20 20 20 7b 2d 70 61 64 78 20 20 20         {-padx   
0a90: 20 20 20 20 20 20 20 20 20 20 49 6e 74 20 32 30            Int 20
0aa0: 20 30 20 22 25 64 20 3e 3d 20 30 22 7d 0a 20 20   0 "%d >= 0"}.  
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 09 7b 2d 73 65 6c   listbox}..{-sel
0b50: 65 63 74 63 6f 6d 6d 61 6e 64 20 20 20 20 53 74  ectcommand    St
0b60: 72 69 6e 67 20 20 20 20 20 22 22 20 30 7d 0a 20  ring     "" 0}. 
0b70: 20 20 20 20 20 20 20 7b 2d 77 69 64 74 68 20 20         {-width  
0b80: 20 20 20 20 20 20 20 20 20 20 54 6b 52 65 73 6f            TkReso
0b90: 75 72 63 65 20 22 22 20 30 20 6c 69 73 74 62 6f  urce "" 0 listbo
0ba0: 78 7d 0a 20 20 20 20 20 20 20 20 7b 2d 68 65 69  x}.        {-hei
0bb0: 67 68 74 20 20 20 20 20 20 20 20 20 20 20 54 6b  ght           Tk
0bc0: 52 65 73 6f 75 72 63 65 20 22 22 20 30 20 6c 69  Resource "" 0 li
0bd0: 73 74 62 6f 78 7d 0a 20 20 20 20 20 20 20 20 7b  stbox}.        {
0be0: 2d 73 65 6c 65 63 74 66 69 6c 6c 20 20 20 20 20  -selectfill     
0bf0: 20 20 42 6f 6f 6c 65 61 6e 20 30 20 20 30 7d 0a    Boolean 0  0}.
0c00: 20 20 20 20 20 20 20 20 7b 2d 73 68 6f 77 6c 69          {-showli
0c10: 6e 65 73 20 20 20 20 20 20 20 20 42 6f 6f 6c 65  nes        Boole
0c20: 61 6e 20 31 20 20 30 7d 0a 20 20 20 20 20 20 20  an 1  0}.       
0c30: 20 7b 2d 6c 69 6e 65 73 66 69 6c 6c 20 20 20 20   {-linesfill    
0c40: 20 20 20 20 54 6b 52 65 73 6f 75 72 63 65 20 62      TkResource b
0c50: 6c 61 63 6b 20 20 30 20 7b 6c 69 73 74 62 6f 78  lack  0 {listbox
0c60: 20 2d 66 6f 72 65 67 72 6f 75 6e 64 7d 7d 0a 20   -foreground}}. 
0c70: 20 20 20 20 20 20 20 7b 2d 6c 69 6e 65 73 74 69         {-linesti
0c80: 70 70 6c 65 20 20 20 20 20 20 54 6b 52 65 73 6f  pple      TkReso
0c90: 75 72 63 65 20 22 22 20 20 20 20 20 30 20 7b 6c  urce ""     0 {l
0ca0: 61 62 65 6c 20 2d 62 69 74 6d 61 70 7d 7d 0a 09  abel -bitmap}}..
0cb0: 7b 2d 63 72 6f 73 73 66 69 6c 6c 20 20 20 20 20  {-crossfill     
0cc0: 20 20 20 54 6b 52 65 73 6f 75 72 63 65 20 62 6c     TkResource bl
0cd0: 61 63 6b 20 20 30 20 7b 6c 69 73 74 62 6f 78 20  ack  0 {listbox 
0ce0: 2d 66 6f 72 65 67 72 6f 75 6e 64 7d 7d 0a 20 20  -foreground}}.  
0cf0: 20 20 20 20 20 20 7b 2d 72 65 64 72 61 77 20 20        {-redraw  
0d00: 20 20 20 20 20 20 20 20 20 42 6f 6f 6c 65 61 6e           Boolean
0d10: 20 31 20 20 30 7d 0a 20 20 20 20 20 20 20 20 7b   1  0}.        {
0d20: 2d 6f 70 65 6e 63 6d 64 20 20 20 20 20 20 20 20  -opencmd        
0d30: 20 20 53 74 72 69 6e 67 20 20 22 22 20 30 7d 0a    String  "" 0}.
0d40: 20 20 20 20 20 20 20 20 7b 2d 63 6c 6f 73 65 63          {-closec
0d50: 6d 64 20 20 20 20 20 20 20 20 20 53 74 72 69 6e  md         Strin
0d60: 67 20 20 22 22 20 30 7d 0a 20 20 20 20 20 20 20  g  "" 0}.       
0d70: 20 7b 2d 64 72 6f 70 6f 76 65 72 6d 6f 64 65 20   {-dropovermode 
0d80: 20 20 20 20 46 6c 61 67 20 20 20 20 22 77 70 6e      Flag    "wpn
0d90: 22 20 30 20 22 77 70 6e 22 7d 0a 20 20 20 20 20  " 0 "wpn"}.     
0da0: 20 20 20 7b 2d 62 67 20 20 20 20 20 20 20 20 20     {-bg         
0db0: 20 20 20 20 20 20 53 79 6e 6f 6e 79 6d 20 2d 62        Synonym -b
0dc0: 61 63 6b 67 72 6f 75 6e 64 7d 0a 0a 20 20 20 20  ackground}..    
0dd0: 20 20 20 20 7b 2d 63 72 6f 73 73 6f 70 65 6e 69      {-crossopeni
0de0: 6d 61 67 65 20 20 20 20 53 74 72 69 6e 67 20 20  mage    String  
0df0: 22 22 20 20 30 7d 0a 20 20 20 20 20 20 20 20 7b  ""  0}.        {
0e00: 2d 63 72 6f 73 73 63 6c 6f 73 65 69 6d 61 67 65  -crosscloseimage
0e10: 20 20 20 53 74 72 69 6e 67 20 20 22 22 20 20 30     String  ""  0
0e20: 7d 0a 20 20 20 20 20 20 20 20 7b 2d 63 72 6f 73  }.        {-cros
0e30: 73 6f 70 65 6e 62 69 74 6d 61 70 20 20 20 53 74  sopenbitmap   St
0e40: 72 69 6e 67 20 20 22 22 20 20 30 7d 0a 20 20 20  ring  ""  0}.   
0e50: 20 20 20 20 20 7b 2d 63 72 6f 73 73 63 6c 6f 73       {-crossclos
0e60: 65 62 69 74 6d 61 70 20 20 53 74 72 69 6e 67 20  ebitmap  String 
0e70: 20 22 22 20 20 30 7d 0a 20 20 20 20 7d 0a 0a 20   ""  0}.    }.. 
0e80: 20 20 20 44 72 61 67 53 69 74 65 3a 3a 69 6e 63     DragSite::inc
0e90: 6c 75 64 65 20 54 72 65 65 20 22 54 52 45 45 5f  lude Tree "TREE_
0ea0: 4e 4f 44 45 22 20 31 0a 20 20 20 20 44 72 6f 70  NODE" 1.    Drop
0eb0: 53 69 74 65 3a 3a 69 6e 63 6c 75 64 65 20 54 72  Site::include Tr
0ec0: 65 65 20 7b 0a 20 20 20 20 20 20 20 20 54 52 45  ee {.        TRE
0ed0: 45 5f 4e 4f 44 45 20 7b 63 6f 70 79 20 7b 7d 20  E_NODE {copy {} 
0ee0: 6d 6f 76 65 20 7b 7d 7d 0a 20 20 20 20 7d 0a 0a  move {}}.    }..
0ef0: 20 20 20 20 57 69 64 67 65 74 3a 3a 61 64 64 6d      Widget::addm
0f00: 61 70 20 54 72 65 65 20 22 22 20 2e 63 20 7b 2d  ap Tree "" .c {-
0f10: 64 65 6c 74 61 79 20 2d 79 73 63 72 6f 6c 6c 69  deltay -yscrolli
0f20: 6e 63 72 65 6d 65 6e 74 7d 0a 0a 20 20 20 20 23  ncrement}..    #
0f30: 20 54 72 65 65 73 20 6f 6e 20 77 69 6e 64 6f 77   Trees on window
0f40: 73 20 68 61 76 65 20 61 20 77 68 69 74 65 20 28  s have a white (
0f50: 73 79 73 74 65 6d 20 77 69 6e 64 6f 77 29 20 62  system window) b
0f60: 61 63 6b 67 72 6f 75 6e 64 0a 20 20 20 20 69 66  ackground.    if
0f70: 20 7b 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f   { $::tcl_platfo
0f80: 72 6d 28 70 6c 61 74 66 6f 72 6d 29 20 3d 3d 20  rm(platform) == 
0f90: 22 77 69 6e 64 6f 77 73 22 20 7d 20 7b 0a 09 6f  "windows" } {..o
0fa0: 70 74 69 6f 6e 20 61 64 64 20 2a 54 72 65 65 2e  ption add *Tree.
0fb0: 63 2e 62 61 63 6b 67 72 6f 75 6e 64 20 53 79 73  c.background Sys
0fc0: 74 65 6d 57 69 6e 64 6f 77 20 77 69 64 67 65 74  temWindow widget
0fd0: 44 65 66 61 75 6c 74 0a 09 6f 70 74 69 6f 6e 20  Default..option 
0fe0: 61 64 64 20 2a 54 72 65 65 4e 6f 64 65 2e 66 69  add *TreeNode.fi
0ff0: 6c 6c 20 53 79 73 74 65 6d 57 69 6e 64 6f 77 54  ll SystemWindowT
1000: 65 78 74 20 77 69 64 67 65 74 44 65 66 61 75 6c  ext widgetDefaul
1010: 74 0a 20 20 20 20 7d 0a 0a 20 20 20 20 62 69 6e  t.    }..    bin
1020: 64 20 54 72 65 65 20 3c 46 6f 63 75 73 49 6e 3e  d Tree <FocusIn>
1030: 20 20 20 5b 6c 69 73 74 20 61 66 74 65 72 20 69     [list after i
1040: 64 6c 65 20 7b 42 57 69 64 67 65 74 3a 3a 72 65  dle {BWidget::re
1050: 66 6f 63 75 73 20 25 57 20 25 57 2e 63 7d 5d 0a  focus %W %W.c}].
1060: 20 20 20 20 62 69 6e 64 20 54 72 65 65 20 3c 44      bind Tree <D
1070: 65 73 74 72 6f 79 3e 20 20 20 5b 6c 69 73 74 20  estroy>   [list 
1080: 54 72 65 65 3a 3a 5f 64 65 73 74 72 6f 79 20 25  Tree::_destroy %
1090: 57 5d 0a 20 20 20 20 62 69 6e 64 20 54 72 65 65  W].    bind Tree
10a0: 20 3c 43 6f 6e 66 69 67 75 72 65 3e 20 5b 6c 69   <Configure> [li
10b0: 73 74 20 54 72 65 65 3a 3a 5f 75 70 64 61 74 65  st Tree::_update
10c0: 5f 73 63 72 6f 6c 6c 72 65 67 69 6f 6e 20 25 57  _scrollregion %W
10d0: 5d 0a 0a 0a 20 20 20 20 62 69 6e 64 20 54 72 65  ]...    bind Tre
10e0: 65 53 65 6e 74 69 6e 61 6c 53 74 61 72 74 20 3c  eSentinalStart <
10f0: 42 75 74 74 6f 6e 2d 31 3e 20 7b 0a 09 69 66 20  Button-1> {..if 
1100: 7b 20 24 3a 3a 54 72 65 65 3a 3a 73 65 6e 74 69  { $::Tree::senti
1110: 6e 61 6c 28 25 57 29 20 7d 20 7b 0a 09 20 20 20  nal(%W) } {..   
1120: 20 73 65 74 20 3a 3a 54 72 65 65 3a 3a 73 65 6e   set ::Tree::sen
1130: 74 69 6e 61 6c 28 25 57 29 20 30 0a 09 20 20 20  tinal(%W) 0..   
1140: 20 62 72 65 61 6b 0a 09 7d 0a 20 20 20 20 7d 0a   break..}.    }.
1150: 0a 20 20 20 20 62 69 6e 64 20 54 72 65 65 53 65  .    bind TreeSe
1160: 6e 74 69 6e 61 6c 45 6e 64 20 3c 42 75 74 74 6f  ntinalEnd <Butto
1170: 6e 2d 31 3e 20 7b 0a 09 73 65 74 20 3a 3a 54 72  n-1> {..set ::Tr
1180: 65 65 3a 3a 73 65 6e 74 69 6e 61 6c 28 25 57 29  ee::sentinal(%W)
1190: 20 30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 62 69   0.    }..    bi
11a0: 6e 64 20 54 72 65 65 46 6f 63 75 73 20 3c 42 75  nd TreeFocus <Bu
11b0: 74 74 6f 6e 2d 31 3e 20 5b 6c 69 73 74 20 66 6f  tton-1> [list fo
11c0: 63 75 73 20 25 57 5d 0a 0a 20 20 20 20 76 61 72  cus %W]..    var
11d0: 69 61 62 6c 65 20 5f 65 64 69 74 0a 7d 0a 0a 0a  iable _edit.}...
11e0: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
11f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1230: 20 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a 3a    Command Tree::
1240: 63 72 65 61 74 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d  create.# -------
1250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1290: 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72 65 65 3a  -----.proc Tree:
12a0: 3a 63 72 65 61 74 65 20 7b 20 70 61 74 68 20 61  :create { path a
12b0: 72 67 73 20 7d 20 7b 0a 20 20 20 20 76 61 72 69  rgs } {.    vari
12c0: 61 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75  able $path.    u
12d0: 70 76 61 72 20 30 20 20 24 70 61 74 68 20 64 61  pvar 0  $path da
12e0: 74 61 0a 0a 20 20 20 20 57 69 64 67 65 74 3a 3a  ta..    Widget::
12f0: 69 6e 69 74 20 54 72 65 65 20 24 70 61 74 68 20  init Tree $path 
1300: 24 61 72 67 73 0a 20 20 20 20 73 65 74 20 3a 3a  $args.    set ::
1310: 54 72 65 65 3a 3a 73 65 6e 74 69 6e 61 6c 28 24  Tree::sentinal($
1320: 70 61 74 68 2e 63 29 20 30 0a 0a 20 20 20 20 69  path.c) 0..    i
1330: 66 20 7b 5b 57 69 64 67 65 74 3a 3a 63 67 65 74  f {[Widget::cget
1340: 20 24 70 61 74 68 20 2d 63 72 6f 73 73 6f 70 65   $path -crossope
1350: 6e 62 69 74 6d 61 70 5d 20 3d 3d 20 22 22 7d 20  nbitmap] == ""} 
1360: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  {.        set fi
1370: 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 3a  le [file join $:
1380: 3a 42 57 49 44 47 45 54 3a 3a 4c 49 42 52 41 52  :BWIDGET::LIBRAR
1390: 59 20 69 6d 61 67 65 73 20 22 6d 69 6e 75 73 2e  Y images "minus.
13a0: 78 62 6d 22 5d 0a 20 20 20 20 20 20 20 20 57 69  xbm"].        Wi
13b0: 64 67 65 74 3a 3a 63 6f 6e 66 69 67 75 72 65 20  dget::configure 
13c0: 24 70 61 74 68 20 5b 6c 69 73 74 20 2d 63 72 6f  $path [list -cro
13d0: 73 73 6f 70 65 6e 62 69 74 6d 61 70 20 40 24 66  ssopenbitmap @$f
13e0: 69 6c 65 5d 0a 20 20 20 20 7d 0a 20 20 20 20 69  ile].    }.    i
13f0: 66 20 7b 5b 57 69 64 67 65 74 3a 3a 63 67 65 74  f {[Widget::cget
1400: 20 24 70 61 74 68 20 2d 63 72 6f 73 73 63 6c 6f   $path -crossclo
1410: 73 65 62 69 74 6d 61 70 5d 20 3d 3d 20 22 22 7d  sebitmap] == ""}
1420: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 66   {.        set f
1430: 69 6c 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ile [file join $
1440: 3a 3a 42 57 49 44 47 45 54 3a 3a 4c 49 42 52 41  ::BWIDGET::LIBRA
1450: 52 59 20 69 6d 61 67 65 73 20 22 70 6c 75 73 2e  RY images "plus.
1460: 78 62 6d 22 5d 0a 20 20 20 20 20 20 20 20 57 69  xbm"].        Wi
1470: 64 67 65 74 3a 3a 63 6f 6e 66 69 67 75 72 65 20  dget::configure 
1480: 24 70 61 74 68 20 5b 6c 69 73 74 20 2d 63 72 6f  $path [list -cro
1490: 73 73 63 6c 6f 73 65 62 69 74 6d 61 70 20 40 24  ssclosebitmap @$
14a0: 66 69 6c 65 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  file].    }..   
14b0: 20 73 65 74 20 64 61 74 61 28 72 6f 6f 74 29 20   set data(root) 
14c0: 20 20 20 20 20 20 20 20 7b 7b 7d 7d 0a 20 20 20          {{}}.   
14d0: 20 73 65 74 20 64 61 74 61 28 73 65 6c 6e 6f 64   set data(selnod
14e0: 65 73 29 20 20 20 20 20 7b 7d 0a 20 20 20 20 73  es)     {}.    s
14f0: 65 74 20 64 61 74 61 28 75 70 64 2c 6c 65 76 65  et data(upd,leve
1500: 6c 29 20 20 20 20 30 0a 20 20 20 20 73 65 74 20  l)    0.    set 
1510: 64 61 74 61 28 75 70 64 2c 6e 6f 64 65 73 29 20  data(upd,nodes) 
1520: 20 20 20 7b 7d 0a 20 20 20 20 73 65 74 20 64 61     {}.    set da
1530: 74 61 28 75 70 64 2c 61 66 74 65 72 69 64 29 20  ta(upd,afterid) 
1540: 20 22 22 0a 20 20 20 20 73 65 74 20 64 61 74 61   "".    set data
1550: 28 64 6e 64 2c 73 63 72 6f 6c 6c 29 20 20 20 22  (dnd,scroll)   "
1560: 22 0a 20 20 20 20 73 65 74 20 64 61 74 61 28 64  ".    set data(d
1570: 6e 64 2c 61 66 74 65 72 69 64 29 20 20 22 22 0a  nd,afterid)  "".
1580: 20 20 20 20 73 65 74 20 64 61 74 61 28 64 6e 64      set data(dnd
1590: 2c 73 65 6c 6e 6f 64 65 73 29 20 7b 7d 0a 20 20  ,selnodes) {}.  
15a0: 20 20 73 65 74 20 64 61 74 61 28 64 6e 64 2c 6e    set data(dnd,n
15b0: 6f 64 65 29 20 20 20 20 20 22 22 0a 0a 20 20 20  ode)     ""..   
15c0: 20 66 72 61 6d 65 20 24 70 61 74 68 20 2d 63 6c   frame $path -cl
15d0: 61 73 73 20 54 72 65 65 20 2d 62 64 20 30 20 2d  ass Tree -bd 0 -
15e0: 68 69 67 68 6c 69 67 68 74 74 68 69 63 6b 6e 65  highlightthickne
15f0: 73 73 20 30 20 2d 72 65 6c 69 65 66 20 66 6c 61  ss 0 -relief fla
1600: 74 20 5c 0a 09 20 20 20 20 2d 74 61 6b 65 66 6f  t \..    -takefo
1610: 63 75 73 20 30 0a 20 20 20 20 23 20 46 6f 72 20  cus 0.    # For 
1620: 38 2e 34 2b 20 77 65 20 64 6f 6e 27 74 20 77 61  8.4+ we don't wa
1630: 6e 74 20 74 6f 20 69 6e 68 65 72 69 74 20 74 68  nt to inherit th
1640: 65 20 70 61 64 64 69 6e 67 0a 20 20 20 20 63 61  e padding.    ca
1650: 74 63 68 20 7b 24 70 61 74 68 20 63 6f 6e 66 69  tch {$path confi
1660: 67 75 72 65 20 2d 70 61 64 78 20 30 20 2d 70 61  gure -padx 0 -pa
1670: 64 79 20 30 7d 0a 20 20 20 20 65 76 61 6c 20 5b  dy 0}.    eval [
1680: 6c 69 73 74 20 63 61 6e 76 61 73 20 24 70 61 74  list canvas $pat
1690: 68 2e 63 5d 20 5b 57 69 64 67 65 74 3a 3a 73 75  h.c] [Widget::su
16a0: 62 63 67 65 74 20 24 70 61 74 68 20 2e 63 5d 20  bcget $path .c] 
16b0: 2d 78 73 63 72 6f 6c 6c 69 6e 63 72 65 6d 65 6e  -xscrollincremen
16c0: 74 20 38 0a 20 20 20 20 62 69 6e 64 74 61 67 73  t 8.    bindtags
16d0: 20 24 70 61 74 68 2e 63 20 5b 6c 69 73 74 20 54   $path.c [list T
16e0: 72 65 65 53 65 6e 74 69 6e 61 6c 53 74 61 72 74  reeSentinalStart
16f0: 20 54 72 65 65 46 6f 63 75 73 20 24 70 61 74 68   TreeFocus $path
1700: 2e 63 20 43 61 6e 76 61 73 20 5c 0a 09 20 20 20  .c Canvas \..   
1710: 20 5b 77 69 6e 66 6f 20 74 6f 70 6c 65 76 65 6c   [winfo toplevel
1720: 20 24 70 61 74 68 5d 20 61 6c 6c 20 54 72 65 65   $path] all Tree
1730: 53 65 6e 74 69 6e 61 6c 45 6e 64 5d 0a 20 20 20  SentinalEnd].   
1740: 20 70 61 63 6b 20 24 70 61 74 68 2e 63 20 2d 65   pack $path.c -e
1750: 78 70 61 6e 64 20 79 65 73 20 2d 66 69 6c 6c 20  xpand yes -fill 
1760: 62 6f 74 68 0a 20 20 20 20 24 70 61 74 68 2e 63  both.    $path.c
1770: 20 62 69 6e 64 20 63 72 6f 73 73 20 3c 42 75 74   bind cross <But
1780: 74 6f 6e 50 72 65 73 73 2d 31 3e 20 5b 6c 69 73  tonPress-1> [lis
1790: 74 20 54 72 65 65 3a 3a 5f 63 72 6f 73 73 5f 65  t Tree::_cross_e
17a0: 76 65 6e 74 20 24 70 61 74 68 5d 0a 0a 20 20 20  vent $path]..   
17b0: 20 23 20 41 64 64 65 64 20 62 79 20 65 72 69 63   # Added by eric
17c0: 6d 40 73 63 72 69 70 74 69 63 73 2e 63 6f 6d 0a  m@scriptics.com.
17d0: 20 20 20 20 23 20 54 68 65 73 65 20 61 6c 6c 6f      # These allo
17e0: 77 20 6b 65 79 62 6f 61 72 64 20 74 72 61 76 65  w keyboard trave
17f0: 72 73 61 6c 20 6f 66 20 74 68 65 20 74 72 65 65  rsal of the tree
1800: 0a 20 20 20 20 62 69 6e 64 20 24 70 61 74 68 2e  .    bind $path.
1810: 63 20 3c 4b 65 79 50 72 65 73 73 2d 55 70 3e 20  c <KeyPress-Up> 
1820: 20 20 20 5b 6c 69 73 74 20 54 72 65 65 3a 3a 5f     [list Tree::_
1830: 6b 65 79 6e 61 76 20 75 70 20 24 70 61 74 68 5d  keynav up $path]
1840: 0a 20 20 20 20 62 69 6e 64 20 24 70 61 74 68 2e  .    bind $path.
1850: 63 20 3c 4b 65 79 50 72 65 73 73 2d 44 6f 77 6e  c <KeyPress-Down
1860: 3e 20 20 5b 6c 69 73 74 20 54 72 65 65 3a 3a 5f  >  [list Tree::_
1870: 6b 65 79 6e 61 76 20 64 6f 77 6e 20 24 70 61 74  keynav down $pat
1880: 68 5d 0a 20 20 20 20 62 69 6e 64 20 24 70 61 74  h].    bind $pat
1890: 68 2e 63 20 3c 4b 65 79 50 72 65 73 73 2d 52 69  h.c <KeyPress-Ri
18a0: 67 68 74 3e 20 5b 6c 69 73 74 20 54 72 65 65 3a  ght> [list Tree:
18b0: 3a 5f 6b 65 79 6e 61 76 20 72 69 67 68 74 20 24  :_keynav right $
18c0: 70 61 74 68 5d 0a 20 20 20 20 62 69 6e 64 20 24  path].    bind $
18d0: 70 61 74 68 2e 63 20 3c 4b 65 79 50 72 65 73 73  path.c <KeyPress
18e0: 2d 4c 65 66 74 3e 20 20 5b 6c 69 73 74 20 54 72  -Left>  [list Tr
18f0: 65 65 3a 3a 5f 6b 65 79 6e 61 76 20 6c 65 66 74  ee::_keynav left
1900: 20 24 70 61 74 68 5d 0a 20 20 20 20 62 69 6e 64   $path].    bind
1910: 20 24 70 61 74 68 2e 63 20 3c 4b 65 79 50 72 65   $path.c <KeyPre
1920: 73 73 2d 73 70 61 63 65 3e 20 5b 6c 69 73 74 20  ss-space> [list 
1930: 2b 54 72 65 65 3a 3a 5f 6b 65 79 6e 61 76 20 73  +Tree::_keynav s
1940: 70 61 63 65 20 24 70 61 74 68 5d 0a 0a 20 20 20  pace $path]..   
1950: 20 23 20 54 68 65 73 65 20 61 6c 6c 6f 77 20 6b   # These allow k
1960: 65 79 62 6f 61 72 64 20 63 6f 6e 74 72 6f 6c 20  eyboard control 
1970: 6f 66 20 74 68 65 20 73 63 72 6f 6c 6c 69 6e 67  of the scrolling
1980: 0a 20 20 20 20 62 69 6e 64 20 24 70 61 74 68 2e  .    bind $path.
1990: 63 20 3c 43 6f 6e 74 72 6f 6c 2d 4b 65 79 50 72  c <Control-KeyPr
19a0: 65 73 73 2d 55 70 3e 20 20 20 20 5b 6c 69 73 74  ess-Up>    [list
19b0: 20 24 70 61 74 68 2e 63 20 79 76 69 65 77 20 73   $path.c yview s
19c0: 63 72 6f 6c 6c 20 2d 31 20 75 6e 69 74 73 5d 0a  croll -1 units].
19d0: 20 20 20 20 62 69 6e 64 20 24 70 61 74 68 2e 63      bind $path.c
19e0: 20 3c 43 6f 6e 74 72 6f 6c 2d 4b 65 79 50 72 65   <Control-KeyPre
19f0: 73 73 2d 44 6f 77 6e 3e 20 20 5b 6c 69 73 74 20  ss-Down>  [list 
1a00: 24 70 61 74 68 2e 63 20 79 76 69 65 77 20 73 63  $path.c yview sc
1a10: 72 6f 6c 6c 20 20 31 20 75 6e 69 74 73 5d 0a 20  roll  1 units]. 
1a20: 20 20 20 62 69 6e 64 20 24 70 61 74 68 2e 63 20     bind $path.c 
1a30: 3c 43 6f 6e 74 72 6f 6c 2d 4b 65 79 50 72 65 73  <Control-KeyPres
1a40: 73 2d 4c 65 66 74 3e 20 20 5b 6c 69 73 74 20 24  s-Left>  [list $
1a50: 70 61 74 68 2e 63 20 78 76 69 65 77 20 73 63 72  path.c xview scr
1a60: 6f 6c 6c 20 2d 31 20 75 6e 69 74 73 5d 0a 20 20  oll -1 units].  
1a70: 20 20 62 69 6e 64 20 24 70 61 74 68 2e 63 20 3c    bind $path.c <
1a80: 43 6f 6e 74 72 6f 6c 2d 4b 65 79 50 72 65 73 73  Control-KeyPress
1a90: 2d 52 69 67 68 74 3e 20 5b 6c 69 73 74 20 24 70  -Right> [list $p
1aa0: 61 74 68 2e 63 20 78 76 69 65 77 20 73 63 72 6f  ath.c xview scro
1ab0: 6c 6c 20 20 31 20 75 6e 69 74 73 5d 0a 20 20 20  ll  1 units].   
1ac0: 20 23 20 65 72 69 63 6d 40 73 63 72 69 70 74 69   # ericm@scripti
1ad0: 63 73 2e 63 6f 6d 0a 0a 20 20 20 20 42 57 69 64  cs.com..    BWid
1ae0: 67 65 74 3a 3a 62 69 6e 64 4d 6f 75 73 65 57 68  get::bindMouseWh
1af0: 65 65 6c 20 24 70 61 74 68 2e 63 0a 0a 20 20 20  eel $path.c..   
1b00: 20 44 72 61 67 53 69 74 65 3a 3a 73 65 74 64 72   DragSite::setdr
1b10: 61 67 20 24 70 61 74 68 20 24 70 61 74 68 2e 63  ag $path $path.c
1b20: 20 54 72 65 65 3a 3a 5f 69 6e 69 74 5f 64 72 61   Tree::_init_dra
1b30: 67 5f 63 6d 64 20 5c 0a 09 20 20 20 20 5b 57 69  g_cmd \..    [Wi
1b40: 64 67 65 74 3a 3a 63 67 65 74 20 24 70 61 74 68  dget::cget $path
1b50: 20 2d 64 72 61 67 65 6e 64 63 6d 64 5d 20 31 0a   -dragendcmd] 1.
1b60: 20 20 20 20 44 72 6f 70 53 69 74 65 3a 3a 73 65      DropSite::se
1b70: 74 64 72 6f 70 20 24 70 61 74 68 20 24 70 61 74  tdrop $path $pat
1b80: 68 2e 63 20 54 72 65 65 3a 3a 5f 6f 76 65 72 5f  h.c Tree::_over_
1b90: 63 6d 64 20 54 72 65 65 3a 3a 5f 64 72 6f 70 5f  cmd Tree::_drop_
1ba0: 63 6d 64 20 31 0a 0a 20 20 20 20 57 69 64 67 65  cmd 1..    Widge
1bb0: 74 3a 3a 63 72 65 61 74 65 20 54 72 65 65 20 24  t::create Tree $
1bc0: 70 61 74 68 0a 0a 20 20 20 20 73 65 74 20 77 20  path..    set w 
1bd0: 5b 57 69 64 67 65 74 3a 3a 63 67 65 74 20 24 70  [Widget::cget $p
1be0: 61 74 68 20 2d 77 69 64 74 68 5d 0a 20 20 20 20  ath -width].    
1bf0: 73 65 74 20 68 20 5b 57 69 64 67 65 74 3a 3a 63  set h [Widget::c
1c00: 67 65 74 20 24 70 61 74 68 20 2d 68 65 69 67 68  get $path -heigh
1c10: 74 5d 0a 20 20 20 20 73 65 74 20 64 79 20 5b 57  t].    set dy [W
1c20: 69 64 67 65 74 3a 3a 63 67 65 74 20 24 70 61 74  idget::cget $pat
1c30: 68 20 2d 64 65 6c 74 61 79 5d 0a 20 20 20 20 24  h -deltay].    $
1c40: 70 61 74 68 2e 63 20 63 6f 6e 66 69 67 75 72 65  path.c configure
1c50: 20 2d 77 69 64 74 68 20 5b 65 78 70 72 20 7b 24   -width [expr {$
1c60: 77 2a 38 7d 5d 20 2d 68 65 69 67 68 74 20 5b 65  w*8}] -height [e
1c70: 78 70 72 20 7b 24 68 2a 24 64 79 7d 5d 0a 0a 20  xpr {$h*$dy}].. 
1c80: 20 20 20 23 20 65 72 69 63 6d 0a 20 20 20 20 23     # ericm.    #
1c90: 20 42 69 6e 64 20 3c 42 75 74 74 6f 6e 2d 31 3e   Bind <Button-1>
1ca0: 20 74 6f 20 73 65 6c 65 63 74 20 74 68 65 20 63   to select the c
1cb0: 6c 69 63 6b 65 64 20 6e 6f 64 65 20 2d 2d 20 6e  licked node -- n
1cc0: 6f 20 72 65 61 73 6f 6e 20 6e 6f 74 20 74 6f 2c  o reason not to,
1cd0: 20 72 69 67 68 74 3f 0a 0a 20 20 20 20 23 23 20   right?..    ## 
1ce0: 42 69 6e 64 20 62 75 74 74 6f 6e 20 31 20 74 6f  Bind button 1 to
1cf0: 20 73 65 6c 65 63 74 20 74 68 65 20 6e 6f 64 65   select the node
1d00: 20 76 69 61 20 74 68 65 20 5f 6d 6f 75 73 65 5f   via the _mouse_
1d10: 73 65 6c 65 63 74 20 63 6f 6d 6d 61 6e 64 2e 0a  select command..
1d20: 20 20 20 20 23 23 20 54 68 69 73 20 63 6f 6d 6d      ## This comm
1d30: 61 6e 64 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  and will generat
1d40: 65 20 74 68 65 20 70 72 6f 70 65 72 20 3c 3c 54  e the proper <<T
1d50: 72 65 65 53 65 6c 65 63 74 3e 3e 20 76 69 72 74  reeSelect>> virt
1d60: 75 61 6c 20 65 76 65 6e 74 0a 20 20 20 20 23 23  ual event.    ##
1d70: 20 77 68 65 6e 20 6e 65 63 65 73 73 61 72 79 2e   when necessary.
1d80: 0a 20 20 20 20 73 65 74 20 73 65 6c 65 63 74 63  .    set selectc
1d90: 6d 64 20 54 72 65 65 3a 3a 5f 6d 6f 75 73 65 5f  md Tree::_mouse_
1da0: 73 65 6c 65 63 74 0a 20 20 20 20 54 72 65 65 3a  select.    Tree:
1db0: 3a 62 69 6e 64 54 65 78 74 20 20 24 70 61 74 68  :bindText  $path
1dc0: 20 3c 42 75 74 74 6f 6e 2d 31 3e 20 20 20 20 20   <Button-1>     
1dd0: 20 20 20 20 5b 6c 69 73 74 20 24 73 65 6c 65 63      [list $selec
1de0: 74 63 6d 64 20 24 70 61 74 68 20 73 65 74 5d 0a  tcmd $path set].
1df0: 20 20 20 20 54 72 65 65 3a 3a 62 69 6e 64 49 6d      Tree::bindIm
1e00: 61 67 65 20 24 70 61 74 68 20 3c 42 75 74 74 6f  age $path <Butto
1e10: 6e 2d 31 3e 20 20 20 20 20 20 20 20 20 5b 6c 69  n-1>         [li
1e20: 73 74 20 24 73 65 6c 65 63 74 63 6d 64 20 24 70  st $selectcmd $p
1e30: 61 74 68 20 73 65 74 5d 0a 20 20 20 20 54 72 65  ath set].    Tre
1e40: 65 3a 3a 62 69 6e 64 54 65 78 74 20 20 24 70 61  e::bindText  $pa
1e50: 74 68 20 3c 43 6f 6e 74 72 6f 6c 2d 42 75 74 74  th <Control-Butt
1e60: 6f 6e 2d 31 3e 20 5b 6c 69 73 74 20 24 73 65 6c  on-1> [list $sel
1e70: 65 63 74 63 6d 64 20 24 70 61 74 68 20 74 6f 67  ectcmd $path tog
1e80: 67 6c 65 5d 0a 20 20 20 20 54 72 65 65 3a 3a 62  gle].    Tree::b
1e90: 69 6e 64 49 6d 61 67 65 20 24 70 61 74 68 20 3c  indImage $path <
1ea0: 43 6f 6e 74 72 6f 6c 2d 42 75 74 74 6f 6e 2d 31  Control-Button-1
1eb0: 3e 20 5b 6c 69 73 74 20 24 73 65 6c 65 63 74 63  > [list $selectc
1ec0: 6d 64 20 24 70 61 74 68 20 74 6f 67 67 6c 65 5d  md $path toggle]
1ed0: 0a 0a 20 20 20 20 23 20 41 64 64 20 73 65 6e 74  ..    # Add sent
1ee0: 69 6e 61 6c 20 62 69 6e 64 69 6e 67 73 20 66 6f  inal bindings fo
1ef0: 72 20 64 6f 75 62 6c 65 2d 63 6c 69 63 6b 69 6e  r double-clickin
1f00: 67 20 6f 6e 20 69 74 65 6d 73 2c 20 74 6f 20 68  g on items, to h
1f10: 61 6e 64 6c 65 20 74 68 65 20 0a 20 20 20 20 23  andle the .    #
1f20: 20 67 6e 61 72 6c 79 20 54 6b 20 62 75 67 20 77   gnarly Tk bug w
1f30: 68 65 72 65 69 6e 3a 0a 20 20 20 20 23 20 42 75  herein:.    # Bu
1f40: 74 74 6f 6e 43 6c 69 63 6b 0a 20 20 20 20 23 20  ttonClick.    # 
1f50: 42 75 74 74 6f 6e 43 6c 69 63 6b 0a 20 20 20 20  ButtonClick.    
1f60: 23 20 4f 6e 20 61 20 63 61 6e 76 61 73 20 69 74  # On a canvas it
1f70: 65 6d 20 74 72 61 6e 73 6c 61 74 65 73 20 69 6e  em translates in
1f80: 74 6f 20 62 75 74 74 6f 6e 20 63 6c 69 63 6b 20  to button click 
1f90: 6f 6e 20 74 68 65 20 69 74 65 6d 2c 20 62 75 74  on the item, but
1fa0: 74 6f 6e 20 63 6c 69 63 6b 0a 20 20 20 20 23 20  ton click.    # 
1fb0: 6f 6e 20 74 68 65 20 63 61 6e 76 61 73 2c 20 64  on the canvas, d
1fc0: 6f 75 62 6c 65 2d 62 75 74 74 6f 6e 20 6f 6e 20  ouble-button on 
1fd0: 74 68 65 20 69 74 65 6d 2c 20 73 69 6e 67 6c 65  the item, single
1fe0: 20 62 75 74 74 6f 6e 20 63 6c 69 63 6b 20 6f 6e   button click on
1ff0: 20 74 68 65 0a 20 20 20 20 23 20 63 61 6e 76 61   the.    # canva
2000: 73 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70  s (which can hap
2010: 70 65 6e 20 69 66 20 74 68 65 20 64 6f 75 62 6c  pen if the doubl
2020: 65 2d 62 75 74 74 6f 6e 20 6f 6e 20 74 68 65 20  e-button on the 
2030: 69 74 65 6d 20 63 61 75 73 65 73 20 73 6f 6d 65  item causes some
2040: 0a 20 20 20 20 23 20 6f 74 68 65 72 20 65 76 65  .    # other eve
2050: 6e 74 20 74 6f 20 62 65 20 68 61 6e 64 6c 65 64  nt to be handled
2060: 20 69 6e 20 62 65 74 77 65 65 6e 20 77 68 65 6e   in between when
2070: 20 74 68 65 20 62 75 74 74 6f 6e 20 63 6c 69 63   the button clic
2080: 6b 73 20 61 72 65 20 65 78 61 6d 69 6e 65 64 0a  ks are examined.
2090: 20 20 20 20 23 20 66 6f 72 20 74 68 65 20 63 61      # for the ca
20a0: 6e 76 61 73 29 0a 20 20 20 20 24 70 61 74 68 2e  nvas).    $path.
20b0: 63 20 62 69 6e 64 20 54 72 65 65 49 74 65 6d 53  c bind TreeItemS
20c0: 65 6e 74 69 6e 61 6c 20 3c 44 6f 75 62 6c 65 2d  entinal <Double-
20d0: 42 75 74 74 6f 6e 2d 31 3e 20 5c 0a 09 5b 6c 69  Button-1> \..[li
20e0: 73 74 20 73 65 74 20 3a 3a 54 72 65 65 3a 3a 73  st set ::Tree::s
20f0: 65 6e 74 69 6e 61 6c 28 24 70 61 74 68 2e 63 29  entinal($path.c)
2100: 20 31 5d 0a 20 20 20 20 23 20 65 72 69 63 6d 0a   1].    # ericm.
2110: 0a 20 20 20 20 72 65 74 75 72 6e 20 24 70 61 74  .    return $pat
2120: 68 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d  h.}...# --------
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 2d 2d 2d  ----------------
2150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2170: 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20  ----.#  Command 
2180: 54 72 65 65 3a 3a 63 6f 6e 66 69 67 75 72 65 0a  Tree::configure.
2190: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
21a0: 2d 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 0a 70  --------------.p
21e0: 72 6f 63 20 54 72 65 65 3a 3a 63 6f 6e 66 69 67  roc Tree::config
21f0: 75 72 65 20 7b 20 70 61 74 68 20 61 72 67 73 20  ure { path args 
2200: 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65  } {.    variable
2210: 20 24 70 61 74 68 0a 20 20 20 20 75 70 76 61 72   $path.    upvar
2220: 20 30 20 20 24 70 61 74 68 20 64 61 74 61 0a 0a   0  $path data..
2230: 20 20 20 20 73 65 74 20 72 65 73 20 5b 57 69 64      set res [Wid
2240: 67 65 74 3a 3a 63 6f 6e 66 69 67 75 72 65 20 24  get::configure $
2250: 70 61 74 68 20 24 61 72 67 73 5d 0a 0a 20 20 20  path $args]..   
2260: 20 73 65 74 20 63 68 31 20 5b 65 78 70 72 20 7b   set ch1 [expr {
2270: 5b 57 69 64 67 65 74 3a 3a 68 61 73 43 68 61 6e  [Widget::hasChan
2280: 67 65 64 20 24 70 61 74 68 20 2d 64 65 6c 74 61  ged $path -delta
2290: 78 20 76 61 6c 5d 20 7c 0a 20 20 20 20 20 20 20  x val] |.       
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 57 69 64              [Wid
22b0: 67 65 74 3a 3a 68 61 73 43 68 61 6e 67 65 64 20  get::hasChanged 
22c0: 24 70 61 74 68 20 2d 64 65 6c 74 61 79 20 64 79  $path -deltay dy
22d0: 5d 20 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ]  |.           
22e0: 20 20 20 20 20 20 20 20 5b 57 69 64 67 65 74 3a          [Widget:
22f0: 3a 68 61 73 43 68 61 6e 67 65 64 20 24 70 61 74  :hasChanged $pat
2300: 68 20 2d 70 61 64 78 20 76 61 6c 5d 20 20 20 7c  h -padx val]   |
2310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2320: 20 20 20 20 5b 57 69 64 67 65 74 3a 3a 68 61 73      [Widget::has
2330: 43 68 61 6e 67 65 64 20 24 70 61 74 68 20 2d 73  Changed $path -s
2340: 68 6f 77 6c 69 6e 65 73 20 76 61 6c 5d 7d 5d 0a  howlines val]}].
2350: 0a 20 20 20 20 73 65 74 20 63 68 32 20 5b 65 78  .    set ch2 [ex
2360: 70 72 20 7b 5b 57 69 64 67 65 74 3a 3a 68 61 73  pr {[Widget::has
2370: 43 68 61 6e 67 65 64 20 24 70 61 74 68 20 2d 73  Changed $path -s
2380: 65 6c 65 63 74 62 61 63 6b 67 72 6f 75 6e 64 20  electbackground 
2390: 76 61 6c 5d 20 7c 0a 20 20 20 20 20 20 20 20 20  val] |.         
23a0: 20 20 20 20 20 20 20 20 20 20 5b 57 69 64 67 65            [Widge
23b0: 74 3a 3a 68 61 73 43 68 61 6e 67 65 64 20 24 70  t::hasChanged $p
23c0: 61 74 68 20 2d 73 65 6c 65 63 74 66 6f 72 65 67  ath -selectforeg
23d0: 72 6f 75 6e 64 20 76 61 6c 5d 7d 5d 0a 0a 20 20  round val]}]..  
23e0: 20 20 69 66 20 7b 20 5b 57 69 64 67 65 74 3a 3a    if { [Widget::
23f0: 68 61 73 43 68 61 6e 67 65 64 20 24 70 61 74 68  hasChanged $path
2400: 20 2d 6c 69 6e 65 73 66 69 6c 6c 20 20 20 66 69   -linesfill   fi
2410: 6c 6c 5d 20 7c 0a 20 20 20 20 20 20 20 20 20 5b  ll] |.         [
2420: 57 69 64 67 65 74 3a 3a 68 61 73 43 68 61 6e 67  Widget::hasChang
2430: 65 64 20 24 70 61 74 68 20 2d 6c 69 6e 65 73 74  ed $path -linest
2440: 69 70 70 6c 65 20 73 74 69 70 70 6c 65 5d 20 7d  ipple stipple] }
2450: 20 7b 0a 20 20 20 20 20 20 20 20 24 70 61 74 68   {.        $path
2460: 2e 63 20 69 74 65 6d 63 6f 6e 66 69 67 75 72 65  .c itemconfigure
2470: 20 6c 69 6e 65 20 20 2d 66 69 6c 6c 20 24 66 69   line  -fill $fi
2480: 6c 6c 20 2d 73 74 69 70 70 6c 65 20 24 73 74 69  ll -stipple $sti
2490: 70 70 6c 65 0a 20 20 20 20 7d 0a 0a 20 20 20 20  pple.    }..    
24a0: 69 66 20 7b 20 5b 57 69 64 67 65 74 3a 3a 68 61  if { [Widget::ha
24b0: 73 43 68 61 6e 67 65 64 20 24 70 61 74 68 20 2d  sChanged $path -
24c0: 63 72 6f 73 73 66 69 6c 6c 20 66 69 6c 6c 5d 20  crossfill fill] 
24d0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 24 70 61 74  } {.        $pat
24e0: 68 2e 63 20 69 74 65 6d 63 6f 6e 66 69 67 75 72  h.c itemconfigur
24f0: 65 20 63 72 6f 73 73 20 2d 66 6f 72 65 67 72 6f  e cross -foregro
2500: 75 6e 64 20 24 66 69 6c 6c 0a 20 20 20 20 7d 0a  und $fill.    }.
2510: 0a 20 20 20 20 69 66 20 7b 5b 57 69 64 67 65 74  .    if {[Widget
2520: 3a 3a 68 61 73 43 68 61 6e 67 65 64 20 24 70 61  ::hasChanged $pa
2530: 74 68 20 2d 73 65 6c 65 63 74 66 69 6c 6c 20 66  th -selectfill f
2540: 69 6c 6c 5d 7d 20 7b 0a 09 23 20 4d 61 6b 65 20  ill]} {..# Make 
2550: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 66 75  sure that the fu
2560: 6c 6c 2d 77 69 64 74 68 20 62 6f 78 65 73 20 68  ll-width boxes h
2570: 61 76 65 20 65 69 74 68 65 72 20 61 6c 6c 20 6f  ave either all o
2580: 72 20 6e 6f 6e 65 0a 09 23 20 6f 66 20 74 68 65  r none..# of the
2590: 20 73 74 61 6e 64 61 72 64 20 6e 6f 64 65 20 62   standard node b
25a0: 69 6e 64 69 6e 67 73 0a 09 69 66 20 7b 24 66 69  indings..if {$fi
25b0: 6c 6c 7d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61  ll} {..    forea
25c0: 63 68 20 65 76 65 6e 74 20 5b 24 70 61 74 68 2e  ch event [$path.
25d0: 63 20 62 69 6e 64 20 22 6e 6f 64 65 22 5d 20 7b  c bind "node"] {
25e0: 0a 09 09 24 70 61 74 68 2e 63 20 62 69 6e 64 20  ...$path.c bind 
25f0: 22 62 6f 78 22 20 24 65 76 65 6e 74 20 5b 24 70  "box" $event [$p
2600: 61 74 68 2e 63 20 62 69 6e 64 20 22 6e 6f 64 65  ath.c bind "node
2610: 22 20 24 65 76 65 6e 74 5d 0a 09 20 20 20 20 7d  " $event]..    }
2620: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
2630: 66 6f 72 65 61 63 68 20 65 76 65 6e 74 20 5b 24  foreach event [$
2640: 70 61 74 68 2e 63 20 62 69 6e 64 20 22 6e 6f 64  path.c bind "nod
2650: 65 22 5d 20 7b 0a 09 09 24 70 61 74 68 2e 63 20  e"] {...$path.c 
2660: 62 69 6e 64 20 22 62 6f 78 22 20 24 65 76 65 6e  bind "box" $even
2670: 74 20 7b 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  t {}..    }..}. 
2680: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b 20 24     }..    if { $
2690: 63 68 31 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  ch1 } {.        
26a0: 5f 72 65 64 72 61 77 5f 69 64 6c 65 20 24 70 61  _redraw_idle $pa
26b0: 74 68 20 33 0a 20 20 20 20 7d 20 65 6c 73 65 69  th 3.    } elsei
26c0: 66 20 7b 20 24 63 68 32 20 7d 20 7b 0a 20 20 20  f { $ch2 } {.   
26d0: 20 20 20 20 20 5f 72 65 64 72 61 77 5f 69 64 6c       _redraw_idl
26e0: 65 20 24 70 61 74 68 20 31 0a 20 20 20 20 7d 0a  e $path 1.    }.
26f0: 0a 20 20 20 20 69 66 20 7b 20 5b 57 69 64 67 65  .    if { [Widge
2700: 74 3a 3a 68 61 73 43 68 61 6e 67 65 64 20 24 70  t::hasChanged $p
2710: 61 74 68 20 2d 68 65 69 67 68 74 20 68 5d 20 7d  ath -height h] }
2720: 20 7b 0a 20 20 20 20 20 20 20 20 24 70 61 74 68   {.        $path
2730: 2e 63 20 63 6f 6e 66 69 67 75 72 65 20 2d 68 65  .c configure -he
2740: 69 67 68 74 20 5b 65 78 70 72 20 7b 24 68 2a 24  ight [expr {$h*$
2750: 64 79 7d 5d 0a 20 20 20 20 7d 0a 20 20 20 20 69  dy}].    }.    i
2760: 66 20 7b 20 5b 57 69 64 67 65 74 3a 3a 68 61 73  f { [Widget::has
2770: 43 68 61 6e 67 65 64 20 24 70 61 74 68 20 2d 77  Changed $path -w
2780: 69 64 74 68 20 77 5d 20 7d 20 7b 0a 20 20 20 20  idth w] } {.    
2790: 20 20 20 20 24 70 61 74 68 2e 63 20 63 6f 6e 66      $path.c conf
27a0: 69 67 75 72 65 20 2d 77 69 64 74 68 20 5b 65 78  igure -width [ex
27b0: 70 72 20 7b 24 77 2a 38 7d 5d 0a 20 20 20 20 7d  pr {$w*8}].    }
27c0: 0a 0a 20 20 20 20 69 66 20 7b 20 5b 57 69 64 67  ..    if { [Widg
27d0: 65 74 3a 3a 68 61 73 43 68 61 6e 67 65 64 20 24  et::hasChanged $
27e0: 70 61 74 68 20 2d 72 65 64 72 61 77 20 62 6f 6f  path -redraw boo
27f0: 6c 5d 20 26 26 20 24 62 6f 6f 6c 20 7d 20 7b 0a  l] && $bool } {.
2800: 20 20 20 20 20 20 20 20 73 65 74 20 75 70 64 20          set upd 
2810: 24 64 61 74 61 28 75 70 64 2c 6c 65 76 65 6c 29  $data(upd,level)
2820: 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
2830: 61 28 75 70 64 2c 6c 65 76 65 6c 29 20 30 0a 20  a(upd,level) 0. 
2840: 20 20 20 20 20 20 20 5f 72 65 64 72 61 77 5f 69         _redraw_i
2850: 64 6c 65 20 24 70 61 74 68 20 24 75 70 64 0a 20  dle $path $upd. 
2860: 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 66 6f     }..    set fo
2870: 72 63 65 20 5b 57 69 64 67 65 74 3a 3a 68 61 73  rce [Widget::has
2880: 43 68 61 6e 67 65 64 20 24 70 61 74 68 20 2d 64  Changed $path -d
2890: 72 61 67 65 6e 64 63 6d 64 20 64 72 61 67 65 6e  ragendcmd dragen
28a0: 64 5d 0a 20 20 20 20 44 72 61 67 53 69 74 65 3a  d].    DragSite:
28b0: 3a 73 65 74 64 72 61 67 20 24 70 61 74 68 20 24  :setdrag $path $
28c0: 70 61 74 68 2e 63 20 54 72 65 65 3a 3a 5f 69 6e  path.c Tree::_in
28d0: 69 74 5f 64 72 61 67 5f 63 6d 64 20 24 64 72 61  it_drag_cmd $dra
28e0: 67 65 6e 64 20 24 66 6f 72 63 65 0a 20 20 20 20  gend $force.    
28f0: 44 72 6f 70 53 69 74 65 3a 3a 73 65 74 64 72 6f  DropSite::setdro
2900: 70 20 24 70 61 74 68 20 24 70 61 74 68 2e 63 20  p $path $path.c 
2910: 54 72 65 65 3a 3a 5f 6f 76 65 72 5f 63 6d 64 20  Tree::_over_cmd 
2920: 54 72 65 65 3a 3a 5f 64 72 6f 70 5f 63 6d 64 0a  Tree::_drop_cmd.
2930: 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73  .    return $res
2940: 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}...# ---------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2990: 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 54  ---.#  Command T
29a0: 72 65 65 3a 3a 63 67 65 74 0a 23 20 2d 2d 2d 2d  ree::cget.# ----
29b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72  --------.proc Tr
2a00: 65 65 3a 3a 63 67 65 74 20 7b 20 70 61 74 68 20  ee::cget { path 
2a10: 6f 70 74 69 6f 6e 20 7d 20 7b 0a 20 20 20 20 72  option } {.    r
2a20: 65 74 75 72 6e 20 5b 57 69 64 67 65 74 3a 3a 63  eturn [Widget::c
2a30: 67 65 74 20 24 70 61 74 68 20 24 6f 70 74 69 6f  get $path $optio
2a40: 6e 5d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d  n].}...# -------
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a90: 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64  -----.#  Command
2aa0: 20 54 72 65 65 3a 3a 69 6e 73 65 72 74 0a 23 20   Tree::insert.# 
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f  ------------.pro
2b00: 63 20 54 72 65 65 3a 3a 69 6e 73 65 72 74 20 7b  c Tree::insert {
2b10: 20 70 61 74 68 20 69 6e 64 65 78 20 70 61 72 65   path index pare
2b20: 6e 74 20 6e 6f 64 65 20 61 72 67 73 20 7d 20 7b  nt node args } {
2b30: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 24 70  .    variable $p
2b40: 61 74 68 0a 20 20 20 20 75 70 76 61 72 20 30 20  ath.    upvar 0 
2b50: 20 24 70 61 74 68 20 64 61 74 61 0a 0a 20 20 20   $path data..   
2b60: 20 73 65 74 20 6e 6f 64 65 20 5b 5f 6e 6f 64 65   set node [_node
2b70: 5f 6e 61 6d 65 20 24 70 61 74 68 20 24 6e 6f 64  _name $path $nod
2b80: 65 5d 0a 20 20 20 20 73 65 74 20 6e 6f 64 65 20  e].    set node 
2b90: 5b 57 69 64 67 65 74 3a 3a 6e 65 78 74 49 6e 64  [Widget::nextInd
2ba0: 65 78 20 24 70 61 74 68 20 24 6e 6f 64 65 5d 0a  ex $path $node].
2bb0: 0a 20 20 20 20 69 66 20 7b 20 5b 69 6e 66 6f 20  .    if { [info 
2bc0: 65 78 69 73 74 73 20 64 61 74 61 28 24 6e 6f 64  exists data($nod
2bd0: 65 29 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  e)] } {.        
2be0: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
2bf0: 6f 72 20 22 6e 6f 64 65 20 5c 22 24 6e 6f 64 65  or "node \"$node
2c00: 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  \" already exist
2c10: 73 22 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  s".    }.    set
2c20: 20 70 61 72 65 6e 74 20 5b 5f 6e 6f 64 65 5f 6e   parent [_node_n
2c30: 61 6d 65 20 24 70 61 74 68 20 24 70 61 72 65 6e  ame $path $paren
2c40: 74 5d 0a 20 20 20 20 69 66 20 7b 20 21 5b 69 6e  t].    if { ![in
2c50: 66 6f 20 65 78 69 73 74 73 20 64 61 74 61 28 24  fo exists data($
2c60: 70 61 72 65 6e 74 29 5d 20 7d 20 7b 0a 20 20 20  parent)] } {.   
2c70: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64       return -cod
2c80: 65 20 65 72 72 6f 72 20 22 6e 6f 64 65 20 5c 22  e error "node \"
2c90: 24 70 61 72 65 6e 74 5c 22 20 64 6f 65 73 20 6e  $parent\" does n
2ca0: 6f 74 20 65 78 69 73 74 22 0a 20 20 20 20 7d 0a  ot exist".    }.
2cb0: 0a 20 20 20 20 57 69 64 67 65 74 3a 3a 69 6e 69  .    Widget::ini
2cc0: 74 20 54 72 65 65 3a 3a 4e 6f 64 65 20 24 70 61  t Tree::Node $pa
2cd0: 74 68 2e 24 6e 6f 64 65 20 24 61 72 67 73 0a 20  th.$node $args. 
2ce0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 65     if {[string e
2cf0: 71 75 61 6c 20 24 69 6e 64 65 78 20 22 65 6e 64  qual $index "end
2d00: 22 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 6c 61  "]} {.        la
2d10: 70 70 65 6e 64 20 64 61 74 61 28 24 70 61 72 65  ppend data($pare
2d20: 6e 74 29 20 24 6e 6f 64 65 0a 20 20 20 20 7d 20  nt) $node.    } 
2d30: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 69  else {.        i
2d40: 6e 63 72 20 69 6e 64 65 78 0a 20 20 20 20 20 20  ncr index.      
2d50: 20 20 73 65 74 20 64 61 74 61 28 24 70 61 72 65    set data($pare
2d60: 6e 74 29 20 5b 6c 69 6e 73 65 72 74 20 24 64 61  nt) [linsert $da
2d70: 74 61 28 24 70 61 72 65 6e 74 29 20 24 69 6e 64  ta($parent) $ind
2d80: 65 78 20 24 6e 6f 64 65 5d 0a 20 20 20 20 7d 0a  ex $node].    }.
2d90: 20 20 20 20 73 65 74 20 64 61 74 61 28 24 6e 6f      set data($no
2da0: 64 65 29 20 5b 6c 69 73 74 20 24 70 61 72 65 6e  de) [list $paren
2db0: 74 5d 0a 0a 20 20 20 20 69 66 20 7b 20 5b 73 74  t]..    if { [st
2dc0: 72 69 6e 67 20 65 71 75 61 6c 20 24 70 61 72 65  ring equal $pare
2dd0: 6e 74 20 22 72 6f 6f 74 22 5d 20 7d 20 7b 0a 20  nt "root"] } {. 
2de0: 20 20 20 20 20 20 20 5f 72 65 64 72 61 77 5f 69         _redraw_i
2df0: 64 6c 65 20 24 70 61 74 68 20 33 0a 20 20 20 20  dle $path 3.    
2e00: 7d 20 65 6c 73 65 69 66 20 7b 20 5b 76 69 73 69  } elseif { [visi
2e10: 62 6c 65 20 24 70 61 74 68 20 24 70 61 72 65 6e  ble $path $paren
2e20: 74 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 23  t] } {.        #
2e30: 20 70 61 72 65 6e 74 20 69 73 20 76 69 73 69 62   parent is visib
2e40: 6c 65 2e 2e 2e 0a 20 20 20 20 20 20 20 20 69 66  le....        if
2e50: 20 7b 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 4d   { [Widget::getM
2e60: 65 67 61 77 69 64 67 65 74 4f 70 74 69 6f 6e 20  egawidgetOption 
2e70: 24 70 61 74 68 2e 24 70 61 72 65 6e 74 20 2d 6f  $path.$parent -o
2e80: 70 65 6e 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20  pen] } {.       
2e90: 20 20 20 20 20 23 20 2e 2e 2e 61 6e 64 20 6f 70       # ...and op
2ea0: 65 6e 65 64 20 2d 3e 20 72 65 64 72 61 77 20 77  ened -> redraw w
2eb0: 68 6f 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  hole.           
2ec0: 20 5f 72 65 64 72 61 77 5f 69 64 6c 65 20 24 70   _redraw_idle $p
2ed0: 61 74 68 20 33 0a 20 20 20 20 20 20 20 20 7d 20  ath 3.        } 
2ee0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
2ef0: 20 20 20 23 20 2e 2e 2e 61 6e 64 20 63 6c 6f 73     # ...and clos
2f00: 65 64 20 2d 3e 20 72 65 64 72 61 77 20 63 72 6f  ed -> redraw cro
2f10: 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d  ss.            M
2f20: 65 72 67 65 46 6c 61 67 20 24 70 61 74 68 20 24  ergeFlag $path $
2f30: 70 61 72 65 6e 74 20 38 0a 20 20 20 20 20 20 20  parent 8.       
2f40: 20 20 20 20 20 5f 72 65 64 72 61 77 5f 69 64 6c       _redraw_idl
2f50: 65 20 24 70 61 74 68 20 32 0a 20 20 20 20 20 20  e $path 2.      
2f60: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
2f70: 65 74 75 72 6e 20 24 6e 6f 64 65 0a 7d 0a 0a 0a  eturn $node.}...
2f80: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2fd0: 20 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a 3a    Command Tree::
2fe0: 69 74 65 6d 63 6f 6e 66 69 67 75 72 65 0a 23 20  itemconfigure.# 
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f  ------------.pro
3040: 63 20 54 72 65 65 3a 3a 69 74 65 6d 63 6f 6e 66  c Tree::itemconf
3050: 69 67 75 72 65 20 7b 20 70 61 74 68 20 6e 6f 64  igure { path nod
3060: 65 20 61 72 67 73 20 7d 20 7b 0a 20 20 20 20 76  e args } {.    v
3070: 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20 20  ariable $path.  
3080: 20 20 75 70 76 61 72 20 30 20 20 24 70 61 74 68    upvar 0  $path
3090: 20 64 61 74 61 0a 0a 20 20 20 20 73 65 74 20 6e   data..    set n
30a0: 6f 64 65 20 5b 5f 6e 6f 64 65 5f 6e 61 6d 65 20  ode [_node_name 
30b0: 24 70 61 74 68 20 24 6e 6f 64 65 5d 0a 20 20 20  $path $node].   
30c0: 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 65 71   if { [string eq
30d0: 75 61 6c 20 24 6e 6f 64 65 20 22 72 6f 6f 74 22  ual $node "root"
30e0: 5d 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73  ] || ![info exis
30f0: 74 73 20 64 61 74 61 28 24 6e 6f 64 65 29 5d 20  ts data($node)] 
3100: 7d 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  } {.        retu
3110: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22  rn -code error "
3120: 6e 6f 64 65 20 5c 22 24 6e 6f 64 65 5c 22 20 64  node \"$node\" d
3130: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 22 0a 20  oes not exist". 
3140: 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 72 65     }..    set re
3150: 73 75 6c 74 20 5b 57 69 64 67 65 74 3a 3a 63 6f  sult [Widget::co
3160: 6e 66 69 67 75 72 65 20 24 70 61 74 68 2e 24 6e  nfigure $path.$n
3170: 6f 64 65 20 24 61 72 67 73 5d 0a 0a 20 20 20 20  ode $args]..    
3180: 5f 73 65 74 5f 68 65 6c 70 20 24 70 61 74 68 20  _set_help $path 
3190: 24 6e 6f 64 65 0a 0a 20 20 20 20 69 66 20 7b 20  $node..    if { 
31a0: 5b 76 69 73 69 62 6c 65 20 24 70 61 74 68 20 24  [visible $path $
31b0: 6e 6f 64 65 5d 20 7d 20 7b 0a 20 20 20 20 20 20  node] } {.      
31c0: 20 20 73 65 74 20 6c 6f 70 74 20 20 20 7b 7d 0a    set lopt   {}.
31d0: 20 20 20 20 20 20 20 20 73 65 74 20 66 6c 61 67          set flag
31e0: 20 20 20 30 0a 20 20 20 20 20 20 20 20 66 6f 72     0.        for
31f0: 65 61 63 68 20 6f 70 74 20 7b 2d 77 69 6e 64 6f  each opt {-windo
3200: 77 20 2d 69 6d 61 67 65 20 2d 64 72 61 77 63 72  w -image -drawcr
3210: 6f 73 73 20 2d 66 6f 6e 74 20 2d 74 65 78 74 20  oss -font -text 
3220: 2d 66 69 6c 6c 7d 20 7b 0a 20 20 20 20 20 20 20  -fill} {.       
3230: 20 20 20 20 20 73 65 74 20 66 6c 61 67 20 5b 65       set flag [e
3240: 78 70 72 20 7b 24 66 6c 61 67 20 3c 3c 20 31 7d  xpr {$flag << 1}
3250: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ].            if
3260: 20 7b 20 5b 57 69 64 67 65 74 3a 3a 68 61 73 43   { [Widget::hasC
3270: 68 61 6e 67 65 64 20 24 70 61 74 68 2e 24 6e 6f  hanged $path.$no
3280: 64 65 20 24 6f 70 74 20 76 61 6c 5d 20 7d 20 7b  de $opt val] } {
3290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32a0: 20 73 65 74 20 66 6c 61 67 20 5b 65 78 70 72 20   set flag [expr 
32b0: 7b 24 66 6c 61 67 20 7c 20 31 7d 5d 0a 20 20 20  {$flag | 1}].   
32c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32d0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
32e0: 20 7b 20 5b 57 69 64 67 65 74 3a 3a 68 61 73 43   { [Widget::hasC
32f0: 68 61 6e 67 65 64 20 24 70 61 74 68 2e 24 6e 6f  hanged $path.$no
3300: 64 65 20 2d 6f 70 65 6e 20 76 61 6c 5d 20 7d 20  de -open val] } 
3310: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
3320: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 64 61 74 61   {[llength $data
3330: 28 24 6e 6f 64 65 29 5d 20 3e 20 31 7d 20 7b 0a  ($node)] > 1} {.
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 23 20 6e 6f 64 65 20 68 61 76 65 20 73 75 62 6e  # node have subn
3360: 6f 64 65 73 20 2d 20 66 75 6c 6c 20 72 65 64 72  odes - full redr
3370: 61 77 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  aw.             
3380: 20 20 20 5f 72 65 64 72 61 77 5f 69 64 6c 65 20     _redraw_idle 
3390: 24 70 61 74 68 20 33 0a 20 20 20 20 20 20 20 20  $path 3.        
33a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 66               # f
33c0: 6f 72 63 65 20 61 20 72 65 64 72 61 77 20 6f 66  orce a redraw of
33d0: 20 74 68 65 20 70 6c 75 73 2f 6d 69 6e 75 73 20   the plus/minus 
33e0: 73 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20 20  sign.           
33f0: 20 20 20 20 20 73 65 74 20 66 6c 61 67 20 5b 65       set flag [e
3400: 78 70 72 20 7b 24 66 6c 61 67 20 7c 20 38 7d 5d  xpr {$flag | 8}]
3410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3420: 20 20 20 20 20 20 20 7d 0a 0a 09 69 66 20 7b 24         }...if {$
3430: 64 61 74 61 28 75 70 64 2c 6c 65 76 65 6c 29 20  data(upd,level) 
3440: 3c 20 33 20 26 26 20 5b 57 69 64 67 65 74 3a 3a  < 3 && [Widget::
3450: 68 61 73 43 68 61 6e 67 65 64 20 24 70 61 74 68  hasChanged $path
3460: 2e 24 6e 6f 64 65 20 2d 70 61 64 78 20 78 5d 7d  .$node -padx x]}
3470: 20 7b 0a 09 20 20 20 20 5f 72 65 64 72 61 77 5f   {..    _redraw_
3480: 69 64 6c 65 20 24 70 61 74 68 20 33 0a 09 7d 0a  idle $path 3..}.
3490: 0a 09 69 66 20 7b 20 24 64 61 74 61 28 75 70 64  ..if { $data(upd
34a0: 2c 6c 65 76 65 6c 29 20 3c 20 33 20 26 26 20 24  ,level) < 3 && $
34b0: 66 6c 61 67 20 7d 20 7b 0a 09 20 20 20 20 4d 65  flag } {..    Me
34c0: 72 67 65 46 6c 61 67 20 24 70 61 74 68 20 24 6e  rgeFlag $path $n
34d0: 6f 64 65 20 24 66 6c 61 67 0a 20 20 20 20 20 20  ode $flag.      
34e0: 20 20 20 20 20 20 5f 72 65 64 72 61 77 5f 69 64        _redraw_id
34f0: 6c 65 20 24 70 61 74 68 20 32 0a 20 20 20 20 20  le $path 2.     
3500: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
3510: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0a 7d 0a  eturn $result.}.
3520: 0a 70 72 6f 63 20 54 72 65 65 3a 3a 4d 65 72 67  .proc Tree::Merg
3530: 65 46 6c 61 67 20 7b 20 70 61 74 68 20 6e 6f 64  eFlag { path nod
3540: 65 20 66 6c 61 67 20 7d 20 7b 0a 20 20 20 20 76  e flag } {.    v
3550: 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20 20  ariable $path.  
3560: 20 20 75 70 76 61 72 20 30 20 20 24 70 61 74 68    upvar 0  $path
3570: 20 64 61 74 61 0a 0a 20 20 20 20 23 20 64 61 74   data..    # dat
3580: 61 28 75 70 64 2c 6e 6f 64 65 73 29 20 69 73 20  a(upd,nodes) is 
3590: 61 20 6b 65 79 2d 76 61 6c 20 6c 69 73 74 3a 20  a key-val list: 
35a0: 65 6d 75 6c 61 74 65 20 61 20 64 69 63 74 20 62  emulate a dict b
35b0: 79 20 61 6e 20 61 72 72 61 79 0a 20 20 20 20 61  y an array.    a
35c0: 72 72 61 79 20 73 65 74 20 6e 20 24 64 61 74 61  rray set n $data
35d0: 28 75 70 64 2c 6e 6f 64 65 73 29 0a 20 20 20 20  (upd,nodes).    
35e0: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
35f0: 73 20 6e 28 24 6e 6f 64 65 29 5d 7d 20 7b 0a 09  s n($node)]} {..
3600: 6c 61 70 70 65 6e 64 20 64 61 74 61 28 75 70 64  lappend data(upd
3610: 2c 6e 6f 64 65 73 29 20 24 6e 6f 64 65 20 24 66  ,nodes) $node $f
3620: 6c 61 67 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  lag.    } else {
3630: 0a 09 73 65 74 20 6e 28 24 6e 6f 64 65 29 20 5b  ..set n($node) [
3640: 65 78 70 72 20 7b 24 6e 28 24 6e 6f 64 65 29 20  expr {$n($node) 
3650: 7c 20 24 66 6c 61 67 7d 5d 0a 09 73 65 74 20 64  | $flag}]..set d
3660: 61 74 61 28 75 70 64 2c 6e 6f 64 65 73 29 20 5b  ata(upd,nodes) [
3670: 61 72 72 61 79 20 67 65 74 20 6e 5d 0a 20 20 20  array get n].   
3680: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a   }.    return.}.
3690: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a  ---------------.
36e0: 23 20 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a  #  Command Tree:
36f0: 3a 69 74 65 6d 63 67 65 74 0a 23 20 2d 2d 2d 2d  :itemcget.# ----
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 70 72 6f 63 20 54 72  --------.proc Tr
3750: 65 65 3a 3a 69 74 65 6d 63 67 65 74 20 7b 20 70  ee::itemcget { p
3760: 61 74 68 20 6e 6f 64 65 20 6f 70 74 69 6f 6e 20  ath node option 
3770: 7d 20 7b 0a 20 20 20 20 23 20 49 6e 73 74 65 61  } {.    # Instea
3780: 64 20 6f 66 20 75 70 76 61 72 27 69 6e 67 20 24  d of upvar'ing $
3790: 70 61 74 68 20 61 73 20 64 61 74 61 20 66 6f 72  path as data for
37a0: 20 74 68 69 73 20 74 65 73 74 2c 20 6a 75 73 74   this test, just
37b0: 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 20   directly refer 
37c0: 74 6f 0a 20 20 20 20 23 20 69 74 2c 20 61 73 20  to.    # it, as 
37d0: 74 68 61 74 20 69 73 20 66 61 73 74 65 72 2e 0a  that is faster..
37e0: 20 20 20 20 73 65 74 20 6e 6f 64 65 20 5b 5f 6e      set node [_n
37f0: 6f 64 65 5f 6e 61 6d 65 20 24 70 61 74 68 20 24  ode_name $path $
3800: 6e 6f 64 65 5d 0a 20 20 20 20 69 66 20 7b 20 5b  node].    if { [
3810: 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24 6e 6f  string equal $no
3820: 64 65 20 22 72 6f 6f 74 22 5d 20 7c 7c 20 5c 0a  de "root"] || \.
3830: 09 20 20 20 20 21 5b 69 6e 66 6f 20 65 78 69 73  .    ![info exis
3840: 74 73 20 3a 3a 54 72 65 65 3a 3a 24 7b 70 61 74  ts ::Tree::${pat
3850: 68 7d 28 24 6e 6f 64 65 29 5d 20 7d 20 7b 0a 20  h}($node)] } {. 
3860: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63         return -c
3870: 6f 64 65 20 65 72 72 6f 72 20 22 6e 6f 64 65 20  ode error "node 
3880: 5c 22 24 6e 6f 64 65 5c 22 20 64 6f 65 73 20 6e  \"$node\" does n
3890: 6f 74 20 65 78 69 73 74 22 0a 20 20 20 20 7d 0a  ot exist".    }.
38a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 57 69 64  .    return [Wid
38b0: 67 65 74 3a 3a 63 67 65 74 20 24 70 61 74 68 2e  get::cget $path.
38c0: 24 6e 6f 64 65 20 24 6f 70 74 69 6f 6e 5d 0a 7d  $node $option].}
38d0: 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..# ------------
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: 0a 23 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a  .# Command Tree:
3930: 3a 62 69 6e 64 41 72 65 61 0a 23 20 2d 2d 2d 2d  :bindArea.# ----
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3980: 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72  --------.proc Tr
3990: 65 65 3a 3a 62 69 6e 64 41 72 65 61 20 7b 20 70  ee::bindArea { p
39a0: 61 74 68 20 65 76 65 6e 74 20 73 63 72 69 70 74  ath event script
39b0: 20 7d 20 7b 0a 20 20 20 20 62 69 6e 64 20 24 70   } {.    bind $p
39c0: 61 74 68 2e 63 20 24 65 76 65 6e 74 20 24 73 63  ath.c $event $sc
39d0: 72 69 70 74 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d  ript.}..# ------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e  ------.#  Comman
3a30: 64 20 54 72 65 65 3a 3a 62 69 6e 64 54 65 78 74  d Tree::bindText
3a40: 0a 23 20 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3a90: 70 72 6f 63 20 54 72 65 65 3a 3a 62 69 6e 64 54  proc Tree::bindT
3aa0: 65 78 74 20 7b 20 70 61 74 68 20 65 76 65 6e 74  ext { path event
3ab0: 20 73 63 72 69 70 74 20 7d 20 7b 0a 20 20 20 20   script } {.    
3ac0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
3ad0: 74 68 20 24 73 63 72 69 70 74 5d 7d 20 7b 0a 09  th $script]} {..
3ae0: 61 70 70 65 6e 64 20 73 63 72 69 70 74 20 22 20  append script " 
3af0: 5c 5b 54 72 65 65 3a 3a 5f 67 65 74 5f 6e 6f 64  \[Tree::_get_nod
3b00: 65 5f 6e 61 6d 65 20 5b 6c 69 73 74 20 24 70 61  e_name [list $pa
3b10: 74 68 5d 20 63 75 72 72 65 6e 74 20 32 20 31 5c  th] current 2 1\
3b20: 5d 22 0a 20 20 20 20 7d 0a 20 20 20 20 24 70 61  ]".    }.    $pa
3b30: 74 68 2e 63 20 62 69 6e 64 20 22 6e 6f 64 65 22  th.c bind "node"
3b40: 20 24 65 76 65 6e 74 20 24 73 63 72 69 70 74 0a   $event $script.
3b50: 20 20 20 20 69 66 20 7b 5b 57 69 64 67 65 74 3a      if {[Widget:
3b60: 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68  :getoption $path
3b70: 20 2d 73 65 6c 65 63 74 66 69 6c 6c 5d 7d 20 7b   -selectfill]} {
3b80: 0a 09 24 70 61 74 68 2e 63 20 62 69 6e 64 20 22  ..$path.c bind "
3b90: 62 6f 78 22 20 24 65 76 65 6e 74 20 24 73 63 72  box" $event $scr
3ba0: 69 70 74 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ipt.    } else {
3bb0: 0a 09 24 70 61 74 68 2e 63 20 62 69 6e 64 20 22  ..$path.c bind "
3bc0: 62 6f 78 22 20 24 65 76 65 6e 74 20 7b 7d 0a 20  box" $event {}. 
3bd0: 20 20 20 7d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d     }.}...# -----
3be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c20: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61  -------.#  Comma
3c30: 6e 64 20 54 72 65 65 3a 3a 62 69 6e 64 49 6d 61  nd Tree::bindIma
3c40: 67 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ge.# -----------
3c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3c90: 2d 0a 70 72 6f 63 20 54 72 65 65 3a 3a 62 69 6e  -.proc Tree::bin
3ca0: 64 49 6d 61 67 65 20 7b 20 70 61 74 68 20 65 76  dImage { path ev
3cb0: 65 6e 74 20 73 63 72 69 70 74 20 7d 20 7b 0a 20  ent script } {. 
3cc0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
3cd0: 65 6e 67 74 68 20 24 73 63 72 69 70 74 5d 7d 20  ength $script]} 
3ce0: 7b 0a 09 61 70 70 65 6e 64 20 73 63 72 69 70 74  {..append script
3cf0: 20 22 20 5c 5b 54 72 65 65 3a 3a 5f 67 65 74 5f   " \[Tree::_get_
3d00: 6e 6f 64 65 5f 6e 61 6d 65 20 5b 6c 69 73 74 20  node_name [list 
3d10: 24 70 61 74 68 5d 20 63 75 72 72 65 6e 74 20 32  $path] current 2
3d20: 20 31 5c 5d 22 0a 20 20 20 20 7d 0a 20 20 20 20   1\]".    }.    
3d30: 24 70 61 74 68 2e 63 20 62 69 6e 64 20 22 69 6d  $path.c bind "im
3d40: 67 22 20 24 65 76 65 6e 74 20 24 73 63 72 69 70  g" $event $scrip
3d50: 74 0a 20 20 20 20 69 66 20 7b 5b 57 69 64 67 65  t.    if {[Widge
3d60: 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61  t::getoption $pa
3d70: 74 68 20 2d 73 65 6c 65 63 74 66 69 6c 6c 5d 7d  th -selectfill]}
3d80: 20 7b 0a 09 24 70 61 74 68 2e 63 20 62 69 6e 64   {..$path.c bind
3d90: 20 22 62 6f 78 22 20 24 65 76 65 6e 74 20 24 73   "box" $event $s
3da0: 63 72 69 70 74 0a 20 20 20 20 7d 20 65 6c 73 65  cript.    } else
3db0: 20 7b 0a 09 24 70 61 74 68 2e 63 20 62 69 6e 64   {..$path.c bind
3dc0: 20 22 62 6f 78 22 20 24 65 76 65 6e 74 20 7b 7d   "box" $event {}
3dd0: 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 23 20 2d 2d 2d  .    }.}...# ---
3de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e00: 2d 2d 2d 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 0a 23 20 20 43 6f 6d  ---------.#  Com
3e30: 6d 61 6e 64 20 54 72 65 65 3a 3a 64 65 6c 65 74  mand Tree::delet
3e40: 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.# ------------
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e90: 0a 70 72 6f 63 20 54 72 65 65 3a 3a 64 65 6c 65  .proc Tree::dele
3ea0: 74 65 20 7b 20 70 61 74 68 20 61 72 67 73 20 7d  te { path args }
3eb0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
3ec0: 24 70 61 74 68 0a 20 20 20 20 75 70 76 61 72 20  $path.    upvar 
3ed0: 30 20 20 24 70 61 74 68 20 64 61 74 61 0a 0a 20  0  $path data.. 
3ee0: 20 20 20 73 65 74 20 73 65 6c 20 30 0a 20 20 20     set sel 0.   
3ef0: 20 66 6f 72 65 61 63 68 20 6c 6e 6f 64 65 73 20   foreach lnodes 
3f00: 24 61 72 67 73 20 7b 0a 09 66 6f 72 65 61 63 68  $args {..foreach
3f10: 20 6e 6f 64 65 20 24 6c 6e 6f 64 65 73 20 7b 0a   node $lnodes {.
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
3f30: 6e 6f 64 65 20 5b 5f 6e 6f 64 65 5f 6e 61 6d 65  node [_node_name
3f40: 20 24 70 61 74 68 20 24 6e 6f 64 65 5d 0a 09 20   $path $node].. 
3f50: 20 20 20 69 66 20 7b 20 21 5b 73 74 72 69 6e 67     if { ![string
3f60: 20 65 71 75 61 6c 20 24 6e 6f 64 65 20 22 72 6f   equal $node "ro
3f70: 6f 74 22 5d 20 26 26 20 5b 69 6e 66 6f 20 65 78  ot"] && [info ex
3f80: 69 73 74 73 20 64 61 74 61 28 24 6e 6f 64 65 29  ists data($node)
3f90: 5d 20 7d 20 7b 0a 09 09 73 65 74 20 70 61 72 65  ] } {...set pare
3fa0: 6e 74 20 5b 6c 69 6e 64 65 78 20 24 64 61 74 61  nt [lindex $data
3fb0: 28 24 6e 6f 64 65 29 20 30 5d 0a 09 09 73 65 74  ($node) 0]...set
3fc0: 20 69 64 78 09 20 20 20 5b 6c 73 65 61 72 63 68   idx.   [lsearch
3fd0: 20 2d 65 78 61 63 74 20 24 64 61 74 61 28 24 70   -exact $data($p
3fe0: 61 72 65 6e 74 29 20 24 6e 6f 64 65 5d 0a 09 09  arent) $node]...
3ff0: 73 65 74 20 64 61 74 61 28 24 70 61 72 65 6e 74  set data($parent
4000: 29 20 5b 6c 72 65 70 6c 61 63 65 20 24 64 61 74  ) [lreplace $dat
4010: 61 28 24 70 61 72 65 6e 74 29 20 24 69 64 78 20  a($parent) $idx 
4020: 24 69 64 78 5d 0a 09 09 69 6e 63 72 20 73 65 6c  $idx]...incr sel
4030: 20 5b 5f 73 75 62 64 65 6c 65 74 65 20 24 70 61   [_subdelete $pa
4040: 74 68 20 5b 6c 69 73 74 20 24 6e 6f 64 65 5d 5d  th [list $node]]
4050: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
4060: 0a 20 20 20 20 69 66 20 7b 24 73 65 6c 7d 20 7b  .    if {$sel} {
4070: 0a 09 23 20 69 66 20 73 65 6c 65 63 74 69 6f 6e  ..# if selection
4080: 20 63 68 61 6e 67 65 64 2c 20 63 61 6c 6c 20 74   changed, call t
4090: 68 65 20 73 65 6c 65 63 74 63 6f 6d 6d 61 6e 64  he selectcommand
40a0: 0a 09 5f 5f 63 61 6c 6c 5f 73 65 6c 65 63 74 63  ..__call_selectc
40b0: 6d 64 20 24 70 61 74 68 0a 20 20 20 20 7d 0a 0a  md $path.    }..
40c0: 20 20 20 20 5f 72 65 64 72 61 77 5f 69 64 6c 65      _redraw_idle
40d0: 20 24 70 61 74 68 20 33 0a 7d 0a 0a 0a 23 20 2d   $path 3.}...# -
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 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 0a 23 20 20 43  -----------.#  C
4130: 6f 6d 6d 61 6e 64 20 54 72 65 65 3a 3a 6d 6f 76  ommand Tree::mov
4140: 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.# ------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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: 0a 70 72 6f 63 20 54 72 65 65 3a 3a 6d 6f 76 65  .proc Tree::move
41a0: 20 7b 20 70 61 74 68 20 70 61 72 65 6e 74 20 6e   { path parent n
41b0: 6f 64 65 20 69 6e 64 65 78 20 7d 20 7b 0a 20 20  ode index } {.  
41c0: 20 20 76 61 72 69 61 62 6c 65 20 24 70 61 74 68    variable $path
41d0: 0a 20 20 20 20 75 70 76 61 72 20 30 20 20 24 70  .    upvar 0  $p
41e0: 61 74 68 20 64 61 74 61 0a 0a 20 20 20 20 73 65  ath data..    se
41f0: 74 20 6e 6f 64 65 20 5b 5f 6e 6f 64 65 5f 6e 61  t node [_node_na
4200: 6d 65 20 24 70 61 74 68 20 24 6e 6f 64 65 5d 0a  me $path $node].
4210: 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67      if { [string
4220: 20 65 71 75 61 6c 20 24 6e 6f 64 65 20 22 72 6f   equal $node "ro
4230: 6f 74 22 5d 20 7c 7c 20 21 5b 69 6e 66 6f 20 65  ot"] || ![info e
4240: 78 69 73 74 73 20 64 61 74 61 28 24 6e 6f 64 65  xists data($node
4250: 29 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 72  )] } {.        r
4260: 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f  eturn -code erro
4270: 72 20 22 6e 6f 64 65 20 5c 22 24 6e 6f 64 65 5c  r "node \"$node\
4280: 22 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  " does not exist
4290: 22 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b  ".    }.    if {
42a0: 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   ![info exists d
42b0: 61 74 61 28 24 70 61 72 65 6e 74 29 5d 20 7d 20  ata($parent)] } 
42c0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
42d0: 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 6e 6f   -code error "no
42e0: 64 65 20 5c 22 24 70 61 72 65 6e 74 5c 22 20 64  de \"$parent\" d
42f0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 22 0a 20  oes not exist". 
4300: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 70 20 24     }.    set p $
4310: 70 61 72 65 6e 74 0a 20 20 20 20 77 68 69 6c 65  parent.    while
4320: 20 7b 20 21 5b 73 74 72 69 6e 67 20 65 71 75 61   { ![string equa
4330: 6c 20 24 70 20 22 72 6f 6f 74 22 5d 20 7d 20 7b  l $p "root"] } {
4340: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 73  .        if { [s
4350: 74 72 69 6e 67 20 65 71 75 61 6c 20 24 70 20 24  tring equal $p $
4360: 6e 6f 64 65 5d 20 7d 20 7b 0a 20 20 20 20 20 20  node] } {.      
4370: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f        return -co
4380: 64 65 20 65 72 72 6f 72 20 22 6e 6f 64 65 20 5c  de error "node \
4390: 22 24 70 61 72 65 6e 74 5c 22 20 69 73 20 61 20  "$parent\" is a 
43a0: 64 65 73 63 65 6e 64 61 6e 74 20 6f 66 20 5c 22  descendant of \"
43b0: 24 6e 6f 64 65 5c 22 22 0a 20 20 20 20 20 20 20  $node\"".       
43c0: 20 7d 0a 20 20 20 20 20 20 20 20 73 65 74 20 70   }.        set p
43d0: 20 5b 70 61 72 65 6e 74 20 24 70 61 74 68 20 24   [parent $path $
43e0: 70 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65  p].    }..    se
43f0: 74 20 6f 6c 64 70 20 20 20 20 20 20 20 20 5b 6c  t oldp        [l
4400: 69 6e 64 65 78 20 24 64 61 74 61 28 24 6e 6f 64  index $data($nod
4410: 65 29 20 30 5d 0a 20 20 20 20 73 65 74 20 69 64  e) 0].    set id
4420: 78 20 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72  x         [lsear
4430: 63 68 20 2d 65 78 61 63 74 20 24 64 61 74 61 28  ch -exact $data(
4440: 24 6f 6c 64 70 29 20 24 6e 6f 64 65 5d 0a 20 20  $oldp) $node].  
4450: 20 20 73 65 74 20 64 61 74 61 28 24 6f 6c 64 70    set data($oldp
4460: 29 20 5b 6c 72 65 70 6c 61 63 65 20 24 64 61 74  ) [lreplace $dat
4470: 61 28 24 6f 6c 64 70 29 20 24 69 64 78 20 24 69  a($oldp) $idx $i
4480: 64 78 5d 0a 20 20 20 20 73 65 74 20 64 61 74 61  dx].    set data
4490: 28 24 6e 6f 64 65 29 20 5b 63 6f 6e 63 61 74 20  ($node) [concat 
44a0: 5b 6c 69 73 74 20 24 70 61 72 65 6e 74 5d 20 5b  [list $parent] [
44b0: 6c 72 61 6e 67 65 20 24 64 61 74 61 28 24 6e 6f  lrange $data($no
44c0: 64 65 29 20 31 20 65 6e 64 5d 5d 0a 20 20 20 20  de) 1 end]].    
44d0: 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 65 71 75  if { [string equ
44e0: 61 6c 20 24 69 6e 64 65 78 20 22 65 6e 64 22 5d  al $index "end"]
44f0: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 70   } {.        lap
4500: 70 65 6e 64 20 64 61 74 61 28 24 70 61 72 65 6e  pend data($paren
4510: 74 29 20 24 6e 6f 64 65 0a 20 20 20 20 7d 20 65  t) $node.    } e
4520: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  lse {.        in
4530: 63 72 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  cr index.       
4540: 20 73 65 74 20 64 61 74 61 28 24 70 61 72 65 6e   set data($paren
4550: 74 29 20 5b 6c 69 6e 73 65 72 74 20 24 64 61 74  t) [linsert $dat
4560: 61 28 24 70 61 72 65 6e 74 29 20 24 69 6e 64 65  a($parent) $inde
4570: 78 20 24 6e 6f 64 65 5d 0a 20 20 20 20 7d 0a 20  x $node].    }. 
4580: 20 20 20 69 66 20 7b 20 28 5b 73 74 72 69 6e 67     if { ([string
4590: 20 65 71 75 61 6c 20 24 6f 6c 64 70 20 22 72 6f   equal $oldp "ro
45a0: 6f 74 22 5d 20 7c 7c 0a 20 20 20 20 20 20 20 20  ot"] ||.        
45b0: 20 20 28 5b 76 69 73 69 62 6c 65 20 24 70 61 74    ([visible $pat
45c0: 68 20 24 6f 6c 64 70 5d 20 26 26 20 5b 57 69 64  h $oldp] && [Wid
45d0: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
45e0: 70 61 74 68 2e 24 6f 6c 64 70 20 20 20 2d 6f 70  path.$oldp   -op
45f0: 65 6e 5d 29 29 20 7c 7c 0a 20 20 20 20 20 20 20  en])) ||.       
4600: 20 20 28 5b 73 74 72 69 6e 67 20 65 71 75 61 6c    ([string equal
4610: 20 24 70 61 72 65 6e 74 20 22 72 6f 6f 74 22 5d   $parent "root"]
4620: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28 5b   ||.          ([
4630: 76 69 73 69 62 6c 65 20 24 70 61 74 68 20 24 70  visible $path $p
4640: 61 72 65 6e 74 5d 20 26 26 20 5b 57 69 64 67 65  arent] && [Widge
4650: 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61  t::getoption $pa
4660: 74 68 2e 24 70 61 72 65 6e 74 20 2d 6f 70 65 6e  th.$parent -open
4670: 5d 29 29 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  ])) } {.        
4680: 5f 72 65 64 72 61 77 5f 69 64 6c 65 20 24 70 61  _redraw_idle $pa
4690: 74 68 20 33 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 23  th 3.    }.}...#
46a0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
46f0: 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a 3a 72   Command Tree::r
4700: 65 6f 72 64 65 72 0a 23 20 2d 2d 2d 2d 2d 2d 2d  eorder.# -------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72 65 65 3a  -----.proc Tree:
4760: 3a 72 65 6f 72 64 65 72 20 7b 20 70 61 74 68 20  :reorder { path 
4770: 6e 6f 64 65 20 6e 65 77 6f 72 64 65 72 20 7d 20  node neworder } 
4780: 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 24  {.    variable $
4790: 70 61 74 68 0a 20 20 20 20 75 70 76 61 72 20 30  path.    upvar 0
47a0: 20 20 24 70 61 74 68 20 64 61 74 61 0a 0a 20 20    $path data..  
47b0: 20 20 73 65 74 20 6e 6f 64 65 20 5b 5f 6e 6f 64    set node [_nod
47c0: 65 5f 6e 61 6d 65 20 24 70 61 74 68 20 24 6e 6f  e_name $path $no
47d0: 64 65 5d 0a 20 20 20 20 69 66 20 7b 20 21 5b 69  de].    if { ![i
47e0: 6e 66 6f 20 65 78 69 73 74 73 20 64 61 74 61 28  nfo exists data(
47f0: 24 6e 6f 64 65 29 5d 20 7d 20 7b 0a 20 20 20 20  $node)] } {.    
4800: 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65      return -code
4810: 20 65 72 72 6f 72 20 22 6e 6f 64 65 20 5c 22 24   error "node \"$
4820: 6e 6f 64 65 5c 22 20 64 6f 65 73 20 6e 6f 74 20  node\" does not 
4830: 65 78 69 73 74 22 0a 20 20 20 20 7d 0a 20 20 20  exist".    }.   
4840: 20 73 65 74 20 63 68 69 6c 64 72 65 6e 20 5b 6c   set children [l
4850: 72 61 6e 67 65 20 24 64 61 74 61 28 24 6e 6f 64  range $data($nod
4860: 65 29 20 31 20 65 6e 64 5d 0a 20 20 20 20 69 66  e) 1 end].    if
4870: 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 24 63 68 69   { [llength $chi
4880: 6c 64 72 65 6e 5d 20 7d 20 7b 0a 20 20 20 20 20  ldren] } {.     
4890: 20 20 20 73 65 74 20 63 68 69 6c 64 72 65 6e 20     set children 
48a0: 5b 42 57 69 64 67 65 74 3a 3a 6c 72 65 6f 72 64  [BWidget::lreord
48b0: 65 72 20 24 63 68 69 6c 64 72 65 6e 20 24 6e 65  er $children $ne
48c0: 77 6f 72 64 65 72 5d 0a 20 20 20 20 20 20 20 20  worder].        
48d0: 73 65 74 20 64 61 74 61 28 24 6e 6f 64 65 29 20  set data($node) 
48e0: 5b 6c 69 6e 73 65 72 74 20 24 63 68 69 6c 64 72  [linsert $childr
48f0: 65 6e 20 30 20 5b 6c 69 6e 64 65 78 20 24 64 61  en 0 [lindex $da
4900: 74 61 28 24 6e 6f 64 65 29 20 30 5d 5d 0a 20 20  ta($node) 0]].  
4910: 20 20 20 20 20 20 69 66 20 7b 20 5b 76 69 73 69        if { [visi
4920: 62 6c 65 20 24 70 61 74 68 20 24 6e 6f 64 65 5d  ble $path $node]
4930: 20 26 26 20 5b 57 69 64 67 65 74 3a 3a 67 65 74   && [Widget::get
4940: 6f 70 74 69 6f 6e 20 24 70 61 74 68 2e 24 6e 6f  option $path.$no
4950: 64 65 20 2d 6f 70 65 6e 5d 20 7d 20 7b 0a 20 20  de -open] } {.  
4960: 20 20 20 20 20 20 20 20 20 20 5f 72 65 64 72 61            _redra
4970: 77 5f 69 64 6c 65 20 24 70 61 74 68 20 33 0a 20  w_idle $path 3. 
4980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d         }.    }.}
4990: 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...# -----------
49a0: 2d 2d 2d 2d 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 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 54 72 65  -.#  Command Tre
49f0: 65 3a 3a 73 65 6c 65 63 74 69 6f 6e 0a 23 20 2d  e::selection.# -
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63  -----------.proc
4a50: 20 54 72 65 65 3a 3a 73 65 6c 65 63 74 69 6f 6e   Tree::selection
4a60: 20 7b 20 70 61 74 68 20 63 6d 64 20 61 72 67 73   { path cmd args
4a70: 20 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c   } {.    variabl
4a80: 65 20 24 70 61 74 68 0a 20 20 20 20 75 70 76 61  e $path.    upva
4a90: 72 20 30 20 20 24 70 61 74 68 20 64 61 74 61 0a  r 0  $path data.
4aa0: 0a 20 20 20 20 73 77 69 74 63 68 20 2d 2d 20 24  .    switch -- $
4ab0: 63 6d 64 20 7b 0a 09 74 6f 67 67 6c 65 20 7b 0a  cmd {..toggle {.
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
4ad0: 61 63 68 20 6e 6f 64 65 20 24 61 72 67 73 20 7b  ach node $args {
4ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4af0: 20 73 65 74 20 6e 6f 64 65 20 5b 5f 6e 6f 64 65   set node [_node
4b00: 5f 6e 61 6d 65 20 24 70 61 74 68 20 24 6e 6f 64  _name $path $nod
4b10: 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e].             
4b20: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
4b30: 69 73 74 73 20 64 61 74 61 28 24 6e 6f 64 65 29  ists data($node)
4b40: 5d 7d 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72  ]} {...    retur
4b50: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 5c 0a  n -code error \.
4b60: 09 09 09 20 20 20 20 22 24 70 61 74 68 20 73 65  ...    "$path se
4b70: 6c 65 63 74 69 6f 6e 20 74 6f 67 67 6c 65 3a 20  lection toggle: 
4b80: 43 61 6e 6e 6f 74 20 74 6f 67 67 6c 65 20 75 6e  Cannot toggle un
4b90: 6b 6e 6f 77 6e 20 6e 6f 64 65 20 5c 22 24 6e 6f  known node \"$no
4ba0: 64 65 5c 22 2e 22 0a 09 09 7d 0a 09 20 20 20 20  de\"."...}..    
4bb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  }.            fo
4bc0: 72 65 61 63 68 20 6e 6f 64 65 20 24 61 72 67 73  reach node $args
4bd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4be0: 20 20 20 73 65 74 20 6e 6f 64 65 20 5b 5f 6e 6f     set node [_no
4bf0: 64 65 5f 6e 61 6d 65 20 24 70 61 74 68 20 24 6e  de_name $path $n
4c00: 6f 64 65 5d 0a 09 09 69 66 20 7b 5b 24 70 61 74  ode]...if {[$pat
4c10: 68 20 73 65 6c 65 63 74 69 6f 6e 20 69 6e 63 6c  h selection incl
4c20: 75 64 65 73 20 24 6e 6f 64 65 5d 7d 20 7b 0a 09  udes $node]} {..
4c30: 09 20 20 20 20 24 70 61 74 68 20 73 65 6c 65 63  .    $path selec
4c40: 74 69 6f 6e 20 72 65 6d 6f 76 65 20 24 6e 6f 64  tion remove $nod
4c50: 65 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  e...} else {... 
4c60: 20 20 20 24 70 61 74 68 20 73 65 6c 65 63 74 69     $path selecti
4c70: 6f 6e 20 61 64 64 20 24 6e 6f 64 65 0a 09 09 7d  on add $node...}
4c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 09  .            }..
4c90: 7d 0a 20 20 20 20 20 20 20 20 73 65 74 20 7b 0a  }.        set {.
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
4cb0: 61 63 68 20 6e 6f 64 65 20 24 61 72 67 73 20 7b  ach node $args {
4cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4cd0: 20 73 65 74 20 6e 6f 64 65 20 5b 5f 6e 6f 64 65   set node [_node
4ce0: 5f 6e 61 6d 65 20 24 70 61 74 68 20 24 6e 6f 64  _name $path $nod
4cf0: 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e].             
4d00: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
4d10: 69 73 74 73 20 64 61 74 61 28 24 6e 6f 64 65 29  ists data($node)
4d20: 5d 7d 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72  ]} {...    retur
4d30: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 5c 0a  n -code error \.
4d40: 09 09 09 20 20 20 20 22 24 70 61 74 68 20 73 65  ...    "$path se
4d50: 6c 65 63 74 69 6f 6e 20 73 65 74 3a 20 43 61 6e  lection set: Can
4d60: 6e 6f 74 20 73 65 6c 65 63 74 20 75 6e 6b 6e 6f  not select unkno
4d70: 77 6e 20 6e 6f 64 65 20 5c 22 24 6e 6f 64 65 5c  wn node \"$node\
4d80: 22 2e 22 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 20  "."...}..    }. 
4d90: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
4da0: 61 74 61 28 73 65 6c 6e 6f 64 65 73 29 20 7b 7d  ata(selnodes) {}
4db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
4dc0: 65 61 63 68 20 6e 6f 64 65 20 24 61 72 67 73 20  each node $args 
4dd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4de0: 20 20 73 65 74 20 6e 6f 64 65 20 5b 5f 6e 6f 64    set node [_nod
4df0: 65 5f 6e 61 6d 65 20 24 70 61 74 68 20 24 6e 6f  e_name $path $no
4e00: 64 65 5d 0a 09 09 69 66 20 7b 20 5b 57 69 64 67  de]...if { [Widg
4e10: 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70  et::getoption $p
4e20: 61 74 68 2e 24 6e 6f 64 65 20 2d 73 65 6c 65 63  ath.$node -selec
4e30: 74 61 62 6c 65 5d 20 7d 20 7b 0a 09 09 20 20 20  table] } {...   
4e40: 20 69 66 20 7b 20 5b 6c 73 65 61 72 63 68 20 2d   if { [lsearch -
4e50: 65 78 61 63 74 20 24 64 61 74 61 28 73 65 6c 6e  exact $data(seln
4e60: 6f 64 65 73 29 20 24 6e 6f 64 65 5d 20 3d 3d 20  odes) $node] == 
4e70: 2d 31 20 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e  -1 } {....lappen
4e80: 64 20 64 61 74 61 28 73 65 6c 6e 6f 64 65 73 29  d data(selnodes)
4e90: 20 24 6e 6f 64 65 0a 09 09 20 20 20 20 7d 0a 09   $node...    }..
4ea0: 09 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  .}.            }
4eb0: 0a 09 20 20 20 20 5f 5f 63 61 6c 6c 5f 73 65 6c  ..    __call_sel
4ec0: 65 63 74 63 6d 64 20 24 70 61 74 68 0a 20 20 20  ectcmd $path.   
4ed0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
4ee0: 64 64 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  dd {.           
4ef0: 20 66 6f 72 65 61 63 68 20 6e 6f 64 65 20 24 61   foreach node $a
4f00: 72 67 73 20 7b 0a 20 20 20 20 20 20 20 20 20 20  rgs {.          
4f10: 20 20 20 20 20 20 73 65 74 20 6e 6f 64 65 20 5b        set node [
4f20: 5f 6e 6f 64 65 5f 6e 61 6d 65 20 24 70 61 74 68  _node_name $path
4f30: 20 24 6e 6f 64 65 5d 0a 20 20 20 20 20 20 20 20   $node].        
4f40: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
4f50: 66 6f 20 65 78 69 73 74 73 20 64 61 74 61 28 24  fo exists data($
4f60: 6e 6f 64 65 29 5d 7d 20 7b 0a 09 09 20 20 20 20  node)]} {...    
4f70: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
4f80: 6f 72 20 5c 0a 09 09 09 20 20 20 20 22 24 70 61  or \....    "$pa
4f90: 74 68 20 73 65 6c 65 63 74 69 6f 6e 20 61 64 64  th selection add
4fa0: 3a 20 43 61 6e 6e 6f 74 20 73 65 6c 65 63 74 20  : Cannot select 
4fb0: 75 6e 6b 6e 6f 77 6e 20 6e 6f 64 65 20 5c 22 24  unknown node \"$
4fc0: 6e 6f 64 65 5c 22 2e 22 0a 09 09 7d 0a 09 20 20  node\"."...}..  
4fd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
4fe0: 66 6f 72 65 61 63 68 20 6e 6f 64 65 20 24 61 72  foreach node $ar
4ff0: 67 73 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  gs {.           
5000: 20 20 20 20 20 73 65 74 20 6e 6f 64 65 20 5b 5f       set node [_
5010: 6e 6f 64 65 5f 6e 61 6d 65 20 24 70 61 74 68 20  node_name $path 
5020: 24 6e 6f 64 65 5d 0a 09 09 69 66 20 7b 20 5b 57  $node]...if { [W
5030: 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e  idget::getoption
5040: 20 24 70 61 74 68 2e 24 6e 6f 64 65 20 2d 73 65   $path.$node -se
5050: 6c 65 63 74 61 62 6c 65 5d 20 7d 20 7b 0a 09 09  lectable] } {...
5060: 20 20 20 20 69 66 20 7b 20 5b 6c 73 65 61 72 63      if { [lsearc
5070: 68 20 2d 65 78 61 63 74 20 24 64 61 74 61 28 73  h -exact $data(s
5080: 65 6c 6e 6f 64 65 73 29 20 24 6e 6f 64 65 5d 20  elnodes) $node] 
5090: 3d 3d 20 2d 31 20 7d 20 7b 0a 09 09 09 6c 61 70  == -1 } {....lap
50a0: 70 65 6e 64 20 64 61 74 61 28 73 65 6c 6e 6f 64  pend data(selnod
50b0: 65 73 29 20 24 6e 6f 64 65 0a 09 09 20 20 20 20  es) $node...    
50c0: 7d 0a 09 09 7d 0a 20 20 20 20 20 20 20 20 20 20  }...}.          
50d0: 20 20 7d 0a 09 20 20 20 20 5f 5f 63 61 6c 6c 5f    }..    __call_
50e0: 73 65 6c 65 63 74 63 6d 64 20 24 70 61 74 68 0a  selectcmd $path.
50f0: 20 20 20 20 20 20 20 20 7d 0a 09 72 61 6e 67 65          }..range
5100: 20 7b 0a 09 20 20 20 20 23 20 48 65 72 65 27 73   {..    # Here's
5110: 20 6f 75 72 20 61 6c 67 6f 72 69 74 68 6d 3a 0a   our algorithm:.
5120: 09 20 20 20 20 23 20 20 20 20 6d 61 6b 65 20 61  .    #    make a
5130: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6e 6f 64   list of all nod
5140: 65 73 2c 20 74 68 65 6e 20 74 61 6b 65 20 74 68  es, then take th
5150: 65 20 72 61 6e 67 65 20 66 72 6f 6d 20 6e 6f 64  e range from nod
5160: 65 31 0a 09 20 20 20 20 23 20 20 20 20 74 6f 20  e1..    #    to 
5170: 6e 6f 64 65 32 20 61 6e 64 20 73 65 6c 65 63 74  node2 and select
5180: 20 74 68 6f 73 65 20 6e 6f 64 65 73 0a 09 20 20   those nodes..  
5190: 20 20 23 0a 09 20 20 20 20 23 20 54 68 69 73 20    #..    # This 
51a0: 77 6f 72 6b 73 20 62 65 63 61 75 73 65 20 6f 66  works because of
51b0: 20 68 6f 77 20 74 68 69 73 20 77 69 64 67 65 74   how this widget
51c0: 20 68 61 6e 64 6c 65 73 20 72 65 64 72 61 77 73   handles redraws
51d0: 3a 0a 09 20 20 20 20 23 20 20 20 20 54 68 65 20  :..    #    The 
51e0: 74 72 65 65 20 69 73 20 61 6c 77 61 79 73 20 63  tree is always c
51f0: 6f 6d 70 6c 65 74 65 6c 79 20 72 65 64 72 61 77  ompletely redraw
5200: 6e 2c 20 61 6e 64 20 61 6c 77 61 79 73 20 66 72  n, and always fr
5210: 6f 6d 0a 09 20 20 20 20 23 20 20 20 20 74 6f 70  om..    #    top
5220: 20 74 6f 20 62 6f 74 74 6f 6d 2e 20 53 6f 20 74   to bottom. So t
5230: 68 65 20 6c 69 73 74 20 6f 66 20 76 69 73 69 62  he list of visib
5240: 6c 65 20 6e 6f 64 65 73 20 2a 69 73 2a 20 74 68  le nodes *is* th
5250: 65 0a 09 20 20 20 20 23 20 20 20 20 6c 69 73 74  e..    #    list
5260: 20 6f 66 20 6e 6f 64 65 73 2c 20 61 6e 64 20 77   of nodes, and w
5270: 65 20 63 61 6e 20 75 73 65 20 74 68 61 74 20 74  e can use that t
5280: 6f 20 64 65 63 69 64 65 20 77 68 69 63 68 20 6e  o decide which n
5290: 6f 64 65 73 0a 09 20 20 20 20 23 20 20 20 20 74  odes..    #    t
52a0: 6f 20 73 65 6c 65 63 74 2e 0a 0a 09 20 20 20 20  o select....    
52b0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72  if {[llength $ar
52c0: 67 73 5d 20 21 3d 20 32 7d 20 7b 0a 09 09 72 65  gs] != 2} {...re
52d0: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72  turn -code error
52e0: 20 5c 0a 09 09 09 22 77 72 6f 6e 67 23 61 72 67   \...."wrong#arg
52f0: 73 3a 20 45 78 70 65 63 74 65 64 20 24 70 61 74  s: Expected $pat
5300: 68 20 73 65 6c 65 63 74 69 6f 6e 20 72 61 6e 67  h selection rang
5310: 65 20 6e 6f 64 65 31 20 6e 6f 64 65 32 22 0a 09  e node1 node2"..
5320: 20 20 20 20 7d 0a 0a 09 20 20 20 20 66 6f 72 65      }...    fore
5330: 61 63 68 20 7b 6e 6f 64 65 31 20 6e 6f 64 65 32  ach {node1 node2
5340: 7d 20 24 61 72 67 73 20 62 72 65 61 6b 0a 0a 20  } $args break.. 
5350: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e             set n
5360: 6f 64 65 31 20 5b 5f 6e 6f 64 65 5f 6e 61 6d 65  ode1 [_node_name
5370: 20 24 70 61 74 68 20 24 6e 6f 64 65 31 5d 0a 20   $path $node1]. 
5380: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e             set n
5390: 6f 64 65 32 20 5b 5f 6e 6f 64 65 5f 6e 61 6d 65  ode2 [_node_name
53a0: 20 24 70 61 74 68 20 24 6e 6f 64 65 32 5d 0a 09   $path $node2]..
53b0: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
53c0: 78 69 73 74 73 20 64 61 74 61 28 24 6e 6f 64 65  xists data($node
53d0: 31 29 5d 7d 20 7b 0a 09 09 72 65 74 75 72 6e 20  1)]} {...return 
53e0: 2d 63 6f 64 65 20 65 72 72 6f 72 20 5c 0a 09 09  -code error \...
53f0: 09 22 24 70 61 74 68 20 73 65 6c 65 63 74 69 6f  ."$path selectio
5400: 6e 20 72 61 6e 67 65 3a 20 43 61 6e 6e 6f 74 20  n range: Cannot 
5410: 73 74 61 72 74 20 72 61 6e 67 65 20 61 74 20 75  start range at u
5420: 6e 6b 6e 6f 77 6e 20 6e 6f 64 65 20 5c 22 24 6e  nknown node \"$n
5430: 6f 64 65 31 5c 22 2e 22 0a 09 20 20 20 20 7d 0a  ode1\"."..    }.
5440: 09 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20  .    if {![info 
5450: 65 78 69 73 74 73 20 64 61 74 61 28 24 6e 6f 64  exists data($nod
5460: 65 32 29 5d 7d 20 7b 0a 09 09 72 65 74 75 72 6e  e2)]} {...return
5470: 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 5c 0a 09   -code error \..
5480: 09 09 22 24 70 61 74 68 20 73 65 6c 65 63 74 69  .."$path selecti
5490: 6f 6e 20 72 61 6e 67 65 3a 20 43 61 6e 6e 6f 74  on range: Cannot
54a0: 20 65 6e 64 20 72 61 6e 67 65 20 61 74 20 75 6e   end range at un
54b0: 6b 6e 6f 77 6e 20 6e 6f 64 65 20 5c 22 24 6e 6f  known node \"$no
54c0: 64 65 32 5c 22 2e 22 0a 09 20 20 20 20 7d 0a 0a  de2\"."..    }..
54d0: 09 20 20 20 20 73 65 74 20 6e 6f 64 65 73 20 7b  .    set nodes {
54e0: 7d 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 6e  }..    foreach n
54f0: 6f 64 65 49 74 65 6d 20 5b 24 70 61 74 68 2e 63  odeItem [$path.c
5500: 20 66 69 6e 64 20 77 69 74 68 74 61 67 20 6e 6f   find withtag no
5510: 64 65 5d 20 7b 0a 09 09 73 65 74 20 6e 6f 64 65  de] {...set node
5520: 20 5b 54 72 65 65 3a 3a 5f 67 65 74 5f 6e 6f 64   [Tree::_get_nod
5530: 65 5f 6e 61 6d 65 20 24 70 61 74 68 20 24 6e 6f  e_name $path $no
5540: 64 65 49 74 65 6d 20 32 5d 0a 09 09 69 66 20 7b  deItem 2]...if {
5550: 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74   [Widget::getopt
5560: 69 6f 6e 20 24 70 61 74 68 2e 24 6e 6f 64 65 20  ion $path.$node 
5570: 2d 73 65 6c 65 63 74 61 62 6c 65 5d 20 7d 20 7b  -selectable] } {
5580: 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6e  ...    lappend n
5590: 6f 64 65 73 20 24 6e 6f 64 65 0a 09 09 7d 0a 09  odes $node...}..
55a0: 20 20 20 20 7d 0a 09 20 20 20 20 23 20 73 75 72      }..    # sur
55b0: 6c 65 73 3a 20 53 65 74 20 74 68 65 20 72 6f 6f  les: Set the roo
55c0: 74 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20  t string to the 
55d0: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e  first element on
55e0: 20 74 68 65 20 6c 69 73 74 2e 0a 09 20 20 20 20   the list...    
55f0: 69 66 20 7b 24 6e 6f 64 65 31 20 3d 3d 20 22 72  if {$node1 == "r
5600: 6f 6f 74 22 7d 20 7b 0a 09 09 73 65 74 20 6e 6f  oot"} {...set no
5610: 64 65 31 20 5b 6c 69 6e 64 65 78 20 24 6e 6f 64  de1 [lindex $nod
5620: 65 73 20 30 5d 0a 09 20 20 20 20 7d 0a 09 20 20  es 0]..    }..  
5630: 20 20 69 66 20 7b 24 6e 6f 64 65 32 20 3d 3d 20    if {$node2 == 
5640: 22 72 6f 6f 74 22 7d 20 7b 0a 09 09 73 65 74 20  "root"} {...set 
5650: 6e 6f 64 65 32 20 5b 6c 69 6e 64 65 78 20 24 6e  node2 [lindex $n
5660: 6f 64 65 73 20 30 5d 0a 09 20 20 20 20 7d 0a 0a  odes 0]..    }..
5670: 09 20 20 20 20 23 20 46 69 6e 64 20 74 68 65 20  .    # Find the 
5680: 66 69 72 73 74 20 76 69 73 69 62 6c 65 20 61 6e  first visible an
5690: 63 65 73 74 6f 72 20 6f 66 20 6e 6f 64 65 31 2c  cestor of node1,
56a0: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 6e   starting with n
56b0: 6f 64 65 31 0a 09 20 20 20 20 77 68 69 6c 65 20  ode1..    while 
56c0: 7b 5b 73 65 74 20 69 6e 64 65 78 31 20 5b 6c 73  {[set index1 [ls
56d0: 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 6e 6f  earch -exact $no
56e0: 64 65 73 20 24 6e 6f 64 65 31 5d 5d 20 3d 3d 20  des $node1]] == 
56f0: 2d 31 7d 20 7b 0a 09 09 73 65 74 20 6e 6f 64 65  -1} {...set node
5700: 31 20 5b 6c 69 6e 64 65 78 20 24 64 61 74 61 28  1 [lindex $data(
5710: 24 6e 6f 64 65 31 29 20 30 5d 0a 09 20 20 20 20  $node1) 0]..    
5720: 7d 0a 09 20 20 20 20 23 20 46 69 6e 64 20 74 68  }..    # Find th
5730: 65 20 66 69 72 73 74 20 76 69 73 69 62 6c 65 20  e first visible 
5740: 61 6e 63 65 73 74 6f 72 20 6f 66 20 6e 6f 64 65  ancestor of node
5750: 32 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  2, starting with
5760: 20 6e 6f 64 65 32 0a 09 20 20 20 20 77 68 69 6c   node2..    whil
5770: 65 20 7b 5b 73 65 74 20 69 6e 64 65 78 32 20 5b  e {[set index2 [
5780: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24  lsearch -exact $
5790: 6e 6f 64 65 73 20 24 6e 6f 64 65 32 5d 5d 20 3d  nodes $node2]] =
57a0: 3d 20 2d 31 7d 20 7b 0a 09 09 73 65 74 20 6e 6f  = -1} {...set no
57b0: 64 65 32 20 5b 6c 69 6e 64 65 78 20 24 64 61 74  de2 [lindex $dat
57c0: 61 28 24 6e 6f 64 65 32 29 20 30 5d 0a 09 20 20  a($node2) 0]..  
57d0: 20 20 7d 0a 09 20 20 20 20 23 20 49 66 20 74 68    }..    # If th
57e0: 65 20 6e 6f 64 65 73 20 77 65 72 65 20 67 69 76  e nodes were giv
57f0: 65 6e 20 69 6e 20 62 61 63 6b 77 61 72 64 73 20  en in backwards 
5800: 6f 72 64 65 72 2c 20 66 6c 69 70 20 74 68 65 0a  order, flip the.
5810: 09 20 20 20 20 23 20 69 6e 64 69 63 65 73 20 6e  .    # indices n
5820: 6f 77 0a 09 20 20 20 20 69 66 20 7b 20 24 69 6e  ow..    if { $in
5830: 64 65 78 32 20 3c 20 24 69 6e 64 65 78 31 20 7d  dex2 < $index1 }
5840: 20 7b 0a 09 09 69 6e 63 72 20 69 6e 64 65 78 31   {...incr index1
5850: 20 24 69 6e 64 65 78 32 0a 09 09 73 65 74 20 69   $index2...set i
5860: 6e 64 65 78 32 20 5b 65 78 70 72 20 7b 24 69 6e  ndex2 [expr {$in
5870: 64 65 78 31 20 2d 20 24 69 6e 64 65 78 32 7d 5d  dex1 - $index2}]
5880: 0a 09 09 73 65 74 20 69 6e 64 65 78 31 20 5b 65  ...set index1 [e
5890: 78 70 72 20 7b 24 69 6e 64 65 78 31 20 2d 20 24  xpr {$index1 - $
58a0: 69 6e 64 65 78 32 7d 5d 0a 09 20 20 20 20 7d 0a  index2}]..    }.
58b0: 09 20 20 20 20 73 65 74 20 64 61 74 61 28 73 65  .    set data(se
58c0: 6c 6e 6f 64 65 73 29 20 5b 6c 72 61 6e 67 65 20  lnodes) [lrange 
58d0: 24 6e 6f 64 65 73 20 24 69 6e 64 65 78 31 20 24  $nodes $index1 $
58e0: 69 6e 64 65 78 32 5d 0a 09 20 20 20 20 5f 5f 63  index2]..    __c
58f0: 61 6c 6c 5f 73 65 6c 65 63 74 63 6d 64 20 24 70  all_selectcmd $p
5900: 61 74 68 0a 09 7d 0a 20 20 20 20 20 20 20 20 72  ath..}.        r
5910: 65 6d 6f 76 65 20 7b 0a 20 20 20 20 20 20 20 20  emove {.        
5920: 20 20 20 20 66 6f 72 65 61 63 68 20 6e 6f 64 65      foreach node
5930: 20 24 61 72 67 73 20 7b 0a 20 20 20 20 20 20 20   $args {.       
5940: 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 64           set nod
5950: 65 20 5b 5f 6e 6f 64 65 5f 6e 61 6d 65 20 24 70  e [_node_name $p
5960: 61 74 68 20 24 6e 6f 64 65 5d 0a 20 20 20 20 20  ath $node].     
5970: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 20             if { 
5980: 5b 73 65 74 20 69 64 78 20 5b 6c 73 65 61 72 63  [set idx [lsearc
5990: 68 20 2d 65 78 61 63 74 20 24 64 61 74 61 28 73  h -exact $data(s
59a0: 65 6c 6e 6f 64 65 73 29 20 24 6e 6f 64 65 5d 5d  elnodes) $node]]
59b0: 20 21 3d 20 2d 31 20 7d 20 7b 0a 20 20 20 20 20   != -1 } {.     
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
59d0: 65 74 20 64 61 74 61 28 73 65 6c 6e 6f 64 65 73  et data(selnodes
59e0: 29 20 5b 6c 72 65 70 6c 61 63 65 20 24 64 61 74  ) [lreplace $dat
59f0: 61 28 73 65 6c 6e 6f 64 65 73 29 20 24 69 64 78  a(selnodes) $idx
5a00: 20 24 69 64 78 5d 0a 20 20 20 20 20 20 20 20 20   $idx].         
5a10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5a20: 20 20 20 20 20 7d 0a 09 20 20 20 20 5f 5f 63 61       }..    __ca
5a30: 6c 6c 5f 73 65 6c 65 63 74 63 6d 64 20 24 70 61  ll_selectcmd $pa
5a40: 74 68 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  th.        }.   
5a50: 20 20 20 20 20 63 6c 65 61 72 20 7b 0a 09 20 20       clear {..  
5a60: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
5a70: 61 72 67 73 5d 20 21 3d 20 30 7d 20 7b 0a 09 09  args] != 0} {...
5a80: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
5a90: 6f 72 20 5c 0a 09 09 09 22 77 72 6f 6e 67 23 61  or \...."wrong#a
5aa0: 72 67 73 3a 20 45 78 70 65 63 74 65 64 20 24 70  rgs: Expected $p
5ab0: 61 74 68 20 73 65 6c 65 63 74 69 6f 6e 20 63 6c  ath selection cl
5ac0: 65 61 72 22 0a 09 20 20 20 20 7d 0a 20 20 20 20  ear"..    }.    
5ad0: 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
5ae0: 28 73 65 6c 6e 6f 64 65 73 29 20 7b 7d 0a 09 20  (selnodes) {}.. 
5af0: 20 20 20 5f 5f 63 61 6c 6c 5f 73 65 6c 65 63 74     __call_select
5b00: 63 6d 64 20 24 70 61 74 68 0a 20 20 20 20 20 20  cmd $path.      
5b10: 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 20    }.        get 
5b20: 7b 0a 09 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  {..    if {[llen
5b30: 67 74 68 20 24 61 72 67 73 5d 20 21 3d 20 30 7d  gth $args] != 0}
5b40: 20 7b 0a 09 09 72 65 74 75 72 6e 20 2d 63 6f 64   {...return -cod
5b50: 65 20 65 72 72 6f 72 20 5c 0a 09 09 09 22 77 72  e error \...."wr
5b60: 6f 6e 67 23 61 72 67 73 3a 20 45 78 70 65 63 74  ong#args: Expect
5b70: 65 64 20 24 70 61 74 68 20 73 65 6c 65 63 74 69  ed $path selecti
5b80: 6f 6e 20 67 65 74 22 0a 09 20 20 20 20 7d 0a 20  on get"..    }. 
5b90: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e             set n
5ba0: 6f 64 65 73 20 5b 6c 69 73 74 5d 0a 09 20 20 20  odes [list]..   
5bb0: 20 66 6f 72 65 61 63 68 20 6e 6f 64 65 20 24 64   foreach node $d
5bc0: 61 74 61 28 73 65 6c 6e 6f 64 65 73 29 20 7b 0a  ata(selnodes) {.
5bd0: 09 09 6c 61 70 70 65 6e 64 20 6e 6f 64 65 73 20  ..lappend nodes 
5be0: 5b 5f 6e 6f 64 65 5f 6e 61 6d 65 5f 72 65 76 20  [_node_name_rev 
5bf0: 24 70 61 74 68 20 24 6e 6f 64 65 5d 0a 09 20 20  $path $node]..  
5c00: 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
5c10: 24 6e 6f 64 65 73 0a 20 20 20 20 20 20 20 20 7d  $nodes.        }
5c20: 0a 20 20 20 20 20 20 20 20 69 6e 63 6c 75 64 65  .        include
5c30: 73 20 7b 0a 09 20 20 20 20 69 66 20 7b 5b 6c 6c  s {..    if {[ll
5c40: 65 6e 67 74 68 20 24 61 72 67 73 5d 20 21 3d 20  ength $args] != 
5c50: 31 7d 20 7b 0a 09 09 72 65 74 75 72 6e 20 2d 63  1} {...return -c
5c60: 6f 64 65 20 65 72 72 6f 72 20 5c 0a 09 09 09 22  ode error \...."
5c70: 77 72 6f 6e 67 23 61 72 67 73 3a 20 45 78 70 65  wrong#args: Expe
5c80: 63 74 65 64 20 24 70 61 74 68 20 73 65 6c 65 63  cted $path selec
5c90: 74 69 6f 6e 20 69 6e 63 6c 75 64 65 73 20 6e 6f  tion includes no
5ca0: 64 65 22 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  de"..    }..    
5cb0: 73 65 74 20 6e 6f 64 65 20 5b 6c 69 6e 64 65 78  set node [lindex
5cc0: 20 24 61 72 67 73 20 30 5d 0a 20 20 20 20 20 20   $args 0].      
5cd0: 20 20 20 20 20 20 73 65 74 20 6e 6f 64 65 20 5b        set node [
5ce0: 5f 6e 6f 64 65 5f 6e 61 6d 65 20 24 70 61 74 68  _node_name $path
5cf0: 20 24 6e 6f 64 65 5d 0a 20 20 20 20 20 20 20 20   $node].        
5d00: 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72      return [expr
5d10: 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63   {[lsearch -exac
5d20: 74 20 24 64 61 74 61 28 73 65 6c 6e 6f 64 65 73  t $data(selnodes
5d30: 29 20 24 6e 6f 64 65 5d 20 21 3d 20 2d 31 7d 5d  ) $node] != -1}]
5d40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5d50: 20 20 20 64 65 66 61 75 6c 74 20 7b 0a 20 20 20     default {.   
5d60: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0a           return.
5d70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
5d80: 20 20 20 20 5f 72 65 64 72 61 77 5f 69 64 6c 65      _redraw_idle
5d90: 20 24 70 61 74 68 20 31 0a 7d 0a 0a 0a 70 72 6f   $path 1.}...pro
5da0: 63 20 54 72 65 65 3a 3a 67 65 74 63 61 6e 76 61  c Tree::getcanva
5db0: 73 20 7b 20 70 61 74 68 20 7d 20 7b 0a 20 20 20  s { path } {.   
5dc0: 20 72 65 74 75 72 6e 20 24 70 61 74 68 2e 63 0a   return $path.c.
5dd0: 7d 0a 0a 0a 70 72 6f 63 20 54 72 65 65 3a 3a 5f  }...proc Tree::_
5de0: 5f 63 61 6c 6c 5f 73 65 6c 65 63 74 63 6d 64 20  _call_selectcmd 
5df0: 7b 20 70 61 74 68 20 7d 20 7b 0a 20 20 20 20 76  { path } {.    v
5e00: 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20 20  ariable $path.  
5e10: 20 20 75 70 76 61 72 20 30 20 20 24 70 61 74 68    upvar 0  $path
5e20: 20 64 61 74 61 0a 0a 20 20 20 20 73 65 74 20 73   data..    set s
5e30: 65 6c 65 63 74 63 6d 64 20 5b 57 69 64 67 65 74  electcmd [Widget
5e40: 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74  ::getoption $pat
5e50: 68 20 2d 73 65 6c 65 63 74 63 6f 6d 6d 61 6e 64  h -selectcommand
5e60: 5d 0a 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67  ].    if {[lleng
5e70: 74 68 20 24 73 65 6c 65 63 74 63 6d 64 5d 7d 20  th $selectcmd]} 
5e80: 7b 0a 09 6c 61 70 70 65 6e 64 20 73 65 6c 65 63  {..lappend selec
5e90: 74 63 6d 64 20 24 70 61 74 68 0a 09 6c 61 70 70  tcmd $path..lapp
5ea0: 65 6e 64 20 73 65 6c 65 63 74 63 6d 64 20 24 64  end selectcmd $d
5eb0: 61 74 61 28 73 65 6c 6e 6f 64 65 73 29 0a 09 75  ata(selnodes)..u
5ec0: 70 6c 65 76 65 6c 20 5c 23 30 20 24 73 65 6c 65  plevel \#0 $sele
5ed0: 63 74 63 6d 64 0a 20 20 20 20 7d 0a 20 20 20 20  ctcmd.    }.    
5ee0: 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 2d 2d 2d 2d  return.}..# ----
5ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f30: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d  --------.#  Comm
5f40: 61 6e 64 20 54 72 65 65 3a 3a 65 78 69 73 74 73  and Tree::exists
5f50: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5fa0: 70 72 6f 63 20 54 72 65 65 3a 3a 65 78 69 73 74  proc Tree::exist
5fb0: 73 20 7b 20 70 61 74 68 20 6e 6f 64 65 20 7d 20  s { path node } 
5fc0: 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 24  {.    variable $
5fd0: 70 61 74 68 0a 20 20 20 20 75 70 76 61 72 20 30  path.    upvar 0
5fe0: 20 20 24 70 61 74 68 20 64 61 74 61 0a 0a 20 20    $path data..  
5ff0: 20 20 73 65 74 20 6e 6f 64 65 20 5b 5f 6e 6f 64    set node [_nod
6000: 65 5f 6e 61 6d 65 20 24 70 61 74 68 20 24 6e 6f  e_name $path $no
6010: 64 65 5d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b  de].    return [
6020: 69 6e 66 6f 20 65 78 69 73 74 73 20 64 61 74 61  info exists data
6030: 28 24 6e 6f 64 65 29 5d 0a 7d 0a 0a 0a 23 20 2d  ($node)].}...# -
6040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43  -----------.#  C
6090: 6f 6d 6d 61 6e 64 20 54 72 65 65 3a 3a 76 69 73  ommand Tree::vis
60a0: 69 62 6c 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ible.# ---------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 0a 70 72 6f 63 20 54 72 65 65 3a 3a 76  ---.proc Tree::v
6100: 69 73 69 62 6c 65 20 7b 20 70 61 74 68 20 6e 6f  isible { path no
6110: 64 65 20 7d 20 7b 0a 20 20 20 20 73 65 74 20 6e  de } {.    set n
6120: 6f 64 65 20 5b 5f 6e 6f 64 65 5f 6e 61 6d 65 20  ode [_node_name 
6130: 24 70 61 74 68 20 24 6e 6f 64 65 5d 0a 20 20 20  $path $node].   
6140: 20 73 65 74 20 69 64 6e 20 5b 24 70 61 74 68 2e   set idn [$path.
6150: 63 20 66 69 6e 64 20 77 69 74 68 74 61 67 20 6e  c find withtag n
6160: 3a 24 6e 6f 64 65 5d 0a 20 20 20 20 72 65 74 75  :$node].    retu
6170: 72 6e 20 5b 6c 6c 65 6e 67 74 68 20 24 69 64 6e  rn [llength $idn
6180: 5d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d  ].}...# --------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61d0: 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20  ----.#  Command 
61e0: 54 72 65 65 3a 3a 70 61 72 65 6e 74 0a 23 20 2d  Tree::parent.# -
61f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63  -----------.proc
6240: 20 54 72 65 65 3a 3a 70 61 72 65 6e 74 20 7b 20   Tree::parent { 
6250: 70 61 74 68 20 6e 6f 64 65 20 7d 20 7b 0a 20 20  path node } {.  
6260: 20 20 76 61 72 69 61 62 6c 65 20 24 70 61 74 68    variable $path
6270: 0a 20 20 20 20 75 70 76 61 72 20 30 20 20 24 70  .    upvar 0  $p
6280: 61 74 68 20 64 61 74 61 0a 0a 20 20 20 20 73 65  ath data..    se
6290: 74 20 6e 6f 64 65 20 5b 5f 6e 6f 64 65 5f 6e 61  t node [_node_na
62a0: 6d 65 20 24 70 61 74 68 20 24 6e 6f 64 65 5d 0a  me $path $node].
62b0: 20 20 20 20 69 66 20 7b 20 21 5b 69 6e 66 6f 20      if { ![info 
62c0: 65 78 69 73 74 73 20 64 61 74 61 28 24 6e 6f 64  exists data($nod
62d0: 65 29 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  e)] } {.        
62e0: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
62f0: 6f 72 20 22 6e 6f 64 65 20 5c 22 24 6e 6f 64 65  or "node \"$node
6300: 5c 22 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  \" does not exis
6310: 74 22 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  t".    }.    ret
6320: 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 64 61 74  urn [lindex $dat
6330: 61 28 24 6e 6f 64 65 29 20 30 5d 0a 7d 0a 0a 0a  a($node) 0].}...
6340: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
6390: 20 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a 3a    Command Tree::
63a0: 69 6e 64 65 78 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d  index.# --------
63b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
63f0: 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72 65 65 3a 3a  ----.proc Tree::
6400: 69 6e 64 65 78 20 7b 20 70 61 74 68 20 6e 6f 64  index { path nod
6410: 65 20 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62  e } {.    variab
6420: 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75 70 76  le $path.    upv
6430: 61 72 20 30 20 20 24 70 61 74 68 20 64 61 74 61  ar 0  $path data
6440: 0a 0a 20 20 20 20 73 65 74 20 6e 6f 64 65 20 5b  ..    set node [
6450: 5f 6e 6f 64 65 5f 6e 61 6d 65 20 24 70 61 74 68  _node_name $path
6460: 20 24 6e 6f 64 65 5d 0a 20 20 20 20 69 66 20 7b   $node].    if {
6470: 20 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24   [string equal $
6480: 6e 6f 64 65 20 22 72 6f 6f 74 22 5d 20 7c 7c 20  node "root"] || 
6490: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 61  ![info exists da
64a0: 74 61 28 24 6e 6f 64 65 29 5d 20 7d 20 7b 0a 20  ta($node)] } {. 
64b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63         return -c
64c0: 6f 64 65 20 65 72 72 6f 72 20 22 6e 6f 64 65 20  ode error "node 
64d0: 5c 22 24 6e 6f 64 65 5c 22 20 64 6f 65 73 20 6e  \"$node\" does n
64e0: 6f 74 20 65 78 69 73 74 22 0a 20 20 20 20 7d 0a  ot exist".    }.
64f0: 20 20 20 20 73 65 74 20 70 61 72 65 6e 74 20 5b      set parent [
6500: 6c 69 6e 64 65 78 20 24 64 61 74 61 28 24 6e 6f  lindex $data($no
6510: 64 65 29 20 30 5d 0a 20 20 20 20 72 65 74 75 72  de) 0].    retur
6520: 6e 20 5b 65 78 70 72 20 7b 5b 6c 73 65 61 72 63  n [expr {[lsearc
6530: 68 20 2d 65 78 61 63 74 20 24 64 61 74 61 28 24  h -exact $data($
6540: 70 61 72 65 6e 74 29 20 24 6e 6f 64 65 5d 20 2d  parent) $node] -
6550: 20 31 7d 5d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d   1}].}...# -----
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 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 54 72 65 65 3a  -------.#  Tree:
65b0: 3a 66 69 6e 64 0a 23 20 20 20 20 20 52 65 74 75  :find.#     Retu
65c0: 72 6e 73 20 74 68 65 20 6e 6f 64 65 20 67 69 76  rns the node giv
65d0: 65 6e 20 61 20 70 6f 73 69 74 69 6f 6e 2e 0a 23  en a position..#
65e0: 20 20 66 69 6e 64 49 6e 66 6f 20 20 20 20 20 40    findInfo     @
65f0: 78 2c 79 20 3f 63 6f 6e 66 69 6e 65 3f 0a 23 20  x,y ?confine?.# 
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
6610: 6e 65 4e 75 6d 62 65 72 0a 23 20 2d 2d 2d 2d 2d  neNumber.# -----
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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6660: 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72 65  -------.proc Tre
6670: 65 3a 3a 66 69 6e 64 20 7b 70 61 74 68 20 66 69  e::find {path fi
6680: 6e 64 49 6e 66 6f 20 7b 63 6f 6e 66 69 6e 65 20  ndInfo {confine 
6690: 22 22 7d 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b  ""}} {.    if {[
66a0: 72 65 67 65 78 70 20 2d 2d 20 7b 5e 40 28 5b 30  regexp -- {^@([0
66b0: 2d 39 5d 2b 29 2c 28 5b 30 2d 39 5d 2b 29 24 7d  -9]+),([0-9]+)$}
66c0: 20 24 66 69 6e 64 49 6e 66 6f 20 6d 61 74 63 68   $findInfo match
66d0: 20 78 20 79 5d 7d 20 7b 0a 20 20 20 20 20 20 20   x y]} {.       
66e0: 20 73 65 74 20 78 20 5b 24 70 61 74 68 2e 63 20   set x [$path.c 
66f0: 63 61 6e 76 61 73 78 20 24 78 5d 0a 20 20 20 20  canvasx $x].    
6700: 20 20 20 20 73 65 74 20 79 20 5b 24 70 61 74 68      set y [$path
6710: 2e 63 20 63 61 6e 76 61 73 79 20 24 79 5d 0a 20  .c canvasy $y]. 
6720: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 72 65     } elseif {[re
6730: 67 65 78 70 20 2d 2d 20 7b 5e 5b 30 2d 39 5d 2b  gexp -- {^[0-9]+
6740: 24 7d 20 24 66 69 6e 64 49 6e 66 6f 20 6c 69 6e  $} $findInfo lin
6750: 65 4e 75 6d 62 65 72 5d 7d 20 7b 0a 20 20 20 20  eNumber]} {.    
6760: 20 20 20 20 73 65 74 20 64 79 20 5b 57 69 64 67      set dy [Widg
6770: 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70  et::getoption $p
6780: 61 74 68 20 2d 64 65 6c 74 61 79 5d 0a 20 20 20  ath -deltay].   
6790: 20 20 20 20 20 73 65 74 20 79 20 20 5b 65 78 70       set y  [exp
67a0: 72 20 7b 24 64 79 2a 28 24 6c 69 6e 65 4e 75 6d  r {$dy*($lineNum
67b0: 62 65 72 2b 30 2e 35 29 7d 5d 0a 20 20 20 20 20  ber+0.5)}].     
67c0: 20 20 20 73 65 74 20 63 6f 6e 66 69 6e 65 20 22     set confine "
67d0: 22 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ".    } else {. 
67e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63         return -c
67f0: 6f 64 65 20 65 72 72 6f 72 20 22 69 6e 76 61 6c  ode error "inval
6800: 69 64 20 66 69 6e 64 20 73 70 65 63 20 5c 22 24  id find spec \"$
6810: 66 69 6e 64 49 6e 66 6f 5c 22 22 0a 20 20 20 20  findInfo\"".    
6820: 7d 0a 0a 20 20 20 20 73 65 74 20 66 6f 75 6e 64  }..    set found
6830: 20 20 30 0a 20 20 20 20 73 65 74 20 72 65 67 69    0.    set regi
6840: 6f 6e 20 5b 24 70 61 74 68 2e 63 20 62 62 6f 78  on [$path.c bbox
6850: 20 61 6c 6c 5d 0a 20 20 20 20 69 66 20 7b 5b 6c   all].    if {[l
6860: 6c 65 6e 67 74 68 20 24 72 65 67 69 6f 6e 5d 7d  length $region]}
6870: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 78   {.        set x
6880: 69 20 5b 6c 69 6e 64 65 78 20 24 72 65 67 69 6f  i [lindex $regio
6890: 6e 20 30 5d 0a 20 20 20 20 20 20 20 20 73 65 74  n 0].        set
68a0: 20 78 73 20 5b 6c 69 6e 64 65 78 20 24 72 65 67   xs [lindex $reg
68b0: 69 6f 6e 20 32 5d 0a 20 20 20 20 20 20 20 20 66  ion 2].        f
68c0: 6f 72 65 61 63 68 20 69 64 20 5b 24 70 61 74 68  oreach id [$path
68d0: 2e 63 20 66 69 6e 64 20 6f 76 65 72 6c 61 70 70  .c find overlapp
68e0: 69 6e 67 20 24 78 69 20 24 79 20 24 78 73 20 24  ing $xi $y $xs $
68f0: 79 5d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y] {.           
6900: 20 73 65 74 20 6c 74 61 67 73 20 5b 24 70 61 74   set ltags [$pat
6910: 68 2e 63 20 67 65 74 74 61 67 73 20 24 69 64 5d  h.c gettags $id]
6920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
6930: 20 69 74 65 6d 20 20 5b 6c 69 6e 64 65 78 20 24   item  [lindex $
6940: 6c 74 61 67 73 20 31 5d 0a 20 20 20 20 20 20 20  ltags 1].       
6950: 20 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e       if { [strin
6960: 67 20 65 71 75 61 6c 20 24 69 74 65 6d 20 22 6e  g equal $item "n
6970: 6f 64 65 22 5d 20 7c 7c 0a 20 20 20 20 20 20 20  ode"] ||.       
6980: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
6990: 67 20 65 71 75 61 6c 20 24 69 74 65 6d 20 22 69  g equal $item "i
69a0: 6d 67 22 5d 20 20 7c 7c 0a 20 20 20 20 20 20 20  mg"]  ||.       
69b0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
69c0: 67 20 65 71 75 61 6c 20 24 69 74 65 6d 20 22 77  g equal $item "w
69d0: 69 6e 22 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20  in"] } {.       
69e0: 20 20 20 20 20 20 20 20 20 23 20 69 74 65 6d 20           # item 
69f0: 69 73 20 74 68 65 20 6c 61 62 65 6c 20 6f 72 20  is the label or 
6a00: 69 6d 61 67 65 2f 77 69 6e 64 6f 77 20 6f 66 20  image/window of 
6a10: 74 68 65 20 6e 6f 64 65 0a 20 20 20 20 20 20 20  the node.       
6a20: 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 64           set nod
6a30: 65 20 20 5b 54 72 65 65 3a 3a 5f 67 65 74 5f 6e  e  [Tree::_get_n
6a40: 6f 64 65 5f 6e 61 6d 65 20 24 70 61 74 68 20 24  ode_name $path $
6a50: 69 64 20 32 5d 0a 20 20 20 20 20 20 20 20 20 20  id 2].          
6a60: 20 20 20 20 20 20 73 65 74 20 66 6f 75 6e 64 20        set found 
6a70: 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1.              
6a80: 20 20 62 72 65 61 6b 0a 20 20 20 20 20 20 20 20    break.        
6a90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
6aa0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b 24      }..    if {$
6ab0: 66 6f 75 6e 64 7d 20 7b 0a 20 20 20 20 20 20 20  found} {.       
6ac0: 20 69 66 20 7b 21 5b 73 74 72 69 6e 67 20 65 71   if {![string eq
6ad0: 75 61 6c 20 24 63 6f 6e 66 69 6e 65 20 22 22 5d  ual $confine ""]
6ae0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
6af0: 23 20 74 65 73 74 20 69 66 20 78 20 73 74 61 6e  # test if x stan
6b00: 64 20 69 6e 73 69 64 65 20 6e 6f 64 65 20 62 62  d inside node bb
6b10: 6f 78 0a 09 20 20 20 20 73 65 74 20 70 61 64 78  ox..    set padx
6b20: 20 5b 5f 67 65 74 5f 6e 6f 64 65 5f 70 61 64 78   [_get_node_padx
6b30: 20 24 70 61 74 68 20 24 6e 6f 64 65 5d 0a 20 20   $path $node].  
6b40: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 78 69            set xi
6b50: 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65 78 20   [expr {[lindex 
6b60: 5b 24 70 61 74 68 2e 63 20 63 6f 6f 72 64 73 20  [$path.c coords 
6b70: 6e 3a 24 6e 6f 64 65 5d 20 30 5d 20 2d 20 24 70  n:$node] 0] - $p
6b80: 61 64 78 7d 5d 0a 20 20 20 20 20 20 20 20 20 20  adx}].          
6b90: 20 20 73 65 74 20 78 73 20 5b 6c 69 6e 64 65 78    set xs [lindex
6ba0: 20 5b 24 70 61 74 68 2e 63 20 62 62 6f 78 20 6e   [$path.c bbox n
6bb0: 3a 24 6e 6f 64 65 5d 20 32 5d 0a 20 20 20 20 20  :$node] 2].     
6bc0: 20 20 20 20 20 20 20 69 66 20 7b 24 78 20 3e 3d         if {$x >=
6bd0: 20 24 78 69 20 26 26 20 24 78 20 3c 3d 20 24 78   $xi && $x <= $x
6be0: 73 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s} {.           
6bf0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 5f 6e 6f       return [_no
6c00: 64 65 5f 6e 61 6d 65 5f 72 65 76 20 24 70 61 74  de_name_rev $pat
6c10: 68 20 24 6e 6f 64 65 5d 0a 20 20 20 20 20 20 20  h $node].       
6c20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6c30: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
6c40: 20 20 20 20 72 65 74 75 72 6e 20 5b 5f 6e 6f 64      return [_nod
6c50: 65 5f 6e 61 6d 65 5f 72 65 76 20 24 70 61 74 68  e_name_rev $path
6c60: 20 24 6e 6f 64 65 5d 0a 20 20 20 20 20 20 20 20   $node].        
6c70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
6c80: 72 6e 20 22 22 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d  rn "".}...# ----
6c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d  --------.#  Comm
6ce0: 61 6e 64 20 54 72 65 65 3a 3a 6c 69 6e 65 0a 23  and Tree::line.#
6cf0: 20 20 20 20 20 52 65 74 75 72 6e 73 20 74 68 65       Returns the
6d00: 20 6c 69 6e 65 20 77 68 65 72 65 20 61 20 6e 6f   line where a no
6d10: 64 65 20 77 61 73 20 64 72 61 77 6e 2e 0a 23 20  de was drawn..# 
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f  ------------.pro
6d70: 63 20 54 72 65 65 3a 3a 6c 69 6e 65 20 7b 70 61  c Tree::line {pa
6d80: 74 68 20 6e 6f 64 65 7d 20 7b 0a 20 20 20 20 73  th node} {.    s
6d90: 65 74 20 6e 6f 64 65 20 5b 5f 6e 6f 64 65 5f 6e  et node [_node_n
6da0: 61 6d 65 20 24 70 61 74 68 20 24 6e 6f 64 65 5d  ame $path $node]
6db0: 0a 20 20 20 20 73 65 74 20 69 74 65 6d 20 5b 24  .    set item [$
6dc0: 70 61 74 68 2e 63 20 66 69 6e 64 20 77 69 74 68  path.c find with
6dd0: 74 61 67 20 6e 3a 24 6e 6f 64 65 5d 0a 20 20 20  tag n:$node].   
6de0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
6df0: 67 74 68 20 24 69 74 65 6d 5d 7d 20 7b 0a 20 20  gth $item]} {.  
6e00: 20 20 20 20 20 20 73 65 74 20 64 79 20 20 20 5b        set dy   [
6e10: 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f  Widget::getoptio
6e20: 6e 20 24 70 61 74 68 20 2d 64 65 6c 74 61 79 5d  n $path -deltay]
6e30: 0a 20 20 20 20 20 20 20 20 73 65 74 20 79 20 20  .        set y  
6e40: 20 20 5b 6c 69 6e 64 65 78 20 5b 24 70 61 74 68    [lindex [$path
6e50: 2e 63 20 63 6f 6f 72 64 73 20 24 69 74 65 6d 5d  .c coords $item]
6e60: 20 31 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20   1].        set 
6e70: 6c 69 6e 65 20 5b 65 78 70 72 20 7b 69 6e 74 28  line [expr {int(
6e80: 24 79 2f 24 64 79 29 7d 5d 0a 20 20 20 20 7d 20  $y/$dy)}].    } 
6e90: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73  else {.        s
6ea0: 65 74 20 6c 69 6e 65 20 2d 31 0a 20 20 20 20 7d  et line -1.    }
6eb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 24 6c 69 6e  .    return $lin
6ec0: 65 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d  e.}...# --------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f10: 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20  ----.#  Command 
6f20: 54 72 65 65 3a 3a 6e 6f 64 65 73 0a 23 20 2d 2d  Tree::nodes.# --
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20  ----------.proc 
6f80: 54 72 65 65 3a 3a 6e 6f 64 65 73 20 7b 20 70 61  Tree::nodes { pa
6f90: 74 68 20 6e 6f 64 65 20 7b 66 69 72 73 74 20 22  th node {first "
6fa0: 22 7d 20 7b 6c 61 73 74 20 22 22 7d 20 7d 20 7b  "} {last ""} } {
6fb0: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 24 70  .    variable $p
6fc0: 61 74 68 0a 20 20 20 20 75 70 76 61 72 20 30 20  ath.    upvar 0 
6fd0: 20 24 70 61 74 68 20 64 61 74 61 0a 0a 20 20 20   $path data..   
6fe0: 20 73 65 74 20 6e 6f 64 65 20 5b 5f 6e 6f 64 65   set node [_node
6ff0: 5f 6e 61 6d 65 20 24 70 61 74 68 20 24 6e 6f 64  _name $path $nod
7000: 65 5d 0a 20 20 20 20 69 66 20 7b 20 21 5b 69 6e  e].    if { ![in
7010: 66 6f 20 65 78 69 73 74 73 20 64 61 74 61 28 24  fo exists data($
7020: 6e 6f 64 65 29 5d 20 7d 20 7b 0a 20 20 20 20 20  node)] } {.     
7030: 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20     return -code 
7040: 65 72 72 6f 72 20 22 6e 6f 64 65 20 5c 22 24 6e  error "node \"$n
7050: 6f 64 65 5c 22 20 64 6f 65 73 20 6e 6f 74 20 65  ode\" does not e
7060: 78 69 73 74 22 0a 20 20 20 20 7d 0a 0a 20 20 20  xist".    }..   
7070: 20 69 66 20 7b 20 21 5b 73 74 72 69 6e 67 20 6c   if { ![string l
7080: 65 6e 67 74 68 20 24 66 69 72 73 74 5d 20 7d 20  ength $first] } 
7090: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
70a0: 20 5b 6c 72 61 6e 67 65 20 24 64 61 74 61 28 24   [lrange $data($
70b0: 6e 6f 64 65 29 20 31 20 65 6e 64 5d 0a 20 20 20  node) 1 end].   
70c0: 20 7d 0a 0a 20 20 20 20 69 66 20 7b 20 21 5b 73   }..    if { ![s
70d0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6c 61  tring length $la
70e0: 73 74 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  st] } {.        
70f0: 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 5b  return [lindex [
7100: 6c 72 61 6e 67 65 20 24 64 61 74 61 28 24 6e 6f  lrange $data($no
7110: 64 65 29 20 31 20 65 6e 64 5d 20 24 66 69 72 73  de) 1 end] $firs
7120: 74 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  t].    } else {.
7130: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
7140: 6c 72 61 6e 67 65 20 5b 6c 72 61 6e 67 65 20 24  lrange [lrange $
7150: 64 61 74 61 28 24 6e 6f 64 65 29 20 31 20 65 6e  data($node) 1 en
7160: 64 5d 20 24 66 69 72 73 74 20 24 6c 61 73 74 5d  d] $first $last]
7170: 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 23 20 54 72 65  .    }.}...# Tre
7180: 65 3a 3a 76 69 73 69 62 6c 65 6e 6f 64 65 73 20  e::visiblenodes 
7190: 2d 2d 0a 23 0a 23 09 52 65 74 72 69 65 76 65 20  --.#.#.Retrieve 
71a0: 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 68  a list of all th
71b0: 65 20 6e 6f 64 65 73 20 69 6e 20 61 20 74 72 65  e nodes in a tre
71c0: 65 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 73  e..#.# Arguments
71d0: 3a 0a 23 09 70 61 74 68 09 74 72 65 65 20 74 6f  :.#.path.tree to
71e0: 20 72 65 74 72 69 65 76 65 20 6e 6f 64 65 73 20   retrieve nodes 
71f0: 66 6f 72 2e 0a 23 0a 23 20 52 65 73 75 6c 74 73  for..#.# Results
7200: 3a 0a 23 09 6e 6f 64 65 73 09 6c 69 73 74 20 6f  :.#.nodes.list o
7210: 66 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74  f nodes in the t
7220: 72 65 65 2e 0a 0a 70 72 6f 63 20 54 72 65 65 3a  ree...proc Tree:
7230: 3a 76 69 73 69 62 6c 65 6e 6f 64 65 73 20 7b 20  :visiblenodes { 
7240: 70 61 74 68 20 7d 20 7b 0a 20 20 20 20 76 61 72  path } {.    var
7250: 69 61 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20  iable $path.    
7260: 75 70 76 61 72 20 30 20 20 24 70 61 74 68 20 64  upvar 0  $path d
7270: 61 74 61 0a 0a 20 20 20 20 23 20 52 6f 6f 74 20  ata..    # Root 
7280: 69 73 20 61 6c 77 61 79 73 20 6f 70 65 6e 20 28  is always open (
7290: 3f 29 2c 20 73 6f 20 61 6c 6c 20 6f 66 20 69 74  ?), so all of it
72a0: 73 20 63 68 69 6c 64 72 65 6e 20 61 75 74 6f 6d  s children autom
72b0: 61 74 69 63 61 6c 6c 79 20 67 65 74 20 61 64 64  atically get add
72c0: 65 64 0a 20 20 20 20 23 20 74 6f 20 74 68 65 20  ed.    # to the 
72d0: 72 65 73 75 6c 74 2c 20 61 6e 64 20 74 6f 20 74  result, and to t
72e0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 73 65  he stack..    se
72f0: 74 20 73 74 20 5b 6c 72 61 6e 67 65 20 24 64 61  t st [lrange $da
7300: 74 61 28 72 6f 6f 74 29 20 31 20 65 6e 64 5d 0a  ta(root) 1 end].
7310: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 24      set result $
7320: 73 74 0a 0a 20 20 20 20 77 68 69 6c 65 20 7b 5b  st..    while {[
7330: 6c 6c 65 6e 67 74 68 20 24 73 74 5d 7d 20 7b 0a  llength $st]} {.
7340: 09 73 65 74 20 6e 6f 64 65 20 5b 6c 69 6e 64 65  .set node [linde
7350: 78 20 24 73 74 20 65 6e 64 5d 0a 09 73 65 74 20  x $st end]..set 
7360: 73 74 20 5b 6c 72 65 70 6c 61 63 65 20 24 73 74  st [lreplace $st
7370: 20 65 6e 64 20 65 6e 64 5d 0a 09 23 20 44 61 6e   end end]..# Dan
7380: 67 65 72 2c 20 64 61 6e 67 65 72 21 20 20 55 73  ger, danger!  Us
7390: 69 6e 67 20 67 65 74 4d 65 67 61 77 69 64 67 65  ing getMegawidge
73a0: 74 4f 70 74 69 6f 6e 20 69 73 20 66 72 61 67 69  tOption is fragi
73b0: 6c 65 2c 20 62 75 74 20 6d 75 63 68 0a 09 23 20  le, but much..# 
73c0: 6d 75 63 68 20 66 61 73 74 65 72 20 74 68 61 6e  much faster than
73d0: 20 67 6f 69 6e 67 20 74 68 72 6f 75 67 68 20 63   going through c
73e0: 67 65 74 2e 0a 09 69 66 20 7b 20 5b 57 69 64 67  get...if { [Widg
73f0: 65 74 3a 3a 67 65 74 4d 65 67 61 77 69 64 67 65  et::getMegawidge
7400: 74 4f 70 74 69 6f 6e 20 24 70 61 74 68 2e 24 6e  tOption $path.$n
7410: 6f 64 65 20 2d 6f 70 65 6e 5d 20 7d 20 7b 0a 09  ode -open] } {..
7420: 20 20 20 20 73 65 74 20 6e 6f 64 65 73 20 5b 6c      set nodes [l
7430: 72 61 6e 67 65 20 24 64 61 74 61 28 24 6e 6f 64  range $data($nod
7440: 65 29 20 31 20 65 6e 64 5d 0a 09 20 20 20 20 73  e) 1 end]..    s
7450: 65 74 20 72 65 73 75 6c 74 20 5b 63 6f 6e 63 61  et result [conca
7460: 74 20 24 72 65 73 75 6c 74 20 24 6e 6f 64 65 73  t $result $nodes
7470: 5d 0a 09 20 20 20 20 73 65 74 20 73 74 20 5b 63  ]..    set st [c
7480: 6f 6e 63 61 74 20 24 73 74 20 24 6e 6f 64 65 73  oncat $st $nodes
7490: 5d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72  ]..}.    }.    r
74a0: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0a 7d 0a  eturn $result.}.
74b0: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
74c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7500: 23 20 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a  #  Command Tree:
7510: 3a 73 65 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  :see.# ---------
7520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7560: 2d 2d 2d 0a 70 72 6f 63 20 54 72 65 65 3a 3a 73  ---.proc Tree::s
7570: 65 65 20 7b 20 70 61 74 68 20 6e 6f 64 65 20 7d  ee { path node }
7580: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
7590: 24 70 61 74 68 0a 20 20 20 20 75 70 76 61 72 20  $path.    upvar 
75a0: 30 20 20 24 70 61 74 68 20 64 61 74 61 0a 0a 20  0  $path data.. 
75b0: 20 20 20 73 65 74 20 6e 6f 64 65 20 5b 5f 6e 6f     set node [_no
75c0: 64 65 5f 6e 61 6d 65 20 24 70 61 74 68 20 24 6e  de_name $path $n
75d0: 6f 64 65 5d 0a 20 20 20 20 69 66 20 7b 20 5b 57  ode].    if { [W
75e0: 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e  idget::getoption
75f0: 20 24 70 61 74 68 20 2d 72 65 64 72 61 77 5d 20   $path -redraw] 
7600: 26 26 20 24 64 61 74 61 28 75 70 64 2c 61 66 74  && $data(upd,aft
7610: 65 72 69 64 29 20 21 3d 20 22 22 20 7d 20 7b 0a  erid) != "" } {.
7620: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 63 61          after ca
7630: 6e 63 65 6c 20 24 64 61 74 61 28 75 70 64 2c 61  ncel $data(upd,a
7640: 66 74 65 72 69 64 29 0a 20 20 20 20 20 20 20 20  fterid).        
7650: 5f 72 65 64 72 61 77 5f 74 72 65 65 20 24 70 61  _redraw_tree $pa
7660: 74 68 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  th.    }.    set
7670: 20 69 64 6e 20 5b 24 70 61 74 68 2e 63 20 66 69   idn [$path.c fi
7680: 6e 64 20 77 69 74 68 74 61 67 20 6e 3a 24 6e 6f  nd withtag n:$no
7690: 64 65 5d 0a 20 20 20 20 69 66 20 7b 20 24 69 64  de].    if { $id
76a0: 6e 20 21 3d 20 22 22 20 7d 20 7b 0a 20 20 20 20  n != "" } {.    
76b0: 20 20 20 20 54 72 65 65 3a 3a 5f 73 65 65 20 24      Tree::_see $
76c0: 70 61 74 68 20 24 69 64 6e 0a 20 20 20 20 7d 0a  path $idn.    }.
76d0: 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...# ----------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7720: 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 54 72  --.#  Command Tr
7730: 65 65 3a 3a 6f 70 65 6e 74 72 65 65 0a 23 20 2d  ee::opentree.# -
7740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4a 44  -----------.# JD
7790: 43 3a 20 61 64 64 65 64 20 6f 70 74 69 6f 6e 20  C: added option 
77a0: 72 65 63 75 72 73 69 76 65 0a 70 72 6f 63 20 54  recursive.proc T
77b0: 72 65 65 3a 3a 6f 70 65 6e 74 72 65 65 20 7b 20  ree::opentree { 
77c0: 70 61 74 68 20 6e 6f 64 65 20 7b 72 65 63 75 72  path node {recur
77d0: 73 69 76 65 20 31 7d 20 7d 20 7b 0a 20 20 20 20  sive 1} } {.    
77e0: 76 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20  variable $path. 
77f0: 20 20 20 75 70 76 61 72 20 30 20 20 24 70 61 74     upvar 0  $pat
7800: 68 20 64 61 74 61 0a 0a 20 20 20 20 73 65 74 20  h data..    set 
7810: 6e 6f 64 65 20 5b 5f 6e 6f 64 65 5f 6e 61 6d 65  node [_node_name
7820: 20 24 70 61 74 68 20 24 6e 6f 64 65 5d 0a 20 20   $path $node].  
7830: 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 65    if { [string e
7840: 71 75 61 6c 20 24 6e 6f 64 65 20 22 72 6f 6f 74  qual $node "root
7850: 22 5d 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69  "] || ![info exi
7860: 73 74 73 20 64 61 74 61 28 24 6e 6f 64 65 29 5d  sts data($node)]
7870: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74   } {.        ret
7880: 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20  urn -code error 
7890: 22 6e 6f 64 65 20 5c 22 24 6e 6f 64 65 5c 22 20  "node \"$node\" 
78a0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 22 0a  does not exist".
78b0: 20 20 20 20 7d 0a 0a 20 20 20 20 5f 72 65 63 65      }..    _rece
78c0: 78 70 61 6e 64 20 24 70 61 74 68 20 24 6e 6f 64  xpand $path $nod
78d0: 65 20 31 20 24 72 65 63 75 72 73 69 76 65 20 5b  e 1 $recursive [
78e0: 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f  Widget::getoptio
78f0: 6e 20 24 70 61 74 68 20 2d 6f 70 65 6e 63 6d 64  n $path -opencmd
7900: 5d 0a 20 20 20 20 5f 72 65 64 72 61 77 5f 69 64  ].    _redraw_id
7910: 6c 65 20 24 70 61 74 68 20 33 0a 7d 0a 0a 0a 23  le $path 3.}...#
7920: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
7930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
7970: 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a 3a 63   Command Tree::c
7980: 6c 6f 73 65 74 72 65 65 0a 23 20 2d 2d 2d 2d 2d  losetree.# -----
7990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79d0: 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72 65  -------.proc Tre
79e0: 65 3a 3a 63 6c 6f 73 65 74 72 65 65 20 7b 20 70  e::closetree { p
79f0: 61 74 68 20 6e 6f 64 65 20 7b 72 65 63 75 72 73  ath node {recurs
7a00: 69 76 65 20 31 7d 20 7d 20 7b 0a 20 20 20 20 76  ive 1} } {.    v
7a10: 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20 20  ariable $path.  
7a20: 20 20 75 70 76 61 72 20 30 20 20 24 70 61 74 68    upvar 0  $path
7a30: 20 64 61 74 61 0a 0a 20 20 20 20 73 65 74 20 6e   data..    set n
7a40: 6f 64 65 20 5b 5f 6e 6f 64 65 5f 6e 61 6d 65 20  ode [_node_name 
7a50: 24 70 61 74 68 20 24 6e 6f 64 65 5d 0a 20 20 20  $path $node].   
7a60: 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 65 71   if { [string eq
7a70: 75 61 6c 20 24 6e 6f 64 65 20 22 72 6f 6f 74 22  ual $node "root"
7a80: 5d 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73  ] || ![info exis
7a90: 74 73 20 64 61 74 61 28 24 6e 6f 64 65 29 5d 20  ts data($node)] 
7aa0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  } {.        retu
7ab0: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22  rn -code error "
7ac0: 6e 6f 64 65 20 5c 22 24 6e 6f 64 65 5c 22 20 64  node \"$node\" d
7ad0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 22 0a 20  oes not exist". 
7ae0: 20 20 20 7d 0a 0a 20 20 20 20 5f 72 65 63 65 78     }..    _recex
7af0: 70 61 6e 64 20 24 70 61 74 68 20 24 6e 6f 64 65  pand $path $node
7b00: 20 30 20 24 72 65 63 75 72 73 69 76 65 20 5b 57   0 $recursive [W
7b10: 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e  idget::getoption
7b20: 20 24 70 61 74 68 20 2d 63 6c 6f 73 65 63 6d 64   $path -closecmd
7b30: 5d 0a 20 20 20 20 5f 72 65 64 72 61 77 5f 69 64  ].    _redraw_id
7b40: 6c 65 20 24 70 61 74 68 20 33 0a 7d 0a 0a 0a 70  le $path 3.}...p
7b50: 72 6f 63 20 54 72 65 65 3a 3a 74 6f 67 67 6c 65  roc Tree::toggle
7b60: 20 7b 20 70 61 74 68 20 6e 6f 64 65 20 7d 20 7b   { path node } {
7b70: 0a 20 20 20 20 69 66 20 7b 5b 24 70 61 74 68 20  .    if {[$path 
7b80: 69 74 65 6d 63 67 65 74 20 24 6e 6f 64 65 20 2d  itemcget $node -
7b90: 6f 70 65 6e 5d 7d 20 7b 0a 20 20 20 20 20 20 20  open]} {.       
7ba0: 20 24 70 61 74 68 20 63 6c 6f 73 65 74 72 65 65   $path closetree
7bb0: 20 24 6e 6f 64 65 20 30 0a 20 20 20 20 7d 20 65   $node 0.    } e
7bc0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 24 70  lse {.        $p
7bd0: 61 74 68 20 6f 70 65 6e 74 72 65 65 20 24 6e 6f  ath opentree $no
7be0: 64 65 20 30 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 23  de 0.    }.}...#
7bf0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
7c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
7c40: 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a 3a 65   Command Tree::e
7c50: 64 69 74 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  dit.# ----------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 0a 70 72 6f 63 20 54 72 65 65 3a 3a 65 64  --.proc Tree::ed
7cb0: 69 74 20 7b 20 70 61 74 68 20 6e 6f 64 65 20 74  it { path node t
7cc0: 65 78 74 20 7b 76 65 72 69 66 79 63 6d 64 20 22  ext {verifycmd "
7cd0: 22 7d 20 7b 63 6c 69 63 6b 72 65 73 20 30 7d 20  "} {clickres 0} 
7ce0: 7b 73 65 6c 65 63 74 20 31 7d 7d 20 7b 0a 20 20  {select 1}} {.  
7cf0: 20 20 76 61 72 69 61 62 6c 65 20 5f 65 64 69 74    variable _edit
7d00: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 24 70  .    variable $p
7d10: 61 74 68 0a 20 20 20 20 75 70 76 61 72 20 30 20  ath.    upvar 0 
7d20: 20 24 70 61 74 68 20 64 61 74 61 0a 0a 20 20 20   $path data..   
7d30: 20 73 65 74 20 6e 6f 64 65 20 5b 5f 6e 6f 64 65   set node [_node
7d40: 5f 6e 61 6d 65 20 24 70 61 74 68 20 24 6e 6f 64  _name $path $nod
7d50: 65 5d 0a 20 20 20 20 69 66 20 7b 20 5b 57 69 64  e].    if { [Wid
7d60: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
7d70: 70 61 74 68 20 2d 72 65 64 72 61 77 5d 20 26 26  path -redraw] &&
7d80: 20 24 64 61 74 61 28 75 70 64 2c 61 66 74 65 72   $data(upd,after
7d90: 69 64 29 20 21 3d 20 22 22 20 7d 20 7b 0a 20 20  id) != "" } {.  
7da0: 20 20 20 20 20 20 61 66 74 65 72 20 63 61 6e 63        after canc
7db0: 65 6c 20 24 64 61 74 61 28 75 70 64 2c 61 66 74  el $data(upd,aft
7dc0: 65 72 69 64 29 0a 20 20 20 20 20 20 20 20 5f 72  erid).        _r
7dd0: 65 64 72 61 77 5f 74 72 65 65 20 24 70 61 74 68  edraw_tree $path
7de0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 69  .    }.    set i
7df0: 64 6e 20 5b 24 70 61 74 68 2e 63 20 66 69 6e 64  dn [$path.c find
7e00: 20 77 69 74 68 74 61 67 20 6e 3a 24 6e 6f 64 65   withtag n:$node
7e10: 5d 0a 20 20 20 20 69 66 20 7b 20 24 69 64 6e 20  ].    if { $idn 
7e20: 21 3d 20 22 22 20 7d 20 7b 0a 20 20 20 20 20 20  != "" } {.      
7e30: 20 20 54 72 65 65 3a 3a 5f 73 65 65 20 24 70 61    Tree::_see $pa
7e40: 74 68 20 24 69 64 6e 0a 0a 20 20 20 20 20 20 20  th $idn..       
7e50: 20 73 65 74 20 6f 6c 64 66 67 20 20 5b 24 70 61   set oldfg  [$pa
7e60: 74 68 2e 63 20 69 74 65 6d 63 67 65 74 20 24 69  th.c itemcget $i
7e70: 64 6e 20 2d 66 69 6c 6c 5d 0a 20 20 20 20 20 20  dn -fill].      
7e80: 20 20 73 65 74 20 73 62 67 20 20 20 20 5b 57 69    set sbg    [Wi
7e90: 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20  dget::getoption 
7ea0: 24 70 61 74 68 20 2d 73 65 6c 65 63 74 62 61 63  $path -selectbac
7eb0: 6b 67 72 6f 75 6e 64 5d 0a 20 20 20 20 20 20 20  kground].       
7ec0: 20 73 65 74 20 63 6f 6f 72 64 73 20 5b 24 70 61   set coords [$pa
7ed0: 74 68 2e 63 20 63 6f 6f 72 64 73 20 24 69 64 6e  th.c coords $idn
7ee0: 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20 78 20  ].        set x 
7ef0: 20 20 20 20 20 5b 6c 69 6e 64 65 78 20 24 63 6f       [lindex $co
7f00: 6f 72 64 73 20 30 5d 0a 20 20 20 20 20 20 20 20  ords 0].        
7f10: 73 65 74 20 79 20 20 20 20 20 20 5b 6c 69 6e 64  set y      [lind
7f20: 65 78 20 24 63 6f 6f 72 64 73 20 31 5d 0a 20 20  ex $coords 1].  
7f30: 20 20 20 20 20 20 73 65 74 20 62 64 20 20 20 20        set bd    
7f40: 20 5b 65 78 70 72 20 7b 5b 24 70 61 74 68 2e 63   [expr {[$path.c
7f50: 20 63 67 65 74 20 2d 62 6f 72 64 65 72 77 69 64   cget -borderwid
7f60: 74 68 5d 2b 5b 24 70 61 74 68 2e 63 20 63 67 65  th]+[$path.c cge
7f70: 74 20 2d 68 69 67 68 6c 69 67 68 74 74 68 69 63  t -highlightthic
7f80: 6b 6e 65 73 73 5d 7d 5d 0a 20 20 20 20 20 20 20  kness]}].       
7f90: 20 73 65 74 20 77 20 20 20 20 20 20 5b 65 78 70   set w      [exp
7fa0: 72 20 7b 5b 77 69 6e 66 6f 20 77 69 64 74 68 20  r {[winfo width 
7fb0: 24 70 61 74 68 5d 20 2d 20 32 2a 24 62 64 7d 5d  $path] - 2*$bd}]
7fc0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 77 6d 61  .        set wma
7fd0: 78 20 20 20 5b 65 78 70 72 20 7b 5b 24 70 61 74  x   [expr {[$pat
7fe0: 68 2e 63 20 63 61 6e 76 61 73 78 20 24 77 5d 2d  h.c canvasx $w]-
7ff0: 24 78 7d 5d 0a 0a 20 20 20 20 20 20 20 20 73 65  $x}]..        se
8000: 74 20 5f 65 64 69 74 28 74 65 78 74 29 20 24 74  t _edit(text) $t
8010: 65 78 74 0a 20 20 20 20 20 20 20 20 73 65 74 20  ext.        set 
8020: 5f 65 64 69 74 28 77 61 69 74 29 20 30 0a 0a 20  _edit(wait) 0.. 
8030: 20 20 20 20 20 20 20 24 70 61 74 68 2e 63 20 69         $path.c i
8040: 74 65 6d 63 6f 6e 66 69 67 75 72 65 20 24 69 64  temconfigure $id
8050: 6e 20 20 20 20 2d 66 69 6c 6c 20 5b 57 69 64 67  n    -fill [Widg
8060: 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70  et::getoption $p
8070: 61 74 68 20 2d 62 61 63 6b 67 72 6f 75 6e 64 5d  ath -background]
8080: 0a 20 20 20 20 20 20 20 20 24 70 61 74 68 2e 63  .        $path.c
8090: 20 69 74 65 6d 63 6f 6e 66 69 67 75 72 65 20 73   itemconfigure s
80a0: 3a 24 6e 6f 64 65 20 2d 66 69 6c 6c 20 7b 7d 20  :$node -fill {} 
80b0: 2d 6f 75 74 6c 69 6e 65 20 7b 7d 0a 0a 20 20 20  -outline {}..   
80c0: 20 20 20 20 20 73 65 74 20 66 72 61 6d 65 20 20       set frame  
80d0: 5b 66 72 61 6d 65 20 24 70 61 74 68 2e 65 64 69  [frame $path.edi
80e0: 74 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t \.            
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 72 65 6c              -rel
8100: 69 65 66 20 66 6c 61 74 20 2d 62 6f 72 64 65 72  ief flat -border
8110: 77 69 64 74 68 20 30 20 2d 68 69 67 68 6c 69 67  width 0 -highlig
8120: 68 74 74 68 69 63 6b 6e 65 73 73 20 30 20 5c 0a  htthickness 0 \.
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8140: 20 20 20 20 20 20 20 20 2d 62 61 63 6b 67 72 6f          -backgro
8150: 75 6e 64 20 5b 57 69 64 67 65 74 3a 3a 67 65 74  und [Widget::get
8160: 6f 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 62 61  option $path -ba
8170: 63 6b 67 72 6f 75 6e 64 5d 5d 0a 20 20 20 20 20  ckground]].     
8180: 20 20 20 73 65 74 20 65 6e 74 20 20 20 20 5b 65     set ent    [e
8190: 6e 74 72 79 20 24 66 72 61 6d 65 2e 65 64 69 74  ntry $frame.edit
81a0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
81b0: 20 20 20 20 20 20 20 20 20 20 20 2d 77 69 64 74             -widt
81c0: 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  h              0
81d0: 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20 20       \.         
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
81f0: 72 65 6c 69 65 66 20 20 20 20 20 20 20 20 20 20  relief          
8200: 20 20 20 73 6f 6c 69 64 20 5c 0a 20 20 20 20 20     solid \.     
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 2d 62 6f 72 64 65 72 77 69 64 74 68 20     -borderwidth 
8230: 20 20 20 20 20 20 20 31 20 20 20 20 20 5c 0a 20         1     \. 
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 20 20 20 2d 68 69 67 68 6c 69 67 68         -highligh
8260: 74 74 68 69 63 6b 6e 65 73 73 20 30 20 20 20 20  tthickness 0    
8270: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
8280: 20 20 20 20 20 20 20 20 20 20 20 2d 66 6f 72 65             -fore
8290: 67 72 6f 75 6e 64 20 20 20 20 20 20 20 20 20 5b  ground         [
82a0: 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f  Widget::getoptio
82b0: 6e 20 24 70 61 74 68 2e 24 6e 6f 64 65 20 2d 66  n $path.$node -f
82c0: 69 6c 6c 5d 20 5c 0a 20 20 20 20 20 20 20 20 20  ill] \.         
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
82e0: 62 61 63 6b 67 72 6f 75 6e 64 20 20 20 20 20 20  background      
82f0: 20 20 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f     [Widget::geto
8300: 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 62 61 63  ption $path -bac
8310: 6b 67 72 6f 75 6e 64 5d 20 5c 0a 20 20 20 20 20  kground] \.     
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8330: 20 20 20 2d 73 65 6c 65 63 74 66 6f 72 65 67 72     -selectforegr
8340: 6f 75 6e 64 20 20 20 5b 57 69 64 67 65 74 3a 3a  ound   [Widget::
8350: 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 20  getoption $path 
8360: 2d 73 65 6c 65 63 74 66 6f 72 65 67 72 6f 75 6e  -selectforegroun
8370: 64 5d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  d] \.           
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 73 65               -se
8390: 6c 65 63 74 62 61 63 6b 67 72 6f 75 6e 64 20 20  lectbackground  
83a0: 20 24 73 62 67 20 20 5c 0a 20 20 20 20 20 20 20   $sbg  \.       
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83c0: 20 2d 66 6f 6e 74 20 20 20 20 20 20 20 20 20 20   -font          
83d0: 20 20 20 20 20 5b 57 69 64 67 65 74 3a 3a 67 65       [Widget::ge
83e0: 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 2e 24 6e  toption $path.$n
83f0: 6f 64 65 20 2d 66 6f 6e 74 5d 20 5c 0a 20 20 20  ode -font] \.   
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 20 20 20 20 2d 74 65 78 74 76 61 72 69 61 62       -textvariab
8420: 6c 65 20 20 20 20 20 20 20 54 72 65 65 3a 3a 5f  le       Tree::_
8430: 65 64 69 74 28 74 65 78 74 29 5d 0a 20 20 20 20  edit(text)].    
8440: 20 20 20 20 70 61 63 6b 20 24 65 6e 74 20 2d 69      pack $ent -i
8450: 70 61 64 78 20 38 20 2d 61 6e 63 68 6f 72 20 77  padx 8 -anchor w
8460: 0a 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 64  ..        set id
8470: 77 20 5b 24 70 61 74 68 2e 63 20 63 72 65 61 74  w [$path.c creat
8480: 65 20 77 69 6e 64 6f 77 20 24 78 20 24 79 20 2d  e window $x $y -
8490: 77 69 6e 64 6f 77 20 24 66 72 61 6d 65 20 2d 61  window $frame -a
84a0: 6e 63 68 6f 72 20 77 5d 0a 20 20 20 20 20 20 20  nchor w].       
84b0: 20 74 72 61 63 65 20 76 61 72 69 61 62 6c 65 20   trace variable 
84c0: 54 72 65 65 3a 3a 5f 65 64 69 74 28 74 65 78 74  Tree::_edit(text
84d0: 29 20 77 20 5c 0a 09 20 20 20 20 5b 6c 69 73 74  ) w \..    [list
84e0: 20 54 72 65 65 3a 3a 5f 75 70 64 61 74 65 5f 65   Tree::_update_e
84f0: 64 69 74 5f 73 69 7a 65 20 24 70 61 74 68 20 24  dit_size $path $
8500: 65 6e 74 20 24 69 64 77 20 24 77 6d 61 78 5d 0a  ent $idw $wmax].
8510: 20 20 20 20 20 20 20 20 74 6b 77 61 69 74 20 76          tkwait v
8520: 69 73 69 62 69 6c 69 74 79 20 24 65 6e 74 0a 20  isibility $ent. 
8530: 20 20 20 20 20 20 20 67 72 61 62 20 20 24 66 72         grab  $fr
8540: 61 6d 65 0a 20 20 20 20 20 20 20 20 42 57 69 64  ame.        BWid
8550: 67 65 74 3a 3a 66 6f 63 75 73 20 73 65 74 20 24  get::focus set $
8560: 65 6e 74 0a 0a 20 20 20 20 20 20 20 20 5f 75 70  ent..        _up
8570: 64 61 74 65 5f 65 64 69 74 5f 73 69 7a 65 20 24  date_edit_size $
8580: 70 61 74 68 20 24 65 6e 74 20 24 69 64 77 20 24  path $ent $idw $
8590: 77 6d 61 78 0a 20 20 20 20 20 20 20 20 75 70 64  wmax.        upd
85a0: 61 74 65 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ate.        if {
85b0: 20 24 73 65 6c 65 63 74 20 7d 20 7b 0a 20 20 20   $select } {.   
85c0: 20 20 20 20 20 20 20 20 20 24 65 6e 74 20 73 65           $ent se
85d0: 6c 65 63 74 69 6f 6e 20 72 61 6e 67 65 20 30 20  lection range 0 
85e0: 65 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  end.            
85f0: 24 65 6e 74 20 69 63 75 72 73 6f 72 20 65 6e 64  $ent icursor end
8600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 65 6e  .            $en
8610: 74 20 78 76 69 65 77 20 65 6e 64 0a 20 20 20 20  t xview end.    
8620: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 62      }..        b
8630: 69 6e 64 74 61 67 73 20 24 65 6e 74 20 5b 6c 69  indtags $ent [li
8640: 73 74 20 24 65 6e 74 20 45 6e 74 72 79 5d 0a 20  st $ent Entry]. 
8650: 20 20 20 20 20 20 20 62 69 6e 64 20 24 65 6e 74         bind $ent
8660: 20 3c 45 73 63 61 70 65 3e 20 7b 73 65 74 20 54   <Escape> {set T
8670: 72 65 65 3a 3a 5f 65 64 69 74 28 77 61 69 74 29  ree::_edit(wait)
8680: 20 30 7d 0a 20 20 20 20 20 20 20 20 62 69 6e 64   0}.        bind
8690: 20 24 65 6e 74 20 3c 52 65 74 75 72 6e 3e 20 7b   $ent <Return> {
86a0: 73 65 74 20 54 72 65 65 3a 3a 5f 65 64 69 74 28  set Tree::_edit(
86b0: 77 61 69 74 29 20 31 7d 0a 20 20 20 20 20 20 20  wait) 1}.       
86c0: 20 69 66 20 7b 20 24 63 6c 69 63 6b 72 65 73 20   if { $clickres 
86d0: 3d 3d 20 30 20 7c 7c 20 24 63 6c 69 63 6b 72 65  == 0 || $clickre
86e0: 73 20 3d 3d 20 31 20 7d 20 7b 0a 20 20 20 20 20  s == 1 } {.     
86f0: 20 20 20 20 20 20 20 62 69 6e 64 20 24 66 72 61         bind $fra
8700: 6d 65 20 3c 42 75 74 74 6f 6e 3e 20 20 5b 6c 69  me <Button>  [li
8710: 73 74 20 73 65 74 20 54 72 65 65 3a 3a 5f 65 64  st set Tree::_ed
8720: 69 74 28 77 61 69 74 29 20 24 63 6c 69 63 6b 72  it(wait) $clickr
8730: 65 73 5d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  es].        }.. 
8740: 20 20 20 20 20 20 20 73 65 74 20 6f 6b 20 30 0a         set ok 0.
8750: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 7b 20          while { 
8760: 21 24 6f 6b 20 7d 20 7b 0a 20 20 20 20 20 20 20  !$ok } {.       
8770: 20 20 20 20 20 74 6b 77 61 69 74 20 76 61 72 69       tkwait vari
8780: 61 62 6c 65 20 54 72 65 65 3a 3a 5f 65 64 69 74  able Tree::_edit
8790: 28 77 61 69 74 29 0a 20 20 20 20 20 20 20 20 20  (wait).         
87a0: 20 20 20 69 66 20 7b 20 21 24 5f 65 64 69 74 28     if { !$_edit(
87b0: 77 61 69 74 29 20 7c 7c 20 5b 6c 6c 65 6e 67 74  wait) || [llengt
87c0: 68 20 24 76 65 72 69 66 79 63 6d 64 5d 3d 3d 30  h $verifycmd]==0
87d0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
87e0: 20 20 20 20 20 5b 75 70 6c 65 76 65 6c 20 5c 23       [uplevel \#
87f0: 30 20 24 76 65 72 69 66 79 63 6d 64 20 5b 6c 69  0 $verifycmd [li
8800: 73 74 20 24 5f 65 64 69 74 28 74 65 78 74 29 5d  st $_edit(text)]
8810: 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] } {.          
8820: 20 20 20 20 20 20 73 65 74 20 6f 6b 20 31 0a 20        set ok 1. 
8830: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8840: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
8850: 74 72 61 63 65 20 76 64 65 6c 65 74 65 20 54 72  trace vdelete Tr
8860: 65 65 3a 3a 5f 65 64 69 74 28 74 65 78 74 29 20  ee::_edit(text) 
8870: 77 20 5c 0a 09 20 20 20 20 5b 6c 69 73 74 20 54  w \..    [list T
8880: 72 65 65 3a 3a 5f 75 70 64 61 74 65 5f 65 64 69  ree::_update_edi
8890: 74 5f 73 69 7a 65 20 24 70 61 74 68 20 24 65 6e  t_size $path $en
88a0: 74 20 24 69 64 77 20 24 77 6d 61 78 5d 0a 20 20  t $idw $wmax].  
88b0: 20 20 20 20 20 20 67 72 61 62 20 72 65 6c 65 61        grab relea
88c0: 73 65 20 24 66 72 61 6d 65 0a 20 20 20 20 20 20  se $frame.      
88d0: 20 20 42 57 69 64 67 65 74 3a 3a 66 6f 63 75 73    BWidget::focus
88e0: 20 72 65 6c 65 61 73 65 20 24 65 6e 74 0a 20 20   release $ent.  
88f0: 20 20 20 20 20 20 64 65 73 74 72 6f 79 20 24 66        destroy $f
8900: 72 61 6d 65 0a 20 20 20 20 20 20 20 20 24 70 61  rame.        $pa
8910: 74 68 2e 63 20 64 65 6c 65 74 65 20 24 69 64 77  th.c delete $idw
8920: 0a 20 20 20 20 20 20 20 20 24 70 61 74 68 2e 63  .        $path.c
8930: 20 69 74 65 6d 63 6f 6e 66 69 67 75 72 65 20 24   itemconfigure $
8940: 69 64 6e 20 20 20 20 2d 66 69 6c 6c 20 24 6f 6c  idn    -fill $ol
8950: 64 66 67 0a 20 20 20 20 20 20 20 20 24 70 61 74  dfg.        $pat
8960: 68 2e 63 20 69 74 65 6d 63 6f 6e 66 69 67 75 72  h.c itemconfigur
8970: 65 20 73 3a 24 6e 6f 64 65 20 2d 66 69 6c 6c 20  e s:$node -fill 
8980: 24 73 62 67 20 2d 6f 75 74 6c 69 6e 65 20 24 73  $sbg -outline $s
8990: 62 67 0a 0a 20 20 20 20 20 20 20 20 69 66 20 7b  bg..        if {
89a0: 20 24 5f 65 64 69 74 28 77 61 69 74 29 20 7d 20   $_edit(wait) } 
89b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
89c0: 74 75 72 6e 20 24 5f 65 64 69 74 28 74 65 78 74  turn $_edit(text
89d0: 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ).        }.    
89e0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 22 22 0a  }.    return "".
89f0: 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...# ----------
8a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a40: 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 54 72  --.#  Command Tr
8a50: 65 65 3a 3a 78 76 69 65 77 0a 23 20 2d 2d 2d 2d  ee::xview.# ----
8a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72  --------.proc Tr
8ab0: 65 65 3a 3a 78 76 69 65 77 20 7b 20 70 61 74 68  ee::xview { path
8ac0: 20 61 72 67 73 20 7d 20 7b 0a 20 20 20 20 72 65   args } {.    re
8ad0: 74 75 72 6e 20 5b 65 76 61 6c 20 5b 6c 69 6e 73  turn [eval [lins
8ae0: 65 72 74 20 24 61 72 67 73 20 30 20 24 70 61 74  ert $args 0 $pat
8af0: 68 2e 63 20 78 76 69 65 77 5d 5d 0a 7d 0a 0a 0a  h.c xview]].}...
8b00: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
8b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
8b50: 20 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a 3a    Command Tree::
8b60: 79 76 69 65 77 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d  yview.# --------
8b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 70 72 6f 63 20 54 72 65 65 3a 3a  ----.proc Tree::
8bc0: 79 76 69 65 77 20 7b 20 70 61 74 68 20 61 72 67  yview { path arg
8bd0: 73 20 7d 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  s } {.    return
8be0: 20 5b 65 76 61 6c 20 5b 6c 69 6e 73 65 72 74 20   [eval [linsert 
8bf0: 24 61 72 67 73 20 30 20 24 70 61 74 68 2e 63 20  $args 0 $path.c 
8c00: 79 76 69 65 77 5d 5d 0a 7d 0a 0a 0a 23 20 2d 2d  yview]].}...# --
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 2d 2d 2d  ----------------
8c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f  ----------.#  Co
8c60: 6d 6d 61 6e 64 20 54 72 65 65 3a 3a 5f 75 70 64  mmand Tree::_upd
8c70: 61 74 65 5f 65 64 69 74 5f 73 69 7a 65 0a 23 20  ate_edit_size.# 
8c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f  ------------.pro
8cd0: 63 20 54 72 65 65 3a 3a 5f 75 70 64 61 74 65 5f  c Tree::_update_
8ce0: 65 64 69 74 5f 73 69 7a 65 20 7b 20 70 61 74 68  edit_size { path
8cf0: 20 65 6e 74 72 79 20 69 64 77 20 77 6d 61 78 20   entry idw wmax 
8d00: 61 72 67 73 20 7d 20 7b 0a 20 20 20 20 73 65 74  args } {.    set
8d10: 20 65 6e 74 77 20 5b 77 69 6e 66 6f 20 72 65 71   entw [winfo req
8d20: 77 69 64 74 68 20 24 65 6e 74 72 79 5d 0a 20 20  width $entry].  
8d30: 20 20 69 66 20 7b 20 24 65 6e 74 77 2b 38 20 3e    if { $entw+8 >
8d40: 3d 20 24 77 6d 61 78 20 7d 20 7b 0a 20 20 20 20  = $wmax } {.    
8d50: 20 20 20 20 24 70 61 74 68 2e 63 20 69 74 65 6d      $path.c item
8d60: 63 6f 6e 66 69 67 75 72 65 20 24 69 64 77 20 2d  configure $idw -
8d70: 77 69 64 74 68 20 24 77 6d 61 78 0a 20 20 20 20  width $wmax.    
8d80: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
8d90: 20 24 70 61 74 68 2e 63 20 69 74 65 6d 63 6f 6e   $path.c itemcon
8da0: 66 69 67 75 72 65 20 24 69 64 77 20 2d 77 69 64  figure $idw -wid
8db0: 74 68 20 30 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 23  th 0.    }.}...#
8dc0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
8dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
8e10: 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a 3a 5f   Command Tree::_
8e20: 73 65 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  see.# ----------
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 2d  ----------------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e70: 2d 2d 0a 70 72 6f 63 20 54 72 65 65 3a 3a 5f 73  --.proc Tree::_s
8e80: 65 65 20 7b 20 70 61 74 68 20 69 64 6e 20 7d 20  ee { path idn } 
8e90: 7b 0a 20 20 20 20 73 65 74 20 62 62 6f 78 20 5b  {.    set bbox [
8ea0: 24 70 61 74 68 2e 63 20 62 62 6f 78 20 24 69 64  $path.c bbox $id
8eb0: 6e 5d 0a 20 20 20 20 73 65 74 20 73 63 72 6c 20  n].    set scrl 
8ec0: 5b 24 70 61 74 68 2e 63 20 63 67 65 74 20 2d 73  [$path.c cget -s
8ed0: 63 72 6f 6c 6c 72 65 67 69 6f 6e 5d 0a 0a 20 20  crollregion]..  
8ee0: 20 20 73 65 74 20 79 6d 61 78 20 5b 6c 69 6e 64    set ymax [lind
8ef0: 65 78 20 24 73 63 72 6c 20 33 5d 0a 20 20 20 20  ex $scrl 3].    
8f00: 73 65 74 20 64 79 20 20 20 5b 24 70 61 74 68 2e  set dy   [$path.
8f10: 63 20 63 67 65 74 20 2d 79 73 63 72 6f 6c 6c 69  c cget -yscrolli
8f20: 6e 63 72 65 6d 65 6e 74 5d 0a 20 20 20 20 73 65  ncrement].    se
8f30: 74 20 79 76 20 20 20 5b 24 70 61 74 68 20 79 76  t yv   [$path yv
8f40: 69 65 77 5d 0a 20 20 20 20 73 65 74 20 79 76 30  iew].    set yv0
8f50: 20 20 5b 65 78 70 72 20 7b 72 6f 75 6e 64 28 5b    [expr {round([
8f60: 6c 69 6e 64 65 78 20 24 79 76 20 30 5d 2a 24 79  lindex $yv 0]*$y
8f70: 6d 61 78 2f 24 64 79 29 7d 5d 0a 20 20 20 20 73  max/$dy)}].    s
8f80: 65 74 20 79 76 31 20 20 5b 65 78 70 72 20 7b 72  et yv1  [expr {r
8f90: 6f 75 6e 64 28 5b 6c 69 6e 64 65 78 20 24 79 76  ound([lindex $yv
8fa0: 20 31 5d 2a 24 79 6d 61 78 2f 24 64 79 29 7d 5d   1]*$ymax/$dy)}]
8fb0: 0a 20 20 20 20 73 65 74 20 79 20 20 20 20 5b 65  .    set y    [e
8fc0: 78 70 72 20 7b 69 6e 74 28 5b 6c 69 6e 64 65 78  xpr {int([lindex
8fd0: 20 5b 24 70 61 74 68 2e 63 20 63 6f 6f 72 64 73   [$path.c coords
8fe0: 20 24 69 64 6e 5d 20 31 5d 2f 24 64 79 29 7d 5d   $idn] 1]/$dy)}]
8ff0: 0a 20 20 20 20 69 66 20 7b 20 24 79 20 3c 20 24  .    if { $y < $
9000: 79 76 30 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  yv0 } {.        
9010: 24 70 61 74 68 2e 63 20 79 76 69 65 77 20 73 63  $path.c yview sc
9020: 72 6f 6c 6c 20 5b 65 78 70 72 20 7b 24 79 2d 24  roll [expr {$y-$
9030: 79 76 30 7d 5d 20 75 6e 69 74 73 0a 20 20 20 20  yv0}] units.    
9040: 7d 20 65 6c 73 65 69 66 20 7b 20 24 79 20 3e 3d  } elseif { $y >=
9050: 20 24 79 76 31 20 7d 20 7b 0a 20 20 20 20 20 20   $yv1 } {.      
9060: 20 20 24 70 61 74 68 2e 63 20 79 76 69 65 77 20    $path.c yview 
9070: 73 63 72 6f 6c 6c 20 5b 65 78 70 72 20 7b 24 79  scroll [expr {$y
9080: 2d 24 79 76 31 2b 31 7d 5d 20 75 6e 69 74 73 0a  -$yv1+1}] units.
9090: 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 78      }..    set x
90a0: 6d 61 78 20 5b 6c 69 6e 64 65 78 20 24 73 63 72  max [lindex $scr
90b0: 6c 20 32 5d 0a 20 20 20 20 73 65 74 20 64 78 20  l 2].    set dx 
90c0: 20 20 5b 24 70 61 74 68 2e 63 20 63 67 65 74 20    [$path.c cget 
90d0: 2d 78 73 63 72 6f 6c 6c 69 6e 63 72 65 6d 65 6e  -xscrollincremen
90e0: 74 5d 0a 20 20 20 20 73 65 74 20 78 76 20 20 20  t].    set xv   
90f0: 5b 24 70 61 74 68 20 78 76 69 65 77 5d 0a 20 20  [$path xview].  
9100: 20 20 73 65 74 20 78 30 20 20 20 5b 65 78 70 72    set x0   [expr
9110: 20 7b 69 6e 74 28 5b 6c 69 6e 64 65 78 20 24 62   {int([lindex $b
9120: 62 6f 78 20 30 5d 2f 24 64 78 29 7d 5d 0a 20 20  box 0]/$dx)}].  
9130: 20 20 73 65 74 20 78 76 30 20 20 5b 65 78 70 72    set xv0  [expr
9140: 20 7b 72 6f 75 6e 64 28 5b 6c 69 6e 64 65 78 20   {round([lindex 
9150: 24 78 76 20 30 5d 2a 24 78 6d 61 78 2f 24 64 78  $xv 0]*$xmax/$dx
9160: 29 7d 5d 0a 20 20 20 20 73 65 74 20 78 76 31 20  )}].    set xv1 
9170: 20 5b 65 78 70 72 20 7b 72 6f 75 6e 64 28 5b 6c   [expr {round([l
9180: 69 6e 64 65 78 20 24 78 76 20 31 5d 2a 24 78 6d  index $xv 1]*$xm
9190: 61 78 2f 24 64 78 29 7d 5d 0a 20 20 20 20 69 66  ax/$dx)}].    if
91a0: 20 7b 20 24 78 30 20 3e 3d 20 24 78 76 31 20 7c   { $x0 >= $xv1 |
91b0: 7c 20 24 78 30 20 3c 20 24 78 76 30 20 7d 20 7b  | $x0 < $xv0 } {
91c0: 0a 09 24 70 61 74 68 2e 63 20 78 76 69 65 77 20  ..$path.c xview 
91d0: 73 63 72 6f 6c 6c 20 5b 65 78 70 72 20 7b 24 78  scroll [expr {$x
91e0: 30 2d 24 78 76 30 7d 5d 20 75 6e 69 74 73 0a 20  0-$xv0}] units. 
91f0: 20 20 20 7d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d     }.}...# -----
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9240: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61  -------.#  Comma
9250: 6e 64 20 54 72 65 65 3a 3a 5f 72 65 63 65 78 70  nd Tree::_recexp
9260: 61 6e 64 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  and.# ----------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92b0: 2d 2d 0a 23 20 4a 44 43 20 3a 20 61 64 64 65 64  --.# JDC : added
92c0: 20 6f 70 74 69 6f 6e 20 72 65 63 75 72 73 69 76   option recursiv
92d0: 65 0a 70 72 6f 63 20 54 72 65 65 3a 3a 5f 72 65  e.proc Tree::_re
92e0: 63 65 78 70 61 6e 64 20 7b 20 70 61 74 68 20 6e  cexpand { path n
92f0: 6f 64 65 20 65 78 70 61 6e 64 20 72 65 63 75 72  ode expand recur
9300: 73 69 76 65 20 63 6d 64 20 7d 20 7b 0a 20 20 20  sive cmd } {.   
9310: 20 76 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a   variable $path.
9320: 20 20 20 20 75 70 76 61 72 20 30 20 20 24 70 61      upvar 0  $pa
9330: 74 68 20 64 61 74 61 0a 0a 20 20 20 20 69 66 20  th data..    if 
9340: 7b 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70  { [Widget::getop
9350: 74 69 6f 6e 20 24 70 61 74 68 2e 24 6e 6f 64 65  tion $path.$node
9360: 20 2d 6f 70 65 6e 5d 20 21 3d 20 24 65 78 70 61   -open] != $expa
9370: 6e 64 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 57  nd } {.        W
9380: 69 64 67 65 74 3a 3a 73 65 74 6f 70 74 69 6f 6e  idget::setoption
9390: 20 24 70 61 74 68 2e 24 6e 6f 64 65 20 2d 6f 70   $path.$node -op
93a0: 65 6e 20 24 65 78 70 61 6e 64 0a 20 20 20 20 20  en $expand.     
93b0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
93c0: 24 63 6d 64 5d 7d 20 7b 0a 20 20 20 20 20 20 20  $cmd]} {.       
93d0: 20 20 20 20 20 75 70 6c 65 76 65 6c 20 5c 23 30       uplevel \#0
93e0: 20 24 63 6d 64 20 5b 6c 69 73 74 20 24 6e 6f 64   $cmd [list $nod
93f0: 65 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e].        }.   
9400: 20 7d 0a 0a 20 20 20 20 69 66 20 7b 20 24 72 65   }..    if { $re
9410: 63 75 72 73 69 76 65 20 7d 20 7b 0a 09 66 6f 72  cursive } {..for
9420: 65 61 63 68 20 73 75 62 6e 6f 64 65 20 5b 6c 72  each subnode [lr
9430: 61 6e 67 65 20 24 64 61 74 61 28 24 6e 6f 64 65  ange $data($node
9440: 29 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20  ) 1 end] {..    
9450: 5f 72 65 63 65 78 70 61 6e 64 20 24 70 61 74 68  _recexpand $path
9460: 20 24 73 75 62 6e 6f 64 65 20 24 65 78 70 61 6e   $subnode $expan
9470: 64 20 24 72 65 63 75 72 73 69 76 65 20 24 63 6d  d $recursive $cm
9480: 64 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 23  d..}.    }.}...#
9490: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
94a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
94d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
94e0: 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a 3a 5f   Command Tree::_
94f0: 73 75 62 64 65 6c 65 74 65 0a 23 20 2d 2d 2d 2d  subdelete.# ----
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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9540: 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72  --------.proc Tr
9550: 65 65 3a 3a 5f 73 75 62 64 65 6c 65 74 65 20 7b  ee::_subdelete {
9560: 20 70 61 74 68 20 6c 6e 6f 64 65 73 20 7d 20 7b   path lnodes } {
9570: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 24 70  .    variable $p
9580: 61 74 68 0a 20 20 20 20 75 70 76 61 72 20 30 20  ath.    upvar 0 
9590: 20 24 70 61 74 68 20 64 61 74 61 0a 0a 20 20 20   $path data..   
95a0: 20 73 65 74 20 73 65 6c 20 24 64 61 74 61 28 73   set sel $data(s
95b0: 65 6c 6e 6f 64 65 73 29 0a 20 20 20 20 73 65 74  elnodes).    set
95c0: 20 73 65 6c 63 68 61 6e 67 65 64 20 30 0a 0a 20   selchanged 0.. 
95d0: 20 20 20 77 68 69 6c 65 20 7b 20 5b 6c 6c 65 6e     while { [llen
95e0: 67 74 68 20 24 6c 6e 6f 64 65 73 5d 20 7d 20 7b  gth $lnodes] } {
95f0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6c 73 75  .        set lsu
9600: 62 6e 6f 64 65 73 20 5b 6c 69 73 74 5d 0a 20 20  bnodes [list].  
9610: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 6f        foreach no
9620: 64 65 20 24 6c 6e 6f 64 65 73 20 7b 0a 20 20 20  de $lnodes {.   
9630: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
9640: 20 73 75 62 6e 6f 64 65 20 5b 6c 72 61 6e 67 65   subnode [lrange
9650: 20 24 64 61 74 61 28 24 6e 6f 64 65 29 20 31 20   $data($node) 1 
9660: 65 6e 64 5d 20 7b 0a 20 20 20 20 20 20 20 20 20  end] {.         
9670: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c         lappend l
9680: 73 75 62 6e 6f 64 65 73 20 24 73 75 62 6e 6f 64  subnodes $subnod
9690: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  e.            }.
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73 65              unse
96b0: 74 20 64 61 74 61 28 24 6e 6f 64 65 29 0a 09 20  t data($node).. 
96c0: 20 20 20 73 65 74 20 69 64 78 20 5b 6c 73 65 61     set idx [lsea
96d0: 72 63 68 20 2d 65 78 61 63 74 20 24 73 65 6c 20  rch -exact $sel 
96e0: 24 6e 6f 64 65 5d 0a 09 20 20 20 20 69 66 20 7b  $node]..    if {
96f0: 20 24 69 64 78 20 3e 3d 20 30 20 7d 20 7b 0a 09   $idx >= 0 } {..
9700: 09 73 65 74 20 73 65 6c 20 5b 6c 72 65 70 6c 61  .set sel [lrepla
9710: 63 65 20 24 73 65 6c 20 24 69 64 78 20 24 69 64  ce $sel $idx $id
9720: 78 5d 0a 09 09 69 6e 63 72 20 73 65 6c 63 68 61  x]...incr selcha
9730: 6e 67 65 64 0a 09 20 20 20 20 7d 0a 20 20 20 20  nged..    }.    
9740: 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 73 65          if { [se
9750: 74 20 77 69 6e 20 5b 57 69 64 67 65 74 3a 3a 67  t win [Widget::g
9760: 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 2e 24  etoption $path.$
9770: 6e 6f 64 65 20 2d 77 69 6e 64 6f 77 5d 5d 20 21  node -window]] !
9780: 3d 20 22 22 20 7d 20 7b 0a 20 20 20 20 20 20 20  = "" } {.       
9790: 20 20 20 20 20 20 20 20 20 64 65 73 74 72 6f 79           destroy
97a0: 20 24 77 69 6e 0a 20 20 20 20 20 20 20 20 20 20   $win.          
97b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
97c0: 57 69 64 67 65 74 3a 3a 64 65 73 74 72 6f 79 20  Widget::destroy 
97d0: 24 70 61 74 68 2e 24 6e 6f 64 65 0a 20 20 20 20  $path.$node.    
97e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 65      }.        se
97f0: 74 20 6c 6e 6f 64 65 73 20 24 6c 73 75 62 6e 6f  t lnodes $lsubno
9800: 64 65 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  des.    }..    s
9810: 65 74 20 64 61 74 61 28 73 65 6c 6e 6f 64 65 73  et data(selnodes
9820: 29 20 24 73 65 6c 0a 20 20 20 20 23 20 72 65 74  ) $sel.    # ret
9830: 75 72 6e 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  urn number of se
9840: 6c 20 69 74 65 6d 73 20 63 68 61 6e 67 65 73 0a  l items changes.
9850: 20 20 20 20 72 65 74 75 72 6e 20 24 73 65 6c 63      return $selc
9860: 68 61 6e 67 65 64 0a 7d 0a 0a 0a 23 20 2d 2d 2d  hanged.}...# ---
9870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d  ---------.#  Com
98c0: 6d 61 6e 64 20 54 72 65 65 3a 3a 5f 75 70 64 61  mand Tree::_upda
98d0: 74 65 5f 73 63 72 6f 6c 6c 72 65 67 69 6f 6e 0a  te_scrollregion.
98e0: 23 20 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70  --------------.p
9930: 72 6f 63 20 54 72 65 65 3a 3a 5f 75 70 64 61 74  roc Tree::_updat
9940: 65 5f 73 63 72 6f 6c 6c 72 65 67 69 6f 6e 20 7b  e_scrollregion {
9950: 20 70 61 74 68 20 7d 20 7b 0a 20 20 20 20 73 65   path } {.    se
9960: 74 20 62 64 20 20 20 5b 65 78 70 72 20 7b 32 2a  t bd   [expr {2*
9970: 28 5b 24 70 61 74 68 2e 63 20 63 67 65 74 20 2d  ([$path.c cget -
9980: 62 6f 72 64 65 72 77 69 64 74 68 5d 2b 5b 24 70  borderwidth]+[$p
9990: 61 74 68 2e 63 20 63 67 65 74 20 2d 68 69 67 68  ath.c cget -high
99a0: 6c 69 67 68 74 74 68 69 63 6b 6e 65 73 73 5d 29  lightthickness])
99b0: 7d 5d 0a 20 20 20 20 73 65 74 20 77 20 20 20 20  }].    set w    
99c0: 5b 65 78 70 72 20 7b 5b 77 69 6e 66 6f 20 77 69  [expr {[winfo wi
99d0: 64 74 68 20 20 24 70 61 74 68 5d 20 2d 20 24 62  dth  $path] - $b
99e0: 64 7d 5d 0a 20 20 20 20 73 65 74 20 68 20 20 20  d}].    set h   
99f0: 20 5b 65 78 70 72 20 7b 5b 77 69 6e 66 6f 20 68   [expr {[winfo h
9a00: 65 69 67 68 74 20 24 70 61 74 68 5d 20 2d 20 24  eight $path] - $
9a10: 62 64 7d 5d 0a 20 20 20 20 73 65 74 20 78 69 6e  bd}].    set xin
9a20: 63 20 5b 24 70 61 74 68 2e 63 20 63 67 65 74 20  c [$path.c cget 
9a30: 2d 78 73 63 72 6f 6c 6c 69 6e 63 72 65 6d 65 6e  -xscrollincremen
9a40: 74 5d 0a 20 20 20 20 73 65 74 20 79 69 6e 63 20  t].    set yinc 
9a50: 5b 24 70 61 74 68 2e 63 20 63 67 65 74 20 2d 79  [$path.c cget -y
9a60: 73 63 72 6f 6c 6c 69 6e 63 72 65 6d 65 6e 74 5d  scrollincrement]
9a70: 0a 20 20 20 20 73 65 74 20 62 62 6f 78 20 5b 24  .    set bbox [$
9a80: 70 61 74 68 2e 63 20 62 62 6f 78 20 6e 6f 64 65  path.c bbox node
9a90: 5d 0a 20 20 20 20 69 66 20 7b 20 5b 6c 6c 65 6e  ].    if { [llen
9aa0: 67 74 68 20 24 62 62 6f 78 5d 20 7d 20 7b 0a 20  gth $bbox] } {. 
9ab0: 20 20 20 20 20 20 20 73 65 74 20 78 73 20 5b 6c         set xs [l
9ac0: 69 6e 64 65 78 20 24 62 62 6f 78 20 32 5d 0a 20  index $bbox 2]. 
9ad0: 20 20 20 20 20 20 20 73 65 74 20 79 73 20 5b 6c         set ys [l
9ae0: 69 6e 64 65 78 20 24 62 62 6f 78 20 33 5d 0a 0a  index $bbox 3]..
9af0: 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 77 20          if { $w 
9b00: 3c 20 24 78 73 20 7d 20 7b 0a 20 20 20 20 20 20  < $xs } {.      
9b10: 20 20 20 20 20 20 73 65 74 20 77 20 5b 65 78 70        set w [exp
9b20: 72 20 7b 24 78 73 20 2b 20 24 77 20 25 20 24 78  r {$xs + $w % $x
9b30: 69 6e 63 7d 5d 0a 20 20 20 20 20 20 20 20 7d 0a  inc}].        }.
9b40: 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 68 20          if { $h 
9b50: 3c 20 24 79 73 20 7d 20 7b 0a 20 20 20 20 20 20  < $ys } {.      
9b60: 20 20 20 20 20 20 73 65 74 20 68 20 5b 65 78 70        set h [exp
9b70: 72 20 7b 24 79 73 20 2b 20 24 68 20 25 20 24 79  r {$ys + $h % $y
9b80: 69 6e 63 7d 5d 0a 20 20 20 20 20 20 20 20 7d 0a  inc}].        }.
9b90: 20 20 20 20 7d 0a 0a 20 20 20 20 24 70 61 74 68      }..    $path
9ba0: 2e 63 20 63 6f 6e 66 69 67 75 72 65 20 2d 73 63  .c configure -sc
9bb0: 72 6f 6c 6c 72 65 67 69 6f 6e 20 5b 6c 69 73 74  rollregion [list
9bc0: 20 30 20 30 20 24 77 20 24 68 5d 0a 0a 20 20 20   0 0 $w $h]..   
9bd0: 20 69 66 20 7b 5b 57 69 64 67 65 74 3a 3a 67 65   if {[Widget::ge
9be0: 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 73  toption $path -s
9bf0: 65 6c 65 63 74 66 69 6c 6c 5d 7d 20 7b 0a 20 20  electfill]} {.  
9c00: 20 20 20 20 20 20 5f 72 65 64 72 61 77 5f 73 65        _redraw_se
9c10: 6c 65 63 74 69 6f 6e 20 24 70 61 74 68 0a 20 20  lection $path.  
9c20: 20 20 7d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d    }.}...# ------
9c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 20 43 6f 6d 6d 61 6e  ------.#  Comman
9c80: 64 20 54 72 65 65 3a 3a 5f 63 72 6f 73 73 5f 65  d Tree::_cross_e
9c90: 76 65 6e 74 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  vent.# ---------
9ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9ce0: 2d 2d 2d 0a 70 72 6f 63 20 54 72 65 65 3a 3a 5f  ---.proc Tree::_
9cf0: 63 72 6f 73 73 5f 65 76 65 6e 74 20 7b 20 70 61  cross_event { pa
9d00: 74 68 20 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  th } {.    varia
9d10: 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75 70  ble $path.    up
9d20: 76 61 72 20 30 20 20 24 70 61 74 68 20 64 61 74  var 0  $path dat
9d30: 61 0a 0a 20 20 20 20 73 65 74 20 6e 6f 64 65 20  a..    set node 
9d40: 5b 54 72 65 65 3a 3a 5f 67 65 74 5f 6e 6f 64 65  [Tree::_get_node
9d50: 5f 6e 61 6d 65 20 24 70 61 74 68 20 63 75 72 72  _name $path curr
9d60: 65 6e 74 20 31 5d 0a 20 20 20 20 69 66 20 7b 20  ent 1].    if { 
9d70: 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69  [Widget::getopti
9d80: 6f 6e 20 24 70 61 74 68 2e 24 6e 6f 64 65 20 2d  on $path.$node -
9d90: 6f 70 65 6e 5d 20 7d 20 7b 0a 20 20 20 20 20 20  open] } {.      
9da0: 20 20 54 72 65 65 3a 3a 69 74 65 6d 63 6f 6e 66    Tree::itemconf
9db0: 69 67 75 72 65 20 24 70 61 74 68 20 24 6e 6f 64  igure $path $nod
9dc0: 65 20 2d 6f 70 65 6e 20 30 0a 20 20 20 20 20 20  e -open 0.      
9dd0: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b    if {[llength [
9de0: 73 65 74 20 63 6d 64 20 5b 57 69 64 67 65 74 3a  set cmd [Widget:
9df0: 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68  :getoption $path
9e00: 20 2d 63 6c 6f 73 65 63 6d 64 5d 5d 5d 7d 20 7b   -closecmd]]]} {
9e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 70 6c  .            upl
9e20: 65 76 65 6c 20 5c 23 30 20 24 63 6d 64 20 5b 6c  evel \#0 $cmd [l
9e30: 69 73 74 20 24 6e 6f 64 65 5d 0a 20 20 20 20 20  ist $node].     
9e40: 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
9e50: 7b 0a 20 20 20 20 20 20 20 20 54 72 65 65 3a 3a  {.        Tree::
9e60: 69 74 65 6d 63 6f 6e 66 69 67 75 72 65 20 24 70  itemconfigure $p
9e70: 61 74 68 20 24 6e 6f 64 65 20 2d 6f 70 65 6e 20  ath $node -open 
9e80: 31 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  1.        if {[l
9e90: 6c 65 6e 67 74 68 20 5b 73 65 74 20 63 6d 64 20  length [set cmd 
9ea0: 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69  [Widget::getopti
9eb0: 6f 6e 20 24 70 61 74 68 20 2d 6f 70 65 6e 63 6d  on $path -opencm
9ec0: 64 5d 5d 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20  d]]]} {.        
9ed0: 20 20 20 20 75 70 6c 65 76 65 6c 20 5c 23 30 20      uplevel \#0 
9ee0: 24 63 6d 64 20 5b 6c 69 73 74 20 24 6e 6f 64 65  $cmd [list $node
9ef0: 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ].        }.    
9f00: 7d 0a 7d 0a 0a 0a 70 72 6f 63 20 54 72 65 65 3a  }.}...proc Tree:
9f10: 3a 5f 64 72 61 77 5f 63 72 6f 73 73 20 7b 20 70  :_draw_cross { p
9f20: 61 74 68 20 6e 6f 64 65 20 6f 70 65 6e 20 78 20  ath node open x 
9f30: 79 20 7d 20 7b 0a 20 20 20 20 73 65 74 20 69 64  y } {.    set id
9f40: 63 20 5b 24 70 61 74 68 2e 63 20 66 69 6e 64 20  c [$path.c find 
9f50: 77 69 74 68 74 61 67 20 63 3a 24 6e 6f 64 65 5d  withtag c:$node]
9f60: 0a 0a 20 20 20 20 69 66 20 7b 20 24 6f 70 65 6e  ..    if { $open
9f70: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74   } {.        set
9f80: 20 69 6d 67 20 5b 57 69 64 67 65 74 3a 3a 63 67   img [Widget::cg
9f90: 65 74 20 24 70 61 74 68 20 2d 63 72 6f 73 73 6f  et $path -crosso
9fa0: 70 65 6e 69 6d 61 67 65 5d 0a 20 20 20 20 20 20  penimage].      
9fb0: 20 20 73 65 74 20 62 6d 70 20 5b 57 69 64 67 65    set bmp [Widge
9fc0: 74 3a 3a 63 67 65 74 20 24 70 61 74 68 20 2d 63  t::cget $path -c
9fd0: 72 6f 73 73 6f 70 65 6e 62 69 74 6d 61 70 5d 0a  rossopenbitmap].
9fe0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
9ff0: 20 20 20 20 20 73 65 74 20 69 6d 67 20 5b 57 69       set img [Wi
a000: 64 67 65 74 3a 3a 63 67 65 74 20 24 70 61 74 68  dget::cget $path
a010: 20 2d 63 72 6f 73 73 63 6c 6f 73 65 69 6d 61 67   -crosscloseimag
a020: 65 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20 62  e].        set b
a030: 6d 70 20 5b 57 69 64 67 65 74 3a 3a 63 67 65 74  mp [Widget::cget
a040: 20 24 70 61 74 68 20 2d 63 72 6f 73 73 63 6c 6f   $path -crossclo
a050: 73 65 62 69 74 6d 61 70 5d 0a 20 20 20 20 7d 0a  sebitmap].    }.
a060: 0a 20 20 20 20 23 23 20 49 66 20 77 65 20 61 6c  .    ## If we al
a070: 72 65 61 64 79 20 68 61 76 65 20 61 20 63 72 6f  ready have a cro
a080: 73 73 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ss for this node
a090: 2c 20 77 65 20 6a 75 73 74 20 61 64 6a 75 73 74  , we just adjust
a0a0: 20 74 68 65 20 69 6d 61 67 65 2e 0a 20 20 20 20   the image..    
a0b0: 69 66 20 7b 24 69 64 63 20 21 3d 20 22 22 7d 20  if {$idc != ""} 
a0c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 69  {.        if {$i
a0d0: 6d 67 20 3d 3d 20 22 22 7d 20 7b 0a 20 20 20 20  mg == ""} {.    
a0e0: 20 20 20 20 20 20 20 20 24 70 61 74 68 2e 63 20          $path.c 
a0f0: 69 74 65 6d 63 6f 6e 66 69 67 75 72 65 20 24 69  itemconfigure $i
a100: 64 63 20 2d 62 69 74 6d 61 70 20 24 62 6d 70 0a  dc -bitmap $bmp.
a110: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
a120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 70 61  .            $pa
a130: 74 68 2e 63 20 69 74 65 6d 63 6f 6e 66 69 67 75  th.c itemconfigu
a140: 72 65 20 24 69 64 63 20 2d 69 6d 61 67 65 20 24  re $idc -image $
a150: 69 6d 67 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  img.        }.  
a160: 20 20 20 20 20 20 72 65 74 75 72 6e 0a 20 20 20        return.   
a170: 20 7d 0a 0a 20 20 20 20 23 23 20 43 72 65 61 74   }..    ## Creat
a180: 65 20 61 20 6e 65 77 20 69 6d 61 67 65 20 66 6f  e a new image fo
a190: 72 20 74 68 65 20 63 72 6f 73 73 2e 20 20 49 66  r the cross.  If
a1a0: 20 74 68 65 20 75 73 65 72 20 68 61 73 20 73 70   the user has sp
a1b0: 65 63 69 66 69 65 64 20 61 6e 0a 20 20 20 20 23  ecified an.    #
a1c0: 23 20 69 6d 61 67 65 2c 20 69 74 20 6f 76 65 72  # image, it over
a1d0: 72 69 64 65 73 20 61 20 62 69 74 6d 61 70 2e 0a  rides a bitmap..
a1e0: 20 20 20 20 69 66 20 7b 24 69 6d 67 20 3d 3d 20      if {$img == 
a1f0: 22 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 24 70  ""} {.        $p
a200: 61 74 68 2e 63 20 63 72 65 61 74 65 20 62 69 74  ath.c create bit
a210: 6d 61 70 20 24 78 20 24 79 20 5c 0a 20 20 20 20  map $x $y \.    
a220: 20 20 20 20 20 20 20 20 2d 62 69 74 6d 61 70 20          -bitmap 
a230: 20 20 20 20 24 62 6d 70 20 5c 0a 20 20 20 20 20      $bmp \.     
a240: 20 20 20 20 20 20 20 2d 62 61 63 6b 67 72 6f 75         -backgrou
a250: 6e 64 20 5b 24 70 61 74 68 2e 63 20 63 67 65 74  nd [$path.c cget
a260: 20 2d 62 61 63 6b 67 72 6f 75 6e 64 5d 20 5c 0a   -background] \.
a270: 20 20 20 20 20 20 20 20 20 20 20 20 2d 66 6f 72              -for
a280: 65 67 72 6f 75 6e 64 20 5b 57 69 64 67 65 74 3a  eground [Widget:
a290: 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68  :getoption $path
a2a0: 20 2d 63 72 6f 73 73 66 69 6c 6c 5d 20 5c 0a 20   -crossfill] \. 
a2b0: 20 20 20 20 20 20 20 20 20 20 20 2d 74 61 67 73             -tags
a2c0: 20 20 20 20 20 20 20 5b 6c 69 73 74 20 63 72 6f         [list cro
a2d0: 73 73 20 63 3a 24 6e 6f 64 65 5d 20 2d 61 6e 63  ss c:$node] -anc
a2e0: 68 6f 72 20 63 0a 20 20 20 20 7d 20 65 6c 73 65  hor c.    } else
a2f0: 20 7b 0a 20 20 20 20 20 20 20 20 24 70 61 74 68   {.        $path
a300: 2e 63 20 63 72 65 61 74 65 20 69 6d 61 67 65 20  .c create image 
a310: 24 78 20 24 79 20 5c 0a 20 20 20 20 20 20 20 20  $x $y \.        
a320: 20 20 20 20 2d 69 6d 61 67 65 20 20 20 20 20 20      -image      
a330: 24 69 6d 67 20 5c 0a 20 20 20 20 20 20 20 20 20  $img \.         
a340: 20 20 20 2d 74 61 67 73 20 20 20 20 20 20 20 5b     -tags       [
a350: 6c 69 73 74 20 63 72 6f 73 73 20 63 3a 24 6e 6f  list cross c:$no
a360: 64 65 5d 20 2d 61 6e 63 68 6f 72 20 63 0a 20 20  de] -anchor c.  
a370: 20 20 7d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d    }.}...# ------
a380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3c0: 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e  ------.#  Comman
a3d0: 64 20 54 72 65 65 3a 3a 5f 64 72 61 77 5f 6e 6f  d Tree::_draw_no
a3e0: 64 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  de.# -----------
a3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a430: 2d 0a 70 72 6f 63 20 54 72 65 65 3a 3a 5f 64 72  -.proc Tree::_dr
a440: 61 77 5f 6e 6f 64 65 20 7b 20 70 61 74 68 20 6e  aw_node { path n
a450: 6f 64 65 20 78 30 20 79 30 20 64 65 6c 74 61 78  ode x0 y0 deltax
a460: 20 64 65 6c 74 61 79 20 70 61 64 78 20 73 68 6f   deltay padx sho
a470: 77 6c 69 6e 65 73 20 7d 20 7b 0a 20 20 20 20 76  wlines } {.    v
a480: 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20 20  ariable $path.  
a490: 20 20 75 70 76 61 72 20 30 20 20 24 70 61 74 68    upvar 0  $path
a4a0: 20 64 61 74 61 0a 0a 20 20 20 20 73 65 74 20 78   data..    set x
a4b0: 31 20 5b 65 78 70 72 20 7b 24 78 30 2b 24 64 65  1 [expr {$x0+$de
a4c0: 6c 74 61 78 2b 35 7d 5d 0a 20 20 20 20 73 65 74  ltax+5}].    set
a4d0: 20 79 31 20 24 79 30 0a 20 20 20 20 69 66 20 7b   y1 $y0.    if {
a4e0: 20 24 73 68 6f 77 6c 69 6e 65 73 20 7d 20 7b 0a   $showlines } {.
a4f0: 20 20 20 20 20 20 20 20 24 70 61 74 68 2e 63 20          $path.c 
a500: 63 72 65 61 74 65 20 6c 69 6e 65 20 24 78 30 20  create line $x0 
a510: 24 79 30 20 24 78 31 20 24 79 30 20 5c 0a 20 20  $y0 $x1 $y0 \.  
a520: 20 20 20 20 20 20 20 20 20 20 2d 66 69 6c 6c 20            -fill 
a530: 20 20 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f     [Widget::geto
a540: 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 6c 69 6e  ption $path -lin
a550: 65 73 66 69 6c 6c 5d 20 20 20 5c 0a 20 20 20 20  esfill]   \.    
a560: 20 20 20 20 20 20 20 20 2d 73 74 69 70 70 6c 65          -stipple
a570: 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74   [Widget::getopt
a580: 69 6f 6e 20 24 70 61 74 68 20 2d 6c 69 6e 65 73  ion $path -lines
a590: 74 69 70 70 6c 65 5d 20 5c 0a 20 20 20 20 20 20  tipple] \.      
a5a0: 20 20 20 20 20 20 2d 74 61 67 73 20 20 20 20 6c        -tags    l
a5b0: 69 6e 65 0a 20 20 20 20 7d 0a 20 20 20 20 24 70  ine.    }.    $p
a5c0: 61 74 68 2e 63 20 63 72 65 61 74 65 20 74 65 78  ath.c create tex
a5d0: 74 20 5b 65 78 70 72 20 7b 24 78 31 2b 24 70 61  t [expr {$x1+$pa
a5e0: 64 78 7d 5d 20 24 79 30 20 5c 0a 20 20 20 20 20  dx}] $y0 \.     
a5f0: 20 20 20 2d 74 65 78 74 20 20 20 5b 57 69 64 67     -text   [Widg
a600: 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70  et::getoption $p
a610: 61 74 68 2e 24 6e 6f 64 65 20 2d 74 65 78 74 5d  ath.$node -text]
a620: 20 5c 0a 20 20 20 20 20 20 20 20 2d 66 69 6c 6c   \.        -fill
a630: 20 20 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f     [Widget::geto
a640: 70 74 69 6f 6e 20 24 70 61 74 68 2e 24 6e 6f 64  ption $path.$nod
a650: 65 20 2d 66 69 6c 6c 5d 20 5c 0a 20 20 20 20 20  e -fill] \.     
a660: 20 20 20 2d 66 6f 6e 74 20 20 20 5b 57 69 64 67     -font   [Widg
a670: 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70  et::getoption $p
a680: 61 74 68 2e 24 6e 6f 64 65 20 2d 66 6f 6e 74 5d  ath.$node -font]
a690: 20 5c 0a 20 20 20 20 20 20 20 20 2d 61 6e 63 68   \.        -anch
a6a0: 6f 72 20 77 20 5c 0a 20 20 20 20 09 2d 74 61 67  or w \.    .-tag
a6b0: 73 20 20 20 5b 54 72 65 65 3a 3a 5f 67 65 74 5f  s   [Tree::_get_
a6c0: 6e 6f 64 65 5f 74 61 67 73 20 24 70 61 74 68 20  node_tags $path 
a6d0: 24 6e 6f 64 65 20 5b 6c 69 73 74 20 6e 6f 64 65  $node [list node
a6e0: 20 6e 3a 24 6e 6f 64 65 5d 5d 0a 20 20 20 20 73   n:$node]].    s
a6f0: 65 74 20 6c 65 6e 20 5b 65 78 70 72 20 7b 5b 6c  et len [expr {[l
a700: 6c 65 6e 67 74 68 20 24 64 61 74 61 28 24 6e 6f  length $data($no
a710: 64 65 29 5d 20 3e 20 31 7d 5d 0a 20 20 20 20 73  de)] > 1}].    s
a720: 65 74 20 64 63 20 20 5b 57 69 64 67 65 74 3a 3a  et dc  [Widget::
a730: 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 2e  getoption $path.
a740: 24 6e 6f 64 65 20 2d 64 72 61 77 63 72 6f 73 73  $node -drawcross
a750: 5d 0a 20 20 20 20 73 65 74 20 65 78 70 20 5b 57  ].    set exp [W
a760: 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e  idget::getoption
a770: 20 24 70 61 74 68 2e 24 6e 6f 64 65 20 2d 6f 70   $path.$node -op
a780: 65 6e 5d 0a 0a 20 20 20 20 69 66 20 7b 20 24 6c  en]..    if { $l
a790: 65 6e 20 26 26 20 24 65 78 70 20 7d 20 7b 0a 20  en && $exp } {. 
a7a0: 20 20 20 20 20 20 20 73 65 74 20 79 31 20 5b 5f         set y1 [_
a7b0: 64 72 61 77 5f 73 75 62 6e 6f 64 65 73 20 24 70  draw_subnodes $p
a7c0: 61 74 68 20 5b 6c 72 61 6e 67 65 20 24 64 61 74  ath [lrange $dat
a7d0: 61 28 24 6e 6f 64 65 29 20 31 20 65 6e 64 5d 20  a($node) 1 end] 
a7e0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
a7f0: 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 78 30        [expr {$x0
a800: 2b 24 64 65 6c 74 61 78 7d 5d 20 24 79 30 20 24  +$deltax}] $y0 $
a810: 64 65 6c 74 61 78 20 24 64 65 6c 74 61 79 20 24  deltax $deltay $
a820: 70 61 64 78 20 24 73 68 6f 77 6c 69 6e 65 73 5d  padx $showlines]
a830: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b  .    }..    if {
a840: 21 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24  ![string equal $
a850: 64 63 20 22 6e 65 76 65 72 22 5d 0a 09 26 26 20  dc "never"]..&& 
a860: 28 24 6c 65 6e 20 7c 7c 20 5b 73 74 72 69 6e 67  ($len || [string
a870: 20 65 71 75 61 6c 20 24 64 63 20 22 61 6c 77 61   equal $dc "alwa
a880: 79 73 22 5d 20 7c 7c 20 5b 73 74 72 69 6e 67 20  ys"] || [string 
a890: 65 71 75 61 6c 20 24 64 63 20 22 61 6c 6c 77 61  equal $dc "allwa
a8a0: 79 73 22 5d 29 7d 20 7b 0a 20 20 20 20 20 20 20  ys"])} {.       
a8b0: 20 5f 64 72 61 77 5f 63 72 6f 73 73 20 24 70 61   _draw_cross $pa
a8c0: 74 68 20 24 6e 6f 64 65 20 24 65 78 70 20 24 78  th $node $exp $x
a8d0: 30 20 24 79 30 0a 20 20 20 20 7d 0a 0a 20 20 20  0 $y0.    }..   
a8e0: 20 69 66 20 7b 20 5b 73 65 74 20 77 69 6e 20 5b   if { [set win [
a8f0: 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f  Widget::getoptio
a900: 6e 20 24 70 61 74 68 2e 24 6e 6f 64 65 20 2d 77  n $path.$node -w
a910: 69 6e 64 6f 77 5d 5d 20 21 3d 20 22 22 20 7d 20  indow]] != "" } 
a920: 7b 0a 09 73 65 74 20 61 20 5b 57 69 64 67 65 74  {..set a [Widget
a930: 3a 3a 63 67 65 74 20 24 70 61 74 68 2e 24 6e 6f  ::cget $path.$no
a940: 64 65 20 2d 61 6e 63 68 6f 72 5d 0a 20 20 20 20  de -anchor].    
a950: 20 20 20 20 24 70 61 74 68 2e 63 20 63 72 65 61      $path.c crea
a960: 74 65 20 77 69 6e 64 6f 77 20 24 78 31 20 24 79  te window $x1 $y
a970: 30 20 2d 77 69 6e 64 6f 77 20 24 77 69 6e 20 2d  0 -window $win -
a980: 61 6e 63 68 6f 72 20 24 61 20 5c 0a 09 09 2d 74  anchor $a \...-t
a990: 61 67 73 20 5b 54 72 65 65 3a 3a 5f 67 65 74 5f  ags [Tree::_get_
a9a0: 6e 6f 64 65 5f 74 61 67 73 20 24 70 61 74 68 20  node_tags $path 
a9b0: 24 6e 6f 64 65 20 5b 6c 69 73 74 20 77 69 6e 20  $node [list win 
a9c0: 69 3a 24 6e 6f 64 65 5d 5d 0a 20 20 20 20 7d 20  i:$node]].    } 
a9d0: 65 6c 73 65 69 66 20 7b 20 5b 73 65 74 20 69 6d  elseif { [set im
a9e0: 67 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70  g [Widget::getop
a9f0: 74 69 6f 6e 20 24 70 61 74 68 2e 24 6e 6f 64 65  tion $path.$node
aa00: 20 2d 69 6d 61 67 65 5d 5d 20 21 3d 20 22 22 20   -image]] != "" 
aa10: 7d 20 7b 0a 09 73 65 74 20 61 20 5b 57 69 64 67  } {..set a [Widg
aa20: 65 74 3a 3a 63 67 65 74 20 24 70 61 74 68 2e 24  et::cget $path.$
aa30: 6e 6f 64 65 20 2d 61 6e 63 68 6f 72 5d 0a 20 20  node -anchor].  
aa40: 20 20 20 20 20 20 24 70 61 74 68 2e 63 20 63 72        $path.c cr
aa50: 65 61 74 65 20 69 6d 61 67 65 20 24 78 31 20 24  eate image $x1 $
aa60: 79 30 20 2d 69 6d 61 67 65 20 24 69 6d 67 20 2d  y0 -image $img -
aa70: 61 6e 63 68 6f 72 20 24 61 20 5c 0a 09 09 2d 74  anchor $a \...-t
aa80: 61 67 73 20 20 20 5b 54 72 65 65 3a 3a 5f 67 65  ags   [Tree::_ge
aa90: 74 5f 6e 6f 64 65 5f 74 61 67 73 20 24 70 61 74  t_node_tags $pat
aaa0: 68 20 24 6e 6f 64 65 20 5b 6c 69 73 74 20 69 6d  h $node [list im
aab0: 67 20 69 3a 24 6e 6f 64 65 5d 5d 0a 20 20 20 20  g i:$node]].    
aac0: 7d 0a 20 20 20 20 73 65 74 20 62 6f 78 20 5b 24  }.    set box [$
aad0: 70 61 74 68 2e 63 20 62 62 6f 78 20 6e 3a 24 6e  path.c bbox n:$n
aae0: 6f 64 65 20 69 3a 24 6e 6f 64 65 5d 0a 20 20 20  ode i:$node].   
aaf0: 20 73 65 74 20 69 64 20 5b 24 70 61 74 68 2e 63   set id [$path.c
ab00: 20 63 72 65 61 74 65 20 72 65 63 74 20 30 20 5b   create rect 0 [
ab10: 6c 69 6e 64 65 78 20 24 62 6f 78 20 31 5d 20 5c  lindex $box 1] \
ab20: 0a 09 09 5b 77 69 6e 66 6f 20 73 63 72 65 65 6e  ...[winfo screen
ab30: 77 69 64 74 68 20 24 70 61 74 68 5d 20 5b 6c 69  width $path] [li
ab40: 6e 64 65 78 20 24 62 6f 78 20 33 5d 20 5c 0a 09  ndex $box 3] \..
ab50: 09 2d 74 61 67 73 20 5b 54 72 65 65 3a 3a 5f 67  .-tags [Tree::_g
ab60: 65 74 5f 6e 6f 64 65 5f 74 61 67 73 20 24 70 61  et_node_tags $pa
ab70: 74 68 20 24 6e 6f 64 65 20 5b 6c 69 73 74 20 62  th $node [list b
ab80: 6f 78 20 62 3a 24 6e 6f 64 65 5d 5d 20 5c 0a 09  ox b:$node]] \..
ab90: 09 2d 66 69 6c 6c 20 7b 7d 20 2d 6f 75 74 6c 69  .-fill {} -outli
aba0: 6e 65 20 7b 7d 5d 0a 20 20 20 20 24 70 61 74 68  ne {}].    $path
abb0: 2e 63 20 6c 6f 77 65 72 20 24 69 64 0a 0a 20 20  .c lower $id..  
abc0: 20 20 5f 73 65 74 5f 68 65 6c 70 20 24 70 61 74    _set_help $pat
abd0: 68 20 24 6e 6f 64 65 0a 0a 20 20 20 20 72 65 74  h $node..    ret
abe0: 75 72 6e 20 24 79 31 0a 7d 0a 0a 0a 23 20 2d 2d  urn $y1.}...# --
abf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f  ----------.#  Co
ac40: 6d 6d 61 6e 64 20 54 72 65 65 3a 3a 5f 64 72 61  mmand Tree::_dra
ac50: 77 5f 73 75 62 6e 6f 64 65 73 0a 23 20 2d 2d 2d  w_subnodes.# ---
ac60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ac90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 54  ---------.proc T
acb0: 72 65 65 3a 3a 5f 64 72 61 77 5f 73 75 62 6e 6f  ree::_draw_subno
acc0: 64 65 73 20 7b 20 70 61 74 68 20 6e 6f 64 65 73  des { path nodes
acd0: 20 78 30 20 79 30 20 64 65 6c 74 61 78 20 64 65   x0 y0 deltax de
ace0: 6c 74 61 79 20 70 61 64 78 20 73 68 6f 77 6c 69  ltay padx showli
acf0: 6e 65 73 20 7d 20 7b 0a 20 20 20 20 73 65 74 20  nes } {.    set 
ad00: 79 31 20 24 79 30 0a 20 20 20 20 66 6f 72 65 61  y1 $y0.    forea
ad10: 63 68 20 6e 6f 64 65 20 24 6e 6f 64 65 73 20 7b  ch node $nodes {
ad20: 0a 09 73 65 74 20 70 61 64 78 20 20 20 5b 5f 67  ..set padx   [_g
ad30: 65 74 5f 6e 6f 64 65 5f 70 61 64 78 20 24 70 61  et_node_padx $pa
ad40: 74 68 20 24 6e 6f 64 65 5d 0a 09 73 65 74 20 64  th $node]..set d
ad50: 65 6c 74 61 78 20 5b 5f 67 65 74 5f 6e 6f 64 65  eltax [_get_node
ad60: 5f 64 65 6c 74 61 78 20 24 70 61 74 68 20 24 6e  _deltax $path $n
ad70: 6f 64 65 5d 0a 20 20 20 20 20 20 20 20 73 65 74  ode].        set
ad80: 20 79 70 20 24 79 31 0a 20 20 20 20 20 20 20 20   yp $y1.        
ad90: 73 65 74 20 79 31 20 5b 5f 64 72 61 77 5f 6e 6f  set y1 [_draw_no
ada0: 64 65 20 24 70 61 74 68 20 24 6e 6f 64 65 20 24  de $path $node $
adb0: 78 30 20 5b 65 78 70 72 20 7b 24 79 31 2b 24 64  x0 [expr {$y1+$d
adc0: 65 6c 74 61 79 7d 5d 20 24 64 65 6c 74 61 78 20  eltay}] $deltax 
add0: 24 64 65 6c 74 61 79 20 24 70 61 64 78 20 24 73  $deltay $padx $s
ade0: 68 6f 77 6c 69 6e 65 73 5d 0a 20 20 20 20 7d 0a  howlines].    }.
adf0: 20 20 20 20 23 20 4f 6e 6c 79 20 64 72 61 77 20      # Only draw 
ae00: 61 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 69 6e  a line to the in
ae10: 76 69 73 69 62 6c 65 20 72 6f 6f 74 20 6e 6f 64  visible root nod
ae20: 65 20 61 62 6f 76 65 20 74 68 65 20 74 72 65 65  e above the tree
ae30: 20 77 69 64 67 65 74 20 77 68 65 6e 0a 20 20 20   widget when.   
ae40: 20 23 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c   # there are mul
ae50: 74 69 70 6c 65 20 74 6f 70 20 6e 6f 64 65 73 2e  tiple top nodes.
ae60: 0a 20 20 20 20 73 65 74 20 6c 65 6e 20 5b 6c 6c  .    set len [ll
ae70: 65 6e 67 74 68 20 24 6e 6f 64 65 73 5d 0a 20 20  ength $nodes].  
ae80: 20 20 69 66 20 7b 20 24 73 68 6f 77 6c 69 6e 65    if { $showline
ae90: 73 20 26 26 20 24 6c 65 6e 20 26 26 20 21 28 24  s && $len && !($
aea0: 79 30 20 3c 20 30 20 26 26 20 24 6c 65 6e 20 3c  y0 < 0 && $len <
aeb0: 20 32 29 20 7d 20 7b 0a 20 20 20 20 20 20 20 20   2) } {.        
aec0: 73 65 74 20 69 64 20 5b 24 70 61 74 68 2e 63 20  set id [$path.c 
aed0: 63 72 65 61 74 65 20 6c 69 6e 65 20 24 78 30 20  create line $x0 
aee0: 24 79 30 20 24 78 30 20 5b 65 78 70 72 20 7b 24  $y0 $x0 [expr {$
aef0: 79 70 2b 24 64 65 6c 74 61 79 7d 5d 20 5c 0a 20  yp+$deltay}] \. 
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 2d 66 69 6c 6c 20 20 20 20 5b 57 69 64     -fill    [Wid
af20: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
af30: 70 61 74 68 20 2d 6c 69 6e 65 73 66 69 6c 6c 5d  path -linesfill]
af40: 20 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20     \.           
af50: 20 20 20 20 20 20 20 20 20 2d 73 74 69 70 70 6c           -stippl
af60: 65 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70  e [Widget::getop
af70: 74 69 6f 6e 20 24 70 61 74 68 20 2d 6c 69 6e 65  tion $path -line
af80: 73 74 69 70 70 6c 65 5d 20 5c 0a 20 20 20 20 20  stipple] \.     
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
afa0: 74 61 67 73 20 20 20 20 6c 69 6e 65 5d 0a 0a 20  tags    line].. 
afb0: 20 20 20 20 20 20 20 24 70 61 74 68 2e 63 20 6c         $path.c l
afc0: 6f 77 65 72 20 24 69 64 0a 20 20 20 20 7d 0a 20  ower $id.    }. 
afd0: 20 20 20 72 65 74 75 72 6e 20 24 79 31 0a 7d 0a     return $y1.}.
afe0: 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..# ------------
aff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b030: 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65  .#  Command Tree
b040: 3a 3a 5f 75 70 64 61 74 65 5f 6e 6f 64 65 73 0a  ::_update_nodes.
b050: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
b060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70  --------------.p
b0a0: 72 6f 63 20 54 72 65 65 3a 3a 5f 75 70 64 61 74  roc Tree::_updat
b0b0: 65 5f 6e 6f 64 65 73 20 7b 20 70 61 74 68 20 7d  e_nodes { path }
b0c0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
b0d0: 24 70 61 74 68 0a 20 20 20 20 75 70 76 61 72 20  $path.    upvar 
b0e0: 30 20 20 24 70 61 74 68 20 64 61 74 61 0a 0a 20  0  $path data.. 
b0f0: 20 20 20 66 6f 72 65 61 63 68 20 7b 6e 6f 64 65     foreach {node
b100: 20 66 6c 61 67 7d 20 24 64 61 74 61 28 75 70 64   flag} $data(upd
b110: 2c 6e 6f 64 65 73 29 20 7b 0a 09 73 65 74 20 69  ,nodes) {..set i
b120: 64 6e 20 5b 24 70 61 74 68 2e 63 20 66 69 6e 64  dn [$path.c find
b130: 20 77 69 74 68 74 61 67 20 22 6e 3a 24 6e 6f 64   withtag "n:$nod
b140: 65 22 5d 0a 09 69 66 20 7b 20 24 69 64 6e 20 3d  e"]..if { $idn =
b150: 3d 20 22 22 20 7d 20 7b 0a 09 20 20 20 20 63 6f  = "" } {..    co
b160: 6e 74 69 6e 75 65 0a 09 7d 0a 09 73 65 74 20 70  ntinue..}..set p
b170: 61 64 78 20 20 20 5b 5f 67 65 74 5f 6e 6f 64 65  adx   [_get_node
b180: 5f 70 61 64 78 20 24 70 61 74 68 20 24 6e 6f 64  _padx $path $nod
b190: 65 5d 0a 09 73 65 74 20 64 65 6c 74 61 78 20 5b  e]..set deltax [
b1a0: 5f 67 65 74 5f 6e 6f 64 65 5f 64 65 6c 74 61 78  _get_node_deltax
b1b0: 20 24 70 61 74 68 20 24 6e 6f 64 65 5d 0a 09 73   $path $node]..s
b1c0: 65 74 20 63 20 20 5b 24 70 61 74 68 2e 63 20 63  et c  [$path.c c
b1d0: 6f 6f 72 64 73 20 24 69 64 6e 5d 0a 09 73 65 74  oords $idn]..set
b1e0: 20 78 31 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64   x1 [expr {[lind
b1f0: 65 78 20 24 63 20 30 5d 2d 24 70 61 64 78 7d 5d  ex $c 0]-$padx}]
b200: 0a 09 73 65 74 20 78 30 20 5b 65 78 70 72 20 7b  ..set x0 [expr {
b210: 24 78 31 2d 24 64 65 6c 74 61 78 2d 35 7d 5d 0a  $x1-$deltax-5}].
b220: 09 73 65 74 20 79 30 20 5b 6c 69 6e 64 65 78 20  .set y0 [lindex 
b230: 24 63 20 31 5d 0a 09 69 66 20 7b 20 24 66 6c 61  $c 1]..if { $fla
b240: 67 20 26 20 34 38 20 7d 20 7b 0a 09 20 20 20 20  g & 48 } {..    
b250: 23 20 2d 77 69 6e 64 6f 77 20 6f 72 20 2d 69 6d  # -window or -im
b260: 61 67 65 20 6d 6f 64 69 66 69 65 64 0a 09 20 20  age modified..  
b270: 20 20 73 65 74 20 77 69 6e 20 20 5b 57 69 64 67    set win  [Widg
b280: 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70  et::getoption $p
b290: 61 74 68 2e 24 6e 6f 64 65 20 2d 77 69 6e 64 6f  ath.$node -windo
b2a0: 77 5d 0a 09 20 20 20 20 73 65 74 20 69 6d 67 20  w]..    set img 
b2b0: 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74   [Widget::getopt
b2c0: 69 6f 6e 20 24 70 61 74 68 2e 24 6e 6f 64 65 20  ion $path.$node 
b2d0: 2d 69 6d 61 67 65 5d 0a 09 20 20 20 20 73 65 74  -image]..    set
b2e0: 20 61 6e 63 20 20 5b 57 69 64 67 65 74 3a 3a 63   anc  [Widget::c
b2f0: 67 65 74 20 24 70 61 74 68 2e 24 6e 6f 64 65 20  get $path.$node 
b300: 2d 61 6e 63 68 6f 72 5d 0a 09 20 20 20 20 73 65  -anchor]..    se
b310: 74 20 69 64 69 20 20 5b 24 70 61 74 68 2e 63 20  t idi  [$path.c 
b320: 66 69 6e 64 20 77 69 74 68 74 61 67 20 69 3a 24  find withtag i:$
b330: 6e 6f 64 65 5d 0a 09 20 20 20 20 73 65 74 20 74  node]..    set t
b340: 79 70 65 20 5b 6c 69 6e 64 65 78 20 5b 24 70 61  ype [lindex [$pa
b350: 74 68 2e 63 20 67 65 74 74 61 67 73 20 24 69 64  th.c gettags $id
b360: 69 5d 20 31 5d 0a 09 20 20 20 20 69 66 20 7b 20  i] 1]..    if { 
b370: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
b380: 77 69 6e 5d 20 7d 20 7b 0a 09 09 69 66 20 7b 20  win] } {...if { 
b390: 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24 74  [string equal $t
b3a0: 79 70 65 20 22 77 69 6e 22 5d 20 7d 20 7b 0a 09  ype "win"] } {..
b3b0: 09 20 20 20 20 24 70 61 74 68 2e 63 20 69 74 65  .    $path.c ite
b3c0: 6d 63 6f 6e 66 69 67 75 72 65 20 24 69 64 69 20  mconfigure $idi 
b3d0: 2d 77 69 6e 64 6f 77 20 24 77 69 6e 0a 09 09 7d  -window $win...}
b3e0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 24 70   else {...    $p
b3f0: 61 74 68 2e 63 20 64 65 6c 65 74 65 20 24 69 64  ath.c delete $id
b400: 69 0a 09 09 20 20 20 20 24 70 61 74 68 2e 63 20  i...    $path.c 
b410: 63 72 65 61 74 65 20 77 69 6e 64 6f 77 20 24 78  create window $x
b420: 31 20 24 79 30 20 2d 77 69 6e 64 6f 77 20 24 77  1 $y0 -window $w
b430: 69 6e 20 2d 61 6e 63 68 6f 72 20 24 61 6e 63 20  in -anchor $anc 
b440: 5c 0a 09 09 09 2d 74 61 67 73 20 5b 5f 67 65 74  \....-tags [_get
b450: 5f 6e 6f 64 65 5f 74 61 67 73 20 24 70 61 74 68  _node_tags $path
b460: 20 24 6e 6f 64 65 20 5b 6c 69 73 74 20 77 69 6e   $node [list win
b470: 20 69 3a 24 6e 6f 64 65 5d 5d 0a 09 09 7d 0a 09   i:$node]]...}..
b480: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 5b      } elseif { [
b490: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69  string length $i
b4a0: 6d 67 5d 20 7d 20 7b 0a 09 09 69 66 20 7b 20 5b  mg] } {...if { [
b4b0: 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24 74 79  string equal $ty
b4c0: 70 65 20 22 69 6d 67 22 5d 20 7d 20 7b 0a 09 09  pe "img"] } {...
b4d0: 20 20 20 20 24 70 61 74 68 2e 63 20 69 74 65 6d      $path.c item
b4e0: 63 6f 6e 66 69 67 75 72 65 20 24 69 64 69 20 2d  configure $idi -
b4f0: 69 6d 61 67 65 20 24 69 6d 67 0a 09 09 7d 20 65  image $img...} e
b500: 6c 73 65 20 7b 0a 09 09 20 20 20 20 24 70 61 74  lse {...    $pat
b510: 68 2e 63 20 64 65 6c 65 74 65 20 24 69 64 69 0a  h.c delete $idi.
b520: 09 09 20 20 20 20 24 70 61 74 68 2e 63 20 63 72  ..    $path.c cr
b530: 65 61 74 65 20 69 6d 61 67 65 20 24 78 31 20 24  eate image $x1 $
b540: 79 30 20 2d 69 6d 61 67 65 20 24 69 6d 67 20 2d  y0 -image $img -
b550: 61 6e 63 68 6f 72 20 24 61 6e 63 20 5c 0a 09 09  anchor $anc \...
b560: 09 2d 74 61 67 73 20 5b 5f 67 65 74 5f 6e 6f 64  .-tags [_get_nod
b570: 65 5f 74 61 67 73 20 24 70 61 74 68 20 24 6e 6f  e_tags $path $no
b580: 64 65 20 5b 6c 69 73 74 20 69 6d 67 20 69 3a 24  de [list img i:$
b590: 6e 6f 64 65 5d 5d 0a 09 09 7d 0a 09 20 20 20 20  node]]...}..    
b5a0: 7d 20 65 6c 73 65 20 7b 0a 09 09 24 70 61 74 68  } else {...$path
b5b0: 2e 63 20 64 65 6c 65 74 65 20 24 69 64 69 0a 09  .c delete $idi..
b5c0: 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 20      }..}...if { 
b5d0: 24 66 6c 61 67 20 26 20 38 20 7d 20 7b 0a 09 20  $flag & 8 } {.. 
b5e0: 20 20 20 23 20 2d 64 72 61 77 63 72 6f 73 73 20     # -drawcross 
b5f0: 6d 6f 64 69 66 69 65 64 0a 09 20 20 20 20 73 65  modified..    se
b600: 74 20 6c 65 6e 20 5b 65 78 70 72 20 7b 5b 6c 6c  t len [expr {[ll
b610: 65 6e 67 74 68 20 24 64 61 74 61 28 24 6e 6f 64  ength $data($nod
b620: 65 29 5d 20 3e 20 31 7d 5d 0a 09 20 20 20 20 73  e)] > 1}]..    s
b630: 65 74 20 64 63 20 20 5b 57 69 64 67 65 74 3a 3a  et dc  [Widget::
b640: 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 2e  getoption $path.
b650: 24 6e 6f 64 65 20 2d 64 72 61 77 63 72 6f 73 73  $node -drawcross
b660: 5d 0a 09 20 20 20 20 73 65 74 20 65 78 70 20 5b  ]..    set exp [
b670: 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f  Widget::getoptio
b680: 6e 20 24 70 61 74 68 2e 24 6e 6f 64 65 20 2d 6f  n $path.$node -o
b690: 70 65 6e 5d 0a 0a 09 20 20 20 20 69 66 20 7b 21  pen]...    if {!
b6a0: 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24 64  [string equal $d
b6b0: 63 20 22 6e 65 76 65 72 22 5d 0a 09 09 26 26 20  c "never"]...&& 
b6c0: 28 24 6c 65 6e 20 7c 7c 20 5b 73 74 72 69 6e 67  ($len || [string
b6d0: 20 65 71 75 61 6c 20 24 64 63 20 22 61 6c 77 61   equal $dc "alwa
b6e0: 79 73 22 5d 20 7c 7c 20 5b 73 74 72 69 6e 67 20  ys"] || [string 
b6f0: 65 71 75 61 6c 20 24 64 63 20 22 61 6c 6c 77 61  equal $dc "allwa
b700: 79 73 22 5d 29 7d 20 7b 0a 09 09 5f 64 72 61 77  ys"])} {..._draw
b710: 5f 63 72 6f 73 73 20 24 70 61 74 68 20 24 6e 6f  _cross $path $no
b720: 64 65 20 24 65 78 70 20 24 78 30 20 24 79 30 0a  de $exp $x0 $y0.
b730: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
b740: 73 65 74 20 69 64 63 20 5b 24 70 61 74 68 2e 63  set idc [$path.c
b750: 20 66 69 6e 64 20 77 69 74 68 74 61 67 20 63 3a   find withtag c:
b760: 24 6e 6f 64 65 5d 0a 09 09 24 70 61 74 68 2e 63  $node]...$path.c
b770: 20 64 65 6c 65 74 65 20 24 69 64 63 0a 09 20 20   delete $idc..  
b780: 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 20 24 66    }..}...if { $f
b790: 6c 61 67 20 26 20 37 20 7d 20 7b 0a 09 20 20 20  lag & 7 } {..   
b7a0: 20 23 20 2d 66 6f 6e 74 2c 20 2d 74 65 78 74 20   # -font, -text 
b7b0: 6f 72 20 2d 66 69 6c 6c 20 6d 6f 64 69 66 69 65  or -fill modifie
b7c0: 64 0a 09 20 20 20 20 24 70 61 74 68 2e 63 20 69  d..    $path.c i
b7d0: 74 65 6d 63 6f 6e 66 69 67 75 72 65 20 24 69 64  temconfigure $id
b7e0: 6e 20 5c 0a 09 09 2d 74 65 78 74 20 5b 57 69 64  n \...-text [Wid
b7f0: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
b800: 70 61 74 68 2e 24 6e 6f 64 65 20 2d 74 65 78 74  path.$node -text
b810: 5d 20 5c 0a 09 09 2d 66 69 6c 6c 20 5b 57 69 64  ] \...-fill [Wid
b820: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
b830: 70 61 74 68 2e 24 6e 6f 64 65 20 2d 66 69 6c 6c  path.$node -fill
b840: 5d 20 5c 0a 09 09 2d 66 6f 6e 74 20 5b 57 69 64  ] \...-font [Wid
b850: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
b860: 70 61 74 68 2e 24 6e 6f 64 65 20 2d 66 6f 6e 74  path.$node -font
b870: 5d 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 23  ]..}.    }.}...#
b880: 20 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
b8d0: 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a 3a 5f   Command Tree::_
b8e0: 64 72 61 77 5f 74 72 65 65 0a 23 20 2d 2d 2d 2d  draw_tree.# ----
b8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b930: 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72  --------.proc Tr
b940: 65 65 3a 3a 5f 64 72 61 77 5f 74 72 65 65 20 7b  ee::_draw_tree {
b950: 20 70 61 74 68 20 7d 20 7b 0a 20 20 20 20 76 61   path } {.    va
b960: 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20 20 20  riable $path.   
b970: 20 75 70 76 61 72 20 30 20 20 24 70 61 74 68 20   upvar 0  $path 
b980: 64 61 74 61 0a 0a 20 20 20 20 24 70 61 74 68 2e  data..    $path.
b990: 63 20 64 65 6c 65 74 65 20 61 6c 6c 0a 20 20 20  c delete all.   
b9a0: 20 73 65 74 20 63 75 72 73 6f 72 20 5b 24 70 61   set cursor [$pa
b9b0: 74 68 2e 63 20 63 67 65 74 20 2d 63 75 72 73 6f  th.c cget -curso
b9c0: 72 5d 0a 20 20 20 20 24 70 61 74 68 2e 63 20 63  r].    $path.c c
b9d0: 6f 6e 66 69 67 75 72 65 20 2d 63 75 72 73 6f 72  onfigure -cursor
b9e0: 20 77 61 74 63 68 0a 20 20 20 20 5f 64 72 61 77   watch.    _draw
b9f0: 5f 73 75 62 6e 6f 64 65 73 20 24 70 61 74 68 20  _subnodes $path 
ba00: 5b 6c 72 61 6e 67 65 20 24 64 61 74 61 28 72 6f  [lrange $data(ro
ba10: 6f 74 29 20 31 20 65 6e 64 5d 20 38 20 5c 0a 20  ot) 1 end] 8 \. 
ba20: 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 2d 5b         [expr {-[
ba30: 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f  Widget::getoptio
ba40: 6e 20 24 70 61 74 68 20 2d 64 65 6c 74 61 79 5d  n $path -deltay]
ba50: 2f 32 7d 5d 20 5c 0a 20 20 20 20 20 20 20 20 5b  /2}] \.        [
ba60: 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f  Widget::getoptio
ba70: 6e 20 24 70 61 74 68 20 2d 64 65 6c 74 61 78 5d  n $path -deltax]
ba80: 20 5c 0a 20 20 20 20 20 20 20 20 5b 57 69 64 67   \.        [Widg
ba90: 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70  et::getoption $p
baa0: 61 74 68 20 2d 64 65 6c 74 61 79 5d 20 5c 0a 20  ath -deltay] \. 
bab0: 20 20 20 20 20 20 20 5b 57 69 64 67 65 74 3a 3a         [Widget::
bac0: 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 20  getoption $path 
bad0: 2d 70 61 64 78 5d 20 20 20 5c 0a 20 20 20 20 20  -padx]   \.     
bae0: 20 20 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f     [Widget::geto
baf0: 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 73 68 6f  ption $path -sho
bb00: 77 6c 69 6e 65 73 5d 0a 20 20 20 20 24 70 61 74  wlines].    $pat
bb10: 68 2e 63 20 63 6f 6e 66 69 67 75 72 65 20 2d 63  h.c configure -c
bb20: 75 72 73 6f 72 20 24 63 75 72 73 6f 72 0a 7d 0a  ursor $cursor.}.
bb30: 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..# ------------
bb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb80: 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65  .#  Command Tree
bb90: 3a 3a 5f 72 65 64 72 61 77 5f 74 72 65 65 0a 23  ::_redraw_tree.#
bba0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
bbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72  -------------.pr
bbf0: 6f 63 20 54 72 65 65 3a 3a 5f 72 65 64 72 61 77  oc Tree::_redraw
bc00: 5f 74 72 65 65 20 7b 20 70 61 74 68 20 7d 20 7b  _tree { path } {
bc10: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 24 70  .    variable $p
bc20: 61 74 68 0a 20 20 20 20 75 70 76 61 72 20 30 20  ath.    upvar 0 
bc30: 20 24 70 61 74 68 20 64 61 74 61 0a 0a 20 20 20   $path data..   
bc40: 20 69 66 20 7b 20 5b 57 69 64 67 65 74 3a 3a 67   if { [Widget::g
bc50: 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 20 2d  etoption $path -
bc60: 72 65 64 72 61 77 5d 20 7d 20 7b 0a 20 20 20 20  redraw] } {.    
bc70: 20 20 20 20 69 66 20 7b 20 24 64 61 74 61 28 75      if { $data(u
bc80: 70 64 2c 6c 65 76 65 6c 29 20 3d 3d 20 32 20 7d  pd,level) == 2 }
bc90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f   {.            _
bca0: 75 70 64 61 74 65 5f 6e 6f 64 65 73 20 24 70 61  update_nodes $pa
bcb0: 74 68 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  th.        } els
bcc0: 65 69 66 20 7b 20 24 64 61 74 61 28 75 70 64 2c  eif { $data(upd,
bcd0: 6c 65 76 65 6c 29 20 3d 3d 20 33 20 7d 20 7b 0a  level) == 3 } {.
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 5f 64 72 61              _dra
bcf0: 77 5f 74 72 65 65 20 24 70 61 74 68 0a 20 20 20  w_tree $path.   
bd00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 5f       }.        _
bd10: 72 65 64 72 61 77 5f 73 65 6c 65 63 74 69 6f 6e  redraw_selection
bd20: 20 24 70 61 74 68 0a 20 20 20 20 20 20 20 20 5f   $path.        _
bd30: 75 70 64 61 74 65 5f 73 63 72 6f 6c 6c 72 65 67  update_scrollreg
bd40: 69 6f 6e 20 24 70 61 74 68 0a 20 20 20 20 20 20  ion $path.      
bd50: 20 20 73 65 74 20 64 61 74 61 28 75 70 64 2c 6e    set data(upd,n
bd60: 6f 64 65 73 29 20 20 20 7b 7d 0a 20 20 20 20 20  odes)   {}.     
bd70: 20 20 20 73 65 74 20 64 61 74 61 28 75 70 64 2c     set data(upd,
bd80: 6c 65 76 65 6c 29 20 20 20 30 0a 20 20 20 20 20  level)   0.     
bd90: 20 20 20 73 65 74 20 64 61 74 61 28 75 70 64 2c     set data(upd,
bda0: 61 66 74 65 72 69 64 29 20 22 22 0a 20 20 20 20  afterid) "".    
bdb0: 7d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d  }.}...# --------
bdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be00: 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20  ----.#  Command 
be10: 54 72 65 65 3a 3a 5f 72 65 64 72 61 77 5f 73 65  Tree::_redraw_se
be20: 6c 65 63 74 69 6f 6e 0a 23 20 2d 2d 2d 2d 2d 2d  lection.# ------
be30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be70: 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72 65 65  ------.proc Tree
be80: 3a 3a 5f 72 65 64 72 61 77 5f 73 65 6c 65 63 74  ::_redraw_select
be90: 69 6f 6e 20 7b 20 70 61 74 68 20 7d 20 7b 0a 20  ion { path } {. 
bea0: 20 20 20 76 61 72 69 61 62 6c 65 20 24 70 61 74     variable $pat
beb0: 68 0a 20 20 20 20 75 70 76 61 72 20 30 20 20 24  h.    upvar 0  $
bec0: 70 61 74 68 20 64 61 74 61 0a 0a 20 20 20 20 73  path data..    s
bed0: 65 74 20 73 65 6c 62 67 20 5b 57 69 64 67 65 74  et selbg [Widget
bee0: 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74  ::getoption $pat
bef0: 68 20 2d 73 65 6c 65 63 74 62 61 63 6b 67 72 6f  h -selectbackgro
bf00: 75 6e 64 5d 0a 20 20 20 20 73 65 74 20 73 65 6c  und].    set sel
bf10: 66 67 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f  fg [Widget::geto
bf20: 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 73 65 6c  ption $path -sel
bf30: 65 63 74 66 6f 72 65 67 72 6f 75 6e 64 5d 0a 20  ectforeground]. 
bf40: 20 20 20 73 65 74 20 66 69 6c 6c 20 20 5b 57 69     set fill  [Wi
bf50: 64 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20  dget::getoption 
bf60: 24 70 61 74 68 20 2d 73 65 6c 65 63 74 66 69 6c  $path -selectfil
bf70: 6c 5d 0a 20 20 20 20 69 66 20 7b 24 66 69 6c 6c  l].    if {$fill
bf80: 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  } {.        set 
bf90: 73 63 72 6f 6c 6c 20 5b 24 70 61 74 68 2e 63 20  scroll [$path.c 
bfa0: 63 67 65 74 20 2d 73 63 72 6f 6c 6c 72 65 67 69  cget -scrollregi
bfb0: 6f 6e 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  on].        if {
bfc0: 5b 6c 6c 65 6e 67 74 68 20 24 73 63 72 6f 6c 6c  [llength $scroll
bfd0: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ]} {.           
bfe0: 20 73 65 74 20 78 6d 61 78 20 5b 65 78 70 72 20   set xmax [expr 
bff0: 7b 5b 6c 69 6e 64 65 78 20 24 73 63 72 6f 6c 6c  {[lindex $scroll
c000: 20 32 5d 2d 31 7d 5d 0a 20 20 20 20 20 20 20 20   2]-1}].        
c010: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
c020: 20 20 20 20 20 73 65 74 20 78 6d 61 78 20 5b 77       set xmax [w
c030: 69 6e 66 6f 20 77 69 64 74 68 20 24 70 61 74 68  info width $path
c040: 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ].        }.    
c050: 7d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 69 64  }.    foreach id
c060: 20 5b 24 70 61 74 68 2e 63 20 66 69 6e 64 20 77   [$path.c find w
c070: 69 74 68 74 61 67 20 73 65 6c 5d 20 7b 0a 20 20  ithtag sel] {.  
c080: 20 20 20 20 20 20 73 65 74 20 6e 6f 64 65 20 5b        set node [
c090: 54 72 65 65 3a 3a 5f 67 65 74 5f 6e 6f 64 65 5f  Tree::_get_node_
c0a0: 6e 61 6d 65 20 24 70 61 74 68 20 24 69 64 20 31  name $path $id 1
c0b0: 5d 0a 20 20 20 20 20 20 20 20 24 70 61 74 68 2e  ].        $path.
c0c0: 63 20 69 74 65 6d 63 6f 6e 66 69 67 75 72 65 20  c itemconfigure 
c0d0: 22 6e 3a 24 6e 6f 64 65 22 20 2d 66 69 6c 6c 20  "n:$node" -fill 
c0e0: 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69  [Widget::getopti
c0f0: 6f 6e 20 24 70 61 74 68 2e 24 6e 6f 64 65 20 2d  on $path.$node -
c100: 66 69 6c 6c 5d 0a 20 20 20 20 7d 0a 20 20 20 20  fill].    }.    
c110: 24 70 61 74 68 2e 63 20 64 65 6c 65 74 65 20 73  $path.c delete s
c120: 65 6c 0a 20 20 20 20 66 6f 72 65 61 63 68 20 6e  el.    foreach n
c130: 6f 64 65 20 24 64 61 74 61 28 73 65 6c 6e 6f 64  ode $data(selnod
c140: 65 73 29 20 7b 0a 20 20 20 20 20 20 20 20 73 65  es) {.        se
c150: 74 20 62 62 6f 78 20 5b 24 70 61 74 68 2e 63 20  t bbox [$path.c 
c160: 62 62 6f 78 20 22 6e 3a 24 6e 6f 64 65 22 5d 0a  bbox "n:$node"].
c170: 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 6c 6c          if { [ll
c180: 65 6e 67 74 68 20 24 62 62 6f 78 5d 20 7d 20 7b  ength $bbox] } {
c190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
c1a0: 7b 24 66 69 6c 6c 7d 20 7b 0a 09 09 23 20 67 65  {$fill} {...# ge
c1b0: 74 20 74 68 65 20 69 6d 61 67 65 20 74 6f 20 28  t the image to (
c1c0: 69 66 20 61 6e 79 29 2c 20 61 73 20 69 74 20 6d  if any), as it m
c1d0: 61 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ay have differen
c1e0: 74 20 68 65 69 67 68 74 0a 09 09 73 65 74 20 62  t height...set b
c1f0: 62 6f 78 20 5b 24 70 61 74 68 2e 63 20 62 62 6f  box [$path.c bbo
c200: 78 20 22 6e 3a 24 6e 6f 64 65 22 20 22 69 3a 24  x "n:$node" "i:$
c210: 6e 6f 64 65 22 5d 0a 20 20 20 20 20 20 20 20 20  node"].         
c220: 20 20 20 20 20 20 20 73 65 74 20 62 62 6f 78 20         set bbox 
c230: 5b 6c 69 73 74 20 30 20 5b 6c 69 6e 64 65 78 20  [list 0 [lindex 
c240: 24 62 62 6f 78 20 31 5d 20 24 78 6d 61 78 20 5b  $bbox 1] $xmax [
c250: 6c 69 6e 64 65 78 20 24 62 62 6f 78 20 33 5d 5d  lindex $bbox 3]]
c260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
c270: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69             set i
c280: 64 20 5b 24 70 61 74 68 2e 63 20 63 72 65 61 74  d [$path.c creat
c290: 65 20 72 65 63 74 61 6e 67 6c 65 20 24 62 62 6f  e rectangle $bbo
c2a0: 78 20 2d 74 61 67 73 20 5b 6c 69 73 74 20 73 65  x -tags [list se
c2b0: 6c 20 73 3a 24 6e 6f 64 65 5d 20 5c 0a 09 09 09  l s:$node] \....
c2c0: 2d 66 69 6c 6c 20 24 73 65 6c 62 67 20 2d 6f 75  -fill $selbg -ou
c2d0: 74 6c 69 6e 65 20 24 73 65 6c 62 67 5d 0a 09 20  tline $selbg].. 
c2e0: 20 20 20 69 66 20 7b 24 73 65 6c 66 67 20 21 3d     if {$selfg !=
c2f0: 20 22 22 7d 20 7b 0a 09 09 23 20 44 6f 6e 27 74   ""} {...# Don't
c300: 20 61 6c 6c 6f 77 20 61 6e 20 65 6d 70 74 79 20   allow an empty 
c310: 66 69 6c 6c 20 2d 20 74 68 61 74 20 77 6f 75 6c  fill - that woul
c320: 64 20 62 65 20 74 72 61 6e 73 70 61 72 65 6e 74  d be transparent
c330: 0a 09 09 24 70 61 74 68 2e 63 20 69 74 65 6d 63  ...$path.c itemc
c340: 6f 6e 66 69 67 75 72 65 20 22 6e 3a 24 6e 6f 64  onfigure "n:$nod
c350: 65 22 20 2d 66 69 6c 6c 20 24 73 65 6c 66 67 0a  e" -fill $selfg.
c360: 09 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20  .    }.         
c370: 20 20 20 24 70 61 74 68 2e 63 20 6c 6f 77 65 72     $path.c lower
c380: 20 24 69 64 0a 20 20 20 20 20 20 20 20 7d 0a 20   $id.        }. 
c390: 20 20 20 7d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d     }.}...# -----
c3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3e0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61  -------.#  Comma
c3f0: 6e 64 20 54 72 65 65 3a 3a 5f 72 65 64 72 61 77  nd Tree::_redraw
c400: 5f 69 64 6c 65 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d  _idle.# --------
c410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c450: 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72 65 65 3a 3a  ----.proc Tree::
c460: 5f 72 65 64 72 61 77 5f 69 64 6c 65 20 7b 20 70  _redraw_idle { p
c470: 61 74 68 20 6c 65 76 65 6c 20 7d 20 7b 0a 20 20  ath level } {.  
c480: 20 20 76 61 72 69 61 62 6c 65 20 24 70 61 74 68    variable $path
c490: 0a 20 20 20 20 75 70 76 61 72 20 30 20 20 24 70  .    upvar 0  $p
c4a0: 61 74 68 20 64 61 74 61 0a 0a 20 20 20 20 69 66  ath data..    if
c4b0: 20 7b 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f   { [Widget::geto
c4c0: 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 72 65 64  ption $path -red
c4d0: 72 61 77 5d 20 26 26 20 24 64 61 74 61 28 75 70  raw] && $data(up
c4e0: 64 2c 61 66 74 65 72 69 64 29 20 3d 3d 20 22 22  d,afterid) == ""
c4f0: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74   } {.        set
c500: 20 64 61 74 61 28 75 70 64 2c 61 66 74 65 72 69   data(upd,afteri
c510: 64 29 20 5b 61 66 74 65 72 20 69 64 6c 65 20 5b  d) [after idle [
c520: 6c 69 73 74 20 54 72 65 65 3a 3a 5f 72 65 64 72  list Tree::_redr
c530: 61 77 5f 74 72 65 65 20 24 70 61 74 68 5d 5d 0a  aw_tree $path]].
c540: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 20 24      }.    if { $
c550: 6c 65 76 65 6c 20 3e 20 24 64 61 74 61 28 75 70  level > $data(up
c560: 64 2c 6c 65 76 65 6c 29 20 7d 20 7b 0a 20 20 20  d,level) } {.   
c570: 20 20 20 20 20 73 65 74 20 64 61 74 61 28 75 70       set data(up
c580: 64 2c 6c 65 76 65 6c 29 20 24 6c 65 76 65 6c 0a  d,level) $level.
c590: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
c5a0: 20 22 22 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d   "".}...# ------
c5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5f0: 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e  ------.#  Comman
c600: 64 20 54 72 65 65 3a 3a 5f 69 6e 69 74 5f 64 72  d Tree::_init_dr
c610: 61 67 5f 63 6d 64 0a 23 20 2d 2d 2d 2d 2d 2d 2d  ag_cmd.# -------
c620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c660: 2d 2d 2d 2d 2d 0a 70 72 6f 63 20 54 72 65 65 3a  -----.proc Tree:
c670: 3a 5f 69 6e 69 74 5f 64 72 61 67 5f 63 6d 64 20  :_init_drag_cmd 
c680: 7b 20 70 61 74 68 20 58 20 59 20 74 6f 70 20 7d  { path X Y top }
c690: 20 7b 0a 20 20 20 20 73 65 74 20 70 61 74 68 20   {.    set path 
c6a0: 5b 77 69 6e 66 6f 20 70 61 72 65 6e 74 20 24 70  [winfo parent $p
c6b0: 61 74 68 5d 0a 20 20 20 20 73 65 74 20 6c 74 61  ath].    set lta
c6c0: 67 73 20 5b 24 70 61 74 68 2e 63 20 67 65 74 74  gs [$path.c gett
c6d0: 61 67 73 20 63 75 72 72 65 6e 74 5d 0a 20 20 20  ags current].   
c6e0: 20 73 65 74 20 69 74 65 6d 20 20 5b 6c 69 6e 64   set item  [lind
c6f0: 65 78 20 24 6c 74 61 67 73 20 31 5d 0a 20 20 20  ex $ltags 1].   
c700: 20 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 65 71   if { [string eq
c710: 75 61 6c 20 24 69 74 65 6d 20 22 6e 6f 64 65 22  ual $item "node"
c720: 5d 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 5b 73  ] ||.         [s
c730: 74 72 69 6e 67 20 65 71 75 61 6c 20 24 69 74 65  tring equal $ite
c740: 6d 20 22 69 6d 67 22 5d 20 20 7c 7c 0a 20 20 20  m "img"]  ||.   
c750: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 65 71        [string eq
c760: 75 61 6c 20 24 69 74 65 6d 20 22 77 69 6e 22 5d  ual $item "win"]
c770: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74   } {.        set
c780: 20 6e 6f 64 65 20 5b 54 72 65 65 3a 3a 5f 67 65   node [Tree::_ge
c790: 74 5f 6e 6f 64 65 5f 6e 61 6d 65 20 24 70 61 74  t_node_name $pat
c7a0: 68 20 63 75 72 72 65 6e 74 20 32 5d 0a 20 20 20  h current 2].   
c7b0: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
c7c0: 68 20 5b 73 65 74 20 63 6d 64 20 5b 57 69 64 67  h [set cmd [Widg
c7d0: 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70  et::getoption $p
c7e0: 61 74 68 20 2d 64 72 61 67 69 6e 69 74 63 6d 64  ath -draginitcmd
c7f0: 5d 5d 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  ]]]} {.         
c800: 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65 76     return [uplev
c810: 65 6c 20 5c 23 30 20 24 63 6d 64 20 5b 6c 69 73  el \#0 $cmd [lis
c820: 74 20 24 70 61 74 68 20 24 6e 6f 64 65 20 24 74  t $path $node $t
c830: 6f 70 5d 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20  op]].        }. 
c840: 20 20 20 20 20 20 20 69 66 20 7b 20 5b 73 65 74         if { [set
c850: 20 74 79 70 65 20 5b 57 69 64 67 65 74 3a 3a 67   type [Widget::g
c860: 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 20 2d  etoption $path -
c870: 64 72 61 67 74 79 70 65 5d 5d 20 3d 3d 20 22 22  dragtype]] == ""
c880: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   } {.           
c890: 20 73 65 74 20 74 79 70 65 20 22 54 52 45 45 5f   set type "TREE_
c8a0: 4e 4f 44 45 22 0a 20 20 20 20 20 20 20 20 7d 0a  NODE".        }.
c8b0: 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 73 65          if { [se
c8c0: 74 20 69 6d 67 20 5b 57 69 64 67 65 74 3a 3a 67  t img [Widget::g
c8d0: 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 2e 24  etoption $path.$
c8e0: 6e 6f 64 65 20 2d 69 6d 61 67 65 5d 5d 20 21 3d  node -image]] !=
c8f0: 20 22 22 20 7d 20 7b 0a 20 20 20 20 20 20 20 20   "" } {.        
c900: 20 20 20 20 70 61 63 6b 20 5b 6c 61 62 65 6c 20      pack [label 
c910: 24 74 6f 70 2e 6c 20 2d 69 6d 61 67 65 20 24 69  $top.l -image $i
c920: 6d 67 20 2d 70 61 64 78 20 30 20 2d 70 61 64 79  mg -padx 0 -pady
c930: 20 30 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0].        }.  
c940: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
c950: 73 74 20 24 74 79 70 65 20 7b 63 6f 70 79 20 6d  st $type {copy m
c960: 6f 76 65 20 6c 69 6e 6b 7d 20 24 6e 6f 64 65 5d  ove link} $node]
c970: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
c980: 6e 20 7b 7d 0a 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d  n {}.}...# -----
c990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9d0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d 6d 61  -------.#  Comma
c9e0: 6e 64 20 54 72 65 65 3a 3a 5f 64 72 6f 70 5f 63  nd Tree::_drop_c
c9f0: 6d 64 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  md.# -----------
ca00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca40: 2d 0a 70 72 6f 63 20 54 72 65 65 3a 3a 5f 64 72  -.proc Tree::_dr
ca50: 6f 70 5f 63 6d 64 20 7b 20 70 61 74 68 20 73 6f  op_cmd { path so
ca60: 75 72 63 65 20 58 20 59 20 6f 70 20 74 79 70 65  urce X Y op type
ca70: 20 64 6e 64 64 61 74 61 20 7d 20 7b 0a 20 20 20   dnddata } {.   
ca80: 20 73 65 74 20 70 61 74 68 20 5b 77 69 6e 66 6f   set path [winfo
ca90: 20 70 61 72 65 6e 74 20 24 70 61 74 68 5d 0a 20   parent $path]. 
caa0: 20 20 20 76 61 72 69 61 62 6c 65 20 24 70 61 74     variable $pat
cab0: 68 0a 20 20 20 20 75 70 76 61 72 20 30 20 20 24  h.    upvar 0  $
cac0: 70 61 74 68 20 64 61 74 61 0a 0a 20 20 20 20 24  path data..    $
cad0: 70 61 74 68 2e 63 20 64 65 6c 65 74 65 20 64 72  path.c delete dr
cae0: 6f 70 0a 20 20 20 20 69 66 20 7b 20 5b 73 74 72  op.    if { [str
caf0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 61  ing length $data
cb00: 28 64 6e 64 2c 61 66 74 65 72 69 64 29 5d 20 7d  (dnd,afterid)] }
cb10: 20 7b 0a 20 20 20 20 20 20 20 20 61 66 74 65 72   {.        after
cb20: 20 63 61 6e 63 65 6c 20 24 64 61 74 61 28 64 6e   cancel $data(dn
cb30: 64 2c 61 66 74 65 72 69 64 29 0a 20 20 20 20 20  d,afterid).     
cb40: 20 20 20 73 65 74 20 64 61 74 61 28 64 6e 64 2c     set data(dnd,
cb50: 61 66 74 65 72 69 64 29 20 22 22 0a 20 20 20 20  afterid) "".    
cb60: 7d 0a 20 20 20 20 73 65 74 20 64 61 74 61 28 64  }.    set data(d
cb70: 6e 64 2c 73 63 72 6f 6c 6c 29 20 22 22 0a 20 20  nd,scroll) "".  
cb80: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b    if {[llength [
cb90: 73 65 74 20 63 6d 64 20 5b 57 69 64 67 65 74 3a  set cmd [Widget:
cba0: 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68  :getoption $path
cbb0: 20 2d 64 72 6f 70 63 6d 64 5d 5d 5d 7d 20 7b 0a   -dropcmd]]]} {.
cbc0: 09 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c  .return [uplevel
cbd0: 20 5c 23 30 20 24 63 6d 64 20 5c 0a 09 09 20 20   \#0 $cmd \...  
cbe0: 20 20 5b 6c 69 73 74 20 24 70 61 74 68 20 24 73    [list $path $s
cbf0: 6f 75 72 63 65 20 24 64 61 74 61 28 64 6e 64 2c  ource $data(dnd,
cc00: 6e 6f 64 65 29 20 24 6f 70 20 24 74 79 70 65 20  node) $op $type 
cc10: 24 64 6e 64 64 61 74 61 5d 5d 0a 20 20 20 20 7d  $dnddata]].    }
cc20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 0a 7d 0a  .    return 0.}.
cc30: 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..# ------------
cc40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc80: 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65  .#  Command Tree
cc90: 3a 3a 5f 6f 76 65 72 5f 63 6d 64 0a 23 20 2d 2d  ::_over_cmd.# --
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63 20  ----------.proc 
ccf0: 54 72 65 65 3a 3a 5f 6f 76 65 72 5f 63 6d 64 20  Tree::_over_cmd 
cd00: 7b 20 70 61 74 68 20 73 6f 75 72 63 65 20 65 76  { path source ev
cd10: 65 6e 74 20 58 20 59 20 6f 70 20 74 79 70 65 20  ent X Y op type 
cd20: 64 6e 64 64 61 74 61 20 7d 20 7b 0a 20 20 20 20  dnddata } {.    
cd30: 73 65 74 20 70 61 74 68 20 5b 77 69 6e 66 6f 20  set path [winfo 
cd40: 70 61 72 65 6e 74 20 24 70 61 74 68 5d 0a 20 20  parent $path].  
cd50: 20 20 76 61 72 69 61 62 6c 65 20 24 70 61 74 68    variable $path
cd60: 0a 20 20 20 20 75 70 76 61 72 20 30 20 20 24 70  .    upvar 0  $p
cd70: 61 74 68 20 64 61 74 61 0a 0a 20 20 20 20 69 66  ath data..    if
cd80: 20 7b 20 5b 73 74 72 69 6e 67 20 65 71 75 61 6c   { [string equal
cd90: 20 24 65 76 65 6e 74 20 22 6c 65 61 76 65 22 5d   $event "leave"]
cda0: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 20 77   } {.        # w
cdb0: 65 20 6c 65 61 76 65 20 74 68 65 20 77 69 6e 64  e leave the wind
cdc0: 6f 77 20 74 72 65 65 0a 20 20 20 20 20 20 20 20  ow tree.        
cdd0: 24 70 61 74 68 2e 63 20 64 65 6c 65 74 65 20 64  $path.c delete d
cde0: 72 6f 70 0a 20 20 20 20 20 20 20 20 69 66 20 7b  rop.        if {
cdf0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
ce00: 24 64 61 74 61 28 64 6e 64 2c 61 66 74 65 72 69  $data(dnd,afteri
ce10: 64 29 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  d)] } {.        
ce20: 20 20 20 20 61 66 74 65 72 20 63 61 6e 63 65 6c      after cancel
ce30: 20 24 64 61 74 61 28 64 6e 64 2c 61 66 74 65 72   $data(dnd,after
ce40: 69 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  id).            
ce50: 73 65 74 20 64 61 74 61 28 64 6e 64 2c 61 66 74  set data(dnd,aft
ce60: 65 72 69 64 29 20 22 22 0a 20 20 20 20 20 20 20  erid) "".       
ce70: 20 7d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64   }.        set d
ce80: 61 74 61 28 64 6e 64 2c 73 63 72 6f 6c 6c 29 20  ata(dnd,scroll) 
ce90: 22 22 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  "".        retur
cea0: 6e 20 30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  n 0.    }..    i
ceb0: 66 20 7b 20 5b 73 74 72 69 6e 67 20 65 71 75 61  f { [string equa
cec0: 6c 20 24 65 76 65 6e 74 20 22 65 6e 74 65 72 22  l $event "enter"
ced0: 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 20  ] } {.        # 
cee0: 77 65 20 65 6e 74 65 72 20 74 68 65 20 77 69 6e  we enter the win
cef0: 64 6f 77 20 74 72 65 65 20 2d 20 64 6e 64 20 64  dow tree - dnd d
cf00: 61 74 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ata initializati
cf10: 6f 6e 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  on.        set m
cf20: 6f 64 65 20 5b 57 69 64 67 65 74 3a 3a 67 65 74  ode [Widget::get
cf30: 6f 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 64 72  option $path -dr
cf40: 6f 70 6f 76 65 72 6d 6f 64 65 5d 0a 20 20 20 20  opovermode].    
cf50: 20 20 20 20 73 65 74 20 64 61 74 61 28 64 6e 64      set data(dnd
cf60: 2c 6d 6f 64 65 29 20 30 0a 20 20 20 20 20 20 20  ,mode) 0.       
cf70: 20 66 6f 72 65 61 63 68 20 63 20 7b 77 20 70 20   foreach c {w p 
cf80: 6e 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n} {.           
cf90: 20 73 65 74 20 64 61 74 61 28 64 6e 64 2c 6d 6f   set data(dnd,mo
cfa0: 64 65 29 20 5b 65 78 70 72 20 7b 28 24 64 61 74  de) [expr {($dat
cfb0: 61 28 64 6e 64 2c 6d 6f 64 65 29 20 3c 3c 20 31  a(dnd,mode) << 1
cfc0: 29 20 7c 20 28 5b 73 74 72 69 6e 67 20 66 69 72  ) | ([string fir
cfd0: 73 74 20 24 63 20 24 6d 6f 64 65 5d 20 21 3d 20  st $c $mode] != 
cfe0: 2d 31 29 7d 5d 0a 20 20 20 20 20 20 20 20 7d 0a  -1)}].        }.
cff0: 20 20 20 20 20 20 20 20 73 65 74 20 62 62 6f 78          set bbox
d000: 20 5b 24 70 61 74 68 2e 63 20 62 62 6f 78 20 61   [$path.c bbox a
d010: 6c 6c 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ll].        if {
d020: 20 5b 6c 6c 65 6e 67 74 68 20 24 62 62 6f 78 5d   [llength $bbox]
d030: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   } {.           
d040: 20 73 65 74 20 64 61 74 61 28 64 6e 64 2c 78 73   set data(dnd,xs
d050: 29 20 5b 6c 69 6e 64 65 78 20 24 62 62 6f 78 20  ) [lindex $bbox 
d060: 32 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  2].            s
d070: 65 74 20 64 61 74 61 28 64 6e 64 2c 65 6d 70 74  et data(dnd,empt
d080: 79 29 20 30 0a 20 20 20 20 20 20 20 20 7d 20 65  y) 0.        } e
d090: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
d0a0: 20 20 73 65 74 20 64 61 74 61 28 64 6e 64 2c 78    set data(dnd,x
d0b0: 73 29 20 30 0a 20 20 20 20 20 20 20 20 20 20 20  s) 0.           
d0c0: 20 73 65 74 20 64 61 74 61 28 64 6e 64 2c 65 6d   set data(dnd,em
d0d0: 70 74 79 29 20 31 0a 20 20 20 20 20 20 20 20 7d  pty) 1.        }
d0e0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
d0f0: 61 28 64 6e 64 2c 6e 6f 64 65 29 20 7b 7d 0a 20  a(dnd,node) {}. 
d100: 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 78 20     }..    set x 
d110: 5b 65 78 70 72 20 7b 24 58 2d 5b 77 69 6e 66 6f  [expr {$X-[winfo
d120: 20 72 6f 6f 74 78 20 24 70 61 74 68 5d 7d 5d 0a   rootx $path]}].
d130: 20 20 20 20 73 65 74 20 79 20 5b 65 78 70 72 20      set y [expr 
d140: 7b 24 59 2d 5b 77 69 6e 66 6f 20 72 6f 6f 74 79  {$Y-[winfo rooty
d150: 20 24 70 61 74 68 5d 7d 5d 0a 20 20 20 20 24 70   $path]}].    $p
d160: 61 74 68 2e 63 20 64 65 6c 65 74 65 20 64 72 6f  ath.c delete dro
d170: 70 0a 20 20 20 20 73 65 74 20 64 61 74 61 28 64  p.    set data(d
d180: 6e 64 2c 6e 6f 64 65 29 20 7b 7d 0a 0a 20 20 20  nd,node) {}..   
d190: 20 23 20 74 65 73 74 20 66 6f 72 20 61 75 74 6f   # test for auto
d1a0: 2d 73 63 72 6f 6c 6c 20 75 6e 6c 65 73 73 20 6d  -scroll unless m
d1b0: 6f 64 65 20 69 73 20 77 69 64 67 65 74 20 6f 6e  ode is widget on
d1c0: 6c 79 0a 20 20 20 20 69 66 20 7b 20 24 64 61 74  ly.    if { $dat
d1d0: 61 28 64 6e 64 2c 6d 6f 64 65 29 20 21 3d 20 34  a(dnd,mode) != 4
d1e0: 20 26 26 20 5b 5f 61 75 74 6f 5f 73 63 72 6f 6c   && [_auto_scrol
d1f0: 6c 20 24 70 61 74 68 20 24 78 20 24 79 5d 20 21  l $path $x $y] !
d200: 3d 20 22 22 20 7d 20 7b 0a 20 20 20 20 20 20 20  = "" } {.       
d210: 20 72 65 74 75 72 6e 20 32 0a 20 20 20 20 7d 0a   return 2.    }.
d220: 0a 20 20 20 20 69 66 20 7b 20 24 64 61 74 61 28  .    if { $data(
d230: 64 6e 64 2c 6d 6f 64 65 29 20 26 20 34 20 7d 20  dnd,mode) & 4 } 
d240: 7b 0a 20 20 20 20 20 20 20 20 23 20 64 72 6f 70  {.        # drop
d250: 6f 76 65 72 6d 6f 64 65 20 69 6e 63 6c 75 64 65  overmode include
d260: 73 20 77 69 64 67 65 74 0a 20 20 20 20 20 20 20  s widget.       
d270: 20 73 65 74 20 74 61 72 67 65 74 20 5b 6c 69 73   set target [lis
d280: 74 20 77 69 64 67 65 74 5d 0a 20 20 20 20 20 20  t widget].      
d290: 20 20 73 65 74 20 76 6d 6f 64 65 20 20 34 0a 20    set vmode  4. 
d2a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
d2b0: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 20 5b      set target [
d2c0: 6c 69 73 74 20 22 22 5d 0a 20 20 20 20 20 20 20  list ""].       
d2d0: 20 73 65 74 20 76 6d 6f 64 65 20 20 30 0a 20 20   set vmode  0.  
d2e0: 20 20 7d 0a 20 20 20 20 69 66 20 7b 20 28 24 64    }.    if { ($d
d2f0: 61 74 61 28 64 6e 64 2c 6d 6f 64 65 29 20 26 20  ata(dnd,mode) & 
d300: 32 29 20 26 26 20 24 64 61 74 61 28 64 6e 64 2c  2) && $data(dnd,
d310: 65 6d 70 74 79 29 20 7d 20 7b 0a 20 20 20 20 20  empty) } {.     
d320: 20 20 20 23 20 64 72 6f 70 6f 76 65 72 6d 6f 64     # dropovermod
d330: 65 20 69 6e 63 6c 75 64 65 73 20 70 6f 73 69 74  e includes posit
d340: 69 6f 6e 20 61 6e 64 20 74 72 65 65 20 69 73 20  ion and tree is 
d350: 65 6d 70 74 79 0a 20 20 20 20 20 20 20 20 6c 61  empty.        la
d360: 70 70 65 6e 64 20 74 61 72 67 65 74 20 5b 6c 69  ppend target [li
d370: 73 74 20 72 6f 6f 74 20 30 5d 0a 20 20 20 20 20  st root 0].     
d380: 20 20 20 73 65 74 20 76 6d 6f 64 65 20 20 5b 65     set vmode  [e
d390: 78 70 72 20 7b 24 76 6d 6f 64 65 20 7c 20 32 7d  xpr {$vmode | 2}
d3a0: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74  ].    }..    set
d3b0: 20 78 63 20 5b 24 70 61 74 68 2e 63 20 63 61 6e   xc [$path.c can
d3c0: 76 61 73 78 20 24 78 5d 0a 20 20 20 20 73 65 74  vasx $x].    set
d3d0: 20 78 73 20 24 64 61 74 61 28 64 6e 64 2c 78 73   xs $data(dnd,xs
d3e0: 29 0a 20 20 20 20 69 66 20 7b 20 24 78 63 20 3c  ).    if { $xc <
d3f0: 3d 20 24 78 73 20 7d 20 7b 0a 20 20 20 20 20 20  = $xs } {.      
d400: 20 20 73 65 74 20 79 63 20 20 20 5b 24 70 61 74    set yc   [$pat
d410: 68 2e 63 20 63 61 6e 76 61 73 79 20 24 79 5d 0a  h.c canvasy $y].
d420: 20 20 20 20 20 20 20 20 73 65 74 20 64 79 20 20          set dy  
d430: 20 5b 24 70 61 74 68 2e 63 20 63 67 65 74 20 2d   [$path.c cget -
d440: 79 73 63 72 6f 6c 6c 69 6e 63 72 65 6d 65 6e 74  yscrollincrement
d450: 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6c 69  ].        set li
d460: 6e 65 20 5b 65 78 70 72 20 7b 69 6e 74 28 24 79  ne [expr {int($y
d470: 63 2f 24 64 79 29 7d 5d 0a 20 20 20 20 20 20 20  c/$dy)}].       
d480: 20 73 65 74 20 78 69 20 20 20 30 0a 20 20 20 20   set xi   0.    
d490: 20 20 20 20 73 65 74 20 79 69 20 20 20 5b 65 78      set yi   [ex
d4a0: 70 72 20 7b 24 6c 69 6e 65 2a 24 64 79 7d 5d 0a  pr {$line*$dy}].
d4b0: 20 20 20 20 20 20 20 20 73 65 74 20 79 73 20 20          set ys  
d4c0: 20 5b 65 78 70 72 20 7b 24 79 69 2b 24 64 79 7d   [expr {$yi+$dy}
d4d0: 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 6f  ].        set fo
d4e0: 75 6e 64 20 30 0a 20 20 20 20 20 20 20 20 66 6f  und 0.        fo
d4f0: 72 65 61 63 68 20 69 64 20 5b 24 70 61 74 68 2e  reach id [$path.
d500: 63 20 66 69 6e 64 20 6f 76 65 72 6c 61 70 70 69  c find overlappi
d510: 6e 67 20 24 78 69 20 24 79 69 20 24 78 73 20 24  ng $xi $yi $xs $
d520: 79 73 5d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ys] {.          
d530: 20 20 73 65 74 20 6c 74 61 67 73 20 5b 24 70 61    set ltags [$pa
d540: 74 68 2e 63 20 67 65 74 74 61 67 73 20 24 69 64  th.c gettags $id
d550: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ].            se
d560: 74 20 69 74 65 6d 20 20 5b 6c 69 6e 64 65 78 20  t item  [lindex 
d570: 24 6c 74 61 67 73 20 31 5d 0a 20 20 20 20 20 20  $ltags 1].      
d580: 20 20 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69        if { [stri
d590: 6e 67 20 65 71 75 61 6c 20 24 69 74 65 6d 20 22  ng equal $item "
d5a0: 6e 6f 64 65 22 5d 20 7c 7c 0a 20 20 20 20 20 20  node"] ||.      
d5b0: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
d5c0: 6e 67 20 65 71 75 61 6c 20 24 69 74 65 6d 20 22  ng equal $item "
d5d0: 69 6d 67 22 5d 20 20 7c 7c 0a 20 20 20 20 20 20  img"]  ||.      
d5e0: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
d5f0: 6e 67 20 65 71 75 61 6c 20 24 69 74 65 6d 20 22  ng equal $item "
d600: 77 69 6e 22 5d 20 7d 20 7b 0a 20 20 20 20 20 20  win"] } {.      
d610: 20 20 20 20 20 20 20 20 20 20 23 20 69 74 65 6d            # item
d620: 20 69 73 20 74 68 65 20 6c 61 62 65 6c 20 6f 72   is the label or
d630: 20 69 6d 61 67 65 2f 77 69 6e 64 6f 77 20 6f 66   image/window of
d640: 20 74 68 65 20 6e 6f 64 65 0a 20 20 20 20 20 20   the node.      
d650: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f            set no
d660: 64 65 20 5b 54 72 65 65 3a 3a 5f 67 65 74 5f 6e  de [Tree::_get_n
d670: 6f 64 65 5f 6e 61 6d 65 20 24 70 61 74 68 20 24  ode_name $path $
d680: 69 64 20 32 5d 0a 09 09 73 65 74 20 66 6f 75 6e  id 2]...set foun
d690: 64 20 31 0a 09 09 62 72 65 61 6b 0a 09 20 20 20  d 1...break..   
d6a0: 20 7d 0a 09 7d 0a 09 69 66 20 7b 24 66 6f 75 6e   }..}..if {$foun
d6b0: 64 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 70 61  d} {..    set pa
d6c0: 64 78 20 20 20 5b 5f 67 65 74 5f 6e 6f 64 65 5f  dx   [_get_node_
d6d0: 70 61 64 78 20 24 70 61 74 68 20 24 6e 6f 64 65  padx $path $node
d6e0: 5d 0a 09 20 20 20 20 73 65 74 20 64 65 6c 74 61  ]..    set delta
d6f0: 78 20 5b 5f 67 65 74 5f 6e 6f 64 65 5f 64 65 6c  x [_get_node_del
d700: 74 61 78 20 24 70 61 74 68 20 24 6e 6f 64 65 5d  tax $path $node]
d710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
d720: 20 78 69 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64   xi [expr {[lind
d730: 65 78 20 5b 24 70 61 74 68 2e 63 20 63 6f 6f 72  ex [$path.c coor
d740: 64 73 20 6e 3a 24 6e 6f 64 65 5d 20 30 5d 20 2d  ds n:$node] 0] -
d750: 20 24 70 61 64 78 20 2d 20 31 7d 5d 0a 20 20 20   $padx - 1}].   
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
d770: 7b 20 24 64 61 74 61 28 64 6e 64 2c 6d 6f 64 65  { $data(dnd,mode
d780: 29 20 26 20 31 20 7d 20 7b 0a 20 20 20 20 20 20  ) & 1 } {.      
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
d7a0: 64 72 6f 70 6f 76 65 72 6d 6f 64 65 20 69 6e 63  dropovermode inc
d7b0: 6c 75 64 65 73 20 6e 6f 64 65 0a 20 20 20 20 20  ludes node.     
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
d7d0: 61 70 70 65 6e 64 20 74 61 72 67 65 74 20 24 6e  append target $n
d7e0: 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ode.            
d7f0: 20 20 20 20 20 20 20 20 73 65 74 20 76 6d 6f 64          set vmod
d800: 65 20 5b 65 78 70 72 20 7b 24 76 6d 6f 64 65 20  e [expr {$vmode 
d810: 7c 20 31 7d 5d 0a 20 20 20 20 20 20 20 20 20 20  | 1}].          
d820: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 6c 61 70 70 65 6e 64 20 74 61 72 67 65     lappend targe
d850: 74 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 20  t "".           
d860: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
d870: 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 64 61          if { $da
d880: 74 61 28 64 6e 64 2c 6d 6f 64 65 29 20 26 20 32  ta(dnd,mode) & 2
d890: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   } {.           
d8a0: 20 20 20 20 20 20 20 20 20 23 20 64 72 6f 70 6f           # dropo
d8b0: 76 65 72 6d 6f 64 65 20 69 6e 63 6c 75 64 65 73  vermode includes
d8c0: 20 70 6f 73 69 74 69 6f 6e 0a 20 20 20 20 20 20   position.      
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
d8e0: 20 7b 20 24 79 63 20 3e 3d 20 24 79 69 2b 24 64   { $yc >= $yi+$d
d8f0: 79 2f 32 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  y/2 } {.        
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 23 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 61 66  # position is af
d920: 74 65 72 20 24 6e 6f 64 65 0a 20 20 20 20 20 20  ter $node.      
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d940: 20 20 69 66 20 7b 20 5b 57 69 64 67 65 74 3a 3a    if { [Widget::
d950: 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 2e  getoption $path.
d960: 24 6e 6f 64 65 20 2d 6f 70 65 6e 5d 20 26 26 0a  $node -open] &&.
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 6c               [ll
d990: 65 6e 67 74 68 20 24 64 61 74 61 28 24 6e 6f 64  ength $data($nod
d9a0: 65 29 5d 20 3e 20 31 20 7d 20 7b 0a 20 20 20 20  e)] > 1 } {.    
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 20 20 20 20 20 20 20 23 20 24 6e 6f 64 65 20          # $node 
d9d0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 68 61 76 65  is open and have
d9e0: 20 73 75 62 6e 6f 64 65 73 0a 20 20 20 20 20 20   subnodes.      
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 20 20 23 20 64 72 6f 70 20 70 6f 73        # drop pos
da10: 69 74 69 6f 6e 20 69 73 20 30 20 69 6e 20 63 68  ition is 0 in ch
da20: 69 6c 64 72 65 6e 20 6f 66 20 24 6e 6f 64 65 0a  ildren of $node.
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da40: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
da50: 70 61 72 65 6e 74 20 24 6e 6f 64 65 0a 20 20 20  parent $node.   
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 64           set ind
da80: 65 78 20 20 30 0a 20 20 20 20 20 20 20 20 20 20  ex  0.          
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 73 65 74 20 78 6c 69 20 20 20 20 5b 65 78    set xli    [ex
dab0: 70 72 20 7b 24 78 69 2d 35 7d 5d 0a 20 20 20 20  pr {$xi-5}].    
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daf0: 20 20 20 20 20 20 20 20 20 23 20 24 6e 6f 64 65           # $node
db00: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 61 6e 64   is not open and
db10: 20 64 6f 65 73 6e 27 74 20 68 61 76 65 20 73 75   doesn't have su
db20: 62 6e 6f 64 65 73 0a 20 20 20 20 20 20 20 20 20  bnodes.         
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 23 20 64 72 6f 70 20 70 6f 73 69 74 69     # drop positi
db50: 6f 6e 20 69 73 20 61 66 74 65 72 20 24 6e 6f 64  on is after $nod
db60: 65 20 69 6e 20 63 68 69 6c 64 72 65 6e 20 6f 66  e in children of
db70: 20 70 61 72 65 6e 74 20 6f 66 20 24 6e 6f 64 65   parent of $node
db80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
dba0: 20 70 61 72 65 6e 74 20 5b 6c 69 6e 64 65 78 20   parent [lindex 
dbb0: 24 64 61 74 61 28 24 6e 6f 64 65 29 20 30 5d 0a  $data($node) 0].
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
dbe0: 69 6e 64 65 78 20 20 5b 6c 73 65 61 72 63 68 20  index  [lsearch 
dbf0: 2d 65 78 61 63 74 20 24 64 61 74 61 28 24 70 61  -exact $data($pa
dc00: 72 65 6e 74 29 20 24 6e 6f 64 65 5d 0a 20 20 20  rent) $node].   
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 20 20 20 20 73 65 74 20 78 6c 69           set xli
dc30: 20 20 20 20 5b 65 78 70 72 20 7b 24 78 69 20 2d      [expr {$xi -
dc40: 20 24 64 65 6c 74 61 78 20 2d 20 35 7d 5d 0a 20   $deltax - 5}]. 
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 73 65 74 20 79 6c 20 24 79 73 0a 20 20 20 20   set yl $ys.    
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 23 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 62   # position is b
dcd0: 65 66 6f 72 65 20 24 6e 6f 64 65 0a 20 20 20 20  efore $node.    
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 23 20 64 72 6f 70 20 70 6f 73 69 74      # drop posit
dd00: 69 6f 6e 20 69 73 20 62 65 66 6f 72 65 20 24 6e  ion is before $n
dd10: 6f 64 65 20 69 6e 20 63 68 69 6c 64 72 65 6e 20  ode in children 
dd20: 6f 66 20 70 61 72 65 6e 74 20 6f 66 20 24 6e 6f  of parent of $no
dd30: 64 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  de.             
dd40: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
dd50: 61 72 65 6e 74 20 5b 6c 69 6e 64 65 78 20 24 64  arent [lindex $d
dd60: 61 74 61 28 24 6e 6f 64 65 29 20 30 5d 0a 20 20  ata($node) 0].  
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 20 20 20 73 65 74 20 69 6e 64 65 78 20        set index 
dd90: 20 5b 65 78 70 72 20 7b 5b 6c 73 65 61 72 63 68   [expr {[lsearch
dda0: 20 2d 65 78 61 63 74 20 24 64 61 74 61 28 24 70   -exact $data($p
ddb0: 61 72 65 6e 74 29 20 24 6e 6f 64 65 5d 20 2d 20  arent) $node] - 
ddc0: 31 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  1}].            
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
dde0: 78 6c 69 20 20 20 20 5b 65 78 70 72 20 7b 24 78  xli    [expr {$x
ddf0: 69 20 2d 20 24 64 65 6c 74 61 78 20 2d 20 35 7d  i - $deltax - 5}
de00: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
de10: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 79 6c            set yl
de20: 20 20 20 20 20 24 79 69 0a 20 20 20 20 20 20 20       $yi.       
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 6c 61 70 70 65 6e 64 20 74 61 72 67 65     lappend targe
de60: 74 20 5b 6c 69 73 74 20 24 70 61 72 65 6e 74 20  t [list $parent 
de70: 24 69 6e 64 65 78 5d 0a 20 20 20 20 20 20 20 20  $index].        
de80: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
de90: 76 6d 6f 64 65 20 20 5b 65 78 70 72 20 7b 24 76  vmode  [expr {$v
dea0: 6d 6f 64 65 20 7c 20 32 7d 5d 0a 20 20 20 20 20  mode | 2}].     
deb0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
dec0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
ded0: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
dee0: 74 61 72 67 65 74 20 7b 7d 0a 20 20 20 20 20 20  target {}.      
def0: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
df10: 7b 20 28 24 76 6d 6f 64 65 20 26 20 33 29 20 3d  { ($vmode & 3) =
df20: 3d 20 33 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  = 3 } {.        
df30: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 72 65              # re
df40: 73 75 6c 74 20 68 61 76 65 20 62 6f 74 68 20 6e  sult have both n
df50: 6f 64 65 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e  ode and position
df60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df70: 20 20 20 20 20 23 20 77 65 20 63 6f 6d 70 75 74       # we comput
df80: 65 20 77 68 61 74 20 69 73 20 74 68 65 20 70 72  e what is the pr
df90: 65 66 65 72 72 65 64 20 6d 65 74 68 6f 64 0a 20  eferred method. 
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 69 66 20 7b 20 24 79 63 2d 24 79 69 20     if { $yc-$yi 
dfc0: 3c 3d 20 33 20 7c 7c 20 24 79 73 2d 24 79 63 20  <= 3 || $ys-$yc 
dfd0: 3c 3d 20 33 20 7d 20 7b 0a 20 20 20 20 20 20 20  <= 3 } {.       
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 6c 61 70 70 65 6e 64 20 74 61 72 67 65 74 20   lappend target 
e000: 22 70 6f 73 69 74 69 6f 6e 22 0a 20 20 20 20 20  "position".     
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
e020: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e040: 6c 61 70 70 65 6e 64 20 74 61 72 67 65 74 20 22  lappend target "
e050: 6e 6f 64 65 22 0a 20 20 20 20 20 20 20 20 20 20  node".          
e060: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e070: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
e080: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e090: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b 24      }..    if {$
e0a0: 76 6d 6f 64 65 20 26 26 20 5b 6c 6c 65 6e 67 74  vmode && [llengt
e0b0: 68 20 5b 73 65 74 20 63 6d 64 20 5b 57 69 64 67  h [set cmd [Widg
e0c0: 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70  et::getoption $p
e0d0: 61 74 68 20 2d 64 72 6f 70 6f 76 65 72 63 6d 64  ath -dropovercmd
e0e0: 5d 5d 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 23  ]]]} {.        #
e0f0: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 64 72   user-defined dr
e100: 6f 70 6f 76 65 72 20 63 6f 6d 6d 61 6e 64 0a 20  opover command. 
e110: 20 20 20 20 20 20 20 73 65 74 20 72 65 73 20 20         set res  
e120: 20 20 20 5b 75 70 6c 65 76 65 6c 20 5c 23 30 20     [uplevel \#0 
e130: 24 63 6d 64 20 5b 6c 69 73 74 20 24 70 61 74 68  $cmd [list $path
e140: 20 24 73 6f 75 72 63 65 20 24 74 61 72 67 65 74   $source $target
e150: 20 24 6f 70 20 24 74 79 70 65 20 24 64 6e 64 64   $op $type $dndd
e160: 61 74 61 5d 5d 0a 20 20 20 20 20 20 20 20 73 65  ata]].        se
e170: 74 20 63 6f 64 65 20 20 20 20 5b 6c 69 6e 64 65  t code    [linde
e180: 78 20 24 72 65 73 20 30 5d 0a 20 20 20 20 20 20  x $res 0].      
e190: 20 20 73 65 74 20 6e 65 77 6d 6f 64 65 20 30 0a    set newmode 0.
e1a0: 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 63 6f          if { $co
e1b0: 64 65 20 26 20 31 20 7d 20 7b 0a 20 20 20 20 20  de & 1 } {.     
e1c0: 20 20 20 20 20 20 20 23 20 75 70 64 61 74 65 20         # update 
e1d0: 76 6d 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20  vmode.          
e1e0: 20 20 73 65 74 20 6d 6f 64 65 20 5b 6c 69 6e 64    set mode [lind
e1f0: 65 78 20 24 72 65 73 20 31 5d 0a 20 20 20 20 20  ex $res 1].     
e200: 20 20 20 20 20 20 20 69 66 20 7b 20 28 24 76 6d         if { ($vm
e210: 6f 64 65 20 26 20 31 29 20 26 26 20 5b 73 74 72  ode & 1) && [str
e220: 69 6e 67 20 65 71 75 61 6c 20 24 6d 6f 64 65 20  ing equal $mode 
e230: 22 6e 6f 64 65 22 5d 20 7d 20 7b 0a 20 20 20 20  "node"] } {.    
e240: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
e250: 6e 65 77 6d 6f 64 65 20 31 0a 20 20 20 20 20 20  newmode 1.      
e260: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
e270: 20 28 24 76 6d 6f 64 65 20 26 20 32 29 20 26 26   ($vmode & 2) &&
e280: 20 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24   [string equal $
e290: 6d 6f 64 65 20 22 70 6f 73 69 74 69 6f 6e 22 5d  mode "position"]
e2a0: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   } {.           
e2b0: 20 20 20 20 20 73 65 74 20 6e 65 77 6d 6f 64 65       set newmode
e2c0: 20 32 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   2.            }
e2d0: 20 65 6c 73 65 69 66 20 7b 20 28 24 76 6d 6f 64   elseif { ($vmod
e2e0: 65 20 26 20 34 29 20 26 26 20 5b 73 74 72 69 6e  e & 4) && [strin
e2f0: 67 20 65 71 75 61 6c 20 24 6d 6f 64 65 20 22 77  g equal $mode "w
e300: 69 64 67 65 74 22 5d 20 7d 20 7b 0a 20 20 20 20  idget"] } {.    
e310: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
e320: 6e 65 77 6d 6f 64 65 20 34 0a 20 20 20 20 20 20  newmode 4.      
e330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e340: 7d 0a 20 20 20 20 20 20 20 20 73 65 74 20 76 6d  }.        set vm
e350: 6f 64 65 20 24 6e 65 77 6d 6f 64 65 0a 20 20 20  ode $newmode.   
e360: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
e370: 20 20 69 66 20 7b 20 28 24 76 6d 6f 64 65 20 26    if { ($vmode &
e380: 20 33 29 20 3d 3d 20 33 20 7d 20 7b 0a 20 20 20   3) == 3 } {.   
e390: 20 20 20 20 20 20 20 20 20 23 20 72 65 73 75 6c           # resul
e3a0: 74 20 68 61 76 65 20 62 6f 74 68 20 69 74 65 6d  t have both item
e3b0: 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 0a 20 20   and position.  
e3c0: 20 20 20 20 20 20 20 20 20 20 23 20 77 65 20 63            # we c
e3d0: 68 6f 6f 73 65 20 74 68 65 20 70 72 65 66 65 72  hoose the prefer
e3e0: 72 65 64 20 6d 65 74 68 6f 64 0a 20 20 20 20 20  red method.     
e3f0: 20 20 20 20 20 20 20 69 66 20 7b 20 5b 73 74 72         if { [str
e400: 69 6e 67 20 65 71 75 61 6c 20 5b 6c 69 6e 64 65  ing equal [linde
e410: 78 20 24 74 61 72 67 65 74 20 33 5d 20 22 70 6f  x $target 3] "po
e420: 73 69 74 69 6f 6e 22 5d 20 7d 20 7b 0a 20 20 20  sition"] } {.   
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
e440: 20 76 6d 6f 64 65 20 5b 65 78 70 72 20 7b 24 76   vmode [expr {$v
e450: 6d 6f 64 65 20 26 20 7e 31 7d 5d 0a 20 20 20 20  mode & ~1}].    
e460: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
e470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e480: 20 73 65 74 20 76 6d 6f 64 65 20 5b 65 78 70 72   set vmode [expr
e490: 20 7b 24 76 6d 6f 64 65 20 26 20 7e 32 7d 5d 0a   {$vmode & ~2}].
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
e4b0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
e4c0: 20 69 66 20 7b 20 24 64 61 74 61 28 64 6e 64 2c   if { $data(dnd,
e4d0: 6d 6f 64 65 29 20 3d 3d 20 34 20 7c 7c 20 24 64  mode) == 4 || $d
e4e0: 61 74 61 28 64 6e 64 2c 6d 6f 64 65 29 20 3d 3d  ata(dnd,mode) ==
e4f0: 20 30 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20   0 } {.         
e500: 20 20 20 23 20 64 72 6f 70 6f 76 65 72 6d 6f 64     # dropovermod
e510: 65 20 69 73 20 77 69 64 67 65 74 20 6f 72 20 65  e is widget or e
e520: 6d 70 74 79 20 2d 20 72 65 63 61 6c 6c 20 69 73  mpty - recall is
e530: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 0a 20   not necessary. 
e540: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63             set c
e550: 6f 64 65 20 31 0a 20 20 20 20 20 20 20 20 7d 20  ode 1.        } 
e560: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
e570: 20 20 20 73 65 74 20 63 6f 64 65 20 33 0a 20 20     set code 3.  
e580: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
e590: 20 20 20 69 66 20 7b 21 24 64 61 74 61 28 64 6e     if {!$data(dn
e5a0: 64 2c 65 6d 70 74 79 29 7d 20 7b 0a 09 23 20 64  d,empty)} {..# d
e5b0: 72 61 77 20 64 6e 64 20 76 69 73 75 61 6c 20 66  raw dnd visual f
e5c0: 6f 6c 6c 6f 77 69 6e 67 20 76 6d 6f 64 65 0a 09  ollowing vmode..
e5d0: 69 66 20 7b 20 24 76 6d 6f 64 65 20 26 20 31 20  if { $vmode & 1 
e5e0: 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 64 61 74  } {..    set dat
e5f0: 61 28 64 6e 64 2c 6e 6f 64 65 29 20 5b 6c 69 73  a(dnd,node) [lis
e600: 74 20 22 6e 6f 64 65 22 20 5b 6c 69 6e 64 65 78  t "node" [lindex
e610: 20 24 74 61 72 67 65 74 20 31 5d 5d 0a 09 20 20   $target 1]]..  
e620: 20 20 24 70 61 74 68 2e 63 20 63 72 65 61 74 65    $path.c create
e630: 20 72 65 63 74 61 6e 67 6c 65 20 24 78 69 20 24   rectangle $xi $
e640: 79 69 20 24 78 73 20 24 79 73 20 2d 74 61 67 73  yi $xs $ys -tags
e650: 20 64 72 6f 70 0a 09 7d 20 65 6c 73 65 69 66 20   drop..} elseif 
e660: 7b 20 24 76 6d 6f 64 65 20 26 20 32 20 7d 20 7b  { $vmode & 2 } {
e670: 0a 09 20 20 20 20 73 65 74 20 64 61 74 61 28 64  ..    set data(d
e680: 6e 64 2c 6e 6f 64 65 29 20 5b 63 6f 6e 63 61 74  nd,node) [concat
e690: 20 22 70 6f 73 69 74 69 6f 6e 22 20 5b 6c 69 6e   "position" [lin
e6a0: 64 65 78 20 24 74 61 72 67 65 74 20 32 5d 5d 0a  dex $target 2]].
e6b0: 09 20 20 20 20 24 70 61 74 68 2e 63 20 63 72 65  .    $path.c cre
e6c0: 61 74 65 20 6c 69 6e 65 20 24 78 6c 69 20 5b 65  ate line $xli [e
e6d0: 78 70 72 20 7b 24 79 6c 2d 24 64 79 2f 32 7d 5d  xpr {$yl-$dy/2}]
e6e0: 20 24 78 6c 69 20 24 79 6c 20 24 78 73 20 24 79   $xli $yl $xs $y
e6f0: 6c 20 2d 74 61 67 73 20 64 72 6f 70 0a 09 7d 20  l -tags drop..} 
e700: 65 6c 73 65 69 66 20 7b 20 24 76 6d 6f 64 65 20  elseif { $vmode 
e710: 26 20 34 20 7d 20 7b 0a 09 20 20 20 20 73 65 74  & 4 } {..    set
e720: 20 64 61 74 61 28 64 6e 64 2c 6e 6f 64 65 29 20   data(dnd,node) 
e730: 5b 6c 69 73 74 20 22 77 69 64 67 65 74 22 5d 0a  [list "widget"].
e740: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73  .} else {..    s
e750: 65 74 20 63 6f 64 65 20 5b 65 78 70 72 20 7b 24  et code [expr {$
e760: 63 6f 64 65 20 26 20 32 7d 5d 0a 09 7d 0a 20 20  code & 2}]..}.  
e770: 20 20 7d 0a 0a 20 20 20 20 69 66 20 7b 20 24 63    }..    if { $c
e780: 6f 64 65 20 26 20 31 20 7d 20 7b 0a 20 20 20 20  ode & 1 } {.    
e790: 20 20 20 20 44 72 6f 70 53 69 74 65 3a 3a 73 65      DropSite::se
e7a0: 74 63 75 72 73 6f 72 20 62 61 73 65 64 5f 61 72  tcursor based_ar
e7b0: 72 6f 77 5f 64 6f 77 6e 0a 20 20 20 20 7d 20 65  row_down.    } e
e7c0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 44 72  lse {.        Dr
e7d0: 6f 70 53 69 74 65 3a 3a 73 65 74 63 75 72 73 6f  opSite::setcurso
e7e0: 72 20 64 6f 74 0a 20 20 20 20 7d 0a 20 20 20 20  r dot.    }.    
e7f0: 72 65 74 75 72 6e 20 24 63 6f 64 65 0a 7d 0a 0a  return $code.}..
e800: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
e810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
e850: 23 20 20 43 6f 6d 6d 61 6e 64 20 54 72 65 65 3a  #  Command Tree:
e860: 3a 5f 61 75 74 6f 5f 73 63 72 6f 6c 6c 0a 23 20  :_auto_scroll.# 
e870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f  ------------.pro
e8c0: 63 20 54 72 65 65 3a 3a 5f 61 75 74 6f 5f 73 63  c Tree::_auto_sc
e8d0: 72 6f 6c 6c 20 7b 20 70 61 74 68 20 78 20 79 20  roll { path x y 
e8e0: 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65  } {.    variable
e8f0: 20 24 70 61 74 68 0a 20 20 20 20 75 70 76 61 72   $path.    upvar
e900: 20 30 20 20 24 70 61 74 68 20 64 61 74 61 0a 0a   0  $path data..
e910: 20 20 20 20 73 65 74 20 78 6d 61 78 20 20 20 5b      set xmax   [
e920: 77 69 6e 66 6f 20 77 69 64 74 68 20 20 24 70 61  winfo width  $pa
e930: 74 68 5d 0a 20 20 20 20 73 65 74 20 79 6d 61 78  th].    set ymax
e940: 20 20 20 5b 77 69 6e 66 6f 20 68 65 69 67 68 74     [winfo height
e950: 20 24 70 61 74 68 5d 0a 20 20 20 20 73 65 74 20   $path].    set 
e960: 73 63 72 6f 6c 6c 20 7b 7d 0a 20 20 20 20 69 66  scroll {}.    if
e970: 20 7b 20 24 79 20 3c 3d 20 36 20 7d 20 7b 0a 20   { $y <= 6 } {. 
e980: 20 20 20 20 20 20 20 69 66 20 7b 20 5b 6c 69 6e         if { [lin
e990: 64 65 78 20 5b 24 70 61 74 68 2e 63 20 79 76 69  dex [$path.c yvi
e9a0: 65 77 5d 20 30 5d 20 3e 20 30 20 7d 20 7b 0a 20  ew] 0] > 0 } {. 
e9b0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
e9c0: 63 72 6f 6c 6c 20 5b 6c 69 73 74 20 79 76 69 65  croll [list yvie
e9d0: 77 20 2d 31 5d 0a 20 20 20 20 20 20 20 20 20 20  w -1].          
e9e0: 20 20 44 72 6f 70 53 69 74 65 3a 3a 73 65 74 63    DropSite::setc
e9f0: 75 72 73 6f 72 20 73 62 5f 75 70 5f 61 72 72 6f  ursor sb_up_arro
ea00: 77 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  w.        }.    
ea10: 7d 20 65 6c 73 65 69 66 20 7b 20 24 79 20 3e 3d  } elseif { $y >=
ea20: 20 24 79 6d 61 78 2d 36 20 7d 20 7b 0a 20 20 20   $ymax-6 } {.   
ea30: 20 20 20 20 20 69 66 20 7b 20 5b 6c 69 6e 64 65       if { [linde
ea40: 78 20 5b 24 70 61 74 68 2e 63 20 79 76 69 65 77  x [$path.c yview
ea50: 5d 20 31 5d 20 3c 20 31 20 7d 20 7b 0a 20 20 20  ] 1] < 1 } {.   
ea60: 20 20 20 20 20 20 20 20 20 73 65 74 20 73 63 72           set scr
ea70: 6f 6c 6c 20 5b 6c 69 73 74 20 79 76 69 65 77 20  oll [list yview 
ea80: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 44  1].            D
ea90: 72 6f 70 53 69 74 65 3a 3a 73 65 74 63 75 72 73  ropSite::setcurs
eaa0: 6f 72 20 73 62 5f 64 6f 77 6e 5f 61 72 72 6f 77  or sb_down_arrow
eab0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
eac0: 20 65 6c 73 65 69 66 20 7b 20 24 78 20 3c 3d 20   elseif { $x <= 
ead0: 36 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 69 66  6 } {.        if
eae0: 20 7b 20 5b 6c 69 6e 64 65 78 20 5b 24 70 61 74   { [lindex [$pat
eaf0: 68 2e 63 20 78 76 69 65 77 5d 20 30 5d 20 3e 20  h.c xview] 0] > 
eb00: 30 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  0 } {.          
eb10: 20 20 73 65 74 20 73 63 72 6f 6c 6c 20 5b 6c 69    set scroll [li
eb20: 73 74 20 78 76 69 65 77 20 2d 31 5d 0a 20 20 20  st xview -1].   
eb30: 20 20 20 20 20 20 20 20 20 44 72 6f 70 53 69 74           DropSit
eb40: 65 3a 3a 73 65 74 63 75 72 73 6f 72 20 73 62 5f  e::setcursor sb_
eb50: 6c 65 66 74 5f 61 72 72 6f 77 0a 20 20 20 20 20  left_arrow.     
eb60: 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 69     }.    } elsei
eb70: 66 20 7b 20 24 78 20 3e 3d 20 24 78 6d 61 78 2d  f { $x >= $xmax-
eb80: 36 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 69 66  6 } {.        if
eb90: 20 7b 20 5b 6c 69 6e 64 65 78 20 5b 24 70 61 74   { [lindex [$pat
eba0: 68 2e 63 20 78 76 69 65 77 5d 20 31 5d 20 3c 20  h.c xview] 1] < 
ebb0: 31 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  1 } {.          
ebc0: 20 20 73 65 74 20 73 63 72 6f 6c 6c 20 5b 6c 69    set scroll [li
ebd0: 73 74 20 78 76 69 65 77 20 31 5d 0a 20 20 20 20  st xview 1].    
ebe0: 20 20 20 20 20 20 20 20 44 72 6f 70 53 69 74 65          DropSite
ebf0: 3a 3a 73 65 74 63 75 72 73 6f 72 20 73 62 5f 72  ::setcursor sb_r
ec00: 69 67 68 74 5f 61 72 72 6f 77 0a 20 20 20 20 20  ight_arrow.     
ec10: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ec20: 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 6c 65 6e  if { [string len
ec30: 67 74 68 20 24 64 61 74 61 28 64 6e 64 2c 61 66  gth $data(dnd,af
ec40: 74 65 72 69 64 29 5d 20 26 26 20 21 5b 73 74 72  terid)] && ![str
ec50: 69 6e 67 20 65 71 75 61 6c 20 24 64 61 74 61 28  ing equal $data(
ec60: 64 6e 64 2c 73 63 72 6f 6c 6c 29 20 24 73 63 72  dnd,scroll) $scr
ec70: 6f 6c 6c 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20  oll] } {.       
ec80: 20 61 66 74 65 72 20 63 61 6e 63 65 6c 20 24 64   after cancel $d
ec90: 61 74 61 28 64 6e 64 2c 61 66 74 65 72 69 64 29  ata(dnd,afterid)
eca0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74  .        set dat
ecb0: 61 28 64 6e 64 2c 61 66 74 65 72 69 64 29 20 22  a(dnd,afterid) "
ecc0: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74  ".    }..    set
ecd0: 20 64 61 74 61 28 64 6e 64 2c 73 63 72 6f 6c 6c   data(dnd,scroll
ece0: 29 20 24 73 63 72 6f 6c 6c 0a 20 20 20 20 69 66  ) $scroll.    if
ecf0: 20 7b 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74   { [string lengt
ed00: 68 20 24 73 63 72 6f 6c 6c 5d 20 26 26 20 21 5b  h $scroll] && ![
ed10: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
ed20: 61 74 61 28 64 6e 64 2c 61 66 74 65 72 69 64 29  ata(dnd,afterid)
ed30: 5d 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65  ] } {.        se
ed40: 74 20 64 61 74 61 28 64 6e 64 2c 61 66 74 65 72  t data(dnd,after
ed50: 69 64 29 20 5b 61 66 74 65 72 20 32 30 30 20 5b  id) [after 200 [
ed60: 6c 69 73 74 20 54 72 65 65 3a 3a 5f 73 63 72 6f  list Tree::_scro
ed70: 6c 6c 20 24 70 61 74 68 20 24 73 63 72 6f 6c 6c  ll $path $scroll
ed80: 5d 5d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ]].    }.    ret
ed90: 75 72 6e 20 24 64 61 74 61 28 64 6e 64 2c 61 66  urn $data(dnd,af
eda0: 74 65 72 69 64 29 0a 7d 0a 0a 0a 23 20 2d 2d 2d  terid).}...# ---
edb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ede0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 43 6f 6d  ---------.#  Com
ee00: 6d 61 6e 64 20 54 72 65 65 3a 3a 5f 73 63 72 6f  mand Tree::_scro
ee10: 6c 6c 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ll.# -----------
ee20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee60: 2d 0a 70 72 6f 63 20 54 72 65 65 3a 3a 5f 73 63  -.proc Tree::_sc
ee70: 72 6f 6c 6c 20 7b 20 70 61 74 68 20 73 63 72 6f  roll { path scro
ee80: 6c 6c 20 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  ll } {.    varia
ee90: 62 6c 65 20 24 70 61 74 68 0a 20 20 20 20 75 70  ble $path.    up
eea0: 76 61 72 20 30 20 20 24 70 61 74 68 20 64 61 74  var 0  $path dat
eeb0: 61 0a 20 20 20 20 73 65 74 20 63 6d 64 20 5b 6c  a.    set cmd [l
eec0: 69 6e 64 65 78 20 24 73 63 72 6f 6c 6c 20 30 5d  index $scroll 0]
eed0: 0a 20 20 20 20 73 65 74 20 64 69 72 20 5b 6c 69  .    set dir [li
eee0: 6e 64 65 78 20 24 73 63 72 6f 6c 6c 20 31 5d 0a  ndex $scroll 1].
eef0: 20 20 20 20 69 66 20 7b 20 28 24 64 69 72 20 3d      if { ($dir =
ef00: 3d 20 2d 31 20 26 26 20 5b 6c 69 6e 64 65 78 20  = -1 && [lindex 
ef10: 5b 24 70 61 74 68 2e 63 20 24 63 6d 64 5d 20 30  [$path.c $cmd] 0
ef20: 5d 20 3e 20 30 29 20 7c 7c 0a 20 20 20 20 20 20  ] > 0) ||.      
ef30: 20 20 20 28 24 64 69 72 20 3d 3d 20 31 20 20 26     ($dir == 1  &
ef40: 26 20 5b 6c 69 6e 64 65 78 20 5b 24 70 61 74 68  & [lindex [$path
ef50: 2e 63 20 24 63 6d 64 5d 20 31 5d 20 3c 20 31 29  .c $cmd] 1] < 1)
ef60: 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 24 70 61   } {.        $pa
ef70: 74 68 2e 63 20 24 63 6d 64 20 73 63 72 6f 6c 6c  th.c $cmd scroll
ef80: 20 24 64 69 72 20 75 6e 69 74 73 0a 20 20 20 20   $dir units.    
ef90: 20 20 20 20 73 65 74 20 64 61 74 61 28 64 6e 64      set data(dnd
efa0: 2c 61 66 74 65 72 69 64 29 20 5b 61 66 74 65 72  ,afterid) [after
efb0: 20 35 30 20 5b 6c 69 73 74 20 54 72 65 65 3a 3a   50 [list Tree::
efc0: 5f 73 63 72 6f 6c 6c 20 24 70 61 74 68 20 24 73  _scroll $path $s
efd0: 63 72 6f 6c 6c 5d 5d 0a 20 20 20 20 7d 20 65 6c  croll]].    } el
efe0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74  se {.        set
eff0: 20 64 61 74 61 28 64 6e 64 2c 61 66 74 65 72 69   data(dnd,afteri
f000: 64 29 20 22 22 0a 20 20 20 20 20 20 20 20 44 72  d) "".        Dr
f010: 6f 70 53 69 74 65 3a 3a 73 65 74 63 75 72 73 6f  opSite::setcurso
f020: 72 20 64 6f 74 0a 20 20 20 20 7d 0a 7d 0a 0a 23  r dot.    }.}..#
f030: 20 54 72 65 65 3a 3a 5f 6b 65 79 6e 61 76 20 2d   Tree::_keynav -
f040: 2d 0a 23 0a 23 09 48 61 6e 64 6c 65 20 6e 61 76  -.#.#.Handle nav
f050: 69 67 61 74 69 6f 6e 61 6c 20 6b 65 79 70 72 65  igational keypre
f060: 73 73 65 73 20 6f 6e 20 74 68 65 20 74 72 65 65  sses on the tree
f070: 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a  ..#.# Arguments:
f080: 0a 23 09 77 68 69 63 68 20 20 20 20 20 20 74 61  .#.which      ta
f090: 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  g indicating the
f0a0: 20 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 6d 6f   direction of mo
f0b0: 74 69 6f 6e 3a 0a 23 20 20 20 20 20 20 20 20 20  tion:.#         
f0c0: 20 20 20 20 20 20 20 20 20 75 70 20 20 20 20 20           up     
f0d0: 20 20 20 20 6d 6f 76 65 20 74 6f 20 74 68 65 20      move to the 
f0e0: 6e 6f 64 65 20 67 72 61 70 68 69 63 61 6c 6c 79  node graphically
f0f0: 20 61 62 6f 76 65 20 63 75 72 72 65 6e 74 0a 23   above current.#
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f110: 20 20 64 6f 77 6e 20 20 20 20 20 20 20 6d 6f 76    down       mov
f120: 65 20 74 6f 20 74 68 65 20 6e 6f 64 65 20 67 72  e to the node gr
f130: 61 70 68 69 63 61 6c 6c 79 20 62 65 6c 6f 77 20  aphically below 
f140: 63 75 72 72 65 6e 74 0a 23 20 20 20 20 20 20 20  current.#       
f150: 20 20 20 20 20 20 20 20 20 20 20 6c 65 66 74 20             left 
f160: 20 20 20 20 20 20 63 6c 6f 73 65 20 63 75 72 72        close curr
f170: 65 6e 74 20 69 66 20 6f 70 65 6e 2c 20 65 6c 73  ent if open, els
f180: 65 20 6d 6f 76 65 20 74 6f 20 70 61 72 65 6e 74  e move to parent
f190: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
f1a0: 20 20 20 20 72 69 67 68 74 20 20 20 20 20 20 6f      right      o
f1b0: 70 65 6e 20 63 75 72 72 65 6e 74 20 69 66 20 63  pen current if c
f1c0: 6c 6f 73 65 64 2c 20 65 6c 73 65 20 6d 6f 76 65  losed, else move
f1d0: 20 74 6f 20 63 68 69 6c 64 0a 23 20 20 20 20 20   to child.#     
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 65               ope
f1f0: 6e 20 20 20 20 20 20 20 6f 70 65 6e 20 63 75 72  n       open cur
f200: 72 65 6e 74 20 69 66 20 63 6c 6f 73 65 64 2c 20  rent if closed, 
f210: 63 6c 6f 73 65 20 63 75 72 72 65 6e 74 20 69 66  close current if
f220: 20 6f 70 65 6e 0a 23 20 20 20 20 20 20 20 77 69   open.#       wi
f230: 6e 20 20 20 20 20 20 20 20 6e 61 6d 65 20 6f 66  n        name of
f240: 20 74 68 65 20 74 72 65 65 20 77 69 64 67 65 74   the tree widget
f250: 0a 23 0a 23 20 52 65 73 75 6c 74 73 3a 0a 23 09  .#.# Results:.#.
f260: 4e 6f 6e 65 2e 0a 0a 70 72 6f 63 20 54 72 65 65  None...proc Tree
f270: 3a 3a 5f 6b 65 79 6e 61 76 20 7b 77 68 69 63 68  ::_keynav {which
f280: 20 77 69 6e 7d 20 7b 0a 20 20 20 20 23 20 63 68   win} {.    # ch
f290: 65 63 6b 20 66 6f 72 20 61 6e 20 65 6d 70 74 79  eck for an empty
f2a0: 20 74 72 65 65 0a 20 20 20 20 69 66 20 7b 5b 24   tree.    if {[$
f2b0: 77 69 6e 20 6e 6f 64 65 73 20 72 6f 6f 74 5d 20  win nodes root] 
f2c0: 65 71 20 22 22 7d 20 7b 0a 20 20 20 20 20 20 20  eq ""} {.       
f2d0: 20 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20   return.    }.. 
f2e0: 20 20 20 23 20 4b 65 79 62 6f 61 72 64 20 6e 61     # Keyboard na
f2f0: 76 69 67 61 74 69 6f 6e 20 69 73 20 72 69 64 64  vigation is ridd
f300: 6c 65 64 20 77 69 74 68 20 73 70 65 63 69 61 6c  led with special
f310: 20 63 61 73 65 73 2e 20 20 49 6e 20 6f 72 64 65   cases.  In orde
f320: 72 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 23  r to avoid.    #
f330: 20 74 68 65 20 63 6f 6d 70 6c 65 78 20 6c 6f 67   the complex log
f340: 69 63 2c 20 77 65 20 77 69 6c 6c 20 69 6e 73 74  ic, we will inst
f350: 65 61 64 20 6d 61 6b 65 20 61 20 6c 69 73 74 20  ead make a list 
f360: 6f 66 20 61 6c 6c 20 74 68 65 20 76 69 73 69 62  of all the visib
f370: 6c 65 2c 0a 20 20 20 20 23 20 73 65 6c 65 63 74  le,.    # select
f380: 61 62 6c 65 20 6e 6f 64 65 73 2c 20 74 68 65 6e  able nodes, then
f390: 20 64 6f 20 61 20 73 69 6d 70 6c 65 20 6e 65 78   do a simple nex
f3a0: 74 20 6f 72 20 70 72 65 76 69 6f 75 73 20 6f 70  t or previous op
f3b0: 65 72 61 74 69 6f 6e 2e 0a 0a 20 20 20 20 23 20  eration...    # 
f3c0: 4f 6e 65 20 65 61 73 79 20 77 61 79 20 74 6f 20  One easy way to 
f3d0: 67 65 74 20 61 6c 6c 20 6f 66 20 74 68 65 20 76  get all of the v
f3e0: 69 73 69 62 6c 65 20 6e 6f 64 65 73 20 69 73 20  isible nodes is 
f3f0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 61 6e  to query the can
f400: 76 61 73 0a 20 20 20 20 23 20 6f 62 6a 65 63 74  vas.    # object
f410: 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 69 74 65   for all the ite
f420: 6d 73 20 77 69 74 68 20 74 68 65 20 22 6e 6f 64  ms with the "nod
f430: 65 22 20 74 61 67 3b 20 73 69 6e 63 65 20 74 68  e" tag; since th
f440: 65 20 74 72 65 65 20 69 73 20 61 6c 77 61 79 73  e tree is always
f450: 0a 20 20 20 20 23 20 63 6f 6d 70 6c 65 74 65 6c  .    # completel
f460: 79 20 72 65 64 72 61 77 6e 2c 20 74 68 69 73 20  y redrawn, this 
f470: 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 69 6e 20  list will be in 
f480: 76 65 72 74 69 63 61 6c 20 6f 72 64 65 72 2e 0a  vertical order..
f490: 20 20 20 20 73 65 74 20 6e 6f 64 65 73 20 7b 7d      set nodes {}
f4a0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 6e 6f 64  .    foreach nod
f4b0: 65 49 74 65 6d 20 5b 24 77 69 6e 2e 63 20 66 69  eItem [$win.c fi
f4c0: 6e 64 20 77 69 74 68 74 61 67 20 6e 6f 64 65 5d  nd withtag node]
f4d0: 20 7b 0a 09 73 65 74 20 6e 6f 64 65 20 5b 54 72   {..set node [Tr
f4e0: 65 65 3a 3a 5f 67 65 74 5f 6e 6f 64 65 5f 6e 61  ee::_get_node_na
f4f0: 6d 65 20 24 77 69 6e 20 24 6e 6f 64 65 49 74 65  me $win $nodeIte
f500: 6d 20 32 5d 0a 09 69 66 20 7b 20 5b 57 69 64 67  m 2]..if { [Widg
f510: 65 74 3a 3a 63 67 65 74 20 24 77 69 6e 2e 24 6e  et::cget $win.$n
f520: 6f 64 65 20 2d 73 65 6c 65 63 74 61 62 6c 65 5d  ode -selectable]
f530: 20 7d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e   } {..    lappen
f540: 64 20 6e 6f 64 65 73 20 24 6e 6f 64 65 0a 09 7d  d nodes $node..}
f550: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 4b 65  .    }..    # Ke
f560: 79 62 6f 61 72 64 20 6e 61 76 69 67 61 74 69 6f  yboard navigatio
f570: 6e 20 69 73 20 61 6c 6c 20 72 65 6c 61 74 69 76  n is all relativ
f580: 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  e to the current
f590: 20 6e 6f 64 65 0a 20 20 20 20 23 20 73 75 72 6c   node.    # surl
f5a0: 65 73 3a 20 47 65 74 20 74 68 65 20 63 75 72 72  es: Get the curr
f5b0: 65 6e 74 20 6e 6f 64 65 20 66 6f 72 20 73 69 6e  ent node for sin
f5c0: 67 6c 65 20 6f 72 20 6d 75 6c 74 69 70 6c 65 20  gle or multiple 
f5d0: 73 65 6c 65 63 74 69 6f 6e 20 73 63 68 65 6d 61  selection schema
f5e0: 73 2e 0a 20 20 20 20 73 65 74 20 6e 6f 64 65 20  s..    set node 
f5f0: 5b 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 6e 6f  [_get_current_no
f600: 64 65 20 24 77 69 6e 5d 0a 0a 20 20 20 20 73 77  de $win]..    sw
f610: 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 24  itch -exact -- $
f620: 77 68 69 63 68 20 7b 0a 09 22 75 70 22 20 7b 0a  which {.."up" {.
f630: 09 20 20 20 20 23 20 55 70 20 67 6f 65 73 20 74  .    # Up goes t
f640: 6f 20 74 68 65 20 6e 6f 64 65 20 74 68 61 74 20  o the node that 
f650: 69 73 20 76 65 72 74 69 63 61 6c 6c 79 20 61 62  is vertically ab
f660: 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ove the current 
f670: 6e 6f 64 65 0a 09 20 20 20 20 23 20 28 4e 4f 54  node..    # (NOT
f680: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74 68 65   necessarily the
f690: 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 27 73 20   current node's 
f6a0: 70 61 72 65 6e 74 29 0a 09 20 20 20 20 69 66 20  parent)..    if 
f6b0: 7b 20 5b 73 74 72 69 6e 67 20 65 71 75 61 6c 20  { [string equal 
f6c0: 24 6e 6f 64 65 20 22 22 5d 20 7d 20 7b 0a 09 09  $node ""] } {...
f6d0: 72 65 74 75 72 6e 0a 09 20 20 20 20 7d 0a 09 20  return..    }.. 
f6e0: 20 20 20 73 65 74 20 69 6e 64 65 78 20 5b 6c 73     set index [ls
f6f0: 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 6e 6f  earch -exact $no
f700: 64 65 73 20 24 6e 6f 64 65 5d 0a 09 20 20 20 20  des $node]..    
f710: 69 6e 63 72 20 69 6e 64 65 78 20 2d 31 0a 09 20  incr index -1.. 
f720: 20 20 20 69 66 20 7b 20 24 69 6e 64 65 78 20 3e     if { $index >
f730: 3d 20 30 20 7d 20 7b 0a 09 09 24 77 69 6e 20 73  = 0 } {...$win s
f740: 65 6c 65 63 74 69 6f 6e 20 73 65 74 20 5b 6c 69  election set [li
f750: 6e 64 65 78 20 24 6e 6f 64 65 73 20 24 69 6e 64  ndex $nodes $ind
f760: 65 78 5d 0a 09 09 5f 73 65 74 5f 63 75 72 72 65  ex]..._set_curre
f770: 6e 74 5f 6e 6f 64 65 20 24 77 69 6e 20 5b 6c 69  nt_node $win [li
f780: 6e 64 65 78 20 24 6e 6f 64 65 73 20 24 69 6e 64  ndex $nodes $ind
f790: 65 78 5d 0a 09 09 24 77 69 6e 20 73 65 65 20 5b  ex]...$win see [
f7a0: 6c 69 6e 64 65 78 20 24 6e 6f 64 65 73 20 24 69  lindex $nodes $i
f7b0: 6e 64 65 78 5d 0a 09 09 65 76 65 6e 74 20 67 65  ndex]...event ge
f7c0: 6e 65 72 61 74 65 20 24 77 69 6e 20 3c 3c 54 72  nerate $win <<Tr
f7d0: 65 65 53 65 6c 65 63 74 3e 3e 0a 09 09 72 65 74  eeSelect>>...ret
f7e0: 75 72 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 22  urn..    }..}.."
f7f0: 64 6f 77 6e 22 20 7b 0a 09 20 20 20 20 23 20 44  down" {..    # D
f800: 6f 77 6e 20 67 6f 65 73 20 74 6f 20 74 68 65 20  own goes to the 
f810: 6e 6f 64 65 20 74 68 61 74 20 69 73 20 76 65 72  node that is ver
f820: 74 69 63 61 6c 6c 79 20 62 65 6c 6f 77 20 74 68  tically below th
f830: 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 0a 09  e current node..
f840: 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67      if { [string
f850: 20 65 71 75 61 6c 20 24 6e 6f 64 65 20 22 22 5d   equal $node ""]
f860: 20 7d 20 7b 0a 09 09 24 77 69 6e 20 73 65 6c 65   } {...$win sele
f870: 63 74 69 6f 6e 20 73 65 74 20 5b 6c 69 6e 64 65  ction set [linde
f880: 78 20 24 6e 6f 64 65 73 20 30 5d 0a 09 09 5f 73  x $nodes 0]..._s
f890: 65 74 5f 63 75 72 72 65 6e 74 5f 6e 6f 64 65 20  et_current_node 
f8a0: 24 77 69 6e 20 5b 6c 69 6e 64 65 78 20 24 6e 6f  $win [lindex $no
f8b0: 64 65 73 20 30 5d 0a 09 09 24 77 69 6e 20 73 65  des 0]...$win se
f8c0: 65 20 5b 6c 69 6e 64 65 78 20 24 6e 6f 64 65 73  e [lindex $nodes
f8d0: 20 30 5d 0a 09 09 65 76 65 6e 74 20 67 65 6e 65   0]...event gene
f8e0: 72 61 74 65 20 24 77 69 6e 20 3c 3c 54 72 65 65  rate $win <<Tree
f8f0: 53 65 6c 65 63 74 3e 3e 0a 09 09 72 65 74 75 72  Select>>...retur
f900: 6e 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 73  n..    }...    s
f910: 65 74 20 69 6e 64 65 78 20 5b 6c 73 65 61 72 63  et index [lsearc
f920: 68 20 2d 65 78 61 63 74 20 24 6e 6f 64 65 73 20  h -exact $nodes 
f930: 24 6e 6f 64 65 5d 0a 09 20 20 20 20 69 6e 63 72  $node]..    incr
f940: 20 69 6e 64 65 78 0a 09 20 20 20 20 69 66 20 7b   index..    if {
f950: 20 24 69 6e 64 65 78 20 3c 20 5b 6c 6c 65 6e 67   $index < [lleng
f960: 74 68 20 24 6e 6f 64 65 73 5d 20 7d 20 7b 0a 09  th $nodes] } {..
f970: 09 24 77 69 6e 20 73 65 6c 65 63 74 69 6f 6e 20  .$win selection 
f980: 73 65 74 20 5b 6c 69 6e 64 65 78 20 24 6e 6f 64  set [lindex $nod
f990: 65 73 20 24 69 6e 64 65 78 5d 0a 09 09 5f 73 65  es $index]..._se
f9a0: 74 5f 63 75 72 72 65 6e 74 5f 6e 6f 64 65 20 24  t_current_node $
f9b0: 77 69 6e 20 5b 6c 69 6e 64 65 78 20 24 6e 6f 64  win [lindex $nod
f9c0: 65 73 20 24 69 6e 64 65 78 5d 0a 09 09 24 77 69  es $index]...$wi
f9d0: 6e 20 73 65 65 20 5b 6c 69 6e 64 65 78 20 24 6e  n see [lindex $n
f9e0: 6f 64 65 73 20 24 69 6e 64 65 78 5d 0a 09 09 65  odes $index]...e
f9f0: 76 65 6e 74 20 67 65 6e 65 72 61 74 65 20 24 77  vent generate $w
fa00: 69 6e 20 3c 3c 54 72 65 65 53 65 6c 65 63 74 3e  in <<TreeSelect>
fa10: 3e 0a 09 09 72 65 74 75 72 6e 0a 09 20 20 20 20  >...return..    
fa20: 7d 0a 09 7d 0a 09 22 72 69 67 68 74 22 20 7b 0a  }..}.."right" {.
fa30: 09 20 20 20 20 23 20 4f 6e 20 61 20 72 69 67 68  .    # On a righ
fa40: 74 20 61 72 72 6f 77 2c 20 69 66 20 74 68 65 20  t arrow, if the 
fa50: 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 69 73 20  current node is 
fa60: 63 6c 6f 73 65 64 2c 20 6f 70 65 6e 20 69 74 2e  closed, open it.
fa70: 0a 09 20 20 20 20 23 20 49 66 20 74 68 65 20 63  ..    # If the c
fa80: 75 72 72 65 6e 74 20 6e 6f 64 65 20 69 73 20 6f  urrent node is o
fa90: 70 65 6e 2c 20 67 6f 20 74 6f 20 69 74 73 20 66  pen, go to its f
faa0: 69 72 73 74 20 63 68 69 6c 64 0a 09 20 20 20 20  irst child..    
fab0: 69 66 20 7b 20 5b 73 74 72 69 6e 67 20 65 71 75  if { [string equ
fac0: 61 6c 20 24 6e 6f 64 65 20 22 22 5d 20 7d 20 7b  al $node ""] } {
fad0: 0a 09 09 72 65 74 75 72 6e 0a 09 20 20 20 20 7d  ...return..    }
fae0: 0a 09 20 20 20 20 73 65 74 20 6f 70 65 6e 20 5b  ..    set open [
faf0: 24 77 69 6e 20 69 74 65 6d 63 67 65 74 20 24 6e  $win itemcget $n
fb00: 6f 64 65 20 2d 6f 70 65 6e 5d 0a 20 20 20 20 20  ode -open].     
fb10: 20 20 20 20 20 20 20 69 66 20 7b 20 24 6f 70 65         if { $ope
fb20: 6e 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n } {.          
fb30: 20 20 20 20 20 20 69 66 20 7b 20 5b 6c 6c 65 6e        if { [llen
fb40: 67 74 68 20 5b 24 77 69 6e 20 6e 6f 64 65 73 20  gth [$win nodes 
fb50: 24 6e 6f 64 65 5d 5d 20 7d 20 7b 0a 09 09 20 20  $node]] } {...  
fb60: 20 20 73 65 74 20 69 6e 64 65 78 20 5b 6c 73 65    set index [lse
fb70: 61 72 63 68 20 2d 65 78 61 63 74 20 24 6e 6f 64  arch -exact $nod
fb80: 65 73 20 24 6e 6f 64 65 5d 0a 09 09 20 20 20 20  es $node]...    
fb90: 69 6e 63 72 20 69 6e 64 65 78 0a 09 09 20 20 20  incr index...   
fba0: 20 69 66 20 7b 20 24 69 6e 64 65 78 20 3c 20 5b   if { $index < [
fbb0: 6c 6c 65 6e 67 74 68 20 24 6e 6f 64 65 73 5d 20  llength $nodes] 
fbc0: 7d 20 7b 0a 09 09 09 24 77 69 6e 20 73 65 6c 65  } {....$win sele
fbd0: 63 74 69 6f 6e 20 73 65 74 20 5b 6c 69 6e 64 65  ction set [linde
fbe0: 78 20 24 6e 6f 64 65 73 20 24 69 6e 64 65 78 5d  x $nodes $index]
fbf0: 0a 09 09 09 5f 73 65 74 5f 63 75 72 72 65 6e 74  ...._set_current
fc00: 5f 6e 6f 64 65 20 24 77 69 6e 20 5b 6c 69 6e 64  _node $win [lind
fc10: 65 78 20 24 6e 6f 64 65 73 20 24 69 6e 64 65 78  ex $nodes $index
fc20: 5d 0a 09 09 09 24 77 69 6e 20 73 65 65 20 5b 6c  ]....$win see [l
fc30: 69 6e 64 65 78 20 24 6e 6f 64 65 73 20 24 69 6e  index $nodes $in
fc40: 64 65 78 5d 0a 09 09 09 65 76 65 6e 74 20 67 65  dex]....event ge
fc50: 6e 65 72 61 74 65 20 24 77 69 6e 20 3c 3c 54 72  nerate $win <<Tr
fc60: 65 65 53 65 6c 65 63 74 3e 3e 0a 09 09 09 72 65  eeSelect>>....re
fc70: 74 75 72 6e 0a 09 09 20 20 20 20 7d 0a 20 20 20  turn...    }.   
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
fc90: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
fca0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
fcb0: 20 20 20 20 24 77 69 6e 20 69 74 65 6d 63 6f 6e      $win itemcon
fcc0: 66 69 67 75 72 65 20 24 6e 6f 64 65 20 2d 6f 70  figure $node -op
fcd0: 65 6e 20 31 0a 20 20 20 20 20 20 20 20 20 20 20  en 1.           
fce0: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
fcf0: 68 20 5b 73 65 74 20 63 6d 64 20 5b 57 69 64 67  h [set cmd [Widg
fd00: 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 77  et::getoption $w
fd10: 69 6e 20 2d 6f 70 65 6e 63 6d 64 5d 5d 5d 7d 20  in -opencmd]]]} 
fd20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
fd30: 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 5c 23        uplevel \#
fd40: 30 20 24 63 6d 64 20 5b 6c 69 73 74 20 24 6e 6f  0 $cmd [list $no
fd50: 64 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  de].            
fd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
fd70: 20 20 20 20 20 20 72 65 74 75 72 6e 0a 20 20 20        return.   
fd80: 20 20 20 20 20 20 20 20 20 7d 0a 09 7d 0a 09 22           }..}.."
fd90: 6c 65 66 74 22 20 7b 0a 09 20 20 20 20 23 20 4f  left" {..    # O
fda0: 6e 20 61 20 6c 65 66 74 20 61 72 72 6f 77 2c 20  n a left arrow, 
fdb0: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  if the current n
fdc0: 6f 64 65 20 69 73 20 6f 70 65 6e 2c 20 63 6c 6f  ode is open, clo
fdd0: 73 65 20 69 74 2e 0a 09 20 20 20 20 23 20 49 66  se it...    # If
fde0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
fdf0: 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 67 6f 20  e is closed, go 
fe00: 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 09  to its parent...
fe10: 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e 67      if { [string
fe20: 20 65 71 75 61 6c 20 24 6e 6f 64 65 20 22 22 5d   equal $node ""]
fe30: 20 7d 20 7b 0a 09 09 72 65 74 75 72 6e 0a 09 20   } {...return.. 
fe40: 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20 6f 70     }..    set op
fe50: 65 6e 20 5b 24 77 69 6e 20 69 74 65 6d 63 67 65  en [$win itemcge
fe60: 74 20 24 6e 6f 64 65 20 2d 6f 70 65 6e 5d 0a 09  t $node -open]..
fe70: 20 20 20 20 69 66 20 7b 20 24 6f 70 65 6e 20 7d      if { $open }
fe80: 20 7b 0a 09 09 24 77 69 6e 20 69 74 65 6d 63 6f   {...$win itemco
fe90: 6e 66 69 67 75 72 65 20 24 6e 6f 64 65 20 2d 6f  nfigure $node -o
fea0: 70 65 6e 20 30 0a 20 20 20 20 20 20 20 20 20 20  pen 0.          
feb0: 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67        if {[lleng
fec0: 74 68 20 5b 73 65 74 20 63 6d 64 20 5b 57 69 64  th [set cmd [Wid
fed0: 67 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24  get::getoption $
fee0: 77 69 6e 20 2d 63 6c 6f 73 65 63 6d 64 5d 5d 5d  win -closecmd]]]
fef0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
ff00: 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
ff10: 5c 23 30 20 24 63 6d 64 20 5b 6c 69 73 74 20 24  \#0 $cmd [list $
ff20: 6e 6f 64 65 5d 0a 20 20 20 20 20 20 20 20 20 20  node].          
ff30: 20 20 20 20 20 20 7d 0a 09 09 72 65 74 75 72 6e        }...return
ff40: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
ff50: 09 73 65 74 20 70 61 72 65 6e 74 20 5b 24 77 69  .set parent [$wi
ff60: 6e 20 70 61 72 65 6e 74 20 24 6e 6f 64 65 5d 0a  n parent $node].
ff70: 09 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 73  .        if { [s
ff80: 74 72 69 6e 67 20 65 71 75 61 6c 20 24 70 61 72  tring equal $par
ff90: 65 6e 74 20 22 72 6f 6f 74 22 5d 20 7d 20 7b 0a  ent "root"] } {.
ffa0: 09 09 20 20 20 20 73 65 74 20 70 61 72 65 6e 74  ..    set parent
ffb0: 20 24 6e 6f 64 65 0a 20 20 20 20 20 20 20 20 20   $node.         
ffc0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffe0: 20 20 20 20 77 68 69 6c 65 20 7b 20 21 5b 24 77      while { ![$w
fff0: 69 6e 20 69 74 65 6d 63 67 65 74 20 24 70 61 72  in itemcget $par
10000 65 6e 74 20 2d 73 65 6c 65 63 74 61 62 6c 65 5d  ent -selectable]
10010 20 7d 20 7b 0a 09 09 20 20 20 20 20 20 20 20 73   } {...        s
10020 65 74 20 70 61 72 65 6e 74 20 5b 24 77 69 6e 20  et parent [$win 
10030 70 61 72 65 6e 74 20 24 70 61 72 65 6e 74 5d 0a  parent $parent].
10040 09 09 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b  ..        if { [
10050 73 74 72 69 6e 67 20 65 71 75 61 6c 20 24 70 61  string equal $pa
10060 72 65 6e 74 20 22 72 6f 6f 74 22 5d 20 7d 20 7b  rent "root"] } {
10070 0a 09 09 09 20 20 20 20 73 65 74 20 70 61 72 65  ....    set pare
10080 6e 74 20 24 6e 6f 64 65 0a 09 09 09 20 20 20 20  nt $node....    
10090 62 72 65 61 6b 0a 09 09 20 20 20 20 20 20 20 20  break...        
100a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
100b0 20 20 20 20 20 20 7d 0a 09 09 7d 0a 09 09 24 77        }...}...$w
100c0 69 6e 20 73 65 6c 65 63 74 69 6f 6e 20 73 65 74  in selection set
100d0 20 24 70 61 72 65 6e 74 0a 09 09 5f 73 65 74 5f   $parent..._set_
100e0 63 75 72 72 65 6e 74 5f 6e 6f 64 65 20 24 77 69  current_node $wi
100f0 6e 20 24 70 61 72 65 6e 74 0a 09 09 24 77 69 6e  n $parent...$win
10100 20 73 65 65 20 24 70 61 72 65 6e 74 0a 09 09 65   see $parent...e
10110 76 65 6e 74 20 67 65 6e 65 72 61 74 65 20 24 77  vent generate $w
10120 69 6e 20 3c 3c 54 72 65 65 53 65 6c 65 63 74 3e  in <<TreeSelect>
10130 3e 0a 09 09 72 65 74 75 72 6e 0a 09 20 20 20 20  >...return..    
10140 7d 0a 09 7d 0a 09 22 73 70 61 63 65 22 20 7b 0a  }..}.."space" {.
10150 09 20 20 20 20 69 66 20 7b 20 5b 73 74 72 69 6e  .    if { [strin
10160 67 20 65 71 75 61 6c 20 24 6e 6f 64 65 20 22 22  g equal $node ""
10170 5d 20 7d 20 7b 0a 09 09 72 65 74 75 72 6e 0a 09  ] } {...return..
10180 20 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20 6f      }..    set o
10190 70 65 6e 20 5b 24 77 69 6e 20 69 74 65 6d 63 67  pen [$win itemcg
101a0 65 74 20 24 6e 6f 64 65 20 2d 6f 70 65 6e 5d 0a  et $node -open].
101b0 09 20 20 20 20 69 66 20 7b 20 5b 6c 6c 65 6e 67  .    if { [lleng
101c0 74 68 20 5b 24 77 69 6e 20 6e 6f 64 65 73 20 24  th [$win nodes $
101d0 6e 6f 64 65 5d 5d 20 7d 20 7b 0a 0a 09 09 23 20  node]] } {....# 
101e0 54 6f 67 67 6c 65 20 74 68 65 20 6f 70 65 6e 20  Toggle the open 
101f0 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 63 68  status of the ch
10200 6f 73 65 6e 20 6e 6f 64 65 2e 0a 0a 09 09 24 77  osen node.....$w
10210 69 6e 20 69 74 65 6d 63 6f 6e 66 69 67 75 72 65  in itemconfigure
10220 20 24 6e 6f 64 65 20 2d 6f 70 65 6e 20 5b 65 78   $node -open [ex
10230 70 72 20 7b 24 6f 70 65 6e 3f 30 3a 31 7d 5d 0a  pr {$open?0:1}].
10240 0a 09 09 69 66 20 7b 24 6f 70 65 6e 7d 20 7b 0a  ...if {$open} {.
10250 09 09 20 20 20 20 23 20 4e 6f 64 65 20 77 61 73  ..    # Node was
10260 20 6f 70 65 6e 2c 20 69 73 20 6e 6f 77 20 63 6c   open, is now cl
10270 6f 73 65 64 2e 20 43 61 6c 6c 20 74 68 65 20 63  osed. Call the c
10280 6c 6f 73 65 2d 63 6d 64 0a 0a 09 09 20 20 20 20  lose-cmd....    
10290 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 73 65  if {[llength [se
102a0 74 20 63 6d 64 20 5b 57 69 64 67 65 74 3a 3a 67  t cmd [Widget::g
102b0 65 74 6f 70 74 69 6f 6e 20 24 77 69 6e 20 2d 63  etoption $win -c
102c0 6c 6f 73 65 63 6d 64 5d 5d 5d 7d 20 7b 0a 09 09  losecmd]]]} {...
102d0 09 75 70 6c 65 76 65 6c 20 5c 23 30 20 24 63 6d  .uplevel \#0 $cm
102e0 64 20 5b 6c 69 73 74 20 24 6e 6f 64 65 5d 0a 09  d [list $node]..
102f0 09 20 20 20 20 7d 0a 09 09 7d 20 65 6c 73 65 20  .    }...} else 
10300 7b 0a 09 09 20 20 20 20 23 20 4e 6f 64 65 20 77  {...    # Node w
10310 61 73 20 63 6c 6f 73 65 64 2c 20 69 73 20 6e 6f  as closed, is no
10320 77 20 6f 70 65 6e 2e 20 43 61 6c 6c 20 74 68 65  w open. Call the
10330 20 6f 70 65 6e 2d 63 6d 64 0a 0a 09 09 20 20 20   open-cmd....   
10340 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 73   if {[llength [s
10350 65 74 20 63 6d 64 20 5b 57 69 64 67 65 74 3a 3a  et cmd [Widget::
10360 67 65 74 6f 70 74 69 6f 6e 20 24 77 69 6e 20 2d  getoption $win -
10370 6f 70 65 6e 63 6d 64 5d 5d 5d 7d 20 7b 0a 09 09  opencmd]]]} {...
10380 09 75 70 6c 65 76 65 6c 20 5c 23 30 20 24 63 6d  .uplevel \#0 $cm
10390 64 20 5b 6c 69 73 74 20 24 6e 6f 64 65 5d 0a 09  d [list $node]..
103a0 09 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20  .    }.         
103b0 20 20 20 20 20 20 20 7d 0a 09 20 20 20 20 7d 0a         }..    }.
103c0 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  .}.    }.    ret
103d0 75 72 6e 0a 7d 0a 0a 23 20 54 72 65 65 3a 3a 5f  urn.}..# Tree::_
103e0 67 65 74 5f 63 75 72 72 65 6e 74 5f 6e 6f 64 65  get_current_node
103f0 20 2d 2d 0a 23 0a 23 09 47 65 74 20 74 68 65 20   --.#.#.Get the 
10400 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 66 6f 72  current node for
10410 20 65 69 74 68 65 72 20 73 69 6e 67 6c 65 20 6f   either single o
10420 72 20 6d 75 6c 74 69 70 6c 65 0a 23 09 6e 6f 64  r multiple.#.nod
10430 65 20 73 65 6c 65 63 74 69 6f 6e 20 74 72 65 65  e selection tree
10440 73 2e 20 20 49 66 20 74 68 65 20 74 72 65 65 20  s.  If the tree 
10450 61 6c 6c 6f 77 73 20 66 6f 72 20 0a 23 09 6d 75  allows for .#.mu
10460 6c 74 69 70 6c 65 20 73 65 6c 65 63 74 69 6f 6e  ltiple selection
10470 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
10480 73 6f 72 20 6e 6f 64 65 2e 20 20 4f 74 68 65 72  sor node.  Other
10490 77 69 73 65 2c 0a 23 09 69 66 20 74 68 65 72 65  wise,.#.if there
104a0 20 69 73 20 61 20 73 65 6c 65 63 74 69 6f 6e 2c   is a selection,
104b0 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72 73   return the firs
104c0 74 20 6e 6f 64 65 20 69 6e 20 74 68 65 0a 23 09  t node in the.#.
104d0 6c 69 73 74 2e 20 20 49 66 20 74 68 65 72 65 20  list.  If there 
104e0 69 73 20 6e 6f 20 73 65 6c 65 63 74 69 6f 6e 2c  is no selection,
104f0 20 72 65 74 75 72 6e 20 74 68 65 20 72 6f 6f 74   return the root
10500 20 6e 6f 64 65 2e 0a 23 0a 23 20 61 72 67 75 6d   node..#.# argum
10510 65 6e 74 73 3a 0a 23 20 20 20 20 20 20 20 77 69  ents:.#       wi
10520 6e 20 20 20 20 20 20 20 20 6e 61 6d 65 20 6f 66  n        name of
10530 20 74 68 65 20 74 72 65 65 20 77 69 64 67 65 74   the tree widget
10540 0a 23 0a 23 20 52 65 73 75 6c 74 73 3a 0a 23 09  .#.# Results:.#.
10550 54 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  The current node
10560 2e 0a 0a 70 72 6f 63 20 54 72 65 65 3a 3a 5f 67  ...proc Tree::_g
10570 65 74 5f 63 75 72 72 65 6e 74 5f 6e 6f 64 65 20  et_current_node 
10580 7b 77 69 6e 7d 20 7b 0a 20 20 20 20 69 66 20 7b  {win} {.    if {
10590 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 73 65 6c  [info exists sel
105a0 65 63 74 54 72 65 65 3a 3a 73 65 6c 65 63 74 43  ectTree::selectC
105b0 75 72 73 6f 72 28 24 77 69 6e 29 5d 7d 20 7b 0a  ursor($win)]} {.
105c0 09 73 65 74 20 72 65 73 75 6c 74 20 24 73 65 6c  .set result $sel
105d0 65 63 74 54 72 65 65 3a 3a 73 65 6c 65 63 74 43  ectTree::selectC
105e0 75 72 73 6f 72 28 24 77 69 6e 29 0a 20 20 20 20  ursor($win).    
105f0 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 6c 65 6e 67  } elseif {[lleng
10600 74 68 20 5b 73 65 74 20 73 65 6c 4c 69 73 74 20  th [set selList 
10610 5b 24 77 69 6e 20 73 65 6c 65 63 74 69 6f 6e 20  [$win selection 
10620 67 65 74 5d 5d 5d 7d 20 7b 0a 09 73 65 74 20 72  get]]]} {..set r
10630 65 73 75 6c 74 20 5b 6c 69 6e 64 65 78 20 24 73  esult [lindex $s
10640 65 6c 4c 69 73 74 20 30 5d 0a 20 20 20 20 7d 20  elList 0].    } 
10650 65 6c 73 65 20 7b 0a 09 73 65 74 20 72 65 73 75  else {..set resu
10660 6c 74 20 22 22 0a 20 20 20 20 7d 0a 20 20 20 20  lt "".    }.    
10670 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0a 7d  return $result.}
10680 0a 0a 23 20 54 72 65 65 3a 3a 5f 73 65 74 5f 63  ..# Tree::_set_c
10690 75 72 72 65 6e 74 5f 6e 6f 64 65 20 2d 2d 0a 23  urrent_node --.#
106a0 0a 23 09 53 65 74 20 74 68 65 20 63 75 72 72 65  .#.Set the curre
106b0 6e 74 20 6e 6f 64 65 20 66 6f 72 20 65 69 74 68  nt node for eith
106c0 65 72 20 73 69 6e 67 6c 65 20 6f 72 20 6d 75 6c  er single or mul
106d0 74 69 70 6c 65 0a 23 09 6e 6f 64 65 20 73 65 6c  tiple.#.node sel
106e0 65 63 74 69 6f 6e 20 74 72 65 65 73 2e 0a 23 0a  ection trees..#.
106f0 23 20 61 72 67 75 6d 65 6e 74 73 3a 0a 23 20 20  # arguments:.#  
10700 20 20 20 20 20 77 69 6e 20 20 20 20 20 20 20 20       win        
10710 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 72 65 65  Name of the tree
10720 20 77 69 64 67 65 74 0a 23 09 6e 6f 64 65 09 20   widget.#.node. 
10730 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 6e 6f    The current no
10740 64 65 2e 0a 23 0a 23 20 52 65 73 75 6c 74 73 3a  de..#.# Results:
10750 0a 23 09 4e 6f 6e 65 2e 0a 0a 70 72 6f 63 20 54  .#.None...proc T
10760 72 65 65 3a 3a 5f 73 65 74 5f 63 75 72 72 65 6e  ree::_set_curren
10770 74 5f 6e 6f 64 65 20 7b 77 69 6e 20 6e 6f 64 65  t_node {win node
10780 7d 20 7b 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66  } {.    if {[inf
10790 6f 20 65 78 69 73 74 73 20 73 65 6c 65 63 74 54  o exists selectT
107a0 72 65 65 3a 3a 73 65 6c 65 63 74 43 75 72 73 6f  ree::selectCurso
107b0 72 28 24 77 69 6e 29 5d 7d 20 7b 0a 09 73 65 74  r($win)]} {..set
107c0 20 73 65 6c 65 63 74 54 72 65 65 3a 3a 73 65 6c   selectTree::sel
107d0 65 63 74 43 75 72 73 6f 72 28 24 77 69 6e 29 20  ectCursor($win) 
107e0 24 6e 6f 64 65 0a 20 20 20 20 7d 0a 20 20 20 20  $node.    }.    
107f0 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 54 72 65 65  return.}..# Tree
10800 3a 3a 5f 67 65 74 5f 6e 6f 64 65 5f 6e 61 6d 65  ::_get_node_name
10810 20 2d 2d 0a 23 0a 23 09 47 69 76 65 6e 20 61 20   --.#.#.Given a 
10820 63 61 6e 76 61 73 20 69 74 65 6d 2c 20 67 65 74  canvas item, get
10830 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
10840 20 74 72 65 65 20 6e 6f 64 65 20 72 65 70 72 65   tree node repre
10850 73 65 6e 74 65 64 20 62 79 20 74 68 61 74 0a 23  sented by that.#
10860 09 69 74 65 6d 2e 0a 23 0a 23 20 41 72 67 75 6d  .item..#.# Argum
10870 65 6e 74 73 3a 0a 23 09 70 61 74 68 09 09 74 72  ents:.#.path..tr
10880 65 65 20 74 6f 20 71 75 65 72 79 0a 23 09 69 74  ee to query.#.it
10890 65 6d 09 09 4f 70 74 69 6f 6e 61 6c 20 63 61 6e  em..Optional can
108a0 76 61 73 20 69 74 65 6d 20 74 6f 20 65 78 61 6d  vas item to exam
108b0 69 6e 65 3b 20 69 66 20 6f 6d 69 74 74 65 64 2c  ine; if omitted,
108c0 20 0a 23 09 09 09 64 65 66 61 75 6c 74 73 20 74   .#...defaults t
108d0 6f 20 22 63 75 72 72 65 6e 74 22 0a 23 09 74 61  o "current".#.ta
108e0 67 69 6e 64 65 78 09 4f 70 74 69 6f 6e 61 6c 20  gindex.Optional 
108f0 74 61 67 20 69 6e 64 65 78 2c 20 73 69 6e 63 65  tag index, since
10900 20 74 68 65 20 6e 3a 6e 6f 64 65 6e 61 6d 65 20   the n:nodename 
10910 74 61 67 20 69 73 20 6e 6f 74 0a 23 09 09 09 69  tag is not.#...i
10920 6e 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20  n the same spot 
10930 66 6f 72 20 61 6c 6c 20 63 61 6e 76 61 73 20 69  for all canvas i
10940 74 65 6d 73 2e 20 20 49 66 20 6f 6d 69 74 74 65  tems.  If omitte
10950 64 2c 0a 23 09 09 09 64 65 66 61 75 6c 74 73 20  d,.#...defaults 
10960 74 6f 20 22 65 6e 64 2d 31 22 2c 20 73 6f 20 69  to "end-1", so i
10970 74 20 77 6f 72 6b 73 20 77 69 74 68 20 22 63 75  t works with "cu
10980 72 72 65 6e 74 22 20 69 74 65 6d 2e 0a 23 0a 23  rrent" item..#.#
10990 20 52 65 73 75 6c 74 73 3a 0a 23 09 6e 6f 64 65   Results:.#.node
109a0 09 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 72 65  .name of the tre
109b0 65 20 6e 6f 64 65 2e 0a 0a 70 72 6f 63 20 54 72  e node...proc Tr
109c0 65 65 3a 3a 5f 67 65 74 5f 6e 6f 64 65 5f 6e 61  ee::_get_node_na
109d0 6d 65 20 7b 70 61 74 68 20 7b 69 74 65 6d 20 63  me {path {item c
109e0 75 72 72 65 6e 74 7d 20 7b 74 61 67 69 6e 64 65  urrent} {taginde
109f0 78 20 65 6e 64 2d 31 7d 20 7b 74 72 75 65 6e 61  x end-1} {truena
10a00 6d 65 20 30 7d 7d 20 7b 0a 20 20 20 20 73 65 74  me 0}} {.    set
10a10 20 6e 6f 64 65 20 5b 73 74 72 69 6e 67 20 72 61   node [string ra
10a20 6e 67 65 20 5b 6c 69 6e 64 65 78 20 5b 24 70 61  nge [lindex [$pa
10a30 74 68 2e 63 20 67 65 74 74 61 67 73 20 24 69 74  th.c gettags $it
10a40 65 6d 5d 20 24 74 61 67 69 6e 64 65 78 5d 20 32  em] $tagindex] 2
10a50 20 65 6e 64 5d 0a 20 20 20 20 69 66 20 7b 24 74   end].    if {$t
10a60 72 75 65 6e 61 6d 65 7d 20 7b 0a 09 72 65 74 75  ruename} {..retu
10a70 72 6e 20 5b 5f 6e 6f 64 65 5f 6e 61 6d 65 5f 72  rn [_node_name_r
10a80 65 76 20 24 70 61 74 68 20 24 6e 6f 64 65 5d 0a  ev $path $node].
10a90 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
10aa0 20 24 6e 6f 64 65 0a 7d 0a 0a 23 20 54 72 65 65   $node.}..# Tree
10ab0 3a 3a 5f 67 65 74 5f 6e 6f 64 65 5f 70 61 64 78  ::_get_node_padx
10ac0 20 2d 2d 0a 23 0a 23 09 47 69 76 65 6e 20 61 20   --.#.#.Given a 
10ad0 6e 6f 64 65 20 69 6e 20 74 68 65 20 74 72 65 65  node in the tree
10ae0 2c 20 72 65 74 75 72 6e 20 69 74 27 73 20 70 61  , return it's pa
10af0 64 78 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68  dx value.  If th
10b00 65 20 76 61 6c 75 65 20 69 73 0a 23 09 6c 65 73  e value is.#.les
10b10 73 20 74 68 61 6e 20 30 2c 20 64 65 66 61 75 6c  s than 0, defaul
10b20 74 20 74 6f 20 74 68 65 20 70 61 64 78 20 6f 66  t to the padx of
10b30 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 65 65   the entire tree
10b40 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a  ..#.# Arguments:
10b50 0a 23 09 70 61 74 68 09 09 54 72 65 65 20 74 6f  .#.path..Tree to
10b60 20 71 75 65 72 79 0a 23 09 6e 6f 64 65 09 09 4e   query.#.node..N
10b70 6f 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 0a  ode in the tree.
10b80 23 0a 23 20 52 65 73 75 6c 74 73 3a 0a 23 09 70  #.# Results:.#.p
10b90 61 64 78 09 09 54 68 65 20 6e 75 6d 65 72 69 63  adx..The numeric
10ba0 20 70 61 64 78 20 76 61 6c 75 65 0a 70 72 6f 63   padx value.proc
10bb0 20 54 72 65 65 3a 3a 5f 67 65 74 5f 6e 6f 64 65   Tree::_get_node
10bc0 5f 70 61 64 78 20 7b 70 61 74 68 20 6e 6f 64 65  _padx {path node
10bd0 7d 20 7b 0a 20 20 20 20 73 65 74 20 70 61 64 78  } {.    set padx
10be0 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74   [Widget::getopt
10bf0 69 6f 6e 20 24 70 61 74 68 2e 24 6e 6f 64 65 20  ion $path.$node 
10c00 2d 70 61 64 78 5d 0a 20 20 20 20 69 66 20 7b 24  -padx].    if {$
10c10 70 61 64 78 20 3c 20 30 7d 20 7b 20 73 65 74 20  padx < 0} { set 
10c20 70 61 64 78 20 5b 57 69 64 67 65 74 3a 3a 67 65  padx [Widget::ge
10c30 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 20 2d 70  toption $path -p
10c40 61 64 78 5d 20 7d 0a 20 20 20 20 72 65 74 75 72  adx] }.    retur
10c50 6e 20 24 70 61 64 78 0a 7d 0a 0a 23 20 54 72 65  n $padx.}..# Tre
10c60 65 3a 3a 5f 67 65 74 5f 6e 6f 64 65 5f 64 65 6c  e::_get_node_del
10c70 74 61 78 20 2d 2d 0a 23 0a 23 09 47 69 76 65 6e  tax --.#.#.Given
10c80 20 61 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 74   a node in the t
10c90 72 65 65 2c 20 72 65 74 75 72 6e 20 69 74 27 73  ree, return it's
10ca0 20 64 65 6c 74 61 78 20 76 61 6c 75 65 2e 20 20   deltax value.  
10cb0 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 0a  If the value is.
10cc0 23 09 6c 65 73 73 20 74 68 61 6e 20 30 2c 20 64  #.less than 0, d
10cd0 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 64 65  efault to the de
10ce0 6c 74 61 78 20 6f 66 20 74 68 65 20 65 6e 74 69  ltax of the enti
10cf0 72 65 20 74 72 65 65 2e 0a 23 0a 23 20 41 72 67  re tree..#.# Arg
10d00 75 6d 65 6e 74 73 3a 0a 23 09 70 61 74 68 09 09  uments:.#.path..
10d10 54 72 65 65 20 74 6f 20 71 75 65 72 79 0a 23 09  Tree to query.#.
10d20 6e 6f 64 65 09 09 4e 6f 64 65 20 69 6e 20 74 68  node..Node in th
10d30 65 20 74 72 65 65 0a 23 0a 23 20 52 65 73 75 6c  e tree.#.# Resul
10d40 74 73 3a 0a 23 09 64 65 6c 74 61 78 09 09 54 68  ts:.#.deltax..Th
10d50 65 20 6e 75 6d 65 72 69 63 20 64 65 6c 74 61 78  e numeric deltax
10d60 20 76 61 6c 75 65 0a 70 72 6f 63 20 54 72 65 65   value.proc Tree
10d70 3a 3a 5f 67 65 74 5f 6e 6f 64 65 5f 64 65 6c 74  ::_get_node_delt
10d80 61 78 20 7b 70 61 74 68 20 6e 6f 64 65 7d 20 7b  ax {path node} {
10d90 0a 20 20 20 20 73 65 74 20 64 65 6c 74 61 78 20  .    set deltax 
10da0 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69  [Widget::getopti
10db0 6f 6e 20 24 70 61 74 68 2e 24 6e 6f 64 65 20 2d  on $path.$node -
10dc0 64 65 6c 74 61 78 5d 0a 20 20 20 20 69 66 20 7b  deltax].    if {
10dd0 24 64 65 6c 74 61 78 20 3c 20 30 7d 20 7b 20 73  $deltax < 0} { s
10de0 65 74 20 64 65 6c 74 61 78 20 5b 57 69 64 67 65  et deltax [Widge
10df0 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70 61  t::getoption $pa
10e00 74 68 20 2d 64 65 6c 74 61 78 5d 20 7d 0a 20 20  th -deltax] }.  
10e10 20 20 72 65 74 75 72 6e 20 24 64 65 6c 74 61 78    return $deltax
10e20 0a 7d 0a 0a 0a 23 20 54 72 65 65 3a 3a 5f 67 65  .}...# Tree::_ge
10e30 74 5f 6e 6f 64 65 5f 74 61 67 73 20 2d 2d 0a 23  t_node_tags --.#
10e40 0a 23 09 47 69 76 65 6e 20 61 20 6e 6f 64 65 20  .#.Given a node 
10e50 69 6e 20 74 68 65 20 74 72 65 65 2c 20 72 65 74  in the tree, ret
10e60 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 61  urn a list of ta
10e70 67 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 69  gs to apply to i
10e80 74 73 0a 23 20 20 20 20 20 20 20 63 61 6e 76 61  ts.#       canva
10e90 73 20 69 74 65 6d 2e 0a 23 0a 23 20 41 72 67 75  s item..#.# Argu
10ea0 6d 65 6e 74 73 3a 0a 23 09 70 61 74 68 09 09 54  ments:.#.path..T
10eb0 72 65 65 20 74 6f 20 71 75 65 72 79 0a 23 09 6e  ree to query.#.n
10ec0 6f 64 65 09 09 4e 6f 64 65 20 69 6e 20 74 68 65  ode..Node in the
10ed0 20 74 72 65 65 0a 23 09 74 61 67 73 09 09 41 20   tree.#.tags..A 
10ee0 6c 69 73 74 20 6f 66 20 74 61 67 73 20 74 6f 20  list of tags to 
10ef0 61 64 64 20 74 6f 20 74 68 65 20 66 69 6e 61 6c  add to the final
10f00 20 6c 69 73 74 0a 23 0a 23 20 52 65 73 75 6c 74   list.#.# Result
10f10 73 3a 0a 23 09 6c 69 73 74 09 09 54 68 65 20 6c  s:.#.list..The l
10f20 69 73 74 20 6f 66 20 74 61 67 73 20 74 6f 20 61  ist of tags to a
10f30 70 70 6c 79 20 74 6f 20 74 68 65 20 63 61 6e 76  pply to the canv
10f40 61 73 20 69 74 65 6d 0a 70 72 6f 63 20 54 72 65  as item.proc Tre
10f50 65 3a 3a 5f 67 65 74 5f 6e 6f 64 65 5f 74 61 67  e::_get_node_tag
10f60 73 20 7b 70 61 74 68 20 6e 6f 64 65 20 7b 74 61  s {path node {ta
10f70 67 73 20 22 22 7d 7d 20 7b 0a 20 20 20 20 65 76  gs ""}} {.    ev
10f80 61 6c 20 5b 6c 69 6e 73 65 72 74 20 24 74 61 67  al [linsert $tag
10f90 73 20 30 20 6c 61 70 70 65 6e 64 20 6c 69 73 74  s 0 lappend list
10fa0 20 54 72 65 65 49 74 65 6d 53 65 6e 74 69 6e 61   TreeItemSentina
10fb0 6c 5d 0a 20 20 20 20 69 66 20 7b 5b 57 69 64 67  l].    if {[Widg
10fc0 65 74 3a 3a 67 65 74 6f 70 74 69 6f 6e 20 24 70  et::getoption $p
10fd0 61 74 68 2e 24 6e 6f 64 65 20 2d 68 65 6c 70 74  ath.$node -helpt
10fe0 65 78 74 5d 20 3d 3d 20 22 22 20 26 26 0a 20 20  ext] == "" &&.  
10ff0 20 20 20 20 20 20 5b 57 69 64 67 65 74 3a 3a 67        [Widget::g
11000 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 2e 24  etoption $path.$
11010 6e 6f 64 65 20 2d 68 65 6c 70 63 6d 64 5d 20 20  node -helpcmd]  
11020 3d 3d 20 22 22 7d 20 7b 20 72 65 74 75 72 6e 20  == ""} { return 
11030 24 6c 69 73 74 20 7d 0a 0a 20 20 20 20 73 77 69  $list }..    swi
11040 74 63 68 20 2d 2d 20 5b 57 69 64 67 65 74 3a 3a  tch -- [Widget::
11050 67 65 74 6f 70 74 69 6f 6e 20 24 70 61 74 68 2e  getoption $path.
11060 24 6e 6f 64 65 20 2d 68 65 6c 70 74 79 70 65 5d  $node -helptype]
11070 20 7b 0a 09 62 61 6c 6c 6f 6f 6e 20 7b 0a 09 20   {..balloon {.. 
11080 20 20 20 6c 61 70 70 65 6e 64 20 6c 69 73 74 20     lappend list 
11090 42 77 48 65 6c 70 42 61 6c 6c 6f 6f 6e 0a 09 7d  BwHelpBalloon..}
110a0 0a 09 76 61 72 69 61 62 6c 65 20 7b 0a 09 20 20  ..variable {..  
110b0 20 20 6c 61 70 70 65 6e 64 20 6c 69 73 74 20 42    lappend list B
110c0 77 48 65 6c 70 56 61 72 69 61 62 6c 65 0a 09 7d  wHelpVariable..}
110d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
110e0 6e 20 24 6c 69 73 74 0a 7d 0a 0a 23 20 54 72 65  n $list.}..# Tre
110f0 65 3a 3a 5f 73 65 74 5f 68 65 6c 70 20 2d 2d 0a  e::_set_help --.
11100 23 0a 23 09 52 65 67 69 73 74 65 72 20 64 79 6e  #.#.Register dyn
11110 61 6d 69 63 20 68 65 6c 70 20 66 6f 72 20 61 20  amic help for a 
11120 6e 6f 64 65 20 69 6e 20 74 68 65 20 74 72 65 65  node in the tree
11130 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a  ..#.# Arguments:
11140 0a 23 09 70 61 74 68 09 09 54 72 65 65 20 74 6f  .#.path..Tree to
11150 20 71 75 65 72 79 0a 23 09 6e 6f 64 65 09 09 4e   query.#.node..N
11160 6f 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 0a  ode in the tree.
11170 23 20 20 20 20 20 20 20 66 6f 72 63 65 09 09 4f  #       force..O
11180 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74  ptional argument
11190 20 74 6f 20 66 6f 72 63 65 20 61 20 72 65 73 65   to force a rese
111a0 74 20 6f 66 20 74 68 65 20 68 65 6c 70 0a 23 0a  t of the help.#.
111b0 23 20 52 65 73 75 6c 74 73 3a 0a 23 09 6e 6f 6e  # Results:.#.non
111c0 65 0a 70 72 6f 63 20 54 72 65 65 3a 3a 5f 73 65  e.proc Tree::_se
111d0 74 5f 68 65 6c 70 20 7b 20 70 61 74 68 20 6e 6f  t_help { path no
111e0 64 65 20 7d 20 7b 0a 20 20 20 20 57 69 64 67 65  de } {.    Widge
111f0 74 3a 3a 67 65 74 56 61 72 69 61 62 6c 65 20 24  t::getVariable $
11200 70 61 74 68 20 68 65 6c 70 0a 0a 20 20 20 20 73  path help..    s
11210 65 74 20 69 74 65 6d 20 24 70 61 74 68 2e 24 6e  et item $path.$n
11220 6f 64 65 0a 20 20 20 20 73 65 74 20 6f 70 74 73  ode.    set opts
11230 20 5b 6c 69 73 74 20 2d 68 65 6c 70 74 79 70 65   [list -helptype
11240 20 2d 68 65 6c 70 74 65 78 74 20 2d 68 65 6c 70   -helptext -help
11250 76 61 72 20 2d 68 65 6c 70 63 6d 64 5d 0a 20 20  var -helpcmd].  
11260 20 20 66 6f 72 65 61 63 68 20 7b 63 74 79 20 63    foreach {cty c
11270 74 78 20 63 76 20 63 63 7d 20 5b 65 76 61 6c 20  tx cv cc} [eval 
11280 5b 6c 69 6e 73 65 72 74 20 24 6f 70 74 73 20 30  [linsert $opts 0
11290 20 57 69 64 67 65 74 3a 3a 68 61 73 43 68 61 6e   Widget::hasChan
112a0 67 65 64 58 20 24 69 74 65 6d 5d 5d 20 62 72 65  gedX $item]] bre
112b0 61 6b 0a 20 20 20 20 73 65 74 20 74 65 78 74 20  ak.    set text 
112c0 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74 69  [Widget::getopti
112d0 6f 6e 20 24 69 74 65 6d 20 2d 68 65 6c 70 74 65  on $item -helpte
112e0 78 74 5d 0a 20 20 20 20 73 65 74 20 63 6d 64 20  xt].    set cmd 
112f0 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70 74   [Widget::getopt
11300 69 6f 6e 20 24 69 74 65 6d 20 2d 68 65 6c 70 63  ion $item -helpc
11310 6d 64 5d 0a 0a 20 20 20 20 23 23 20 49 66 20 77  md]..    ## If w
11320 65 27 76 65 20 6e 65 76 65 72 20 73 65 74 20 68  e've never set h
11330 65 6c 70 20 66 6f 72 20 74 68 69 73 20 69 74 65  elp for this ite
11340 6d 20 62 65 66 6f 72 65 2c 20 61 6e 64 20 74 65  m before, and te
11350 78 74 20 6f 72 20 63 6d 64 20 69 73 20 6e 6f 74  xt or cmd is not
11360 0a 20 20 20 20 23 23 20 62 6c 61 6e 6b 2c 20 77  .    ## blank, w
11370 65 20 6e 65 65 64 20 74 6f 20 73 65 74 75 70 20  e need to setup 
11380 68 65 6c 70 2e 20 57 65 20 61 6c 73 6f 20 6e 65  help. We also ne
11390 65 64 20 74 6f 20 72 65 73 65 74 20 68 65 6c 70  ed to reset help
113a0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 0a 20   if any of the. 
113b0 20 20 20 23 23 20 6f 70 74 69 6f 6e 73 20 68 61     ## options ha
113c0 76 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20  ve changed..    
113d0 69 66 20 7b 20 28 21 5b 69 6e 66 6f 20 65 78 69  if { (![info exi
113e0 73 74 73 20 68 65 6c 70 28 24 6e 6f 64 65 29 5d  sts help($node)]
113f0 20 26 26 20 28 24 74 65 78 74 20 21 3d 20 22 22   && ($text != ""
11400 20 7c 7c 20 24 63 6d 64 20 21 3d 20 22 22 29 29   || $cmd != ""))
11410 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 24 63 74  .         || $ct
11420 79 20 7c 7c 20 24 63 74 78 20 7c 7c 20 24 63 76  y || $ctx || $cv
11430 20 7d 20 7b 0a 09 73 65 74 20 68 65 6c 70 28 24   } {..set help($
11440 6e 6f 64 65 29 20 31 0a 09 73 65 74 20 74 79 70  node) 1..set typ
11450 65 20 5b 57 69 64 67 65 74 3a 3a 67 65 74 6f 70  e [Widget::getop
11460 74 69 6f 6e 20 24 69 74 65 6d 20 2d 68 65 6c 70  tion $item -help
11470 74 79 70 65 5d 0a 20 20 20 20 20 20 20 20 73 65  type].        se
11480 74 20 76 61 72 20 5b 57 69 64 67 65 74 3a 3a 67  t var [Widget::g
11490 65 74 6f 70 74 69 6f 6e 20 24 69 74 65 6d 20 2d  etoption $item -
114a0 68 65 6c 70 76 61 72 5d 0a 20 20 20 20 20 20 20  helpvar].       
114b0 20 44 79 6e 61 6d 69 63 48 65 6c 70 3a 3a 61 64   DynamicHelp::ad
114c0 64 20 24 70 61 74 68 2e 63 20 2d 69 74 65 6d 20  d $path.c -item 
114d0 6e 3a 24 6e 6f 64 65 20 2d 74 79 70 65 20 24 74  n:$node -type $t
114e0 79 70 65 20 2d 74 65 78 74 20 24 74 65 78 74 20  ype -text $text 
114f0 2d 76 61 72 69 61 62 6c 65 20 24 76 61 72 20 2d  -variable $var -
11500 63 6f 6d 6d 61 6e 64 20 24 63 6d 64 0a 20 20 20  command $cmd.   
11510 20 20 20 20 20 44 79 6e 61 6d 69 63 48 65 6c 70       DynamicHelp
11520 3a 3a 61 64 64 20 24 70 61 74 68 2e 63 20 2d 69  ::add $path.c -i
11530 74 65 6d 20 69 3a 24 6e 6f 64 65 20 2d 74 79 70  tem i:$node -typ
11540 65 20 24 74 79 70 65 20 2d 74 65 78 74 20 24 74  e $type -text $t
11550 65 78 74 20 2d 76 61 72 69 61 62 6c 65 20 24 76  ext -variable $v
11560 61 72 20 2d 63 6f 6d 6d 61 6e 64 20 24 63 6d 64  ar -command $cmd
11570 0a 20 20 20 20 20 20 20 20 44 79 6e 61 6d 69 63  .        Dynamic
11580 48 65 6c 70 3a 3a 61 64 64 20 24 70 61 74 68 2e  Help::add $path.
11590 63 20 2d 69 74 65 6d 20 62 3a 24 6e 6f 64 65 20  c -item b:$node 
115a0 2d 74 79 70 65 20 24 74 79 70 65 20 2d 74 65 78  -type $type -tex
115b0 74 20 24 74 65 78 74 20 2d 76 61 72 69 61 62 6c  t $text -variabl
115c0 65 20 24 76 61 72 20 2d 63 6f 6d 6d 61 6e 64 20  e $var -command 
115d0 24 63 6d 64 0a 20 20 20 20 7d 0a 7d 0a 0a 70 72  $cmd.    }.}..pr
115e0 6f 63 20 54 72 65 65 3a 3a 5f 6d 6f 75 73 65 5f  oc Tree::_mouse_
115f0 73 65 6c 65 63 74 20 7b 20 70 61 74 68 20 63 6d  select { path cm
11600 64 20 61 72 67 73 20 7d 20 7b 0a 20 20 20 20 65  d args } {.    e
11610 76 61 6c 20 5b 6c 69 6e 73 65 72 74 20 24 61 72  val [linsert $ar
11620 67 73 20 30 20 73 65 6c 65 63 74 69 6f 6e 20 24  gs 0 selection $
11630 70 61 74 68 20 24 63 6d 64 5d 0a 20 20 20 20 73  path $cmd].    s
11640 77 69 74 63 68 20 2d 2d 20 24 63 6d 64 20 7b 0a  witch -- $cmd {.
11650 20 20 20 20 20 20 20 20 22 61 64 64 22 20 2d 20          "add" - 
11660 22 63 6c 65 61 72 22 20 2d 20 22 72 65 6d 6f 76  "clear" - "remov
11670 65 22 20 2d 20 22 73 65 74 22 20 2d 20 22 74 6f  e" - "set" - "to
11680 67 67 6c 65 22 20 7b 0a 20 20 20 20 20 20 20 20  ggle" {.        
11690 20 20 20 20 65 76 65 6e 74 20 67 65 6e 65 72 61      event genera
116a0 74 65 20 24 70 61 74 68 20 3c 3c 54 72 65 65 53  te $path <<TreeS
116b0 65 6c 65 63 74 3e 3e 0a 20 20 20 20 20 20 20 20  elect>>.        
116c0 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20  }.    }.}..proc 
116d0 54 72 65 65 3a 3a 5f 6e 6f 64 65 5f 6e 61 6d 65  Tree::_node_name
116e0 20 7b 20 70 61 74 68 20 6e 6f 64 65 20 7d 20 7b   { path node } {
116f0 0a 20 20 20 20 23 20 4d 61 6b 65 20 73 75 72 65  .    # Make sure
11700 20 6e 6f 64 65 20 6e 61 6d 65 73 20 61 72 65 20   node names are 
11710 73 61 66 65 20 61 73 20 74 61 67 73 20 61 6e 64  safe as tags and
11720 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 73 0a   variable names.
11730 20 20 20 20 73 65 74 20 6d 61 70 20 5b 6c 69 73      set map [lis
11740 74 20 26 20 5c 31 20 7c 20 5c 32 20 5e 20 5c 33  t & \1 | \2 ^ \3
11750 20 21 20 5c 34 20 3a 3a 20 5c 35 5d 0a 20 20 20   ! \4 :: \5].   
11760 20 72 65 74 75 72 6e 20 20 5b 73 74 72 69 6e 67   return  [string
11770 20 6d 61 70 20 24 6d 61 70 20 24 6e 6f 64 65 5d   map $map $node]
11780 0a 7d 0a 0a 70 72 6f 63 20 54 72 65 65 3a 3a 5f  .}..proc Tree::_
11790 6e 6f 64 65 5f 6e 61 6d 65 5f 72 65 76 20 7b 20  node_name_rev { 
117a0 70 61 74 68 20 6e 6f 64 65 20 7d 20 7b 0a 20 20  path node } {.  
117b0 20 20 23 20 41 6c 6c 6f 77 20 72 65 76 65 72 73    # Allow revers
117c0 65 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e  e interpretation
117d0 20 6f 66 20 6e 6f 64 65 20 6e 61 6d 65 73 0a 20   of node names. 
117e0 20 20 20 73 65 74 20 6d 61 70 20 5b 6c 69 73 74     set map [list
117f0 20 5c 31 20 26 20 5c 32 20 7c 20 5c 33 20 5e 20   \1 & \2 | \3 ^ 
11800 5c 34 20 21 20 5c 35 20 3a 3a 5d 0a 20 20 20 20  \4 ! \5 ::].    
11810 72 65 74 75 72 6e 20 20 5b 73 74 72 69 6e 67 20  return  [string 
11820 6d 61 70 20 24 6d 61 70 20 24 6e 6f 64 65 5d 0a  map $map $node].
11830 7d 0a 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...# ----------
11840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11880 2d 2d 0a 23 20 20 43 6f 6d 6d 61 6e 64 20 54 72  --.#  Command Tr
11890 65 65 3a 3a 5f 64 65 73 74 72 6f 79 0a 23 20 2d  ee::_destroy.# -
118a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 70 72 6f 63  -----------.proc
118f0 20 54 72 65 65 3a 3a 5f 64 65 73 74 72 6f 79 20   Tree::_destroy 
11900 7b 20 70 61 74 68 20 7d 20 7b 0a 20 20 20 20 76  { path } {.    v
11910 61 72 69 61 62 6c 65 20 24 70 61 74 68 0a 20 20  ariable $path.  
11920 20 20 75 70 76 61 72 20 30 20 20 24 70 61 74 68    upvar 0  $path
11930 20 64 61 74 61 0a 0a 20 20 20 20 69 66 20 7b 20   data..    if { 
11940 24 64 61 74 61 28 75 70 64 2c 61 66 74 65 72 69  $data(upd,afteri
11950 64 29 20 21 3d 20 22 22 20 7d 20 7b 0a 20 20 20  d) != "" } {.   
11960 20 20 20 20 20 61 66 74 65 72 20 63 61 6e 63 65       after cance
11970 6c 20 24 64 61 74 61 28 75 70 64 2c 61 66 74 65  l $data(upd,afte
11980 72 69 64 29 0a 20 20 20 20 7d 0a 20 20 20 20 69  rid).    }.    i
11990 66 20 7b 20 24 64 61 74 61 28 64 6e 64 2c 61 66  f { $data(dnd,af
119a0 74 65 72 69 64 29 20 21 3d 20 22 22 20 7d 20 7b  terid) != "" } {
119b0 0a 20 20 20 20 20 20 20 20 61 66 74 65 72 20 63  .        after c
119c0 61 6e 63 65 6c 20 24 64 61 74 61 28 64 6e 64 2c  ancel $data(dnd,
119d0 61 66 74 65 72 69 64 29 0a 20 20 20 20 7d 0a 20  afterid).    }. 
119e0 20 20 20 5f 73 75 62 64 65 6c 65 74 65 20 24 70     _subdelete $p
119f0 61 74 68 20 5b 6c 72 61 6e 67 65 20 24 64 61 74  ath [lrange $dat
11a00 61 28 72 6f 6f 74 29 20 31 20 65 6e 64 5d 0a 20  a(root) 1 end]. 
11a10 20 20 20 57 69 64 67 65 74 3a 3a 64 65 73 74 72     Widget::destr
11a20 6f 79 20 24 70 61 74 68 0a 20 20 20 20 75 6e 73  oy $path.    uns
11a30 65 74 20 64 61 74 61 0a 7d 0a                    et data.}.