home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / spinint.itk < prev    next >
Text File  |  2003-09-01  |  8KB  |  238 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.3 2001/08/07 19:56:48 smithc 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. itcl::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. itcl::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. itcl::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. itcl::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. itcl::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. itcl::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.         $itk_component(entry) delete 0 end
  165.         $itk_component(entry) insert 0 $val
  166.     } else {
  167.         if {$itk_option(-wrap)} {
  168.         if {$val >= $max_range} {
  169.             $itk_component(entry) delete 0 end
  170.             $itk_component(entry) insert 0 $min_range 
  171.         } elseif {$val < $min_range} {
  172.             $itk_component(entry) delete 0 end
  173.             $itk_component(entry) insert 0 $min_range 
  174.         } else {
  175.             uplevel #0 $itk_option(-invalid)
  176.         }
  177.         } else {
  178.         uplevel #0 $itk_option(-invalid)
  179.         }
  180.     }
  181.     } else {
  182.     
  183.     #
  184.     # No boundaries.
  185.     #
  186.     incr val $itk_option(-step)
  187.     $itk_component(entry) delete 0 end
  188.     $itk_component(entry) insert 0 $val
  189.     }
  190. }
  191.  
  192. # ------------------------------------------------------------------
  193. # METHOD: down 
  194. #
  195. # Down arrow button press event.  Decrement value in entry.
  196. # ------------------------------------------------------------------
  197. itcl::body iwidgets::Spinint::down {} {
  198.     set min_range [lindex $itk_option(-range) 0]
  199.     set max_range [lindex $itk_option(-range) 1]
  200.     
  201.     set val [$itk_component(entry) get]
  202.     if {[lindex $itk_option(-range) 0] != ""} {
  203.     
  204.     #
  205.     # Check boundaries.
  206.     #
  207.     if {$val > $min_range && $val <= $max_range} {
  208.         incr val -$itk_option(-step)
  209.         $itk_component(entry) delete 0 end
  210.         $itk_component(entry) insert 0 $val
  211.     } else {
  212.         if {$itk_option(-wrap)} {
  213.         if {$val <= $min_range} {
  214.             $itk_component(entry) delete 0 end
  215.             $itk_component(entry) insert 0 $max_range
  216.         } elseif {$val > $max_range} {
  217.             $itk_component(entry) delete 0 end
  218.             $itk_component(entry) insert 0 $max_range
  219.         } else {
  220.             uplevel #0 $itk_option(-invalid)
  221.         }
  222.         } else {
  223.         uplevel #0 $itk_option(-invalid)
  224.         }
  225.     }
  226.     } else {
  227.     
  228.     #
  229.     # No boundaries.
  230.     #
  231.     incr val -$itk_option(-step)
  232.     $itk_component(entry) delete 0 end
  233.     $itk_component(entry) insert 0 $val
  234.     }
  235. }
  236.