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

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1997
  4. #
  5. #      File:           @(#)diagramedi.tcl    /main/titanic/43
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)diagramedi.tcl    /main/titanic/43   27 Nov 1997 Copyright 1997 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12.  
  13. require edwmtarea.tcl
  14. require edpropcont.tcl
  15. require propstruct.tcl
  16. require labelpartn.tcl
  17. require showversio.tcl
  18. require systemutil.tcl
  19. require editoropti.tcl
  20. require m4vardescr.tcl
  21. require otherude.tcl
  22.  
  23. # Hidden component types.
  24. #
  25. global hiddenCompTypes
  26.  
  27. set hiddenCompTypes(link_attrib) 1
  28.  
  29. set hiddenCompTypes(attribute) 1
  30. set hiddenCompTypes(method) 1
  31. set hiddenCompTypes(parameter) 1
  32.  
  33. set hiddenCompTypes(activity) 1
  34. set hiddenCompTypes(state_action) 1
  35.  
  36. global compIndent
  37. set compIndent [Dictionary new -contents {
  38.     parameter    "        "
  39.     attribute    "    "
  40.     method        "    "
  41.     link_attrib    "    "
  42.     activity    "    "
  43.     state_action    "    "
  44. }]
  45.  
  46. # End user added include file section
  47.  
  48. require "histwmttoo.tcl"
  49.  
  50. Class DiagramEditor : {HistWmtTool MainWindow} {
  51.     method destructor
  52.     constructor
  53.     method createEdAreaPopUpMenu
  54.     method startEdit
  55.     method updateTitle
  56.     method mkHistEntry
  57.     method historyActivated
  58.     method addContextArea
  59.     method updateToolBar
  60.     method updateWmtArea
  61.     method editProperties
  62.     method removeProperties
  63.     method showProperties
  64.     method createPropContainers
  65.     method editDiagramProperties
  66.     method removeDiagramProperties
  67.     method showDiagramProperties
  68.     method createDiagPropContainer
  69.     method indent
  70.     method releasePropContainers
  71.     method startReport
  72.     method save
  73.     method edit
  74.     method push
  75.     method doEdit
  76.     method doEditExt
  77.     method read
  78.     method doRead
  79.     method print
  80.     method doPrint
  81.     method openByName
  82.     method open
  83.     method close
  84.     method doClose
  85.     method exit
  86.     method doExit
  87.     method newEditor
  88.     method askDecName
  89.     method decompose
  90.     method zoom
  91.     method popupNotSaved
  92.     method popupCloseExit
  93.     method popUpPrintOptions
  94.     method popUpNameDialog
  95.     method popUpScopeDialog
  96.     method enDisableMenuEntries
  97.     method helpOnContext
  98.     method helpOnName
  99.     method checkContents
  100.     method checkLocalModel
  101.     method removeUnreferencedItems
  102.     method createOpenByName
  103.     method editorArea
  104.     method reinit
  105.     method createShellLink
  106.     method switchLook
  107.     method addPropContainer
  108.     method removePropContainer
  109.     attribute fileStack
  110.     attribute selectedItem
  111.     attribute historyCount
  112.     attribute selPopDlg
  113.     attribute permanentReadOnly
  114.     attribute firstInit
  115.     attribute diagramType
  116.     attribute m4VarDes
  117.     attribute options
  118.     attribute openByNameDlg
  119.     attribute printOptions
  120.     attribute openKnowledgeDB
  121.     attribute propKnowledgeDB
  122.     attribute panel
  123.     attribute _editorArea
  124.     attribute moduleHdlr
  125.     attribute menuHdlr
  126.     attribute objHdlr
  127.     attribute propContainerSet
  128.     attribute readDiagram
  129.     attribute closeExit
  130.     attribute notSaved
  131.     attribute wmtArea
  132. }
  133.  
  134. method DiagramEditor::destructor {this} {
  135.     # Start destructor user section
  136.  
  137.     $this saveToolBarPresence ude
  138.     $this saveContextAreaPresence ude
  139.     $this saveMessageAreaPresence ude
  140.     $this saveHist [$this diagramType]
  141.     $this saveWindowGeometry [$this diagramType]
  142.     [$this menuHdlr] delete
  143.  
  144.     [$this options] delete
  145.     [$this propKnowledgeDB] delete
  146.     [$this openKnowledgeDB] delete
  147.     [$this moduleHdlr] delete
  148.     if [isCommand [$this objHdlr]] {
  149.         [$this objHdlr] delete
  150.     }
  151.  
  152.     # End destructor user section
  153.     $this HistWmtTool::destructor
  154. }
  155.  
  156. constructor DiagramEditor {class this name} {
  157.     set this [MainWindow::constructor $class $this $name]
  158.     HistWmtTool::constructor $class $this $name
  159.  
  160.     $this m4VarDes [M4VarDescription new $this.m4VarDes]
  161.     $this options [EditorOptions new $this.options]
  162.  
  163.     $this moduleHdlr [ModuleHandler new -moduleSpecSetChanged {
  164.         set d_modules [%this deselectedModuleSpecSet]
  165.         foreach file [%this getFiles tcl d_ude.tcl $d_modules] {
  166.             source $file
  167.         }
  168.         set s_modules [%this selectedModuleSpecSet]
  169.         foreach file [%this getFiles tcl s_ude.tcl $s_modules] {
  170.             source $file
  171.         }
  172.         # clear dictionary, used in the proc module_promoter in proc.tcl
  173.         global modulePromoterSet
  174.         $modulePromoterSet contents ""
  175.     }]
  176.     global globalModuleHandler
  177.     set globalModuleHandler [$this moduleHdlr]
  178.  
  179.     MenuBar new $this.bar
  180.  
  181.     $this setToolBarPresence ude
  182.     DlgColumn new $this.c
  183.     $this setContextAreaPresence ude
  184.     HorSeparator new $this.c.sep
  185.     DlgRow new $this.c.r -spaceType NONE
  186.     $this setMessageAreaPresence ude
  187.  
  188.     $this config \
  189.         -propContainerSet [List new] \
  190.         -historyCount 0 \
  191.         -permanentReadOnly 0 \
  192.         -closed {%this exit} \
  193.         -exitButton [$this menuBar].file.menu.exit \
  194.         -propKnowledgeDB [PropKnowledgeDB new \
  195.             $this.propKnowledgeDB [$this moduleHdlr]] \
  196.         -openKnowledgeDB [OpenKnowledgeDB new \
  197.             $this.openKnowledgeDB [$this moduleHdlr]]
  198.  
  199.     global classCount
  200.     set classCount 1
  201.     ClassMaker::extend CustMenuPushButton HistMenuButton {levelPath abbrev}
  202.     $this firstInit 1
  203.     eval [[$this moduleHdlr] moduleSpecSetChanged]
  204.  
  205.     return $this
  206. }
  207.  
  208. method DiagramEditor::createEdAreaPopUpMenu {this} {
  209.     DrAreaPopUpMenu new [$this editorArea].pop -poppedUp {
  210.        [.main editorArea].pop entrySet [[.main menuHdlr] validPopUpEntrySet]
  211.     }
  212. }
  213.  
  214. method DiagramEditor::startEdit {this levelPath} {
  215.     set levelPathObj [LevelPath new $levelPath]
  216.     $this loadHist [$this diagramType]
  217.     $this edit $levelPathObj
  218. }
  219.  
  220. method DiagramEditor::updateTitle {this} {
  221.     set fv [[ClientContext::global] currentFile]
  222.     if [$fv isNil] {
  223.         set name ""
  224.     } else {
  225.         set name [[$fv file] qualifiedName :]
  226.     }
  227.     $this iconTitle $name
  228.  
  229.     set title [$this title]
  230.     set hyphen [string last "-" $title]
  231.     if {$hyphen < 0} {
  232.         set title "- $title"
  233.     } else {
  234.         set title [string range $title $hyphen end]
  235.     }
  236.     set title "$name $title"
  237.     if [$this permanentReadOnly] {
  238.         regsub Editor$ $title Viewer title
  239.     } else {
  240.         regsub Viewer$ $title Editor title
  241.     }
  242.     $this title $title
  243. }
  244.  
  245. method DiagramEditor::mkHistEntry {this levelPath mnem} {
  246.         set latest [$this historyCount]
  247.     incr latest
  248.     set abbrev [HistWmtTool::abbrevLevelPath $levelPath]
  249.     set button [$this menuBar].file.menu.his$latest
  250.         HistMenuButton new $button \
  251.         -label "$mnem $abbrev" -abbrev $abbrev \
  252.         -levelPath $levelPath \
  253.         -activated "$this historyActivated %this" \
  254.         -mnemonic $mnem -hintText "Opens $levelPath."
  255.         $this historyCount $latest
  256.     return $button
  257. }
  258.  
  259. method DiagramEditor::historyActivated {this entry} {
  260.     $this edit [LevelPath new [$entry levelPath]]
  261. }
  262.  
  263. method DiagramEditor::addContextArea {this} {
  264.     if {![isCommand [$this wmtArea]]} {
  265.         $this wmtArea [EdWmtArea new $this.c.wmtArea]
  266.         [$this wmtArea] index 0
  267.     }
  268.     if [isCommand [$this menuBar].view.menu.contextarea] {
  269.         [$this menuBar].view.menu.contextarea state 1
  270.     }
  271. }
  272.  
  273. method DiagramEditor::updateToolBar {this} {
  274.     [$this menuHdlr] setCurrentContext
  275. }
  276.  
  277. method DiagramEditor::updateWmtArea {this} {
  278.     if [isCommand [$this wmtArea]] {
  279.         [$this wmtArea] notify
  280.     }
  281. }
  282.  
  283. method DiagramEditor::editProperties {this} {
  284.     busy {
  285.         set editorArea [$this editorArea]
  286.         if [catch {
  287.             set selComps [$editorArea editSelectedComponents]
  288.         } msg] {
  289.             wmtkerror $msg
  290.             return
  291.         }
  292.         $this createPropContainers $selComps 1
  293.         if {[[$this propContainerSet] contents] == ""} {
  294.             wmtkerror "There are no properties defined for the selected object(s)"
  295.             return
  296.         }
  297.         # Don't reuse a PropertyDialog:
  298.         # The initial size does not change to fit new contents.
  299.         uplevel #0 require propertydi.tcl
  300.         PropertyDialog new $this.editProperties $this \
  301.             -editable 1 \
  302.             -title "Edit Properties" \
  303.             -helpPressed {.main helpOnName editProperties}
  304.         set script [$this.editProperties okPressed]\;
  305.         append script "[$this editorArea] updateEditorComponents true"
  306.         $this.editProperties okPressed  $script
  307.         $this.editProperties popUp
  308.     }
  309. }
  310.  
  311. method DiagramEditor::removeProperties {this} {
  312.     busy {
  313.         set editorArea [$this editorArea]
  314.         if [catch {
  315.             set selComps [$editorArea editSelectedComponents]
  316.         } msg] {
  317.             wmtkerror $msg
  318.             return
  319.         }
  320.         $this createPropContainers $selComps 1
  321.         # Don't reuse a RmPropDialog:
  322.         # The initial size does not change to fit new contents.
  323.         uplevel #0 require rmpropdial.tcl
  324.         RmPropDialog new $this.removeProperties $this \
  325.             -title "Delete Properties" \
  326.             -helpPressed {.main helpOnName selectMany}
  327.         $this.removeProperties popUp
  328.     }
  329. }
  330.  
  331. method DiagramEditor::showProperties {this} {
  332.     busy {
  333.         set editorArea [$this editorArea]
  334.         if [catch {
  335.             set selComps [$editorArea getSelectedComponents]
  336.         } msg] {
  337.             wmtkerror $msg
  338.             return
  339.         }
  340.         $this createPropContainers $selComps 0
  341.         if {[[$this propContainerSet] contents] == ""} {
  342.             wmtkerror "There are no properties defined for the selected object(s)"
  343.             return
  344.         }
  345.         # Don't reuse a PropertyDialog:
  346.         # The initial size does not change to fit new contents.
  347.         uplevel #0 require propertydi.tcl
  348.         PropertyDialog new $this.editProperties $this \
  349.             -editable 0 \
  350.             -title "Show Properties" \
  351.             -helpPressed {.main helpOnName editProperties}
  352.         set script [$this.editProperties okPressed]\;
  353.         append script "[$this editorArea] updateEditorComponents true"
  354.         $this.editProperties okPressed  $script
  355.         $this.editProperties popUp
  356.     }
  357. }
  358.  
  359. method DiagramEditor::createPropContainers {this selComps edit} {
  360.     set propStructList [List new]
  361.     set cc [ClientContext::global]
  362.     set configV [$cc currentConfig]
  363.     set phaseV [$cc currentPhase]
  364.     set fileV [$cc currentFile]
  365.     set propKnowledgeDB [$this propKnowledgeDB]
  366.     PropLocation new .propLocation \
  367.         -phaseType [[$phaseV phase] type] \
  368.         -diagramType [[$fileV file] type]
  369.     set maxNameLength 0
  370.     foreach obj $selComps {
  371.         set count 0
  372.         set labs [llength [$obj labelSet]]
  373.         .propLocation componentType [$obj type]
  374.         if {[$obj getProperty initiator] == 1} {
  375.             .propLocation condition "INITIATOR"
  376.         } elseif {[$obj getProperty key] == 1} {
  377.             .propLocation condition "KEY"
  378.         } else {
  379.             .propLocation condition "NOKEY"
  380.         }
  381.         set indent [$this indent [$obj type]]
  382.         foreach lab [$obj labelSet] {
  383.             .propLocation labelType [$lab type]
  384.             foreach itm [$lab itemRefSet] {
  385.                 .propLocation containerKind Component
  386.                 .propLocation containerType [$obj type]
  387.                 set compPropDefs [$propKnowledgeDB \
  388.                         definitions .propLocation]
  389.                 .propLocation containerKind Item
  390.                 .propLocation containerType [$itm type]
  391.                 set itemPropDefs [$propKnowledgeDB \
  392.                         definitions .propLocation]
  393.                 if {"$compPropDefs$itemPropDefs" == ""} {
  394.                     continue
  395.                 }
  396.                 set objName $indent[$itm itemName]
  397.                 set objNameLength [string length $objName]
  398.                 if {$objNameLength > $maxNameLength} {
  399.                     set maxNameLength $objNameLength
  400.                 }
  401.                 set labIdx [$obj type],[$lab type],[$itm type]
  402.                 if [info exists labelPartName($labIdx)] {
  403.                     set objType $labelPartName($labIdx)
  404.                 } else {
  405.                     set objType [$obj longName]
  406.                     if {$labs > 1} {
  407.                         set labType [$lab longName]
  408.                         set objType "$objType $labType"
  409.                     }
  410.                 }
  411.                 $propStructList append [PropStruct new \
  412.                     -name $objName \
  413.                     -type $objType \
  414.                     -compPropDefs $compPropDefs \
  415.                     -containerKey [.propLocation asString] \
  416.                     -component $obj \
  417.                     -itemRef $itm \
  418.                     -itemPropDefs $itemPropDefs]
  419.                 incr count
  420.             }
  421.         }
  422.         if {$count == 0} {
  423.             .propLocation containerKind Component
  424.             .propLocation containerType [$obj type]
  425.             .propLocation labelType ""
  426.             set compPropDefs [$propKnowledgeDB \
  427.                     definitions .propLocation]
  428.             if {[llength $compPropDefs] > 0} {
  429.                 $propStructList append [PropStruct new \
  430.                     -type [$obj longName] \
  431.                     -compPropDefs $compPropDefs \
  432.                     -containerKey [.propLocation asString] \
  433.                     -component $obj]
  434.             }
  435.         }
  436.     }
  437.     .propLocation delete
  438.     set formatString "%-*.*s  %s"
  439.     set cntList [List new]
  440.     $propStructList foreach propStruct {
  441.         set pres [format $formatString $maxNameLength $maxNameLength \
  442.                  [$propStruct name] [$propStruct type]]
  443.         set cnt [EdPropContainer new -editable $edit \
  444.             -propertyKey [$propStruct containerKey] \
  445.             -propertyPresentation $pres \
  446.             -holderComp [$propStruct component] \
  447.             -itemRef [$propStruct itemRef]]
  448.         if {[$cnt getPropInfoMethods]} {
  449.             foreach propDef [$propStruct compPropDefs] {
  450.                 $cnt addPropDefinition $propDef
  451.             }
  452.             foreach propDef [$propStruct itemPropDefs] {
  453.                 $cnt addPropDefinition $propDef
  454.             }
  455.             $cnt storePropInfoMethods
  456.         } else {
  457.             foreach propDef [$propStruct compPropDefs] {
  458.                 $cnt addSpecificPropDef $propDef holderComp
  459.             }
  460.             foreach propDef [$propStruct itemPropDefs] {
  461.                 $cnt addSpecificPropDef $propDef itemPropInfo
  462.             }
  463.             $cnt storePropInfoMethods
  464.         }
  465.         $cntList append $cnt
  466.     }
  467.     $this propContainerSet $cntList
  468. }
  469.  
  470. method DiagramEditor::editDiagramProperties {this} {
  471.     $this createDiagPropContainer 1
  472.     # Don't reuse a PropertyDialog:
  473.     # The initial size does not change to fit new contents.
  474.     uplevel #0 require propertydi.tcl
  475.     PropertyDialog new $this.editProperties $this \
  476.         -editable 1 \
  477.         -title "Edit Diagram Properties" \
  478.         -helpPressed {.main helpOnName editDiagramProperties}
  479.     $this.editProperties popUp
  480. }
  481.  
  482. method DiagramEditor::removeDiagramProperties {this} {
  483.     $this createDiagPropContainer 1
  484.     # Don't reuse a RmPropDialog:
  485.     # The initial size does not change to fit new contents.
  486.     uplevel #0 require rmpropdial.tcl
  487.     RmPropDialog new $this.removeProperties $this \
  488.         -title "Delete Diagram Properties" \
  489.         -helpPressed {.main helpOnName selectMany}
  490.     $this.removeProperties popUp
  491. }
  492.  
  493. method DiagramEditor::showDiagramProperties {this} {
  494.     $this createDiagPropContainer 0
  495.     # Don't reuse a PropertyDialog:
  496.     # The initial size does not change to fit new contents.
  497.     uplevel #0 require propertydi.tcl
  498.     PropertyDialog new $this.editProperties $this \
  499.         -editable 0 \
  500.         -title "Show Diagram Properties" \
  501.         -helpPressed {.main helpOnName editDiagramProperties}
  502.     $this.editProperties popUp
  503. }
  504.  
  505. method DiagramEditor::createDiagPropContainer {this edit} {
  506.     set cc [ClientContext::global]
  507.     set phase [[$cc currentPhase] phase]
  508.     set file [[$cc currentFile] file]
  509.     PropLocation new .propLocation \
  510.         -containerKind Graph \
  511.         -containerType [$file type] \
  512.         -phaseType [$phase type]
  513.     $this propContainerSet [List new]
  514.     set propDefs [[$this propKnowledgeDB] definitions .propLocation]
  515.     if {[llength $propDefs] == 0} {
  516.         .propLocation delete
  517.         return
  518.     }
  519.     set cnt [EdPropContainer new -editable $edit \
  520.         -propertyKey [.propLocation asString] \
  521.         -propertyPresentation "[$file name]  [$file type]" \
  522.         -diagPropInfo [[$this editorArea] propInfo]]
  523.     foreach propDef $propDefs {
  524.         $cnt addSpecificPropDef $propDef diagPropInfo
  525.     }
  526.     .propLocation delete
  527.     [$this propContainerSet] append $cnt
  528. }
  529.  
  530. method DiagramEditor::indent {this compType} {
  531.     return [$compIndent set $compType]
  532. }
  533.  
  534. method DiagramEditor::releasePropContainers {this} {
  535.     [$this editorArea] releaseSelectedComponents
  536. }
  537.  
  538. method DiagramEditor::startReport {this file comment} {
  539.     if [[$this editorArea] isChanged] {
  540.         $this popupNotSaved "startReportInMtool \"$file\" \"$comment\""
  541.     } else {
  542.         startReportInMtool $file $comment
  543.     }
  544. }
  545.  
  546. method DiagramEditor::save {this} {
  547.     busy {
  548.         wmtkmessage "Saving..."
  549.         [$this editorArea] save
  550.         wmtkmessage "Done"
  551.     }
  552. }
  553.  
  554. method DiagramEditor::edit {this levelPathObj} {
  555.     if [[$this editorArea] isChanged] {
  556.         $this popupNotSaved "$this doEdit $levelPathObj"
  557.     } else {
  558.         $this doEdit $levelPathObj
  559.     }
  560. }
  561.  
  562. method DiagramEditor::push {this levelPathObj} {
  563.     set stack [$this fileStack]
  564.     lappend stack [[ClientContext::global] createPath]
  565.     $this fileStack $stack
  566.     $this doEdit $levelPathObj
  567. }
  568.  
  569. method DiagramEditor::doEdit {this levelPathObj} {
  570.     if [$this firstInit] {
  571.         $this doEditExt $levelPathObj
  572.     } else {
  573.         openOtherUde $levelPathObj "" "" "$this doEditExt $levelPathObj"
  574.     }
  575. }
  576.  
  577. method DiagramEditor::doEditExt {this levelPathObj} {
  578.     if {[$levelPathObj depth] != "File"} {
  579.         wmtkerror "Invalid argument specified: [$levelPathObj asString]"
  580.         return
  581.     }
  582.     set newLevelPathObj $levelPathObj
  583.     busy { blockOutput {
  584.         set cc [ClientContext::global]
  585.         set oldLevelPath [$cc currentLevelString]
  586.         set newLevelPath [$newLevelPathObj asString]
  587.         set oldLevelPathObj [$cc createPath]
  588.         set corp [$newLevelPathObj nameAt Corporate]
  589.         if [isObjectId $corp Corporate:] {
  590.             # levelpath ids specified, convert to strings
  591.             if [catch {$cc setLevelIds $newLevelPath}] {
  592.                 wmtkerror ""
  593.                 return
  594.             }
  595.             set newLevelPathObj [$cc createPath]
  596.             set newLevelPath [$newLevelPathObj asString]
  597.         }
  598.         # newLevelPath contains strings
  599.         if [catch {$cc setLevelPath $newLevelPath}] {
  600.             wmtkerror ""
  601.             $this removeHistEntry $newLevelPath
  602.             return
  603.         }
  604.         $oldLevelPathObj removeTail
  605.         $newLevelPathObj removeTail
  606.         set systemSwitch 0
  607.         if {[$this firstInit] ||
  608.                 [$oldLevelPathObj compare $newLevelPathObj]} {
  609.             set systemSwitch 1
  610.             $this reinit
  611.         }
  612.         if {[$this firstInit] || $oldLevelPath != $newLevelPath} {
  613.             wmtkmessage "Loading ..."
  614.         } else {
  615.             wmtkmessage "Reloading ..."
  616.         }
  617.         set fv [$cc currentFile]
  618.         if [$this permanentReadOnly] {
  619.             if [catch {[$this editorArea] load $fv} msg] {
  620.                 wmtkerror $msg
  621.                 wmtkmessage "Not done"
  622.             } else {
  623.                 wmtkmessage "Loaded read-only"
  624.             }
  625.         } elseif [catch {[$this editorArea] edit $fv} msg] {
  626.             # Edit failed, try load
  627.             if [catch {[$this editorArea] load $fv} loadMsg] {
  628.                 wmtkerror \
  629.                   "Edit failed:\n${msg}\nLoad failed:\n$loadMsg"
  630.                 wmtkmessage "Not done"
  631.             } else {
  632.                 wmtkmessage "Loaded read-only"
  633.                 wmtkwarning $msg
  634.             }
  635.         } else {
  636.             wmtkmessage Done
  637.         }
  638.         set entry [$this mkHistEntry $newLevelPath 1]
  639.         $this insertHistEntry $entry
  640.         $this updateTitle
  641.         $this firstInit 0
  642.     } }
  643. }
  644.  
  645. method DiagramEditor::read {this} {
  646.     set dlg [$this readDiagram]
  647.     if {$dlg == ""} {
  648.         uplevel #0 require readdiagra.tcl
  649.         set dlg [ReadDiagram new $this.read -editor $this]
  650.         $this readDiagram $dlg
  651.     }
  652.     $dlg popUp
  653. }
  654.  
  655. method DiagramEditor::doRead {this fv} {
  656.     busy {
  657.         wmtkmessage "Reading..."
  658.         if [catch {[$this editorArea] read $fv} msg] {
  659.             wmtkerror $msg
  660.             wmtkmessage "Not done"
  661.         } else {
  662.             wmtkmessage Done
  663.         }
  664.     }
  665. }
  666.  
  667. method DiagramEditor::print {this} {
  668.     if [[$this editorArea] isChanged] {
  669.         $this popupNotSaved "$this doPrint"
  670.     } else {
  671.         $this doPrint
  672.     }
  673. }
  674.  
  675. method DiagramEditor::doPrint {this} {
  676.     busy {
  677.         uplevel #0 require print.tcl
  678.         set cc [ClientContext::global]
  679.         set fv [$cc currentFile]
  680.         set optionsBox [$this printOptions]
  681.         if {$optionsBox != ""} {
  682.             set args [$optionsBox printOptions]
  683.         }
  684.         lappend args -configVersion [$cc currentConfig]
  685.         lappend args -systemVersion [$cc currentSystem]
  686.         lappend args $fv
  687.         eval Print::printDiagrams $args
  688.     }
  689. }
  690.  
  691. method DiagramEditor::openByName {this} {
  692.     uplevel #0 require openbyname.tcl
  693.     set obn [$this openByNameDlg]
  694.     if {$obn == ""} {
  695.         set obn [$this createOpenByName]
  696.         $this openByNameDlg $obn
  697.     }
  698.     if [[$this editorArea] isChanged] {
  699.         $this popupNotSaved "$obn popUp"
  700.     } else {
  701.         $obn popUp
  702.     }
  703. }
  704.  
  705. method DiagramEditor::open {this} {
  706.     if [[$this editorArea] isChanged] {
  707.         set dlg [WarningDialog new $this.warnopen \
  708.             -title "Navigation" \
  709.            -message "Navigation needs saved diagram.\nSave diagram ?" \
  710.             -okPressed "$this save; $this open"]
  711.         $dlg delHelpButton
  712.         $dlg popUp
  713.         return
  714.     }
  715.     busy {
  716.         uplevel #0 require selectitem.tcl
  717.         SelectItem new $this.items -editor $this
  718.         uplevel #0 require opendiagra.tcl
  719.         OpenDiagram new $this.open -editor $this
  720.         $this selPopDlg $this.open
  721.         $this.items popUp
  722.     }
  723. }
  724.  
  725. method DiagramEditor::close {this} {
  726.     if {[llength [$this fileStack]] == 0} {
  727.         $this popupCloseExit "$this exit"
  728.     } elseif [[$this editorArea] isChanged] {
  729.         $this popupNotSaved "$this doClose"
  730.     } else {
  731.         $this doClose
  732.     }
  733. }
  734.  
  735. method DiagramEditor::doClose {this} {
  736.     set stack [$this fileStack]
  737.     set last [llength $stack]
  738.     set file [lindex $stack [incr last -1]]
  739.     $this fileStack [lrange $stack 0 [incr last -1]]
  740.     $this doEdit $file
  741. }
  742.  
  743. method DiagramEditor::exit {this} {
  744.     if [[$this editorArea] isChanged] {
  745.         $this popupNotSaved "$this doExit"
  746.     } else {
  747.         $this doExit
  748.     }
  749. }
  750.  
  751. method DiagramEditor::doExit {this} {
  752.     $this busy TRUE
  753.     wmtkmessage "Exiting ..."
  754.     [$this editorArea] quit
  755.     $this stop
  756. }
  757.  
  758. method DiagramEditor::newEditor {this levelPathObj} {
  759.     set presName [$levelPathObj nameAt File]
  760.     set msg "Starting diagram editor for '$presName'"
  761.     set script "SystemUtilities::fork otk \
  762.         ude -c [list [get_comm_name]] [$levelPathObj asString]"
  763.     $this startCommand tcl "$script" "" "$msg" {0 0} 1
  764. }
  765.  
  766. method DiagramEditor::askDecName {this sv qualItem fileType} {
  767.     uplevel #0 require decnamedia.tcl
  768.     if {![isCommand $this.askDecName]} {
  769.         DecNameDialog new $this.askDecName -editor $this
  770.     }
  771.     set name [ShortLongName::longName $fileType]
  772.     $this.askDecName config \
  773.         -title "Create $name for '[$qualItem name]'" \
  774.         -sysVers $sv -qualItem $qualItem -fileType $fileType
  775.     $this.askDecName popUp
  776. }
  777.  
  778. method DiagramEditor::decompose {this sv qualItem fileName fileType} {
  779.     set cc [ClientContext::global]
  780.     set configV [$cc currentConfig]
  781.     set scopePhase [fileHasScopePhase $fileType]
  782.     set itemType [file2itemtype $fileType]
  783.     set presName "$fileName.$fileType"
  784.     if {$qualItem != ""} {
  785.         set presName "[$qualItem name]:$presName"
  786.     }
  787.     wmtkmessage "Creating '$presName'"
  788.     busy {
  789.         if [catch {
  790.             if {"$qualItem" == ""} {
  791.                 set decFileV [$sv createFileVersion $fileName \
  792.                 $itemType $scopePhase $fileType graph $configV]
  793.             } else {
  794.                 set fItm [$qualItem findCreateItem \
  795.                     $fileName $itemType]
  796.                 set decFileV [$sv createFileVersion $fItm \
  797.                     $scopePhase $fileType graph $configV]
  798.             }
  799.         } msg] {
  800.             wmtkerror $msg
  801.             return
  802.         }
  803.     }
  804.     if {$sv == [$cc currentSystem] &&
  805.         $fileType == [[[$cc currentFile] file] type]} {
  806.         $this push [$cc createPath $decFileV]
  807.     } else {
  808.         $this newEditor [$cc createPath $sv $decFileV]
  809.     }
  810. }
  811.  
  812. method DiagramEditor::zoom {this factor} {
  813.     busy {
  814.         set area [$this editorArea]
  815.         set orgScale [$area scale]
  816.         set scale [expr {$orgScale * $factor}]
  817.         if {$scale < 0.1} {
  818.             if {$orgScale < 0.1} {
  819.                  wmtkmessage "Scale factor too small, reset to 1.00"
  820.                  $area scale 1.00
  821.                  return
  822.             }
  823.             wmtkmessage "Minimum zoom factor reached"
  824.             return
  825.         }
  826.         if {$scale > 3} {
  827.             if {$orgScale > 3} {
  828.                  wmtkmessage "Scale factor too large, reset to 1.00"
  829.                  $area scale 1.00
  830.                  return
  831.             }
  832.             wmtkmessage "Maximum zoom factor reached"
  833.             return
  834.         }
  835.         wmtkmessage "Scale factor is now [format %.2f $scale]"
  836.         $area scale $scale
  837.     }
  838. }
  839.  
  840. method DiagramEditor::popupNotSaved {this action} {
  841.     set notSaved [$this notSaved]
  842.     if {$notSaved == ""} {
  843.         uplevel #0 require notsaveddi.tcl
  844.         set notSaved [NotSavedDialog new $this.notSaved -editor $this]
  845.         $this notSaved $notSaved
  846.     }
  847.     $notSaved action $action
  848.     $notSaved popUp
  849. }
  850.  
  851. method DiagramEditor::popupCloseExit {this action} {
  852.     set closeExit [$this closeExit]
  853.     if {$closeExit == ""} {
  854.         uplevel #0 require closeexitd.tcl
  855.         set closeExit [CloseExitDialog new $this.close]
  856.         $this closeExit $closeExit
  857.     }
  858.     $closeExit action $action
  859.     $closeExit popUp
  860. }
  861.  
  862. method DiagramEditor::popUpPrintOptions {this} {
  863.     set printOptions [$this printOptions]
  864.     set cc [ClientContext::global]
  865.     if {$printOptions == ""} {
  866.         uplevel #0 require printoptio.tcl
  867.         set printOptions [PrintOptionsDialog new $this.printOptions]
  868.         $this printOptions $printOptions
  869.     }
  870.     $printOptions config -diagram [$cc currentFile] \
  871.         -readOnly [[$this editorArea] readOnly] \
  872.         -props [[$this editorArea] propInfo]
  873.     $printOptions popUp
  874. }
  875.  
  876. method DiagramEditor::popUpNameDialog {this} {
  877.     if {[isCommand $this.items] || [isCommand $this.changeName]} {
  878.         wmtkerror "Another dialog is busy"
  879.         return
  880.     }
  881.     uplevel #0 require selectitem.tcl
  882.     SelectItem new $this.items \
  883.         -editor $this \
  884.         -cancelPressed "$this.changeName delete; %this delete"
  885.     uplevel #0 require itemnamech.tcl
  886.     set cc [ClientContext::global]
  887.     ItemNameChangeDialog new $this.changeName $this \
  888.         -configV [$cc currentConfig] \
  889.         -keeper [$cc currentFile]
  890.     $this selPopDlg $this.changeName
  891.     $this.items popUp
  892. }
  893.  
  894. method DiagramEditor::popUpScopeDialog {this} {
  895.     if {[isCommand $this.items] || [isCommand $this.changeScope]} {
  896.         wmtkerror "Another dialog is busy"
  897.         return
  898.     }
  899.     uplevel #0 require selectitem.tcl
  900.     SelectItem new $this.items \
  901.         -editor $this \
  902.         -cancelPressed "$this.changeScope delete; %this delete"
  903.     uplevel #0 require scopechang.tcl
  904.     set cc [ClientContext::global]
  905.     ScopeChangeDialog new $this.changeScope \
  906.         -configV [$cc currentConfig] \
  907.         -systemV [$cc currentSystem] \
  908.         -diagram [$cc currentFile] \
  909.         -editor $this
  910.     $this selPopDlg $this.changeScope
  911.     $this.items popUp
  912. }
  913.  
  914. method DiagramEditor::enDisableMenuEntries {this} {
  915.     [$this menuHdlr] areaChanged
  916. }
  917.  
  918. method DiagramEditor::helpOnContext {this} {
  919.     set area [$this editorArea]
  920.     # Get selected components. Throw away "hidden" components.
  921.     set comps ""
  922.     global hiddenCompTypes
  923.     foreach comp [$area getSelectedComponents] {
  924.         if {![info exists hiddenCompTypes([$comp type])]} {
  925.             lappend comps $comp
  926.         }
  927.     }
  928.     if {[llength $comps] == 1} {
  929.         # Show help based on type of selected component.
  930.         set localKey [$comps type]
  931.     } else {
  932.         # Show generic help, based on type of diagram.
  933.         set cc [ClientContext::global]
  934.         set localKey [[[$cc currentFile] file] type]
  935.     }
  936.     $area releaseSelectedComponents
  937.     $this helpOnName $localKey
  938. }
  939.  
  940. method DiagramEditor::helpOnName {this name} {
  941.     uplevel #0 require edsymb2url.tcl
  942.     global short2url
  943.     if [catch {set url $short2url($name)}] {
  944.         wmtkerror "Sorry, no help available for '$name'"
  945.     } else {
  946.         showHelp $url
  947.     }
  948. }
  949.  
  950. method DiagramEditor::checkContents {this} {
  951.     set cc [ClientContext::global]
  952.     set file [[$cc currentFile] file]
  953.     set script "[quoteIf [m4_path_name bin otsh$EXE_EXT]] \
  954.         -c [$file qualifiedName].[$file type]"
  955.     set cmd [list $this startCommand mtool \
  956.         $script "" {Starting 'Check'} {0 0} 0]
  957.     if [[$this editorArea] isChanged] {
  958.         $this popupNotSaved $cmd
  959.     } else {
  960.         eval $cmd
  961.     }
  962. }
  963.  
  964. method DiagramEditor::checkLocalModel {this} {
  965.     set cc [ClientContext::global]
  966.     set file [[$cc currentFile] file]
  967.     set args "-f check.tcl -S [$file qualifiedName].[$file type]"
  968.     set script "[quoteIf [m4_path_name bin otsh$EXE_EXT]] $args"
  969.     set cmd [list $this startCommand mtool \
  970.         $script "" {Starting 'Check'} {0 0} 0]
  971.     if [[$this editorArea] isChanged] {
  972.         $this popupNotSaved $cmd
  973.     } else {
  974.         eval $cmd
  975.     }
  976. }
  977.  
  978. method DiagramEditor::removeUnreferencedItems {this} {
  979.     set cc [ClientContext::global]
  980.     set fv [$cc currentFile]
  981.     set script "busy \{ $fv removeUnusedDeclarations \}"
  982.     if [[$this editorArea] isChanged] {
  983.         $this popupNotSaved $script
  984.     } else {
  985.         eval $script
  986.     }
  987. }
  988.  
  989. method DiagramEditor::createOpenByName {this} {
  990.     return [OpenByName new $this.obn -editor $this]
  991. }
  992.  
  993. method DiagramEditor::editorArea {this {newArea -}} {
  994.     if {$newArea == "-"} {
  995.         return [$this _editorArea]
  996.     }
  997.     $this _editorArea $newArea
  998.     set focusButton "[$this menuBar].options.menu.pointerfocus"
  999.     if [isCommand $focusButton] {
  1000.         $focusButton state [$newArea pointerFocus]
  1001.     }
  1002. }
  1003.  
  1004. method DiagramEditor::reinit {this} {
  1005.     # Use some trickery to set the right icon
  1006.     $this icon [$this diagramType]e
  1007.     $this iconTitle [string toupper [$this icon]]
  1008.     #
  1009.     $this updateTitle
  1010.     #
  1011.     [$this moduleHdlr] setCurrentContext
  1012.     #
  1013.     global EdPropContainer::propInfoMethodDicts
  1014.     set EdPropContainer::propInfoMethodDicts [Dictionary new]
  1015.     #
  1016.     set connSelButton [$this menuBar].options.menu.selectconnectorstoo
  1017.     if [isCommand $connSelButton] {
  1018.         $connSelButton state [m4_var get M4_select_conns \
  1019.                     -context [$this diagramType]]
  1020.     }
  1021.     #
  1022.     set foldButton "[$this menuBar].options.menu.initialfold"
  1023.     if [isCommand $foldButton] {
  1024.         $foldButton state [m4_var get M4_initial_fold \
  1025.             -context [$this diagramType]]
  1026.     }
  1027.     #
  1028.     set focusButton "[$this menuBar].options.menu.pointerfocus"
  1029.     if [isCommand $focusButton] {
  1030.         $focusButton state [[$this _editorArea] pointerFocus]
  1031.     }
  1032.     [$this panel] initialize [$this diagramType]
  1033.  
  1034.     set area [.main editorArea]
  1035.     if {[m4_var get M4_font -context ude] != [$area normalFontSpec]} {
  1036.         $area normalFontSpec [m4_var get M4_font -context ude]
  1037.     }
  1038.     if {[m4_var get M4_font_annotation -context ude] != \
  1039.                         [$area annotationFontSpec]} {
  1040.         $area annotationFontSpec [m4_var get M4_font_annotation \
  1041.                             -context ude]
  1042.     }
  1043.     if {[m4_var get M4_fg -context ude] != [$area areaForeground]} {
  1044.         $area areaForeground [m4_var get M4_fg -context ude]
  1045.     }
  1046.     if {[m4_var get M4_bg -context ude] != [$area areaBackground]} {
  1047.         $area areaBackground [m4_var get M4_bg -context ude]
  1048.     }
  1049.     if {[m4_var get M4_sel_color -context ude] != \
  1050.                     [$area areaSelectionColor]} {
  1051.         $area areaSelectionColor [m4_var get M4_sel_color -context ude]
  1052.     }
  1053.     $this setToolBarPresence ude
  1054.     $this updateToolBar
  1055.     $this setMessageAreaPresence ude
  1056.     $this setContextAreaPresence ude
  1057.     $this updateWmtArea
  1058. }
  1059.  
  1060. method DiagramEditor::createShellLink {this} {
  1061.     set cc [ClientContext::global]
  1062.     set file [[$cc currentFile] file]
  1063.     set lvl [$cc currentLevelString]
  1064.     if [catch {set shl [ShellLink new]} msg] {
  1065.         # NT 3.51? ignore
  1066.         wmtkerror $msg
  1067.         return
  1068.     }
  1069.     $shl path [m4_path_name bin otk.exe]
  1070.     $shl arguments "[quoteIf [m4_path_name tcl ude.tcl]] -- $lvl"
  1071.     set guiName \
  1072.      "[$file qualifiedName " "] [ShortLongName::longName [$file type]].lnk"
  1073.     
  1074.     set dir [registry get HKEY_CURRENT_USER \
  1075.     "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"             Desktop]
  1076.  
  1077.     $shl createIt $dir\\$guiName
  1078. }
  1079.  
  1080. method DiagramEditor::switchLook {this newLook} {
  1081.     set oldLook [m4_var get M4_diagram_look status]
  1082.     if {[string index $status 1] == "O"} {
  1083.         wmtkmessage "Unable to change Diagram Look (M4 variable M4_diagram_look is read only)"
  1084.         return
  1085.     }
  1086.     if {$oldLook == $newLook} {
  1087.         return
  1088.     }
  1089.         
  1090.     set code "catch {m4_var set M4_diagram_look $newLook}; \
  1091.         [$this panel] initialize [.main diagramType]; \
  1092.         $this doEdit [LevelPath new \
  1093.             [[ClientContext::global] currentLevelIdString]];\
  1094.         [$this options] initLook"
  1095.     if [[$this editorArea] isChanged] {
  1096.         $this popupNotSaved $code
  1097.     } else {
  1098.         eval $code
  1099.     }
  1100. }
  1101.  
  1102. # Do not delete this line -- regeneration end marker
  1103.  
  1104. method DiagramEditor::addPropContainer {this newPropContainer} {
  1105.     [$this propContainerSet] append $newPropContainer
  1106.  
  1107. }
  1108.  
  1109. method DiagramEditor::removePropContainer {this oldPropContainer} {
  1110.     [$this propContainerSet] removeValue $oldPropContainer
  1111. }
  1112.  
  1113.