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

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Westmount Technology    1994
  4. #
  5. #      File:           @(#)commandpag.tcl    /main/hindenburg/6
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)commandpag.tcl    /main/hindenburg/6   22 Nov 1996 Copyright 1994 Westmount Technology
  10.  
  11. # Start user added include file section
  12. # End user added include file section
  13.  
  14. Class CommandPage : {NoteBkPage} {
  15.     constructor
  16.     method destructor
  17.     method createInterface
  18.     method clearInterface
  19.     method fromInterface
  20.     method toInterface
  21.     method setMethods
  22.     method setProcs
  23.     method preDefinedChanged
  24.     method commandTypeChanged
  25.     attribute cPage
  26.     attribute isMethod
  27.     attribute preDefinedProcs
  28. }
  29.  
  30. constructor CommandPage {class this name} {
  31.     set this [NoteBkPage::constructor $class $this $name]
  32.     # Start constructor user section
  33.  
  34.     # read type preDefinedProcs file
  35.     if {[[.main editorArea] toolType] == "browser"} {
  36.         set procfile browserprocs
  37.     } else {
  38.         set procfile editorprocs
  39.     }
  40.     if [file exists [m4_path_name etc $procfile]] {
  41.         set fid [open [m4_path_name etc $procfile] r]
  42.         $this preDefinedProcs [read -nonewline $fid]
  43.         close $fid
  44.     } else {
  45.         $this preDefinedProcs {}
  46.     }
  47.  
  48.     $this createInterface
  49.     $this label Command
  50.     $this isMethod 0
  51.  
  52.  
  53.     # End constructor user section
  54.     return $this
  55. }
  56.  
  57. method CommandPage::destructor {this} {
  58.     # Start destructor user section
  59.     # End destructor user section
  60. }
  61.  
  62. proc CommandPage::checkBraces {cmd} {
  63.  
  64.     set checkCmd $cmd
  65.     set openBraces 0
  66.  
  67.     for {set brace [string last "\{" $checkCmd]} \
  68.         {$brace >= 0} \
  69.         {set brace [string last "\{" $checkCmd]} {
  70.         incr openBraces
  71.         set checkCmd [string range $checkCmd 0 [expr $brace - 1]]
  72.     }
  73.  
  74.     set checkCmd $cmd
  75.     set closeBraces 0
  76.  
  77.     for {set brace [string last "\}" $checkCmd]} \
  78.         {$brace >= 0} \
  79.         {set brace [string last "\}" $checkCmd]} {
  80.         incr closeBraces
  81.         set checkCmd [string range $checkCmd 0 [expr $brace - 1]]
  82.     }
  83.  
  84.     if {$closeBraces != $openBraces} {
  85.         return 0
  86.     }
  87.  
  88.     return 1
  89. }
  90.  
  91. method CommandPage::createInterface {this} {
  92.  
  93.     interface DlgRow $this.NG {
  94.         DlgColumn DC {
  95.             NamedGroup NG {
  96.                 label Command
  97.                 DlgColumn DC {
  98.                     DlgRow DRpredefs {
  99.                         verStretchFactor 0
  100.                         DlgColumn DC {
  101.                             Label L { 
  102.                                 text "Predefined Procedure"
  103.                             }
  104.                             DropDwnList preDefinedProcDLL {
  105.                                 rowCount 5
  106.                             }
  107.                         }
  108.                     }
  109.                     Label L { 
  110.                         text "Command"
  111.                     }
  112.                     MultiLineText commandMLT {
  113.                         columnCount 50
  114.                         rowCount 3
  115.                     }
  116.                     DlgRow DR {
  117.                         DlgColumn DC {
  118.                             Label L {text "Command kind"}
  119.                             VerRadioGroup externCmdVRG {
  120.                                 entrySet {Internal 
  121.                           "External Output Only"
  122.                           "External Input/Output"
  123.                           "External Own Interface"}
  124.                             }
  125.                         }
  126.                         DlgColumn DC {
  127.                             CheckButton askForOptionsCB {
  128.                                 label "Ask for options"
  129.                             }
  130.                         }
  131.                     }
  132.                 }
  133.             }
  134.             NamedGroup NG {
  135.                 verStretchFactor 0
  136.                 label Interface
  137.                 DlgColumn DC {
  138.                     CheckButton writeMessageCB {
  139.                         label "Write message to message area"
  140.                     }
  141.                     Label L { 
  142.                         text Message
  143.                     }
  144.                     SingleLineText messageSLT {
  145.                     }
  146.                     CheckButton busyCursorCB {
  147.                         label "Busy cursor while executing"
  148.                     }
  149.                     CheckButton updateViewCB {
  150.                         label "Update view after execution"
  151.                     }
  152.                     CheckButton updateWmtAreaCB {
  153.                         label "Update context area after execution"
  154.                     }
  155.                 }
  156.             }
  157.         }
  158.     }
  159.     $this cPage $this.NG.DC.NG.DC
  160.  
  161.     if {[[.main editorArea] toolType] != "browser"} {
  162.         $this.NG.DC.NG.DC.updateViewCB delete
  163.         $this.NG.DC.NG.DC.updateWmtAreaCB delete
  164.         [$this cPage].commandMLT textModified \
  165.             "[$this cPage].DRpredefs.DC.preDefinedProcDLL selected {} "
  166.     } else {
  167.          interface DlgColumn $this.NG.DC.NG.DC.DRpredefs.objectOpsDC {
  168.             Label L { 
  169.                 text "Object Operation"
  170.             }
  171.             DropDwnList objectOpsDDL {
  172.                 rowCount 5
  173.             }
  174.         }
  175.         [$this cPage].DRpredefs.objectOpsDC.objectOpsDDL selectionChanged \
  176.             "$this preDefinedChanged methods"
  177.         [$this cPage].commandMLT textModified \
  178.             "[$this cPage].DRpredefs.objectOpsDC.objectOpsDDL selected {} 
  179.             [$this cPage].DRpredefs.DC.preDefinedProcDLL selected {} "
  180.     }
  181.  
  182.     set names {}
  183.     foreach i [$this preDefinedProcs] {
  184.         lappend names [lvarpop i]
  185.     }
  186.     [$this cPage].DRpredefs.DC.preDefinedProcDLL entrySet $names
  187.     [$this cPage].DRpredefs.DC.preDefinedProcDLL selectionChanged \
  188.                 "$this preDefinedChanged procs"
  189.  
  190.     [$this cPage].DR.DC.externCmdVRG selectionChanged \
  191.                 "$this commandTypeChanged"
  192.  
  193. }
  194.  
  195. method CommandPage::clearInterface {this} {
  196.  
  197.     # clean page
  198.     [$this cPage].DRpredefs.DC.preDefinedProcDLL selected {}
  199.     [$this cPage].commandMLT text ""
  200.     [$this cPage].DR.DC.externCmdVRG selected "Internal"
  201.     $this commandTypeChanged
  202.     [$this cPage].writeMessageCB state 0
  203.     [$this cPage].messageSLT text ""
  204.     [$this cPage].busyCursorCB state 0
  205.  
  206.     if {[[.main editorArea] toolType] == "browser"} {
  207.         [$this cPage].updateViewCB state 0
  208.         [$this cPage].updateWmtAreaCB state 0
  209.         [$this cPage].DRpredefs.objectOpsDC.objectOpsDDL selected {}
  210.     }
  211. }
  212.  
  213. method CommandPage::fromInterface {this} {
  214.  
  215.     # save page "Command"
  216.  
  217.     set script [[$this cPage].commandMLT text]
  218.     if ![CommandPage::checkBraces $script] {
  219.         wmtkerror "Brace mismatch in command."
  220.         return ""
  221.     }
  222.  
  223.     set kind [[$this cPage].DR.DC.externCmdVRG selected]
  224.     if {$kind == "Internal" } {
  225.         set cmdSpec ""
  226.         set message ""
  227.         set busyCursor 0
  228.         if [[$this cPage].writeMessageCB state] {
  229.             set message [[$this cPage].messageSLT text]
  230.             set cmdSpec "$cmdSpec {#CTGENMessage\n}"
  231.             set msgCmd wmtkmessage
  232.             set msgCmd [concat $msgCmd \{$message\}]
  233.             set cmdSpec "$cmdSpec \{$msgCmd\}"
  234.         } 
  235.         if [[$this cPage].busyCursorCB state] {
  236.             set busyCursor 1
  237.             set cmdSpec "$cmdSpec {#CTGENBusyCursorOn\n}"
  238.             set cmdSpec "$cmdSpec {.main busy TRUE}"
  239.         }
  240.         set cmdSpec "$cmdSpec {#CTGENCommandScript\n}"
  241.         regsub -all "\n" $script "\n\t" script
  242.         set cmdSpec "$cmdSpec \{$script \}"
  243.         set cmdSpec "$cmdSpec {#CTGENEndCommandScript} {}"
  244.         if { $message != ""} {
  245.             set cmdSpec "$cmdSpec {#CTGENRemoveMessage\n}"
  246.             set msgCmd wmtkmessage
  247.             set msgCmd [concat $msgCmd \"\"]
  248.             set cmdSpec "$cmdSpec \{$msgCmd\}"
  249.         }
  250.         if $busyCursor {
  251.             set cmdSpec "$cmdSpec {#CTGENBusyCursorOff\n}"
  252.             set cmdSpec "$cmdSpec {.main busy FALSE}"
  253.         }
  254.         if {[[.main editorArea] toolType] == "browser"} {
  255.             if [[$this cPage].updateViewCB state] {
  256.                 set cmdSpec "$cmdSpec {#CTGENUpdateView\n}"
  257.                 set cmdSpec "$cmdSpec {.main updateView}"
  258.             }
  259.             if [[$this cPage].updateWmtAreaCB state] {
  260.                 set cmdSpec "$cmdSpec {#CTGENUpdateWmtArea\n}"
  261.                 set cmdSpec "$cmdSpec {.main updateWmtArea}"
  262.             }
  263.         }
  264.         set cmdSpec [CustEdArea::indentList $cmdSpec 0 0]
  265.         regsub -all "\n" $cmdSpec "\n\t\t" cmdSpec
  266.  
  267.         return $cmdSpec
  268.     } else {
  269.         if {[[$this cPage].DR.DC.askForOptionsCB state] == 1} {
  270.             set cmdSpec {.main startCommandWithOptions}
  271.         } else {
  272.             set cmdSpec {.main startCommand}
  273.         }
  274.         if {$kind == "External Input/Output" } {
  275.             set cmdSpec [concat $cmdSpec xtool]
  276.         } elseif {$kind == "External Output Only"} {
  277.             set cmdSpec [concat $cmdSpec mtool]
  278.         } else {
  279.             set cmdSpec [concat $cmdSpec extern]
  280.         }
  281.         set script [[$this cPage].commandMLT text]
  282.         set cmdSpec [concat $cmdSpec \{$script\} \"\"]
  283.         if [[$this cPage].writeMessageCB state] {
  284.             set message [[$this cPage].messageSLT text]
  285.             set cmdSpec [concat $cmdSpec \"$message\"]
  286.         } else {
  287.             set cmdSpec [concat $cmdSpec \"\"]
  288.         } 
  289.         if {[[.main editorArea] toolType] == "browser"} {
  290.             set upd [[$this cPage].updateViewCB state]
  291.             set upd [concat $upd \
  292.                 [[$this cPage].updateWmtAreaCB state]]
  293.             set cmdSpec [concat $cmdSpec \{$upd\}]
  294.         } else {
  295.             # for editor commands update{view wmtarea} always 0
  296.             set cmdSpec [concat $cmdSpec \{0 0\}]
  297.         }
  298.         set cmdSpec [concat $cmdSpec \
  299.             [[$this cPage].busyCursorCB state]]
  300.  
  301.         set cmdSpec "#CTGENCommandExtern \"\" \{$cmdSpec\}"
  302.         set cmdSpec [CustEdArea::indentList $cmdSpec 2 0]
  303.         return $cmdSpec
  304.     }
  305. }
  306.  
  307. method CommandPage::toInterface {this value} {
  308.  
  309.     # first protect the command
  310.     regsub "#CTGENCommandScript" $value "#CTGENCommandScript \{" value
  311.     regsub "#CTGENEndCommandScript" $value "\} #CTGENEndCommandScript" value
  312.  
  313.     #strip the extra tabs
  314.     regsub -all "\n\t\t\t" $value "\n" value
  315.     set value [string trim $value]
  316.  
  317.     # to be sure that a self made commands are not lost
  318.     if {[lsearch $value "#CTGENCommandScript"] == -1 &&
  319.         [lsearch $value "#CTGENCommandExtern"] == -1} {
  320.         [$this cPage].commandMLT text $value
  321.         return
  322.     }
  323.     
  324.     while {![lempty $value]} {
  325.  
  326.         set check [lvarpop value]
  327.         if {$check == "#CTGENMessage"} {
  328.             lvarpop value
  329.             [$this cPage].messageSLT text [lvarpop value]
  330.             [$this cPage].writeMessageCB state 1
  331.         } elseif {$check == "#CTGENBusyCursorOn"} {
  332.             [$this cPage].busyCursorCB state 1
  333.         } elseif {$check == "#CTGENUpdateWmtArea"} {
  334.             [$this cPage].updateWmtAreaCB state 1
  335.         } elseif {$check == "#CTGENUpdateView"} {
  336.             [$this cPage].updateViewCB state 1
  337.         } elseif {$check == "#CTGENCommandScript"} {
  338.             set command [lvarpop value]    
  339.             lvarpop value
  340.             #strip the extra tabs
  341.             regsub -all "\n\t\t\t" $command "\n" command
  342.             set command [string trim $command]
  343.             [$this cPage].commandMLT text $command
  344.             [$this cPage].DR.DC.externCmdVRG selected "Internal"
  345.         } elseif {$check == "#CTGENCommandExtern"} {
  346.             #.main
  347.             lvarpop value 
  348.             #startCommand
  349.             set cmd [lvarpop value]
  350.             if {$cmd == "startCommand"} {
  351.                 [$this cPage].DR.DC.askForOptionsCB state 0
  352.             } else {
  353.                 [$this cPage].DR.DC.askForOptionsCB state 1
  354.             }
  355.             set exeType [lvarpop value] 
  356.             if {$exeType == "mtool"} {
  357.                 [$this cPage].DR.DC.externCmdVRG selected \
  358.                         "External Output Only"
  359.             } elseif {$exeType == "xtool"} {
  360.                 [$this cPage].DR.DC.externCmdVRG selected  \
  361.                         "External Input/Output"
  362.             } else {
  363.                 [$this cPage].DR.DC.externCmdVRG selected  \
  364.                         "External Own Interface"
  365.             }
  366.             set command [lvarpop value]
  367.             [$this cPage].commandMLT text $command
  368.  
  369.             # skip the finish script
  370.             lvarpop value
  371.  
  372.             set message [lvarpop value]
  373.             [$this cPage].messageSLT text $message
  374.             if { $message != ""} {
  375.                 [$this cPage].writeMessageCB state 1
  376.             }
  377.             set updateState  [lvarpop value]
  378.             if [lindex $updateState 0] {
  379.                 [$this cPage].updateViewCB state 1
  380.             }
  381.             if [lindex $updateState 1] {
  382.                 [$this cPage].updateWmtAreaCB state 1
  383.             }
  384.             set busy [lvarpop value]
  385.             if $busy {
  386.                 [$this cPage].busyCursorCB state 1
  387.             }
  388.         }
  389.     }
  390.     $this commandTypeChanged
  391. }
  392.  
  393. method CommandPage::setMethods {this classList} {
  394.  
  395.     if [lempty $classList] {
  396.         [$this cPage].DRpredefs.objectOpsDC.objectOpsDDL entrySet ""
  397.         return
  398.     }
  399.  
  400.     # fill the list with the first entry of classList
  401.     # transfrom from 'uiNames' to real classes
  402.     set className [.main getBrowsObj [lindex $classList 0]]
  403.     if {$className == ""} {
  404.         return
  405.     }
  406.     set methodList [$className info methods]
  407.  
  408.     foreach className $classList {
  409.         set className [.main getBrowsObj $className]
  410.         if {$className == ""} {
  411.             continue
  412.         }
  413.         set classMethods [$className info methods]
  414.         foreach i $methodList {
  415.             set idx [lsearch $classMethods $i]
  416.             # if this method is not in the current class, skip it
  417.             if {$idx == -1} {
  418.                 set methodList [lreplace $methodList $idx $idx]
  419.             }
  420.         }
  421.     }
  422.  
  423.     [$this cPage].DRpredefs.objectOpsDC.objectOpsDDL entrySet $methodList
  424. }
  425.  
  426. method CommandPage::setProcs {this} {
  427.     # !! Implement this function !!
  428. }
  429.  
  430. method CommandPage::preDefinedChanged {this type} {
  431.  
  432.     if {$type == "procs"} {
  433.         # find the corresponding command
  434.         set sel [[$this cPage].DRpredefs.DC.preDefinedProcDLL selected]
  435.         if {$sel == ""} {
  436.             # bug in combo (callback activated when set in code)
  437.             return
  438.         }
  439.         set cmd ""
  440.         foreach i [$this preDefinedProcs] {
  441.             if {[lindex $i 0]  == $sel} {
  442.                 set cmd [lindex $i 1]
  443.             }
  444.         }
  445.         [$this cPage].DRpredefs.DC.preDefinedProcDLL selected ""
  446.     } else {
  447.         set sel [[$this cPage].DRpredefs.objectOpsDC.objectOpsDDL selected]
  448.         if {$sel == ""} {
  449.             # bug in combo (callback activated when set in code)
  450.             return
  451.         }
  452.         if [$this isMethod] {
  453.             set cmd {[%this browsUiObj]}
  454.             lappend cmd $sel
  455.         } else {
  456.             set cmd { foreach i [.main selectedSet] }
  457.             set cmd "$cmd \{\n\t \[\$i browsUiObj\] $sel \n\}"
  458.         }
  459.         [$this cPage].DRpredefs.objectOpsDC.objectOpsDDL selected ""
  460.     }
  461.  
  462.     [$this cPage].commandMLT text $cmd
  463.     [$this cPage].DR.DC.externCmdVRG selected "Internal"
  464.     $this commandTypeChanged
  465. }
  466.  
  467. method CommandPage::commandTypeChanged {this} {
  468.     
  469.     if {[[$this cPage].DR.DC.externCmdVRG selected] == "Internal" } { 
  470.             [$this cPage].DR.DC.askForOptionsCB state 0 
  471.             [$this cPage].DR.DC.askForOptionsCB sensitive 0 
  472.     } else { 
  473.         [$this cPage].DR.DC.askForOptionsCB sensitive 1 
  474.     }
  475. }
  476.  
  477. # Do not delete this line -- regeneration end marker
  478.  
  479.