home *** CD-ROM | disk | FTP | other *** search
/ PC World 1997 November / PCWorld_1997-11_cd.bin / software / programy / komix / DATA.Z / viewdefine.tcl < prev    next >
Text File  |  1996-11-08  |  18KB  |  702 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Westmount Technology    1994
  4. #
  5. #      File:           @(#)viewdefine.tcl    /main/hindenburg/1
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)viewdefine.tcl    /main/hindenburg/1   8 Nov 1996 Copyright 1994 Westmount Technology
  10.  
  11. # Start user added include file section
  12. require commandpag.tcl
  13. require custfileut.tcl
  14. require propview.tcl
  15. # End user added include file section
  16.  
  17. require "defstoredi.tcl"
  18.  
  19. Class ViewDefineDialog : {DefStoreDialog} {
  20.     constructor
  21.     method destructor
  22.     method createInterface
  23.     method clearInterface
  24.     method fromInterface
  25.     method toInterface
  26.     method levelChanged
  27.     method associationChanged
  28.     method load
  29.     method save
  30.     method objName
  31.     method readAllMenuEntries
  32.     method createMenuObjects
  33.     method getRepTypeScope
  34.     method setRepTypeScope
  35.     method removeRepTypeScope
  36.     attribute iPage
  37.     attribute pPage
  38.     attribute sortPage
  39.     attribute allMenuEntries
  40.     attribute possibleMenuEntries
  41.     attribute repTypeScope
  42. }
  43.  
  44. constructor ViewDefineDialog {class this name} {
  45.     set this [DefStoreDialog::constructor $class $this $name]
  46.     $this repTypeScope [Dictionary new]
  47.     # Start constructor user section
  48.     $this readAllMenuEntries
  49.     $this helpPressed { .main helpOnName editViewProperties }
  50.  
  51.     $this setRepTypeScope contents {
  52.         ConfigVersion        {0 0 1 0 0}
  53.         ControlledClass        {1 1 0 0 0}
  54.         ControlledClasses    {1 1 0 0 0}
  55.         Corporate        {1 0 0 0 0}
  56.         CorporateGroupVersion    {1 0 0 0 0}
  57.         CorporateGroupVersions    {1 0 0 0 0}
  58.         CustomFileVersions    {0 1 1 1 1}
  59.         CustomFiles        {1 0 0 0 0}
  60.         ExternalFileVersion    {1 0 0 0 1}    
  61.         ExternalLink        {0 0 0 0 1}    
  62.         Graph            {1 0 0 0 1}    
  63.         GroupVersion        {0 0 0 0 1}
  64.         Matrix            {1 0 0 0 1}    
  65.         PhaseVersion        {0 0 0 1 0}
  66.         Project            {0 1 0 0 0}
  67.         Role            {1 1 0 0 0}
  68.         Roles            {1 1 0 0 0}
  69.         SavedGroupVersion    {1 0 0 0 1}
  70.         SavedGroupVersions    {0 0 0 0 1}
  71.         SystemFileReference    {0 0 0 0 1}    
  72.         SystemVersion        {0 0 0 0 1}
  73.         DocumentVersion        {0 0 0 0 1}
  74.         UserCustomFiles        {1 0 0 0 0}
  75.         Users            {1 0 0 0 0}
  76.         WorkItems        {0 0 0 0 1}
  77.     }
  78.  
  79.     # read phases file
  80.     getPhases
  81.  
  82.     foreach phase ${BrowserProcs::phases} {
  83.         set phaseType [lindex $phase 1]
  84.         if [[$this repTypeScope] exists "$phaseType"] continue
  85.         $this setRepTypeScope "$phaseType" \
  86.             [$this getRepTypeScope PhaseVersion]
  87.     }
  88.  
  89.     # End constructor user section
  90.     return $this
  91. }
  92.  
  93. method ViewDefineDialog::destructor {this} {
  94.     # Start destructor user section
  95.     # End destructor user section
  96.     $this DefStoreDialog::destructor
  97. }
  98.  
  99. method ViewDefineDialog::createInterface {this} {
  100.  
  101.     #indentation of this function is 4 spaces to make it easier to read
  102.     $this DefStoreDialog::createInterface
  103.  
  104.     # create "interface" page
  105.     interface NoteBkPage $this.InterfaceNBP {
  106.         label Interface
  107.         NamedGroup NG { 
  108.             HorSplitter HS {
  109.                 DlgRow DR {
  110.                     verStretchFactor 0
  111.                     NamedGroup NG {
  112.                         label Name 
  113.                             SingleLineText nameSLT {}
  114.                     }
  115.                 }
  116.                 DlgRow DR {
  117.                     sizeEqual 1
  118.                     NamedGroup NG {
  119.                         label Associations 
  120.                         TextList  associationsTL { 
  121.                 rowCount 5
  122.                 selectionPolicy MULTIPLE
  123.                         }
  124.                     }
  125.                     NamedGroup NG {
  126.                         label Types 
  127.                         TextList  typesTL { 
  128.                 rowCount 5
  129.                 selectionPolicy MULTIPLE
  130.                         }
  131.                     }
  132.                 } 
  133.                 DlgRow DR {
  134.                     NamedGroup NG {
  135.                         label ToolBarEntries 
  136.                         TextList  toolBarEntriesTL { 
  137.                 rowCount 10
  138.                 selectionPolicy MULTIPLE
  139.                         }
  140.                     }
  141.                 }
  142.             } 
  143.         }
  144.     }
  145.     # create "properties" page
  146.     interface NoteBkPage $this.PropertyNBP {
  147.         label Properties
  148.         DlgColumn DC {    
  149.             NamedGroup NG {
  150.                 label "Visible Properties"
  151.         PropView propertiesBV {
  152.                     mode DETAIL
  153.                     rowCount 6
  154.                     BrowsHeader nameBH {
  155.                         label "Name"
  156.                         width 15
  157.                     }
  158.                     BrowsHeader widthBH {
  159.                         label "Width"
  160.                         width 8
  161.                     }
  162.                     BrowsHeader sortKindBH {
  163.                         label "Sort Kind"
  164.                         width 12
  165.                     }
  166.                     BrowsHeader sortPolBH {
  167.                         label "Sort Policy"
  168.                         width 12
  169.                     }
  170.                     BrowsHeader sortOrderBH {
  171.                         label "Sort Order"
  172.                         width 13
  173.                     }
  174.                 }
  175.             }
  176.             NamedGroup NG {
  177.                 label "Hidden Properties"
  178.         PropView hidpropertiesBV {
  179.                     mode DETAIL
  180.                     rowCount 6
  181.                     BrowsHeader nameBH {
  182.                         label "Name"
  183.                         width 15
  184.                     }
  185.                     BrowsHeader widthBH {
  186.                         label "Width"
  187.                         width 8
  188.                     }
  189.                     BrowsHeader sortKindBH {
  190.                         label "Sort Kind"
  191.                         width 12
  192.                     }
  193.                     BrowsHeader sortPolBH {
  194.                         label "Sort Policy"
  195.                         width 12
  196.                     }
  197.                     BrowsHeader sortOrderBH {
  198.                         label "Sort Order"
  199.                         width 13
  200.                     }
  201.                 }
  202.             }
  203.         }
  204.     }
  205.  
  206.     # create "sort command page" page
  207.     interface NoteBkPage $this.SortCommandNBP {
  208.         label "Sort Command"
  209.         NamedGroup NG {
  210.             label "Sort Command"
  211.             DlgColumn DC {
  212.                 SingleLineText sortProcSLT {
  213.                 }
  214.             }
  215.         } 
  216.     }
  217.  
  218.     $this iPage $this.InterfaceNBP.NG.HS.DR.NG
  219.     $this pPage $this.PropertyNBP.DC.NG
  220.     $this sortPage $this.SortCommandNBP.NG
  221.  
  222.     [$this iPage].associationsTL selectionChanged "$this associationChanged"
  223. }
  224.  
  225. method ViewDefineDialog::clearInterface {this} {
  226.     $this DefStoreDialog::clearInterface
  227.  
  228.     [$this iPage].nameSLT text ""
  229.     [$this iPage].associationsTL selectedSet {}
  230.     $this associationChanged
  231.     [$this iPage].typesTL selectedSet {}
  232.     [$this iPage].toolBarEntriesTL selectedSet {}
  233.  
  234.     [$this sortPage].DC.sortProcSLT text ""
  235.  
  236. }
  237.  
  238. method ViewDefineDialog::fromInterface {this} {
  239.  
  240.     set sortCommand [[$this sortPage].DC.sortProcSLT text]
  241.     if ![CommandPage::checkBraces $sortCommand] {
  242.         wmtkerror "Brace mismatch in Sort Command"
  243.         return ""
  244.     }
  245.  
  246.     # save page "Interface"
  247.     set i [$this iPage]
  248.     set spec ""
  249.     set spec "$spec associations \{[$i.associationsTL selectedSet]\}"
  250.     set spec "$spec objectTypes \{[$i.typesTL selectedSet]\}"
  251.  
  252.     #find the tcl name of the choosen entries
  253.     set selIdx [$i.toolBarEntriesTL selectedIndexSet]
  254.     set selObjects {}
  255.     set objects [$this possibleMenuEntries]
  256.     foreach i $selIdx {
  257.         lappend selObjects [lindex [lindex $objects $i] 1]
  258.     }
  259.     set spec "$spec toolBarEntries \{$selObjects\}"
  260.  
  261.     # save page "Properties"
  262.     set props [[$this pPage].propertiesBV objectSet]
  263.  
  264.     set order {}
  265.     foreach prop [[$this pPage].propertiesBV objectSet] {
  266.         if {[lindex [$prop details] 2] != "none"} {
  267.              lappend order [lindex [$prop details] 3]
  268.         }
  269.     }
  270.  
  271.     set ordercount [expr {[llength $order] +1}]
  272.     # check if sortorder is correct
  273.     for {set i 1} {$i < $ordercount} {incr i} {
  274.         if {[lsearch $order $i] == -1} {
  275.             wmtkerror "Invalid sort order, order '$i' not found."
  276.             return ""
  277.         }
  278.     }
  279.  
  280.     set spec "$spec properties \{"
  281.     foreach prop [[$this pPage].propertiesBV objectSet] {
  282.         set details [$prop details]
  283.         if {[llength [$prop label]] != 1} {
  284.             set de \{[$prop label]\}
  285.         } else {
  286.             set de [$prop label]
  287.         }
  288.         lappend de "[lindex $details 0]"
  289.         lappend de "[lindex $details 1]"
  290.         set policy [lindex $details 2]
  291.         if {$policy != "none"} {
  292.                set lst [list "[lindex $details 2]" "[lindex $details 3]"]
  293.             lappend de $lst
  294.         } else {
  295.                set lst [lindex $details 2]
  296.             set de "$de \{$lst\}"
  297.         }
  298.         set spec "$spec \{$de\}\n\t\t\t\t"
  299.     }
  300.     set spec "$spec\}"
  301.  
  302.  
  303.     if {$sortCommand != ""} {
  304.         set spec "$spec sortScript \{$sortCommand\}"
  305.     }
  306.  
  307.     return $spec
  308. }
  309.  
  310. method ViewDefineDialog::toInterface {this key value} {
  311.  
  312.     # page "Interface"
  313.     if {$key == "displayName"} {
  314.         [$this iPage].nameSLT text $value
  315.         return
  316.     }
  317.  
  318.     if {$key == "associations"} { 
  319.         [$this iPage].associationsTL selectedSet $value
  320.         $this associationChanged
  321.         return
  322.     }
  323.  
  324.     if {$key == "objectTypes"} { 
  325.         [$this iPage].typesTL selectedSet $value
  326.         return
  327.     }
  328.  
  329.     if {$key == "toolBarEntries"} { 
  330.         #find the display name of the choosen entries
  331.         set selObjects $value
  332.         set selIdx {}
  333.         set selNames {}
  334.         set objects [$this possibleMenuEntries]
  335.  
  336.         foreach i $selObjects {
  337.             set count 0
  338.             foreach j $objects {
  339.                 if {$i == [lindex $j 1]} {
  340.                     lappend selIdx $count
  341.                 }
  342.                 incr count
  343.             }
  344.         }
  345.  
  346.         [$this iPage].toolBarEntriesTL selectedIndexSet $selIdx
  347.         return
  348.     }
  349.  
  350.     # page "Properties"
  351.     if {$key == "properties"} {
  352.         set propSet [[$this pPage].hidpropertiesBV objectSet]
  353.         set index 1
  354.         foreach i $value {
  355.             set propName [lindex $i 0]
  356.             foreach prop $propSet {
  357.                 if {![isCommand $prop]} {
  358.                     continue
  359.                 }
  360.                 if {$propName == [$prop label]} {
  361.                     set de [$prop details]
  362.                     set de [lreplace $de 0 0 [lindex $i 1]]
  363.                     set de [lreplace $de 1 1 [lindex $i 2]]
  364.                     set j [lindex $i 3]
  365.                     set de [lreplace $de 2 2 [lindex $j 0]]
  366.                     set de [lreplace $de 3 3 [lindex $j 1]]
  367.                     $prop details $de
  368.                     set prop [$prop reParent \
  369.                         [$this pPage].propertiesBV]
  370.                     $prop index $index
  371.                 }
  372.             }
  373.             incr index
  374.         }
  375.     }
  376.  
  377.     if {$key == "sortScript"} {
  378.             [$this sortPage].DC.sortProcSLT text $value
  379.     }
  380. }
  381.  
  382. method ViewDefineDialog::levelChanged {this newLevel} {
  383.  
  384.     set menus {}
  385.     set menuObjects {}
  386.  
  387.     foreach i [$this allMenuEntries] {
  388.  
  389.         set uiName [lindex $i 0]
  390.         set name [lindex $i 1]
  391.         set visible [lindex $i 2]
  392.         set scope [lindex $i 3]
  393.         # check if the object is visible on this level
  394.         if {[lindex $visible $newLevel] == 0 } {
  395.             continue
  396.         }
  397.  
  398.         if {[llength $scope] > [llength [$this objScope]]} {
  399.             continue
  400.         }
  401.  
  402.         set in 1
  403.         foreach x [$this objScope] {
  404.             set index 0
  405.             foreach y $x {
  406.             set z [lindex $scope $index]
  407.             if { $z != ""  && $z != "*" } {
  408.                 if {[lsearch $z $y] == -1} {
  409.                     set in 0
  410.                 }
  411.             }
  412.             incr index
  413.             }
  414.         }    
  415.         if { $in == 1 } {
  416.             lappend menus [format "%-25s path: %s" $uiName $name]
  417.             lappend menuObjects $i
  418.         }
  419.     }
  420.  
  421.     $this possibleMenuEntries $menuObjects
  422.     [$this iPage].toolBarEntriesTL entrySet $menus
  423. }
  424.  
  425. method ViewDefineDialog::associationChanged {this} {
  426.  
  427.     set typeList ""
  428.     set orgSelectedSet [[$this iPage].typesTL selectedSet]
  429.     set selAsso [[$this iPage].associationsTL selectedSet]
  430.     set class /
  431.  
  432.     foreach asso $selAsso {
  433.         set object [$this curObject]
  434.         set objClass [.main getBrowsObj [$object repositoryType]]
  435.  
  436.         # determine the right system type
  437.         if {$objClass == "SSysVDbObj"} {
  438.             # assocs are different for a Document
  439.             if {[$object browserType] == "DocumentVersion"} {
  440.                 set types [DSysVDbObj::childTypes $asso]
  441.             } else {
  442.                 # because if not possible to determine
  443.                 # the right phase, take all the possibilities
  444.                 set types [concat \
  445.                     [PSysVDbObj::childTypes $asso] \
  446.                     [SSysVDbObj::childTypes $asso]]
  447.             }
  448.         } else {
  449.             set types [$objClass::childTypes $asso]
  450.         }
  451.         foreach i $types {
  452.             set idx [lsearch $typeList $i]
  453.             # if this type is not in the current list, add it
  454.             if {$idx == -1} {
  455.                 set typeList [concat $typeList $i]
  456.             }
  457.         }
  458.     }
  459.  
  460.     [$this iPage].typesTL entrySet $typeList
  461.     [$this iPage].typesTL selectedSet $orgSelectedSet
  462. }
  463.  
  464. method ViewDefineDialog::load {this object} {
  465.  
  466.     set associations ""
  467.     # get all the associations of the current loaded object
  468.     set objClass [.main getBrowsObj [$object repositoryType]]
  469.  
  470.     if {$objClass == "SSysVDbObj"} {
  471.         # assocs are different for a Document
  472.         if {[$object browserType] == "DocumentVersion"} {
  473.             set objClass DSysVDbObj
  474.         } else {
  475.             set objClass PSysVDbObj
  476.         }
  477.     }
  478.  
  479.     if {![isCommand $objClass]} {
  480.         wmtkmessage "No associations found for type \
  481.             '[$object repositoryType]'"
  482.     } else {
  483.         foreach i [$objClass::associations] {
  484.             #if this associations is not in the current list, add it
  485.             if { [lsearch $associations $i] == -1} {
  486.                 lappend associations $i
  487.             }
  488.         }
  489.     }
  490.  
  491.     # get the associationsClasses of the objClass
  492.     # from these classes the infoProperties must be shown
  493.     
  494.     set infoProps ""
  495.     set assocClasses ""
  496.     # get all the infoProps of the associationsClasses
  497.     foreach association $associations {
  498.         case "$association" in {
  499.             {customFileVersions} {
  500.             set assocClasses {CustFVDbObj} 
  501.             }
  502.             {directFileVersions fileVersions localFileVersions} {
  503.             set assocClasses {ExtFVDbObj GraphVDbObj MtrxVDbObj}
  504.             }
  505.             {definedItems} {
  506.             set assocClasses {WItemDbObj}
  507.             }
  508.             {externalFiles} {
  509.             set assocClasses {ExtFUiObj}
  510.             }
  511.             {externalLinks} {
  512.             set assocClasses {ExtLDbObj}
  513.             }
  514.             {fileVersionReferences} {
  515.             set assocClasses {SFileLDbObj}
  516.             }
  517.             {phaseVersions} {
  518.             set assocClasses {PhaseVDbObj}
  519.             }
  520.             {roleLinks userLinks} {
  521.             set assocClasses {UsrLDbObj}
  522.             }
  523.             {rules} {
  524.             set assocClasses {RuleUiObj} 
  525.             }
  526.             {sections} {
  527.             set assocClasses \
  528.                 {ExtFVDbObj SFileLDbObj FilePRDbObj ItemPRDbObj} 
  529.             }
  530.             {default} {
  531.             set childTypes [$objClass::childTypes $association]
  532.             set assocClasses ""
  533.             foreach childType $childTypes {
  534.                 lappend assocClasses [.main getBrowsObj $childType]
  535.             }
  536.             }
  537.         }
  538.  
  539.         foreach class $assocClasses {
  540.             if {![isCommand $class::infoProperties]} {
  541.                 continue
  542.             }
  543.             foreach prop [$class::infoProperties] {
  544.                 # if this infoProp is not in the current list, 
  545.                 # add it
  546.                 if { [lsearch $infoProps $prop] == -1} {
  547.                     lappend infoProps $prop
  548.                 }
  549.             }
  550.         }
  551.     }
  552.  
  553.     [$this iPage].associationsTL entrySet $associations
  554.     # refresh the types that belongs to the new associations
  555.     $this associationChanged
  556.  
  557.     set props [$this pPage].propertiesBV
  558.  
  559.     # delete the old propertyList 
  560.     foreach row [[$this pPage].propertiesBV objectSet] {
  561.         $row delete
  562.     }
  563.     foreach row [[$this pPage].hidpropertiesBV objectSet] {
  564.         $row delete
  565.     }
  566.  
  567.     # build the new propertyList
  568.     set index 0
  569.     set props [$this pPage].hidpropertiesBV
  570.     foreach i $infoProps {
  571.         PropViewObject new $props.$index
  572.         $props.$index label $i
  573.         $props.$index details "10 ascii none {}"
  574.         incr index
  575.     }
  576.  
  577.     $this DefineDialog::load $object
  578. }
  579.  
  580. method ViewDefineDialog::save {this popDown} {
  581.  
  582.     # check if level is correct
  583.     set objScope [$this objScope]
  584.     set repType [[$this curObject] repositoryType]
  585.     set validScope [$this getRepTypeScope $repType]
  586.     set index [llength $objScope]
  587.  
  588.     if {$validScope == "" || [lindex $validScope $index]} {
  589.         if {[$this DefineDialog::save $popDown] == 1} {
  590.             # reset redefined attribute
  591.             [$this curObject] redefined 0
  592.         }
  593.     } else {
  594.         wmtkerror "Invalid scope specified for view of repository type \
  595.             '$repType'."
  596.     }
  597. }
  598.  
  599. method ViewDefineDialog::objName {this args} {
  600.  
  601.     if {$args == ""} {
  602.         return [[$this iPage].nameSLT text]
  603.     } else {
  604.         [$this iPage].nameSLT text [join $args]
  605.     }
  606. }
  607.  
  608. method ViewDefineDialog::readAllMenuEntries {this} {
  609.  
  610.     # use the current object to get all the specified menu's
  611.     # for this we need 'context' again
  612.     # don't read 'user' if it's curLevel is not 'user'
  613.  
  614.     set menuName [[.main editorArea] _curName]
  615.  
  616.     eval "proc registerObject {spec} {$this createMenuObjects \$spec}"
  617.  
  618.     if { [[.main editorArea] _level] == "user"} {
  619.         # read always corporate
  620.         set corp [[ClientContext::global] currentCorporate]
  621.         CustFileUtilities::read $corp $menuName mnu etc
  622.         set file [path_name concat \
  623.             [path_name concat ~ icase] $menuName.mnu \
  624.                 ]
  625.         read_if_exist $file
  626.     } else {
  627.         foreach level [[.main editorArea] _path] {
  628.             CustFileUtilities::read $level $menuName mnu etc
  629.         }
  630.     }
  631. }
  632.  
  633. method ViewDefineDialog::createMenuObjects {this spec} {
  634.  
  635.     set objType ""
  636.     set objName ""
  637.     set objVisible ""
  638.     set objScope ""
  639.     set objUiName ""
  640.     set objPixmap ""
  641.  
  642.     if {[string first toolBarPixmap $spec] == -1} {
  643.         return
  644.     }
  645.  
  646.     while {![lempty $spec]} {
  647.         set key [lvarpop spec]
  648.         set value [lvarpop spec]
  649.         if {$key == "type"} {
  650.             set objType $value
  651.             if {$objType != "CustMenuPushButton" &&
  652.                 $objType != "CheckButtonNode" &&
  653.                     $objType != "CustMenuRadioButton"} {
  654.                 return
  655.             }
  656.         } elseif {$key == "name"} {
  657.             set objName $value
  658.         } elseif {$key == "visible"} {
  659.             set objVisible $value
  660.         } elseif {$key == "scope"} {
  661.             set objScope $value
  662.         } elseif {$key == "objSpec"} {
  663.             # the label of the object itself is needed too
  664.             while {![lempty $value]} {
  665.                 set key [lvarpop value]
  666.                 set labelValue [lvarpop value]
  667.                 if {$key == "label"} {
  668.                     set objUiName $labelValue
  669.                 } elseif {$key == "toolBarPixmap"} {
  670.                     set objPixmap $labelValue
  671.                 }
  672.             }
  673.         }
  674.     }
  675.  
  676.     if {$objType == ""} {
  677.         return
  678.     }
  679.  
  680.     if {$objPixmap == ""} {
  681.         return
  682.     }
  683.  
  684.     $this allMenuEntries "[$this allMenuEntries] \{\"$objUiName\" \
  685.         $objName \"$objVisible\" \"$objScope\"\}"
  686. }
  687.  
  688. # Do not delete this line -- regeneration end marker
  689.  
  690. method ViewDefineDialog::getRepTypeScope {this name} {
  691.     return [[$this repTypeScope] set $name]
  692. }
  693.  
  694. method ViewDefineDialog::setRepTypeScope {this name newRepTypeScope} {
  695.     [$this repTypeScope] set $name $newRepTypeScope
  696. }
  697.  
  698. method ViewDefineDialog::removeRepTypeScope {this name} {
  699.     [$this repTypeScope] unset $name
  700. }
  701.  
  702.