home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / comanche.exe / lib / iwidgets2.2.0 / scripts / spinint.itk < prev    next >
Text File  |  1999-02-24  |  9KB  |  283 lines

  1. # Spinint 
  2. # ----------------------------------------------------------------------
  3. # Implements an integer spinner widget.  It inherits basic spinner
  4. # functionality from Spinner and adds specific features to create 
  5. # an integer-only spinner. 
  6. # Arrows may be placed horizontally or vertically.
  7. # User may specify an integer range and step value.
  8. # Spinner may be configured to wrap when min or max value is reached.
  9. #
  10. # NOTE:
  11. # Spinint integer values should not exceed the size of a long integer.
  12. # For a 32 bit long the integer range is -2147483648 to 2147483647.
  13. #
  14. # ----------------------------------------------------------------------
  15. #   AUTHOR:  Sue Yockey               Phone: (214) 519-2517
  16. #                                     E-mail: syockey@spd.dsccc.com
  17. #                                             yockey@acm.org
  18. #
  19. #   @(#) $Id: spinint.itk,v 1.1 1998/07/27 18:49:52 stanton Exp $
  20. # ----------------------------------------------------------------------
  21. #            Copyright (c) 1995 DSC Technologies Corporation
  22. # ======================================================================
  23. # Permission to use, copy, modify, distribute and license this software 
  24. # and its documentation for any purpose, and without fee or written 
  25. # agreement with DSC, is hereby granted, provided that the above copyright 
  26. # notice appears in all copies and that both the copyright notice and 
  27. # warranty disclaimer below appear in supporting documentation, and that 
  28. # the names of DSC Technologies Corporation or DSC Communications 
  29. # Corporation not be used in advertising or publicity pertaining to the 
  30. # software without specific, written prior permission.
  31. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  32. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  33. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  34. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  35. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  36. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  37. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  38. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  39. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  40. # SOFTWARE.
  41. # ======================================================================
  42.  
  43. #
  44. # Default resources.
  45. #
  46. option add *Spinint.relief sunken widgetDefault
  47. option add *Spinint.labelPos w widgetDefault
  48. option add *Spinint.labelMargin 2 widgetDefault
  49. option add *Spinint.auxLabelPos e widgetDefault
  50. option add *Spinint.auxLabelMargin 2 widgetDefault
  51.  
  52. #
  53. # Usual options.
  54. #
  55. itk::usual Spinint {
  56.     keep -background -borderwidth -cursor -foreground -highlightcolor \
  57.      -highlightthickness -insertbackground  -insertborderwidth \
  58.      -insertofftime -insertontime -insertwidth -labelfont \
  59.      -selectbackground -selectborderwidth -selectforeground \
  60.      -textbackground -textfont
  61. }
  62.  
  63. # ------------------------------------------------------------------
  64. #                            SPININT
  65. # ------------------------------------------------------------------
  66. class iwidgets::Spinint {
  67.     inherit iwidgets::Spinner 
  68.  
  69.     constructor {args} {
  70.     Spinner::constructor -validate numeric 
  71.     } {}
  72.  
  73.     itk_option define -range range Range "" 
  74.     itk_option define -step step Step 1 
  75.     itk_option define -wrap wrap Wrap true 
  76.  
  77.     public method up {}
  78.     public method down {}
  79. }
  80.  
  81. #
  82. # Provide a lowercased access method for the Spinint class.
  83. proc ::iwidgets::spinint {pathName args} {
  84.     uplevel ::iwidgets::Spinint $pathName $args
  85. }
  86.  
  87. # ------------------------------------------------------------------
  88. #                        CONSTRUCTOR
  89. # ------------------------------------------------------------------
  90. body iwidgets::Spinint::constructor {args} {
  91.     eval itk_initialize $args
  92.     
  93.     $itk_component(entry) delete 0 end
  94.     
  95.     if {[lindex $itk_option(-range) 0] == ""} {
  96.     $itk_component(entry) insert 0 "0"
  97.     } else { 
  98.     $itk_component(entry) insert 0 [lindex $itk_option(-range) 0] 
  99.     }
  100. }
  101.  
  102. # ------------------------------------------------------------------
  103. #                             OPTIONS
  104. # ------------------------------------------------------------------
  105.  
  106. # ------------------------------------------------------------------
  107. # OPTION: -range
  108. #
  109. # Set min and max values for spinner.
  110. # ------------------------------------------------------------------
  111. configbody iwidgets::Spinint::range {
  112.     if {$itk_option(-range) != ""} {
  113.     if {[llength $itk_option(-range)] != 2} {
  114.         error "wrong # args: should be\
  115.             \"$itk_component(hull) configure -range {begin end}\""
  116.         }
  117.         set min [lindex $itk_option(-range) 0]
  118.         set max [lindex $itk_option(-range) 1]
  119.         if {![regexp {^-?[0-9]+$} $min]} {
  120.             error "bad range option \"$min\": begin value must be\
  121.             an integer"
  122.         }
  123.         if {![regexp {^-?[0-9]+$} $max]} {
  124.             error "bad range option \"$max\": end value must be\
  125.             an integer"
  126.         }
  127.         if {$min > $max} {
  128.             error "bad option starting range \"$min\": must be less\
  129.             than ending: \"$max\""
  130.         }
  131.     } 
  132. }
  133.  
  134. # ------------------------------------------------------------------
  135. # OPTION: -step
  136. #
  137. # Increment spinner by step value.
  138. # ------------------------------------------------------------------
  139. configbody iwidgets::Spinint::step {
  140. }
  141.  
  142. # ------------------------------------------------------------------
  143. # OPTION: -wrap
  144. #
  145. # Specify whether spinner should wrap value if at min or max.
  146. # ------------------------------------------------------------------
  147. configbody iwidgets::Spinint::wrap {
  148. }
  149.  
  150. # ------------------------------------------------------------------
  151. #                            METHODS
  152. # ------------------------------------------------------------------
  153.  
  154. # ------------------------------------------------------------------
  155. # METHOD: up
  156. #
  157. # Up arrow button press event.  Increment value in entry.
  158. # ------------------------------------------------------------------
  159. body iwidgets::Spinint::up {} {
  160.     set min_range [lindex $itk_option(-range) 0]
  161.     set max_range [lindex $itk_option(-range) 1]
  162.     
  163.     set val [$itk_component(entry) get]
  164.     if {[lindex $itk_option(-range) 0] != ""} {
  165.     
  166.     #
  167.     # Check boundaries.
  168.     #
  169.     if {$val >= $min_range && $val < $max_range} {
  170.         incr val $itk_option(-step)
  171.         
  172.         #
  173.         # Re-check boundaries.
  174.         #
  175.         if {$val >= $min_range && $val <= $max_range} {
  176.         $itk_component(entry) delete 0 end
  177.         $itk_component(entry) insert 0 $val
  178.         } else {
  179.         
  180.         #
  181.         # This is wrap when -step > 1.
  182.         #
  183.         if {$itk_option(-wrap)} {
  184.             if {$val > $max_range} {
  185.             $itk_component(entry) delete 0 end
  186.             $itk_component(entry) insert 0 $min_range
  187.             } else {
  188.             uplevel #0 $itk_option(-invalid)
  189.             }
  190.         } else {
  191.             uplevel #0 $itk_option(-invalid)
  192.         }
  193.         }
  194.         
  195.     } else {
  196.         if {$itk_option(-wrap)} {
  197.         if {$val == $max_range} {
  198.             $itk_component(entry) delete 0 end
  199.             $itk_component(entry) insert 0 $min_range 
  200.         } else {
  201.             uplevel #0 $itk_option(-invalid)
  202.         }
  203.         } else {
  204.         uplevel #0 $itk_option(-invalid)
  205.         }
  206.     }
  207.     } else {
  208.     
  209.     #
  210.     # No boundaries.
  211.     #
  212.     incr val $itk_option(-step)
  213.     $itk_component(entry) delete 0 end
  214.     $itk_component(entry) insert 0 $val
  215.     }
  216. }
  217.  
  218. # ------------------------------------------------------------------
  219. # METHOD: down 
  220. #
  221. # Down arrow button press event.  Decrement value in entry.
  222. # ------------------------------------------------------------------
  223. body iwidgets::Spinint::down {} {
  224.     set min_range [lindex $itk_option(-range) 0]
  225.     set max_range [lindex $itk_option(-range) 1]
  226.     
  227.     set val [$itk_component(entry) get]
  228.     if {[lindex $itk_option(-range) 0] != ""} {
  229.     
  230.     #
  231.     # Check boundaries.
  232.     #
  233.     if {$val > $min_range && $val <= $max_range} {
  234.         incr val -$itk_option(-step)
  235.         
  236.         #
  237.         # Re-check boundaries.
  238.         #
  239.         if {$val >= $min_range && $val <= $max_range} {
  240.         $itk_component(entry) delete 0 end
  241.         $itk_component(entry) insert 0 $val
  242.         } else {
  243.         
  244.         #
  245.         # This is wrap when -step > 1.
  246.         #
  247.         if {$itk_option(-wrap)} {
  248.             if {$val < $min_range} {
  249.             $itk_component(entry) delete 0 end
  250.             $itk_component(entry) insert 0 $max_range
  251.             } else {
  252.             uplevel #0 $itk_option(-invalid)
  253.             }
  254.         } else {
  255.             uplevel #0 $itk_option(-invalid)
  256.         }
  257.         }
  258.         
  259.     } else {
  260.         if {$itk_option(-wrap)} {
  261.         if {$val == $min_range} {
  262.             $itk_component(entry) delete 0 end
  263.             $itk_component(entry) insert 0 $max_range
  264.         } else {
  265.             uplevel #0 $itk_option(-invalid)
  266.         }
  267.         } else {
  268.         uplevel #0 $itk_option(-invalid)
  269.         }
  270.     }
  271.     } else {
  272.     
  273.     #
  274.     # No boundaries.
  275.     #
  276.     incr val -$itk_option(-step)
  277.     $itk_component(entry) delete 0 end
  278.     $itk_component(entry) insert 0 $val
  279.     }
  280. }
  281.