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

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