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 / checkbox.itk < prev    next >
Text File  |  1999-02-24  |  11KB  |  314 lines

  1. #
  2. # Checkbox
  3. # ----------------------------------------------------------------------
  4. # Implements a checkbuttonbox.  Supports adding, inserting, deleting,
  5. # selecting, and deselecting of checkbuttons by tag and index.
  6. #
  7. # ----------------------------------------------------------------------
  8. #  AUTHOR: John A. Tucker                EMAIL: jatucker@spd.dsccc.com
  9. #
  10. # ----------------------------------------------------------------------
  11. #            Copyright (c) 1997 DSC Technologies Corporation
  12. # ======================================================================
  13. # Permission to use, copy, modify, distribute and license this software 
  14. # and its documentation for any purpose, and without fee or written 
  15. # agreement with DSC, is hereby granted, provided that the above copyright 
  16. # notice appears in all copies and that both the copyright notice and 
  17. # warranty disclaimer below appear in supporting documentation, and that 
  18. # the names of DSC Technologies Corporation or DSC Communications 
  19. # Corporation not be used in advertising or publicity pertaining to the 
  20. # software without specific, written prior permission.
  21. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  22. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  23. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  24. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  25. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  26. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  27. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  28. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  29. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  30. # SOFTWARE.
  31. # ======================================================================
  32.  
  33.  
  34. #
  35. # Use option database to override default resources of base classes.
  36. #
  37. option add *Checkbox.labelMargin    10    widgetDefault
  38. option add *Checkbox.labelFont     \
  39.       "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*"  widgetDefault
  40. option add *Checkbox.labelPos        nw    widgetDefault
  41. option add *Checkbox.borderWidth    2    widgetDefault
  42. option add *Checkbox.relief        groove    widgetDefault
  43.  
  44. #
  45. # Usual options.
  46. #
  47. itk::usual Checkbox {
  48.     keep -background -borderwidth -cursor -disabledforeground \
  49.     -foreground -labelfont -selectcolor
  50. }
  51.  
  52. # ------------------------------------------------------------------
  53. #                            CHECKBOX
  54. # ------------------------------------------------------------------
  55. class iwidgets::Checkbox {
  56.     inherit iwidgets::Labeledframe
  57.  
  58.     constructor {args} {}
  59.  
  60.     itk_option define -disabledforeground \
  61.     disabledForeground DisabledForeground {}
  62.     itk_option define -selectcolor selectColor Background {}
  63.     itk_option define -command command Command {}
  64.  
  65.     public {
  66.       method add {tag args}
  67.       method insert {index tag args}
  68.       method delete {index}
  69.       method get {{index ""}}
  70.       method index {index}
  71.       method select {index}
  72.       method deselect {index}
  73.       method flash {index}
  74.       method toggle {index}
  75.       method buttonconfigure {index args}
  76.   }
  77.  
  78.   private {
  79.  
  80.       method gettag {index}      ;# Get the tag of the checkbutton associated
  81.                                  ;# with a numeric index
  82.  
  83.       variable _unique 0         ;# Unique id for choice creation.
  84.       variable _buttons {}       ;# List of checkbutton tags.
  85.       common buttonVar           ;# Array of checkbutton "-variables"
  86.   }
  87. }
  88.  
  89. #
  90. # Provide a lowercased access method for the Checkbox class.
  91. #
  92. proc ::iwidgets::checkbox {pathName args} {
  93.     uplevel ::iwidgets::Checkbox $pathName $args
  94. }
  95.  
  96. # ------------------------------------------------------------------
  97. #                        CONSTRUCTOR
  98. # ------------------------------------------------------------------
  99. body iwidgets::Checkbox::constructor {args} {
  100.  
  101.     eval itk_initialize $args
  102. }
  103.  
  104. # ------------------------------------------------------------------
  105. #                            OPTIONS
  106. # ------------------------------------------------------------------
  107.  
  108. # ------------------------------------------------------------------
  109. # OPTION: -command
  110. #
  111. # Specifies a command to be evaluated upon change in the checkbox
  112. # ------------------------------------------------------------------
  113. configbody iwidgets::Checkbox::command {}
  114.  
  115. # ------------------------------------------------------------------
  116. #                            METHODS
  117. # ------------------------------------------------------------------
  118.  
  119. # ------------------------------------------------------------------
  120. # METHOD: index index
  121. #
  122. # Searches the checkbutton tags in the checkbox for the one with the
  123. # requested tag, numerical index, or keyword "end".  Returns the 
  124. # choices's numerical index if found, otherwise error.
  125. # ------------------------------------------------------------------
  126. body iwidgets::Checkbox::index {index} {
  127.     if {[llength $_buttons] > 0} {
  128.         if {[regexp {(^[0-9]+$)} $index]} {
  129.             if {$index < [llength $_buttons]} {
  130.                 return $index
  131.             } else {
  132.                 error "Checkbox index \"$index\" is out of range"
  133.             }
  134.  
  135.         } elseif {$index == "end"} {
  136.             return [expr [llength $_buttons] - 1]
  137.  
  138.         } else {
  139.             if {[set idx [lsearch $_buttons $index]] != -1} {
  140.                 return $idx
  141.             }
  142.  
  143.             error "bad Checkbox index \"$index\": must be number, end,\
  144.                     or pattern"
  145.         }
  146.  
  147.     } else {
  148.         error "Checkbox \"$itk_component(hull)\" has no checkbuttons"
  149.     }
  150. }
  151.  
  152. # ------------------------------------------------------------------
  153. # METHOD: add tag ?option value option value ...?
  154. #
  155. # Add a new tagged checkbutton to the checkbox at the end.  The method 
  156. # takes additional options which are passed on to the checkbutton
  157. # constructor.  These include most of the typical checkbutton 
  158. # options.  The tag is returned.
  159. # ------------------------------------------------------------------
  160. body iwidgets::Checkbox::add {tag args} {
  161.     itk_component add $tag {
  162.         eval checkbutton $itk_component(childsite).cb[incr _unique] \
  163.             -variable [list [scope buttonVar($this,$tag)]] \
  164.             -anchor w \
  165.             -justify left \
  166.             -highlightthickness 0 \
  167.             $args
  168.     } { 
  169.       usual
  170.       ignore -highlightthickness -highlightcolor
  171.       rename -font -labelfont labelFont Font
  172.     }
  173.     pack $itk_component($tag) -anchor w -padx 4
  174.  
  175.     lappend _buttons $tag
  176.  
  177.     return $tag
  178. }
  179.  
  180. # ------------------------------------------------------------------
  181. # METHOD: insert index tag ?option value option value ...?
  182. #
  183. # Insert the tagged checkbutton in the checkbox just before the 
  184. # one given by index.  Any additional options are passed on to the
  185. # checkbutton constructor.  These include the typical checkbutton
  186. # options.  The tag is returned.
  187. # ------------------------------------------------------------------
  188. body iwidgets::Checkbox::insert {index tag args} {
  189.     itk_component add $tag {
  190.         eval checkbutton $itk_component(childsite).cb[incr _unique] \
  191.             -variable [list [scope buttonVar($this,$tag)]] \
  192.             -anchor w \
  193.             -justify left \
  194.             -highlightthickness 0 \
  195.             $args
  196.     }  { 
  197.       usual
  198.       ignore -highlightthickness -highlightcolor
  199.       rename -font -labelfont labelFont Font
  200.     }
  201.  
  202.     set index [index $index]
  203.     set before [lindex $_buttons $index]
  204.     set _buttons [linsert $_buttons $index $tag]
  205.  
  206.     pack $itk_component($tag) -anchor w -padx 4 -before $itk_component($before)
  207.  
  208.     return $tag
  209. }
  210.  
  211. # ------------------------------------------------------------------
  212. # METHOD: delete index
  213. #
  214. # Delete the specified checkbutton.
  215. # ------------------------------------------------------------------
  216. body iwidgets::Checkbox::delete {index} {
  217.  
  218.     set tag [gettag $index]
  219.     set index [index $index]
  220.     destroy $itk_component($tag)
  221.     set _buttons [lreplace $_buttons $index $index]
  222.  
  223.     if { [info exists buttonVar($this,$tag)] == 1 } {
  224.     unset buttonVar($this,$tag)
  225.     }
  226. }
  227.  
  228. # ------------------------------------------------------------------
  229. # METHOD: select index
  230. #
  231. # Select the specified checkbutton.
  232. # ------------------------------------------------------------------
  233. body iwidgets::Checkbox::select {index} {
  234.     set tag [gettag $index]
  235.     $itk_component($tag) invoke
  236. }
  237.  
  238. # ------------------------------------------------------------------
  239. # METHOD: toggle index
  240. #
  241. # Toggle a specified checkbutton between selected and unselected
  242. # ------------------------------------------------------------------
  243. body iwidgets::Checkbox::toggle {index} {
  244.     set tag [gettag $index]
  245.     $itk_component($tag) toggle
  246. }
  247.  
  248. # ------------------------------------------------------------------
  249. # METHOD: get
  250. #
  251. # Return the value of the checkbutton with the given index, or a
  252. # list of all checkbutton values in increasing order by index.
  253. # ------------------------------------------------------------------
  254. body iwidgets::Checkbox::get {{index ""}} {
  255.     set result {}
  256.  
  257.     if {$index == ""} {
  258.     foreach tag $_buttons {
  259.         if {$buttonVar($this,$tag)} {
  260.         lappend result $tag
  261.         }
  262.     }
  263.     } else {
  264.         set tag [gettag $index]
  265.     set result $buttonVar($this,$tag)
  266.     }
  267.  
  268.     return $result
  269. }
  270.  
  271. # ------------------------------------------------------------------
  272. # METHOD: deselect index
  273. #
  274. # Deselect the specified checkbutton.
  275. # ------------------------------------------------------------------
  276. body iwidgets::Checkbox::deselect {index} {
  277.     set tag [gettag $index]
  278.     $itk_component($tag) deselect
  279. }
  280.  
  281. # ------------------------------------------------------------------
  282. # METHOD: flash index
  283. #
  284. # Flash the specified checkbutton.
  285. # ------------------------------------------------------------------
  286. body iwidgets::Checkbox::flash {index} {
  287.     set tag [gettag $index]
  288.     $itk_component($tag) flash  
  289. }
  290.  
  291. # ------------------------------------------------------------------
  292. # METHOD: buttonconfigure index ?option? ?value option value ...?
  293. #
  294. # Configure a specified checkbutton.  This method allows configuration 
  295. # of checkbuttons from the Checkbox level.  The options may have any 
  296. # of the values accepted by the add method.
  297. # ------------------------------------------------------------------
  298. body iwidgets::Checkbox::buttonconfigure {index args} { 
  299.     set tag [gettag $index]
  300.     eval $itk_component($tag) configure $args
  301. }
  302.  
  303. # ------------------------------------------------------------------
  304. # METHOD: gettag index
  305. #
  306. # Return the tag of the checkbutton associated with a specified
  307. # numeric index
  308. # ------------------------------------------------------------------
  309. body iwidgets::Checkbox::gettag {index} {
  310.     return [lindex $_buttons [index $index]]
  311. }
  312.  
  313.