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

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1997
  4. #
  5. #      File:           @(#)vsobjnamec.tcl    /main/titanic/8
  6. #      Author:         <generated>
  7. #      Description:    VCM integration file
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)vsobjnamec.tcl    /main/titanic/8   14 Nov 1997 Copyright 1997 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. # End user added include file section
  13.  
  14. require "objnamecha.tcl"
  15.  
  16. # Redefinition of ObjNameChangeDialog
  17. # to add rename functionality in VCM
  18. # system.
  19.  
  20. Class VSObjNameChangeDialog : {ObjNameChangeDialog} {
  21.     constructor
  22.     method destructor
  23.     method changeName
  24.     method changeObjectName
  25.     method isPathError
  26.     method getParent
  27.     method updateObjectPath
  28.     method updateVSFilePath
  29.     method updateFileSystemPath
  30.     method getOldPath
  31.     method readPathCustomization
  32.     method renameDirectoryWithConfirm
  33.  
  34.     # Set by subclass: CCSystem, RazorSystem or
  35.     # ContSystem. Used to access static methods
  36.     # of these classes.
  37.     #
  38.     attribute vsSystem
  39. }
  40.  
  41. constructor VSObjNameChangeDialog {class this name tool} {
  42.     set this [ObjNameChangeDialog::constructor $class $this $name $tool]
  43.     # Start constructor user section
  44.     # End constructor user section
  45.     return $this
  46. }
  47.  
  48. method VSObjNameChangeDialog::destructor {this} {
  49.     # Start destructor user section
  50.     # End destructor user section
  51.     $this ObjNameChangeDialog::destructor
  52. }
  53.  
  54. # Redefinition that catches path name errors
  55. # in the repository.
  56. #
  57. method VSObjNameChangeDialog::changeName {this useOld} {
  58.     set keeper [$this keeper]
  59.     set configV [$this configV]
  60.     set newName [$this text]
  61.     set oldName [[$this item] name]
  62.  
  63.     # Store info about the selected object
  64.     # which will possibly be deselected by the ItemKeeper
  65.     set selectedObj [lindex [[$this tool] selectedObjSet] 0]
  66.     if [$selectedObj isA SystemVersion] {
  67.         set parentObj [$selectedObj getParent PhaseVersion]
  68.         set objType [[$selectedObj system] type]
  69.         set level system
  70.     } elseif [$selectedObj isA FileVersion] {
  71.         set phaseObj [$selectedObj getParent PhaseVersion]
  72.         set parentObj [$selectedObj getParent SystemVersion]
  73.         set objType [[$selectedObj file] type]
  74.         set sysType [[$parentObj system] type]
  75.         set level file
  76.     } else {
  77.         set level other
  78.     }
  79.  
  80.     # Do the actual name change
  81.     if [ catch { $keeper renameRefs [$this item] $newName $useOld $configV } message] {
  82.         if { ![$this isPathError $message] } {
  83.         error $message
  84.         }
  85.     }
  86.     $this changeNameExtra $selectedObj $newName
  87.  
  88.     # Retrieve the name-changed object
  89.     # which is possibly just created by the ItemKeeper
  90.     set closeFlag 0
  91.     case $level in {
  92.         {system} {
  93.         set newObj [$parentObj findSystemVersion "$newName" "$objType"]
  94.         }
  95.         {file} {
  96.         if [catch {set newObj \
  97.             [$parentObj findFileVersion "$newName" "$objType"]}] {
  98.             set parentObj \
  99.             [$phaseObj findSystemVersion "$newName" "$sysType"]
  100.         set newObj \
  101.             [$parentObj findFileVersion "$newName" "$objType"]
  102.         set closeFlag 1
  103.         global errorInfo
  104.         set errorInfo ""
  105.         global errorCode
  106.         set errorCode ""
  107.         }
  108.     }
  109.     {default} {
  110.         set newObj [ORB::nil]
  111.     }
  112.     }
  113.  
  114.     $this updateObjectPath $oldName $newObj
  115.  
  116.     # Close the current view if the parent is deselected
  117.     if $closeFlag {
  118.     wmtkmessage "Deselected [$parentObj browserType] '$oldName':\
  119.         Closing View ..."
  120.     [[[$this tool] currentObj] parent] open
  121.     wmtkmessage "Done"
  122.     }
  123.  
  124.     [$this tool] updateView
  125.     $this delete
  126. }
  127.  
  128.  
  129. # Redefinition that catches path name errors
  130. # in the repository.
  131. #
  132. method VSObjNameChangeDialog::changeObjectName {this} {
  133.     set newName [$this text]
  134.     set selectedObj [lindex [[$this tool] selectedObjSet] 0]
  135.     set oldName [$selectedObj name]
  136.  
  137.     # do the rename
  138.     set renameObject $selectedObj
  139.     # for configversions the config must be renamed
  140.     if [$renameObject isA ConfigVersion] {
  141.     set renameObject [$selectedObj ConfigVersion::config]
  142.     }
  143.     if [catch { $renameObject name $newName } message] {
  144.     if { ![$this isPathError $message] } {
  145.         error $message
  146.     }
  147.     }
  148.  
  149.     $this updateObjectPath $oldName $selectedObj
  150.     [$this tool] updateView
  151.     wmtkmessage ""
  152.     $this delete
  153. }
  154.  
  155.  
  156. # Return whether given error message is a 
  157. # path error or not. Path error: some error
  158. # that occurred during change name because
  159. # a directory could not be moved.
  160. #
  161. method VSObjNameChangeDialog::isPathError {this message} {
  162.     return [regexp {able to rename directory} $message]
  163. }
  164.  
  165.  
  166. # Return parent object of object in which object is
  167. # a SystemVersion, ConfigVersion or Project.
  168. #
  169. method VSObjNameChangeDialog::getParent {this object} {
  170.     set cc [ClientContext::global]
  171.     if [$object isA SystemVersion] {
  172.     return [$cc currentPhase]
  173.     }
  174.     if [$object isA ConfigVersion] {
  175.     return [$cc currentProject]
  176.     }
  177.     return [$cc currentCorporate]
  178. }
  179.  
  180.  
  181. # Update the path of newObj in the VCM system
  182. # if there is a correspondance. For VSFiles there
  183. # always is, for Project, ConfigVersion and SystemVersion
  184. # check presence of name in path through vsObject
  185. # UserPath and rename if so.
  186. #
  187. method VSObjNameChangeDialog::updateObjectPath {this oldName newObj} {
  188.     if [$newObj isNil] {
  189.     return
  190.     }
  191.  
  192.     # This action may be called at a level above system level in which
  193.     # case the VCM vars must still be initialized.
  194.     if { ![$this initializeVCMVars] } {
  195.     return
  196.     }
  197.  
  198.     # real external links: do nothing
  199.     if [$newObj isA ExternalLink] {
  200.     return
  201.     }
  202.  
  203.     if [$newObj isA VSFile] {
  204.     $this updateVSFilePath $oldName $newObj
  205.     return
  206.     }
  207.  
  208.     # make sure that path redefinitions are available
  209.     $this readPathCustomization $newObj
  210.  
  211.     set oldPath [[$this vsSystem]::vsObjectUserPath $newObj]
  212.     $this updateFileSystemPath $oldName $newObj
  213.     set newPath [[$this vsSystem]::vsObjectUserPath $newObj]
  214.  
  215.     # if path did not change because of change in the fileSystemPath property
  216.     # retrieve old path
  217.     if { "$newPath" == "$oldPath" } {
  218.     set oldPath [$this getOldPath $oldName $newObj]
  219.     }
  220.  
  221.     # if path changed: action
  222.     if { "$newPath" != "$oldPath" } {
  223.     # find changed part
  224.     set newPathParts [file split $newPath]
  225.     set oldPathParts [file split $oldPath]
  226.     set index 0
  227.     while { $index < [llength $newPathParts] } {
  228.         if { [lindex $newPathParts $index] != [lindex $oldPathParts $index] } {
  229.         set oldPath [eval file join [lrange $oldPathParts 0 $index]]
  230.         set newPath [eval file join [lrange $newPathParts 0 $index]]
  231.         $this renameDirectoryWithConfirm $oldPath $newPath
  232.         }
  233.         incr index 1
  234.     }
  235.     }
  236. }
  237.  
  238.  
  239. # Update fileSystemPath property of newObj
  240. # and move file in the VCM system.
  241. #
  242. method VSObjNameChangeDialog::updateVSFilePath {this oldName newObj} {
  243.     $newObj updatePath
  244.  
  245.     # if name change in VCM fails reset name
  246.     if { ![$newObj renameInVS $oldName] } {
  247.     $newObj name $oldName
  248.     } else {
  249.     # force update by deleting object; updateView will take care
  250.     # of the rest
  251.     $newObj delete
  252.     }
  253. }
  254.  
  255.  
  256. # Update file System Path property if
  257. # oldName occurred in it.
  258. #
  259. method VSObjNameChangeDialog::updateFileSystemPath {this oldName newObj} {
  260.     set filePathProperty [$newObj findProperty fileSystemPath]
  261.     if { ![$filePathProperty isNil] } {
  262.     set newName [$newObj name]
  263.     set oldValue [$filePathProperty value]
  264.     if [regsub $oldName $oldValue $newName newValue] {
  265.         $filePathProperty change "$newValue"
  266.     }
  267.     }
  268. }
  269.  
  270.  
  271. # Get old path of object: find relative part and replace
  272. # newName with oldName in this part.
  273. #
  274. method VSObjNameChangeDialog::getOldPath {this oldName newObj} {
  275.     set newPath [[$this vsSystem]::vsObjectUserPath $newObj]
  276.     set newName [$newObj name]
  277.     set parentObj [$this getParent $newObj]
  278.     set parentPath [[$this vsSystem]::vsObjectUserPath $parentObj]
  279.  
  280.     # if parent path occurs in new path we can determine the relative path
  281.     if { [string first $parentPath $newPath] == 0 } {
  282.     set relativePathIndex [expr [string length $parentPath]+1]
  283.     set relativePath [string range $newPath $relativePathIndex end]
  284.     regsub -all $newName $relativePath $oldName oldRelativePath
  285.     return [path_name concat $parentPath $oldRelativePath]
  286.     }
  287.  
  288.     return $newPath
  289. }
  290.  
  291.  
  292. # Read u_vcm.tcl at the correct level.
  293. #
  294. method VSObjNameChangeDialog::readPathCustomization {this {levelID ""}} {
  295.     set cc [ClientContext::global]
  296.     set levelChanged 0
  297.  
  298.     # if level does not occur in level string we are one level too high
  299.     # go down in this case.
  300.     if { $levelID != "" } {
  301.     if { ![regexp [$levelID identity] [$cc currentLevelIdString]] } {
  302.         $cc downLevelId $levelID
  303.         set levelChanged 1
  304.     }
  305.     }
  306.  
  307.     # source the customization file
  308.     eval [$cc getCustomFileContents u_vcm tcl tcl]
  309.  
  310.     # reset level if needed
  311.     if $levelChanged {
  312.     $cc upLevel
  313.     }
  314. }
  315.  
  316.  
  317. # Issue warning that a directory is about te be renamed
  318. # and ask confirmation.
  319. #
  320. method VSObjNameChangeDialog::renameDirectoryWithConfirm {this oldPath newPath} {
  321.     if { ![[$this vsSystem]::directoryExists $oldPath] } {
  322.     return
  323.     }
  324.  
  325.     set message "Directory $oldPath will be renamed to $newPath"
  326.     WarningDialog new .main.renameWarning \
  327.         -title "Change Name Warning" \
  328.         -message $message
  329.  
  330.     .main.renameWarning okPressed \
  331.         ".main busy 1;\
  332.         [$this vsSystem]::renameVSDirectory [list $oldPath] [list $newPath];\
  333.         .main busy 0;\
  334.         .main.renameWarning delete"
  335.  
  336.     .main.renameWarning delHelpButton
  337.     .main.renameWarning popUp
  338. }
  339.  
  340. # Do not delete this line -- regeneration end marker
  341.  
  342.