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

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1996
  4. #
  5. #      File:           @(#)userenvvie.tcl    /main/hindenburg/16
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)userenvvie.tcl    /main/hindenburg/16   11 Nov 1996 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 [m4_var get M4_font -context repuenv]
  134.         [$this files] selectionChanged "$this selectionChanged"
  135.         [$this files] setHeaderLabels [UEnvBrObject::headerLabels]
  136.         [$this files] format
  137.  
  138.     return $this
  139. }
  140.  
  141. proc UserEnvView::repToolClass {} {
  142.     return "UserEnvView"
  143. }
  144.  
  145. method UserEnvView::initialize {this} {
  146.     busy {
  147.         set selected "<none>"
  148.  
  149.         # No level path should be set at this point.
  150.         #
  151.     catch {set cc [ClientContext::global]}
  152.     catch {set cc [ClientContext::global]}
  153.  
  154.     if {[$this levelPathIds] != ""} {
  155.         if [catch {$cc setLevelIds [$this levelPathIds]} error] {
  156.                 $this error $error
  157.                 $this message ""
  158.             }
  159.     } elseif {[$this levelPath] != ""} {
  160.         if [catch {$cc setLevelPath [$this levelPath]} error] {
  161.                 $this error $error
  162.                 $this message ""
  163.             }
  164.     }
  165.  
  166.     set corp [$cc currentCorporate]
  167.     if ![$corp isNil] {
  168.         [$this repositories] selected [$corp name]
  169.         $this selectionChanged
  170.         $this repositoryChanged
  171.     }
  172.     }
  173. }
  174.  
  175. method UserEnvView::selectedObjSet {this} {
  176.     return [[$this files] selectedSet]
  177. }
  178.  
  179. method UserEnvView::repositoryChanged {this} {
  180.     # Clear file list.
  181.     #
  182.     [$this files] removeAllObjects
  183.  
  184.     # Clear Project option menu.
  185.     #
  186.     [$this projects] entrySet <any>
  187.     [$this projects] selected <any>
  188.     $this project [ORB::nil]
  189.  
  190.     # Clear Config option menu.
  191.     #
  192.     [$this configurations] entrySet <any>
  193.     [$this configurations] selected <any>
  194.     $this configV [ORB::nil]
  195.  
  196.     set name [[$this repositories] selected]
  197.     if {$name == "<none>"} {
  198.     [$this rep] setCurrent ""
  199.         return
  200.     }
  201.  
  202.     if [catch {[$this rep] setCurrent $name} error] {
  203.     $this message "Cannot access repository '$name'."
  204.     $this contextError $error
  205.     } else {
  206.     $this message "Selected repository '$name'."
  207.     $this contextError ""
  208.     }
  209.     [$this menuHandler] levelChanged
  210.     if {$error != 0} {
  211.     $this error $error
  212.     return
  213.     }
  214.  
  215.     set names {}
  216.     set corp [[$this rep] currentCorporate]
  217.     if ![$corp isNil] {
  218.     foreach project [$corp projects] {
  219.         lappend names "[$project name]"
  220.     }
  221.     }
  222.     if {[llength $names] == 1} {
  223.     [$this projects] entrySet $names
  224.     [$this projects] selected $names
  225.     } else {
  226.     [$this projects] entrySet [concat <any> $names]
  227.     [$this projects] selected <any>
  228.     }
  229.  
  230.     $this changed 1
  231.     $this updateMessage
  232. }
  233.  
  234. method UserEnvView::projectChanged {this} {
  235.     # Clear file list.
  236.     #
  237.     [$this files] removeAllObjects
  238.  
  239.     # Clear Config option menu.
  240.     #
  241.     [$this configurations] entrySet <any>
  242.     [$this configurations] selected <any>
  243.     $this configV [ORB::nil]
  244.  
  245.     set sel [[$this projects] selected]
  246.     if {$sel == "<any>"} {
  247.         $this project [ORB::nil]
  248.         return
  249.     }
  250.  
  251.     set names {}
  252.     set corp [[$this rep] currentCorporate]
  253.     if ![$corp isNil] {
  254.     $this project [$corp findProject $sel]
  255.         if [[$this project] isNil] {
  256.             $this error "Project '$sel' not found in corporate '[$corp name]'"
  257.         } else {
  258.         foreach configV [[$this project] configVersions] {
  259.         lappend names [[$configV config] name]:[$configV versionNumber]
  260.         }
  261.         $this updateMessage
  262.         }
  263.     }
  264.     if {[llength $names] == 1} {
  265.     [$this configurations] entrySet $names
  266.     [$this configurations] selected $names
  267.     } else {
  268.     [$this configurations] entrySet [concat <any> $names]
  269.     [$this configurations] selected <any>
  270.     }
  271. }
  272.  
  273. method UserEnvView::configChanged {this} {
  274.     # Clear file list.
  275.     #
  276.     [$this files] removeAllObjects
  277.  
  278.     set sel [[$this configurations] selected]
  279.     if {$sel == "<any>"} {
  280.         $this configV [ORB::nil]
  281.         return
  282.     }
  283.  
  284.     set proj [$this project]
  285.     set nv [split $sel :]
  286.     $this configV [$proj findConfigVersion [lindex $nv 0] [lindex $nv 1]]
  287.     if [[$this configV] isNil] {
  288.         $this error "Configuration '$sel' not found in project '[$proj name]'"
  289.     } else {
  290.     $this updateMessage
  291.     }
  292. }
  293.  
  294. method UserEnvView::selectionChanged {this} {
  295.     $this RepToolView::selectionChanged
  296. }
  297.  
  298. method UserEnvView::update {this} {
  299.     busy { $this reload }
  300. }
  301.  
  302. method UserEnvView::updateMessage {this} {
  303.     $this message "Use 'View > Refresh' to retrieve existing external files."
  304. }
  305.  
  306. method UserEnvView::onlyWorkingSelected {this} {
  307.     set objects [[$this files] selectedSet]
  308.     foreach obj $objects {
  309.         if {[[$obj fileV] status] != "working"} {
  310.             return 0
  311.         }
  312.     }
  313.     return 1
  314. }
  315.  
  316. method UserEnvView::anyWorkingSelected {this} {
  317.     set objects [[$this files] selectedSet]
  318.     foreach obj $objects {
  319.         if {[[$obj fileV] status] == "working"} {
  320.             return 1
  321.         }
  322.     }
  323.     return 0
  324. }
  325.  
  326. method UserEnvView::reload {this} {
  327.     set files [$this files]
  328.     $files removeAllObjects
  329.  
  330.     set sel [[$this repositories] selected]
  331.     if {$sel == "<none>"} {
  332.         $this message "No repository selected."
  333.         $files format
  334.         return
  335.     } elseif [[[$this rep] currentCorporate] isNil] {
  336.         $this message "Cannot access repository '$sel'."
  337.         $files format
  338.         return
  339.     }
  340.  
  341.     $this message "This action may take a while, please wait..."
  342.  
  343.     set proj [$this project]
  344.     set conf [$this configV]
  345.  
  346.     [$this rep] getExternalFileVersions -clear
  347.     set exts [[$this rep] getExternalFileVersions -proj $proj -conf $conf]
  348.  
  349.     set errors {}
  350.     set i 0
  351.     foreach ext $exts {
  352.         set fileV [lindex $ext 0]
  353.         set configV [lindex $ext 1]
  354.  
  355.         if [catch {set path [$fileV path $configV]} error] {
  356.             set file [$fileV file]
  357.             set name "[$file name].[$file type] ([$fileV versionName])"
  358.             append errors "Error while determining path of $name:\n$error\n\n"
  359.             continue
  360.         }
  361.  
  362.         if ![file exists $path] {
  363.             continue
  364.         }
  365.  
  366.     UEnvBrObject new $files.file$i $fileV $configV $path
  367.     incr i
  368.     }
  369.  
  370.     set s [expr {$i == 1 ? "" : "s"}]
  371.     $this message "Found $i file$s."
  372.     $files format
  373.  
  374.     if {$errors != ""} {
  375.     $this error $errors
  376.     }
  377. }
  378.  
  379. method UserEnvView::removeFiles {this objects} {
  380.     foreach obj $objects {
  381.         BasicFS::removeFile [$obj path]
  382.         $obj delete
  383.     }
  384. }
  385.  
  386. method UserEnvView::uploadFiles {this objects} {
  387.     foreach obj $objects {
  388.         set fileV [$obj fileV]
  389.         if {[$fileV status] == "working"} {
  390.         $fileV upLoadWorkingContents
  391.         }
  392.     }
  393. }
  394.  
  395. method UserEnvView::setFont {this font} {
  396.     [$this files] font $font
  397.  
  398.     $this RepToolView::setFont $font
  399. }
  400.  
  401. method UserEnvView::getFont {this} {
  402.     return [[$this files] font]
  403. }
  404.  
  405. method UserEnvView::fileDelete {this} {
  406.     set objects [[$this files] selectedSet]
  407.     set cnt [llength $objects]
  408.     if {$cnt == 1} {
  409.         set obj [lindex $objects 0]
  410.         set what "the file\n'[$obj path]'"
  411.     } else {
  412.         set what "these $cnt files"
  413.     }
  414.  
  415.     set anyWorking [$this anyWorkingSelected]
  416.  
  417.     set msg ""
  418.     if $anyWorking {
  419.     append msg "This action may cause loss of data if\n"
  420.         append msg "the selected file(s) are not uploaded first!\n\n"
  421.     }
  422.     append msg "Do you really want to remove $what?"
  423.  
  424.     set dlg [YesNoWarningDialog new $this.removeuenvdlg \
  425.         -title "Remove External Files" \
  426.         -message $msg \
  427.         -yesPressed "$this removeFiles [list $objects]" \
  428.     -helpPressed "$this helpOnName deleteExtFile"]
  429.  
  430.     if $anyWorking {
  431.     PushButton new $dlg.upload \
  432.         -label "Upload" \
  433.         -activated "$this fileUpload { %this sensitive 0 }"
  434.     }
  435.  
  436.     $dlg delCancelButton
  437.     $dlg popUp
  438. }
  439.  
  440. method UserEnvView::fileUpload {this {activated ""}} {
  441.     set objects [[$this files] selectedSet]
  442.     set cnt [llength $objects]
  443.     if {$cnt == 1} {
  444.         set obj [lindex $objects 0]
  445.         set what "the external file version\n'[$obj fileName]'"
  446.     } else {
  447.         set what "these $cnt external file versions"
  448.     }
  449.  
  450.     set script "$this uploadFiles [list $objects]"
  451.     if {$activated != ""} {
  452.         append script "; $activated"
  453.     }
  454.  
  455.     set dlg [WarningDialog new $this.uploaduenvdlg \
  456.         -title "Upload External File Versions" \
  457.         -message "Do you really want to upload the working versions of $what?" \
  458.         -okPressed $script \
  459.     -helpPressed "$this helpOnName uploadExtFile"]
  460.     $dlg popUp
  461. }
  462.  
  463. method UserEnvView::fileShow {this} {
  464.     set obj [lindex [[$this files] selectedSet] 0]
  465.     $obj show
  466. }
  467.  
  468. method UserEnvView::editSelectWorking {this} {
  469.     set working {}
  470.     foreach obj [[$this files] objectSet] {
  471.         if {[[$obj fileV] status] == "working"} {
  472.         lappend working $obj
  473.         }
  474.     }
  475.     [$this files] selectedSet $working
  476.     $this selectionChanged
  477. }
  478.  
  479. method UserEnvView::editSelectAll {this} {
  480.     [$this files] selectedSet [[$this files] objectSet]
  481.     $this selectionChanged
  482. }
  483.  
  484. method UserEnvView::editDeselectAll {this} {
  485.     [$this files] selectedSet {}
  486.     $this selectionChanged
  487. }
  488.  
  489. method UserEnvView::editInvertSelection {this} {
  490.     set selected [[$this files] selectedSet]
  491.     set inverse {}
  492.     foreach obj [[$this files] objectSet] {
  493.         if {[lsearch $selected $obj] == -1} {
  494.             lappend inverse $obj
  495.         }
  496.     }
  497.     [$this files] selectedSet $inverse
  498.     $this selectionChanged
  499. }
  500.  
  501. method UserEnvView::helpOnContext {this} {
  502.     set selected [[$this files] selectedSet]
  503.     if ![lempty $selected] {
  504.         $this helpOnName selectedExtFile
  505.     } else {
  506.         $this helpOnName repToolUserEnvView
  507.     }
  508. }
  509.  
  510. # Do not delete this line -- regeneration end marker
  511.  
  512.