home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / komix / DATA.Z / infoview.tcl < prev    next >
Text File  |  1997-09-19  |  15KB  |  536 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1997
  4. #
  5. #      File:           @(#)infoview.tcl    /main/titanic/9
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)infoview.tcl    /main/titanic/9   19 Sep 1997 Copyright 1997 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. require "infoheader.tcl"
  13. require "infoobject.tcl"
  14. require "fastviewha.tcl"
  15. # End user added include file section
  16.  
  17.  
  18. Class InfoView : {DlgRow} {
  19.     method destructor
  20.     constructor
  21.     method clear
  22.     method display
  23.     method print
  24.     method saveContents
  25.     method setCurrentObj
  26.     method sort
  27.     method updateToolBarEntries
  28.     method addNewObject
  29.     method removeNewObject
  30.     method addOldObject
  31.     method removeOldObject
  32.     method getVisible
  33.     method setVisible
  34.     method removeVisible
  35.     attribute area
  36.     attribute currentObj
  37.     attribute currentViewName
  38.     attribute currentViewObj
  39.     attribute currentViewProperties
  40.     attribute currentViewToolBarEntries
  41.     attribute count
  42.     attribute fastViewHandler
  43.     attribute removedObj
  44.     attribute newObjectSet
  45.     attribute oldObjectSet
  46.     attribute currentSpec
  47.     attribute visible
  48. }
  49.  
  50. method InfoView::destructor {this} {
  51.     # Start destructor user section
  52.     [$this fastViewHandler] delete
  53.     # End destructor user section
  54. }
  55.  
  56. constructor InfoView {class this name} {
  57.     set this [DlgRow::constructor $class $this $name]
  58.     $this visible [Dictionary new]
  59.     $this oldObjectSet [List new]
  60.     $this newObjectSet [List new]
  61.  
  62.     # Initialize attributes
  63.     $this count 0
  64.     $this currentViewName "Default"
  65.  
  66.     $this fastViewHandler [FastViewHandler new $this.fastViewHandler]
  67.  
  68.     return $this
  69. }
  70.  
  71. method InfoView::clear {this} {
  72.     [$this newObjectSet] foreach object {
  73.     $object delete
  74.     }
  75.     [$this newObjectSet] contents ""
  76.     foreach header [[$this area] headerSet] {
  77.     $header delete
  78.     }
  79. }
  80.  
  81. method InfoView::display {this viewName} {
  82.     set currentObj [$this currentObj]
  83.     if {! [isCommand $currentObj]} {
  84.     $this clear
  85.     return
  86.     }
  87.     [$this fastViewHandler] checkView $this
  88.  
  89.     # Determine current view specification
  90.     set removedObj [$this removedObj]
  91.     if {[isCommand $removedObj] && $removedObj == $currentObj}  {
  92.     set skipError 1
  93.     } else {
  94.     set skipError 0
  95.     }
  96.     set obj [$currentObj browsUiObj]
  97.     if [catch {set browserType [$obj browserType]} errorMsg] {
  98.     if $skipError {
  99.         resetErrorVars
  100.     } else {
  101.         wmtkerror $errorMsg
  102.     }
  103.     $this clear
  104.     return
  105.     }
  106.     set objType [$obj uiClass]
  107.     if {"$viewName" == ""} {
  108.     set viewName "[$this currentViewName]"
  109.     }
  110.     # GroundWorks does not have a Default view on Corporate level
  111.     if {"$viewName" == "Default" &&
  112.     "$objType" == "Corporate"} {
  113.     set inDefaultCorporateView 1
  114.     if {(! [isCommand [[.main moduleHdlr] getModuleSpec objectteam]]) &&
  115.         [isCommand [[.main moduleHdlr] getModuleSpec groundworks]]} {
  116.         set viewName "GroundWorks"
  117.     }
  118.     } else {
  119.     set inDefaultCorporateView 0
  120.     }
  121.     # check first fastViewHandler
  122.     set currentSpec [[$this fastViewHandler] getViewSpec \
  123.     "$objType" "$browserType" "$viewName" \
  124.     ]
  125.     if {$currentSpec == ""} {
  126.         $this currentSpec [[$wmttoolObj viewHdlr] getViewSpec \
  127.         "$objType" "$browserType" "$viewName" \
  128.         ]
  129.     } else {
  130.     $this currentSpec $currentSpec
  131.     }
  132.  
  133.     # Clear view and return if view-spec could not be found
  134.     if {! [isCommand [$this currentSpec]]} {
  135.     if {(! $inDefaultCorporateView) && "$viewName" != "Default"} {
  136.         $this display Default
  137.         return
  138.     }
  139.     $this currentViewName $viewName
  140.     $this currentViewObj $obj
  141.     $this currentViewProperties ""
  142.     $this clear
  143.     wmtkerror \
  144.         "Could not find default view specification '$objType $browserType'"
  145.     return
  146.     }
  147.  
  148.     # Determine if headers should be removed
  149.     if {"[$this currentViewProperties]" == "[[$this currentSpec] properties]"} {
  150.     set removeHeaders 0
  151.     } else {
  152.     set removeHeaders 1
  153.     }
  154.     $this currentViewProperties [[$this currentSpec] properties]
  155.  
  156.     # Need to update the toolBarEntries when changing view only
  157.     if {[isCommand [$wmttoolObj toolBar]] &&
  158.     "$obj" == "[$this currentViewObj]" &&
  159.     "$viewName" != "[$this currentViewName]"} {
  160.     $this updateToolBarEntries 1
  161.     }
  162.  
  163.     $this currentViewName $viewName
  164.     $this currentViewObj $obj
  165.     if [isCommand [$wmttoolObj wmtArea]] {
  166.     [$wmttoolObj wmtArea] updateViewInfo
  167.     }
  168.  
  169.     busy {
  170.     # Retrieve the children repository objects
  171.     set errorStack \
  172.         [$obj initializeChildSet [[$this currentSpec] associations]]
  173.     if {"$errorStack" != ""} {
  174.         if [info exists errorInfo] {
  175.         set errorInfoCopy $errorInfo
  176.         } else {
  177.         set errorInfoCopy ""
  178.         }
  179.         if [info exists errorCode] {
  180.         set errorCodeCopy $errorCode
  181.         } else {
  182.         set errorCodeCopy ""
  183.         }
  184.     }
  185.  
  186.     # Initialize
  187.     set childSet ""
  188.     foreach association [[$this currentSpec] associations] {
  189.         append childSet " [$obj getChildSet $association]"
  190.     }
  191.     foreach objectType [[$this visible] names] {
  192.         $this removeVisible $objectType
  193.     }
  194.     set objectTypes [[$this currentSpec] objectTypes]
  195.     if [lempty $objectTypes] {
  196.         set checkObjectTypes 0
  197.     } else {
  198.         set checkObjectTypes 1
  199.         foreach objectType $objectTypes {
  200.         $this setVisible $objectType 1
  201.         }
  202.     }
  203.     set headerCount 0
  204.     foreach headerSpec [$this currentViewProperties] {
  205.         set j 0
  206.         foreach element $headerSpec {
  207.         set headerMatrix($headerCount,$j) $element
  208.         incr j 1
  209.         }
  210.         incr headerCount 1
  211.     }
  212.  
  213.     # Create header row
  214.     if $removeHeaders {
  215.         $this clear
  216.         for {set id 0} {$id < $headerCount} {incr id 1} {
  217.         set header [$this area].header$id
  218.         InfoHeader new $header \
  219.             -label "$headerMatrix($id,0)" \
  220.             -width "$headerMatrix($id,1)" \
  221.             -type "$headerMatrix($id,2)" \
  222.             -sortPolicy "[lindex $headerMatrix($id,3) 0]" \
  223.             -sortIndex [lindex $headerMatrix($id,3) 1]
  224.         }
  225.     }
  226.  
  227.     # Create rows
  228.     set index 0
  229.     set count [$this count]
  230.     [$this oldObjectSet] contents [[$this area] objectSet]
  231.     [$this newObjectSet] contents ""
  232.     foreach child $childSet {
  233.         set object [$child infoObject]
  234.         $child parent $obj
  235.         BrowserProcs::initializeInfo $child $child
  236.  
  237.         # Create row, skip if child's type is invisible
  238.         set uiType "[$child browserType]"
  239.         if {$checkObjectTypes &&
  240.         "[$this getVisible $uiType]" == ""} continue
  241.         if {"$object" == ""} {
  242.         set object [$this area].object$count
  243.         incr count
  244.         InfoObject new $object $child
  245.         } else {
  246.         $this removeOldObject $object
  247.         }
  248.         $this addNewObject $object
  249.  
  250.         # Determine label and details
  251.         set label ""
  252.         set details ""
  253.         for {set i 0} {$i < $headerCount} {incr i 1} {
  254.         set column "$headerMatrix($i,0)"
  255.         set value "[$child getInfo $column]"
  256.         if {"$column" == "Name"} {
  257.             set value "[$child uiPrefix]$value"
  258.         }
  259.         if {$i == 0} {
  260.             set label "$value"
  261.         } else {
  262.             lappend details "$value"
  263.         }
  264.         }
  265.  
  266.         # Update row
  267.         set childType "[$child uiClass]"
  268.         set typeSpec \
  269.         [getObjectSpec [$wmttoolObj objectHdlr] "$childType" "$uiType"]
  270.         if {"$typeSpec" != ""} {
  271.         set smallIcon "[$typeSpec smallIcon]"
  272.         set largeIcon "[$typeSpec largeIcon]"
  273.         set activated "[$typeSpec defaultAction]"
  274.         } else {
  275.         set smallIcon ""
  276.         set largeIcon ""
  277.         set activated ""
  278.         }
  279.         $object config \
  280.         -index $index \
  281.         -smallIcon "$smallIcon" \
  282.         -largeIcon "$largeIcon" \
  283.         -label "$label" \
  284.         -details "$details" \
  285.         -activated "$activated"
  286.  
  287.         incr index 1
  288.     }
  289.     $this count $count
  290.  
  291.     [$this oldObjectSet] foreach object {
  292.         $object delete
  293.     }
  294.     if [isCommand [$wmttoolObj filterHdlr]] {
  295.         [$wmttoolObj filterHdlr] filter
  296.     }
  297.  
  298.     # Sort the view
  299.     $this sort
  300.     }
  301.  
  302.     if {"$errorStack" != ""} {
  303.     if $skipError {
  304.         resetErrorVars
  305.     } else {
  306.         global errorInfo errorCode
  307.         set errorInfo $errorInfoCopy
  308.         set errorCode $errorCodeCopy
  309.         wmtkerror $errorStack
  310.     }
  311.     }
  312. }
  313.  
  314. method InfoView::print {this} {
  315.     set printer [m4_var get M4_a_printer]
  316.     set printfile [args_file {}]
  317.     $this saveContents $printfile
  318.     $wmttoolObj startCommand extern \
  319.     "$printer $printfile" [list BasicFS::removeFile $printfile] \
  320.     "Sending output to $printer..." \
  321.     {0 0} 0
  322. }
  323.  
  324. method InfoView::saveContents {this printFile} {
  325.     set fid [open $printFile w]
  326.     set limit [m4_var get M4_a_printer_llen]
  327.  
  328.     # Print level information
  329.     if [isCommand [$wmttoolObj wmtArea]] {
  330.     set arrayList ""
  331.     set projectInfo [[$wmttoolObj wmtArea] projectInfo]
  332.     lappend arrayList "\
  333.         \"[$projectInfo labelText]\" \"[$projectInfo valueText]\""
  334.     set configInfo [[$wmttoolObj wmtArea] configInfo]
  335.     lappend arrayList "\
  336.         \"[$configInfo labelText]\" \"[$configInfo valueText]\""
  337.     set phaseInfo [[$wmttoolObj wmtArea] phaseInfo]
  338.     lappend arrayList "\
  339.         \"[$phaseInfo labelText]\" \"[$phaseInfo valueText]\""
  340.     set systemInfo [[$wmttoolObj wmtArea] systemInfo]
  341.     lappend arrayList "\
  342.         \"[$systemInfo labelText]\" \"[$systemInfo valueText]\""
  343.     set viewInfo [[$wmttoolObj wmtArea] viewInfo]
  344.     lappend arrayList "\
  345.         \"[$viewInfo labelText]\" \"[$viewInfo valueText]\""
  346.     set filterInfo [[$wmttoolObj wmtArea] filterInfo]
  347.     lappend arrayList "\
  348.         \"[$filterInfo labelText]\" \"[$filterInfo valueText]\""
  349.     set lengths [maxLengthList $arrayList]
  350.     set formatString "%-*.*s  %-*.*s"
  351.     foreach array $arrayList {
  352.         set line [format "$formatString" \
  353.         [lindex $lengths 0] [lindex $lengths 0] [lindex $array 0] \
  354.         [lindex $lengths 1] [lindex $lengths 1] [lindex $array 1]]
  355.         foreach part [lineBreak $line $limit " "] {puts $fid $part}
  356.     }
  357.     puts $fid "\n"
  358.     }
  359.  
  360.     # Print view information
  361.     set i 0
  362.     set line ""
  363.     foreach header [[$this area] headerSet] {
  364.     set len($i) [expr [$header width] + 1]
  365.     append line [format "%-*.*s" $len($i) $len($i) [$header label]]
  366.     incr i 1
  367.     }
  368.     if {$i == 0} {
  369.     close $fid
  370.     return
  371.     }
  372.     foreach part [lineBreak $line $limit " "] {puts $fid $part}
  373.     set line ""
  374.     for {set count 0} {$count < $i} {incr count 1} {
  375.     for {set column 0} {$column < $len($count)} {incr column 1} {
  376.         append line "="
  377.     }
  378.     }
  379.     foreach part [lineBreak $line $limit " "] {puts $fid $part}
  380.  
  381.     foreach object [[$this area] objectSet] {
  382.     set line ""
  383.     if [$object filteredOutState] continue
  384.     append line [format "%-*.*s" $len(0) $len(0) [$object label]]
  385.     set i 1
  386.     foreach detail [$object details] {
  387.         append line [format "%-*.*s" $len($i) $len($i) $detail]
  388.         incr i 1
  389.     }
  390.     foreach part [lineBreak $line $limit " "] {puts $fid $part}
  391.     }
  392.  
  393.     close $fid
  394. }
  395.  
  396. method InfoView::setCurrentObj {this newObject} {
  397.     $this currentObj $newObject
  398.     $this display [$this currentViewName]
  399. }
  400.  
  401. method InfoView::sort {this} {
  402.     if [[$this newObjectSet] empty] {
  403.     return
  404.     }
  405.  
  406.     foreach header [[$this area] headerSet] {
  407.     if {"[$header sortPolicy]" == "none"} continue
  408.     set index [$header sortIndex]
  409.     if {("$index" == "") || ($index < 1)} continue
  410.     set sortSpec($index) \
  411.         "-column {$header [$header type] [$header sortPolicy]}"
  412.     }
  413.  
  414.     set sortSpecList ""
  415.     if [catch {set indices [lsort -integer [array names sortSpec]]}] {
  416.     global errorInfo
  417.     set errorInfo ""
  418.     global errorCode
  419.     set errorCode ""
  420.     } else {
  421.     foreach index $indices {
  422.         append sortSpecList " $sortSpec($index)"
  423.     }
  424.     }
  425.     set sortProc [[$this currentSpec] sortScript]
  426.     if {"$sortProc" != ""} {
  427.     set sortSpecList "$sortSpecList -command $sortProc"
  428.     }
  429.  
  430.     if [lempty $sortSpecList] {
  431.     set sortSpecList "-command InfoObject::sort"
  432.     }
  433.  
  434.     eval [$this area] sort $sortSpecList
  435. }
  436.  
  437. method InfoView::updateToolBarEntries {this {removeEntries 0}} {
  438.     # ToolBar entries are added:
  439.     # - in the customizehandler when a menu entry has inToolBar set to 1
  440.     # - here, according to toolBarEntries of viewSpec
  441.  
  442.     if {! [isCommand [$wmttoolObj toolBar]]} {
  443.     return
  444.     }
  445.  
  446.     # Determine current toolBar entries
  447.     # - remove toolBar entries specified in previous view
  448.     # - add toolBar entries specified in current view
  449.     set oldEntrySet [[$wmttoolObj toolBar] entrySet]
  450.     if $removeEntries {
  451.     foreach entry [$this currentViewToolBarEntries] {
  452.         set removeEntry($entry) 1
  453.     }
  454.     foreach entry $oldEntrySet {
  455.         if [info exists removeEntry($entry)] continue
  456.         lappend toolBarEntries $entry
  457.     }
  458.     } else {
  459.     set toolBarEntries $oldEntrySet
  460.     }
  461.     if [isCommand [$this currentSpec]] {
  462.     foreach entry [[$this currentSpec] toolBarEntries] {
  463.         if {"$entry" != "SEPARATOR"} {
  464.         set entry "[$wmttoolObj menuBar]$entry"
  465.         set viewEntry($entry) 1
  466.         }
  467.         lappend toolBarEntries $entry
  468.     }
  469.     }
  470.  
  471.     # Check toolBar entries
  472.     # - skip entries of non-existing buttons
  473.     # - skip double entries
  474.     # - skip dummy separators
  475.     set separator 0
  476.     set entrySet ""
  477.     set viewToolBarEntries ""
  478.     foreach entry $toolBarEntries {
  479.     if {"$entry" == "SEPARATOR" && $separator == 0} {
  480.         lappend entrySet "$entry"
  481.         set separator 1
  482.     } else {
  483.         if {! [isCommand $entry]} continue
  484.         if [info exists toolBarEntry($entry)] continue
  485.         lappend entrySet "$entry"
  486.         if [info exists viewEntry($entry)] {
  487.         lappend viewToolBarEntries $entry
  488.         }
  489.         set toolBarEntry($entry) 1
  490.         set separator 0
  491.     }
  492.     }
  493.     if {[llength $toolBarEntries] > 0 && "$entry" == "SEPARATOR"} {
  494.     set entrySet [lreplace $entrySet [expr [llength $entrySet] - 1] end]
  495.     }
  496.     $this currentViewToolBarEntries $viewToolBarEntries
  497.  
  498.     # Set toolBar entries if necessary
  499.     if {$entrySet != $oldEntrySet} {
  500.     [$wmttoolObj toolBar] entrySet $entrySet
  501.     }
  502. }
  503.  
  504. # Do not delete this line -- regeneration end marker
  505.  
  506. method InfoView::addNewObject {this newNewObject} {
  507.     [$this newObjectSet] append $newNewObject
  508.  
  509. }
  510.  
  511. method InfoView::removeNewObject {this oldNewObject} {
  512.     [$this newObjectSet] removeValue $oldNewObject
  513. }
  514.  
  515. method InfoView::addOldObject {this newOldObject} {
  516.     [$this oldObjectSet] append $newOldObject
  517.  
  518. }
  519.  
  520. method InfoView::removeOldObject {this oldOldObject} {
  521.     [$this oldObjectSet] removeValue $oldOldObject
  522. }
  523.  
  524. method InfoView::getVisible {this objectType} {
  525.     return [[$this visible] set $objectType]
  526. }
  527.  
  528. method InfoView::setVisible {this objectType newVisible} {
  529.     [$this visible] set $objectType $newVisible
  530. }
  531.  
  532. method InfoView::removeVisible {this objectType} {
  533.     [$this visible] unset $objectType
  534. }
  535.  
  536.