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

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1996
  4. #
  5. #      File:           @(#)userenvvie.tcl    /main/titanic/11
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)userenvvie.tcl    /main/titanic/11   18 Nov 1997 Copyright 1996 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. require "browstable.tcl"
  13. require "uenvbrobje.tcl"
  14. # End user added include file section
  15.  
  16. require "reptoolvie.tcl"
  17.  
  18. Class UserEnvView : {RepToolView} {
  19.     method destructor
  20.     constructor
  21.     method initialize
  22.     method selectedObjSet
  23.     method repositoryChanged
  24.     method projectChanged
  25.     method configChanged
  26.     method selectionChanged
  27.     method update
  28.     method updateMessage
  29.     method onlyWorkingSelected
  30.     method anyWorkingSelected
  31.     method reload
  32.     method removeFiles
  33.     method uploadFiles
  34.     method setFont
  35.     method getFont
  36.     method fileDelete
  37.     method fileUpload
  38.     method fileShow
  39.     method editSelectWorking
  40.     method editSelectAll
  41.     method editDeselectAll
  42.     method editInvertSelection
  43.     method helpOnContext
  44.     attribute changed
  45.     attribute repositories
  46.     attribute projects
  47.     attribute configurations
  48.     attribute files
  49.     attribute project
  50.     attribute configV
  51. }
  52.  
  53. method UserEnvView::destructor {this} {
  54.     # Start destructor user section
  55.     # End destructor user section
  56.     $this RepToolView::destructor
  57. }
  58.  
  59. constructor UserEnvView {class this name} {
  60.     set this [RepToolView::constructor $class $this $name repuenv]
  61.  
  62.         $this setTitle "User Environment" rep_uenv_64
  63.         $this firstExposed "$this initialize"
  64.     $this changed 0
  65.         $this project [[ClientContext::global] currentProject]
  66.         $this configV [[ClientContext::global] currentConfig]
  67.  
  68.         # Create main interface part.
  69.         #
  70.         interface DlgColumn $this.gui.col {
  71.             HorSeparator h {
  72.             }
  73.             DlgRow r {
  74.         spaceType NONE
  75.         horStretchFactor 0
  76.         verStretchFactor 0
  77.         verShrinkFactor 0
  78.                 DlgRow reps {
  79.             spaceType NONE
  80.             Label l { text "Repository:" }
  81.             OptionMenu reps {
  82.             justification CENTER
  83.             entrySet {<none>}
  84.             }
  85.                 }
  86.                 DlgRow proj {
  87.             spaceType NONE
  88.             horStretchFactor 100
  89.             Label l { text "Project:" }
  90.             OptionMenu proj {
  91.             horStretchFactor 100
  92.             justification CENTER
  93.             entrySet {<any>}
  94.             }
  95.                 }
  96.                 DlgRow conf {
  97.             spaceType NONE
  98.             horStretchFactor 100
  99.             Label l { text "Config:" }
  100.             OptionMenu conf {
  101.             horStretchFactor 100
  102.             justification CENTER
  103.             entrySet {<any>}
  104.             }
  105.                 }
  106.             }
  107.             DlgColumn f {
  108.         spaceType NONE
  109.         verStretchFactor 100
  110.         verShrinkFactor 100
  111.         BrowsTable files {
  112.             verStretchFactor 100
  113.             verShrinkFactor 100
  114.             mode DETAIL
  115.             selectionPolicy EXTENDED
  116.             columnCount 72
  117.             rowCount 15
  118.         }
  119.             }
  120.         }
  121.  
  122.         $this repositories $this.gui.col.r.reps.reps
  123.         $this projects $this.gui.col.r.proj.proj
  124.         $this configurations $this.gui.col.r.conf.conf
  125.         $this files $this.gui.col.f.files
  126.  
  127.         [$this repositories] selectionChanged "busy {$this repositoryChanged}"
  128.     [$this repositories] entrySet \
  129.         [concat <none> [[$this rep] getAvailableRepositories]]
  130.         [$this projects] selectionChanged "busy {$this projectChanged}"
  131.         [$this configurations] selectionChanged "busy {$this configChanged}"
  132.  
  133.         [$this files] font [$this getFont]
  134.         [$this files] selectionChanged "$this selectionChanged"
  135.         [$this files] setHeaderLabels [UEnvBrObject::headerLabels]
  136.         [$this files] format
  137.  
  138.     ViewPopUpMenu new [$this files].pop -poppedUp {
  139.         [.main files].pop entrySet [[.main menuHandler] validPopUpEntrySet]
  140.     }
  141.  
  142.     return $this
  143. }
  144.  
  145. proc UserEnvView::repToolClass {} {
  146.     return "UserEnvView"
  147. }
  148.  
  149. method UserEnvView::initialize {this} {
  150.     busy {
  151.         set selected "<none>"
  152.  
  153.         # No level path should be set at this point.
  154.         #
  155.     catch {set cc [ClientContext::global]}
  156.     catch {set cc [ClientContext::global]}
  157.  
  158.     if {[$this levelPathIds] != ""} {
  159.         if [catch {$cc setLevelIds [$this levelPathIds]} error] {
  160.                 $this error $error
  161.                 $this message ""
  162.             }
  163.     } elseif {[$this levelPath] != ""} {
  164.         if [catch {$cc setLevelPath [$this levelPath]} error] {
  165.                 $this error $error
  166.                 $this message ""
  167.             }
  168.     }
  169.  
  170.     set corp [$cc currentCorporate]
  171.     if ![$corp isNil] {
  172.         [$this repositories] selected [$corp name]
  173.         $this selectionChanged
  174.         $this repositoryChanged
  175.     }
  176.     }
  177. }
  178.  
  179. method UserEnvView::selectedObjSet {this} {
  180.     return [[$this files] selectedSet]
  181. }
  182.  
  183. method UserEnvView::repositoryChanged {this} {
  184.     # Clear file list.
  185.     #
  186.     [$this files] removeAllObjects
  187.  
  188.     # Clear Project option menu.
  189.     #
  190.     [$this projects] entrySet <any>
  191.     [$this projects] selected <any>
  192.     $this project [ORB::nil]
  193.  
  194.     # Clear Config option menu.
  195.     #
  196.     [$this configurations] entrySet <any>
  197.     [$this configurations] selected <any>
  198.     $this configV [ORB::nil]
  199.  
  200.     set name [[$this repositories] selected]
  201.     if {$name == "<none>"} {
  202.     [$this rep] setCurrent ""
  203.         return
  204.     }
  205.  
  206.     if [catch {[$this rep] setCurrent $name} error] {
  207.     $this message "Cannot access repository '$name'."
  208.     $this contextError $error
  209.     } else {
  210.     $this message "Selected repository '$name'."
  211.     $this contextError ""
  212.         set error 0
  213.     }
  214.     [$this menuHandler] levelChanged
  215.     if {$error != "0"} {
  216.     $this error $error
  217.     return
  218.     }
  219.  
  220.     set names {}
  221.     set corp [[$this rep] currentCorporate]
  222.     if ![$corp isNil] {
  223.     foreach project [$corp projects] {
  224.         lappend names "[$project name]"
  225.     }
  226.     }
  227.     if {[llength $names] == 1} {
  228.     [$this projects] entrySet $names
  229.     [$this projects] selected $names
  230.     } else {
  231.     [$this projects] entrySet [concat <any> $names]
  232.     [$this projects] selected <any>
  233.     }
  234.  
  235.     $this changed 1
  236.     $this projectChanged
  237.     $this updateMessage
  238. }
  239.  
  240. method UserEnvView::projectChanged {this} {
  241.     # Clear file list.
  242.     #
  243.     [$this files] removeAllObjects
  244.  
  245.     # Clear Config option menu.
  246.     #
  247.     [$this configurations] entrySet <any>
  248.     [$this configurations] selected <any>
  249.     $this configV [ORB::nil]
  250.  
  251.     set sel [[$this projects] selected]
  252.     if {$sel == "<any>"} {
  253.         $this project [ORB::nil]
  254.         return
  255.     }
  256.  
  257.     set names {}
  258.     set corp [[$this rep] currentCorporate]
  259.     if ![$corp isNil] {
  260.     $this project [$corp findProject $sel]
  261.         if [[$this project] isNil] {
  262.             $this error "Project '$sel' not found in corporate '[$corp name]'"
  263.         } else {
  264.         foreach configV [[$this project] configVersions] {
  265.         lappend names [[$configV config] name]:[$configV versionNumber]
  266.         }
  267.         $this updateMessage
  268.         }
  269.     }
  270.     if {[llength $names] == 1} {
  271.     [$this configurations] entrySet $names
  272.     [$this configurations] selected $names
  273.     } else {
  274.     [$this configurations] entrySet [concat <any> $names]
  275.     [$this configurations] selected <any>
  276.     }
  277. }
  278.  
  279. method UserEnvView::configChanged {this} {
  280.     # Clear file list.
  281.     #
  282.     [$this files] removeAllObjects
  283.  
  284.     set sel [[$this configurations] selected]
  285.     if {$sel == "<any>"} {
  286.         $this configV [ORB::nil]
  287.         return
  288.     }
  289.  
  290.     set proj [$this project]
  291.     set nv [split $sel :]
  292.     $this configV [$proj findConfigVersion [lindex $nv 0] [lindex $nv 1]]
  293.     if [[$this configV] isNil] {
  294.         $this error "Configuration '$sel' not found in project '[$proj name]'"
  295.     } else {
  296.     $this updateMessage
  297.     }
  298. }
  299.  
  300. method UserEnvView::selectionChanged {this} {
  301.     $this RepToolView::selectionChanged
  302. }
  303.  
  304. method UserEnvView::update {this} {
  305.     busy { $this reload }
  306. }
  307.  
  308. method UserEnvView::updateMessage {this} {
  309.     $this message "Use 'View|Refresh' to retrieve existing external files."
  310. }
  311.  
  312. method UserEnvView::onlyWorkingSelected {this} {
  313.     set objects [[$this files] selectedSet]
  314.     foreach obj $objects {
  315.         if {[[$obj fileV] status] != "working"} {
  316.             return 0
  317.         }
  318.     }
  319.     return 1
  320. }
  321.  
  322. method UserEnvView::anyWorkingSelected {this} {
  323.     set objects [[$this files] selectedSet]
  324.     foreach obj $objects {
  325.         if {[[$obj fileV] status] == "working"} {
  326.             return 1
  327.         }
  328.     }
  329.     return 0
  330. }
  331.  
  332. method UserEnvView::reload {this} {
  333.     set files [$this files]
  334.  
  335.     set currSel {}
  336.     foreach s [$files selectedSet] {
  337.     regsub -all {\\} [$s label] {@@@} escapedLabel
  338.         lappend currSel $escapedLabel
  339.     }
  340.     set newSel {}
  341.  
  342.     $files removeAllObjects
  343.  
  344.     set sel [[$this repositories] selected]
  345.     if {$sel == "<none>"} {
  346.         $this message "No repository selected."
  347.         $files format
  348.         return
  349.     } elseif [[[$this rep] currentCorporate] isNil] {
  350.         $this message "Cannot access repository '$sel'."
  351.         $files format
  352.         return
  353.     }
  354.  
  355.     $this message "This action may take a while, please wait..."
  356.  
  357.     set proj [$this project]
  358.     set conf [$this configV]
  359.  
  360.     [$this rep] getExternalFileVersions -clear
  361.     set exts [[$this rep] getExternalFileVersions -proj $proj -conf $conf]
  362.  
  363.     set errors {}
  364.     set i 0
  365.     foreach ext $exts {
  366.         set fileV [lindex $ext 0]
  367.         set configV [lindex $ext 1]
  368.  
  369.         if [catch {set path [$fileV path $configV]} error] {
  370.             set file [$fileV file]
  371.             set name "[$file name].[$file type] ([$fileV versionName])"
  372.             append errors "Error while determining path of $name:\n$error\n\n"
  373.             continue
  374.         }
  375.  
  376.         if ![file exists $path] {
  377.             continue
  378.         }
  379.  
  380.     UEnvBrObject new $files.file$i $fileV $configV $path
  381.  
  382.     regsub -all {\\} $path {@@@} escapedPath
  383.         if {[lsearch -exact $currSel $escapedPath] != -1} {
  384.             lappend newSel $files.file$i
  385.         }
  386.  
  387.     incr i
  388.     }
  389.  
  390.     $files format
  391.     $files selectedSet $newSel
  392.  
  393.     set s [expr {$i == 1 ? "" : "s"}]
  394.     $this message "Found $i file$s."
  395.  
  396.     if {$errors != ""} {
  397.     $this error $errors
  398.     }
  399. }
  400.  
  401. method UserEnvView::removeFiles {this objects} {
  402.     set count 0
  403.     set working 0
  404.     foreach obj $objects {
  405.         set fileV [$obj fileV]
  406.         if {[$fileV status] == "working"} {
  407.             incr working
  408.         }
  409.         BasicFS::removeFile [$obj path]
  410.         $obj delete
  411.         incr count
  412.     }
  413.  
  414.     set s [expr {$count == 1 ? "" : "s"}]
  415.     set v [expr {$working == 1 ? "was" : "were"}]
  416.     $this message "Removed $count file$s of which $working $v working."
  417. }
  418.  
  419. method UserEnvView::uploadFiles {this objects} {
  420.     set count 0
  421.     foreach obj $objects {
  422.         set fileV [$obj fileV]
  423.         if {[$fileV status] == "working"} {
  424.         $fileV upLoadWorkingContents
  425.             incr count
  426.         }
  427.     }
  428.  
  429.     set s [expr {$count == 1 ? "" : "s"}]
  430.     $this message "Uploaded $count working file$s."
  431. }
  432.  
  433. method UserEnvView::setFont {this font} {
  434.     [$this files] font $font
  435.  
  436.     $this RepToolView::setFont $font
  437. }
  438.  
  439. method UserEnvView::getFont {this} {
  440.     return [m4_var get M4_font -context repuenv]
  441. }
  442.  
  443. method UserEnvView::fileDelete {this} {
  444.     set objects [[$this files] selectedSet]
  445.     set cnt [llength $objects]
  446.     if {$cnt == 1} {
  447.         set obj [lindex $objects 0]
  448.         set what "the file\n'[$obj path]'"
  449.     } else {
  450.         set what "these $cnt files"
  451.     }
  452.  
  453.     set anyWorking [$this anyWorkingSelected]
  454.  
  455.     set msg ""
  456.     if $anyWorking {
  457.     append msg "This action may cause loss of data if\n"
  458.         append msg "the selected file(s) are not uploaded first!\n\n"
  459.     }
  460.     append msg "Are you sure you want to delete $what?"
  461.  
  462.     set dlg [YesNoWarningDialog new $this.removeuenvdlg \
  463.         -title "Confirm External File Version Delete" \
  464.         -message $msg \
  465.         -yesPressed "$this removeFiles [list $objects]" \
  466.     -helpPressed "$this helpOnName deleteExtFile"]
  467.  
  468.     if $anyWorking {
  469.     PushButton new $dlg.upload \
  470.         -label "Upload" \
  471.         -activated "$this fileUpload { %this sensitive 0 }"
  472.     }
  473.  
  474.     $dlg delCancelButton
  475.     $dlg popUp
  476. }
  477.  
  478. method UserEnvView::fileUpload {this {activated ""}} {
  479.     set objects [[$this files] selectedSet]
  480.     set cnt [llength $objects]
  481.     if {$cnt == 1} {
  482.         set obj [lindex $objects 0]
  483.         set what "the external file version\n'[$obj fileName]'"
  484.     } else {
  485.         set what "these $cnt external file versions"
  486.     }
  487.  
  488.     set script "$this uploadFiles [list $objects]"
  489.     if {$activated != ""} {
  490.         append script "; $activated"
  491.     }
  492.  
  493.     set dlg [YesNoWarningDialog new $this.uploaduenvdlg \
  494.         -title "Confirm External File Version Upload" \
  495.         -message "Are you sure you to upload the working versions of $what?" \
  496.         -yesPressed $script \
  497.     -helpPressed "$this helpOnName uploadExtFile"]
  498.  
  499.     $dlg delCancelButton
  500.     $dlg popUp
  501. }
  502.  
  503. method UserEnvView::fileShow {this} {
  504.     set obj [lindex [[$this files] selectedSet] 0]
  505.     $obj show
  506. }
  507.  
  508. method UserEnvView::editSelectWorking {this} {
  509.     set working {}
  510.     foreach obj [[$this files] objectSet] {
  511.         if {[[$obj fileV] status] == "working"} {
  512.         lappend working $obj
  513.         }
  514.     }
  515.     [$this files] selectedSet $working
  516.     $this selectionChanged
  517. }
  518.  
  519. method UserEnvView::editSelectAll {this} {
  520.     [$this files] selectedSet [[$this files] objectSet]
  521.     $this selectionChanged
  522. }
  523.  
  524. method UserEnvView::editDeselectAll {this} {
  525.     [$this files] selectedSet {}
  526.     $this selectionChanged
  527. }
  528.  
  529. method UserEnvView::editInvertSelection {this} {
  530.     set selected [[$this files] selectedSet]
  531.     set inverse {}
  532.     foreach obj [[$this files] objectSet] {
  533.         if {[lsearch $selected $obj] == -1} {
  534.             lappend inverse $obj
  535.         }
  536.     }
  537.     [$this files] selectedSet $inverse
  538.     $this selectionChanged
  539. }
  540.  
  541. method UserEnvView::helpOnContext {this} {
  542.     set selected [[$this files] selectedSet]
  543.     if ![lempty $selected] {
  544.         $this helpOnName selectedExtFile
  545.     } else {
  546.         $this helpOnName repToolUserEnvView
  547.     }
  548. }
  549.  
  550. # Do not delete this line -- regeneration end marker
  551.  
  552.