home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / comanche.exe / lib / iwidgets3.0.0 / scripts / spinint.itk < prev    next >
Text File  |  1999-02-24  |  9KB  |  276 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:53:18 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. # Usual options.
  45. #
  46. itk::usual Spinint {
  47.     keep -background -borderwidth -cursor -foreground -highlightcolor \
  48.      -highlightthickness -insertbackground  -insertborderwidth \
  49.      -insertofftime -insertontime -insertwidth -labelfont \
  50.      -selectbackground -selectborderwidth -selectforeground \
  51.      -textbackground -textfont
  52. }
  53.  
  54. # ------------------------------------------------------------------
  55. #                            SPININT
  56. # ------------------------------------------------------------------
  57. class iwidgets::Spinint {
  58.     inherit iwidgets::Spinner 
  59.  
  60.     constructor {args} {
  61.     Spinner::constructor -validate numeric 
  62.     } {}
  63.  
  64.     itk_option define -range range Range "" 
  65.     itk_option define -step step Step 1 
  66.     itk_option define -wrap wrap Wrap true 
  67.  
  68.     public method up {}
  69.     public method down {}
  70. }
  71.  
  72. #
  73. # Provide a lowercased access method for the Spinint class.
  74. proc ::iwidgets::spinint {pathName args} {
  75.     uplevel ::iwidgets::Spinint $pathName $args
  76. }
  77.  
  78. # ------------------------------------------------------------------
  79. #                        CONSTRUCTOR
  80. # ------------------------------------------------------------------
  81. body iwidgets::Spinint::constructor {args} {
  82.     eval itk_initialize $args
  83.     
  84.     $itk_component(entry) delete 0 end
  85.     
  86.     if {[lindex $itk_option(-range) 0] == ""} {
  87.     $itk_component(entry) insert 0 "0"
  88.     } else { 
  89.     $itk_component(entry) insert 0 [lindex $itk_option(-range) 0] 
  90.     }
  91. }
  92.  
  93. # ------------------------------------------------------------------
  94. #                             OPTIONS
  95. # ------------------------------------------------------------------
  96.  
  97. # ------------------------------------------------------------------
  98. # OPTION: -range
  99. #
  100. # Set min and max values for spinner.
  101. # ------------------------------------------------------------------
  102. configbody iwidgets::Spinint::range {
  103.     if {$itk_option(-range) != ""} {
  104.     if {[llength $itk_option(-range)] != 2} {
  105.         error "wrong # args: should be\
  106.             \"$itk_component(hull) configure -range {begin end}\""
  107.         }
  108.  
  109.         set min [lindex $itk_option(-range) 0]
  110.         set max [lindex $itk_option(-range) 1]
  111.  
  112.         if {![regexp {^-?[0-9]+$} $min]} {
  113.             error "bad range option \"$min\": begin value must be\
  114.             an integer"
  115.         }
  116.         if {![regexp {^-?[0-9]+$} $max]} {
  117.             error "bad range option \"$max\": end value must be\
  118.             an integer"
  119.         }
  120.         if {$min > $max} {
  121.             error "bad option starting range \"$min\": must be less\
  122.             than ending: \"$max\""
  123.         }
  124.     } 
  125. }
  126.  
  127. # ------------------------------------------------------------------
  128. # OPTION: -step
  129. #
  130. # Increment spinner by step value.
  131. # ------------------------------------------------------------------
  132. configbody iwidgets::Spinint::step {
  133. }
  134.  
  135. # ------------------------------------------------------------------
  136. # OPTION: -wrap
  137. #
  138. # Specify whether spinner should wrap value if at min or max.
  139. # ------------------------------------------------------------------
  140. configbody iwidgets::Spinint::wrap {
  141. }
  142.  
  143. # ------------------------------------------------------------------
  144. #                            METHODS
  145. # ------------------------------------------------------------------
  146.  
  147. # ------------------------------------------------------------------
  148. # METHOD: up
  149. #
  150. # Up arrow button press event.  Increment value in entry.
  151. # ------------------------------------------------------------------
  152. body iwidgets::Spinint::up {} {
  153.     set min_range [lindex $itk_option(-range) 0]
  154.     set max_range [lindex $itk_option(-range) 1]
  155.     
  156.     set val [$itk_component(entry) get]
  157.     if {[lindex $itk_option(-range) 0] != ""} {
  158.     
  159.     #
  160.     # Check boundaries.
  161.     #
  162.     if {$val >= $min_range && $val < $max_range} {
  163.         incr val $itk_option(-step)
  164.         
  165.         #
  166.         # Re-check boundaries.
  167.         #
  168.         if {$val >= $min_range && $val <= $max_range} {
  169.         $itk_component(entry) delete 0 end
  170.         $itk_component(entry) insert 0 $val
  171.         } else {
  172.         
  173.         #
  174.         # This is wrap when -step > 1.
  175.         #
  176.         if {$itk_option(-wrap)} {
  177.             if {$val > $max_range} {
  178.             $itk_component(entry) delete 0 end
  179.             $itk_component(entry) insert 0 $min_range
  180.             } else {
  181.             uplevel #0 $itk_option(-invalid)
  182.             }
  183.         } else {
  184.             uplevel #0 $itk_option(-invalid)
  185.         }
  186.         }
  187.         
  188.     } else {
  189.         if {$itk_option(-wrap)} {
  190.         if {$val == $max_range} {
  191.             $itk_component(entry) delete 0 end
  192.             $itk_component(entry) insert 0 $min_range 
  193.         } else {
  194.             uplevel #0 $itk_option(-invalid)
  195.         }
  196.         } else {
  197.         uplevel #0 $itk_option(-invalid)
  198.         }
  199.     }
  200.     } else {
  201.     
  202.     #
  203.     # No boundaries.
  204.     #
  205.     incr val $itk_option(-step)
  206.     $itk_component(entry) delete 0 end
  207.     $itk_component(entry) insert 0 $val
  208.     }
  209. }
  210.  
  211. # ------------------------------------------------------------------
  212. # METHOD: down 
  213. #
  214. # Down arrow button press event.  Decrement value in entry.
  215. # ------------------------------------------------------------------
  216. body iwidgets::Spinint::down {} {
  217.     set min_range [lindex $itk_option(-range) 0]
  218.     set max_range [lindex $itk_option(-range) 1]
  219.     
  220.     set val [$itk_component(entry) get]
  221.     if {[lindex $itk_option(-range) 0] != ""} {
  222.     
  223.     #
  224.     # Check boundaries.
  225.     #
  226.     if {$val > $min_range && $val <= $max_range} {
  227.         incr val -$itk_option(-step)
  228.         
  229.         #
  230.         # Re-check boundaries.
  231.         #
  232.         if {$val >= $min_range && $val <= $max_range} {
  233.         $itk_component(entry) delete 0 end
  234.         $itk_component(entry) insert 0 $val
  235.         } else {
  236.         
  237.         #
  238.         # This is wrap when -step > 1.
  239.         #
  240.         if {$itk_option(-wrap)} {
  241.             if {$val < $min_range} {
  242.             $itk_component(entry) delete 0 end
  243.             $itk_component(entry) insert 0 $max_range
  244.             } else {
  245.             uplevel #0 $itk_option(-invalid)
  246.             }
  247.         } else {
  248.             uplevel #0 $itk_option(-invalid)
  249.         }
  250.         }
  251.         
  252.     } else {
  253.         if {$itk_option(-wrap)} {
  254.         if {$val == $min_range} {
  255.             $itk_component(entry) delete 0 end
  256.             $itk_component(entry) insert 0 $max_range
  257.         } else {
  258.             uplevel #0 $itk_option(-invalid)
  259.         }
  260.         } else {
  261.         uplevel #0 $itk_option(-invalid)
  262.         }
  263.     }
  264.     } else {
  265.     
  266.     #
  267.     # No boundaries.
  268.     #
  269.     incr val -$itk_option(-step)
  270.     $itk_component(entry) delete 0 end
  271.     $itk_component(entry) insert 0 $val
  272.     }
  273. }
  274.