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 / spindate.itk < prev    next >
Text File  |  1999-02-24  |  19KB  |  606 lines

  1. # Spindate 
  2. # ----------------------------------------------------------------------
  3. # Implements a Date spinner widget.  A date spinner contains three
  4. # Spinner widgets:  one Spinner for months, one SpinInt for days,
  5. # and one SpinInt for years.  Months can be specified as abbreviated
  6. # strings, integers or a user-defined list.  Options exist to manage to 
  7. # behavior, appearance, and format of each component spinner.
  8. #
  9. # ----------------------------------------------------------------------
  10. #   AUTHOR:  Sue Yockey               Phone: (214) 519-2517
  11. #                                     E-mail: syockey@spd.dsccc.com
  12. #                                             yockey@actc.com
  13. #
  14. #   @(#) $Id: spindate.itk,v 1.1 1998/07/27 18:49:51 stanton Exp $
  15. # ----------------------------------------------------------------------
  16. #            Copyright (c) 1995 DSC Technologies Corporation
  17. # ======================================================================
  18. # Permission to use, copy, modify, distribute and license this software 
  19. # and its documentation for any purpose, and without fee or written 
  20. # agreement with DSC, is hereby granted, provided that the above copyright 
  21. # notice appears in all copies and that both the copyright notice and 
  22. # warranty disclaimer below appear in supporting documentation, and that 
  23. # the names of DSC Technologies Corporation or DSC Communications 
  24. # Corporation not be used in advertising or publicity pertaining to the 
  25. # software without specific, written prior permission.
  26. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  27. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  28. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  29. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  30. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  31. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  32. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  33. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  34. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  35. # SOFTWARE.
  36. # ======================================================================
  37.  
  38. #
  39. # Default resources.
  40. #
  41. option add *Spindate.monthLabel "Month" widgetDefault
  42. option add *Spindate.dayLabel "Day" widgetDefault
  43. option add *Spindate.yearLabel "Year" widgetDefault
  44. option add *Spindate.monthWidth 4 widgetDefault
  45. option add *Spindate.dayWidth 4 widgetDefault
  46. option add *Spindate.yearWidth 4 widgetDefault
  47.  
  48. #
  49. # Usual options.
  50. #
  51. itk::usual Spindate {
  52.     keep -background -cursor -foreground -highlightcolor -highlightthickness \
  53.      -labelfont -selectbackground -selectborderwidth -selectforeground \
  54.      -textbackground -textfont 
  55. }
  56.  
  57. # ------------------------------------------------------------------
  58. #                            SPINDATE
  59. # ------------------------------------------------------------------
  60. class iwidgets::Spindate {
  61.     inherit itk::Widget 
  62.     
  63.     constructor {args} {}
  64.     destructor {}
  65.     
  66.     itk_option define -labelpos labelPos Position w
  67.     itk_option define -orient orient Orient vertical 
  68.     itk_option define -monthon monthOn MonthOn true 
  69.     itk_option define -dayon dayOn DayOn true 
  70.     itk_option define -yearon yearOn YearOn true 
  71.     itk_option define -datemargin dateMargin Margin 1 
  72.     itk_option define -yeardigits yearDigits YearDigits 2 
  73.     itk_option define -monthformat monthFormat MonthFormat integer 
  74.  
  75.     public method get {{component all}} 
  76.     public method insert {component index string} 
  77.     public method delete {args} 
  78.     public method clear {} 
  79.  
  80.     protected method _packDate {{when later}} 
  81.  
  82.     private method _spinMonth {direction} 
  83.     private method _blockInput {obj char} 
  84.  
  85.     common MONTH_STR {Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec}
  86.     common MONTH_INT {1 2 3 4 5 6 7 8 9 10 11 12}
  87.     
  88.     protected variable _repack {}             ;# Reconfiguration flag.
  89.     private variable MONTH_LIST {}            ;# Private copy of month list.
  90. }
  91.  
  92. #
  93. # Provide a lowercased access method for the Spindate class.
  94. proc ::iwidgets::spindate {pathName args} {
  95.     uplevel ::iwidgets::Spindate $pathName $args
  96. }
  97.  
  98. # ------------------------------------------------------------------
  99. #                        CONSTRUCTOR
  100. # ------------------------------------------------------------------
  101. body iwidgets::Spindate::constructor {args} {
  102.     #
  103.     # Create Month Spinner
  104.     #
  105.     itk_component add month {
  106.     iwidgets::Spinner $itk_interior.month  -fixed 2 \
  107.         -decrement [code $this _spinMonth -1] \
  108.         -increment [code $this _spinMonth 1] \
  109.         -validate "$this _blockInput"
  110.     } {
  111.     keep -background -cursor -arroworient -foreground \
  112.         -highlightcolor -highlightthickness \
  113.         -labelfont -labelmargin -relief -selectbackground \
  114.         -selectborderwidth -selectforeground -textbackground \
  115.         -textfont -repeatdelay -repeatinterval
  116.  
  117.     rename -labeltext -monthlabel monthLabel Text
  118.     rename -width -monthwidth monthWidth Width
  119.     }
  120.     pack $itk_component(month) -fill x
  121.     $itk_component(month) insert 0 1
  122.     set MONTH_LIST $MONTH_INT
  123.     
  124.     #
  125.     # Create Margin Frame 
  126.     #
  127.     itk_component add mth_day_marg {
  128.     frame $itk_interior.mth_day_marg
  129.     } {
  130.     keep -background -cursor
  131.     }
  132.     pack $itk_component(mth_day_marg)
  133.     
  134.     #
  135.     # Create Day Spinner
  136.     #
  137.     itk_component add day {
  138.     iwidgets::Spinint $itk_interior.day -range {1 31} -fixed 2
  139.     } {
  140.     keep -background -cursor -arroworient -foreground \
  141.         -highlightcolor -highlightthickness \
  142.         -labelfont -labelmargin -relief -step -selectbackground \
  143.         -selectborderwidth -selectforeground -textbackground \
  144.         -textfont -repeatdelay -repeatinterval
  145.  
  146.     rename -labeltext -daylabel dayLabel Text
  147.     rename -width -daywidth dayWidth Width
  148.     }
  149.     pack $itk_component(day) -fill x
  150.     
  151.     #
  152.     # Create Margin Frame 
  153.     #
  154.     itk_component add day_yr_marg {
  155.     frame $itk_interior.day_yr_marg
  156.     } {
  157.     keep -background -cursor
  158.     }
  159.     pack $itk_component(day_yr_marg)
  160.     
  161.     #
  162.     # Create Year Spinner
  163.     #
  164.     itk_component add year {
  165.     iwidgets::Spinint $itk_interior.year -range {0 99} -fixed 2
  166.     } {
  167.     keep -background -cursor -arroworient -foreground \
  168.         -highlightcolor -highlightthickness \
  169.         -labelfont -labelmargin -relief -step -selectbackground \
  170.         -selectborderwidth -selectforeground -textbackground \
  171.         -textfont -repeatdelay -repeatinterval
  172.  
  173.     rename -labeltext -yearlabel yearLabel Text
  174.     rename -width -yearwidth yearWidth Width
  175.     }
  176.     pack $itk_component(year) -fill x
  177.     $itk_component(year) clear 
  178.     $itk_component(year) insert 0 "95" 
  179.  
  180.     #
  181.     # Explicitly handle configs that may have been ignored earlier.
  182.     #
  183.     eval itk_initialize $args
  184.     # 
  185.  
  186.     # When idle, pack the date spinner.
  187.     #
  188.     _packDate
  189. }
  190.  
  191. # ------------------------------------------------------------------
  192. #                           DESTRUCTOR
  193. # ------------------------------------------------------------------
  194. body iwidgets::Spindate::destructor {} {
  195.     if {$_repack != ""} {after cancel $_repack}
  196. }
  197.  
  198. # ------------------------------------------------------------------
  199. #                             OPTIONS
  200. # ------------------------------------------------------------------
  201.  
  202. # ------------------------------------------------------------------
  203. # OPTION: -labelpos
  204. #
  205. # Specifies the location of all 3 spinners' labels.
  206. # ------------------------------------------------------------------
  207. configbody iwidgets::Spindate::labelpos {
  208.     switch $itk_option(-labelpos) {
  209.     n {
  210.         $itk_component(month) configure -labelpos n
  211.         $itk_component(day) configure -labelpos n
  212.         $itk_component(year) configure -labelpos n
  213.         
  214.         #
  215.         # Un-align labels
  216.         #
  217.         $itk_component(month) configure -labelmargin 1
  218.         $itk_component(day) configure -labelmargin 1
  219.         $itk_component(year) configure -labelmargin 1 
  220.     }
  221.     
  222.     s {
  223.         $itk_component(month) configure -labelpos s
  224.         $itk_component(day) configure -labelpos s
  225.         $itk_component(year) configure -labelpos s
  226.         
  227.         #
  228.         # Un-align labels
  229.         #
  230.         $itk_component(month) configure -labelmargin 1
  231.         $itk_component(day) configure -labelmargin 1
  232.         $itk_component(year) configure -labelmargin 1 
  233.     }
  234.     
  235.     w {
  236.         $itk_component(month) configure -labelpos w
  237.         $itk_component(day) configure -labelpos w
  238.         $itk_component(year) configure -labelpos w
  239.     }
  240.     
  241.     e {
  242.         $itk_component(month) configure -labelpos e
  243.         $itk_component(day) configure -labelpos e
  244.         $itk_component(year) configure -labelpos e
  245.         
  246.         #
  247.         # Un-align labels
  248.         #
  249.         $itk_component(month) configure -labelmargin 1
  250.         $itk_component(day) configure -labelmargin 1
  251.         $itk_component(year) configure -labelmargin 1 
  252.     }
  253.     
  254.     default {
  255.         error "bad labelpos option \"$itk_option(-labelpos)\",\
  256.             should be n, s, w or e" 
  257.     }
  258.     }
  259.  
  260.     _packDate
  261. }
  262.  
  263. # ------------------------------------------------------------------
  264. # OPTION: -orient
  265. # Specifies the orientation of the 3 spinners for Month, Day 
  266. # and year.
  267. # ------------------------------------------------------------------
  268. configbody iwidgets::Spindate::orient {
  269.     _packDate
  270. }
  271.  
  272. # ------------------------------------------------------------------
  273. # OPTION: -monthon
  274. # Specifies whether or not to display the month spinner.
  275. # ------------------------------------------------------------------
  276. configbody iwidgets::Spindate::monthon {
  277.     if {$itk_option(-monthon)} {
  278.     _packDate
  279.     } else {
  280.     pack forget $itk_component(month)
  281.     }
  282. }
  283.  
  284. # ------------------------------------------------------------------
  285. # OPTION: -dayon
  286. # Specifies whether or not to display the day spinner.
  287. # ------------------------------------------------------------------
  288. configbody iwidgets::Spindate::dayon {
  289.     if {$itk_option(-dayon)} {
  290.     _packDate
  291.     } else {
  292.     pack forget $itk_component(day)
  293.     }
  294. }
  295.  
  296. # ------------------------------------------------------------------
  297. # OPTION: -yearon
  298. # Specifies whether or not to display the year spinner.
  299. # ------------------------------------------------------------------
  300. configbody iwidgets::Spindate::yearon {
  301.     if {$itk_option(-yearon)} {
  302.     _packDate
  303.     } else {
  304.     pack forget $itk_component(year)
  305.     }
  306. }
  307.  
  308. # ------------------------------------------------------------------
  309. # OPTION: -datemargin
  310. # Specifies the margin space between the month and day spinners 
  311. # and the day and year spinners. 
  312. # ------------------------------------------------------------------
  313. configbody iwidgets::Spindate::datemargin {
  314.     _packDate
  315. }
  316.  
  317. # ------------------------------------------------------------------
  318. # OPTION: -yeardigits
  319. #
  320. # Number of digits for year display, 2 or 4 
  321. # ------------------------------------------------------------------
  322. configbody iwidgets::Spindate::yeardigits {
  323.     switch $itk_option(-yeardigits) {
  324.     "2" {
  325.         $itk_component(year) configure -width 4 -range {0 99} \
  326.             -fixed 2
  327.         $itk_component(year) clear
  328.         $itk_component(year) insert 0 95
  329.     }
  330.     
  331.     "4" {
  332.         $itk_component(year) configure -width 4 \
  333.             -range {1900 9999} -fixed 4
  334.         $itk_component(year) clear
  335.         $itk_component(year) insert 0 1995
  336.     }
  337.     
  338.     default {
  339.         error "bad yeardigits option \"$itk_option(-yeardigits)\",\
  340.             should be 2 or 4"
  341.     }
  342.     } 
  343. }
  344.  
  345. # ------------------------------------------------------------------
  346. # OPTION: -monthformat
  347. #
  348. # Format of month display, integers (1-12) or strings (Jan - Dec),
  349. # or a user specified list of values.
  350. # ------------------------------------------------------------------
  351. configbody iwidgets::Spindate::monthformat {
  352.     if {$itk_option(-monthformat) == "string"} {
  353.     set MONTH_LIST $MONTH_STR
  354.     
  355.     $itk_component(month) configure -width 4 -fixed 4
  356.     $itk_component(month) delete 0 end
  357.     $itk_component(month) insert 0 [lindex $MONTH_LIST 0]
  358.     
  359.     } elseif {$itk_option(-monthformat) == "integer"} {
  360.     set MONTH_LIST $MONTH_INT
  361.     
  362.     $itk_component(month) configure -width 4 -fixed 2 
  363.     $itk_component(month) delete 0 end
  364.     $itk_component(month) insert 0 [lindex $MONTH_LIST 0]
  365.     
  366.     } elseif {[llength $itk_option(-monthformat)] > 1} {
  367.     set MONTH_LIST $itk_option(-monthformat) 
  368.     
  369.     set len [llength $MONTH_LIST]
  370.     for {set i 0; set wid 0} {$i < $len} {incr i} {
  371.         set tmp [string length [lindex $MONTH_LIST $i]]
  372.         if { $tmp > $wid} { set wid $tmp }
  373.     }
  374.     if {$wid < 4} { set wid 4}
  375.     
  376.     $itk_component(month) configure -width $wid -fixed $wid
  377.     $itk_component(month) delete 0 end
  378.     $itk_component(month) insert 0 [lindex $MONTH_LIST 0]
  379.     
  380.     } else {
  381.     error "bad monthformat option\
  382.         \"$itk_option(-monthformat)\", should be\
  383.         \"integer\", \"string\" or a list"
  384.     }
  385. }
  386.  
  387. # ------------------------------------------------------------------
  388. #                            METHODS
  389. # ------------------------------------------------------------------
  390.  
  391. # ------------------------------------------------------------------
  392. # METHOD: get ?component?
  393. #
  394. # Get the value of the date spinner.  A specific component value
  395. # may be obtained via component name month, day, or year.  Without
  396. # component name the command returns the date in a list, formatted
  397. # {MM DD YY[YY]}.
  398. # ------------------------------------------------------------------
  399. body iwidgets::Spindate::get {{component all}} { 
  400.     switch $component {
  401.     all {
  402.         return [list [$itk_component(month) get] \
  403.             [$itk_component(day) get] [$itk_component(year) get]]
  404.     }
  405.     
  406.     month {
  407.         return [$itk_component(month) get]
  408.     }
  409.     
  410.     day {
  411.         return [$itk_component(day) get]
  412.     }
  413.     
  414.     year {
  415.         return [$itk_component(year) get]
  416.     }
  417.     
  418.     default {
  419.         error "bad get argument \"$component\": should\
  420.             be month, day or year"
  421.     }
  422.     }
  423. }
  424.  
  425. # ------------------------------------------------------------------
  426. # METHOD: insert component index string
  427. #
  428. # Insert value into month, day or year EntryFields
  429. # ------------------------------------------------------------------
  430. body iwidgets::Spindate::insert {component index string} {
  431.     switch $component {
  432.     month {
  433.         return [$itk_component(month) insert $index $string]
  434.     }
  435.     day {
  436.         return [$itk_component(day) insert $index $string]
  437.     }
  438.     year {
  439.         return [$itk_component(year) insert $index $string]
  440.     }
  441.     default {
  442.         error "bad insert argument \"$component\": should\
  443.             be month, day or year"
  444.     }
  445.     }
  446. }
  447.  
  448. # ------------------------------------------------------------------
  449. # METHOD: delete component first ?last?
  450. #
  451. # Delete value in month, day or year EntryFields
  452. # ------------------------------------------------------------------
  453. body iwidgets::Spindate::delete {component first {last {}}} {
  454.     if {$last == {}} {
  455.     set last $first
  456.     }
  457.     
  458.     switch $component {
  459.     month {
  460.         return [$itk_component(month) delete $first $last] 
  461.     }
  462.     day {
  463.         return [$itk_component(day) delete $first $last]
  464.     }
  465.     year {
  466.         return [$itk_component(year) delete $first $last]
  467.     }
  468.     default {
  469.         error "bad delete argument \"$component\": should\
  470.             be month, day or year"
  471.     }
  472.     }
  473. }
  474.  
  475. # ------------------------------------------------------------------
  476. # METHOD: clear
  477. #
  478. # Clear the values in all spinner components.
  479. # ------------------------------------------------------------------
  480. body iwidgets::Spindate::clear {} {
  481.     $itk_component(month) clear
  482.     $itk_component(day) clear
  483.     $itk_component(year) clear 
  484. }
  485.  
  486. # ----------------------------------------------------------------
  487. # PRIVATE METHOD: _spinMonth direction
  488. #
  489. # Increment or decrement month value.
  490. # ----------------------------------------------------------------
  491. body iwidgets::Spindate::_spinMonth {direction} {
  492.     set mth [$itk_component(month) get]
  493.     set index [expr [lsearch $MONTH_LIST $mth] + $direction]
  494.     
  495.     set length [llength $MONTH_LIST]
  496.     if {$index < 0} { set index [expr $length - 1] }
  497.     if {$index >= $length} { set index 0 } 
  498.     
  499.     $itk_component(month) delete 0 end
  500.     $itk_component(month) insert 0 [lindex $MONTH_LIST $index]
  501. }
  502.  
  503. # ----------------------------------------------------------------
  504. # PRIVATE METHOD: _blockInput obj char
  505. #
  506. # Disable spinner input.
  507. # ----------------------------------------------------------------
  508. body iwidgets::Spindate::_blockInput {obj char} {
  509.     return 0 
  510. }
  511.  
  512. # ------------------------------------------------------------------
  513. # PRIVATE METHOD: _packDate when
  514. #
  515. # Pack the components of the date spinner.  If "when" is "now", the 
  516. # change is applied immediately.  If it is "later" or it is not 
  517. # specified, then the change is applied later, when the application 
  518. # is idle.
  519. # ------------------------------------------------------------------
  520. body iwidgets::Spindate::_packDate {{when later}} {
  521.     if {$when == "later"} {
  522.     if {$_repack == ""} {
  523.         set _repack [after idle [code $this _packDate now]]
  524.     }
  525.     return
  526.     } elseif {$when != "now"} {
  527.     error "bad option \"$when\": should be now or later"
  528.     }
  529.  
  530.     set _repack ""
  531.  
  532.     switch $itk_option(-orient) {
  533.     vertical {
  534.         pack forget $itk_component(month) $itk_component(day)
  535.         pack forget $itk_component(year) $itk_component(mth_day_marg) 
  536.         pack forget $itk_component(day_yr_marg)
  537.         
  538.         if {$itk_option(-monthon)} {
  539.         pack $itk_component(month) -side top -fill x
  540.         pack $itk_component(mth_day_marg) -side top
  541.         $itk_component(mth_day_marg) configure -height \
  542.             $itk_option(-datemargin) -width 1
  543.         }
  544.         
  545.         if {$itk_option(-dayon)} {
  546.         pack $itk_component(day) -side top  -fill x
  547.         pack $itk_component(day_yr_marg) -side top
  548.         $itk_component(day_yr_marg) configure -height \
  549.             $itk_option(-datemargin) -width 1
  550.         }
  551.         
  552.         if {$itk_option(-yearon)} {
  553.         pack $itk_component(year) -side top -fill x
  554.         }
  555.         
  556.         if {$itk_option(-labelpos) == "w"} {
  557.         iwidgets::Labeledwidget::alignlabels $itk_component(month) \
  558.             $itk_component(day) $itk_component(year)
  559.         }
  560.     }
  561.     
  562.     horizontal {
  563.         pack forget $itk_component(month) $itk_component(day)
  564.         pack forget $itk_component(year) $itk_component(mth_day_marg)
  565.         pack forget $itk_component(day_yr_marg)
  566.         
  567.         if {$itk_option(-monthon)} {
  568.         pack $itk_component(month) -side left -fill x
  569.         pack $itk_component(mth_day_marg) -side left
  570.         $itk_component(mth_day_marg) configure -height 1 \
  571.             -width $itk_option(-datemargin)
  572.         }
  573.         
  574.         if {$itk_option(-dayon)} {
  575.         pack $itk_component(day) -side left -fill x
  576.         pack $itk_component(day_yr_marg) -side left
  577.         $itk_component(day_yr_marg) configure -height 1 \
  578.             -width $itk_option(-datemargin)
  579.         }
  580.         
  581.         if {$itk_option(-yearon)} {
  582.         pack $itk_component(year) -side left -fill x
  583.         }
  584.         
  585.         #
  586.         # Un-align labels.
  587.         #
  588.         $itk_component(month) configure -labelmargin 1
  589.         $itk_component(day) configure -labelmargin 1
  590.         $itk_component(year) configure -labelmargin 1
  591.     }
  592.     
  593.     default {
  594.         error "bad orient option \"$itk_option(-orient)\", should\
  595.             be \"vertical\" or \"horizontal\""
  596.     } 
  597.     }
  598.