home *** CD-ROM | disk | FTP | other *** search
- # 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: spinint.itk,v 1.3 2001/08/07 19:56:48 smithc Exp $
- # ----------------------------------------------------------------------
- # 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
- # ------------------------------------------------------------------
- itcl::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
- # ------------------------------------------------------------------
- itcl::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.
- # ------------------------------------------------------------------
- itcl::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.
- # ------------------------------------------------------------------
- itcl::configbody iwidgets::Spinint::step {
- }
-
- # ------------------------------------------------------------------
- # OPTION: -wrap
- #
- # Specify whether spinner should wrap value if at min or max.
- # ------------------------------------------------------------------
- itcl::configbody iwidgets::Spinint::wrap {
- }
-
- # ------------------------------------------------------------------
- # METHODS
- # ------------------------------------------------------------------
-
- # ------------------------------------------------------------------
- # METHOD: up
- #
- # Up arrow button press event. Increment value in entry.
- # ------------------------------------------------------------------
- itcl::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)
- $itk_component(entry) delete 0 end
- $itk_component(entry) insert 0 $val
- } else {
- if {$itk_option(-wrap)} {
- if {$val >= $max_range} {
- $itk_component(entry) delete 0 end
- $itk_component(entry) insert 0 $min_range
- } elseif {$val < $min_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.
- # ------------------------------------------------------------------
- itcl::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)
- $itk_component(entry) delete 0 end
- $itk_component(entry) insert 0 $val
- } else {
- if {$itk_option(-wrap)} {
- if {$val <= $min_range} {
- $itk_component(entry) delete 0 end
- $itk_component(entry) insert 0 $max_range
- } elseif {$val > $max_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
- }
- }
-