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