home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / nics / root.2 / usr / sbin / ncfgprompter / ncfgprompter~
Text File  |  1998-08-19  |  26KB  |  1,121 lines

  1. #!/bin/osavtcl
  2. #ident "@(#)ncfgprompter    28.4"
  3. #ident "$Header: $"
  4. #
  5. #  Based on OpenServer ncfgUI version 13.1
  6. #
  7. #    Copyright (C) 1993-1996 The Santa Cruz Operation, Inc.  
  8. #        All Rights Reserved.
  9. #
  10. #       The information in this file is provided for the exclusive use of
  11. #       the licensees of The Santa Cruz Operation, Inc.  Such users have the
  12. #       right to use, modify, and incorporate this code into other products
  13. #       for purposes authorized by the license agreement provided they include
  14. #       this notice and the associated copyright notice with any such product.
  15. #       The information in this file is provided "AS IS" without warranty.
  16. #
  17.  
  18. set NCFG_DIR /usr/lib/netcfg
  19.  
  20. #cmdtrace on [ open $NCFG_DIR/tmp/ncfgprompter.log a+ ]
  21.  
  22. #source $NCFG_DIR/lib/libSCO.tcl
  23.  
  24. # Load the SCOAdmin library to get IntlLocalizeMsg
  25. loadlibindex /usr/lib/sysadm.tlib
  26. source $NCFG_DIR/bin/ncfgprompter.msg.tcl
  27.  
  28.  
  29.  
  30. #--------------------------------------------------------------------------
  31. #    @(#) ipwidget.tcl 1.2 96/05/22 
  32. #
  33. #    Copyright (C) The Santa Cruz Operation, 1996.
  34. #    This Module contains Proprietary Information of
  35. #    The Santa Cruz Operation, and should be treated as Confidential.
  36. #--------------------------------------------------------------------------
  37.  
  38. proc updateIPwidgetValue {widget} {
  39.     
  40.     set val       [VxGetVar $widget val]
  41.     set a_addr [VxGetVar $widget a_addr]
  42.     set b_addr [VxGetVar $widget b_addr]
  43.     set c_addr [VxGetVar $widget c_addr]
  44.     set d_addr [VxGetVar $widget d_addr]
  45.     
  46.     set value "[VtGetValues $a_addr -value]"
  47.     append value "."
  48.     append value "[VtGetValues $b_addr -value]"
  49.     append value "."
  50.     append value "[VtGetValues $c_addr -value]"
  51.     append value "."
  52.     append value "[VtGetValues $d_addr -value]"
  53.     
  54.     VtSetValues $val -value value
  55. }
  56.  
  57.  
  58. proc checkIPwidgetCB {form cbs} {
  59.     set value  [keylget cbs value]
  60.     set widget [keylget cbs widget]
  61.     
  62.     set a_addr [VxGetVar $form a_addr]
  63.     set b_addr [VxGetVar $form b_addr]
  64.     set c_addr [VxGetVar $form c_addr]
  65.     set d_addr [VxGetVar $form d_addr]
  66.  
  67.     set a_addr_flag [VxGetVar $form a_addr_flag]
  68.     set b_addr_flag [VxGetVar $form b_addr_flag]
  69.     set c_addr_flag [VxGetVar $form c_addr_flag]
  70.     set d_addr_flag [VxGetVar $form d_addr_flag]
  71.     
  72.     set skip 0
  73.     set length [string length $value]
  74.     if {$length == 0} {
  75.         return
  76.     }
  77.     
  78.     if {$length == 3} {
  79.         set skip 1
  80.     }
  81.     if {[string range $value [expr $length - 1] end] == "."} {
  82.         set skip 1
  83.         set value [string range $value 0 [expr $length - 2]]
  84.         VtSetValues $widget -value $value
  85.     }
  86.     if {![ctype digit $value]} then {
  87.         VtBeep
  88.         VtSetValues $widget -value ""
  89.         return
  90.     }
  91.     
  92.     if {$value < 0 || $value > 255} then {
  93.         VtBeep
  94.         VtSetValues $widget -value ""
  95.         return
  96.     }
  97.     
  98.     set type [VxGetVar $form type]
  99.     set attr [VxGetVar $form attr]
  100.  
  101.     if {$skip } then {
  102.         if {$widget == $a_addr} {
  103.             if { $a_addr_flag } {VtSetFocus $b_addr}
  104.             VxSetVar $form a_addr_flag 1
  105.         }
  106.         if {$widget == $b_addr} {
  107.             if { $b_addr_flag } {VtSetFocus $c_addr}
  108.             VxSetVar $form b_addr_flag 1
  109.         }
  110.         if {$widget == $c_addr} {
  111.             if { $c_addr_flag } {VtSetFocus $d_addr}
  112.             VxSetVar $form c_addr_flag 1
  113.         }
  114.     }
  115.  
  116. }
  117.  
  118. proc getIPwidgetValue {widget} {
  119.     
  120.     set a_addr [VxGetVar $widget a_addr]
  121.     set b_addr [VxGetVar $widget b_addr]
  122.     set c_addr [VxGetVar $widget c_addr]
  123.     set d_addr [VxGetVar $widget d_addr]
  124.     
  125.     set value "[VtGetValues $a_addr -value]"
  126.     append value "."
  127.     append value "[VtGetValues $b_addr -value]"
  128.     append value "."
  129.     append value "[VtGetValues $c_addr -value]"
  130.     append value "."
  131.     append value "[VtGetValues $d_addr -value]"
  132.     
  133.     return $value
  134. }
  135.  
  136. proc AttrSetIPwidgetCB {form cbs} {
  137.  
  138.     global ATTR_WIDGETS
  139.  
  140. #    puts stderr "IPBOX cbs: $cbs"
  141.  
  142.     set a_addr [VxGetVar $form a_addr]
  143.     set b_addr [VxGetVar $form b_addr]
  144.     set c_addr [VxGetVar $form c_addr]
  145.     set d_addr [VxGetVar $form d_addr]
  146.  
  147.     set currentFocus [ string trim [ VtInfo -whatFocus ]]
  148.  
  149.     if { [ cequal $currentFocus $a_addr ] } {
  150.         return
  151.     }
  152.     if { [ cequal $currentFocus $b_addr ] } {
  153.         return
  154.     }
  155.     if { [ cequal $currentFocus $c_addr ] } {
  156.         return
  157.     }
  158.     if { [ cequal $currentFocus $d_addr ] } {
  159.         return
  160.     }
  161.  
  162.     set value  [keylget cbs value]
  163.     set wroot [keylget cbs dialog]
  164.     set widget [keylget cbs widget]
  165.     
  166.     set length [string length $value]
  167. #    if {$length == 0} {
  168. #        set value "0"
  169. #        VtSetValues $widget -value $value
  170. #    }
  171.  
  172.     set type [VxGetVar $form type]
  173.     set attr [VxGetVar $form attr]
  174.  
  175.     set o_value [ keylget ATTR_WIDGETS $attr.VAL ]
  176.     set value [getIPwidgetValue $form ]
  177.  
  178.     if { [ keylget cbs mode ] == "changed" && $o_value == $value } {
  179.         # Short-circuit the callback here.
  180.         return
  181.     } 
  182.  
  183. #    puts stderr "Calling SetAttr $wroot $type $attr $value "
  184.  
  185.     SetAttr $wroot $type $attr $value
  186.  
  187. }
  188.  
  189.  
  190.  
  191.  
  192. proc setIPwidgetValue {widget value} {
  193.     
  194.     set a_addr [VxGetVar $widget a_addr]
  195.     set b_addr [VxGetVar $widget b_addr]
  196.     set c_addr [VxGetVar $widget c_addr]
  197.     set d_addr [VxGetVar $widget d_addr]
  198.     
  199.     VxSetVar $widget a_addr_flag 0
  200.     VxSetVar $widget b_addr_flag 0
  201.     VxSetVar $widget c_addr_flag 0
  202.     VxSetVar $widget d_addr_flag 0
  203.  
  204.     set values [split $value "."]
  205.     VtSetValues $a_addr -value [lindex $values 0]
  206.     VtSetValues $b_addr -value [lindex $values 1]
  207.     VtSetValues $c_addr -value [lindex $values 2]
  208.     VtSetValues $d_addr -value [lindex $values 3]
  209.  
  210. }
  211.  
  212.  
  213. proc createIPwidget {form type attr} {
  214.     
  215.     set a_addr [VtText $form.a -columns 3 -CHARM_columns 4 \
  216.             -leftSide FORM \
  217.             -leftOffset 0 \
  218.             -callback "SaSetFocus next" \
  219.             -losingFocusCallback "AttrSetIPwidgetCB $form" \
  220.             -valueChangedCallback "checkIPwidgetCB $form" ]
  221.     
  222.     set a_label [VtLabel $form.al -label "." \
  223.             -leftOffset 0 \
  224.             -leftSide $a_addr -alignTop $a_addr]
  225.     
  226.     set b_addr [VtText $form.b -columns 3 -CHARM_columns 4 \
  227.             -callback "SaSetFocus next" \
  228.             -losingFocusCallback "AttrSetIPwidgetCB $form" \
  229.             -valueChangedCallback "checkIPwidgetCB $form" \
  230.             -leftOffset 0 \
  231.             -leftSide $a_label -alignTop $a_label ]
  232.     
  233.     set b_label [VtLabel $form.bl -label "." \
  234.             -leftOffset 0 \
  235.             -leftSide $b_addr -alignTop $b_addr]
  236.     
  237.     set c_addr [VtText $form.c -columns 3 -CHARM_columns 4 \
  238.             -callback "SaSetFocus next" \
  239.             -losingFocusCallback "AttrSetIPwidgetCB $form" \
  240.             -valueChangedCallback "checkIPwidgetCB $form" \
  241.             -leftOffset 0 \
  242.             -leftSide $b_label -alignTop $b_label ]
  243.     
  244.     set c_label [VtLabel $form.cl -label "." \
  245.             -leftOffset 0 \
  246.             -leftSide $c_addr -alignTop $c_addr]
  247.     
  248.     set d_addr [VtText $form.d -columns 3 -CHARM_columns 4 \
  249.             -callback "SaSetFocus next" \
  250.             -losingFocusCallback "AttrSetIPwidgetCB $form" \
  251.             -valueChangedCallback "checkIPwidgetCB $form" \
  252.             -leftSide $c_label -alignTop $c_label \
  253.             -leftOffset 0 ]
  254.     
  255.     VxSetVar $form type $type
  256.     VxSetVar $form attr $attr
  257.  
  258.     VxSetVar $form a_addr_flag 0
  259.     VxSetVar $form b_addr_flag 0
  260.     VxSetVar $form c_addr_flag 0
  261.     VxSetVar $form d_addr_flag 0
  262.  
  263.     VxSetVar $form a_addr $a_addr
  264.     VxSetVar $form b_addr $b_addr
  265.     VxSetVar $form c_addr $c_addr
  266.     VxSetVar $form d_addr $d_addr
  267.     
  268. }
  269.  
  270. ###########################################################
  271.  
  272.  
  273. proc InitializeGlobals {} \
  274.         {
  275.     global SCREENARRAY SCREENSTACK
  276.     
  277.     set SCREENARRAY(BASIC) ""
  278. }
  279.  
  280. #-----------------------------------------------------------------------------
  281. # The Widget server interface:
  282. #-----------------------------------------------------------------------------
  283.  
  284. proc PresentString {s {len 75} {repstr \n}} \
  285.         {
  286.     set desc ""
  287.     while { [ clength $s ] > $len && [string match "* *" [ crange $s 0 $len ]] } {
  288.         set i [ string last " " [ crange $s 0 $len ] ]
  289.         set desc "$desc[ crange $s 0 $i ]$repstr"
  290.         set s "[ crange $s [ incr i ] end ]"
  291.     }
  292.     if { ! [ string compare $desc "" ] } {
  293.         return $s
  294.     } else {
  295.         return "$desc$s"
  296.     }
  297. }
  298.  
  299. proc InfoExit {cbs} \
  300.         {
  301.     VtClose
  302.     exit 0
  303. }
  304.  
  305. proc PrompterHelp {cbs} \
  306.         {
  307.     global PAGEINIT
  308.     set BOOK  [ keylget PAGEINIT HELPB ]
  309.     set TOPIC [ keylget PAGEINIT HELPT ]
  310.  
  311.     if { [ string compare $BOOK "" ] && [ string compare $TOPIC "" ] }     {
  312.         VtDisplayHelp [ keylget cbs widget ] -book $BOOK -topic $TOPIC
  313.     }
  314. }
  315.  
  316. proc PrompterOK {cbs} \
  317.         {
  318.     global childPid OLDstdout NO_OUTPUT wroot READONLY
  319.     global SCREENLIST
  320.     
  321.     VtLock
  322.     set ndtype [ SendRequest "USER_DONE" ]
  323.     if { ! $NO_OUTPUT } {
  324.         #        puts stderr [ array names SCREENARRAY ]
  325.         set SCREENLIST [ lrmdups $SCREENLIST ]
  326.         foreach i $SCREENLIST {
  327.             foreach j [ SendRequest "CURRENT $i" ] {
  328.                 for {set s $j} {[regsub \"\"(.*)\"\" $s \"\\1\" sub]} {set s $sub} {}
  329.                 set j $s
  330.                 set attr [ lindex $j 0 ]
  331.                 set value [ lindex $j 2 ]
  332.                 if { [ string first " " $value ] != -1 } {
  333.                     set value "\"$value\""
  334.                 }
  335.                 puts $OLDstdout "$attr=$value"
  336.             }
  337.         }
  338.     }
  339.     VtUnLock
  340.     if { [ info exists childPid ] } {
  341.         kill $childPid
  342.     }
  343.     if { ! [ string compare [ lindex $ndtype 1 ] NDTYPE_READ_ONLY ] && ! $READONLY } {
  344.         set info [ VtInformationDialog $wroot.info \
  345.                 -wmDecoration { TITLE RESIZE BORDER } \
  346.                 -message [ IntlLocalizeMsg SCO_NCFGPROMPTER_MSG_NDTYPE_READ_ONLY ] \
  347.                 -okCallback InfoExit \
  348.                 -ok \
  349.                 ]
  350.         VtShow $info
  351.     } else {
  352.         VtClose
  353.         exit 0
  354.     }
  355. }
  356.  
  357. proc InitFocus {type list wroot} \
  358.         {
  359.     global ATTR_WIDGETS
  360.     
  361.     set focus_list ""
  362.     foreach l $list {
  363.         set attr [ lindex $l 0 ]
  364.         
  365.         case [ lindex $l 2 ] {
  366.             {IPBOX} {
  367.                 set val [ keylget ATTR_WIDGETS $attr.VALUE ]
  368.                 lappend focus_list $val.a
  369.                 lappend focus_list $val.b
  370.                 lappend focus_list $val.c
  371.                 lappend focus_list $val.d
  372.             }
  373.             {RADIO TOGGLE} {
  374.                 foreach i [ keylget ATTR_WIDGETS $attr.VALUE ] {
  375.                     set val [ lindex $i 1 ]
  376.                     if { [ string compare $val "" ] } {
  377.                         lappend focus_list $val
  378.                     }
  379.                 }
  380.             }
  381.             default {
  382.                 set val [ keylget ATTR_WIDGETS $attr.VALUE ]
  383.                 if { [ string compare $val "" ] } {
  384.                     lappend focus_list [ keylget ATTR_WIDGETS $attr.VALUE ]
  385.                 }
  386.         }   }
  387.     }
  388.     #    set FOCUS($type) $focus_list
  389.     lappend $focus_list [ VtGetValues $wroot -ok ]
  390.     
  391.     #     puts stderr $wroot
  392.     #     puts stderr $focus_list
  393.     #     puts stderr [ lindex $focus_list 0 ]
  394.     
  395.     SaSetTabGroups $wroot $focus_list
  396.     #     SaSetFocusList $wroot $focus_list
  397.     SaSetFocus [ lindex $focus_list 0 ] ""
  398. }
  399.  
  400.  
  401. proc SetAttrCONT {type {cbs ""}} \
  402.         {
  403.     DisplayCurrentValues    
  404. }
  405.  
  406. proc SetAttr {parent type attr value} \
  407.         {
  408.     #puts stderr "SetAttr: $type $attr $value"
  409.     if { [ string first " " $value ] != -1 || ! [ string compare $value "" ] } {
  410.         set value "\"$value\""
  411.     }
  412.     set result [ SendRequest "SET $attr $value" ]
  413.     set message [ translit "\"" "" [ lrange $result 1 end ] ]
  414.     case [ lindex $result 0 ] {
  415.         ERROR {
  416.             set eb [ VtErrorDialog $parent.error \
  417.                     -ok \
  418.                     -okLabel [ IntlLocalizeMsg SCO_NCFGPROMPTER_MSG_DISMISS ] \
  419.                     -okCallback "SetAttrCONT $type" \
  420.                     -help \
  421.                     -message "$message" \
  422.                     ]
  423.             VtShowDialog $eb
  424.         }
  425.         WARNING {
  426.             set eb [ VtWarningDialog $parent.warning \
  427.                     -ok \
  428.                     -okLabel [ IntlLocalizeMsg SCO_NCFGPROMPTER_MSG_DISMISS ] \
  429.                     -okCallback "SetAttrCONT $type" \
  430.                     -help \
  431.                     -message "$message" \
  432.                     ]
  433.             VtShowDialog $eb
  434.         }
  435.         INFO {
  436.             set eb [ VtMessageDialog $parent.info \
  437.                     -ok \
  438.                     -okLabel [ IntlLocalizeMsg SCO_NCFGPROMPTER_MSG_DISMISS ] \
  439.                     -okCallback "SetAttrCONT $type" \
  440.                     -help \
  441.                     -message "$message" \
  442.                     ]
  443.             VtShowDialog $eb
  444.         }
  445.         OK {
  446.             SetAttrCONT $type
  447.         }
  448.         default {
  449.             puts stderr "ncfgprompter(SetAttr): Illegal response from BE script:\n\t$result"
  450.             exit 1
  451.         }
  452.     }
  453. }
  454.  
  455. proc AttrSet {type attr cbs} \
  456.         {
  457.     global ATTR_WIDGETS
  458.     
  459.     #puts stderr "AttrSet: $cbs"
  460.     set w_type [ keylget ATTR_WIDGETS $attr.TYPE ]
  461.     case $w_type {
  462.         {TOGGLE RADIO} {
  463.             set value ""
  464.             foreach i [ keylget ATTR_WIDGETS $attr.VALUE ] {
  465.                 set i_name [ lindex $i 0 ]
  466.                 set i_widget [ lindex $i 1 ]
  467.                 
  468.                 set x [ VtGetValues $i_widget -value ]
  469.                 #echo "$attr/$i_name: $x"
  470.                 if { [ VtGetValues $i_widget -value ] } {
  471.                     if { $w_type == "TOGGLE" } {
  472.                         lappend value $i_name
  473.                     } else {
  474.                         set value $i_name
  475.                         break
  476.                     }
  477.                 }
  478.             }
  479.         }
  480.         IPBOX {
  481.             # Should never get here
  482.             return
  483.         }
  484.         default {
  485.             set value [ keylget cbs value ]
  486.             set mode [ keylget cbs mode ]
  487.             set o_value [ keylget ATTR_WIDGETS $attr.VAL ]
  488.             #puts stderr "SET($attr,$o_value,$value)\n$cbs"
  489.             if { [ keylget cbs mode ] == "changed" && [ cequal $o_value $value ] } {
  490.                 # This only occurs when you have a LABEL field, and
  491.                 # you type into it and hit ENTER *AND* the BE script
  492.                 # process this entry (for example upper cases it)
  493.                 # and passes back something different to ncfgprompter
  494.                 # in CURRENT BASIC than was previously sent to it
  495.                 # with SET attr value.    If this happens then the BE
  496.                 # will receive a new SET attr... from here because
  497.                 # the Text widget generates a value changed cb as
  498.                 # a result of the VtSetValues of the new (processed)
  499.                 # value.  So... short-circuit the callback here.
  500.                 return
  501.             }
  502.         }
  503.     }
  504.     set active [ keylget ATTR_WIDGETS $attr.ACTIVE ]
  505.     # JAW redundant 
  506.     keylset ATTR_WIDGETS $attr.ACTIVE $active
  507.     keylset ATTR_WIDGETS $attr.VAL $value 
  508.     SetAttr [ keylget cbs dialog ] $type $attr $value
  509.     if { "[ keylget cbs mode ]" == "done" } {
  510.         SaSetFocus next ""
  511.     }
  512. }
  513.  
  514. proc DisplayCurrentValues {} \
  515.         {
  516.  
  517.     global CURRENTNAME
  518.     global ATTR_WIDGETS READONLY
  519.     
  520.     set list [ SendRequest "CURRENT $CURRENTNAME" ]
  521.  
  522.     # puts stderr "DisplayCurrentValues: $list"
  523.     foreach i $list {
  524.         for {set s $i} {[regsub \"\"(.*)\"\" $s \"\\1\" sub]} {set s $sub} {}
  525.         set i $s
  526.         set attr [ lindex $i 0 ]
  527.         set active [ expr { ([ lindex $i 1 ] == 1)? "1" : "0" } ]
  528.         set value [ lindex $i 2 ]
  529.         
  530.         set fs_changed 1
  531.         set fv_changed 1
  532.         
  533.         if [ keylget ATTR_WIDGETS $attr.ACTIVE ret ] {
  534.             set o_active [ expr { ( $ret == 1)? "1" : "0" } ]
  535.             if { $active == $o_active } {
  536.                 set fs_changed 0
  537.             }
  538.         }
  539.         if [ keylget ATTR_WIDGETS $attr.VAL ret ] {
  540.             set o_value $ret
  541.             if { ! [ string compare $value $o_value ] } {
  542.                 set fv_changed 0
  543.             }
  544.         }
  545.         #puts stderr "CHANGEVAL($attr,$value)"
  546.         keylset ATTR_WIDGETS $attr.ACTIVE $active
  547.         keylset ATTR_WIDGETS $attr.VAL      $value
  548.         
  549.         set w_type [ keylget ATTR_WIDGETS $attr.TYPE ]
  550.         # jaw fix ipbox
  551.         if { $READONLY && $w_type != "TOGGLE" && $w_type != "IPBOX" } {
  552.             VtSet [ keylget ATTR_WIDGETS $attr.VALUE ] -label $value
  553.             if { $fs_changed } {
  554.                 #                VtSetSensitive [ keylget ATTR_WIDGETS $attr.PROMPT ] $active
  555.                 VtSetSensitive [ keylget ATTR_WIDGETS $attr.VALUE ]     $active
  556.             }
  557.             
  558.         } else {
  559.             case $w_type {
  560.                 {RADIO TOGGLE} {
  561.                     if { $w_type == "RADIO" } {
  562.                         set value [ list $value ]
  563.                     }
  564.                     foreach i [ keylget ATTR_WIDGETS $attr.VALUE ] {
  565.                         set i_name [ lindex $i 0 ]
  566.                         set i_widget [ lindex $i 1 ]
  567.                         
  568.                         set found 0
  569.                         foreach v $value {
  570.                             if { $v == $i_name } {
  571.                                 set found 1
  572.                                 break
  573.                             }
  574.                         }
  575.                         if { $found } {
  576.                             VtSetValues $i_widget -value 1
  577.                         } else {
  578.                             VtSetValues $i_widget -value 0
  579.                         }
  580.                         if { $READONLY } {
  581.                             VtSetSensitive $i_widget 0
  582.                         } elseif { $fs_changed } {
  583.                             VtSetSensitive $i_widget $active
  584.                         }
  585.                     }
  586.                     if { $fs_changed } {
  587.                         #                    VtSetSensitive [ keylget ATTR_WIDGETS $attr.PROMPT ] $active
  588.                     }
  589.                 }
  590.                 IPBOX {
  591.                     if { $fv_changed } {
  592.                         setIPwidgetValue [ keylget ATTR_WIDGETS $attr.VALUE ]  $value
  593.                     }
  594.                 }
  595.                 NEWSCREEN {
  596.                     VtSetValues [ keylget ATTR_WIDGETS $attr.VALUE ] -label $value
  597.                 }
  598.                 default {
  599.                     if { $fv_changed } {
  600.                         # jaw fix
  601.                         #                puts stderr "Setting $attr to $value"
  602.                         VtSetValues [ keylget ATTR_WIDGETS $attr.VALUE ] -value $value
  603.                     }
  604.                     if { $fs_changed } {
  605.                         #                    VtSetSensitive [ keylget ATTR_WIDGETS $attr.PROMPT ] $active
  606.                         VtSetSensitive [ keylget ATTR_WIDGETS $attr.VALUE ]     $active
  607.                     }
  608.                 }
  609.             }
  610.         }
  611.     }
  612. }
  613.  
  614. proc DrawScreen {wroot}         {
  615.     global READONLY ATTR_WIDGETS PAGEINIT
  616.     global CURRENTNAME
  617.  
  618.     set sname $CURRENTNAME
  619.     
  620.     set ATTR_WIDGETS ""
  621.     #AlgnFormList
  622.     #FormItem
  623.     
  624.     set a_list [ SendRequest "LIST $CURRENTNAME" ]
  625.  
  626.     set wlab [ VtLabel $wroot.label \
  627.             -label [ PresentString [ keylget PAGEINIT INFO ] ]\
  628.             -labelLeft \
  629.             -CHARM_topOffset 1 \
  630.             ]
  631.     
  632.     set AlgnForm ""
  633.     
  634.     #  Create the VxAlignedForm
  635.     
  636.     loop i 0 [ llength $a_list ] 1 {
  637.         set item   [ lindex $a_list $i ]
  638.         set attr   [ lindex $item 0 ]
  639.         set prompt [ lindex $item 1 ]
  640.         set widget [ lindex $item 2 ]
  641.         set shelp  [ lindex $item 3 ]
  642.         
  643.         set FormItem [ list $prompt ]
  644.         
  645.         keylset ATTR_WIDGETS $attr.TYPE $widget
  646.         keylset ATTR_WIDGETS $attr.NUM    [expr { $i + 1 } ]
  647.         
  648.         #        puts stderr [ list $attr $prompt $widget $shelp ]
  649.         #        flush stderr
  650.         
  651.         case $widget {
  652.             LABEL {
  653.                 
  654.                 if {$READONLY} {
  655.                     lappend FormItem " VtLabel "
  656.                 } else {
  657.                     lappend FormItem " VtText \
  658.                             -callback \"AttrSet $sname $attr\" \
  659.                             -shortHelpCallback SaShortHelpCB \
  660.                             -shortHelpString \"$shelp\" \
  661.                             
  662.                     "
  663.                 }
  664.             }
  665.             
  666.             NEWSCREEN {
  667.                 lappend FormItem " VtPushButton \
  668.                         -callback \"DrawNewScreenCB $attr\" \
  669.                         -label \"$prompt\" \
  670.                         -shortHelpCallback SaShortHelpCB \
  671.                         -shortHelpString \"$shelp\" \
  672.                         "
  673.             }
  674.             
  675.             IPBOX {
  676.                 lappend FormItem " VtForm \
  677.                         -shortHelpCallback SaShortHelpCB \
  678.                         -shortHelpString \"$shelp\" \
  679.                         "
  680.             }
  681.             
  682.             NOECHOLABEL {
  683.                 if {$READONLY} {
  684.                     lappend FormItem " VtLabel "
  685.                 } else {
  686.                     lappend FormItem "    VtText \
  687.                             -noEcho \
  688.                             -callback \"AttrSet $sname $attr\" \
  689.                             -shortHelpCallback SaShortHelpCB \
  690.                             -shortHelpString \"$shelp\" \
  691.                             "
  692.                 }
  693.             }
  694.             LIST {
  695.                 set values [ SendRequest "VALUES $attr" ]
  696.                 if {$READONLY} {
  697.                     lappend FormItem " VtLabel "
  698.                 } else {
  699.                     lappend FormItem " VtComboBox \
  700.                             -CHARM_borderWidth 0 \
  701.                             -CHARM_width 25 \
  702.                             -itemList \"$values\" \
  703.                             -callback \"AttrSet $sname $attr\" \
  704.                             -xmArgs {ignoreCase FALSE} \
  705.                             -shortHelpCallback SaShortHelpCB \
  706.                             -shortHelpString \"$shelp\" \
  707.                             
  708.                     "
  709.                 }
  710.             }
  711.             ROLIST {
  712.                 set values [ SendRequest "VALUES $attr" ]
  713.                 if {$READONLY} {
  714.                     lappend FormItem " VtLabel "
  715.                 } else {
  716.                     lappend FormItem " VtComboBox \
  717.                             -CHARM_borderWidth 0 \
  718.                             -CHARM_width 25 \
  719.                             -readOnly \
  720.                             -itemList \"$values\" \
  721.                             -callback \"AttrSet $sname $attr\" \
  722.                             -xmArgs {ignoreCase FALSE} \
  723.                             -shortHelpCallback SaShortHelpCB \
  724.                             -shortHelpString \"$shelp\" \
  725.                             
  726.                     "
  727.                 }
  728.             }
  729.             RADIO {
  730.                 if {$READONLY} {
  731.                     lappend FormItem " VtLabel "
  732. #                    keylset ATTR_WIDGETS $attr.VALUE $w
  733.                 } else {
  734.                     lappend FormItem " VtRadioBox \
  735.                             -horizontal \
  736.                             -callback \"AttrSet $sname $attr\" \
  737.                             -shortHelpCallback SaShortHelpCB \
  738.                             -shortHelpString \"$shelp\" \
  739.                             
  740.                     "
  741.                 }
  742.             }
  743.             TOGGLE {
  744.                 lappend FormItem "    VtCheckBox \
  745.                         -horizontal \
  746.                         -callback \"AttrSet $sname $attr\" \
  747.                         -shortHelpCallback SaShortHelpCB \
  748.                         -shortHelpString \"$shelp\" \
  749.                         
  750.                 "
  751.                 
  752.             }
  753.         }
  754.         
  755.         #        puts stderr "$FormItem"
  756.         
  757.         lappend AlgnForm $FormItem
  758.         set FormItem ""
  759.     }
  760.     
  761.     #    puts stderr "$AlgnForm"
  762.     set form [ VxAlignedForm $wroot.aform "$AlgnForm" ]
  763.     
  764.     # do the radio box and checkboxes
  765.     foreach i  [ keylkeys ATTR_WIDGETS ] {
  766.         
  767.         set num     [ keylget ATTR_WIDGETS $i.NUM ]
  768.         set type [ keylget ATTR_WIDGETS $i.TYPE ]
  769.         
  770.         #    puts stderr [ list $sname $i $num $type ]
  771.         flush stderr
  772.         
  773.         case $type {
  774.             IPBOX {
  775.                 createIPwidget [ VxGetVar $form "widget$num" ] $sname $i 
  776.                 keylset ATTR_WIDGETS $i.VALUE [     VxGetVar $form widget$num ]
  777.             }
  778.             RADIO {
  779.  
  780.  
  781.                 if {$READONLY} {
  782.                     lappend FormItem " VtLabel "
  783.  
  784.                     set values [ SendRequest "VALUES $i" ]
  785.                     set v [ lindex $values 0 ]
  786.                     set wid  [     VxGetVar $form widget$num ]
  787.                     VtSet $wid -label $v
  788.                     keylset ATTR_WIDGETS $i.VALUE [     VxGetVar $form widget$num ]
  789.  
  790.                 } else {
  791.  
  792.                     set values [ SendRequest "VALUES $i" ]
  793.                     
  794.                     set w [ VxGetVar $form "widget$num" ]
  795.                     
  796.                     foreach v $values {
  797.                         set x [ VtToggleButton $w.$v \
  798.                                 -value $v \
  799.                                 ]
  800.                         
  801.                         keylset ATTR_WIDGETS $i.VALUE.$v $x 
  802.                     }
  803.                 }
  804.                 
  805.             }
  806.             
  807.             TOGGLE {
  808.                 set values [ SendRequest "VALUES $i" ]
  809.                 set w [ VxGetVar $form "widget$num" ]
  810.                 foreach v $values {
  811.                     set x [ VtToggleButton $w.$v \
  812.                             -value $v \
  813.                             ]
  814.                     keylset ATTR_WIDGETS $i.VALUE.$v $x
  815.                     if { $READONLY == 1 } {
  816.                             VtSetSensitive $x 0
  817.                     }
  818.                 }
  819.             } 
  820.             default {
  821.                 keylset ATTR_WIDGETS $i.VALUE [     VxGetVar $form widget$num ]
  822.             }
  823.         }
  824.     }   
  825.     
  826.     
  827.     
  828.     
  829.     VtRemoveAllTabGroups $wroot
  830.     #    foreach a $a_list {
  831.     #        set attr [ lindex $a 0 ]
  832.     #        foreach i [ keylget ATTR_WIDGETS $attr.VALUE ] {
  833.     #            VtAddTabGroup [ lindex $i end ]
  834.     #        }
  835.     #    }
  836.             
  837.     DisplayCurrentValues
  838.     
  839.     VtShowDialog $wroot
  840.     
  841. #    VtSeparator $wroot.sep -below $form
  842.     VtLabel $wroot.sep -label " "
  843.  
  844.     # set $wroot.statusBar [ SaStatusBar sbar 0 ]
  845.     set statusBar [ SaStatusBar $wroot.sbar ]
  846.     
  847. #    SaStatusBarSet $statusBar "This is a test"
  848.     
  849.     InitFocus $sname $a_list $wroot
  850. }
  851.         
  852.  
  853. proc NewScreenCancel { old_current cbs} \
  854.         {
  855.     global CURRENTNAME
  856.     global SCREENSTACK SCREENARRAY
  857.     global ATTR_WIDGETS PAGEINIT
  858.     
  859.             
  860.  
  861.     foreach i $old_current {
  862.         set attr [ lindex $i 0 ]
  863.         set o_value [ lindex $i 2 ]
  864.         set value [ keylget ATTR_WIDGETS $attr.VAL ]
  865.             if { $value != $o_value } {
  866.             SetAttr [ keylget cbs dialog ] $CURRENTNAME $attr $o_value
  867.         }
  868.     }
  869.  
  870.     if { [ cequal $CURRENTNAME BASIC ] } {
  871.  
  872.         global childPid
  873.     
  874.         VtClose 
  875.         if { [ info exists childPid ] } {
  876.             kill $childPid
  877.         }
  878.         exit 3
  879.     }
  880.  
  881.     set     CURRENTNAME  [ lvarpop SCREENSTACK ]
  882.     set     ATTR_WIDGETS $SCREENARRAY($CURRENTNAME.WIDGETS)
  883.     set     PAGEINIT     $SCREENARRAY($CURRENTNAME.PAGEINIT)
  884.     
  885.     VtDestroyDialog [ keylget cbs dialog ]
  886.     
  887. }
  888.         
  889. proc NewScreenOk {screenname cbs} \
  890.         {
  891.     global CURRENTNAME
  892.     global PAGEINIT
  893.     global SCREENSTACK SCREENARRAY
  894.     global ATTR_WIDGETS
  895.     
  896.     if { [ cequal $screenname BASIC ] } {
  897.  
  898.         PrompterOK $cbs
  899.  
  900.     }
  901.  
  902.     set     CURRENTNAME  [ lvarpop SCREENSTACK ]
  903.     #     puts stderr [ list "Poping " $CURRENTNAME ]
  904.     
  905.     set     ATTR_WIDGETS $SCREENARRAY($CURRENTNAME.WIDGETS)
  906.     set     PAGEINIT     $SCREENARRAY($CURRENTNAME.PAGEINIT)
  907.     
  908.     VtDestroyDialog [ keylget cbs dialog ]
  909. }
  910.  
  911. proc DrawNewScreenCB {screenname cbs} \
  912.         {
  913.     DrawNewScreen $screenname  [ keylget cbs dialog ] 
  914. }
  915.  
  916. proc DrawNewScreen {screenname wroot} \
  917.         {
  918.     global PAGEINIT
  919.     global READONLY
  920.     global CURRENTNAME
  921.     global SCREENSTACK SCREENARRAY SCREENLIST
  922.     global ATTR_WIDGETS
  923.     
  924.     VtUnLock
  925.  
  926.     #     puts stderr [ list "Pushing " $CURRENTNAME ]
  927.  
  928.     if { [string compare $screenname BASIC ] } {
  929.  
  930.         set SCREENARRAY($CURRENTNAME.WIDGETS) $ATTR_WIDGETS
  931.         set SCREENARRAY($CURRENTNAME.PAGEINIT) $PAGEINIT
  932.         set SCREENARRAY($screenname) ""
  933.         lvarpush SCREENSTACK $CURRENTNAME
  934.         set ATTR_WIDGETS ""
  935.     }
  936.  
  937.     lappend SCREENLIST $screenname
  938.     set CURRENTNAME $screenname
  939.     
  940.     set INIT [ SendRequest "PAGEINIT $screenname" ]
  941.  
  942.     keylset PAGEINIT TITLE [ lindex $INIT 0 ]
  943.     keylset PAGEINIT INFO  [ lindex $INIT 1 ]
  944.     keylset PAGEINIT HELPB [ lindex $INIT 2 ]
  945.     keylset PAGEINIT HELPT [ lindex $INIT 3 ]
  946.     keylset PAGEINIT OK    [ lindex $INIT 4 ]
  947.  
  948.     set TITLE [ lindex $INIT 0 ]
  949.     set BOOK  [ lindex $INIT 2 ]
  950.     set TOPIC [ lindex $INIT 3 ]
  951.     
  952. #    puts stderr $INIT
  953.     
  954.     if { [ string compare $BOOK "" ] && [ string compare $TOPIC "" ] }     {
  955.         set HELPYN "-help"
  956.     } else {
  957.         set HELPYN "-ok"
  958.     }
  959.  
  960.     set currentval [ SendRequest "CURRENT $screenname" ]
  961.     
  962.     if {$READONLY} {
  963.         set wroot [ VtFormDialog $wroot.$screenname \
  964.                 -title "$TITLE" \
  965.                 $HELPYN \
  966.                 -okCallback "NewScreenOk {$screenname}" ]
  967.     } else {
  968.         set wroot [ VtFormDialog $wroot.$screenname \
  969.                 -title "$TITLE" \
  970.                 -ok -cancel $HELPYN \
  971.                 -okCallback "NewScreenOk {$screenname}" \
  972.                 -cancelCallback "NewScreenCancel {$currentval}" \
  973.                 -cancelButton CANCEL ]
  974.     }
  975. #    SaCharmSetMaxFormDimensions $wroot 1
  976.  
  977.     if {[VtInfo -charm]} {
  978.         set displayWidth [VtInfo -displayWidth]
  979.         set displayHeight [VtInfo -displayHeight]
  980.         incr displayWidth -3
  981.         incr displayHeight -5
  982.         VtSetValues $wroot \
  983.             -CHARM_height $displayHeight \
  984.             -CHARM_width $displayWidth \
  985.             -CHARM_resizable 0 
  986.      }
  987.  
  988.     DrawScreen $wroot 
  989.     VtUnLock
  990. }
  991.     
  992. proc SendRequest {request} \
  993.         {
  994.     global BEstdin BEstdout
  995.     
  996.     #puts stderr "Send:$request"
  997.     puts $BEstdin $request
  998.     flush $BEstdin
  999.     
  1000.     set message ""
  1001.     set quotes 0
  1002.     while { 1 } {
  1003.         if { [ gets $BEstdout mesg ] == -1 } {
  1004.             puts stderr "[IntlLocalizeMsg SCO_NCFGPROMPTER_ERR_BE_SCRIPT_DIED]"
  1005.             exit 1
  1006.         }
  1007.         
  1008.         set len [ string length $mesg ]
  1009.         set m $mesg
  1010.         set inx [ string first "\"" $m ]
  1011.         while { $inx != -1 } {
  1012.             set quotes [ expr ! $quotes ]
  1013.             set m [ string range $m [ expr $inx+1 ] end ]
  1014.             set inx [ string first "\"" $m ]
  1015.         }
  1016.         if { $message == "" } {
  1017.             set message $mesg
  1018.         } else {
  1019.             append message "\n"
  1020.             append message $mesg
  1021.         }
  1022.         if { ! $quotes } {
  1023.             break
  1024.         }
  1025.     }
  1026.     return $message
  1027. }
  1028.  
  1029. # main Main MAIN
  1030.  
  1031. ErrorTopLevelCatch {
  1032.     
  1033.     # grab name of this script minus the tcl extension
  1034.     set scriptname [file tail [file root [info script]]]
  1035.     
  1036.     #puts stderr "ncfgprompter: $argv"
  1037.     
  1038.     set argv_len [ llength $argv ]
  1039.     if { $argv_len == 0 } {
  1040.         puts stderr "[IntlLocalizeMsg SCO_NCFGPROMPTER_ERR_USAGE [ list $scriptname ]]"
  1041.         exit 1
  1042.     }
  1043.     
  1044.     set READONLY 0
  1045.     set NO_OUTPUT 0
  1046.  
  1047.     
  1048.     set args_start 0
  1049.     for {set i 0} { $i < $argv_len } { incr i } {
  1050.         case [ lindex $argv $i ] {
  1051.             readonly {
  1052.                 set READONLY 1
  1053.                 set args_start [ expr $i+1 ]
  1054.             }
  1055.             no_output {
  1056.                 set NO_OUTPUT 1
  1057.                 set args_start [ expr $i+1 ]
  1058.             }
  1059.         }
  1060.     }
  1061.  
  1062.     if { [ expr $argv_len - $args_start ] == 0 }  {
  1063.         # ncfgprompter talks directly to the ncfgBE now
  1064.         set BEstdin stdout
  1065.         set BEstdout stdin
  1066.     }
  1067.  
  1068.     
  1069.     set OLDstdout [ dup stdout ]
  1070.     if { ! [ info exists BEstdin ] } {
  1071.         dup stdin  stdout
  1072.     
  1073.         pipe a BEstdin 
  1074.         pipe BEstdout b
  1075.         
  1076.         set childPid [ fork ]
  1077.         case $childPid {
  1078.             -1 {
  1079.                 puts stderr "[IntlLocalizeMsg SCO_NCFGPROMPTER_ERR_FORK_FAIL [ list $scriptname ]]"
  1080.                 exit 1
  1081.             }
  1082.             0 {
  1083.                 close $BEstdin
  1084.                 close $BEstdout
  1085.                 
  1086.                 close stdin
  1087.                 dup $a stdin
  1088.                 close $a
  1089.                 
  1090.                 close stdout
  1091.                 dup $b stdout
  1092.                 close $b
  1093.                 fcntl stdout NOBUF 1
  1094.                 
  1095.                 set prog [ lindex $argv $args_start ]
  1096.                 set args [ lrange $argv [ expr $args_start+1 ] end ]
  1097.                 execl $prog $args
  1098.             }
  1099.         }
  1100.         
  1101.         close $a
  1102.         close $b
  1103.     }
  1104.  
  1105.     set wroot [ VtOpen ncfgprompter ]
  1106.     
  1107.     VtSetAppValues $wroot
  1108.     VtSetAppValues $wroot -helpCallback "PrompterHelp"
  1109.     
  1110.     InitializeGlobals
  1111.     
  1112.     DrawNewScreen BASIC $wroot
  1113.  
  1114.     #cmdtrace on stderr
  1115.     
  1116.     VtMainLoop
  1117.     
  1118. } ncfgprompter
  1119.  
  1120.  
  1121.