home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / comanche.exe / lib / iwidgets3.0.0 / scripts / radiobox.itk < prev    next >
Text File  |  1999-02-24  |  12KB  |  329 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.2 1998/08/11 14:42:12 welch 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. class iwidgets::Radiobox {
  47.     inherit iwidgets::Labeledframe
  48.  
  49.     constructor {args} {}
  50.  
  51.     itk_option define -disabledforeground \
  52.     disabledForeground DisabledForeground {}
  53.     itk_option define -selectcolor selectColor Background {}
  54.     itk_option define -command command Command {}
  55.  
  56.     public {
  57.       method add {tag args}
  58.       method buttonconfigure {index args}
  59.       method delete {index}
  60.       method deselect {index}
  61.       method flash {index}
  62.       method get {}
  63.       method index {index}
  64.       method insert {index tag args}
  65.       method select {index}
  66.     }
  67.  
  68.     protected method _command { name1 name2 opt }
  69.  
  70.     private {
  71.       method gettag {index}      ;# Get the tag of the checkbutton associated
  72.                                  ;# with a numeric index
  73.  
  74.       method _rearrange {}       ;# List of radiobutton tags.
  75.       variable _buttons {}       ;# List of radiobutton tags.
  76.       common _modes              ;# Current selection.
  77.       variable _unique 0         ;# Unique id for choice creation.
  78.     }
  79. }
  80.  
  81. #
  82. # Provide a lowercased access method for the Radiobox class.
  83. #
  84. proc ::iwidgets::radiobox {pathName args} {
  85.     uplevel ::iwidgets::Radiobox $pathName $args
  86. }
  87.  
  88. #
  89. # Use option database to override default resources of base classes.
  90. #
  91. option add *Radiobox.labelMargin    10    widgetDefault
  92. option add *Radiobox.labelFont     \
  93.       "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*"  widgetDefault
  94. option add *Radiobox.labelPos        nw    widgetDefault
  95. option add *Radiobox.borderWidth    2    widgetDefault
  96. option add *Radiobox.relief        groove    widgetDefault
  97.  
  98. # ------------------------------------------------------------------
  99. #                        CONSTRUCTOR
  100. # ------------------------------------------------------------------
  101. body iwidgets::Radiobox::constructor {args} {
  102.     trace variable [scope _modes($this)] w [code $this _command]
  103.  
  104.     grid columnconfigure $itk_component(childsite) 0 -weight 1
  105.  
  106.     eval itk_initialize $args
  107. }
  108.  
  109. # ------------------------------------------------------------------
  110. #                            OPTIONS
  111. # ------------------------------------------------------------------
  112.  
  113. # ------------------------------------------------------------------
  114. # OPTION: -command
  115. #
  116. # Specifies a command to be evaluated upon change in the radiobox
  117. # ------------------------------------------------------------------
  118. configbody iwidgets::Radiobox::command {}
  119.  
  120. # ------------------------------------------------------------------
  121. #                            METHODS
  122. # ------------------------------------------------------------------
  123.  
  124. # ------------------------------------------------------------------
  125. # METHOD: index index
  126. #
  127. # Searches the radiobutton tags in the radiobox for the one with the
  128. # requested tag, numerical index, or keyword "end".  Returns the 
  129. # choices's numerical index if found, otherwise error.
  130. # ------------------------------------------------------------------
  131. body iwidgets::Radiobox::index {index} {
  132.     if {[llength $_buttons] > 0} {
  133.         if {[regexp {(^[0-9]+$)} $index]} {
  134.             if {$index < [llength $_buttons]} {
  135.                 return $index
  136.             } else {
  137.                 error "Radiobox index \"$index\" is out of range"
  138.             }
  139.  
  140.         } elseif {$index == "end"} {
  141.             return [expr [llength $_buttons] - 1]
  142.  
  143.         } else {
  144.             if {[set idx [lsearch $_buttons $index]] != -1} {
  145.                 return $idx
  146.             }
  147.  
  148.             error "bad Radiobox index \"$index\": must be number, end,\
  149.                     or pattern"
  150.         }
  151.  
  152.     } else {
  153.         error "Radiobox \"$itk_component(hull)\" has no radiobuttons"
  154.     }
  155. }
  156.  
  157. # ------------------------------------------------------------------
  158. # METHOD: add tag ?option value option value ...?
  159. #
  160. # Add a new tagged radiobutton to the radiobox at the end.  The method 
  161. # takes additional options which are passed on to the radiobutton
  162. # constructor.  These include most of the typical radiobutton 
  163. # options.  The tag is returned.
  164. # ------------------------------------------------------------------
  165. body iwidgets::Radiobox::add {tag args} {
  166.     itk_component add $tag {
  167.         eval radiobutton $itk_component(childsite).rb[incr _unique] \
  168.             -variable [list [scope _modes($this)]] \
  169.             -anchor w \
  170.             -justify left \
  171.             -highlightthickness 0 \
  172.             -value $tag $args
  173.     } { 
  174.       usual
  175.       ignore -highlightthickness -highlightcolor
  176.       rename -font -labelfont labelFont Font
  177.     }
  178.     lappend _buttons $tag
  179.     grid $itk_component($tag)
  180.     after idle [code $this _rearrange]
  181.  
  182.     return $tag
  183. }
  184.  
  185. # ------------------------------------------------------------------
  186. # METHOD: insert index tag ?option value option value ...?
  187. #
  188. # Insert the tagged radiobutton in the radiobox just before the 
  189. # one given by index.  Any additional options are passed on to the
  190. # radiobutton constructor.  These include the typical radiobutton
  191. # options.  The tag is returned.
  192. # ------------------------------------------------------------------
  193. body iwidgets::Radiobox::insert {index tag args} {
  194.     itk_component add $tag {
  195.         eval radiobutton $itk_component(childsite).rb[incr _unique] \
  196.             -variable [list [scope _modes($this)]] \
  197.             -highlightthickness 0 \
  198.             -anchor w \
  199.             -justify left \
  200.             -value $tag $args
  201.     } { 
  202.       usual
  203.       ignore -highlightthickness -highlightcolor
  204.       rename -font -labelfont labelFont Font
  205.     }
  206.     set index [index $index]
  207.     set before [lindex $_buttons $index]
  208.     set _buttons [linsert $_buttons $index $tag]
  209.     grid $itk_component($tag)
  210.     after idle [code $this _rearrange]
  211.  
  212.     return $tag
  213. }
  214.  
  215. # ------------------------------------------------------------------
  216. # METHOD: _rearrange
  217. #
  218. # Rearrange the buttons in the childsite frame using
  219. # the grid geometry manager.
  220. # ------------------------------------------------------------------
  221. body iwidgets::Radiobox::_rearrange {} {
  222.     set index 0
  223.     set master $itk_component(childsite)
  224.     
  225.     if {[set count [llength $_buttons]] > 0} {
  226.     foreach tag $_buttons {
  227.         grid configure $itk_component($tag) -row $index -sticky nw
  228.         grid rowconfigure $master $index -weight 0
  229.         incr index
  230.     }
  231.     grid rowconfigure $master [expr $count-1] -weight 1
  232.     }
  233. }
  234.  
  235. # ------------------------------------------------------------------
  236. # METHOD: delete index
  237. #
  238. # Delete the specified radiobutton.
  239. # ------------------------------------------------------------------
  240. body iwidgets::Radiobox::delete {index} {
  241.  
  242.     set tag [gettag $index]
  243.     set index [index $index]
  244.  
  245.     destroy $itk_component($tag)
  246.  
  247.     set _buttons [lreplace $_buttons $index $index]
  248.  
  249.     if {$_modes($this) == $tag} {
  250.         set _modes($this) {}
  251.     }
  252.     after idle [code $this _rearrange]
  253.     return
  254. }
  255.  
  256. # ------------------------------------------------------------------
  257. # METHOD: select index
  258. #
  259. # Select the specified radiobutton.
  260. # ------------------------------------------------------------------
  261. body iwidgets::Radiobox::select {index} {
  262.     set tag [gettag $index]
  263.     $itk_component($tag) invoke
  264. }
  265.  
  266. # ------------------------------------------------------------------
  267. # METHOD: get
  268. #
  269. # Return the tag of the currently selected radiobutton.
  270. # ------------------------------------------------------------------
  271. body iwidgets::Radiobox::get {} {
  272.     return $_modes($this)
  273. }
  274.  
  275. # ------------------------------------------------------------------
  276. # METHOD: deselect index
  277. #
  278. # Deselect the specified radiobutton.
  279. # ------------------------------------------------------------------
  280. body iwidgets::Radiobox::deselect {index} {
  281.     set tag [gettag $index]
  282.     $itk_component($tag) deselect
  283. }
  284.  
  285. # ------------------------------------------------------------------
  286. # METHOD: flash index
  287. #
  288. # Flash the specified radiobutton.
  289. # ------------------------------------------------------------------
  290. body iwidgets::Radiobox::flash {index} {
  291.     set tag [gettag $index]
  292.     $itk_component($tag) flash  
  293. }
  294.  
  295. # ------------------------------------------------------------------
  296. # METHOD: buttonconfigure index ?option? ?value option value ...?
  297. #
  298. # Configure a specified radiobutton.  This method allows configuration 
  299. # of radiobuttons from the Radiobox level.  The options may have any 
  300. # of the values accepted by the add method.
  301. # ------------------------------------------------------------------
  302. body iwidgets::Radiobox::buttonconfigure {index args} { 
  303.     set tag [gettag $index]
  304.     eval $itk_component($tag) configure $args
  305. }
  306.  
  307. # ------------------------------------------------------------------
  308. # CALLBACK METHOD: _command name1 name2 opt 
  309. #
  310. # Tied to the trace on _modes($this). Whenever our -variable for our
  311. # radiobuttons change, this method is invoked. It in turn calls
  312. # the user specified tcl script given by -command.
  313. # ------------------------------------------------------------------
  314. body iwidgets::Radiobox::_command { name1 name2 opt } {
  315.     uplevel #0 $itk_option(-command)
  316. }
  317.  
  318. # ------------------------------------------------------------------
  319. # METHOD: gettag index
  320. #
  321. # Return the tag of the checkbutton associated with a specified
  322. # numeric index
  323. # ------------------------------------------------------------------
  324. body iwidgets::Radiobox::gettag {index} {
  325.     return [lindex $_buttons [index $index]]
  326. }
  327.  
  328.