/ Hex Artifact Content
Login

Artifact eea6224b3553599ae665b239bd827e182b466024:


0000: 0a 6c 6f 61 64 20 2e 2f 6c 69 62 73 71 6c 69 74  .load ./libsqlit
0010: 65 33 2e 64 79 6c 69 62 0a 23 70 61 63 6b 61 67  e3.dylib.#packag
0020: 65 20 72 65 71 75 69 72 65 20 73 71 6c 69 74 65  e require sqlite
0030: 33 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a  3.source [file j
0040: 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  oin [file dirnam
0050: 65 20 24 61 72 67 76 30 5d 20 72 74 72 65 65 5f  e $argv0] rtree_
0060: 75 74 69 6c 2e 74 63 6c 5d 0a 0a 77 6d 20 74 69  util.tcl]..wm ti
0070: 74 6c 65 20 2e 20 22 53 51 4c 69 74 65 20 72 2d  tle . "SQLite r-
0080: 74 72 65 65 20 76 69 65 77 65 72 22 0a 0a 69 66  tree viewer"..if
0090: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 76   {[llength $argv
00a0: 5d 21 3d 31 7d 20 7b 0a 20 20 70 75 74 73 20 73  ]!=1} {.  puts s
00b0: 74 64 65 72 72 20 22 55 73 61 67 65 3a 20 24 61  tderr "Usage: $a
00c0: 72 67 76 30 20 3c 64 61 74 61 62 61 73 65 2d 66  rgv0 <database-f
00d0: 69 6c 65 3e 22 0a 20 20 70 75 74 73 20 73 74 64  ile>".  puts std
00e0: 65 72 72 20 22 22 0a 20 20 65 78 69 74 0a 7d 0a  err "".  exit.}.
00f0: 73 71 6c 69 74 65 33 20 64 62 20 5b 6c 69 6e 64  sqlite3 db [lind
0100: 65 78 20 24 61 72 67 76 20 30 5d 0a 0a 63 61 6e  ex $argv 0]..can
0110: 76 61 73 20 2e 63 20 2d 62 61 63 6b 67 72 6f 75  vas .c -backgrou
0120: 6e 64 20 77 68 69 74 65 20 2d 77 69 64 74 68 20  nd white -width 
0130: 34 30 30 20 2d 68 65 69 67 68 74 20 33 30 30 20  400 -height 300 
0140: 2d 68 69 67 68 6c 69 67 68 74 74 68 69 63 6b 6e  -highlightthickn
0150: 65 73 73 20 30 0a 0a 62 75 74 74 6f 6e 20 2e 62  ess 0..button .b
0160: 20 2d 74 65 78 74 20 22 50 61 72 65 6e 74 20 4e   -text "Parent N
0170: 6f 64 65 22 20 2d 63 6f 6d 6d 61 6e 64 20 7b 0a  ode" -command {.
0180: 20 20 73 65 74 20 73 71 6c 20 22 53 45 4c 45 43    set sql "SELEC
0190: 54 20 70 61 72 65 6e 74 6e 6f 64 65 20 46 52 4f  T parentnode FRO
01a0: 4d 20 24 3a 3a 4f 28 7a 54 61 62 29 5f 70 61 72  M $::O(zTab)_par
01b0: 65 6e 74 20 57 48 45 52 45 20 6e 6f 64 65 6e 6f  ent WHERE nodeno
01c0: 20 3d 20 24 3a 3a 4f 28 69 4e 6f 64 65 29 22 0a   = $::O(iNode)".
01d0: 20 20 73 65 74 20 3a 3a 4f 28 69 4e 6f 64 65 29    set ::O(iNode)
01e0: 20 5b 64 62 20 6f 6e 65 20 24 73 71 6c 5d 0a 20   [db one $sql]. 
01f0: 20 69 66 20 7b 24 3a 3a 4f 28 69 4e 6f 64 65 29   if {$::O(iNode)
0200: 20 65 71 20 22 22 7d 20 7b 73 65 74 20 3a 3a 4f   eq ""} {set ::O
0210: 28 69 4e 6f 64 65 29 20 31 7d 0a 20 20 76 69 65  (iNode) 1}.  vie
0220: 77 5f 6e 6f 64 65 0a 7d 0a 0a 73 65 74 20 4f 28  w_node.}..set O(
0230: 69 4e 6f 64 65 29 20 31 0a 73 65 74 20 4f 28 7a  iNode) 1.set O(z
0240: 54 61 62 29 20 22 22 0a 73 65 74 20 4f 28 6c 69  Tab) "".set O(li
0250: 73 74 62 6f 78 5f 63 61 70 74 69 6f 6e 73 29 20  stbox_captions) 
0260: 20 5b 6c 69 73 74 5d 0a 73 65 74 20 4f 28 6c 69   [list].set O(li
0270: 73 74 62 6f 78 5f 69 74 65 6d 6d 61 70 29 20 20  stbox_itemmap)  
0280: 20 5b 6c 69 73 74 5d 0a 73 65 74 20 4f 28 6c 69   [list].set O(li
0290: 73 74 62 6f 78 5f 68 69 67 68 6c 69 67 68 74 29  stbox_highlight)
02a0: 20 2d 31 0a 0a 6c 69 73 74 62 6f 78 20 20 20 2e   -1..listbox   .
02b0: 6c 20 2d 6c 69 73 74 76 61 72 69 61 62 6c 65 20  l -listvariable 
02c0: 3a 3a 4f 28 6c 69 73 74 62 6f 78 5f 63 61 70 74  ::O(listbox_capt
02d0: 69 6f 6e 73 29 20 2d 79 73 63 72 6f 6c 6c 63 6f  ions) -yscrollco
02e0: 6d 6d 61 6e 64 20 7b 2e 6c 73 20 73 65 74 7d 0a  mmand {.ls set}.
02f0: 73 63 72 6f 6c 6c 62 61 72 20 2e 6c 73 20 2d 63  scrollbar .ls -c
0300: 6f 6d 6d 61 6e 64 20 7b 2e 6c 20 79 76 69 65 77  ommand {.l yview
0310: 7d 0a 6c 61 62 65 6c 20 20 20 20 20 2e 73 74 61  }.label     .sta
0320: 74 75 73 20 2d 66 6f 6e 74 20 63 6f 75 72 69 65  tus -font courie
0330: 72 20 2d 61 6e 63 68 6f 72 20 77 0a 6c 61 62 65  r -anchor w.labe
0340: 6c 20 20 20 20 20 2e 74 69 74 6c 65 20 2d 61 6e  l     .title -an
0350: 63 68 6f 72 20 77 20 2d 74 65 78 74 20 22 4e 6f  chor w -text "No
0360: 64 65 20 31 3a 22 20 2d 62 61 63 6b 67 72 6f 75  de 1:" -backgrou
0370: 6e 64 20 77 68 69 74 65 20 2d 62 6f 72 64 65 72  nd white -border
0380: 77 69 64 74 68 20 30 0a 0a 0a 73 65 74 20 72 74  width 0...set rt
0390: 72 65 65 5f 74 61 62 6c 65 73 20 5b 6c 69 73 74  ree_tables [list
03a0: 5d 0a 64 62 20 65 76 61 6c 20 7b 0a 20 20 53 45  ].db eval {.  SE
03b0: 4c 45 43 54 20 6e 61 6d 65 20 0a 20 20 46 52 4f  LECT name .  FRO
03c0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
03d0: 0a 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  .  WHERE type='t
03e0: 61 62 6c 65 27 20 41 4e 44 20 73 71 6c 20 4c 49  able' AND sql LI
03f0: 4b 45 20 27 25 76 69 72 74 75 61 6c 25 74 61 62  KE '%virtual%tab
0400: 6c 65 25 75 73 69 6e 67 25 72 74 72 65 65 25 27  le%using%rtree%'
0410: 0a 7d 20 7b 0a 20 20 73 65 74 20 6e 43 6f 6c 20  .} {.  set nCol 
0420: 5b 65 78 70 72 20 5b 6c 6c 65 6e 67 74 68 20 5b  [expr [llength [
0430: 64 62 20 65 76 61 6c 20 22 70 72 61 67 6d 61 20  db eval "pragma 
0440: 74 61 62 6c 65 5f 69 6e 66 6f 28 24 6e 61 6d 65  table_info($name
0450: 29 22 5d 5d 2f 36 5d 0a 20 20 69 66 20 7b 24 6e  )"]]/6].  if {$n
0460: 43 6f 6c 20 21 3d 20 35 7d 20 7b 0a 20 20 20 20  Col != 5} {.    
0470: 70 75 74 73 20 73 74 64 65 72 72 20 22 4e 6f 74  puts stderr "Not
0480: 20 76 69 65 77 69 6e 67 20 24 6e 61 6d 65 20 2d   viewing $name -
0490: 20 69 73 20 6e 6f 74 20 32 2d 64 69 6d 65 6e 73   is not 2-dimens
04a0: 69 6f 6e 61 6c 22 0a 20 20 7d 20 65 6c 73 65 20  ional".  } else 
04b0: 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 74  {.    lappend rt
04c0: 72 65 65 5f 74 61 62 6c 65 73 20 5b 6c 69 73 74  ree_tables [list
04d0: 20 54 61 62 6c 65 20 24 6e 61 6d 65 5d 0a 20 20   Table $name].  
04e0: 7d 0a 7d 0a 69 66 20 7b 24 72 74 72 65 65 5f 74  }.}.if {$rtree_t
04f0: 61 62 6c 65 73 20 65 71 20 22 22 7d 20 7b 0a 20  ables eq ""} {. 
0500: 20 70 75 74 73 20 73 74 64 65 72 72 20 22 43 61   puts stderr "Ca
0510: 6e 6e 6f 74 20 66 69 6e 64 20 61 6e 20 72 2d 74  nnot find an r-t
0520: 72 65 65 20 74 61 62 6c 65 20 69 6e 20 64 61 74  ree table in dat
0530: 61 62 61 73 65 20 5b 6c 69 6e 64 65 78 20 24 61  abase [lindex $a
0540: 72 67 76 20 30 5d 22 0a 20 20 70 75 74 73 20 73  rgv 0]".  puts s
0550: 74 64 65 72 72 20 22 22 0a 20 20 65 78 69 74 0a  tderr "".  exit.
0560: 7d 0a 65 76 61 6c 20 74 6b 5f 6f 70 74 69 6f 6e  }.eval tk_option
0570: 4d 65 6e 75 20 2e 73 65 6c 65 63 74 20 6f 70 74  Menu .select opt
0580: 69 6f 6e 5f 76 61 72 20 24 72 74 72 65 65 5f 74  ion_var $rtree_t
0590: 61 62 6c 65 73 0a 74 72 61 63 65 20 61 64 64 20  ables.trace add 
05a0: 76 61 72 69 61 62 6c 65 20 6f 70 74 69 6f 6e 5f  variable option_
05b0: 76 61 72 20 77 72 69 74 65 20 73 65 74 5f 6f 70  var write set_op
05c0: 74 69 6f 6e 5f 76 61 72 0a 70 72 6f 63 20 73 65  tion_var.proc se
05d0: 74 5f 6f 70 74 69 6f 6e 5f 76 61 72 20 7b 61 72  t_option_var {ar
05e0: 67 73 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 4f 28  gs} {.  set ::O(
05f0: 7a 54 61 62 29 20 5b 6c 69 6e 64 65 78 20 24 3a  zTab) [lindex $:
0600: 3a 6f 70 74 69 6f 6e 5f 76 61 72 20 31 5d 0a 20  :option_var 1]. 
0610: 20 73 65 74 20 3a 3a 4f 28 69 4e 6f 64 65 29 20   set ::O(iNode) 
0620: 31 0a 20 20 76 69 65 77 5f 6e 6f 64 65 0a 7d 0a  1.  view_node.}.
0630: 73 65 74 20 3a 3a 4f 28 7a 54 61 62 29 20 5b 6c  set ::O(zTab) [l
0640: 69 6e 64 65 78 20 24 3a 3a 72 74 72 65 65 5f 74  index $::rtree_t
0650: 61 62 6c 65 73 20 30 20 31 5d 0a 0a 62 69 6e 64  ables 0 1]..bind
0660: 20 2e 6c 20 3c 31 3e 20 7b 6c 69 73 74 62 6f 78   .l <1> {listbox
0670: 5f 63 6c 69 63 6b 20 5b 2e 6c 20 6e 65 61 72 65  _click [.l neare
0680: 73 74 20 25 79 5d 7d 0a 62 69 6e 64 20 2e 6c 20  st %y]}.bind .l 
0690: 3c 4d 6f 74 69 6f 6e 3e 20 7b 6c 69 73 74 62 6f  <Motion> {listbo
06a0: 78 5f 6d 6f 75 73 65 6f 76 65 72 20 5b 2e 6c 20  x_mouseover [.l 
06b0: 6e 65 61 72 65 73 74 20 25 79 5d 7d 0a 62 69 6e  nearest %y]}.bin
06c0: 64 20 2e 6c 20 3c 4c 65 61 76 65 3e 20 20 7b 6c  d .l <Leave>  {l
06d0: 69 73 74 62 6f 78 5f 6d 6f 75 73 65 6f 76 65 72  istbox_mouseover
06e0: 20 2d 31 7d 0a 0a 70 72 6f 63 20 6c 69 73 74 62   -1}..proc listb
06f0: 6f 78 5f 63 6c 69 63 6b 20 7b 73 65 6c 7d 20 7b  ox_click {sel} {
0700: 0a 20 20 69 66 20 7b 24 73 65 6c 20 6e 65 20 22  .  if {$sel ne "
0710: 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 4f  "} {.    set ::O
0720: 28 69 4e 6f 64 65 29 20 5b 6c 69 6e 64 65 78 20  (iNode) [lindex 
0730: 24 3a 3a 4f 28 6c 69 73 74 62 6f 78 5f 63 61 70  $::O(listbox_cap
0740: 74 69 6f 6e 73 29 20 24 73 65 6c 20 31 5d 0a 20  tions) $sel 1]. 
0750: 20 20 20 76 69 65 77 5f 6e 6f 64 65 0a 20 20 7d     view_node.  }
0760: 0a 7d 0a 70 72 6f 63 20 6c 69 73 74 62 6f 78 5f  .}.proc listbox_
0770: 6d 6f 75 73 65 6f 76 65 72 20 7b 69 7d 20 7b 0a  mouseover {i} {.
0780: 20 20 73 65 74 20 6f 6c 64 69 64 20 5b 6c 69 6e    set oldid [lin
0790: 64 65 78 20 24 3a 3a 4f 28 6c 69 73 74 62 6f 78  dex $::O(listbox
07a0: 5f 69 74 65 6d 6d 61 70 29 20 24 3a 3a 4f 28 6c  _itemmap) $::O(l
07b0: 69 73 74 62 6f 78 5f 68 69 67 68 6c 69 67 68 74  istbox_highlight
07c0: 29 5d 0a 20 20 2e 63 20 69 74 65 6d 63 6f 6e 66  )].  .c itemconf
07d0: 69 67 75 72 65 20 24 6f 6c 64 69 64 20 2d 66 69  igure $oldid -fi
07e0: 6c 6c 20 22 22 0a 0a 20 20 2e 6c 20 73 65 6c 65  ll ""..  .l sele
07f0: 63 74 69 6f 6e 20 63 6c 65 61 72 20 30 20 65 6e  ction clear 0 en
0800: 64 0a 20 20 2e 73 74 61 74 75 73 20 63 6f 6e 66  d.  .status conf
0810: 69 67 75 72 65 20 2d 74 65 78 74 20 22 22 0a 20  igure -text "". 
0820: 20 69 66 20 7b 24 69 3e 3d 30 7d 20 7b 0a 20 20   if {$i>=0} {.  
0830: 20 20 73 65 74 20 69 64 20 5b 6c 69 6e 64 65 78    set id [lindex
0840: 20 24 3a 3a 4f 28 6c 69 73 74 62 6f 78 5f 69 74   $::O(listbox_it
0850: 65 6d 6d 61 70 29 20 24 69 5d 0a 20 20 20 20 2e  emmap) $i].    .
0860: 63 20 69 74 65 6d 63 6f 6e 66 69 67 75 72 65 20  c itemconfigure 
0870: 24 69 64 20 2d 66 69 6c 6c 20 67 72 65 79 0a 20  $id -fill grey. 
0880: 20 20 20 2e 63 20 6c 6f 77 65 72 20 24 69 64 0a     .c lower $id.
0890: 20 20 20 20 73 65 74 20 3a 3a 4f 28 6c 69 73 74      set ::O(list
08a0: 62 6f 78 5f 68 69 67 68 6c 69 67 68 74 29 20 24  box_highlight) $
08b0: 69 0a 20 20 20 20 2e 6c 20 73 65 6c 65 63 74 69  i.    .l selecti
08c0: 6f 6e 20 73 65 74 20 24 69 0a 20 20 20 20 2e 73  on set $i.    .s
08d0: 74 61 74 75 73 20 63 6f 6e 66 69 67 75 72 65 20  tatus configure 
08e0: 2d 74 65 78 74 20 5b 63 65 6c 6c 5f 72 65 70 6f  -text [cell_repo
08f0: 72 74 20 64 62 20 24 3a 3a 4f 28 7a 54 61 62 29  rt db $::O(zTab)
0900: 20 24 3a 3a 4f 28 69 4e 6f 64 65 29 20 24 69 5d   $::O(iNode) $i]
0910: 0a 20 20 7d 0a 7d 0a 0a 67 72 69 64 20 63 6f 6e  .  }.}..grid con
0920: 66 69 67 75 72 65 20 2e 73 65 6c 65 63 74 20 20  figure .select  
0930: 2d 72 6f 77 20 30 20 2d 63 6f 6c 75 6d 6e 20 30  -row 0 -column 0
0940: 20 2d 63 6f 6c 75 6d 6e 73 70 61 6e 20 32 20 2d   -columnspan 2 -
0950: 73 74 69 63 6b 79 20 6e 73 65 77 0a 67 72 69 64  sticky nsew.grid
0960: 20 63 6f 6e 66 69 67 75 72 65 20 2e 62 20 20 20   configure .b   
0970: 20 20 20 20 2d 72 6f 77 20 31 20 2d 63 6f 6c 75      -row 1 -colu
0980: 6d 6e 20 30 20 2d 63 6f 6c 75 6d 6e 73 70 61 6e  mn 0 -columnspan
0990: 20 32 20 2d 73 74 69 63 6b 79 20 6e 73 65 77 0a   2 -sticky nsew.
09a0: 67 72 69 64 20 63 6f 6e 66 69 67 75 72 65 20 2e  grid configure .
09b0: 6c 20 20 20 20 20 20 20 2d 72 6f 77 20 32 20 2d  l       -row 2 -
09c0: 63 6f 6c 75 6d 6e 20 30 20 20 20 20 20 20 20 20  column 0        
09d0: 20 20 20 20 20 20 20 2d 73 74 69 63 6b 79 20 6e         -sticky n
09e0: 73 65 77 0a 67 72 69 64 20 63 6f 6e 66 69 67 75  sew.grid configu
09f0: 72 65 20 2e 73 74 61 74 75 73 20 20 2d 72 6f 77  re .status  -row
0a00: 20 33 20 2d 63 6f 6c 75 6d 6e 20 30 20 2d 63 6f   3 -column 0 -co
0a10: 6c 75 6d 6e 73 70 61 6e 20 33 20 2d 73 74 69 63  lumnspan 3 -stic
0a20: 6b 79 20 6e 73 65 77 0a 0a 67 72 69 64 20 63 6f  ky nsew..grid co
0a30: 6e 66 69 67 75 72 65 20 2e 74 69 74 6c 65 20 20  nfigure .title  
0a40: 20 2d 72 6f 77 20 30 20 2d 63 6f 6c 75 6d 6e 20   -row 0 -column 
0a50: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
0a60: 2d 73 74 69 63 6b 79 20 6e 73 65 77 0a 67 72 69  -sticky nsew.gri
0a70: 64 20 63 6f 6e 66 69 67 75 72 65 20 2e 63 20 20  d configure .c  
0a80: 20 20 20 20 20 2d 72 6f 77 20 31 20 2d 63 6f 6c       -row 1 -col
0a90: 75 6d 6e 20 32 20 2d 72 6f 77 73 70 61 6e 20 32  umn 2 -rowspan 2
0aa0: 20 20 20 20 2d 73 74 69 63 6b 79 20 6e 73 65 77      -sticky nsew
0ab0: 0a 67 72 69 64 20 63 6f 6e 66 69 67 75 72 65 20  .grid configure 
0ac0: 2e 6c 73 20 20 20 20 20 20 2d 72 6f 77 20 32 20  .ls      -row 2 
0ad0: 2d 63 6f 6c 75 6d 6e 20 31 20 20 20 20 20 20 20  -column 1       
0ae0: 20 20 20 20 20 20 20 20 2d 73 74 69 63 6b 79 20          -sticky 
0af0: 6e 73 65 77 0a 0a 67 72 69 64 20 63 6f 6c 75 6d  nsew..grid colum
0b00: 6e 63 6f 6e 66 69 67 75 72 65 20 2e 20 32 20 2d  nconfigure . 2 -
0b10: 77 65 69 67 68 74 20 31 0a 67 72 69 64 20 72 6f  weight 1.grid ro
0b20: 77 63 6f 6e 66 69 67 75 72 65 20 20 20 20 2e 20  wconfigure    . 
0b30: 32 20 2d 77 65 69 67 68 74 20 31 0a 0a 70 72 6f  2 -weight 1..pro
0b40: 63 20 6e 6f 64 65 5f 62 62 6f 78 20 7b 64 61 74  c node_bbox {dat
0b50: 61 7d 20 7b 0a 20 20 73 65 74 20 78 6d 69 6e 20  a} {.  set xmin 
0b60: 30 0a 20 20 73 65 74 20 78 6d 61 78 20 30 0a 20  0.  set xmax 0. 
0b70: 20 73 65 74 20 79 6d 69 6e 20 30 0a 20 20 73 65   set ymin 0.  se
0b80: 74 20 79 6d 61 78 20 30 0a 20 20 66 6f 72 65 61  t ymax 0.  forea
0b90: 63 68 20 7b 72 6f 77 69 64 20 78 6d 69 6e 20 78  ch {rowid xmin x
0ba0: 6d 61 78 20 79 6d 69 6e 20 79 6d 61 78 7d 20 5b  max ymin ymax} [
0bb0: 6c 69 6e 64 65 78 20 24 64 61 74 61 20 30 5d 20  lindex $data 0] 
0bc0: 62 72 65 61 6b 0a 20 20 66 6f 72 65 61 63 68 20  break.  foreach 
0bd0: 63 65 6c 6c 20 5b 6c 72 61 6e 67 65 20 24 64 61  cell [lrange $da
0be0: 74 61 20 31 20 65 6e 64 5d 20 7b 0a 20 20 20 20  ta 1 end] {.    
0bf0: 66 6f 72 65 61 63 68 20 7b 72 6f 77 69 64 20 78  foreach {rowid x
0c00: 31 20 78 32 20 79 31 20 79 32 7d 20 24 63 65 6c  1 x2 y1 y2} $cel
0c10: 6c 20 62 72 65 61 6b 0a 20 20 20 20 69 66 20 7b  l break.    if {
0c20: 24 78 31 20 3c 20 24 78 6d 69 6e 7d 20 7b 73 65  $x1 < $xmin} {se
0c30: 74 20 78 6d 69 6e 20 24 78 31 7d 0a 20 20 20 20  t xmin $x1}.    
0c40: 69 66 20 7b 24 78 32 20 3e 20 24 78 6d 61 78 7d  if {$x2 > $xmax}
0c50: 20 7b 73 65 74 20 78 6d 61 78 20 24 78 32 7d 0a   {set xmax $x2}.
0c60: 20 20 20 20 69 66 20 7b 24 79 31 20 3c 20 24 79      if {$y1 < $y
0c70: 6d 69 6e 7d 20 7b 73 65 74 20 79 6d 69 6e 20 24  min} {set ymin $
0c80: 79 31 7d 0a 20 20 20 20 69 66 20 7b 24 79 32 20  y1}.    if {$y2 
0c90: 3e 20 24 79 6d 61 78 7d 20 7b 73 65 74 20 79 6d  > $ymax} {set ym
0ca0: 61 78 20 24 79 32 7d 0a 20 20 7d 0a 20 20 6c 69  ax $y2}.  }.  li
0cb0: 73 74 20 24 78 6d 69 6e 20 24 78 6d 61 78 20 24  st $xmin $xmax $
0cc0: 79 6d 69 6e 20 24 79 6d 61 78 0a 7d 0a 0a 70 72  ymin $ymax.}..pr
0cd0: 6f 63 20 76 69 65 77 5f 6e 6f 64 65 20 7b 7d 20  oc view_node {} 
0ce0: 7b 0a 20 20 73 65 74 20 69 4e 6f 64 65 20 24 3a  {.  set iNode $:
0cf0: 3a 4f 28 69 4e 6f 64 65 29 0a 20 20 73 65 74 20  :O(iNode).  set 
0d00: 7a 54 61 62 20 24 3a 3a 4f 28 7a 54 61 62 29 0a  zTab $::O(zTab).
0d10: 0a 20 20 73 65 74 20 64 61 74 61 20 5b 72 74 72  .  set data [rtr
0d20: 65 65 5f 6e 6f 64 65 20 64 62 20 24 7a 54 61 62  ee_node db $zTab
0d30: 20 24 69 4e 6f 64 65 20 31 32 5d 0a 20 20 73 65   $iNode 12].  se
0d40: 74 20 64 65 70 74 68 20 5b 72 74 72 65 65 5f 6e  t depth [rtree_n
0d50: 6f 64 65 64 65 70 74 68 20 64 62 20 24 7a 54 61  odedepth db $zTa
0d60: 62 20 24 69 4e 6f 64 65 5d 0a 0a 20 20 2e 63 20  b $iNode]..  .c 
0d70: 64 65 6c 65 74 65 20 61 6c 6c 0a 20 20 73 65 74  delete all.  set
0d80: 20 3a 3a 4f 28 6c 69 73 74 62 6f 78 5f 63 61 70   ::O(listbox_cap
0d90: 74 69 6f 6e 73 29 20 5b 6c 69 73 74 5d 0a 20 20  tions) [list].  
0da0: 73 65 74 20 3a 3a 4f 28 6c 69 73 74 62 6f 78 5f  set ::O(listbox_
0db0: 69 74 65 6d 6d 61 70 29 20 5b 6c 69 73 74 5d 0a  itemmap) [list].
0dc0: 20 20 73 65 74 20 24 3a 3a 4f 28 6c 69 73 74 62    set $::O(listb
0dd0: 6f 78 5f 68 69 67 68 6c 69 67 68 74 29 20 2d 31  ox_highlight) -1
0de0: 0a 0a 20 20 2e 62 20 63 6f 6e 66 69 67 75 72 65  ..  .b configure
0df0: 20 2d 73 74 61 74 65 20 6e 6f 72 6d 61 6c 0a 20   -state normal. 
0e00: 20 69 66 20 7b 24 69 4e 6f 64 65 20 3d 3d 20 31   if {$iNode == 1
0e10: 7d 20 7b 2e 62 20 63 6f 6e 66 69 67 75 72 65 20  } {.b configure 
0e20: 2d 73 74 61 74 65 20 64 69 73 61 62 6c 65 64 7d  -state disabled}
0e30: 0a 20 20 2e 74 69 74 6c 65 20 63 6f 6e 66 69 67  .  .title config
0e40: 75 72 65 20 2d 74 65 78 74 20 22 4e 6f 64 65 20  ure -text "Node 
0e50: 24 69 4e 6f 64 65 3a 20 5b 63 65 6c 6c 5f 72 65  $iNode: [cell_re
0e60: 70 6f 72 74 20 64 62 20 24 7a 54 61 62 20 24 69  port db $zTab $i
0e70: 4e 6f 64 65 20 2d 31 5d 22 0a 0a 20 20 66 6f 72  Node -1]"..  for
0e80: 65 61 63 68 20 7b 78 6d 69 6e 20 78 6d 61 78 20  each {xmin xmax 
0e90: 79 6d 69 6e 20 79 6d 61 78 7d 20 5b 6e 6f 64 65  ymin ymax} [node
0ea0: 5f 62 62 6f 78 20 24 64 61 74 61 5d 20 62 72 65  _bbox $data] bre
0eb0: 61 6b 0a 20 20 73 65 74 20 74 6f 74 61 6c 5f 61  ak.  set total_a
0ec0: 72 65 61 20 30 2e 30 0a 0a 20 20 73 65 74 20 78  rea 0.0..  set x
0ed0: 73 63 61 6c 65 20 5b 65 78 70 72 20 7b 64 6f 75  scale [expr {dou
0ee0: 62 6c 65 28 5b 77 69 6e 66 6f 20 77 69 64 74 68  ble([winfo width
0ef0: 20 2e 63 5d 2d 32 30 29 2f 28 24 78 6d 61 78 2d   .c]-20)/($xmax-
0f00: 24 78 6d 69 6e 29 7d 5d 0a 20 20 73 65 74 20 79  $xmin)}].  set y
0f10: 73 63 61 6c 65 20 5b 65 78 70 72 20 7b 64 6f 75  scale [expr {dou
0f20: 62 6c 65 28 5b 77 69 6e 66 6f 20 68 65 69 67 68  ble([winfo heigh
0f30: 74 20 2e 63 5d 2d 32 30 29 2f 28 24 79 6d 61 78  t .c]-20)/($ymax
0f40: 2d 24 79 6d 69 6e 29 7d 5d 0a 0a 20 20 73 65 74  -$ymin)}]..  set
0f50: 20 78 6f 66 66 20 5b 65 78 70 72 20 7b 31 30 2e   xoff [expr {10.
0f60: 30 20 2d 20 24 78 6d 69 6e 2a 24 78 73 63 61 6c  0 - $xmin*$xscal
0f70: 65 7d 5d 0a 20 20 73 65 74 20 79 6f 66 66 20 5b  e}].  set yoff [
0f80: 65 78 70 72 20 7b 31 30 2e 30 20 2d 20 24 79 6d  expr {10.0 - $ym
0f90: 69 6e 2a 24 79 73 63 61 6c 65 7d 5d 0a 0a 20 20  in*$yscale}]..  
0fa0: 66 6f 72 65 61 63 68 20 63 65 6c 6c 20 24 64 61  foreach cell $da
0fb0: 74 61 20 7b 0a 20 20 20 20 66 6f 72 65 61 63 68  ta {.    foreach
0fc0: 20 7b 72 6f 77 69 64 20 78 31 20 78 32 20 79 31   {rowid x1 x2 y1
0fd0: 20 79 32 7d 20 24 63 65 6c 6c 20 62 72 65 61 6b   y2} $cell break
0fe0: 0a 20 20 20 20 73 65 74 20 74 6f 74 61 6c 5f 61  .    set total_a
0ff0: 72 65 61 20 5b 65 78 70 72 20 7b 24 74 6f 74 61  rea [expr {$tota
1000: 6c 5f 61 72 65 61 20 2b 20 28 24 78 32 2d 24 78  l_area + ($x2-$x
1010: 31 29 2a 28 24 79 32 2d 24 79 31 29 7d 5d 0a 20  1)*($y2-$y1)}]. 
1020: 20 20 20 73 65 74 20 78 31 20 5b 65 78 70 72 20     set x1 [expr 
1030: 7b 24 78 31 2a 24 78 73 63 61 6c 65 20 2b 20 24  {$x1*$xscale + $
1040: 78 6f 66 66 7d 5d 0a 20 20 20 20 73 65 74 20 78  xoff}].    set x
1050: 32 20 5b 65 78 70 72 20 7b 24 78 32 2a 24 78 73  2 [expr {$x2*$xs
1060: 63 61 6c 65 20 2b 20 24 78 6f 66 66 7d 5d 0a 20  cale + $xoff}]. 
1070: 20 20 20 73 65 74 20 79 31 20 5b 65 78 70 72 20     set y1 [expr 
1080: 7b 24 79 31 2a 24 79 73 63 61 6c 65 20 2b 20 24  {$y1*$yscale + $
1090: 79 6f 66 66 7d 5d 0a 20 20 20 20 73 65 74 20 79  yoff}].    set y
10a0: 32 20 5b 65 78 70 72 20 7b 24 79 32 2a 24 79 73  2 [expr {$y2*$ys
10b0: 63 61 6c 65 20 2b 20 24 79 6f 66 66 7d 5d 0a 0a  cale + $yoff}]..
10c0: 20 20 20 20 73 65 74 20 69 64 20 5b 2e 63 20 63      set id [.c c
10d0: 72 65 61 74 65 20 72 65 63 74 61 6e 67 6c 65 20  reate rectangle 
10e0: 24 78 31 20 24 79 31 20 24 78 32 20 24 79 32 5d  $x1 $y1 $x2 $y2]
10f0: 0a 20 20 20 20 69 66 20 7b 24 64 65 70 74 68 3e  .    if {$depth>
1100: 30 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65  0} {.      lappe
1110: 6e 64 20 3a 3a 4f 28 6c 69 73 74 62 6f 78 5f 63  nd ::O(listbox_c
1120: 61 70 74 69 6f 6e 73 29 20 22 4e 6f 64 65 20 24  aptions) "Node $
1130: 72 6f 77 69 64 22 0a 20 20 20 20 20 20 6c 61 70  rowid".      lap
1140: 70 65 6e 64 20 3a 3a 4f 28 6c 69 73 74 62 6f 78  pend ::O(listbox
1150: 5f 69 74 65 6d 6d 61 70 29 20 24 69 64 0a 20 20  _itemmap) $id.  
1160: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20    }.  }.}..proc 
1170: 63 65 6c 6c 5f 72 65 70 6f 72 74 20 7b 64 62 20  cell_report {db 
1180: 7a 54 61 62 20 69 50 61 72 65 6e 74 20 69 43 65  zTab iParent iCe
1190: 6c 6c 7d 20 7b 0a 20 20 73 65 74 20 64 61 74 61  ll} {.  set data
11a0: 20 5b 72 74 72 65 65 5f 6e 6f 64 65 20 64 62 20   [rtree_node db 
11b0: 24 7a 54 61 62 20 24 69 50 61 72 65 6e 74 20 31  $zTab $iParent 1
11c0: 32 5d 0a 20 20 73 65 74 20 63 65 6c 6c 20 5b 6c  2].  set cell [l
11d0: 69 6e 64 65 78 20 24 64 61 74 61 20 24 69 43 65  index $data $iCe
11e0: 6c 6c 5d 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b  ll]..  foreach {
11f0: 78 6d 69 6e 20 78 6d 61 78 20 79 6d 69 6e 20 79  xmin xmax ymin y
1200: 6d 61 78 7d 20 5b 6e 6f 64 65 5f 62 62 6f 78 20  max} [node_bbox 
1210: 24 64 61 74 61 5d 20 62 72 65 61 6b 0a 20 20 73  $data] break.  s
1220: 65 74 20 74 6f 74 61 6c 5f 61 72 65 61 20 5b 65  et total_area [e
1230: 78 70 72 20 28 24 78 6d 61 78 2d 24 78 6d 69 6e  xpr ($xmax-$xmin
1240: 29 2a 28 24 79 6d 61 78 2d 24 79 6d 69 6e 29 5d  )*($ymax-$ymin)]
1250: 0a 0a 20 20 69 66 20 7b 24 63 65 6c 6c 20 65 71  ..  if {$cell eq
1260: 20 22 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 63   ""} {.    set c
1270: 65 6c 6c 5f 61 72 65 61 20 30 2e 30 0a 20 20 20  ell_area 0.0.   
1280: 20 66 6f 72 65 61 63 68 20 63 65 6c 6c 20 24 64   foreach cell $d
1290: 61 74 61 20 7b 0a 20 20 20 20 20 20 66 6f 72 65  ata {.      fore
12a0: 61 63 68 20 7b 72 6f 77 69 64 20 78 31 20 78 32  ach {rowid x1 x2
12b0: 20 79 31 20 79 32 7d 20 24 63 65 6c 6c 20 62 72   y1 y2} $cell br
12c0: 65 61 6b 0a 20 20 20 20 20 20 73 65 74 20 63 65  eak.      set ce
12d0: 6c 6c 5f 61 72 65 61 20 5b 65 78 70 72 20 24 63  ll_area [expr $c
12e0: 65 6c 6c 5f 61 72 65 61 2b 28 24 78 32 2d 24 78  ell_area+($x2-$x
12f0: 31 29 2a 28 24 79 32 2d 24 79 31 29 5d 0a 20 20  1)*($y2-$y1)].  
1300: 20 20 7d 0a 20 20 20 20 73 65 74 20 63 65 6c 6c    }.    set cell
1310: 5f 61 72 65 61 20 5b 65 78 70 72 20 24 63 65 6c  _area [expr $cel
1320: 6c 5f 61 72 65 61 2f 5b 6c 6c 65 6e 67 74 68 20  l_area/[llength 
1330: 24 64 61 74 61 5d 5d 0a 20 20 20 20 73 65 74 20  $data]].    set 
1340: 7a 52 65 70 6f 72 74 20 5b 66 6f 72 6d 61 74 20  zReport [format 
1350: 22 53 69 7a 65 20 3d 20 25 2e 31 66 20 78 20 25  "Size = %.1f x %
1360: 2e 31 66 20 20 20 20 41 76 65 72 61 67 65 20 63  .1f    Average c
1370: 68 69 6c 64 20 61 72 65 61 20 3d 20 25 2e 31 66  hild area = %.1f
1380: 25 25 22 20 5c 0a 20 20 20 20 20 20 5b 65 78 70  %%" \.      [exp
1390: 72 20 24 78 6d 61 78 2d 24 78 6d 69 6e 5d 20 5b  r $xmax-$xmin] [
13a0: 65 78 70 72 20 24 79 6d 61 78 2d 24 79 6d 69 6e  expr $ymax-$ymin
13b0: 5d 20 5b 65 78 70 72 20 31 30 30 2e 30 2a 24 63  ] [expr 100.0*$c
13c0: 65 6c 6c 5f 61 72 65 61 2f 24 74 6f 74 61 6c 5f  ell_area/$total_
13d0: 61 72 65 61 5d 5c 0a 20 20 20 20 5d 0a 20 20 20  area]\.    ].   
13e0: 20 61 70 70 65 6e 64 20 7a 52 65 70 6f 72 74 20   append zReport 
13f0: 22 20 20 20 53 75 62 2d 74 72 65 65 20 68 65 69  "   Sub-tree hei
1400: 67 68 74 3a 20 5b 72 74 72 65 65 5f 6e 6f 64 65  ght: [rtree_node
1410: 64 65 70 74 68 20 64 62 20 24 7a 54 61 62 20 24  depth db $zTab $
1420: 69 50 61 72 65 6e 74 5d 22 0a 20 20 7d 20 65 6c  iParent]".  } el
1430: 73 65 20 7b 0a 20 20 20 20 66 6f 72 65 61 63 68  se {.    foreach
1440: 20 7b 72 6f 77 69 64 20 78 31 20 78 32 20 79 31   {rowid x1 x2 y1
1450: 20 79 32 7d 20 24 63 65 6c 6c 20 62 72 65 61 6b   y2} $cell break
1460: 0a 20 20 20 20 73 65 74 20 63 65 6c 6c 5f 61 72  .    set cell_ar
1470: 65 61 20 20 5b 65 78 70 72 20 28 24 78 32 2d 24  ea  [expr ($x2-$
1480: 78 31 29 2a 28 24 79 32 2d 24 79 31 29 5d 0a 20  x1)*($y2-$y1)]. 
1490: 20 20 20 73 65 74 20 7a 52 65 70 6f 72 74 20 5b     set zReport [
14a0: 66 6f 72 6d 61 74 20 22 53 69 7a 65 20 3d 20 25  format "Size = %
14b0: 2e 31 66 20 78 20 25 2e 31 66 20 20 20 20 41 72  .1f x %.1f    Ar
14c0: 65 61 20 3d 20 25 2e 31 66 25 25 22 20 5c 0a 20  ea = %.1f%%" \. 
14d0: 20 20 20 20 20 5b 65 78 70 72 20 24 78 32 2d 24       [expr $x2-$
14e0: 78 31 5d 20 5b 65 78 70 72 20 24 79 32 2d 24 79  x1] [expr $y2-$y
14f0: 31 5d 20 5b 65 78 70 72 20 31 30 30 2e 30 2a 24  1] [expr 100.0*$
1500: 63 65 6c 6c 5f 61 72 65 61 2f 24 74 6f 74 61 6c  cell_area/$total
1510: 5f 61 72 65 61 5d 0a 20 20 20 20 5d 0a 20 20 7d  _area].    ].  }
1520: 0a 0a 20 20 72 65 74 75 72 6e 20 24 7a 52 65 70  ..  return $zRep
1530: 6f 72 74 0a 7d 0a 0a 76 69 65 77 5f 6e 6f 64 65  ort.}..view_node
1540: 0a 62 69 6e 64 20 2e 63 20 3c 43 6f 6e 66 69 67  .bind .c <Config
1550: 75 72 65 3e 20 76 69 65 77 5f 6e 6f 64 65 0a     ure> view_node.