home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / radiobox.itk < prev    next >
Text File  |  2003-09-01  |  15KB  |  428 lines

  1. #
  2. # Radiobox
  3. # ----------------------------------------------------------------------
  4. # Implements a radiobuttonbox.  Supports adding, inserting, deleting,
  5. # selecting, and deselecting of radiobuttons by tag and index.
  6. #
  7. # ----------------------------------------------------------------------
  8. #  AUTHOR: Michael J. McLennan          EMAIL: mmclennan@lucent.com
  9. #          Mark L. Ulferts              EMAIL: mulferts@austin.dsccc.com
  10. #
  11. #  @(#) $Id: radiobox.itk,v 1.8 2002/02/27 05:59:07 mgbacke Exp $
  12. # ----------------------------------------------------------------------
  13. #            Copyright (c) 1995 DSC Technologies Corporation
  14. # ======================================================================
  15. # Permission to use, copy, modify, distribute and license this software 
  16. # and its documentation for any purpose, and without fee or written 
  17. # agreement with DSC, is hereby granted, provided that the above copyright 
  18. # notice appears in all copies and that both the copyright notice and 
  19. # warranty disclaimer below appear in supporting documentation, and that 
  20. # the names of DSC Technologies Corporation or DSC Communications 
  21. # Corporation not be used in advertising or publicity pertaining to the 
  22. # software without specific, written prior permission.
  23. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  24. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  25. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  26. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  27. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  28. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  29. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  30. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  31. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  32. # SOFTWARE.
  33. # ======================================================================
  34.  
  35. #
  36. # Usual options.
  37. #
  38. itk::usual Radiobox {
  39.     keep -background -borderwidth -cursor -disabledforeground \
  40.     -foreground -labelfont -selectcolor
  41. }
  42.  
  43. # ------------------------------------------------------------------
  44. #                            RADIOBOX
  45. # ------------------------------------------------------------------
  46. itcl::class iwidgets::Radiobox {
  47.     inherit iwidgets::Labeledframe
  48.  
  49.     constructor {args} {}
  50.     destructor  {}
  51.  
  52.     itk_option define -disabledforeground \
  53.     disabledForeground DisabledForeground {}
  54.     itk_option define -selectcolor selectColor Background {}
  55.     itk_option define -command command Command {}
  56.     itk_option define -orient orient Orient vertical
  57.  
  58.     public {
  59.       method add {tag args}
  60.       method buttonconfigure {index args}
  61.       method component {{name ""} args}
  62.       method delete {index}
  63.       method deselect {index}
  64.       method flash {index}
  65.       method get {}
  66.       method index {index}
  67.       method insert {index tag args}
  68.       method select {index}
  69.     }
  70.  
  71.     protected method _command { name1 name2 opt }
  72.  
  73.     private {
  74.       method gettag {index}      ;# Get the tag of the checkbutton associated
  75.                                  ;# with a numeric index
  76.  
  77.       method _rearrange {}       ;# List of radiobutton tags.
  78.       variable _buttons {}       ;# List of radiobutton tags.
  79.       common _modes              ;# Current selection.
  80.       variable _unique 0         ;# Unique id for choice creation.
  81.     }
  82. }
  83.  
  84. #
  85. # Provide a lowercased access method for the Radiobox class.
  86. #
  87. proc ::iwidgets::radiobox {pathName args} {
  88.     uplevel ::iwidgets::Radiobox $pathName $args
  89. }
  90.  
  91. #
  92. # Use option database to override default resources of base classes.
  93. #
  94. option add *Radiobox.labelMargin    10    widgetDefault
  95. option add *Radiobox.labelFont     \
  96.       "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*"  widgetDefault
  97. option add *Radiobox.labelPos        nw    widgetDefault
  98. option add *Radiobox.borderWidth    2    widgetDefault
  99. option add *Radiobox.relief        groove    widgetDefault
  100.  
  101. # ------------------------------------------------------------------
  102. #                        CONSTRUCTOR
  103. # ------------------------------------------------------------------
  104. itcl::body iwidgets::Radiobox::constructor {args} {
  105.    
  106.     #
  107.     # Initialize the _modes array element prior to setting the trace. This
  108.     # prevents the -command command (if defined) from being triggered when
  109.     # the first radiobutton is added via the add method.
  110.     #
  111.     set _modes($this) {}
  112.  
  113.     trace variable [itcl::scope _modes($this)] w [itcl::code $this _command]
  114.  
  115.     grid columnconfigure $itk_component(childsite) 0 -weight 1
  116.  
  117.     eval itk_initialize $args
  118. }
  119.  
  120. # ------------------------------------------------------------------
  121. #                        DESTRUCTOR
  122. # ------------------------------------------------------------------
  123. itcl::body iwidgets::Radiobox::destructor { } {
  124.  
  125.     trace vdelete [itcl::scope _modes($this)] w [itcl::code $this _command]
  126.     catch {unset _modes($this)}
  127.  
  128. }
  129.  
  130. # ------------------------------------------------------------------
  131. #                            OPTIONS
  132. # ------------------------------------------------------------------
  133.  
  134. # ------------------------------------------------------------------
  135. # OPTION: -command
  136. #
  137. # Specifies a command to be evaluated upon change in the radiobox
  138. # ------------------------------------------------------------------
  139. itcl::configbody iwidgets::Radiobox::command {}
  140.  
  141. # ------------------------------------------------------------------
  142. # OPTION: -orient
  143. #
  144. # Allows the user to orient the radiobuttons either horizontally
  145. # or vertically.
  146. # ------------------------------------------------------------------
  147. itcl::configbody iwidgets::Radiobox::orient {
  148.   if {$itk_option(-orient) == "horizontal" ||
  149.       $itk_option(-orient) == "vertical"} {
  150.     _rearrange
  151.   } else {
  152.     error "Bad orientation: $itk_option(-orient).  Should be\
  153.       \"horizontal\" or \"vertical\"."
  154.   }
  155. }
  156.  
  157. # ------------------------------------------------------------------
  158. #                            METHODS
  159. # ------------------------------------------------------------------
  160.  
  161. # ------------------------------------------------------------------
  162. # METHOD: index index
  163. #
  164. # Searches the radiobutton tags in the radiobox for the one with the
  165. # requested tag, numerical index, or keyword "end".  Returns the 
  166. # choices's numerical index if found, otherwise error.
  167. # ------------------------------------------------------------------
  168. itcl::body iwidgets::Radiobox::index {index} {
  169.     if {[llength $_buttons] > 0} {
  170.         if {[regexp {(^[0-9]+$)} $index]} {
  171.             if {$index < [llength $_buttons]} {
  172.                 return $index
  173.             } else {
  174.                 error "Radiobox index \"$index\" is out of range"
  175.             }
  176.  
  177.         } elseif {$index == "end"} {
  178.             return [expr {[llength $_buttons] - 1}]
  179.  
  180.         } else {
  181.             if {[set idx [lsearch $_buttons $index]] != -1} {
  182.                 return $idx
  183.             }
  184.  
  185.             error "bad Radiobox index \"$index\": must be number, end,\
  186.                     or pattern"
  187.         }
  188.  
  189.     } else {
  190.         error "Radiobox \"$itk_component(hull)\" has no radiobuttons"
  191.     }
  192. }
  193.  
  194. # ------------------------------------------------------------------
  195. # METHOD: add tag ?option value option value ...?
  196. #
  197. # Add a new tagged radiobutton to the radiobox at the end.  The method 
  198. # takes additional options which are passed on to the radiobutton
  199. # constructor.  These include most of the typical radiobutton 
  200. # options.  The tag is returned.
  201. # ------------------------------------------------------------------
  202. itcl::body iwidgets::Radiobox::add {tag args} {
  203.     set options {-value -variable}
  204.     foreach option $options {
  205.       if {[lsearch $args $option] != -1} {
  206.     error "Error: specifying values for radiobutton component options\
  207.       \"-value\" and\n  \"-variable\" is disallowed.  The Radiobox must\
  208.       use these options when\n  adding radiobuttons."
  209.       }
  210.     }
  211.  
  212.     itk_component add $tag {
  213.         eval radiobutton $itk_component(childsite).rb[incr _unique] \
  214.             -variable [list [itcl::scope _modes($this)]] \
  215.             -anchor w \
  216.             -justify left \
  217.             -highlightthickness 0 \
  218.             -value $tag $args
  219.     } { 
  220.       usual
  221.       keep -state
  222.       ignore -highlightthickness -highlightcolor
  223.       rename -font -labelfont labelFont Font
  224.     }
  225.     lappend _buttons $tag
  226.     grid $itk_component($tag)
  227.     after idle [itcl::code $this _rearrange]
  228.  
  229.     return $tag
  230. }
  231.  
  232. # ------------------------------------------------------------------
  233. # METHOD: insert index tag ?option value option value ...?
  234. #
  235. # Insert the tagged radiobutton in the radiobox just before the 
  236. # one given by index.  Any additional options are passed on to the
  237. # radiobutton constructor.  These include the typical radiobutton
  238. # options.  The tag is returned.
  239. # ------------------------------------------------------------------
  240. itcl::body iwidgets::Radiobox::insert {index tag args} {
  241.     set options {-value -variable}
  242.     foreach option $options {
  243.       if {[lsearch $args $option] != -1} {
  244.     error "Error: specifying values for radiobutton component options\
  245.       \"-value\" and\n  \"-variable\" is disallowed.  The Radiobox must\
  246.       use these options when\n  adding radiobuttons."
  247.       }
  248.     }
  249.  
  250.     itk_component add $tag {
  251.         eval radiobutton $itk_component(childsite).rb[incr _unique] \
  252.             -variable [list [itcl::scope _modes($this)]] \
  253.             -highlightthickness 0 \
  254.             -anchor w \
  255.             -justify left \
  256.             -value $tag $args
  257.     } { 
  258.       usual
  259.       ignore -highlightthickness -highlightcolor
  260.       rename -font -labelfont labelFont Font
  261.     }
  262.     set index [index $index]
  263.     set before [lindex $_buttons $index]
  264.     set _buttons [linsert $_buttons $index $tag]
  265.     grid $itk_component($tag)
  266.     after idle [itcl::code $this _rearrange]
  267.  
  268.     return $tag
  269. }
  270.  
  271. # ------------------------------------------------------------------
  272. # METHOD: _rearrange
  273. #
  274. # Rearrange the buttons in the childsite frame using the grid
  275. # geometry manager.  This method was modified by Chad Smith on 3/9/00
  276. # to take into consideration the newly added -orient config option.
  277. # ------------------------------------------------------------------
  278. itcl::body iwidgets::Radiobox::_rearrange {} {
  279.     if {[set count [llength $_buttons]] > 0} {
  280.     if {$itk_option(-orient) == "vertical"} {
  281.             set row 0
  282.         foreach tag $_buttons {
  283.             grid configure $itk_component($tag) -column 0 -row $row -sticky nw
  284.             grid rowconfigure $itk_component(childsite) $row -weight 0
  285.             incr row
  286.         }
  287.         grid rowconfigure $itk_component(childsite) [expr {$count-1}] \
  288.           -weight 1
  289.     } else {
  290.             set col 0
  291.         foreach tag $_buttons {
  292.         grid configure $itk_component($tag) -column $col -row 0 -sticky nw
  293.             grid columnconfigure $itk_component(childsite) $col -weight 1
  294.         incr col
  295.         }
  296.     }
  297.     }
  298. }
  299.  
  300. # ------------------------------------------------------------------
  301. # METHOD: component ?name? ?arg arg arg...?
  302. #
  303. # This method overrides the base class definition to provide some
  304. # error checking. The user is disallowed from modifying the values
  305. # of the -value and -variable options for individual radiobuttons.
  306. # Addition of this method prompted by SF ticket 227923.
  307. # ------------------------------------------------------------------
  308. itcl::body iwidgets::Radiobox::component {{name ""} args} {
  309.   if {[lsearch $_buttons $name] != -1} {
  310.     # See if the user's trying to use the configure method. Note that
  311.     # because of globbing, as few characters as "co" are expanded to
  312.     # "config".  Similarly, "configu" will expand to "configure".
  313.     if [regexp {^co+} [lindex $args 0]] {
  314.       # The user's trying to modify a radiobutton.  This is all fine and
  315.       # dandy unless -value or -variable is being modified.
  316.       set options {-value -variable}
  317.       foreach option $options {
  318.     set index [lsearch $args $option]
  319.         if {$index != -1} {
  320.           # If a value is actually specified, throw an error.
  321.           if {[lindex $args [expr {$index + 1}]] != ""} {
  322.             error "Error: specifying values for radiobutton component options\
  323.               \"-value\" and\n  \"-variable\" is disallowed.  The Radiobox\
  324.               uses these options internally."
  325.           }
  326.         }
  327.       }
  328.     }
  329.   }
  330.  
  331.   eval chain $name $args
  332. }
  333.  
  334. # ------------------------------------------------------------------
  335. # METHOD: delete index
  336. #
  337. # Delete the specified radiobutton.
  338. # ------------------------------------------------------------------
  339. itcl::body iwidgets::Radiobox::delete {index} {
  340.  
  341.     set tag [gettag $index]
  342.     set index [index $index]
  343.  
  344.     destroy $itk_component($tag)
  345.  
  346.     set _buttons [lreplace $_buttons $index $index]
  347.  
  348.     if {$_modes($this) == $tag} {
  349.         set _modes($this) {}
  350.     }
  351.     after idle [itcl::code $this _rearrange]
  352.     return
  353. }
  354.  
  355. # ------------------------------------------------------------------
  356. # METHOD: select index
  357. #
  358. # Select the specified radiobutton.
  359. # ------------------------------------------------------------------
  360. itcl::body iwidgets::Radiobox::select {index} {
  361.     set tag [gettag $index]
  362.     $itk_component($tag) invoke
  363. }
  364.  
  365. # ------------------------------------------------------------------
  366. # METHOD: get
  367. #
  368. # Return the tag of the currently selected radiobutton.
  369. # ------------------------------------------------------------------
  370. itcl::body iwidgets::Radiobox::get {} {
  371.     return $_modes($this)
  372. }
  373.  
  374. # ------------------------------------------------------------------
  375. # METHOD: deselect index
  376. #
  377. # Deselect the specified radiobutton.
  378. # ------------------------------------------------------------------
  379. itcl::body iwidgets::Radiobox::deselect {index} {
  380.     set tag [gettag $index]
  381.     $itk_component($tag) deselect
  382. }
  383.  
  384. # ------------------------------------------------------------------
  385. # METHOD: flash index
  386. #
  387. # Flash the specified radiobutton.
  388. # ------------------------------------------------------------------
  389. itcl::body iwidgets::Radiobox::flash {index} {
  390.     set tag [gettag $index]
  391.     $itk_component($tag) flash  
  392. }
  393.  
  394. # ------------------------------------------------------------------
  395. # METHOD: buttonconfigure index ?option? ?value option value ...?
  396. #
  397. # Configure a specified radiobutton.  This method allows configuration 
  398. # of radiobuttons from the Radiobox level.  The options may have any 
  399. # of the values accepted by the add method.
  400. # ------------------------------------------------------------------
  401. itcl::body iwidgets::Radiobox::buttonconfigure {index args} { 
  402.     set tag [gettag $index]
  403.     eval $itk_component($tag) configure $args
  404. }
  405.  
  406. # ------------------------------------------------------------------
  407. # CALLBACK METHOD: _command name1 name2 opt 
  408. #
  409. # Tied to the trace on _modes($this). Whenever our -variable for our
  410. # radiobuttons change, this method is invoked. It in turn calls
  411. # the user specified tcl script given by -command.
  412. # ------------------------------------------------------------------
  413. itcl::body iwidgets::Radiobox::_command { name1 name2 opt } {
  414.     uplevel #0 $itk_option(-command)
  415. }
  416.  
  417. # ------------------------------------------------------------------
  418. # METHOD: gettag index
  419. #
  420. # Return the tag of the checkbutton associated with a specified
  421. # numeric index
  422. # ------------------------------------------------------------------
  423. itcl::body iwidgets::Radiobox::gettag {index} {
  424.     return [lindex $_buttons [index $index]]
  425. }
  426.  
  427.