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

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1996
  4. #
  5. #      File:           @(#)commonbrow.tcl    /main/hindenburg/23
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)commonbrow.tcl    /main/hindenburg/23   5 Dec 1996 Copyright 1996 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12.  
  13. require "browserobj.tcl"
  14. require "browserpro.tcl"
  15. require "browsewmta.tcl"
  16. require "filterhand.tcl"
  17. require "infoview.tcl"
  18. require "m4vardescr.tcl"
  19. require "navigation.tcl"
  20. require "treenode.tcl"
  21.  
  22. # End user added include file section
  23.  
  24. require "wmttool.tcl"
  25.  
  26. Class CommonBrowser : {WmtTool MainWindow} {
  27.     method destructor
  28.     constructor
  29.     method createInterface
  30.     method addFileHistory
  31.     method historyActivated
  32.     method findTreeNode
  33.     method abbrevLevelPath
  34.     method renumberFileHistory
  35.     method setFileHistory
  36.     method saveFileHistory
  37.     method addContextArea
  38.     method updateToolBar
  39.     method updateWmtArea
  40.     method createPropContainers
  41.     method releasePropContainers
  42.     method setCurrentObj
  43.     method getSelectedSet
  44.     method selectionChanged
  45.     method open
  46.     method popUp
  47.     method stop
  48.     method updateTitle
  49.     method undoCommandBusy
  50.     method editCut
  51.     method editCopy
  52.     method editPaste
  53.     method editSelAll
  54.     method editDeselAll
  55.     method editSelInv
  56.     method editUndo
  57.     method addPropContainer
  58.     method removePropContainer
  59.     attribute currentObj
  60.     attribute corporateObj
  61.     attribute rootIdList
  62.     attribute viewSelector
  63.     attribute historyCount
  64.     attribute opened
  65.     attribute moduleHdlr
  66.     attribute filterHdlr
  67.     attribute objectHdlr
  68.     attribute viewHdlr
  69.     attribute menuHdlr
  70.     attribute wmtArea
  71.     attribute navigationView
  72.     attribute infoView
  73.     attribute m4VarDes
  74.     attribute propContainerSet
  75.     attribute undoCommand
  76.     attribute fileHistorySet
  77. }
  78.  
  79. method CommonBrowser::destructor {this} {
  80.     # Start destructor user section
  81.     if [$this opened] {
  82.         $this saveFileHistory
  83.         $this saveToolBarPresence desk
  84.         $this saveContextAreaPresence desk
  85.         $this saveMessageAreaPresence desk
  86.     }
  87.     catch {
  88.         if [isCommand [$this undoCommand]] {
  89.         [$this undoCommand] delete
  90.         }
  91.         [$this filterHdlr] delete
  92.         [$this menuHdlr] delete
  93.         [$this viewHdlr] delete
  94.         [$this objectHdlr] delete
  95.     }
  96.     # End destructor user section
  97.     $this WmtTool::destructor
  98. }
  99.  
  100. constructor CommonBrowser {class this name toolId} {
  101.     set this [MainWindow::constructor $class $this $name]
  102.     set this [WmtTool::constructor $class $this $name]
  103.  
  104.     $this config \
  105.     -historyCount 0 -fileHistorySet [List new] \
  106.     -opened 0
  107.  
  108.     global classCount
  109.     set classCount 0
  110.  
  111.     $this m4VarDes [M4VarDescription new $this.m4VarDes]
  112.  
  113.     MenuBar new $this.MB
  114.     $this menuHdlr [CustBrMenuHandler new $toolId]
  115.     $this createInterface
  116.     $this viewHdlr [CustViewHandler new $toolId]
  117.     $this objectHdlr [CustObjHandler new]
  118.     $this filterHdlr [FilterHandler new $this.filterHdlr]
  119.  
  120.     # Check if handlers are created without errors:
  121.     #     the corporate customization files exist
  122.     if [isCommand .main.error] {
  123.     return $this
  124.     }
  125.  
  126.     # Go back to corporate level and initialize the interface (toolbar)
  127.     set clientContext [ClientContext::global]
  128.     set levelIds [$clientContext currentLevelIdString]
  129.     while {! [[$clientContext currentProject] isNil]} {
  130.     $clientContext upLevel
  131.     }
  132.     [$this menuHdlr] setCurrentContext
  133.     if [catch {[$this objectHdlr] setCurrentContext} msg] {
  134.     wmtkerror $msg
  135.     }
  136.     if [catch {[$this viewHdlr] setCurrentContext} msg] {
  137.     wmtkerror $msg
  138.     }
  139.  
  140.     # Reset clientContext
  141.     $clientContext setLevelIds $levelIds
  142.     m4_var foreach m4var {
  143.     if [m4_var saveStatus $m4var] {
  144.         m4_var saveStatus $m4var 0
  145.     }
  146.     }
  147.  
  148.     ClassMaker::extend CustMenuPushButton HistMenuButton {treeNode levelPath}
  149.     $this setFileHistory
  150.  
  151.     return $this
  152. }
  153.  
  154. method CommonBrowser::createInterface {this} {
  155.     DlgColumn new $this.DC
  156.     $this setContextAreaPresence desk
  157.     interface VerSplitter $this.DC.VS {
  158.     NavigationView navigBT {
  159.         rowCount 5
  160.         horStretchFactor 5    
  161.         verStretchFactor 5
  162.         horShrinkFactor 5
  163.         verShrinkFactor 5
  164.     }
  165.     InfoView infoIV {}
  166.     }
  167.     $this setToolBarPresence desk
  168.     $this setMessageAreaPresence desk
  169.  
  170.     $this navigationView    $this.DC.VS.navigBT
  171.     $this infoView        $this.DC.VS.infoIV
  172. }
  173.  
  174. method CommonBrowser::addFileHistory {this treeNode levelPath} {
  175.     if {! [isCommand [$this exitButton]]} {
  176.     return
  177.     }
  178.  
  179.     set index [expr [[$this exitButton] index] - 1 - \
  180.             [[$this fileHistorySet] length]]
  181.     [$this fileHistorySet] foreach entry {
  182.     if {$levelPath != [$entry levelPath]} {
  183.         continue
  184.     }
  185.     [$this fileHistorySet] removeValue $entry
  186.     [$this fileHistorySet] insert $entry
  187.     $this renumberFileHistory
  188.     $entry index $index
  189.     return
  190.     }
  191.  
  192.     set latest [expr [$this historyCount] + 1]
  193.     HistMenuButton new [$this menuBar].file.menu.his$latest \
  194.     -treeNode $treeNode -levelPath $levelPath -index $index \
  195.     -label "1 [$this abbrevLevelPath $levelPath]" -mnemonic 1 \
  196.     -hintText "Opens $levelPath." -activated "$this historyActivated %this"
  197.     [$this fileHistorySet] insert [$this menuBar].file.menu.his$latest
  198.     $this historyCount $latest
  199.     $this renumberFileHistory
  200.  
  201.     if {[[$this fileHistorySet] length] > 5} {
  202.     [[$this fileHistorySet] index end] delete
  203.     [$this fileHistorySet] remove end
  204.     }
  205. }
  206.  
  207. method CommonBrowser::historyActivated {this entry} {
  208.     if {![isCommand [$entry treeNode]]} {
  209.     $entry treeNode [$this findTreeNode [$entry levelPath]]
  210.     }
  211.     if [isCommand [$entry treeNode]] {
  212.     [$entry treeNode] open
  213.     } else {
  214.     wmtkerror "Can not open [$entry levelPath]: no such object"
  215.     [$this fileHistorySet] removeValue $entry
  216.     $this renumberFileHistory
  217.     $entry delete
  218.     }
  219. }
  220.  
  221. method CommonBrowser::findTreeNode {this levelPath} {
  222.     set treeNode ""
  223.     append levelPath "/"
  224.     for {set count 0; set slash [string first "/" $levelPath]} \
  225.     {$slash >= 0} \
  226.     {incr count; set slash [string first "/" $levelPath]} {
  227.     if {$slash != 0} {
  228.         set level [string range $levelPath 0 [expr $slash - 1]]
  229.         if {"$treeNode" == ""} {
  230.         set childSet [[$this treeView] rootSet]
  231.         } else {
  232.         $treeNode appendChildren
  233.         set childSet [$treeNode childSet]
  234.         }
  235.         set found 0
  236.         foreach childNode $childSet {
  237.         set childObj [$childNode browsUiObj]
  238.         if {!([$childObj isA CustomLevelVersion] ||
  239.               [$childObj isA FileVersion])} continue
  240.         set childLabel [$childObj getInfo Name]
  241.         case $count in {
  242.             3 {
  243.             # ConfigVersion
  244.             append childLabel ":[$childObj getInfo Version]"
  245.             }
  246.             {4 6} {
  247.             # PhaseVersion or FileVersion
  248.             append childLabel ".[$childObj getInfo Type]"
  249.             }
  250.             5 {
  251.             # SystemVersion
  252.             append childLabel ".[[$childObj system] type]"
  253.             }
  254.         }
  255.         if {"$level" == "$childLabel"} {
  256.             set found 1
  257.             break
  258.         }
  259.         }
  260.         if {!$found} break
  261.         set treeNode $childNode
  262.     }
  263.     set levelPath [string range $levelPath [expr $slash + 1] end]
  264.     }
  265.     if {"$levelPath" == ""} {
  266.     return $treeNode
  267.     }
  268.     return ""
  269. }
  270.  
  271. method CommonBrowser::abbrevLevelPath {this levelPath} {
  272.     set shortPath ""
  273.     append levelPath "/"
  274.     for {set count 0; set slash [string first "/" $levelPath]} \
  275.     {$slash >= 0} \
  276.     {incr count; set slash [string first "/" $levelPath]} {
  277.     if {$slash != 0} {
  278.         set sep ""
  279.         set part2 ""
  280.         set level [string range $levelPath 0 [expr $slash - 1]]
  281.         if {$count != 2} {
  282.         append shortPath "/"
  283.         }
  284.         case $count in {
  285.         1 {
  286.             # Corporate: leave out
  287.             set part1 ""
  288.         }
  289.         {2 3} {
  290.             # Project and ConfigVersion
  291.             set part1 $level
  292.         }
  293.         default {
  294.             # Typed object
  295.             set sep "."
  296.         }
  297.         }
  298.         if {$sep != ""} {
  299.         set sepPos [string last $sep $level]
  300.         if {$sepPos < 0} {
  301.             set sep ""
  302.         } else {
  303.             set part1 [string range $level 0 [expr $sepPos - 1]]
  304.             if {$count == 4} {
  305.             # Do not show type of Phase
  306.             set sep ""
  307.             } else {
  308.             set part2 [string range $level [expr $sepPos + 1] end]
  309.             }
  310.         }
  311.         }
  312.         if {[string length $part2] > 3} {
  313.         set part2 [string range $part2 0 2]
  314.         }
  315.         append shortPath ${part1}${sep}$part2
  316.     }
  317.     set levelPath [string range $levelPath [expr $slash + 1] end]
  318.     }
  319.     set maxlen 32
  320.     set plen [string length $shortPath]
  321.     if {$count < 5 || $plen <= $maxlen} {
  322.     return $shortPath
  323.     }
  324.     set lvlLen ""
  325.     set lvlSet [split $shortPath /]
  326.     foreach level $lvlSet {
  327.     lappend lvlLen [expr [string length $level] + 1]
  328.     }
  329.     set llast [expr [llength $lvlSet] - 1]
  330.     set minlb 2
  331.     set minhb [expr $llast - 1]
  332.     set minav [expr $maxlen - 6 - [lindex $lvlLen 1] - [lindex $lvlLen $llast]]
  333.     if {$minav > 0} {
  334.     for {set lb 2} {$lb < $llast} {incr lb} {
  335.         set avail [expr $maxlen - $plen - 4]
  336.         for {set hb $lb} {$hb < $llast} {incr hb} {
  337.         incr avail [lindex $lvlLen $hb]
  338.         if {$avail > -1} {
  339.             if {$avail < $minav} {
  340.             set minlb $lb
  341.             set minhb $hb
  342.             set minav $avail
  343.             }
  344.             break
  345.         }
  346.         }
  347.     }
  348.     }
  349.     set lvlSet [lreplace $lvlSet $minlb $minhb ...]
  350.     return [join $lvlSet /]
  351. }
  352.  
  353. method CommonBrowser::renumberFileHistory {this} {
  354.     set m 1
  355.     [$this fileHistorySet] foreach entry {
  356.     $entry config \
  357.         -label "$m [$this abbrevLevelPath [$entry levelPath]]" -mnemonic $m
  358.     incr m
  359.     }
  360. }
  361.  
  362. method CommonBrowser::setFileHistory {this} {
  363.     set history [m4_var get M4_file_history -context desk]
  364.     if {"$history" == ""} {
  365.     return
  366.     }
  367.     foreach levelPath $history {
  368.     $this addFileHistory "" $levelPath
  369.     }
  370. }
  371.  
  372. method CommonBrowser::saveFileHistory {this} {
  373.     set history ""
  374.     [$this fileHistorySet] foreach entry {
  375.     set history [linsert $history 0 [$entry levelPath]]
  376.     }
  377.     if {$history != [m4_var get M4_file_history -context desk]} {
  378.     m4_var set M4_file_history $history -context desk
  379.     }
  380. }
  381.  
  382. method CommonBrowser::addContextArea {this} {
  383.     $this wmtArea [BrowseWmtArea new $this.DC.WA]
  384. }
  385.  
  386. method CommonBrowser::updateToolBar {this} {
  387.     if [catch {[$this menuHdlr] setCurrentContext} errorMsg] {
  388.     if [info exists errorInfo] {
  389.         set errorTrace $errorInfo
  390.         set errorCodeCopy $errorCode
  391.         resetErrorVars
  392.     } else {
  393.         set errorTrace ""
  394.         set errorCodeCopy ""
  395.     }
  396.     } else {
  397.     set errorMsg ""
  398.     }
  399.     [$this infoView] updateToolBarEntries
  400.     if {"$errorMsg" != ""} {
  401.     global errorInfo errorCode
  402.     set errorInfo $errorTrace
  403.     set errorCode $errorCodeCopy
  404.     wmtkerror $errorMsg
  405.     }
  406. }
  407.  
  408. method CommonBrowser::updateWmtArea {this} {
  409.     if {! [isCommand [$this wmtArea]]} {
  410.     return
  411.     }
  412.  
  413.     [$this wmtArea] updateContextInfo
  414.     [$this wmtArea] updateViewInfo
  415.     [$this wmtArea] updateFilterIndicator
  416. }
  417.  
  418. method CommonBrowser::createPropContainers {this edit} {
  419.     require "propstruct.tcl"
  420.     require "wbpropcont.tcl"
  421.  
  422.     set selectedObjSet [$this selectedObjSet]
  423.     if [lempty $selectedObjSet] {
  424.     if {"[[$this treeView] selected]" != ""} {
  425.         set treeNode [[$this treeView] selected]
  426.     } else {
  427.         set treeNode [$this currentObj]
  428.     }
  429.     if [isCommand $treeNode] {
  430.         if [[$treeNode browsUiObj] isA PropertyObject] {
  431.         lappend selectedObjSet [$treeNode browsUiObj]
  432.         } else {
  433.         lappend selectedObjSet [$treeNode getParent PropertyObject]
  434.         }
  435.     } else {
  436.         lappend selectedObjSet [$this corporateObj]
  437.     }
  438.     }
  439.  
  440.     set maxNameLength 0
  441.     set propStructList [List new]
  442.     foreach obj $selectedObjSet {
  443.     set objType [$obj browserType]
  444.     set phaseType ""
  445.     set phaseV [$obj getParent PhaseVersion]
  446.     if {"$phaseV" != ""} {
  447.         set phaseType [[$phaseV phase] type]
  448.     }
  449.     PropLocation new .propLocation \
  450.         -containerKind [$obj uiClass] \
  451.         -containerType $objType \
  452.         -phaseType $phaseType
  453.     set compPropDefs [[$this propKnowledgeDB] definitions .propLocation]
  454.     if {[llength $compPropDefs] == 0} {
  455.         .propLocation delete
  456.         continue
  457.     }
  458.     set objName [$obj getInfo Name]
  459.     set objNameLength [string length $objName]
  460.     if {$objNameLength > $maxNameLength} {
  461.         set maxNameLength $objNameLength
  462.     }
  463.     $propStructList append [PropStruct new \
  464.         -name $objName \
  465.         -type $objType \
  466.         -component $obj \
  467.         -containerKey [.propLocation asString] \
  468.         -compPropDefs $compPropDefs]
  469.     .propLocation delete
  470.     }
  471.     set formatString "%-*.*s  %s"
  472.     set cntList [List new]
  473.     $propStructList foreach propStruct {
  474.     set pres [format $formatString $maxNameLength $maxNameLength \
  475.         [$propStruct name] [$propStruct type]]
  476.     set cnt [WbPropContainer new \
  477.         -editable $edit \
  478.         -propertyKey [$propStruct containerKey] \
  479.         -propertyPresentation $pres \
  480.         -propHolder [$propStruct component]]
  481.     foreach propDef [$propStruct compPropDefs] {
  482.         $cnt addPropDefinition $propDef
  483.     }
  484.     $cntList append $cnt
  485.     }
  486.     $this propContainerSet $cntList
  487. }
  488.  
  489. method CommonBrowser::releasePropContainers {this} {
  490.     # empty
  491. }
  492.  
  493. method CommonBrowser::setCurrentObj {this newObject} {
  494.     set errorStack ""
  495.  
  496.     if {! [isCommand $newObject]} {
  497.     set rootObject [lindex [[$this treeView] rootSet] 0]
  498.     if {! [isCommand $rootObject]} {
  499.         return $errorStack
  500.     }
  501.     set newObject $rootObject
  502.     }
  503.     set currentObj [$this currentObj]
  504.     if {$currentObj == $newObject} {
  505.     return $errorStack
  506.     }
  507.     if {[isCommand $currentObj] &&
  508.     [$currentObj browsUiObj] == [$newObject browsUiObj]} {
  509.     $this currentObj $newObject
  510.     $this updateView
  511.     return $errorStack
  512.     }
  513.  
  514.     $this currentObj $newObject
  515.  
  516.     # adjust title
  517.     $this updateTitle
  518.  
  519.     # adjust parent and treeNode associations
  520.     for {set treeNode $newObject} \
  521.     {"$treeNode" != ""} \
  522.     {set treeNode [$treeNode parent]} {
  523.     [$treeNode browsUiObj] treeNode $treeNode
  524.     if [isCommand [$treeNode parent]] {
  525.         [$treeNode browsUiObj] parent [[$treeNode parent] browsUiObj]
  526.     }
  527.     }
  528.  
  529.     # adjust the current client context
  530.     set levelPath ""
  531.     set levelObj ""
  532.     for {set contextlvl [$newObject browsUiObj]} \
  533.     {"$contextlvl" != ""} \
  534.     {set contextlvl [$contextlvl parent]} {
  535.     if {! ([$contextlvl isA CustomLevelVersion] ||
  536.           ([$contextlvl isA FileVersion] &&
  537.            [$contextlvl getParent CorporateGroupVersion] == ""))} continue
  538.     if {"$levelObj" == ""} {
  539.         set levelObj $contextlvl
  540.     }
  541.     set levelPath "/[$contextlvl identity]$levelPath"
  542.     }
  543.     if {"$levelPath" == "" &&
  544.     [isCommand [$this corporateObj]] &&
  545.     (! [[$this corporateObj] isNil])} {
  546.     set levelPath "/[[$this corporateObj] identity]"
  547.     }
  548.     if {"$levelPath" != "[$clientContext currentLevelIdString]"} {
  549.     [ClientContext::global] setLevelIds $levelPath
  550.     }
  551.  
  552.     # remove undoCommand if no longer valid
  553.     if {[isCommand [$this undoCommand]] &&
  554.     (! [[$this undoCommand] validAfterLevelChange])} {
  555.     [$this undoCommand] delete
  556.     }
  557.  
  558.     # read phases file
  559.     if [catch {getPhases} msg] {
  560.     append errorStack "$msg\n"
  561.     }
  562.  
  563.     # adjust the viewspec list
  564.     if [catch {[$this viewHdlr] setCurrentContext} msg] {
  565.     append errorStack "$msg\n"
  566.     }
  567.  
  568.     # adjust the objectspec list
  569.     if [catch {[$this objectHdlr] setCurrentContext} msg] {
  570.     append errorStack "$msg\n"
  571.     }
  572.  
  573.     # retrieve the possible file types
  574.     getFileTypes [$this objectHdlr]
  575.  
  576.     # change the view
  577.     [$this infoView] setCurrentObj $newObject
  578.  
  579.     # adjust the menu structure to the new situation,
  580.     if [catch {[$this menuHdlr] setCurrentContext} msg] {
  581.     append errorStack "$msg\n"
  582.     }
  583.     $this selectionChanged 1
  584.     if [isCommand [$this viewSelector]] {
  585.         [$this viewHdlr] adjustViewMenu \
  586.         "[[$newObject browsUiObj] uiClass]" \
  587.         "[[$newObject browsUiObj] browserType]"
  588.     }
  589.  
  590.     # adjust the toolBar
  591.     [$this infoView] updateToolBarEntries
  592.  
  593.     return $errorStack
  594. }
  595.  
  596. method CommonBrowser::getSelectedSet {this} {
  597.     return [[[$this infoView] area] selectedSet]
  598. }
  599.  
  600. method CommonBrowser::selectionChanged {this} {
  601.     # walk throught the menu structure to determine
  602.     # if the menus must be enabled/disabled
  603.     [$this menuHdlr] selectionChanged
  604. }
  605.  
  606. method CommonBrowser::open {this} {
  607.     if [$this opened] return
  608.     $this opened 1
  609.  
  610.     set id 0
  611.     foreach rootId [$this rootIdList] {
  612.     set rootObj [[lindex $rootId 0] new [lindex $rootId 1]]
  613.     set node [TreeNode new [$this navigationView].node$id $rootObj]
  614.     BrowserProcs::initializeInfo $rootObj $node
  615.     incr id 1
  616.     }
  617.  
  618.     # trigger the selectionChange of the menuHandler, to be sure
  619.     # that the menu entries are enabled/disabled correctly
  620.     if [isCommand [$this undoButton]] {
  621.     [$this undoButton] sensitive 0
  622.     }
  623.     $this selectionChanged
  624. }
  625.  
  626. method CommonBrowser::popUp {this} {
  627.     $this MainWindow::popUp
  628.     $this ready
  629.     $this cursor DEFAULT
  630. }
  631.  
  632. method CommonBrowser::stop {this} {
  633.     if {! [$this watchdogBusy]} {
  634.     $this WmtTool::stop
  635.     }
  636. }
  637.  
  638. method CommonBrowser::updateTitle {this} {
  639.     set currentObj [$this currentObj]
  640.     set title [$this title]
  641.     set hyphen [string first "-" $title]
  642.     if {$hyphen < 0} {
  643.     append title " -"
  644.     } else {
  645.     set title [string range $title 0 $hyphen]
  646.     }
  647.     set iconTitle [[$currentObj browsUiObj] getInfo Name]
  648.     append title " $iconTitle"
  649.     $this config \
  650.     -title $title \
  651.     -iconTitle $iconTitle
  652. }
  653.  
  654. method CommonBrowser::undoCommandBusy {this {type UndoCommand}} {
  655.     set cmd [$this undoCommand]
  656.     if {[isCommand $cmd] && [$cmd isA $type] && [$cmd busy]} {
  657.     return 1
  658.     }
  659.     return 0
  660. }
  661.  
  662. method CommonBrowser::editCut {this} {
  663.     if [isCommand [$this undoCommand]] {
  664.     [$this undoCommand] delete
  665.     }
  666.     busy {
  667.     set conversionSet(0) [[.main flatView] conversionSet]
  668.     [.main flatView] conversionSet "CUT_BROWSUIOBJ contextList"
  669.     foreach flatObj [[.main flatView] selectedSet] {
  670.         set conversionSet($flatObj) [$flatObj conversionSet]
  671.         $flatObj conversionSet "CUT_BROWSUIOBJ contextList"
  672.     }
  673.     [.main flatView] setClipboardValue
  674.     [.main flatView] conversionSet $conversionSet(0)
  675.     foreach flatObj [[.main flatView] selectedSet] {
  676.         $flatObj conversionSet $conversionSet($flatObj)
  677.     }
  678.     }
  679. }
  680.  
  681. method CommonBrowser::editCopy {this} {
  682.     if [isCommand [$this undoCommand]] {
  683.     [$this undoCommand] delete
  684.     }
  685.     busy {
  686.     [.main flatView] setClipboardValue
  687.     }
  688. }
  689.  
  690. method CommonBrowser::editPaste {this} {
  691.     if [isCommand [$this undoCommand]] {
  692.     [$this undoCommand] delete
  693.     }
  694.     require "editpastec.tcl"
  695.     global classCount
  696.     $this undoCommand [EditPasteCmd new editPasteCmd$classCount]
  697.     incr classCount
  698.     [$this undoCommand] do
  699.  
  700.     # Cleanup when clipboard is empty
  701.     if {[isCommand [$this undoCommand]] &&
  702.     [[$this undoCommand] currentObj] == ""} {
  703.     [$this undoCommand] delete
  704.     }
  705. }
  706.  
  707. method CommonBrowser::editSelAll {this} {
  708.     if [isCommand [$this undoCommand]] {
  709.     [$this undoCommand] delete
  710.     }
  711.     require "editselall.tcl"
  712.     global classCount
  713.     $this undoCommand [EditSelAllCmd new editSelAllCmd$classCount]
  714.     incr classCount
  715.     [$this undoCommand] do
  716. }
  717.  
  718. method CommonBrowser::editDeselAll {this} {
  719.     if [isCommand [$this undoCommand]] {
  720.     [$this undoCommand] delete
  721.     }
  722.     require "editdesela.tcl"
  723.     global classCount
  724.     $this undoCommand [EditDeselAllCmd new editDeselAllCmd$classCount]
  725.     incr classCount
  726.     [$this undoCommand] do
  727. }
  728.  
  729. method CommonBrowser::editSelInv {this} {
  730.     if [isCommand [$this undoCommand]] {
  731.     [$this undoCommand] delete
  732.     }
  733.     require "editselinv.tcl"
  734.     global classCount
  735.     $this undoCommand [EditSelInvCmd new editSelInvCmd$classCount]
  736.     incr classCount
  737.     [$this undoCommand] do
  738. }
  739.  
  740. method CommonBrowser::editUndo {this} {
  741.     if [isCommand [$this undoCommand]] {
  742.     [$this undoCommand] toggleUndo
  743.     }
  744. }
  745.  
  746. # Do not delete this line -- regeneration end marker
  747.  
  748. method CommonBrowser::addPropContainer {this newPropContainer} {
  749.     [$this propContainerSet] append $newPropContainer
  750.  
  751. }
  752.  
  753. method CommonBrowser::removePropContainer {this oldPropContainer} {
  754.     [$this propContainerSet] removeValue $oldPropContainer
  755. }
  756.  
  757.