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

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1996
  4. #
  5. #      File:           @(#)exetool.tcl    /main/hindenburg/3
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)exetool.tcl    /main/hindenburg/3   2 Sep 1996 Copyright 1996 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. # End user added include file section
  13.  
  14. require "communicat.tcl"
  15.  
  16. # Definition of class Exetool which is a base class
  17. # for the Mtool and Xtool. It contains functions to
  18. # copy the environment and to set/get the command-line.
  19.  
  20. Class Exetool : {Communicator} {
  21.     method destructor
  22.     constructor
  23.     method notifyStarted
  24.     method notifyFinished
  25.     method handleReusableChanged
  26.     method start
  27.     method stop
  28.     method updateTitle
  29.  
  30.     # Registration string of the calling tool.
  31.     #
  32.     attribute caller
  33.     attribute dispatcher
  34.     attribute cmdLine
  35.     attribute clientId
  36.     attribute exitStatusList
  37. }
  38.  
  39. global Exetool::exetool
  40. set Exetool::exetool ""
  41.  
  42.  
  43. method Exetool::destructor {this} {
  44.     # Start destructor user section
  45.     # End destructor user section
  46.     $this Communicator::destructor
  47. }
  48.  
  49. constructor Exetool {class this name dispatcher} {
  50.     set this [Communicator::constructor $class $this $name]
  51.  
  52.     $this dispatcher $dispatcher
  53.  
  54.     global Exetool::exetool
  55.     set Exetool::exetool $this
  56.  
  57.     return $this
  58. }
  59.  
  60. proc Exetool::startCommand {script dir env m4env caller clientId} {
  61.     set this ${Exetool::exetool}
  62.     $this config -cmdLine $script -caller $caller -clientId $clientId
  63.     cd $dir
  64.     Communicator::setEnv $env
  65.     Communicator::setM4Env $m4env
  66.     $this start
  67. }
  68.  
  69.  
  70. # Get the first command of a command-line.
  71. # replace backslashes by an unlikely string at start
  72. # put them back on return
  73.  
  74. proc Exetool::firstCmd {cmdLine} {
  75.     set unlikely _@_UnLiKeLy_@_
  76.     regsub -all {\\} $cmdLine $unlikely cmd
  77.     regsub -all (\ +)([SystemUtilities::cmdSeparator]\ *) \
  78.     "$cmd" "[SystemUtilities::cmdSeparator]" cmd
  79.     set cmd [string trimleft "$cmd" [SystemUtilities::cmdSeparator]]
  80.     set separator [string first "[SystemUtilities::cmdSeparator]" "$cmd"]
  81.     if {$separator > 0} {
  82.     set cmd [string range "$cmd" 0 [incr separator -1]]
  83.     set postfix " ..."
  84.     } else {
  85.     set postfix ""
  86.     }
  87.     set cmd "[path_name file [lindex $cmd 0]]$postfix"
  88.     regsub -all $unlikely $cmd {\\} cmd
  89.     return "$cmd"
  90. }
  91.  
  92.  
  93. # Notify caller that start is called.
  94. #
  95. method Exetool::notifyStarted {this} {
  96.     if [isRunning [$this caller]] {
  97.     send -async [$this caller] WmtTool::exetoolStarted [$this clientId]
  98.     }
  99. }
  100.  
  101.  
  102. # Notify caller that command(s) are ready.
  103. #
  104. method Exetool::notifyFinished {this} {
  105.     if {"[$this clientId]" == ""} {
  106.     return
  107.     }
  108.     if [isRunning [$this caller]] {
  109.     send -async [$this caller] WmtTool::exetoolFinished \
  110.         [$this clientId] [list [$this exitStatusList]]
  111.     }
  112.     $this clientId ""
  113.     if {[$this reusable] && [isRunning [$this dispatcher]]} {
  114.     send -async [$this dispatcher] \
  115.         ClDispatcher::[$this toolName]Available [list [get_comm_name]]
  116.     }
  117. }
  118.  
  119. method Exetool::handleReusableChanged {this} {
  120.     if {! [isRunning [$this dispatcher]]} {
  121.     return
  122.     }
  123.     if {[$this reusable]} {
  124.     send -async [$this dispatcher] \
  125.         ClDispatcher::[$this toolName]Available [list [get_comm_name]]
  126.     } else {
  127.     send -async [$this dispatcher] \
  128.         ClDispatcher::[$this toolName]Unavailable [list [get_comm_name]]
  129.     }
  130. }
  131.  
  132.  
  133. # Base function for exetools to start executing host command(s).
  134. #
  135. method Exetool::start {this} {
  136.     $this updateTitle
  137.     $this notifyStarted
  138.     $this exitStatusList ""
  139.     $this execute
  140. }
  141.  
  142.  
  143. # Base function for exetools to exit the tool.
  144. #
  145. method Exetool::stop {this} {
  146.     catch {
  147.     send [$this dispatcher] \
  148.         ClDispatcher::[$this toolName]Died [list [get_comm_name]]
  149.     }
  150.     $this Communicator::stop
  151. }
  152.  
  153. method Exetool::updateTitle {this} {
  154.     set title [$this title]
  155.     set hyphen [string first "-" $title]
  156.     if {$hyphen < 0} {
  157.     append title " -"
  158.     } else {
  159.     set title [string range $title 0 $hyphen]
  160.     }
  161.     set iconTitle [Exetool::firstCmd [$this cmdLine]]
  162.     append title " $iconTitle"
  163.     $this config \
  164.     -title $title \
  165.     -iconTitle $iconTitle
  166. }
  167.  
  168. # Do not delete this line -- regeneration end marker
  169.  
  170.