home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / comanche.exe / lib / iwidgets2.2.0 / scripts / radiobox.itk < prev    next >
Text File  |  1999-02-24  |  10KB  |  294 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: michael.mclennan@att.com
  9. #          Mark L. Ulferts               EMAIL: mulferts@spd.dsccc.com
  10. #
  11. #  @(#) $Id: radiobox.itk,v 1.1 1998/07/27 18:49:47 stanton 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. # Default resources.
  37. #
  38. option add *Radiobox.borderWidth 2 widgetDefault
  39. option add *Radiobox.relief groove widgetDefault
  40. option add *Radiobox.labelPos n widgetDefault
  41.  
  42. #
  43. # Usual options.
  44. #
  45. itk::usual Radiobox {
  46.     keep -background -borderwidth -cursor -foreground -labelfont
  47. }
  48.  
  49. # ------------------------------------------------------------------
  50. #                            RADIOBOX
  51. # ------------------------------------------------------------------
  52. class iwidgets::Radiobox {
  53.     inherit iwidgets::Labeledwidget
  54.  
  55.     constructor {args} {}
  56.  
  57.     itk_option define -command command Command {}
  58.  
  59.     method index {index}
  60.     method add {tag args}
  61.     method insert {index tag args}
  62.     method delete {index}
  63.     method select {index}
  64.     method deselect {index}
  65.     method get {}
  66.     method flash {index}
  67.     method buttonconfigure {index args}
  68.  
  69.     method _command { name1 name2 opt }
  70.  
  71.     private variable _unique 0         ;# Unique id for choice creation.
  72.     private variable _buttons {}       ;# List of radiobutton tags.
  73.     private common _modes              ;# Current selection.
  74. }
  75.  
  76. #
  77. # Provide a lowercased access method for the Radiobox class.
  78. #
  79. proc ::iwidgets::radiobox {pathName args} {
  80.     uplevel ::iwidgets::Radiobox $pathName $args
  81. }
  82.  
  83. # ------------------------------------------------------------------
  84. #                        CONSTRUCTOR
  85. # ------------------------------------------------------------------
  86. body iwidgets::Radiobox::constructor {args} {
  87.     component hull configure -borderwidth 0
  88.  
  89.     itk_component add border {
  90.         frame $itk_interior.border
  91.     } {
  92.          keep -background -cursor -borderwidth -relief
  93.     }
  94.     pack $itk_component(border) -expand yes -fill both
  95.  
  96.     trace variable [scope _modes($this)] w [code $this _command]
  97.  
  98.     eval itk_initialize $args
  99. }
  100.  
  101. # ------------------------------------------------------------------
  102. #                            OPTIONS
  103. # ------------------------------------------------------------------
  104.  
  105. # ------------------------------------------------------------------
  106. # OPTION: -command
  107. #
  108. # Specifies a command to be evaluated upon change in the radiobox
  109. # ------------------------------------------------------------------
  110. configbody iwidgets::Radiobox::command {}
  111.  
  112. # ------------------------------------------------------------------
  113. #                            METHODS
  114. # ------------------------------------------------------------------
  115.  
  116. # ------------------------------------------------------------------
  117. # METHOD: index index
  118. #
  119. # Searches the radiobutton tags in the radiobox for the one with the
  120. # requested tag, numerical index, or keyword "end".  Returns the 
  121. # choices's numerical index if found, otherwise error.
  122. # ------------------------------------------------------------------
  123. body iwidgets::Radiobox::index {index} {
  124.     if {[llength $_buttons] > 0} {
  125.         if {[regexp {(^[0-9]+$)} $index]} {
  126.             if {$index < [llength $_buttons]} {
  127.                 return $index
  128.             } else {
  129.                 error "Radiobox index \"$index\" is out of range"
  130.             }
  131.  
  132.         } elseif {$index == "end"} {
  133.             return [expr [llength $_buttons] - 1]
  134.  
  135.         } else {
  136.             if {[set idx [lsearch $_buttons $index]] != -1} {
  137.                 return $idx
  138.             }
  139.  
  140.             error "bad Radiobox index \"$index\": must be number, end,\
  141.                     or pattern"
  142.         }
  143.  
  144.     } else {
  145.         error "Radiobox \"$itk_component(hull)\" has no radiobuttons"
  146.     }
  147. }
  148.  
  149. # ------------------------------------------------------------------
  150. # METHOD: add tag ?option value option value ...?
  151. #
  152. # Add a new tagged radiobutton to the radiobox at the end.  The method 
  153. # takes additional options which are passed on to the radiobutton
  154. # constructor.  These include most of the typical radiobutton 
  155. # options.  The tag is returned.
  156. # ------------------------------------------------------------------
  157. body iwidgets::Radiobox::add {tag args} {
  158.     itk_component add $tag {
  159.         eval radiobutton $itk_component(border).rb[incr _unique] \
  160.             -variable [list [scope _modes($this)]] -value $tag $args
  161.     } {
  162.         keep -background -foreground -cursor -font -text \
  163.          -activebackground -activeforeground -selectcolor \
  164.          -indicatoron -selectimage -state -highlightcolor \
  165.          -highlightthickness 
  166.     rename -highlightbackground -background background Background
  167.     }
  168.     pack $itk_component($tag) -anchor w -padx 4
  169.  
  170.     lappend _buttons $tag
  171.  
  172.     return $tag
  173. }
  174.  
  175. # ------------------------------------------------------------------
  176. # METHOD: insert index tag ?option value option value ...?
  177. #
  178. # Insert the tagged radiobutton in the radiobox just before the 
  179. # one given by index.  Any additional options are passed on to the
  180. # radiobutton constructor.  These include the typical radiobutton
  181. # options.  The tag is returned.
  182. # ------------------------------------------------------------------
  183. body iwidgets::Radiobox::insert {index tag args} {
  184.     itk_component add $tag {
  185.         eval radiobutton $itk_component(border).rb[incr _unique] \
  186.             -variable [list [scope _modes($this)]] -value $tag $args
  187.     } {
  188.         keep -background -foreground -cursor -font -text \
  189.          -activebackground -activeforeground -selectcolor \
  190.          -indicatoron -selectimage -state -highlightcolor \
  191.          -highlightthickness 
  192.     rename -highlightbackground -background background Background
  193.     }
  194.  
  195.     set index [index $index]
  196.     set before [lindex $_buttons $index]
  197.     set _buttons [linsert $_buttons $index $tag]
  198.  
  199.     pack $itk_component($tag) -anchor w -padx 4 -before $itk_component($before)
  200.  
  201.     return $tag
  202. }
  203.  
  204. # ------------------------------------------------------------------
  205. # METHOD: delete index
  206. #
  207. # Delete the specified radiobutton.
  208. # ------------------------------------------------------------------
  209. body iwidgets::Radiobox::delete {index} {
  210.     set index [index $index]
  211.     set tag [lindex $_buttons $index]
  212.  
  213.     destroy $itk_component($tag)
  214.  
  215.     set _buttons [lreplace $_buttons $index $index]
  216.  
  217.     if {$_modes($this) == $tag} {
  218.         set _modes($this) {}
  219.     }
  220.  
  221.     return
  222. }
  223.  
  224. # ------------------------------------------------------------------
  225. # METHOD: select index
  226. #
  227. # Select the specified radiobutton.
  228. # ------------------------------------------------------------------
  229. body iwidgets::Radiobox::select {index} {
  230.     set index [index $index]
  231.     set tag [lindex $_buttons $index]
  232.  
  233.     $itk_component($tag) invoke
  234. }
  235.  
  236. # ------------------------------------------------------------------
  237. # METHOD: get
  238. #
  239. # Return the tag of the currently selected radiobutton.
  240. # ------------------------------------------------------------------
  241. body iwidgets::Radiobox::get {} {
  242.     return $_modes($this)
  243. }
  244.  
  245. # ------------------------------------------------------------------
  246. # METHOD: deselect index
  247. #
  248. # Deselect the specified radiobutton.
  249. # ------------------------------------------------------------------
  250. body iwidgets::Radiobox::deselect {index} {
  251.     set index [index $index]
  252.     set tag [lindex $_buttons $index]
  253.  
  254.     $itk_component($tag) deselect
  255. }
  256.  
  257. # ------------------------------------------------------------------
  258. # METHOD: flash index
  259. #
  260. # Flash the specified radiobutton.
  261. # ------------------------------------------------------------------
  262. body iwidgets::Radiobox::flash {index} {
  263.     set index [index $index]
  264.     set tag [lindex $_buttons $index]
  265.  
  266.     $itk_component($tag) flash  
  267. }
  268.  
  269. # ------------------------------------------------------------------
  270. # METHOD: buttonconfigure index ?option? ?value option value ...?
  271. #
  272. # Configure a specified radiobutton.  This method allows configuration 
  273. # of radiobuttons from the Radiobox level.  The options may have any 
  274. # of the values accepted by the add method.
  275. # ------------------------------------------------------------------
  276. body iwidgets::Radiobox::buttonconfigure {index args} { 
  277.     set index [index $index]
  278.     set tag [lindex $_buttons $index]
  279.  
  280.     eval $itk_component($tag) configure $args
  281. }
  282.  
  283. # ------------------------------------------------------------------
  284. # CALLBACK METHOD: _command name1 name2 opt 
  285. #
  286. # Tied to the trace on _modes($this). Whenever our -variable for our
  287. # radiobuttons change, this method is invoked. It in turn calls
  288. # the user specified tcl script given by -command.
  289. # ------------------------------------------------------------------
  290. body iwidgets::Radiobox::_command { name1 name2 opt } {
  291.     uplevel #0 $itk_option(-command)
  292. }
  293.