home *** CD-ROM | disk | FTP | other *** search
/ PC World 1997 November / PCWorld_1997-11_cd.bin / software / programy / komix / DATA.Z / treenode.tcl < prev    next >
Text File  |  1996-12-05  |  8KB  |  348 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cadre Technologies Inc.    1996
  4. #
  5. #      File:           @(#)treenode.tcl    /main/hindenburg/13
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)treenode.tcl    /main/hindenburg/13   5 Dec 1996 Copyright 1996 Cadre Technologies Inc.
  10.  
  11. # Start user added include file section
  12. # End user added include file section
  13.  
  14.  
  15. Class TreeNode : {BrowsNode} {
  16.     constructor
  17.     method destructor
  18.     method appendChildren
  19.     method getParent
  20.     method open
  21.     method rebuild
  22.     method removeChildren
  23.     method update
  24.     method addChildLabel
  25.     method removeChildLabel
  26.     method addOldChild
  27.     method removeOldChild
  28.     attribute count
  29.     attribute childLabelSet
  30.     attribute browsUiObj
  31.     attribute oldChildSet
  32. }
  33.  
  34. constructor TreeNode {class this name browsUiObj} {
  35.     set this [BrowsNode::constructor $class $this $name]
  36.     $this browsUiObj $browsUiObj
  37.     $this childLabelSet [List new]
  38.     $this oldChildSet [List new]
  39.     # Start constructor user section
  40.  
  41.     global ${browsUiObj}::treeNode
  42.     set ${browsUiObj}::treeNode $this
  43.  
  44.     $this count 0
  45.     $this update
  46.     $this config \
  47.         -activeState 0 \
  48.         -selectState 0 \
  49.         -activated {%this open} \
  50.         -folded {%this removeChildren} \
  51.         -unFolded {%this appendChildren}
  52.  
  53.     # Append children if current one is unfolded
  54.     if {! [$this foldState]} {
  55.         $this appendChildren
  56.     }
  57.  
  58.     # End constructor user section
  59.     return $this
  60. }
  61.  
  62. method TreeNode::destructor {this} {
  63.     # Start destructor user section
  64.  
  65.     if {(! [isCommand .main]) ||
  66.         (! [isCommand [.main currentObj]])} return
  67.     if {"[.main currentObj]" == "$this"} {
  68.         $this activeState 0
  69.         [.main infoView] currentObj ""
  70.     }
  71.  
  72.     if [info exists [$this browsUiObj]::treeNode] {
  73.         unset [$this browsUiObj]::treeNode
  74.     }
  75.  
  76.     # End destructor user section
  77. }
  78.  
  79.  
  80. # Append the children of the current object in the
  81. # tree view if unfolded.
  82. #
  83. method TreeNode::appendChildren {this {scrollFlag 1}} {
  84.     if {! [[$this browsUiObj] hasChildren]} {
  85.     return
  86.     }
  87.  
  88.     busy {
  89.     set browsUiObj [$this browsUiObj]
  90.  
  91.     # initialize
  92.     BrowserProcs::initializeInfo $browsUiObj $this
  93.     if [$browsUiObj isA Document] {
  94.         $browsUiObj initialize [$this getParent ConfigVersion]
  95.     }
  96.     set errorStack [$browsUiObj initializeChildSet ""]
  97.     if {"$errorStack" != ""} {
  98.         if [info exists errorInfo] {
  99.         set errorTrace $errorInfo
  100.         set errorCodeCopy $errorCode
  101.         resetErrorVars
  102.         } else {
  103.         set errorTrace ""
  104.         set errorCodeCopy ""
  105.         }
  106.     }
  107.  
  108.     set index 0
  109.     [$this oldChildSet] contents [$this childSet]
  110.     [$this oldChildSet] foreach node {
  111.         set browsUiObjSet([$node browsUiObj]) $node
  112.     }
  113.     foreach association [[$browsUiObj browserObjType]::associations] {
  114.         case "$association" in {
  115.         {controlledClasses externalFiles phaseVersions sections} {
  116.             set sort 0
  117.         }
  118.         {default} {
  119.             set sort 1
  120.             [$this childLabelSet] contents ""
  121.         }
  122.         }
  123.         foreach child [$browsUiObj getChildSet $association] {
  124.         if [info exists browsUiObjSet($child)] {
  125.             set node $browsUiObjSet($child)
  126.         } else {
  127.             set node ""
  128.         }
  129.  
  130.         if {"$node" == ""} {
  131.             set node $this.node[$this count]
  132.             $this count [expr [$this count] + 1]
  133.             TreeNode new $node $child
  134.         } else {
  135.             $node update
  136.             $this removeOldChild $node
  137.         }
  138.  
  139.         if $sort {
  140.             $this addChildLabel [list "[$node label]" $node]
  141.         } else {
  142.             $node index $index
  143.             incr index 1
  144.         }
  145.         }
  146.  
  147.         if {! $sort} continue
  148.  
  149.         # Sort the nodes on label
  150.         [$this childLabelSet] sort
  151.         [$this childLabelSet] foreach tuple {
  152.         [lindex $tuple 1] index $index
  153.         incr index 1
  154.         }
  155.     }
  156.     [$this oldChildSet] foreach node {
  157.         $node delete
  158.     }
  159.     if $scrollFlag {
  160.         $this makeVisible
  161.     }
  162.     }
  163.  
  164.     if {"$errorStack" != ""} {
  165.     global errorInfo errorCode
  166.     set errorInfo $errorTrace
  167.     set errorCode $errorCodeCopy
  168.     wmtkerror $errorStack
  169.     }
  170. }
  171.  
  172. method TreeNode::getParent {this type} {
  173.     set browsUiObj ""
  174.     set found 0
  175.     for {set parent [$this parent]} \
  176.     {"$parent" != ""} \
  177.     {set parent [$parent parent]} {
  178.     set browsUiObj [$parent browsUiObj]
  179.     if {"$browsUiObj" == ""} break
  180.     if [$browsUiObj isA $type] {
  181.         set found 1
  182.         break
  183.     }
  184.     }
  185.     if $found {
  186.     return $browsUiObj
  187.     }
  188.     return ""
  189. }
  190.  
  191.  
  192. # Open this tree object: display information of the
  193. # children of the current object in the flat view.
  194. #
  195. method TreeNode::open {this} {
  196.     busy {
  197.     set oldCurrentObj [.main currentObj]
  198.     if {[[$this browsUiObj] hasChildren]} {
  199.         set catched [catch {.main setCurrentObj $this} errorStack]
  200.         if {"$errorStack" != ""} {
  201.         if [info exists errorInfo] {
  202.             set errorTrace $errorInfo
  203.             set errorCodeCopy $errorCode
  204.             resetErrorVars
  205.         } else {
  206.             set errorTrace ""
  207.             set errorCodeCopy ""
  208.         }
  209.         }
  210.         if $catched {
  211.         .main setCurrentObj $oldCurrentObj
  212.         if [isCommand $oldCurrentObj] {
  213.             $oldCurrentObj selectState 1
  214.         }
  215.         }
  216.     } else {
  217.         set errorStack ""
  218.         if [isCommand $oldCurrentObj] {
  219.         $oldCurrentObj activeState 1
  220.         }
  221.         $this activeState 0
  222.         .main selectionChanged
  223.     }
  224.     set newCurrentObj [.main currentObj]
  225.     if {$oldCurrentObj != $newCurrentObj} {
  226.         $newCurrentObj config \
  227.         -activeState 1 \
  228.         -selectState 1
  229.  
  230.         [$this tree] rebuild
  231.  
  232.         for {set parent [$newCurrentObj parent]} \
  233.         {"$parent" != ""} \
  234.         {set parent [$parent parent]} {
  235.         $parent foldState 0
  236.         }
  237.  
  238.         .main addFileHistory $newCurrentObj \
  239.             [[ClientContext::global] currentLevelString]
  240.     }
  241.     }
  242.  
  243.     if {"$errorStack" != ""} {
  244.     global errorInfo errorCode
  245.     set errorInfo $errorTrace
  246.     set errorCode $errorCodeCopy
  247.     wmtkerror $errorStack
  248.     }
  249. }
  250.  
  251. method TreeNode::rebuild {this} {
  252.     set browsUiObj [$this browsUiObj]
  253.     if {! [isCommand $browsUiObj]} {
  254.     return
  255.     }
  256.  
  257.     if [$this foldState] {
  258.     return
  259.     }
  260.  
  261.     $this appendChildren 0
  262.     foreach node [$this childSet] {
  263.     $node rebuild
  264.     }
  265. }
  266.  
  267.  
  268. # Remove all child tree objects.
  269. #
  270. method TreeNode::removeChildren {this} {
  271.     $this makeVisible
  272.  
  273.     # Make this one active if the current activated is its (grand)child.
  274.     set currentObj [.main currentObj]
  275.     if {! [isCommand $currentObj]} return
  276.     if {$currentObj == $this} return
  277.     set found 0
  278.     for {set parent [$currentObj parent]} \
  279.     {"$parent" != ""} \
  280.     {set parent [$parent parent]} {
  281.     if {$parent == $this} {
  282.         set found 1
  283.         break
  284.     }
  285.     }
  286.     if $found {
  287.     $this open
  288.     }
  289. }
  290.  
  291. method TreeNode::update {this} {
  292.     set browsUiObj [$this browsUiObj]
  293.     BrowserProcs::initializeInfo $browsUiObj $this
  294.  
  295.     set name [$browsUiObj getInfo Name]
  296.     if [$browsUiObj typeInLabel] {
  297.     append name ".[$browsUiObj getInfo Type]"
  298.     }
  299.     if [$browsUiObj versionInLabel] {
  300.     append name " (V[$browsUiObj versionNumber])"
  301.     }
  302.     $this config \
  303.     -label $name \
  304.     -hasChildren [$browsUiObj hasChildren]
  305.  
  306.     # Set icons and default foldState
  307.     set uiType "[$browsUiObj getInfo Type]"
  308.     set objType "[$browsUiObj uiClass]"
  309.     set typeSpec [getObjectSpec [.main objectHdlr] "$objType" "$uiType"]
  310.     if {"$typeSpec" != ""} {
  311.     set icon [$typeSpec normalIcon]
  312.     set activeIcon [$typeSpec activeIcon]
  313.     set foldState [$this foldState]
  314.     if $foldState {
  315.         set foldState [$typeSpec foldState]
  316.     }
  317.     } else {
  318.     set icon ""
  319.     set activeIcon ""
  320.     set foldState 1
  321.     }
  322.     $this config \
  323.     -icon $icon \
  324.     -activeIcon $activeIcon \
  325.     -foldState $foldState
  326. }
  327.  
  328. # Do not delete this line -- regeneration end marker
  329.  
  330. method TreeNode::addChildLabel {this newChildLabel} {
  331.     [$this childLabelSet] append $newChildLabel
  332.  
  333. }
  334.  
  335. method TreeNode::removeChildLabel {this oldChildLabel} {
  336.     [$this childLabelSet] removeValue $oldChildLabel
  337. }
  338.  
  339. method TreeNode::addOldChild {this newOldChild} {
  340.     [$this oldChildSet] append $newOldChild
  341.  
  342. }
  343.  
  344. method TreeNode::removeOldChild {this oldOldChild} {
  345.     [$this oldChildSet] removeValue $oldOldChild
  346. }
  347.  
  348.