home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / komix / DATA.Z / browser.tcl < prev    next >
Text File  |  1997-11-05  |  10KB  |  405 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1997
  4. #
  5. #      File:           @(#)browser.tcl    /main/titanic/25
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)browser.tcl    /main/titanic/25   5 Nov 1997 Copyright 1997 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. require "browseropt.tcl"
  13. require "brsymb2url.tcl"
  14. require "classmaker.tcl"
  15. require "dragbrowsv.tcl"
  16. require "infoobject.tcl"
  17. require "showversio.tcl"
  18. # End user added include file section
  19.  
  20. require "commonbrow.tcl"
  21.  
  22. # Definition of Browser class.
  23. # This class contains basic operations of the browsers.
  24.  
  25. Class Browser : {CommonBrowser} {
  26.     method destructor
  27.     constructor
  28.     method createInterface
  29.     method editCut
  30.     method getExpandedSelection
  31.     method helpOnContext
  32.     method helpOnName
  33.     method initView
  34.     method popUp
  35.     method selectedObjSet
  36.     method selectedNameSet
  37.     method selectionChanged
  38.     method setViewButton
  39.     method setViewMode
  40.     method updateView
  41.     method getStatus
  42.     method setStatus
  43.     method removeStatus
  44.     attribute _selectedObjSet
  45.     attribute _selectedNameSet
  46.     attribute initialContext
  47.     attribute undoButton
  48.     attribute propKnowledgeDB
  49.     attribute status
  50. }
  51.  
  52. method Browser::destructor {this} {
  53.     # Start destructor user section
  54.  
  55.     if [$this opened] {
  56.         $this saveWindowGeometry desk
  57.     }
  58.     catch {
  59.         [$this propKnowledgeDB] delete
  60.     }
  61.  
  62.     # End destructor user section
  63.     $this CommonBrowser::destructor
  64. }
  65.  
  66. constructor Browser {class this name} {
  67.     set this [CommonBrowser::constructor $class $this $name desk]
  68.  
  69.     # Return if an error box is already popped up
  70.     if [isCommand .main.error] {
  71.     return $this
  72.     }
  73.  
  74.     $this status [Dictionary new]
  75.  
  76.     $this propKnowledgeDB [PropKnowledgeDB new \
  77.     $this.propKnowledgeDB [$this moduleHdlr]]
  78.  
  79.     # create flat view
  80.     [$this infoView] area [DragBrowsView new [$this infoView].area \
  81.     -selectionChanged {.main selectionChanged} \
  82.     -mode [m4_var get M4_infoview_mode -context desk] \
  83.     -font "[m4_var get M4_font -context desk]" \
  84.     -columnCount 46 \
  85.     -selectionPolicy EXTENDED]
  86.  
  87.     # create popup menu for view
  88.     ViewPopUpMenu new [[$this infoView] area].pop  \
  89.     -poppedUp {
  90.         [[.main infoView] area].pop entrySet \
  91.         [[.main menuHdlr] validPopUpEntrySet]
  92.     }
  93.  
  94.     # config interface
  95.     [$this navigationView] config \
  96.     -selectionChanged {%this updateSelected} \
  97.     -font "[m4_var get M4_font -context desk]" \
  98.     -rowCount 12 \
  99.     -columnCount 32
  100.     $this notSavedM4Vars {
  101.     M4_corproles__*
  102.     M4_projroles__*
  103.     M4_levelpath_ids
  104.     M4_parent_pid
  105.     }
  106.     $this setWindowGeometry desk
  107.  
  108.     [$this treeView] view [$this flatView]
  109.     [$this flatView] tree [$this treeView]
  110.  
  111.     return $this
  112. }
  113.  
  114. method Browser::createInterface {this} {
  115.     $this CommonBrowser::createInterface
  116.     $this viewSelector [$this menuBar].view.menu
  117.     $this exitButton [$this menuBar].file.menu.exit
  118.     $this undoButton [$this menuBar].edit.menu.undo
  119. }
  120.  
  121.  
  122. # Redefine editCut to expand the
  123. # selection in the browser using copyspecs.
  124. #
  125. method Browser::editCut {this} {
  126.     set oldSelection [$this selectedSet]
  127.     $this selectedSet [$this getExpandedSelection $oldSelection]
  128.     $this CommonBrowser::editCut
  129.     $this selectedSet $oldSelection
  130. }
  131.  
  132.  
  133. # If selectedSet contains FileVersions
  134. # expand the selection using copyspecs and
  135. # return it.
  136. #
  137. method Browser::getExpandedSelection {this selection} {
  138.     if { ![[[lindex $selection 0] browsUiObj] isA FileVersion] } {
  139.     return $selection
  140.     }
  141.  
  142.     set fileVersions {}
  143.     foreach object $selection {
  144.     lappend fileVersions [$object browsUiObj]
  145.     }
  146.  
  147.     # retrieve config and system to invoke the action
  148.     set cc [ClientContext::global]
  149.     set sysV [$cc currentSystem]
  150.     set confV [$cc currentConfig]
  151.     if { [$sysV isNil] || [$confV isNil] } {
  152.     # this should not happen
  153.     return $selection
  154.     }
  155.  
  156.     # this action may take a while
  157.     busy {
  158.     $sysV SystemVersion::copy -specified $fileVersions noCopy files $confV
  159.  
  160.     # find related browser objects
  161.     set objects {}
  162.     if { [$this selectionOwner] == [$this flatView] } {
  163.         foreach file $files {
  164.         lappend objects [$file infoObject]
  165.         }
  166.     } else {
  167.         foreach file $files {
  168.         global ${file}::treeNode
  169.         lappend objects [set ${file}::treeNode]
  170.         }
  171.     }
  172.     }
  173.  
  174.     return $objects
  175. }
  176.  
  177. method Browser::helpOnContext {this} {
  178.     if {[llength [$this selectedObjSet]] == 1} {
  179.     set prefix ""
  180.     set obj [lindex [$this selectedObjSet] 0]
  181.     } else {
  182.     set prefix "crnt_"
  183.     set currentObj [$this currentObj]
  184.     if {"$currentObj" == ""} {
  185.         set obj [$this corporateObj]
  186.     } else {
  187.         set obj [$currentObj browsUiObj]
  188.     }
  189.     }
  190.  
  191.     set browserObjType [$obj browserObjType]
  192.     case "$browserObjType" in {
  193.     {CustFVDbObj DSysVDbObj ExtFUiObj LocalSection
  194.      PSysVDbObj SFileLDbObj SSysVDbObj UsrLDbObj} {
  195.         set localKey "${prefix}$browserObjType"
  196.     }
  197.     ExtFVDbObj {
  198.         set phType [[$obj phase] type]
  199.         if {$phType == "Implementation"} {
  200.         # fixed one, if separate help is developed
  201.         # we need the else case again + module adaption
  202.         set localKey extFileInImpl
  203.         } else {
  204.         # default
  205.         set localKey "${prefix}[$obj browserType]"
  206.         }
  207.     }
  208.     default {
  209.         set localKey "${prefix}[$obj browserType]"
  210.     }
  211.     }
  212.  
  213.     $this helpOnName $localKey
  214. }
  215.  
  216. method Browser::helpOnName {this name} {
  217.     global short2url
  218.     if {! [catch {set url $short2url($name)}]} {
  219.     showHelp $url
  220.     return
  221.     }
  222.  
  223.     if [regsub "crnt_" $name "" name] {
  224.     $this helpOnName $name
  225.     return
  226.     }
  227.  
  228.     wmtkerror "Sorry, no help available for '$name'"
  229. }
  230.  
  231. method Browser::initView {this} {
  232.     busy {
  233.     wmtkmessage "Loading ..."
  234.  
  235.     $this open
  236.  
  237.     # Initialize according to the initialContext
  238.     if {"[$this initialContext]" == ""} {
  239.         set treeNode [lindex [[$this treeView] rootSet] 0]
  240.     } else {
  241.         set treeNode ""
  242.         foreach objId [$this initialContext] {
  243.         if {"$treeNode" == ""} {
  244.             set childSet [[$this treeView] rootSet]
  245.         } else {
  246.             $treeNode foldState 0
  247.             $treeNode appendChildren
  248.             set childSet [$treeNode childSet]
  249.         }
  250.         set found 0
  251.         foreach childNode $childSet {
  252.             set identity [[$childNode browsUiObj] uiIdentity]
  253.             if {"$identity" == "$objId"} {
  254.             set found 1
  255.             break
  256.             }
  257.         }
  258.         if {! $found} {
  259.             break
  260.         }
  261.         set treeNode $childNode
  262.         if {! [[$treeNode browsUiObj] hasChildren]} {
  263.             break
  264.         }
  265.         }
  266.     }
  267.     BrowserProcs::initializeInfo [$treeNode browsUiObj] $treeNode
  268.     $treeNode open
  269.     $this setViewButton
  270.  
  271.     checkModuleWarnings
  272.  
  273.     wmtkmessage Done
  274.     }
  275. }
  276.  
  277. method Browser::popUp {this} {
  278.     $this CommonBrowser::popUp
  279.     $this setViewButton
  280. }
  281.  
  282. method Browser::selectedObjSet {this} {
  283.     set selectedObjSet [$this _selectedObjSet]
  284.     if {"$selectedObjSet" == "undefined"} {
  285.     set selectedObjSet ""
  286.     set selection [concat \
  287.         [[$this treeView] selected] \
  288.         [[$this flatView] selectedSet] \
  289.     ]
  290.     foreach obj $selection {
  291.         lappend selectedObjSet [$obj browsUiObj]
  292.     }
  293.     $this _selectedObjSet $selectedObjSet
  294.     }
  295.     if $makeSelectionUpToDate {
  296.     foreach obj $selectedObjSet {
  297.         $obj makeUpToDate
  298.     }
  299.     }
  300.     return $selectedObjSet
  301. }
  302.  
  303. method Browser::selectedNameSet {this} {
  304.     set selectedNameSet [$this _selectedNameSet]
  305.     if {"$selectedNameSet" == "undefined"} {
  306.     set selectedNameSet ""
  307.     set selection [concat \
  308.         [[$this treeView] selected] \
  309.         [[$this flatView] selectedSet] \
  310.     ]
  311.     foreach obj $selection {
  312.         set browsUiObj [$obj browsUiObj]
  313.         lappend selectedNameSet [list \
  314.         "[$browsUiObj getInfo Name]" "[$browsUiObj getInfo Type]" \
  315.         ]
  316.     }
  317.     $this _selectedNameSet $selectedNameSet
  318.     }
  319.     return $selectedNameSet
  320. }
  321.  
  322.  
  323. # This function is called when the selected state
  324. # has changed.
  325. #
  326. method Browser::selectionChanged {this {keepSelection 0}} {
  327.     if $keepSelection {
  328.     # Keep the selected objects that still exist selected
  329.     set selectedSet ""
  330.     foreach obj [[$this flatView] selectedSet] {
  331.         if [$obj filteredOutState] continue
  332.         lappend selectedSet $obj
  333.     }
  334.     [$this flatView] selectedSet $selectedSet
  335.     }
  336.  
  337.     [$this status] contents ""
  338.  
  339.     $this _selectedObjSet "undefined"
  340.     $this _selectedIdSet "undefined"
  341.     $this _selectedNameSet "undefined"
  342.     $this _selectedNameTypeSet "undefined"
  343.  
  344.     $this CommonBrowser::selectionChanged
  345.  
  346.     [$this flatView] updateConversionSet
  347. }
  348.  
  349.  
  350. # Select the view-radioButton button according to the
  351. # view-mode of the current view.
  352. #
  353. method Browser::setViewButton {this} {
  354.     set arbiter [$this menuBar].view.menu.menuarbiter
  355.     if {! [isCommand $arbiter]} return
  356.  
  357.     case "[[$this flatView] mode]" in {
  358.     {ICON}        {$arbiter currentButton 0}
  359.     {SMALLICON} {$arbiter currentButton 1}
  360.     {DETAIL}    {$arbiter currentButton 2}
  361.     }
  362. }
  363.  
  364.  
  365. # Set the mode of the view according to the current
  366. # selected view-radioButton.
  367. #
  368. method Browser::setViewMode {this} {
  369.     set arbiter [$this menuBar].view.menu.menuarbiter
  370.     if {! [isCommand $arbiter]} return
  371.  
  372.     case "[$arbiter currentButton]" in {
  373.     {0} {[$this flatView] mode ICON}
  374.     {1} {[$this flatView] mode SMALLICON}
  375.     {2} {[$this flatView] mode DETAIL}
  376.     }
  377.     m4_var set M4_infoview_mode [[$this flatView] mode] -context desk
  378. }
  379.  
  380. method Browser::updateView {this} {
  381.     global makeSelectionUpToDate
  382.     set makeSelectionUpToDate 0
  383.     busy {
  384.     [$this infoView] display ""
  385.     [.main treeView] rebuild
  386.     .main selectionChanged 1
  387.     }
  388.     set makeSelectionUpToDate 1
  389. }
  390.  
  391. # Do not delete this line -- regeneration end marker
  392.  
  393. method Browser::getStatus {this value} {
  394.     return [[$this status] set $value]
  395. }
  396.  
  397. method Browser::setStatus {this value newStatus} {
  398.     [$this status] set $value $newStatus
  399. }
  400.  
  401. method Browser::removeStatus {this value} {
  402.     [$this status] unset $value
  403. }
  404.  
  405.