diff options
Diffstat (limited to 'iwidgets/generic/checkbox.itk')
-rw-r--r-- | iwidgets/generic/checkbox.itk | 341 |
1 files changed, 341 insertions, 0 deletions
diff --git a/iwidgets/generic/checkbox.itk b/iwidgets/generic/checkbox.itk new file mode 100644 index 00000000000..49e88887f76 --- /dev/null +++ b/iwidgets/generic/checkbox.itk @@ -0,0 +1,341 @@ +# +# Checkbox +# ---------------------------------------------------------------------- +# Implements a checkbuttonbox. Supports adding, inserting, deleting, +# selecting, and deselecting of checkbuttons by tag and index. +# +# ---------------------------------------------------------------------- +# AUTHOR: John A. Tucker EMAIL: jatucker@spd.dsccc.com +# +# ---------------------------------------------------------------------- +# Copyright (c) 1997 DSC Technologies Corporation +# ====================================================================== +# Permission to use, copy, modify, distribute and license this software +# and its documentation for any purpose, and without fee or written +# agreement with DSC, is hereby granted, provided that the above copyright +# notice appears in all copies and that both the copyright notice and +# warranty disclaimer below appear in supporting documentation, and that +# the names of DSC Technologies Corporation or DSC Communications +# Corporation not be used in advertising or publicity pertaining to the +# software without specific, written prior permission. +# +# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- +# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE +# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, +# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL +# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, +# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +# SOFTWARE. +# ====================================================================== + + +# +# Use option database to override default resources of base classes. +# +option add *Checkbox.labelMargin 10 widgetDefault +option add *Checkbox.labelFont \ + "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*" widgetDefault +option add *Checkbox.labelPos nw widgetDefault +option add *Checkbox.borderWidth 2 widgetDefault +option add *Checkbox.relief groove widgetDefault + +# +# Usual options. +# +itk::usual Checkbox { + keep -background -borderwidth -cursor -foreground -labelfont +} + +# ------------------------------------------------------------------ +# CHECKBOX +# ------------------------------------------------------------------ +itcl::class iwidgets::Checkbox { + inherit iwidgets::Labeledframe + + constructor {args} {} + + itk_option define -orient orient Orient vertical + + public { + method add {tag args} + method insert {index tag args} + method delete {index} + method get {{index ""}} + method index {index} + method select {index} + method deselect {index} + method flash {index} + method toggle {index} + method buttonconfigure {index args} + } + + private { + + method gettag {index} ;# Get the tag of the checkbutton associated + ;# with a numeric index + + variable _unique 0 ;# Unique id for choice creation. + variable _buttons {} ;# List of checkbutton tags. + common buttonVar ;# Array of checkbutton "-variables" + } +} + +# +# Provide a lowercased access method for the Checkbox class. +# +proc ::iwidgets::checkbox {pathName args} { + uplevel ::iwidgets::Checkbox $pathName $args +} + +# ------------------------------------------------------------------ +# CONSTRUCTOR +# ------------------------------------------------------------------ +itcl::body iwidgets::Checkbox::constructor {args} { + + eval itk_initialize $args +} + +# ------------------------------------------------------------------ +# OPTIONS +# ------------------------------------------------------------------ + +# ------------------------------------------------------------------ +# OPTION: -orient +# +# Allows the user to orient the checkbuttons either horizontally +# or vertically. Added by Chad Smith (csmith@adc.com) 3/10/00. +# ------------------------------------------------------------------ +itcl::configbody iwidgets::Checkbox::orient { + if {$itk_option(-orient) == "horizontal"} { + foreach tag $_buttons { + pack $itk_component($tag) -side left -anchor nw -padx 4 -expand 1 + } + } elseif {$itk_option(-orient) == "vertical"} { + foreach tag $_buttons { + pack $itk_component($tag) -side top -anchor w -padx 4 -expand 0 + } + } else { + error "Bad orientation: $itk_option(-orient). Should be\ + \"horizontal\" or \"vertical\"." + } +} + + +# ------------------------------------------------------------------ +# METHODS +# ------------------------------------------------------------------ + +# ------------------------------------------------------------------ +# METHOD: index index +# +# Searches the checkbutton tags in the checkbox for the one with the +# requested tag, numerical index, or keyword "end". Returns the +# choices's numerical index if found, otherwise error. +# ------------------------------------------------------------------ +itcl::body iwidgets::Checkbox::index {index} { + if {[llength $_buttons] > 0} { + if {[regexp {(^[0-9]+$)} $index]} { + if {$index < [llength $_buttons]} { + return $index + } else { + error "Checkbox index \"$index\" is out of range" + } + + } elseif {$index == "end"} { + return [expr {[llength $_buttons] - 1}] + + } else { + if {[set idx [lsearch $_buttons $index]] != -1} { + return $idx + } + + error "bad Checkbox index \"$index\": must be number, end,\ + or pattern" + } + + } else { + error "Checkbox \"$itk_component(hull)\" has no checkbuttons" + } +} + +# ------------------------------------------------------------------ +# METHOD: add tag ?option value option value ...? +# +# Add a new tagged checkbutton to the checkbox at the end. The method +# takes additional options which are passed on to the checkbutton +# constructor. These include most of the typical checkbutton +# options. The tag is returned. +# ------------------------------------------------------------------ +itcl::body iwidgets::Checkbox::add {tag args} { + itk_component add $tag { + eval checkbutton $itk_component(childsite).cb[incr _unique] \ + -variable [list [itcl::scope buttonVar($this,$tag)]] \ + -anchor w \ + -justify left \ + -highlightthickness 0 \ + $args + } { + usual + keep -command -disabledforeground -selectcolor -state + ignore -highlightthickness -highlightcolor + rename -font -labelfont labelFont Font + } + + # Redraw the buttons with the proper orientation. + if {$itk_option(-orient) == "vertical"} { + pack $itk_component($tag) -side top -anchor w -padx 4 -expand 0 + } else { + pack $itk_component($tag) -side left -anchor nw -expand 1 + } + + lappend _buttons $tag + + return $tag +} + +# ------------------------------------------------------------------ +# METHOD: insert index tag ?option value option value ...? +# +# Insert the tagged checkbutton in the checkbox just before the +# one given by index. Any additional options are passed on to the +# checkbutton constructor. These include the typical checkbutton +# options. The tag is returned. +# ------------------------------------------------------------------ +itcl::body iwidgets::Checkbox::insert {index tag args} { + itk_component add $tag { + eval checkbutton $itk_component(childsite).cb[incr _unique] \ + -variable [list [itcl::scope buttonVar($this,$tag)]] \ + -anchor w \ + -justify left \ + -highlightthickness 0 \ + $args + } { + usual + ignore -highlightthickness -highlightcolor + rename -font -labelfont labelFont Font + } + + set index [index $index] + set before [lindex $_buttons $index] + set _buttons [linsert $_buttons $index $tag] + + pack $itk_component($tag) -anchor w -padx 4 -before $itk_component($before) + + return $tag +} + +# ------------------------------------------------------------------ +# METHOD: delete index +# +# Delete the specified checkbutton. +# ------------------------------------------------------------------ +itcl::body iwidgets::Checkbox::delete {index} { + + set tag [gettag $index] + set index [index $index] + destroy $itk_component($tag) + set _buttons [lreplace $_buttons $index $index] + + if { [info exists buttonVar($this,$tag)] == 1 } { + unset buttonVar($this,$tag) + } +} + +# ------------------------------------------------------------------ +# METHOD: select index +# +# Select the specified checkbutton. +# ------------------------------------------------------------------ +itcl::body iwidgets::Checkbox::select {index} { + set tag [gettag $index] + #----------------------------------------------------------- + # BUG FIX: csmith (Chad Smith: csmith@adc.com), 3/30/99 + #----------------------------------------------------------- + # This method should only invoke the checkbutton if it's not + # already selected. Check its associated variable, and if + # it's set, then just ignore and return. + #----------------------------------------------------------- + if {[set [itcl::scope buttonVar($this,$tag)]] == + [[component $tag] cget -onvalue]} { + return + } + $itk_component($tag) invoke +} + +# ------------------------------------------------------------------ +# METHOD: toggle index +# +# Toggle a specified checkbutton between selected and unselected +# ------------------------------------------------------------------ +itcl::body iwidgets::Checkbox::toggle {index} { + set tag [gettag $index] + $itk_component($tag) toggle +} + +# ------------------------------------------------------------------ +# METHOD: get +# +# Return the value of the checkbutton with the given index, or a +# list of all checkbutton values in increasing order by index. +# ------------------------------------------------------------------ +itcl::body iwidgets::Checkbox::get {{index ""}} { + set result {} + + if {$index == ""} { + foreach tag $_buttons { + if {$buttonVar($this,$tag)} { + lappend result $tag + } + } + } else { + set tag [gettag $index] + set result $buttonVar($this,$tag) + } + + return $result +} + +# ------------------------------------------------------------------ +# METHOD: deselect index +# +# Deselect the specified checkbutton. +# ------------------------------------------------------------------ +itcl::body iwidgets::Checkbox::deselect {index} { + set tag [gettag $index] + $itk_component($tag) deselect +} + +# ------------------------------------------------------------------ +# METHOD: flash index +# +# Flash the specified checkbutton. +# ------------------------------------------------------------------ +itcl::body iwidgets::Checkbox::flash {index} { + set tag [gettag $index] + $itk_component($tag) flash +} + +# ------------------------------------------------------------------ +# METHOD: buttonconfigure index ?option? ?value option value ...? +# +# Configure a specified checkbutton. This method allows configuration +# of checkbuttons from the Checkbox level. The options may have any +# of the values accepted by the add method. +# ------------------------------------------------------------------ +itcl::body iwidgets::Checkbox::buttonconfigure {index args} { + set tag [gettag $index] + eval $itk_component($tag) configure $args +} + +# ------------------------------------------------------------------ +# METHOD: gettag index +# +# Return the tag of the checkbutton associated with a specified +# numeric index +# ------------------------------------------------------------------ +itcl::body iwidgets::Checkbox::gettag {index} { + return [lindex $_buttons [index $index]] +} |