summaryrefslogtreecommitdiff
path: root/itcl/iwidgets3.0.0/generic/spinint.itk
diff options
context:
space:
mode:
Diffstat (limited to 'itcl/iwidgets3.0.0/generic/spinint.itk')
-rw-r--r--itcl/iwidgets3.0.0/generic/spinint.itk275
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
+ }
+}