home *** CD-ROM | disk | FTP | other *** search
/ PC World 1997 November / PCWorld_1997-11_cd.bin / software / programy / komix / DATA.Z / drslevelob.tcl < prev    next >
Text File  |  1997-05-21  |  13KB  |  363 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1997
  4. #
  5. #      File:           @(#)drslevelob.tcl    /main/hindenburg/22
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)drslevelob.tcl    /main/hindenburg/22   21 May 1997 Copyright 1997 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. # End user added include file section
  13.  
  14. require "drstreeobj.tcl"
  15.  
  16. #Class DrsLevelObject : {DrsTreeObject} {
  17. #    method destructor
  18. #    constructor
  19. #    method copyProperties
  20. #    method createLevel
  21. #    method deleteObject
  22. #    method deleteLevel
  23. #    method getDiagramType
  24. #    method getConfigVersion
  25. #    method getDoorsParObjId
  26. #    method getLevelV
  27. #    method install
  28. #    method isAvailable
  29. #    method isIntegrated
  30. #    method lock
  31. #    method removeReference
  32. #    method removeRefObject
  33. #    method saveReference
  34. #    method updateObject
  35. #    attribute levelId
  36. #    attribute versionId
  37. #    attribute levelVersions
  38. #    attribute parentLevel
  39. #    attribute parentLevelId
  40. #    attribute configV
  41. #}
  42.  
  43. method DrsLevelObject::destructor {this} {
  44.     # Start destructor user section
  45.     # End destructor user section
  46.     $this DrsTreeObject::destructor
  47. }
  48.  
  49. constructor DrsLevelObject {class this level levelVersion pLevel pVersion} {
  50.     set this [DrsTreeObject::constructor $class $this $level]
  51.         $this level $level
  52.         $this versionId $levelVersion
  53.         $this parentLevel $pLevel
  54.         $this parentLevelId $pVersion
  55.         return $this
  56.  
  57. }
  58.  
  59. method DrsLevelObject::copyProperties {this otObject doorsObject} {
  60.     set dxlCommand [$this dxlCommand]
  61.     foreach propName [m4_var get M4_doors_integrated_properties] {
  62.         set propVal [$otObject getPropertyValue $propName]
  63.         $dxlCommand doorsObjectAttrSetValue $doorsObject $propName $propVal
  64.     }
  65.     set objTextAttr [m4_var get M4_doors_objecttext_property]
  66.     if [llength $objTextAttr] {
  67.         set propVal [$otObject getPropertyValue [lindex $objTextAttr 0]]
  68.         $dxlCommand doorsObjectAttrSetValue $doorsObject "Object Text" $propVal
  69.     }
  70.     set levelName  [[$this level] name]
  71.     $dxlCommand doorsObjectAttrSetValue $doorsObject "Object Heading" $levelName
  72. }
  73.  
  74. method DrsLevelObject::createLevel {this doorsObject} {
  75.     set dxlCommand [$this dxlCommand]
  76.     set levelName  [[$this level] name]
  77.     set toFilterName  "[[$this level] name][[$this level] type]"
  78.     regsub -all {\.|\:|\(|\)|\\|\||\[|\]|\*|\+|\#|\-|\!|\=} $toFilterName "" filteredName
  79.     set newObject [$dxlCommand doorsObjectCreateChild $doorsObject \
  80.                 $levelName $filteredName]
  81.     $dxlCommand doorsObjectAttrSave $newObject "Absolute Number"
  82.     return $newObject
  83. }
  84.  
  85. method DrsLevelObject::deleteObject {this} {
  86.     # remove object from the list of selected objects of its parent
  87.     set thisLevel [$this level]
  88.     if [llength [$this getLevelV]] {
  89.         return
  90.     }
  91.     [.main messageArea] message  "Removing [$this levelName] version [$this versionId]"
  92.     set parVersDict [Dictionary new]
  93.     $parVersDict contents [$thisLevel  getPropertyValue \
  94.                             ${FORMALMODULE}_ParentOTVersions]
  95.     set myParentVersions [$this versionId]
  96.     set delInd [lsearch $myParentVersions  [$this parentLevelId ]]
  97.     set newMyParentVersions [lreplace $myParentVersions $delInd $delInd]
  98.     if [llength $newMyParentVersions] {
  99.         $parVersDict set [$this versionId] $newParentVersions
  100.     } else {
  101.         $parVersDict unset [$this versionId]
  102.     }
  103.     set newParentVersions [$parVersDict contents]
  104.  
  105.     set parentLevel [$this getParentPropertyObject]
  106.     if ![llength $parentLevel] {
  107.         return 
  108.     }
  109.     set parentChildDict [Dictionary new]
  110.     set selectedItems [$parentLevel getPropertyValue \
  111.                     ${FORMALMODULE}_SelectedItems]
  112.     $parentChildDict contents $selectedItems
  113.     set levelName [$this levelName]
  114.     set versionsOfMyself [$parentChildDict set  $levelName]
  115.     set currIndex [lsearch $versionsOfMyself [$this versionId]]
  116.     set versionsOfMyself [lreplace $versionsOfMyself $currIndex $currIndex]
  117.     # am I selected somewhere?
  118.     if ![llength $versionsOfMyself] {
  119.         $parentChildDict unset $levelName
  120.     } else {
  121.         $parentChildDict set $levelName $versionsOfMyself
  122.     }
  123.     set parChilds [$parentChildDict contents]
  124.     set dxlCommand [$this newDxlCommand "edit"]
  125.     set doorsObjId [$thisLevel getPropertyValue $FORMALMODULE]
  126.     set parObjId [$parentLevel getPropertyValue $FORMALMODULE]
  127.     set doorsObject [$dxlCommand doorsObjectFind $doorsObjId]
  128.     $dxlCommand doorsObjectAttrSetValue $doorsObject \
  129.                                 ParentOTVersions $newParentVersions
  130.  
  131.     set doorsObject [$dxlCommand doorsObjectFind $parObjId]
  132.     if {$selectedItems != $parChilds} {
  133.         $dxlCommand doorsObjectAttrSetValue $doorsObject \
  134.                                 SelectedItems $parChilds
  135.     }
  136.  
  137.     $dxlCommand doorsResultSave "1"
  138.     $dxlCommand doorsResultSave projectName
  139.     set dxlResult [$this sendDxlCommand]
  140.     set resultListLength [llength $dxlResult]
  141.     if $resultListLength  {
  142.         set lastIndex [expr $resultListLength - 1]
  143.         set projectName [lindex $dxlResult $lastIndex]
  144.         set formalModuleName [m4_var get M4_doors_formal_module]
  145.         set FORMALMODULE "DOORS_${projectName}_$formalModuleName"
  146.         $this removeReference $thisLevel $newParentVersions $doorsObjId $parChilds
  147.     }
  148. }
  149.  
  150. method DrsLevelObject::deleteLevel {this otLevel parChilds} {
  151.     set dxlCommand [$this dxlCommand]
  152.     set doorsObjId [$otLevel getPropertyValue $FORMALMODULE]
  153.     set doorsObject [$dxlCommand doorsObjectFind $doorsObjId]
  154.     $dxlCommand doorsObjectDelete $doorsObject
  155. }
  156.  
  157. method DrsLevelObject::getEditorTypes {this} {
  158.     return ""
  159. }
  160.  
  161. method DrsLevelObject::getConfigVersion {this} {
  162.     set config [$this configV]
  163.     if ![llength $config] {
  164.         set cc [ClientContext::global]
  165.         set config [$cc currentConfig]
  166.         $this configV $config
  167.     }
  168.     return $config
  169.         
  170. }
  171.  
  172. method DrsLevelObject::getDoorsParObjId {this} {
  173.     set dxlCommand [$this dxlCommand]
  174.     set parLevel [$this getParentPropertyObject]
  175.     set parDrsObjId [$parLevel getPropertyValue $FORMALMODULE]
  176.     set doorsObject [$dxlCommand doorsObjectFind $parDrsObjId]
  177.     return $doorsObject
  178. }
  179.  
  180. method DrsLevelObject::getLevelV {this} {
  181.     set thisLevel [$this level]
  182.     set versionId [$this versionId]
  183.     return [searchOnVersion [$this levelVersions] $versionId ]
  184.  
  185. }
  186.  
  187. method DrsLevelObject::install {this} {
  188.     [.main messageArea] message  "Checking [$this levelName]"
  189.     set thisLevel [$this getPropertyObject]
  190.     set levelObjId [$thisLevel getPropertyValue $FORMALMODULE]
  191.  
  192.     # ParentOTVersion property is a dictionary with:
  193.     # Key: The version of myself
  194.     # List: The versions of the parent in which I am selected
  195.     set childOfDict [Dictionary new]
  196.     set thisIsIntegrated [$this isIntegrated  $levelObjId]
  197.     if $thisIsIntegrated {
  198.         # current name is integrated
  199.         $childOfDict contents  [$thisLevel getPropertyValue \
  200.                     ${FORMALMODULE}_ParentOTVersions]
  201.         set parentList [$childOfDict set [$this versionId]]
  202.         if  [$this isAvailable $parentList]  {
  203.         # current name version is integrated
  204.         set propObj [$this getPropertyObject]
  205.         set storedUpdateTime [$propObj  getPropertyValue ${FORMALMODULE}_TIMESTAMP]
  206.         set currentTimeStamp [[$this getTimeStampObject] updateTime]
  207.         if {![llength $storedUpdateTime] || [expr $storedUpdateTime + 5 < $currentTimeStamp] || $currentTimeStamp < $storedUpdateTime} {
  208.             # Update when 
  209.             # 1. Really out of date.
  210.             # 2. Older version selected or in other configuration
  211.  
  212.             $this updateObject $levelObjId $currentTimeStamp
  213.         }
  214.         return "1"
  215.         } 
  216.     }
  217.     
  218.     set parentLevel [$this getParentPropertyObject]
  219.     lappend parentList [$this parentLevelId]
  220.     $childOfDict set [$this versionId] $parentList
  221.     set childOf [$childOfDict contents]
  222.  
  223.     # Extend the selected items property
  224.     set parentChildDict [Dictionary new]
  225.     $parentChildDict contents \
  226.         [$parentLevel getPropertyValue ${FORMALMODULE}_SelectedItems]
  227.     set versionsOfMyself [$parentChildDict set  [$this levelName]]
  228.     lappend  versionsOfMyself [$this versionId]
  229.     $parentChildDict set [$this levelName] $versionsOfMyself
  230.     set selItems [$parentChildDict contents]
  231.  
  232.     # DXL stuff
  233.     set dxlCommand [$this newDxlCommand "edit"]
  234.     set doorsObject [$this DrsLevelObject::getDoorsParObjId]
  235.     if ![llength $doorsObject] {
  236.         return "1"
  237.     }
  238.     $dxlCommand doorsObjectAttrSetValue $doorsObject SelectedItems $selItems
  239.     if [$this isA DrsGroupedObject] {
  240.         set doorsObject [$this getDoorsParObjId]
  241.     }
  242.     if ![llength $doorsObject] {
  243.         return "1"
  244.     }
  245.     set thisLevelV [$this getLevelV]
  246.     if !$thisIsIntegrated { 
  247.         if ![$this lock] {
  248.         global frozenFiles
  249.         lappend frozenFiles $this
  250.         return "1"
  251.         }
  252.         [.main messageArea] message  "Installing [$this levelName]"
  253.         set newDoorsObject [$this createLevel $doorsObject]
  254.         $dxlCommand doorsResultSave projectName
  255.         set levelVObjId [$thisLevelV getPropertyValue $FORMALMODULE]
  256.         if ![llength $levelVObjId] {
  257.         # integrated property not available 
  258.         # may be linked via imp_from property
  259.         set imp_from [$thisLevelV getPropertyValue imp_from]
  260.         if [llength $imp_from] {
  261.             # we are in the implementation phase
  262.             # this is a file file version (ext file or link)
  263.             set levelVObjId [$this getClassIdInPrevPhase $imp_from]
  264.         }
  265.         }
  266.         if [llength $levelVObjId] {
  267.         # LINK to previous phase
  268.         $this linkToPrevPhase $levelVObjId $newDoorsObject
  269.         } 
  270.     } else {
  271.         [.main messageArea] message  "Adding [$this levelName] version"
  272.         set newDoorsObject [$dxlCommand doorsObjectFind $levelObjId]
  273.         $dxlCommand doorsResultSave $levelObjId
  274.         $dxlCommand doorsResultSave projectName
  275.     }
  276.     if [$this isA DrsSMItemObject] {
  277.         $this linkComponents $newDoorsObject
  278.     }
  279.     $dxlCommand doorsObjectAttrSetValue $newDoorsObject \
  280.                                                 ParentOTVersions $childOf
  281.     $dxlCommand doorsObjectAttrSetValue $newDoorsObject OTType [$this levelType]
  282.     $dxlCommand doorsObjectAttrSetValue $newDoorsObject OTEditorTypes [$this getEditorTypes]
  283.     $this copyProperties $thisLevelV $newDoorsObject
  284.     $dxlCommand doorsObjectSetCurrent $newDoorsObject
  285.  
  286.     set dxlResult [$this sendDxlCommand]
  287.     set resultListLength [llength $dxlResult]
  288.     if $resultListLength  {
  289.         set lastIndex [expr $resultListLength - 1]
  290.         set specIndex 0
  291.         set ptr [lindex $dxlResult 0]
  292.         while  {[llength $ptr] && [expr  [scan $ptr "%d%s" $ptr rest] == 1 ]} {
  293.         #still isnum
  294.         incr specIndex
  295.         set ptr [lindex $dxlResult $specIndex]
  296.         }
  297.         set projectName [lrange $dxlResult $specIndex $lastIndex]
  298.         set specIndex [expr $specIndex - 1]
  299.         set dxlResult [lrange $dxlResult 0 $specIndex]
  300.         set formalModuleName [m4_var get M4_doors_formal_module]
  301.         global  FORMALMODULE
  302.         set FORMALMODULE "DOORS_${projectName}_$formalModuleName"
  303.         $this saveReference $thisLevel $dxlResult $childOf $selItems
  304.     }
  305.     return $dxlResult
  306.  
  307. }
  308.  
  309. method DrsLevelObject::isAvailable {this parentList} {
  310.     #checks whether the object is already available in the list of versions
  311.     if {[lsearch $parentList [$this parentLevelId]] != -1} {
  312.         return 1
  313.     }
  314.     return 0
  315. }
  316.  
  317. method DrsLevelObject::isIntegrated {this doorsObjId} {
  318.     return [llength $doorsObjId]
  319. }
  320.  
  321. method DrsLevelObject::lock {this} {
  322.     return 1
  323. }
  324.  
  325. method DrsLevelObject::removeReference {this otObject newPropValue doorsObjId parChilds} {
  326.     set thisLevel [$this level]
  327.     $thisLevel setProperty ${FORMALMODULE}_ParentOTVersions $newPropValue
  328.     set parentLevel [$this getParentPropertyObject]
  329.     $parentLevel setProperty ${FORMALMODULE}_SelectedItems $parChilds
  330.  
  331. }
  332.  
  333. method DrsLevelObject::removeRefObject {this otObject} {
  334.     $otObject removeProperty $FORMALMODULE
  335.     $otObject removeProperty ${FORMALMODULE}_ParentOTVersions
  336. }
  337.  
  338. method DrsLevelObject::saveReference {this otObject doorsRef parOTVersions selItems} {
  339.     $this DrsTreeObject::saveReference $otObject $doorsRef $selItems
  340.     $otObject setProperty ${FORMALMODULE}_ParentOTVersions $parOTVersions
  341. }
  342.  
  343. method DrsLevelObject::updateObject {this levelObjId currentTimeStamp} {
  344.     [.main messageArea] message  "Updating [$this levelName] properties"
  345.     set dxlCommand [$this newDxlCommand "edit"]
  346.     set doorsObject [$dxlCommand doorsObjectFind $levelObjId]
  347.     $dxlCommand doorsObjectSetCurrent $doorsObject
  348.     $this copyProperties [$this getLevelV] $doorsObject
  349.     if [$this isA DrsSMItemObject] {
  350.         $this linkComponents $doorsObject
  351.     }
  352.     set dxlResult [$this sendDxlCommand]
  353.     set propObj [$this getPropertyObject]
  354.     $propObj setProperty ${FORMALMODULE}_TIMESTAMP $currentTimeStamp
  355.     # now the updateTime has changed
  356.     # second time for synchronization
  357.     set timeStamp [[$this getTimeStampObject] updateTime]
  358.     $propObj setProperty ${FORMALMODULE}_TIMESTAMP $timeStamp
  359. }
  360.  
  361. # Do not delete this line -- regeneration end marker
  362.  
  363.