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

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