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 / spintime.itk < prev    next >
Text File  |  1999-02-24  |  16KB  |  528 lines

  1. # Spintime 
  2. # ----------------------------------------------------------------------
  3. # Implements a Time spinner widget.  A time spinner contains three
  4. # integer spinners:  one for hours, one for minutes and one for
  5. # seconds.  Options exist to manage to behavior, appearance, and
  6. # format of each component spinner.
  7. #
  8. # ----------------------------------------------------------------------
  9. #  AUTHOR: Sue Yockey                  EMAIL: yockey@actc.com
  10. #          Mark L. Ulferts                    mulferts@austin.dsccc.com
  11. #
  12. #   @(#) $Id: spintime.itk,v 1.1 1998/07/27 18:53:19 stanton Exp $
  13. # ----------------------------------------------------------------------
  14. #            Copyright (c) 1997 DSC Technologies Corporation
  15. # ======================================================================
  16. # Permission to use, copy, modify, distribute and license this software 
  17. # and its documentation for any purpose, and without fee or written 
  18. # agreement with DSC, is hereby granted, provided that the above copyright 
  19. # notice appears in all copies and that both the copyright notice and 
  20. # warranty disclaimer below appear in supporting documentation, and that 
  21. # the names of DSC Technologies Corporation or DSC Communications 
  22. # Corporation not be used in advertising or publicity pertaining to the 
  23. # software without specific, written prior permission.
  24. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  25. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  26. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  27. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  28. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  29. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  30. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  31. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  32. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  33. # SOFTWARE.
  34. # ======================================================================
  35.  
  36. #
  37. # Default resources.
  38. #
  39. option add *Spintime.hourLabel "Hour" widgetDefault
  40. option add *Spintime.minuteLabel "Minute" widgetDefault
  41. option add *Spintime.secondLabel "Second" widgetDefault
  42. option add *Spintime.hourWidth 3 widgetDefault
  43. option add *Spintime.minuteWidth 3 widgetDefault
  44. option add *Spintime.secondWidth 3 widgetDefault
  45.  
  46. #
  47. # Usual options.
  48. #
  49. itk::usual Spintime {
  50.     keep -background -cursor -foreground -labelfont -textbackground -textfont
  51. }
  52.  
  53. # ------------------------------------------------------------------
  54. #                            SPINTIME
  55. # ------------------------------------------------------------------
  56. class iwidgets::Spintime {
  57.     inherit itk::Widget 
  58.     
  59.     constructor {args} {}
  60.     destructor {}
  61.  
  62.     itk_option define -orient orient Orient vertical 
  63.     itk_option define -labelpos labelPos Position w 
  64.     itk_option define -houron hourOn HourOn true 
  65.     itk_option define -minuteon minuteOn MinuteOn true 
  66.     itk_option define -secondon secondOn SecondOn true 
  67.     itk_option define -timemargin timeMargin Margin 1 
  68.     itk_option define -militaryon militaryOn MilitaryOn true 
  69.  
  70.     public {
  71.     method get {{format "-string"}} 
  72.     method show {{date now}}
  73.     }
  74.     
  75.     protected {
  76.     method _packTime {{when later}}
  77.     method _down60 {comp}
  78.  
  79.     variable _repack {}             ;# Reconfiguration flag.
  80.     variable _interior
  81.     }
  82. }
  83.  
  84. #
  85. # Provide a lowercased access method for the Spintime class.
  86. proc ::iwidgets::spintime {pathName args} {
  87.     uplevel ::iwidgets::Spintime $pathName $args
  88. }
  89.  
  90. # ------------------------------------------------------------------
  91. #                        CONSTRUCTOR
  92. # ------------------------------------------------------------------
  93. body iwidgets::Spintime::constructor {args} {
  94.     set _interior $itk_interior
  95.     set clicks [clock seconds]
  96.  
  97.     #
  98.     # Create Hour Spinner
  99.     #
  100.     itk_component add hour {
  101.     iwidgets::Spinint $itk_interior.hour -fixed 2 -range {0 23} -justify right
  102.     } {
  103.     keep -background -cursor -arroworient -foreground \
  104.         -labelfont -labelmargin -relief -textbackground \
  105.         -textfont -repeatdelay -repeatinterval
  106.  
  107.     rename -labeltext -hourlabel hourLabel Text
  108.     rename -width -hourwidth hourWidth Width
  109.     }
  110.     
  111.     #
  112.     # Take off the default bindings for selction and motion.
  113.     #
  114.     bind [$itk_component(hour) component entry] <1> {break}
  115.     bind [$itk_component(hour) component entry] <Button1-Motion> {break}
  116.  
  117.     #
  118.     # Create Minute Spinner
  119.     #
  120.     itk_component add minute {
  121.     iwidgets::Spinint $itk_interior.minute \
  122.         -decrement [code $this _down60 minute] \
  123.         -fixed 2 -range {0 59} -justify right
  124.     } {
  125.     keep -background -cursor -arroworient -foreground \
  126.         -labelfont -labelmargin -relief -textbackground \
  127.         -textfont -repeatdelay -repeatinterval
  128.  
  129.     rename -labeltext -minutelabel minuteLabel Text
  130.     rename -width -minutewidth minuteWidth Width
  131.     }
  132.     
  133.     #
  134.     # Take off the default bindings for selction and motion.
  135.     #
  136.     bind [$itk_component(minute) component entry] <1> {break}
  137.     bind [$itk_component(minute) component entry] <Button1-Motion> {break}
  138.  
  139.     #
  140.     # Create Second Spinner
  141.     #
  142.     itk_component add second {
  143.     iwidgets::Spinint $itk_interior.second  \
  144.         -decrement [code $this _down60 second] \
  145.         -fixed 2 -range {0 59} -justify right
  146.     } {
  147.     keep -background -cursor -arroworient -foreground \
  148.         -labelfont -labelmargin -relief -textbackground \
  149.         -textfont -repeatdelay -repeatinterval
  150.  
  151.     rename -labeltext -secondlabel secondLabel Text
  152.     rename -width -secondwidth secondWidth Width
  153.     }
  154.  
  155.     #
  156.     # Take off the default bindings for selction and motion.
  157.     #
  158.     bind [$itk_component(second) component entry] <1> {break}
  159.     bind [$itk_component(second) component entry] <Button1-Motion> {break}
  160.  
  161.     #
  162.     # Initialize the widget based on the command line options.
  163.     #
  164.     eval itk_initialize $args
  165.  
  166.     # 
  167.     # Show the current time.
  168.     #
  169.     show now
  170. }
  171.     
  172. # ------------------------------------------------------------------
  173. #                           DESTRUCTOR
  174. # ------------------------------------------------------------------
  175. body iwidgets::Spintime::destructor {} {
  176.     if {$_repack != ""} {after cancel $_repack}
  177. }
  178.  
  179. # ------------------------------------------------------------------
  180. #                             OPTIONS
  181. # ------------------------------------------------------------------
  182.  
  183. # ------------------------------------------------------------------
  184. # OPTION: -orient
  185. # Specifies the orientation of the 3 spinners for Hour, Minute 
  186. # and second.
  187. # ------------------------------------------------------------------
  188. configbody iwidgets::Spintime::orient {
  189.     _packTime
  190. }
  191.  
  192. # ------------------------------------------------------------------
  193. # OPTION: -labelpos
  194. # Specifies the location of all 3 spinners' labels. 
  195. # Overloaded 
  196. # ------------------------------------------------------------------
  197. configbody iwidgets::Spintime::labelpos {
  198.     switch $itk_option(-labelpos) {
  199.     n {
  200.         $itk_component(hour) configure -labelpos n
  201.         $itk_component(minute) configure -labelpos n
  202.         $itk_component(second) configure -labelpos n
  203.         
  204.         #
  205.         # Un-align labels
  206.         #
  207.         $itk_component(hour) configure -labelmargin 1
  208.         $itk_component(minute) configure -labelmargin 1
  209.         $itk_component(second) configure -labelmargin 1
  210.     }
  211.     
  212.     s {
  213.         $itk_component(hour) configure -labelpos s
  214.         $itk_component(minute) configure -labelpos s
  215.         $itk_component(second) configure -labelpos s
  216.         
  217.         #
  218.         # Un-align labels
  219.         #
  220.         $itk_component(hour) configure -labelmargin 1
  221.         $itk_component(minute) configure -labelmargin 1
  222.         $itk_component(second) configure -labelmargin 1
  223.     }
  224.     
  225.     w {
  226.         $itk_component(hour) configure -labelpos w
  227.         $itk_component(minute) configure -labelpos w
  228.         $itk_component(second) configure -labelpos w
  229.     }
  230.     
  231.     e {
  232.         $itk_component(hour) configure -labelpos e
  233.         $itk_component(minute) configure -labelpos e
  234.         $itk_component(second) configure -labelpos e
  235.         
  236.         #
  237.         # Un-align labels
  238.         #
  239.         $itk_component(hour) configure -labelmargin 1
  240.         $itk_component(minute) configure -labelmargin 1
  241.         $itk_component(second) configure -labelmargin 1
  242.     }
  243.     
  244.     default {
  245.         error "bad labelpos option \"$itk_option(-labelpos)\",\
  246.             should be n, s, w or e"
  247.     }
  248.     }
  249.  
  250.     _packTime
  251. }
  252.  
  253. # ------------------------------------------------------------------
  254. # OPTION: -houron
  255. # Specifies whether or not to display the hour spinner.
  256. # ------------------------------------------------------------------
  257. configbody iwidgets::Spintime::houron {
  258.     _packTime
  259. }
  260.  
  261. # ------------------------------------------------------------------
  262. # OPTION: -minuteon
  263. # Specifies whether or not to display the minute spinner.
  264. # ------------------------------------------------------------------
  265. configbody iwidgets::Spintime::minuteon {
  266.     _packTime
  267. }
  268.  
  269. # ------------------------------------------------------------------
  270. # OPTION: -secondon
  271. # Specifies whether or not to display the second spinner.
  272. # ------------------------------------------------------------------
  273. configbody iwidgets::Spintime::secondon {
  274.     _packTime
  275. }
  276.  
  277.  
  278. # ------------------------------------------------------------------
  279. # OPTION: -timemargin
  280. # Specifies the margin space between the hour and minute spinners 
  281. # and the minute and second spinners. 
  282. # ------------------------------------------------------------------
  283. configbody iwidgets::Spintime::timemargin {
  284.     _packTime
  285. }
  286.  
  287. # ------------------------------------------------------------------
  288. # OPTION: -militaryon
  289. #
  290. # Specifies 24-hour clock or 12-hour.
  291. # ------------------------------------------------------------------
  292. configbody iwidgets::Spintime::militaryon {
  293.     set clicks [clock seconds]
  294.  
  295.     if {$itk_option(-militaryon)} {
  296.     $itk_component(hour) configure -range {0 23}
  297.     $itk_component(hour) delete 0 end
  298.     $itk_component(hour) insert end [clock format $clicks -format "%H"]
  299.     } else {
  300.     $itk_component(hour) configure -range {1 12}
  301.     $itk_component(hour) delete 0 end
  302.     $itk_component(hour) insert end [clock format $clicks -format "%I"]
  303.     }
  304. }
  305.  
  306. # ------------------------------------------------------------------
  307. #                            METHODS
  308. # ------------------------------------------------------------------
  309.  
  310. # ------------------------------------------------------------------
  311. # METHOD: get ?format?
  312. #
  313. # Get the value of the time spinner in one of two formats string or 
  314. # as an integer clock value using the -string and -clicks options 
  315. # respectively.  The default is by string.  Reference the clock 
  316. # command for more information on obtaining time and its formats.
  317. # ------------------------------------------------------------------
  318. body iwidgets::Spintime::get {{format "-string"}} {
  319.     set hour [$itk_component(hour) get]
  320.     set minute [$itk_component(minute) get]
  321.     set second [$itk_component(second) get]
  322.  
  323.     switch -- $format {
  324.     "-string" {
  325.         return "$hour:$minute:$second"
  326.     }
  327.     "-clicks" {
  328.         return [clock scan "$hour:$minute:$second"]
  329.     }
  330.     default {
  331.         error "bad format option \"$format\":\
  332.                    should be -string or -clicks"
  333.     }
  334.     }
  335. }
  336.  
  337. # ------------------------------------------------------------------
  338. # PUBLIC METHOD: show time
  339. #
  340. # Changes the currently displayed time to be that of the time
  341. # argument.  The time may be specified either as a string or an
  342. # integer clock value.  Reference the clock command for more 
  343. # information on obtaining time and its format.
  344. # ------------------------------------------------------------------
  345. body iwidgets::Spintime::show {{time "now"}} {
  346.     if {$time == "now"} {
  347.     set seconds [clock seconds]
  348.     } else {
  349.     if {[catch {clock format $time}] == 0} {
  350.         set seconds $time
  351.     } elseif {[catch {set seconds [clock scan $time]}] != 0} {
  352.         error "bad time: \"$time\", must be a valid time\
  353.                string, clock clicks value or the keyword now"
  354.     }
  355.     }
  356.  
  357.     $itk_component(hour) delete 0 end
  358.  
  359.     if {$itk_option(-militaryon)} {
  360.     scan [clock format $seconds -format "%H"] "%d" hour
  361.     } else {
  362.     scan hour [clock format $seconds -format "%I"] "%d" hour
  363.     }
  364.  
  365.     $itk_component(hour) insert end $hour
  366.  
  367.     $itk_component(minute) delete 0 end
  368.     scan [clock format $seconds -format "%M"] "%d" minute 
  369.     $itk_component(minute) insert end $minute
  370.  
  371.     $itk_component(second) delete 0 end
  372.     scan [clock format $seconds -format "%S"] "%d" seconds
  373.     $itk_component(second) insert end $seconds
  374.  
  375.     return
  376. }
  377.  
  378. # ------------------------------------------------------------------
  379. # PROTECTED METHOD: _packTime ?when?
  380. #
  381. # Pack components of time spinner.  If "when" is "now", the change 
  382. # is applied immediately.  If it is "later" or it is not specified,
  383. # then the change is applied later, when the application is idle.
  384. # ------------------------------------------------------------------
  385. body iwidgets::Spintime::_packTime {{when later}} {
  386.     if {$when == "later"} {
  387.     if {$_repack == ""} {
  388.         set _repack [after idle [code $this _packTime now]]
  389.     }
  390.     return
  391.     } elseif {$when != "now"} {
  392.     error "bad option \"$when\": should be now or later"
  393.     }
  394.  
  395.     for {set i 0} {$i < 5} {incr i} {
  396.     grid rowconfigure $_interior $i -minsize 0
  397.     grid columnconfigure $_interior $i -minsize 0
  398.     }
  399.  
  400.     if {$itk_option(-minuteon)} {
  401.     set minuteon 1
  402.     } else {
  403.     set minuteon 0
  404.     }
  405.     if {$itk_option(-secondon)} {
  406.     set secondon 1
  407.     } else {
  408.     set secondon 0
  409.     }
  410.  
  411.     set _repack ""
  412.  
  413.     switch $itk_option(-orient) {
  414.     vertical {
  415.         set row -1
  416.  
  417.         if {$itk_option(-houron)} {
  418.         grid $itk_component(hour) -row [incr row] -column 0 \
  419.             -sticky nsew 
  420.         } else {
  421.         grid forget $itk_component(hour)
  422.         }
  423.  
  424.         if {$itk_option(-minuteon)} {
  425.         if {$itk_option(-houron)} {
  426.             grid rowconfigure $_interior [incr row] \
  427.             -minsize $itk_option(-timemargin)
  428.         }
  429.  
  430.         grid $itk_component(minute) -row [incr row] -column 0 \
  431.             -sticky nsew 
  432.         } else {
  433.         grid forget $itk_component(minute)
  434.         }
  435.         
  436.         if {$itk_option(-secondon)} {
  437.         if {$minuteon || $secondon} {
  438.             grid rowconfigure $_interior [incr row] \
  439.             -minsize $itk_option(-timemargin)
  440.         }
  441.  
  442.         grid $itk_component(second) -row [incr row] -column 0 \
  443.             -sticky nsew 
  444.         } else {
  445.         grid forget $itk_component(second)
  446.         }
  447.         
  448.         if {$itk_option(-labelpos) == "w"} {
  449.         iwidgets::Labeledwidget::alignlabels $itk_component(hour) \
  450.             $itk_component(minute) $itk_component(second)
  451.         }
  452.     }
  453.     
  454.     horizontal {
  455.         set column -1
  456.  
  457.         if {$itk_option(-houron)} {
  458.         grid $itk_component(hour) -row 0 -column [incr column] \
  459.             -sticky nsew 
  460.         } else {
  461.         grid forget $itk_component(hour)
  462.         }
  463.         
  464.         if {$itk_option(-minuteon)} {
  465.         if {$itk_option(-houron)} {
  466.             grid columnconfigure $_interior [incr column] \
  467.             -minsize $itk_option(-timemargin)
  468.         }
  469.  
  470.         grid $itk_component(minute) -row 0 -column [incr column] \
  471.             -sticky nsew 
  472.         } else {
  473.         grid forget $itk_component(minute)
  474.         }
  475.         
  476.         if {$itk_option(-secondon)} {
  477.         if {$minuteon || $secondon} {
  478.             grid columnconfigure $_interior [incr column] \
  479.             -minsize $itk_option(-timemargin)
  480.         }
  481.  
  482.         grid $itk_component(second) -row 0 -column [incr column] \
  483.             -sticky nsew 
  484.         } else {
  485.         grid forget $itk_component(second)
  486.         }
  487.         
  488.         #
  489.         # Un-align labels
  490.         #
  491.         $itk_component(hour) configure -labelmargin 1
  492.         $itk_component(minute) configure -labelmargin 1
  493.         $itk_component(second) configure -labelmargin 1
  494.     }
  495.     
  496.     default {
  497.         error "bad orient option \"$itk_option(-orient)\", should\
  498.             be \"vertical\" or \"horizontal\""
  499.     }
  500.     } 
  501. }
  502.  
  503. # ------------------------------------------------------------------
  504. # METHOD: down60
  505. #
  506. # Down arrow button press event.  Decrement value in the minute
  507. # or second entry.
  508. # ------------------------------------------------------------------
  509. body iwidgets::Spintime::_down60 {comp} {
  510.     set step [$itk_component($comp) cget -step]
  511.     set val [$itk_component($comp) get]
  512.  
  513.     incr val -$step
  514.     if {$val < 0} {
  515.        set val [expr 60-$step]
  516.         }
  517.     $itk_component($comp) delete 0 end
  518.     $itk_component($comp) insert 0 $val
  519. }
  520.