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

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1996
  4. #
  5. #      File:           @(#)clmtool.tcl    /main/titanic/13
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)clmtool.tcl    /main/titanic/13   16 Oct 1997 Copyright 1996 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. require "asciiprint.tcl"
  13. require "classmaker.tcl"
  14. require "m4vardescr.tcl"
  15. require "showversio.tcl"
  16. # End user added include file section
  17.  
  18. require "exetool.tcl"
  19.  
  20. # Definition of the Mtool class.
  21. # The mtool is an output-only exetool. Output from
  22. # host commands is shown in a multi-line text widget.
  23.  
  24. Class ClMtool : {Exetool MainWindow} {
  25.     method destructor
  26.     constructor
  27.     method messageAreaPresent
  28.     method toolBarPresent
  29.     method addToolBar
  30.     method setToolBarPresence
  31.     method saveToolBarPresence
  32.     method addMessageArea
  33.     method setMessageAreaPresence
  34.     method saveMessageAreaPresence
  35.     method cmdStarted
  36.     method cmdFinished
  37.     method updateTitle
  38.     method execute
  39.     method stop
  40.     method handleReusableChanged
  41.     method toolName
  42.     attribute reusable
  43.     attribute m4VarDes
  44.     attribute winFont
  45.     attribute aPrinter
  46.     attribute saveFile
  47.     attribute suspendButton
  48.     attribute reuseButton
  49.     attribute win
  50.     attribute top
  51. }
  52.  
  53. method ClMtool::destructor {this} {
  54.     # Start destructor user section
  55.     $this saveMessageAreaPresence
  56.     $this saveToolBarPresence
  57.     set geom [$this geometry]
  58.     if {$geom != [m4_var get M4_geometry -context mtool]} {
  59.         m4_var set M4_geometry $geom -context mtool
  60.     }
  61.     m4_var save
  62.     # End destructor user section
  63.     $this Exetool::destructor
  64. }
  65.  
  66. constructor ClMtool {class this name dispatcher cmd {dir ""}} {
  67.     set this [MainWindow::constructor $class $this $name]
  68.     set this [Exetool::constructor $class $this $name $dispatcher]
  69.     $this config \
  70.     -closed {%this stop} \
  71.     -title "ObjectTeam Monitoring Window" \
  72.     -icon mtool_64 \
  73.     -iconTitle "ObjectTeam Monitoring Window" \
  74.     -reusable [m4_var get M4_reuse_tool -context mtool] \
  75.     -geometry [m4_var get M4_geometry -context mtool]
  76.  
  77.     # create work-area
  78.     MenuBar new $this.menubar
  79.     $this top [DlgColumn new $this.top]
  80.     $this win [OutTermWindow new [$this top].win \
  81.     -horStretchFactor 10 \
  82.     -verStretchFactor 10 \
  83.     -horShrinkFactor 10 \
  84.     -verShrinkFactor 10 \
  85.     -font "[m4_var get M4_font -context mtool]" \
  86.     -clearScreen [m4_var get M4_clear_screen] \
  87.     -rowCount 24 \
  88.     -columnCount 80 \
  89.     -started {
  90.          .main cmdStarted "Executing '[%this command]' ..."
  91.     } \
  92.     -finished {
  93.         set exitStatusList [.main exitStatusList]
  94.         lappend exitStatusList [%this exitStatus]
  95.         .main exitStatusList $exitStatusList
  96.     } \
  97.     -stopped {
  98.         .main cmdFinished "Executing '[%this command]' failed"
  99.     } \
  100.     -ready {
  101.         .main cmdFinished "Command Ready"
  102.     } \
  103.     -selectionChanged {
  104.         [.main menuBar].edit.menu.copy sensitive \
  105.             [expr {[string length [%this selectedText]] > 0}]
  106.     }]
  107.  
  108.     # create menus
  109.     set fileMenuButton [MenuBarButton new [$this menuBar].file \
  110.     -label File -mnemonic F]
  111.     set fileMenu [Menu new $fileMenuButton.menu \
  112.     -pinnable yes]
  113.     MenuPushButton new $fileMenu.save \
  114.     -label "Save As..." -mnemonic A -accelerator "Ctrl+s" \
  115.     -toolBarPixmap save \
  116.     -activated {[.main saveFile] popUp} \
  117.     -hintText "Saves mtool contents to a file."
  118.     MenuPushButton new $fileMenu.print \
  119.     -label "Print" \
  120.     -mnemonic P \
  121.     -accelerator "Ctrl+p" \
  122.     -toolBarPixmap print_16 \
  123.     -activated {
  124.         set printer [[[.main aPrinter] cmdField] text]
  125.         set printfile [args_file {}]
  126.         set msg "Sending output to $printer ..."
  127.         [.main win] saveOutput $printfile
  128.         wmtkmessage $msg
  129.         if [system "$printer $printfile"] {
  130.         wmtkmessage "Executing '$printer' failed"
  131.         } else {
  132.         wmtkmessage "Done"
  133.         }
  134.         unlink $printfile
  135.     } \
  136.     -hintText "Prints mtool contents."
  137.     MenuSeparator new $fileMenu.sep
  138.     MenuPushButton new $fileMenu.exit \
  139.     -label "Exit" -mnemonic x \
  140.     -activated {.main stop} \
  141.     -toolBarPixmap exit_16 \
  142.     -hintText "Quits the mtool."
  143.  
  144.     # Edit Menu.
  145.     MenuBarButton new [$this menuBar].edit -label Edit -mnemonic E
  146.     Menu new [$this menuBar].edit.menu -pinnable yes
  147.     MenuPushButton new [$this menuBar].edit.menu.copy \
  148.     -label Copy -mnemonic C -accelerator Ctrl+C -toolBarPixmap copy \
  149.     -sensitive 0 -activated {[.main win] setClipboardValue}
  150.     if $win95 {
  151.     set mnemonic A
  152.     set accelerator Ctrl+A
  153.     } else {
  154.     set mnemonic S
  155.     set accelerator Ctrl+/
  156.     }
  157.     MenuPushButton new [$this menuBar].edit.menu.selectall \
  158.     -label "Select All" -mnemonic $mnemonic -accelerator $accelerator \
  159.     -activated {
  160.         [.main win] setSelectedText 0 -1
  161.     }
  162.  
  163.     # View menu.
  164.     set viewMenuButton [MenuBarButton new [$this menuBar].view \
  165.     -label View -mnemonic V]
  166.     set viewMenu [Menu new $viewMenuButton.menu -pinnable yes]
  167.     MenuCheckButton new $viewMenu.toolbar \
  168.     -label "ToolBar" -mnemonic T -state 1 \
  169.     -stateChanged {
  170.         .main toolBarPresent [[.main menuBar].view.menu.toolbar state]
  171.     } \
  172.     -hintText "Shows or hides the toolbar."
  173.     MenuCheckButton new $viewMenu.messagearea \
  174.     -label "Message Area" -mnemonic M -state 1 \
  175.     -stateChanged {
  176.         .main messageAreaPresent [[.main menuBar].view.menu.messagearea state]
  177.     } \
  178.     -hintText "Shows or hides the message area."
  179.     set optionsMenuButton [MenuBarButton new [$this menuBar].options \
  180.     -label Options -mnemonic O]
  181.     set optionsMenu [Menu new $optionsMenuButton.menu \
  182.     -pinnable yes]
  183.     MenuPushButton new $optionsMenu.font \
  184.     -label "Font..." -mnemonic F \
  185.     -activated {
  186.         busy {
  187.         [.main winFont] value "[m4_var get M4_font -context mtool]"
  188.         [.main winFont] popUp
  189.         }
  190.     } \
  191.     -hintText "Changes the mtool font (M4_font__mtool)."
  192.     MenuPushButton new $optionsMenu.printer \
  193.     -label "Printer Setup..." -mnemonic P \
  194.     -activated {
  195.         [.main aPrinter] popUp
  196.     } \
  197.     -hintText "Changes settings for the printer."
  198.     MenuCheckButton new $optionsMenu.clearscreen \
  199.     -label "Clear Screen" \
  200.     -mnemonic C \
  201.     -toolBarPixmap cls_16 \
  202.     -state [m4_var get M4_clear_screen] \
  203.     -stateChanged {
  204.         [.main win] clearScreen [%this state]
  205.         m4_var set M4_clear_screen [%this state]
  206.     }
  207.     $this reuseButton [MenuCheckButton new $optionsMenu.reuse \
  208.     -label "Reuse" \
  209.     -mnemonic R \
  210.     -toolBarPixmap recycl_16 \
  211.     -state [m4_var get M4_reuse_tool -context mtool] \
  212.     -stateChanged {.main handleReusableChanged}]
  213.     $this suspendButton [MenuCheckButton new $optionsMenu.suspendoutput \
  214.     -label "Suspend Output" \
  215.     -mnemonic S \
  216.     -toolBarPixmap stop_16 \
  217.     -stateChanged {[.main win] suspend [%this state]}]
  218.     if {! $win95} {
  219.     set processMenuButton [MenuBarButton new [$this menuBar].process \
  220.         -label Process -mnemonic P]
  221.     set processMenu [Menu new $processMenuButton.menu \
  222.         -pinnable yes]
  223.     MenuPushButton new $processMenu.terminate \
  224.         -label "Terminate" -mnemonic T -sensitive no \
  225.         -activated {[.main win] abort 15} \
  226.         -hintText "Terminates the running process."
  227.     MenuPushButton new $processMenu.abort \
  228.         -label "Abort" -mnemonic A -sensitive no \
  229.         -activated {[.main win] abort 6}
  230.     MenuPushButton new $processMenu.kill \
  231.         -label "Kill" -mnemonic K -sensitive no \
  232.         -activated {[.main win] abort 9}
  233.     }
  234.  
  235.     # Help menu
  236.     [$this menuBar] helpEntry [MenuBarButton new [$this menuBar].help \
  237.     -label Help -mnemonic H]
  238.     interface Menu [$this menuBar].help.menu {
  239.     pinnable 1
  240.     MenuPushButton whatsthis {
  241.         label "What's This?"
  242.         mnemonic W
  243.         activated {showHelp MTO/tl_mto.html}
  244.         hintText "Shows context sensitive help."
  245.     }
  246.     }
  247.     if {!$win95} {
  248.     MenuPushButton new [$this menuBar].help.menu.onhelp \
  249.         -label "On Help" \
  250.         -mnemonic H \
  251.         -activated {showHelp GEN/tl_hlp.html}
  252.     }
  253.     MenuPushButton new [$this menuBar].help.menu.helptopics \
  254.     -label "Help Topics" \
  255.     -mnemonic T \
  256.     -activated {showHelpTopics} \
  257.     -hintText "Shows help topics."
  258.     MenuPushButton new [$this menuBar].help.menu.abouthelptool \
  259.     -label "About Monitoring Window" \
  260.     -mnemonic A \
  261.     -activated {showVersionDialog [%this label]} \
  262.     -hintText "Shows version information."
  263.  
  264.     $this setMessageAreaPresence
  265.     $this setToolBarPresence
  266.  
  267.     # create save-output file-chooser using full pathnames
  268.     set M4_repdir [m4_var get M4_repdir]
  269.     set directory $M4_repdir
  270.     for {set root [path_name directory $directory]} 1 {set directory $root} {
  271.     if {"$root" == "$directory" ||
  272.         "[path_name base $directory]" == "$directory"} break
  273.     }
  274.     case "$root" in {
  275.     "." {
  276.         if {"$directory" == "."} {
  277.         set M4_repdir [string range $M4_repdir 2 end]
  278.         }
  279.         set M4_repdir [path_name concat [pwd] $M4_repdir]
  280.     }
  281.     ".." {
  282.         set M4_repdir [path_name concat [pwd] $M4_repdir]
  283.     }
  284.     }
  285.     if $win95 {
  286.     set filter "Text Files (*.txt)|*.txt|All Files (*.*)|*|"
  287.     set fileNm mtool[pid].txt
  288.     
  289.     } else {
  290.     set filter "*"
  291.     set fileNm mtool_log.[pid]
  292.     }
  293.     $this saveFile [FileChooser new $this.saveOutput \
  294.     -saveDialog 1 \
  295.     -title "Save As" \
  296.     -selectionPolicy BROWSE \
  297.     -filter $filter \
  298.     -directory "$M4_repdir" \
  299.     -selectedSet "[list [path_name concat $M4_repdir $fileNm]]" \
  300.     -helpPressed {showHelp MTO/db_saveoutput.html} \
  301.     -okPressed {
  302.         set logFile [lindex [%this selectedSet] 0]
  303.         set logDir [path_name directory $logFile]
  304.         if {"$logDir" != "[m4_var get M4_repdir]"} {
  305.         catch {m4_var set M4_repdir $logDir}
  306.         }
  307.         if [file exists $logFile] {
  308.         set box .main.saveOutputQuestion
  309.         QuestionDialog new $box \
  310.             -title "Confirm File Save" \
  311.             -message "Overwrite existing file '$logFile'?" \
  312.             -cancelPressed {$box delete} \
  313.             -okPressed {
  314.             if {[[.main win] saveOutput $logFile] == -1} {
  315.                 # show error message
  316.                 open $logFile w
  317.             }
  318.             $box delete
  319.             }
  320.         $box delHelpButton
  321.         $box popUp
  322.         } elseif {[[.main win] saveOutput $logFile] == -1} {
  323.         # show error message
  324.         open $logFile w
  325.         }
  326.     }]
  327.  
  328.     # create font-chooser
  329.     $this winFont [FontChooser new $this.winFont \
  330.     -title "Monitoring Window Font" \
  331.     -okPressed {
  332.         [.main win] font [%this value]
  333.         if {"[m4_var get M4_font -context mtool]" != "[%this value]"} {
  334.         catch {m4_var set M4_font "[%this value]" -context mtool}
  335.         }
  336.     }]
  337.     [$this winFont] delHelpButton
  338.  
  339.     # create ascii-printer entry-dialog
  340.     ClassMaker::extend AsciiPrinterDlg MtoolAsciiPrinterDlg \
  341.     {M4_a_printer M4_a_printer_llen M4_a_printer_plen}
  342.     $this aPrinter [MtoolAsciiPrinterDlg new $this.aPrinter \
  343.     -M4_a_printer [m4_var get M4_a_printer] \
  344.     -M4_a_printer_llen [m4_var get M4_a_printer_llen] \
  345.     -M4_a_printer_plen [m4_var get M4_a_printer_plen] \
  346.     -cancelPressed {
  347.         [%this cmdField] text [%this M4_a_printer]
  348.         [%this llenField] intValue [%this M4_a_printer_llen]
  349.         [%this plenField] intValue [%this M4_a_printer_plen]
  350.     } \
  351.     -okPressed {
  352.         set dim ""
  353.         if {[%this length l] <= 0} {
  354.         set dim l
  355.         } elseif {[%this length p] <= 0} {
  356.         set dim p
  357.         }
  358.         if {"$dim" != ""} {
  359.         set fieldName [%this.top.printer.prView.${dim}lenLabel text]
  360.         wmtkerror "$fieldName must be a positive value"
  361.         return
  362.         }
  363.         set index 0
  364.         foreach triple {
  365.         {M4_a_printer cmdField text}
  366.         {M4_a_printer_llen llenField intValue}
  367.         {M4_a_printer_plen plenField intValue}
  368.         } {
  369.         set m4var [lindex $triple 0]
  370.         set field [%this [lindex $triple 1]]
  371.         set entry [lindex $triple 2]
  372.         if {"[%this $m4var]" != "[$field $entry]"} {
  373.             %this $m4var [$field $entry]
  374.             catch {m4_var set $m4var [%this $m4var]}
  375.         }
  376.         incr index 1
  377.         }
  378.         %this popDown
  379.     }]
  380.  
  381.     $this m4VarDes [M4VarDescription new $this.m4VarDes]
  382.  
  383.     send -async [$this dispatcher] \
  384.     ClDispatcher::mtoolStarted [list [get_comm_name]] $cmd [list $dir]
  385.     return $this
  386. }
  387.  
  388. method ClMtool::messageAreaPresent {this show} {
  389.     if {$show} {
  390.     $this addMessageArea
  391.     } else {
  392.     [$this messageArea] delete
  393.     }
  394. }
  395.  
  396. method ClMtool::toolBarPresent {this show} {
  397.     if {$show} {
  398.     $this addToolBar
  399.     } else {
  400.     [$this toolBar] delete
  401.     }
  402. }
  403.  
  404. method ClMtool::addToolBar {this} {
  405.     ToolBar new .main.bar -entrySet {
  406.     .main.menubar.file.menu.save
  407.     .main.menubar.file.menu.print
  408.     .main.menubar.file.menu.exit
  409.     SEPARATOR
  410.     .main.menubar.edit.menu.copy
  411.     SEPARATOR
  412.     .main.menubar.options.menu.clearscreen
  413.     .main.menubar.options.menu.reuse
  414.     .main.menubar.options.menu.suspendoutput
  415.     }
  416. }
  417.  
  418. method ClMtool::setToolBarPresence {this} {
  419.     if [m4_var get M4_toolbar -context mtool] {
  420.     $this addToolBar
  421.     } else {
  422.     [$this menuBar].view.menu.toolbar state 0
  423.     }
  424. }
  425.  
  426. method ClMtool::saveToolBarPresence {this} {
  427.     set toolBarPresent [expr {[$this toolBar] != ""}]
  428.     if {$toolBarPresent != [m4_var get M4_toolbar -context mtool]} {
  429.     m4_var set M4_toolbar $toolBarPresent -context mtool
  430.     }
  431. }
  432.  
  433. method ClMtool::addMessageArea {this} {
  434.     MessageArea new $this.msg
  435. }
  436.  
  437. method ClMtool::setMessageAreaPresence {this} {
  438.     if [m4_var get M4_messagearea -context mtool] {
  439.     $this addMessageArea
  440.     } else {
  441.     [$this menuBar].view.menu.messagearea state 0
  442.     }
  443. }
  444.  
  445. method ClMtool::saveMessageAreaPresence {this} {
  446.     set areaPresent [expr {[$this messageArea] != ""}]
  447.     if {$areaPresent != [m4_var get M4_messagearea -context mtool]} {
  448.     m4_var set M4_messagearea $areaPresent -context mtool
  449.     }
  450. }
  451.  
  452.  
  453. # Callback for when a command is started.
  454. #
  455. method ClMtool::cmdStarted {this msg} {
  456.     [$this menuBar].file.menu.exit sensitive no
  457.     if {! $win95} {
  458.     [$this menuBar].process.menu.terminate sensitive yes
  459.     [$this menuBar].process.menu.abort sensitive yes
  460.     [$this menuBar].process.menu.kill sensitive yes
  461.     }
  462.     wmtkmessage $msg
  463. }
  464.  
  465.  
  466. # Callback for when a command is finished.
  467. #
  468. method ClMtool::cmdFinished {this msg} {
  469.     wmtkmessage $msg
  470.     if {"[$this clientId]" == ""} {
  471.     return
  472.     }
  473.     [$this menuBar].file.menu.exit sensitive yes
  474.     if {! $win95} {
  475.     [$this menuBar].process.menu.terminate sensitive no
  476.     [$this menuBar].process.menu.abort sensitive no
  477.     [$this menuBar].process.menu.kill sensitive no
  478.     }
  479.     $this notifyFinished
  480. }
  481.  
  482.  
  483. # Update the title of the OutTermWindow.
  484. #
  485. method ClMtool::updateTitle {this} {
  486.     $this Exetool::updateTitle
  487.     $this popUp
  488. }
  489.  
  490.  
  491. # Start the execution of command(s) and show the output
  492. # in the OutTermWindow.
  493. #
  494. method ClMtool::execute {this} {
  495.     [$this suspendButton] state no
  496.     [$this win] suspend no
  497.     [$this win] commandLine [$this cmdLine]
  498.     [$this win] execute
  499. }
  500.  
  501.  
  502. # Stop the Mtool if it is not busy.
  503. #
  504. method ClMtool::stop {this} {
  505.     if {![[$this win] busy]} {
  506.     $this busy TRUE
  507.     wmtkmessage "Exiting..."
  508.     $this Exetool::stop
  509.     }
  510. }
  511.  
  512. method ClMtool::handleReusableChanged {this} {
  513.     $this reusable [[$this reuseButton] state]
  514.     m4_var set M4_reuse_tool [$this reusable] -context mtool
  515.     if {![[$this win] busy]} {
  516.     $this Exetool::handleReusableChanged
  517.     }
  518. }
  519.  
  520. method ClMtool::toolName {this} {
  521.     return mtool
  522. }
  523.  
  524. # Do not delete this line -- regeneration end marker
  525.  
  526.