diff options
Diffstat (limited to 'itcl/iwidgets3.0.0/generic/spinint.itk')
-rw-r--r-- | itcl/iwidgets3.0.0/generic/spinint.itk | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/itcl/iwidgets3.0.0/generic/spinint.itk b/itcl/iwidgets3.0.0/generic/spinint.itk new file mode 100644 index 00000000000..2c3310394da --- /dev/null +++ b/itcl/iwidgets3.0.0/generic/spinint.itk @@ -0,0 +1,275 @@ +# Spinint +# ---------------------------------------------------------------------- +# Implements an integer spinner widget. It inherits basic spinner +# functionality from Spinner and adds specific features to create +# an integer-only spinner. +# Arrows may be placed horizontally or vertically. +# User may specify an integer range and step value. +# Spinner may be configured to wrap when min or max value is reached. +# +# NOTE: +# Spinint integer values should not exceed the size of a long integer. +# For a 32 bit long the integer range is -2147483648 to 2147483647. +# +# ---------------------------------------------------------------------- +# AUTHOR: Sue Yockey Phone: (214) 519-2517 +# E-mail: syockey@spd.dsccc.com +# yockey@acm.org +# +# @(#) $Id$ +# ---------------------------------------------------------------------- +# Copyright (c) 1995 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. +# ====================================================================== + +# +# Usual options. +# +itk::usual Spinint { + keep -background -borderwidth -cursor -foreground -highlightcolor \ + -highlightthickness -insertbackground -insertborderwidth \ + -insertofftime -insertontime -insertwidth -labelfont \ + -selectbackground -selectborderwidth -selectforeground \ + -textbackground -textfont +} + +# ------------------------------------------------------------------ +# SPININT +# ------------------------------------------------------------------ +class iwidgets::Spinint { + inherit iwidgets::Spinner + + constructor {args} { + Spinner::constructor -validate numeric + } {} + + itk_option define -range range Range "" + itk_option define -step step Step 1 + itk_option define -wrap wrap Wrap true + + public method up {} + public method down {} +} + +# +# Provide a lowercased access method for the Spinint class. +# +proc ::iwidgets::spinint {pathName args} { + uplevel ::iwidgets::Spinint $pathName $args +} + +# ------------------------------------------------------------------ +# CONSTRUCTOR +# ------------------------------------------------------------------ +body iwidgets::Spinint::constructor {args} { + eval itk_initialize $args + + $itk_component(entry) delete 0 end + + if {[lindex $itk_option(-range) 0] == ""} { + $itk_component(entry) insert 0 "0" + } else { + $itk_component(entry) insert 0 [lindex $itk_option(-range) 0] + } +} + +# ------------------------------------------------------------------ +# OPTIONS +# ------------------------------------------------------------------ + +# ------------------------------------------------------------------ +# OPTION: -range +# +# Set min and max values for spinner. +# ------------------------------------------------------------------ +configbody iwidgets::Spinint::range { + if {$itk_option(-range) != ""} { + if {[llength $itk_option(-range)] != 2} { + error "wrong # args: should be\ + \"$itk_component(hull) configure -range {begin end}\"" + } + + set min [lindex $itk_option(-range) 0] + set max [lindex $itk_option(-range) 1] + + if {![regexp {^-?[0-9]+$} $min]} { + error "bad range option \"$min\": begin value must be\ + an integer" + } + if {![regexp {^-?[0-9]+$} $max]} { + error "bad range option \"$max\": end value must be\ + an integer" + } + if {$min > $max} { + error "bad option starting range \"$min\": must be less\ + than ending: \"$max\"" + } + } +} + +# ------------------------------------------------------------------ +# OPTION: -step +# +# Increment spinner by step value. +# ------------------------------------------------------------------ +configbody iwidgets::Spinint::step { +} + +# ------------------------------------------------------------------ +# OPTION: -wrap +# +# Specify whether spinner should wrap value if at min or max. +# ------------------------------------------------------------------ +configbody iwidgets::Spinint::wrap { +} + +# ------------------------------------------------------------------ +# METHODS +# ------------------------------------------------------------------ + +# ------------------------------------------------------------------ +# METHOD: up +# +# Up arrow button press event. Increment value in entry. +# ------------------------------------------------------------------ +body iwidgets::Spinint::up {} { + set min_range [lindex $itk_option(-range) 0] + set max_range [lindex $itk_option(-range) 1] + + set val [$itk_component(entry) get] + if {[lindex $itk_option(-range) 0] != ""} { + + # + # Check boundaries. + # + if {$val >= $min_range && $val < $max_range} { + incr val $itk_option(-step) + + # + # Re-check boundaries. + # + if {$val >= $min_range && $val <= $max_range} { + $itk_component(entry) delete 0 end + $itk_component(entry) insert 0 $val + } else { + + # + # This is wrap when -step > 1. + # + if {$itk_option(-wrap)} { + if {$val > $max_range} { + $itk_component(entry) delete 0 end + $itk_component(entry) insert 0 $min_range + } else { + uplevel #0 $itk_option(-invalid) + } + } else { + uplevel #0 $itk_option(-invalid) + } + } + + } else { + if {$itk_option(-wrap)} { + if {$val == $max_range} { + $itk_component(entry) delete 0 end + $itk_component(entry) insert 0 $min_range + } else { + uplevel #0 $itk_option(-invalid) + } + } else { + uplevel #0 $itk_option(-invalid) + } + } + } else { + + # + # No boundaries. + # + incr val $itk_option(-step) + $itk_component(entry) delete 0 end + $itk_component(entry) insert 0 $val + } +} + +# ------------------------------------------------------------------ +# METHOD: down +# +# Down arrow button press event. Decrement value in entry. +# ------------------------------------------------------------------ +body iwidgets::Spinint::down {} { + set min_range [lindex $itk_option(-range) 0] + set max_range [lindex $itk_option(-range) 1] + + set val [$itk_component(entry) get] + if {[lindex $itk_option(-range) 0] != ""} { + + # + # Check boundaries. + # + if {$val > $min_range && $val <= $max_range} { + incr val -$itk_option(-step) + + # + # Re-check boundaries. + # + if {$val >= $min_range && $val <= $max_range} { + $itk_component(entry) delete 0 end + $itk_component(entry) insert 0 $val + } else { + + # + # This is wrap when -step > 1. + # + if {$itk_option(-wrap)} { + if {$val < $min_range} { + $itk_component(entry) delete 0 end + $itk_component(entry) insert 0 $max_range + } else { + uplevel #0 $itk_option(-invalid) + } + } else { + uplevel #0 $itk_option(-invalid) + } + } + + } else { + if {$itk_option(-wrap)} { + if {$val == $min_range} { + $itk_component(entry) delete 0 end + $itk_component(entry) insert 0 $max_range + } else { + uplevel #0 $itk_option(-invalid) + } + } else { + uplevel #0 $itk_option(-invalid) + } + } + } else { + + # + # No boundaries. + # + incr val -$itk_option(-step) + $itk_component(entry) delete 0 end + $itk_component(entry) insert 0 $val + } +} |