home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / view / tree.tcl < prev    next >
Text File  |  2000-11-02  |  4KB  |  161 lines

  1.  
  2. package require BWidget
  3. package require unique
  4. package provide comancheTree
  5.  
  6. class comancheTree {
  7.     variable view
  8.     variable tree
  9.     variable default 
  10.     variable mapping
  11.     constructor { frame observerView} {
  12.     array set default { -openImage openFolder \
  13.         -closedImage closedFolder \
  14.         -text "default text"\
  15.         -type container }
  16.     set scwindow [ScrolledWindow $frame.scwindow]  
  17.     set tree  [Tree $scwindow.tree \
  18.         -deltay 22\
  19.         -bg white\
  20.         -showlines true\
  21.         -deltax 14\
  22.         -opencmd "$this _openNode"\
  23.         ]
  24.     pack $tree -fill both -expand true
  25.     $scwindow setwidget $tree
  26.     pack $scwindow -fill both -expand true
  27.     set view $observerView
  28.     $tree bindText <ButtonPress-1> \
  29.         "$this _selectNode"
  30.     $tree bindText <ButtonPress-3>  \
  31.         "$this _rightClick"
  32.     $tree bindImage <ButtonPress-1> \
  33.         "$this _toggleNode"
  34.     $tree  bindText <Double-ButtonPress-1> \
  35.         "$this _toggleNode"
  36.     set mapping(root,-type) container
  37.     }
  38.     method setView {newView} { set view $newView }
  39.     
  40.     method addNode { parentNodeId args }
  41.     method deleteNode { nodeId }
  42.     method configureNode { nodeId args }
  43.     
  44.     method getSelectedNode
  45.     method getParentNode
  46.     method selectNode
  47.     
  48.     method _selectNode
  49.     method _toggleNode
  50.     method _openNode
  51.     method _closeNode
  52.     method _populateNode
  53.     method _rightClick
  54. }
  55.  
  56. body comancheTree::_rightClick { node } {
  57.     _selectNode $node
  58.     $view showMenuRequest $this $node
  59. }
  60.  
  61. body comancheTree::getSelectedNode {} {
  62.     return [$tree selection get]
  63. }
  64.  
  65. body comancheTree::getParentNode { nodeId } {
  66.     return [$tree parent $nodeId]
  67. }
  68.  
  69.  
  70. body comancheTree::addNode { parentNodeId args} {
  71.     if ![string compare $mapping($parentNodeId,-type) leaf] {
  72.     error "Trying to add a node to a leaf node ($parentNodeId)"
  73.     }  else {
  74.     array set options [array get default]
  75.     if [catch [list array set options $args] ] {
  76.         error "Wrong arguments $args"
  77.     } else {
  78.         set nodeId [::unique::newId] 
  79.         foreach attr [array names options] {
  80.         set mapping($nodeId,$attr) $options($attr)
  81.         }
  82.         set mapping($nodeId,-virgin) 1
  83.         $tree insert end $parentNodeId $nodeId\
  84.             -text $options(-text)\
  85.             -image $options(-closedImage)\
  86.             -drawcross allways\
  87.             -data {}           
  88.         if ![string compare $options(-type) leaf] {
  89.         set mapping($nodeId,-virgin) 0
  90.         $tree itemconfigure $nodeId -drawcross never
  91.         }
  92.     }
  93.     }
  94.     return $nodeId
  95. }
  96.  
  97. body comancheTree::deleteNode { nodeId } {
  98.     $tree delete $nodeId
  99. }
  100.  
  101. body comancheTree::configureNode { nodeId args} {
  102.     array set options [array get default]
  103.     if [catch [list array set options $args] ] {
  104.     error "Wrong arguments $args"
  105.     } elsqe {
  106.     foreach attr [array names options] {
  107.         set mapping($nodeId,$attr) $options($attr)
  108.     }
  109.     if [$tree itemcget $nodeId -open] {
  110.         set img $options(-openImage)
  111.     } else {
  112.         set img $options(-closedImage)
  113.     }   
  114.     $tree itemconfigure $nodeId\
  115.         -text $options(-text)\
  116.         -image $img \
  117.         }
  118.     return $nodeId
  119. }
  120.  
  121. body comancheTree::_selectNode { nodeId } {
  122.     $tree selection set $nodeId
  123.     _populateNode $nodeId
  124.     $view nodeSelectedNotify $nodeId $this
  125. }
  126.  
  127. body comancheTree::selectNode { nodeId } {
  128.     _openNode [$tree parent $nodeId]
  129.     _selectNode $nodeId
  130.     $tree see $nodeId
  131. }
  132.  
  133. body comancheTree::_toggleNode { nodeId } {
  134.     if [$tree itemcget $nodeId -open] {
  135.     $this _closeNode $nodeId
  136.     } else {
  137.     $this _openNode $nodeId
  138.     }   
  139. }
  140.  
  141. body comancheTree::_openNode { nodeId } {
  142.     $this _populateNode $nodeId
  143.     $tree itemconfigure $nodeId -image $mapping($nodeId,-openImage) \
  144.         -open 1
  145. }
  146.  
  147. body comancheTree::_closeNode { nodeId } {
  148.     $tree itemconfigure $nodeId -image $mapping($nodeId,-closedImage) \
  149.         -open 0        
  150. }
  151.  
  152. body comancheTree::_populateNode { nodeId } {
  153.     if $mapping($nodeId,-virgin)  {
  154.     $view populateRequestNotify $nodeId $this
  155.     set mapping($nodeId,-virgin) 0
  156.     $tree itemconfigure $nodeId -image $mapping($nodeId,-closedImage) \
  157.         -drawcross auto
  158.     }
  159. }
  160.  
  161.