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

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1997
  4. #
  5. #      File:           @(#)mergetool.tcl    /main/titanic/28
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)mergetool.tcl    /main/titanic/28   25 Nov 1997 Copyright 1997 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. require mtnavigati.tcl
  13. require mtinformat.tcl
  14. require mtwmtarea.tcl
  15.  
  16. require mtversiona.tcl
  17. require mtproject.tcl
  18. require mtcontaine.tcl
  19. require mtconfig.tcl
  20. require mtphase.tcl
  21. require mtsystem.tcl
  22. require mtfile.tcl
  23. require mtcustfile.tcl
  24. require mtgroup.tcl
  25. require mtcorpgrou.tcl
  26. require mtproprepo.tcl
  27. require mtitemprop.tcl
  28.  
  29. require browserobj.tcl
  30. # End user added include file section
  31.  
  32. require "wmttool.tcl"
  33.  
  34. Class MergeTool : {MainWindow WmtTool} {
  35.     method destructor
  36.     constructor
  37.     method createInterface
  38.     method initialize
  39.     method selectedObjSet
  40.     method selectedMergeObjSet
  41.     method selectionChanged
  42.     method start
  43.     method addContextArea
  44.     method updateWmtArea
  45.     method updateToolBar
  46.     method updateMenu
  47.     method setCurrentContextVars
  48.     method helpOnName
  49.     attribute _selectedObjSet
  50.     attribute currentObj
  51.     attribute freezeComment
  52.     attribute mergeLinkComment
  53.     attribute showAll
  54.     attribute project
  55.     attribute import
  56.     attribute opened
  57.     attribute fromCurContext
  58.     attribute toCurContext
  59.     attribute menuHdlr
  60.     attribute wmtArea
  61.     attribute navigView
  62.     attribute infoView
  63.     attribute toSystem
  64.     attribute toPhase
  65.     attribute toConfig
  66.     attribute toFile
  67.     attribute fromFile
  68.     attribute fromConfig
  69.     attribute fromPhase
  70.     attribute fromSystem
  71.     attribute toContext
  72.     attribute fromContext
  73.     attribute objectHdlr
  74. }
  75.  
  76. method MergeTool::destructor {this} {
  77.     # Start destructor user section
  78.     if [$this opened] {
  79.         $this saveToolBarPresence mt
  80.         $this saveContextAreaPresence mt
  81.         $this saveMessageAreaPresence mt
  82.         $this saveWindowGeometry mt
  83.     }
  84.     # End destructor user section
  85.     $this WmtTool::destructor
  86. }
  87.  
  88. constructor MergeTool {class this name toolId} {
  89.     set this [MainWindow::constructor $class $this $name]
  90.     set this [WmtTool::constructor $class $this $name]
  91.     # Start constructor user section
  92.  
  93.     global makeSelectionUpToDate
  94.     set makeSelectionUpToDate 1
  95.  
  96.     $this showAll 0
  97.     $this opened 0
  98.  
  99.     global classCount
  100.     set classCount 0
  101.  
  102.     MenuBar new $this.MB
  103.  
  104.     eval [$globalModuleHandler moduleSpecSetChanged]
  105.     $this menuHdlr [CustBrMenuHandler new $toolId $globalModuleHandler]
  106.     $this createInterface
  107.     $this objectHdlr [CustObjHandler new $globalModuleHandler]
  108.  
  109.     # Check if handlers are created without errors:
  110.     # the corporate customization files exist
  111.     if [isCommand $this.error] {
  112.         return $this
  113.     }
  114.  
  115.     # Go back to corporate level and initialize the interface (toolbar)
  116.     set clientContext [ClientContext::global]
  117.     set levelIds [$clientContext currentLevelIdString]
  118.     while {! [[$clientContext currentProject] isNil]} {
  119.         $clientContext upLevel
  120.     }
  121.     [$this menuHdlr] setCurrentContext
  122.     if [catch {[$this objectHdlr] setCurrentContext} msg] {
  123.         wmtkerror $msg
  124.     }
  125.  
  126.     # Reset clientContext
  127.     $clientContext setLevelIds $levelIds
  128.     m4_var foreach m4var {
  129.         if [m4_var saveStatus $m4var] {
  130.             m4_var saveStatus $m4var 0
  131.         }
  132.     }
  133.  
  134.     $this setWindowGeometry mt
  135.  
  136.     return $this
  137. }
  138.  
  139. method MergeTool::createInterface {this} {
  140.  
  141.     DlgColumn new $this.DC
  142.     $this setContextAreaPresence mt
  143.     if [isCommand [$this wmtArea]] {
  144.     [$this wmtArea] update
  145.     }
  146.  
  147.     $this setToolBarPresence mt
  148.     interface VerSplitter $this.DC.VS {
  149.     MTNavigationView navigV {
  150.         rowCount 10
  151.         columnCount 25
  152.         horStretchFactor 5
  153.         verStretchFactor 5
  154.         horShrinkFactor 5
  155.         verShrinkFactor 5
  156.     }
  157.     MTInformationView infoV {
  158.         columnCount 40
  159.     }
  160.     }
  161.  
  162.     $this setMessageAreaPresence mt
  163.  
  164.     $this navigView    $this.DC.VS.navigV
  165.     [$this navigView] font "[m4_var get M4_font -context mt]"
  166.     $this infoView    $this.DC.VS.infoV
  167.     [$this infoView] font "[m4_var get M4_font -context mt]"
  168. }
  169.  
  170. method MergeTool::initialize {this} {
  171.  
  172.     $this import 0
  173.  
  174.     busy {
  175.     wmtkmessage "Loading ..."
  176.  
  177.     # create the nodes, do this from the 'source' point of view.
  178.     set cc [ClientContext::global]
  179.  
  180.     $cc setLevelIds [$this fromContext]
  181.  
  182.     $this project [$cc currentProject]
  183.  
  184.     $this fromConfig [$cc currentConfig]
  185.     if [[$this fromConfig] isNil] {
  186.         $this fromConfig ""
  187.     }
  188.     $this fromPhase [$cc currentPhase]
  189.     if [[$this fromPhase] isNil] {
  190.         $this fromPhase ""
  191.     } else {
  192.         [$this fromPhase] parent [$this fromConfig]
  193.     }
  194.     $this fromSystem [$cc currentSystem]
  195.     if [[$this fromSystem] isNil] {
  196.         $this fromSystem ""
  197.     } else {
  198.         [$this fromSystem] parent [$this fromPhase]
  199.     }
  200.     $this fromFile [$cc currentFile]
  201.     if [[$this fromFile] isNil] {
  202.         $this fromFile ""
  203.     } else {
  204.         [$this fromFile] parent [$this fromSystem]
  205.     }
  206.  
  207.     $cc setLevelIds [$this toContext]
  208.  
  209.     $this toFile [$cc currentFile]
  210.     if [[$this toFile] isNil] {
  211.         $this toFile ""
  212.     }
  213.     $this toSystem [$cc currentSystem]
  214.     if [[$this toSystem] isNil] {
  215.         $this toSystem ""
  216.     } else {
  217.         MTVersion new ccSystem [$this fromSystem] [$this toSystem]
  218.     }
  219.     $this toPhase [$cc currentPhase]
  220.     if [[$this toPhase] isNil] {
  221.         $this toPhase ""
  222.     } else {
  223.         if {[[$this toPhase] phase] != [[$this fromPhase] phase]} {
  224.             $this import 1
  225.         }
  226.         MTVersion new ccPhase [$this fromPhase] [$this toPhase]
  227.         if [isCommand ccSystem] {
  228.             ccPhase addChild ccSystem
  229.  
  230.         }
  231.     }
  232.     $this toConfig [$cc currentConfig]
  233.     if [[$this toConfig] isNil] {
  234.         $this toConfig ""
  235.     } else {
  236.         MTVersion new ccConfig [$this fromConfig] [$this toConfig]
  237.         if [isCommand ccPhase] {
  238.             ccConfig addChild ccPhase
  239.         }
  240.     }
  241.  
  242.     if [[$this project] isNil] {
  243.         $this project ""
  244.     } else {
  245.         MTProject new ccProject [$this project] [$this project]
  246.         if [isCommand ccConfig] {
  247.             ccProject addChild ccConfig
  248.         }
  249.     }
  250.  
  251.  
  252.     if {[$this toPhase] != ""} {
  253.         [$this toPhase] parent [$this toConfig]
  254.     }
  255.     if {[$this toSystem] != ""} {
  256.         [$this toSystem] parent [$this toPhase]
  257.     }
  258.     if {[$this toFile] != ""} {
  259.         [$this toFile] parent [$this toSystem]
  260.     }
  261.  
  262.     # start int from context
  263.     $cc setLevelIds [$this fromContext]
  264.  
  265.     $this updateMenu
  266.  
  267.     # create popup menu for view
  268.     ViewPopUpMenu new [$this infoView].pop  -poppedUp {
  269.         [.main infoView].pop entrySet [[.main menuHdlr] validPopUpEntrySet]
  270.     }
  271.  
  272.     $this start
  273.  
  274.     wmtkmessage Done
  275.     $this opened 1
  276.     }
  277. }
  278.  
  279. method MergeTool::selectedObjSet {this} {
  280.     set selectedObjSet [$this _selectedObjSet]
  281.     if {"$selectedObjSet" == "undefined"} {
  282.         set selectedObjSet [[$this infoView] selectedSet]
  283.         $this _selectedObjSet $selectedObjSet
  284.     }
  285.     if $makeSelectionUpToDate {
  286.         foreach obj $selectedObjSet {
  287.             set repObj [$obj repObj]
  288.             if {! [isCommand $repObj]} continue
  289.             set from [$repObj fromRepObj]
  290.             if [isCommand $from] {
  291.                 $from makeUpToDate
  292.             }
  293.             set to [$repObj toRepObj]
  294.             if [isCommand $to] {
  295.                 $to makeUpToDate
  296.             }
  297.         }
  298.     }
  299.     return $selectedObjSet
  300. }
  301.  
  302. method MergeTool::selectedMergeObjSet {this} {
  303.  
  304.     set mergeObjects {}
  305.     foreach object [$this selectedObjSet] {
  306.         lappend mergeObjects [$object repObj]
  307.     }
  308.     return $mergeObjects
  309. }
  310.  
  311. method MergeTool::selectionChanged {this} {
  312.     global makeSelectionUpToDate
  313.     set makeSelectionUpToDate 0
  314.  
  315.     $this _selectedObjSet "undefined"
  316.     [$this menuHdlr] selectionChanged
  317.  
  318.     set makeSelectionUpToDate 1
  319. }
  320.  
  321. method MergeTool::start {this} {
  322.  
  323.     set cc [ClientContext::global]
  324.  
  325.     global classCount
  326.     incr classCount
  327.     set unique $classCount
  328.     set name MTVersion$unique
  329.     case [$cc currentLevel] in {
  330.         {Config} {
  331.             MTConfig new $name [$this fromConfig] [$this toConfig]
  332.             ccProject addChild $name
  333.             set from [$this fromConfig]
  334.             set to [$this toConfig]
  335.             set start Configuration
  336.         }
  337.         {Phase} {
  338.             MTPhase new $name [$this fromPhase] [$this toPhase]
  339.             ccConfig addChild $name
  340.             set from [$this fromPhase]
  341.             set to [$this toPhase]
  342.             set start Phase
  343.         }
  344.         {System} {
  345.             MTSystem new $name [$this fromSystem] [$this toSystem]
  346.             ccPhase addChild $name
  347.             set from [$this fromSystem]
  348.             set to [$this toSystem]
  349.             set start System
  350.         }
  351.         {File} {
  352.             MTFile new $name [$this fromFile] [$this toFile]
  353.             ccSystem addChild $name
  354.             set from [$this fromFile]
  355.             set to [$this toFile]
  356.             set start File
  357.         }
  358.     }
  359.  
  360.     set fromName [$from getInfo Name]
  361.     set toName [$to getInfo Name]
  362.  
  363.     if ![MTProcs::isDerived $from $to] {
  364.         # now create the tree element
  365.         MTVersionable new [$this navigView].$unique $name
  366.         [$this navigView].$unique parent ""
  367.         [$this navigView].$unique initialize
  368.     }
  369.  
  370.     if [isCommand [$this navigView].$unique] {
  371.         [$this navigView].$unique open
  372.     } else {
  373.         # create the top link
  374.         if ![MTProcs::isDerived $from $to] {
  375.             MTProcs::createMergeLink $name [.main mergeLinkComment]
  376.         }
  377.         wmtkinfo "Merge complete."
  378.         wmtkmessage "Merge complete."
  379.     }
  380.  
  381.     set title "ObjectTeam Merge - "
  382.     set title "$title From $start '$fromName (V[$from versionName])'"
  383.     set title "$title To $start '$toName (V[$to versionName])'"
  384.     $this title $title
  385.  
  386.         $this selectionChanged
  387.  
  388.     $this freezeComment "created by mergetool"
  389.     $this mergeLinkComment "created by mergetool"
  390. }
  391.  
  392. method MergeTool::addContextArea {this} {
  393.     $this wmtArea [MTWmtArea new $this.DC.WA]
  394. }
  395.  
  396. method MergeTool::updateWmtArea {this} {
  397.     [$this wmtArea] update
  398. }
  399.  
  400. method MergeTool::updateToolBar {this} {
  401.  
  402.     if [catch {[$this menuHdlr] setCurrentContext} errorMsg] {
  403.     if [info exists errorInfo] {
  404.         set errorTrace $errorInfo
  405.         set errorCodeCopy $errorCode
  406.         resetErrorVars
  407.     } else {
  408.         set errorTrace ""
  409.         set errorCodeCopy ""
  410.     }
  411.     } else {
  412.     set errorMsg ""
  413.     }
  414.  
  415.     # check the menu's after setCurrentContext of menu handler
  416.     $this updateMenu
  417. }
  418.  
  419. method MergeTool::updateMenu {this} {
  420.  
  421.     # adjust menu for import
  422.     if [$this import] {
  423.         if [isCommand $this.MB.view.menu.showAllMergeObjects] {
  424.             $this.MB.view.menu.showAllMergeObjects delete
  425.         }
  426.         if [isCommand $this.MB.version.menu.merge] {
  427.             $this.MB.version.menu.merge delete
  428.         }
  429.         if [isCommand $this.MB.version.menu.overwrite] {
  430.             $this.MB.version.menu.overwrite delete
  431.         }
  432.         if [isCommand $this.MB.version.menu.import] {
  433.             $this.MB.version.menu.import label Merge
  434.         }
  435.     } else {
  436.         if [isCommand $this.MB.version.menu.import] {
  437.             $this.MB.version.menu.import delete
  438.         }
  439.     }
  440. }
  441.  
  442. method MergeTool::setCurrentContextVars {this} {
  443.  
  444.     # update the 'to Context', it can be changed due to
  445.     # new actions
  446.     set cc [ClientContext::global]
  447.     set toContext /[[$cc currentCorporate] identity]
  448.     append toContext /[[$cc currentProject] identity]
  449.     if {[$cc currentLevel] == "Config"} {
  450.         append toContext /[[$this toConfig] identity]
  451.     } elseif {[$cc currentLevel] == "Phase"} {
  452.         append toContext /[[$this toConfig] identity]
  453.         append toContext /[[$this toPhase] identity]
  454.     } elseif {[$cc currentLevel] == "System"} {
  455.         append toContext /[[$this toConfig] identity]
  456.         append toContext /[[$this toPhase] identity]
  457.         append toContext /[[$this toSystem] identity]
  458.     }
  459.     $this toContext $toContext
  460.  
  461.     # set the current Context vars
  462.     set from ""
  463.     set to ""
  464.     set p ""
  465.     if {[$this currentObj] != ""} {
  466.         set p [[$this currentObj] repObj]
  467.     }
  468.     for {} {"$p" != "" && [$p level] != ""} {set p [$p parent]} {
  469.         if {[$p parent] == "" || [[$p parent] level] == ""} {
  470.             continue
  471.         }
  472.         # check if currentLevel reached
  473.         if {[$p level] == [$cc currentLevel]} {
  474.             break
  475.         }
  476.         $this from[$p level] [$p fromRepObj]
  477.         if {$from == ""} {
  478.             set from "[[$p fromRepObj] identity]"
  479.         } else {
  480.             set from "[[$p fromRepObj] identity]/$from"
  481.         }
  482.  
  483.         $this to[$p level] [$p toRepObj]
  484.         if {[$p toRepObj] == ""} {
  485.             continue
  486.         }
  487.         if {$to == ""} {
  488.             set to "[[$p toRepObj] identity]"
  489.         } else {
  490.             set to "[[$p toRepObj] identity]/$to"
  491.         }
  492.  
  493.     }
  494.     if {$from != ""} {
  495.         set from "[$this fromContext]/$from"
  496.     } else {
  497.         set from "[$this fromContext]"
  498.     }
  499.     if {$to != ""} {
  500.         set to "[$this toContext]/$to"
  501.     } else {
  502.         set to "[$this toContext]"
  503.     }
  504.     $this fromCurContext $from
  505.     $this toCurContext $to
  506. }
  507.  
  508. method MergeTool::helpOnName {this name} {
  509.     global short2url
  510.     if {! [catch {set url $short2url($name)}]} {
  511.     showHelp $url
  512.     return
  513.     }
  514.  
  515.     if [regsub "crnt_" $name "" name] {
  516.     $this helpOnName $name
  517.     return
  518.     }
  519.  
  520.     wmtkerror "Sorry, no help available for '$name'"
  521. }
  522.  
  523. # Do not delete this line -- regeneration end marker
  524.  
  525.