📄 datefield.itk
字号:
if {$itk_option(-iq) == "low"} { $itk_component(date) delete $icursor $itk_component(date) insert $icursor $char } else { set prevdate [get] if {[$itk_component(date) index insert] == $year_start_pos} { set yrdgt [lindex [split [lindex \ [split $prevdate "$split_char"] [lsearch $order year]] ""] 0] if {$char != $yrdgt} { if {$char == 1} { $itk_component(date) delete $icursor $year_end_pos $itk_component(date) insert $icursor 1999 } elseif {$char == 2} { $itk_component(date) delete $icursor $year_end_pos $itk_component(date) insert $icursor 2000 } else { bell return -code break } } $itk_component(date) icursor $year_second_pos return -code break } $itk_component(date) delete $icursor $itk_component(date) insert $icursor $char if {[catch {clock scan [get]}] != 0} { $itk_component(date) delete $year_start_pos $year_end_pos $itk_component(date) insert $year_start_pos \ [lindex [split $prevdate "$split_char"] [lsearch $order year]] $itk_component(date) icursor $icursor bell return -code break } if {$itk_option(-iq) == "high"} { set splist [split [$itk_component(date) get] "$split_char"] set year [lindex $splist [lsearch $order year]] if {$day > [set endday [_lastDay $month $year]]} { set icursor [$itk_component(date) index insert] $itk_component(date) delete $day_start_pos $day_end_pos $itk_component(date) insert $day_start_pos $endday $itk_component(date) icursor $icursor } } } if {$itk_option(-int)} { if {$icursor == $year_fourth_pos } { _setField month } } return -code break } # # Process the plus and the up arrow keys. They both yeild the same # effect, they increment the day by one. # } elseif {($sym == "plus") || ($sym == "Up")} { if {[catch {show [clock scan "1 day" -base [get -clicks]]}] != 0} { bell } return -code break # # Process the minus and the down arrow keys which decrement the day. # } elseif {($sym == "minus") || ($sym == "Down")} { if {[catch {show [clock scan "-1 day" -base [get -clicks]]}] != 0} { bell } return -code break # # A tab key moves the day/month/year (or year/month/day) field # forward by one unless # the current field is the last field. In that case we'll let tab # do what is supposed to and pass the focus onto the next widget. # } elseif {($sym == "Tab") && ($state == 0)} { if {$_cfield != "[lindex $order 2]"} { _moveField forward return -code break } else { _setField "[lindex $order 0]" return -code continue } # # A ctrl-tab key moves the day/month/year field backwards by one # unless the current field is the the first field. In that case we'll # let tab take the focus to a previous widget. # } elseif {($sym == "Tab") && ($state == 4)} { if {$_cfield != "[lindex $order 0]"} { _moveField backward return -code break } else { set _cfield "[lindex $order 0]" return -code continue } # # A right arrow key moves the insert cursor to the right one. # } elseif {$sym == "Right"} { _forward return -code break # # A left arrow, backspace, or delete key moves the insert cursor # to the left one. This is what you expect for the left arrow # and since the whole widget always operates in overstrike mode, # it makes the most sense for backspace and delete to do the same. # } elseif {$sym == "Left" || $sym == "BackSpace" || $sym == "Delete"} { _backward return -code break } elseif {($sym == "Control_L") || ($sym == "Shift_L") || \ ($sym == "Control_R") || ($sym == "Shift_R")} { return -code break # # A Return key invokes the optionally specified command option. # } elseif {$sym == "Return"} { uplevel #0 $itk_option(-command) return -code break } else { bell return -code break }}# ------------------------------------------------------------------# PROTECTED METHOD: _setField field## Internal method which adjusts the field to be that of the # argument, setting the insert cursor appropriately.# ------------------------------------------------------------------itcl::body iwidgets::Datefield::_setField {field} { set _cfield $field if {$itk_option(-int)} { set year_pos 2 set month_pos 5 set day_pos 8 } else { set month_pos 0 set day_pos 3 set year_pos 8 } switch $field { "month" { $itk_component(date) icursor $month_pos } "day" { $itk_component(date) icursor $day_pos } "year" { $itk_component(date) icursor $year_pos } default { error "bad field: \"$field\", must be month, day or year" } }}# ------------------------------------------------------------------# PROTECTED METHOD: _moveField## Internal method for moving the field forward or backward by one.# ------------------------------------------------------------------itcl::body iwidgets::Datefield::_moveField {direction} { set index [lsearch $_fields $_cfield] if {$direction == "forward"} { set newIndex [expr {$index + 1}] } else { set newIndex [expr {$index - 1}] } if {$newIndex == [llength $_fields]} { set newIndex 0 } if {$newIndex < 0} { set newIndex [expr {[llength $_fields] - 1}] } _setField [lindex $_fields $newIndex] return}# ------------------------------------------------------------------# PROTECTED METHOD: _whichField## Internal method which returns the current field that the cursor# is currently within.# ------------------------------------------------------------------itcl::body iwidgets::Datefield::_whichField {} { set icursor [$itk_component(date) index insert] if {$itk_option(-int)} { switch $icursor { 0 - 1 - 2 - 3 { set _cfield "year" } 5 - 6 { set _cfield "month" } 8 - 9 { set _cfield "day" } } } else { switch $icursor { 0 - 1 { set _cfield "month" } 3 - 4 { set _cfield "day" } 6 - 7 - 8 - 9 { set _cfield "year" } } }}# ------------------------------------------------------------------# PROTECTED METHOD: _forward## Internal method which moves the cursor forward by one character# jumping over the slashes and wrapping.# ------------------------------------------------------------------itcl::body iwidgets::Datefield::_forward {} { set icursor [$itk_component(date) index insert] if {$itk_option(-int)} { switch $icursor { 3 { _setField month } 6 { _setField day } 9 - 10 { _setField year } default { $itk_component(date) icursor [expr {$icursor + 1}] } } } else { switch $icursor { 1 { _setField day } 4 { _setField year } 9 - 10 { _setField month } default { $itk_component(date) icursor [expr {$icursor + 1}] } } }}# ------------------------------------------------------------------# PROTECTED METHOD: _backward## Internal method which moves the cursor backward by one character# jumping over the slashes and wrapping.# ------------------------------------------------------------------itcl::body iwidgets::Datefield::_backward {} { set icursor [$itk_component(date) index insert] if {$itk_option(-int)} { switch $icursor { 8 { _setField month } 5 { _setField year } 0 { _setField day } default { $itk_component(date) icursor [expr {$icursor -1}] } } } else { switch $icursor { 6 { _setField day } 3 { _setField month } 0 { _setField year } default { $itk_component(date) icursor [expr {$icursor -1}] } } }}# ------------------------------------------------------------------# PROTECTED METHOD: _lastDay month year## Internal method which determines the last day of the month for# the given month and year. We start at 28 and go forward till# we fail. Crude but effective.# ------------------------------------------------------------------itcl::body iwidgets::Datefield::_lastDay {month year} { set lastone 28 for {set lastone 28} {$lastone < 32} {incr lastone} { set nextone [expr $lastone + 1] if {[catch {clock scan $month/$nextone/$year}] != 0} { return $lastone } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -