|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tixWidgetClass tixControl { |
|
-classname TixControl |
|
-superclass tixLabelWidget |
|
-method { |
|
incr decr invoke update |
|
} |
|
-flag { |
|
-allowempty -autorepeat -command -decrcmd -disablecallback |
|
-disabledforeground -incrcmd -initwait -integer -llimit |
|
-repeatrate -max -min -selectmode -step -state -validatecmd |
|
-value -variable -ulimit |
|
} |
|
-forcecall { |
|
-variable -state |
|
} |
|
-configspec { |
|
{-allowempty allowEmpty AllowEmpty false} |
|
{-autorepeat autoRepeat AutoRepeat true} |
|
{-command command Command ""} |
|
{-decrcmd decrCmd DecrCmd ""} |
|
{-disablecallback disableCallback DisableCallback 0 tixVerifyBoolean} |
|
{-disabledforeground disabledForeground DisabledForeground #303030} |
|
{-incrcmd incrCmd IncrCmd ""} |
|
{-initwait initWait InitWait 500} |
|
{-integer integer Integer false} |
|
{-max max Max ""} |
|
{-min min Min ""} |
|
{-repeatrate repeatRate RepeatRate 50} |
|
{-step step Step 1} |
|
{-state state State normal} |
|
{-selectmode selectMode SelectMode normal} |
|
{-validatecmd validateCmd ValidateCmd ""} |
|
{-value value Value 0} |
|
{-variable variable Variable ""} |
|
} |
|
-alias { |
|
{-llimit -min} |
|
{-ulimit -max} |
|
} |
|
-default { |
|
{.borderWidth 0} |
|
{*entry.relief sunken} |
|
{*entry.width 5} |
|
{*label.anchor e} |
|
{*label.borderWidth 0} |
|
{*Button.anchor c} |
|
{*Button.borderWidth 2} |
|
{*Button.highlightThickness 1} |
|
{*Button.takeFocus 0} |
|
} |
|
} |
|
|
|
proc tixControl:InitWidgetRec {w} { |
|
upvar #0 $w data |
|
|
|
tixChainMethod $w InitWidgetRec |
|
|
|
set data(varInited) 0 |
|
set data(serial) 0 |
|
} |
|
|
|
proc tixControl:ConstructFramedWidget {w frame} { |
|
upvar #0 $w data |
|
|
|
tixChainMethod $w ConstructFramedWidget $frame |
|
|
|
set data(w:entry) [entry $frame.entry] |
|
|
|
set data(w:incr) \ |
|
[button $frame.incr -bitmap [tix getbitmap incr] -takefocus 0] |
|
set data(w:decr) \ |
|
[button $frame.decr -bitmap [tix getbitmap decr] -takefocus 0] |
|
|
|
|
|
|
|
|
|
|
|
pack $data(w:entry) -side left -expand yes -fill both |
|
pack $data(w:decr) -side bottom -fill both -expand yes |
|
pack $data(w:incr) -side top -fill both -expand yes |
|
|
|
$data(w:entry) delete 0 end |
|
$data(w:entry) insert 0 $data(-value) |
|
|
|
|
|
set data(entryfg) [$data(w:entry) cget -fg] |
|
set data(labelfg) [$data(w:label) cget -fg] |
|
} |
|
|
|
proc tixControl:SetBindings {w} { |
|
upvar #0 $w data |
|
|
|
tixChainMethod $w SetBindings |
|
|
|
bind $data(w:incr) <ButtonPress-1> \ |
|
[list after idle tixControl:StartRepeat $w 1] |
|
bind $data(w:decr) <ButtonPress-1> \ |
|
[list after idle tixControl:StartRepeat $w -1] |
|
|
|
|
|
|
|
foreach btn [list $data(w:incr) $data(w:decr)] { |
|
bind $btn <ButtonRelease-1> [list tixControl:StopRepeat $w] |
|
} |
|
|
|
tixSetMegaWidget $data(w:entry) $w |
|
|
|
|
|
|
|
tixAddBindTag $data(w:entry) TixControl:Entry |
|
} |
|
|
|
proc tixControlBind {} { |
|
tixBind TixControl:Entry <Return> { |
|
tixControl:Invoke [tixGetMegaWidget %W] 1 |
|
} |
|
tixBind TixControl:Entry <Escape> { |
|
tixControl:Escape [tixGetMegaWidget %W] |
|
} |
|
tixBind TixControl:Entry <Up> { |
|
[tixGetMegaWidget %W] incr |
|
} |
|
tixBind TixControl:Entry <Down> { |
|
[tixGetMegaWidget %W] decr |
|
} |
|
tixBind TixControl:Entry <FocusOut> { |
|
if {"%d" eq "NotifyNonlinear" || "%d" eq "NotifyNonlinearVirtual"} { |
|
tixControl:Tab [tixGetMegaWidget %W] %d |
|
} |
|
} |
|
tixBind TixControl:Entry <Any-KeyPress> { |
|
tixControl:KeyPress [tixGetMegaWidget %W] |
|
} |
|
tixBind TixControl:Entry <Any-Tab> { |
|
|
|
|
|
} |
|
} |
|
|
|
|
|
|
|
|
|
proc tixControl:config-state {w arg} { |
|
upvar #0 $w data |
|
|
|
if {$arg eq "normal"} { |
|
$data(w:incr) config -state $arg |
|
$data(w:decr) config -state $arg |
|
catch { |
|
$data(w:label) config -fg $data(labelfg) |
|
} |
|
$data(w:entry) config -state $arg -fg $data(entryfg) |
|
} else { |
|
$data(w:incr) config -state $arg |
|
$data(w:decr) config -state $arg |
|
catch { |
|
$data(w:label) config -fg $data(-disabledforeground) |
|
} |
|
$data(w:entry) config -state $arg -fg $data(-disabledforeground) |
|
} |
|
} |
|
|
|
proc tixControl:config-value {w value} { |
|
upvar #0 $w data |
|
|
|
tixControl:SetValue $w $value 0 1 |
|
|
|
|
|
|
|
|
|
return $data(-value) |
|
} |
|
|
|
proc tixControl:config-variable {w arg} { |
|
upvar #0 $w data |
|
|
|
if {[tixVariable:ConfigVariable $w $arg]} { |
|
|
|
|
|
tixControl:SetValue $w $data(-value) 1 1 |
|
} |
|
catch { |
|
unset data(varInited) |
|
} |
|
set data(-variable) $arg |
|
} |
|
|
|
|
|
|
|
|
|
proc tixControl:incr {w {by 1}} { |
|
upvar #0 $w data |
|
|
|
if {$data(-state) ne "disabled"} { |
|
if {![catch {$data(w:entry) index sel.first}]} { |
|
$data(w:entry) select from end |
|
$data(w:entry) select to end |
|
} |
|
|
|
|
|
tixControl:AdjustValue $w $by |
|
} |
|
} |
|
|
|
proc tixControl:decr {w {by 1}} { |
|
upvar #0 $w data |
|
|
|
if {$data(-state) ne "disabled"} { |
|
if {![catch {$data(w:entry) index sel.first}]} { |
|
$data(w:entry) select from end |
|
$data(w:entry) select to end |
|
} |
|
|
|
|
|
tixControl:AdjustValue $w [expr {0 - $by}] |
|
} |
|
} |
|
|
|
proc tixControl:invoke {w} { |
|
upvar #0 $w data |
|
|
|
tixControl:Invoke $w 0 |
|
} |
|
|
|
proc tixControl:update {w} { |
|
upvar #0 $w data |
|
|
|
if {[info exists data(edited)]} { |
|
tixControl:invoke $w |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc tixControl:AdjustValue {w amount} { |
|
upvar #0 $w data |
|
|
|
if {$amount == 1 && [llength $data(-incrcmd)]} { |
|
set newValue [tixEvalCmdBinding $w $data(-incrcmd) "" $data(-value)] |
|
} elseif {$amount == -1 && [llength $data(-decrcmd)]} { |
|
set newValue [tixEvalCmdBinding $w $data(-decrcmd) "" $data(-value)] |
|
} else { |
|
set newValue [expr {$data(-value) + $amount * $data(-step)}] |
|
} |
|
|
|
if {$data(-state) ne "disabled"} { |
|
tixControl:SetValue $w $newValue 0 1 |
|
} |
|
} |
|
|
|
proc tixControl:SetValue {w newvalue noUpdate forced} { |
|
upvar #0 $w data |
|
|
|
if {[$data(w:entry) selection present]} { |
|
set oldSelection [list [$data(w:entry) index sel.first] \ |
|
[$data(w:entry) index sel.last]] |
|
} |
|
|
|
set oldvalue $data(-value) |
|
set oldCursor [$data(w:entry) index insert] |
|
set changed 0 |
|
|
|
|
|
if {[llength $data(-validatecmd)]} { |
|
|
|
|
|
set data(-value) [tixEvalCmdBinding $w $data(-validatecmd) "" $newvalue] |
|
} else { |
|
|
|
|
|
|
|
|
|
|
|
if {[catch {expr 0+$newvalue}]} { |
|
set newvalue 0 |
|
set data(-value) 0 |
|
set changed 1 |
|
} |
|
|
|
if {$newvalue == ""} { |
|
if {![string is true -strict $data(-allowempty)]} { |
|
set newvalue 0 |
|
set changed 1 |
|
} else { |
|
set data(-value) "" |
|
} |
|
} |
|
|
|
if {$newvalue != ""} { |
|
|
|
|
|
regsub -- {^[0]*} $newvalue "" newvalue |
|
if {[catch {expr 0+$newvalue}]} { |
|
set newvalue 0 |
|
set data(-value) 0 |
|
set changed 1 |
|
} |
|
if {$newvalue == ""} { |
|
set newvalue 0 |
|
} |
|
|
|
if {[string is true -strict $data(-integer)]} { |
|
set data(-value) [tixGetInt -nocomplain $newvalue] |
|
} else { |
|
if {[catch {set data(-value) [format "%d" $newvalue]}]} { |
|
if {[catch {set data(-value) [expr $newvalue+0.0]}]} { |
|
set data(-value) $oldvalue |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
if {$data(-max) != "" && $data(-value) > $data(-max)} { |
|
set data(-value) $data(-max) |
|
} |
|
if {$data(-min) != "" && $data(-value) < $data(-min)} { |
|
set data(-value) $data(-min) |
|
} |
|
} |
|
} |
|
|
|
if {! $noUpdate} { |
|
tixVariable:UpdateVariable $w |
|
} |
|
|
|
if {$forced || ($newvalue ne $data(-value)) || $changed} { |
|
$data(w:entry) delete 0 end |
|
$data(w:entry) insert 0 $data(-value) |
|
$data(w:entry) icursor $oldCursor |
|
if {[info exists oldSelection]} { |
|
eval [list $data(w:entry) selection range] $oldSelection |
|
} |
|
} |
|
|
|
if {!$data(-disablecallback) && $data(-command) != ""} { |
|
if {![info exists data(varInited)]} { |
|
set bind(specs) "" |
|
tixEvalCmdBinding $w $data(-command) bind $data(-value) |
|
} |
|
} |
|
} |
|
|
|
proc tixControl:Invoke {w forced} { |
|
upvar #0 $w data |
|
|
|
catch { |
|
unset data(edited) |
|
} |
|
|
|
if {[catch {$data(w:entry) index sel.first}] == 0} { |
|
|
|
|
|
$data(w:entry) select from end |
|
$data(w:entry) select to end |
|
} |
|
|
|
tixControl:SetValue $w [$data(w:entry) get] 0 $forced |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc tixControl:StartRepeat {w amount} { |
|
if {![winfo exists $w]} { |
|
return |
|
} |
|
|
|
upvar #0 $w data |
|
|
|
incr data(serial) |
|
|
|
|
|
|
|
|
|
set serial $data(serial) |
|
|
|
if {![catch {$data(w:entry) index sel.first}]} { |
|
$data(w:entry) select from end |
|
$data(w:entry) select to end |
|
} |
|
|
|
if {[info exists data(edited)]} { |
|
unset data(edited) |
|
tixControl:SetValue $w [$data(w:entry) get] 0 1 |
|
} |
|
|
|
tixControl:AdjustValue $w $amount |
|
|
|
if {$data(-autorepeat)} { |
|
after $data(-initwait) tixControl:Repeat $w $amount $serial |
|
} |
|
|
|
focus $data(w:entry) |
|
} |
|
|
|
proc tixControl:Repeat {w amount serial} { |
|
if {![winfo exists $w]} { |
|
return |
|
} |
|
upvar #0 $w data |
|
|
|
if {$serial eq $data(serial)} { |
|
tixControl:AdjustValue $w $amount |
|
|
|
if {$data(-autorepeat)} { |
|
after $data(-repeatrate) tixControl:Repeat $w $amount $serial |
|
} |
|
} |
|
} |
|
|
|
proc tixControl:StopRepeat {w} { |
|
upvar #0 $w data |
|
|
|
incr data(serial) |
|
} |
|
|
|
proc tixControl:Destructor {w} { |
|
|
|
tixVariable:DeleteVariable $w |
|
|
|
|
|
|
|
tixChainMethod $w Destructor |
|
} |
|
|
|
|
|
|
|
proc tixControl:Tab {w detail} { |
|
upvar #0 $w data |
|
|
|
if {![info exists data(edited)]} { |
|
return |
|
} else { |
|
unset data(edited) |
|
} |
|
|
|
tixControl:invoke $w |
|
} |
|
|
|
proc tixControl:Escape {w} { |
|
upvar #0 $w data |
|
|
|
$data(w:entry) delete 0 end |
|
$data(w:entry) insert 0 $data(-value) |
|
} |
|
|
|
proc tixControl:KeyPress {w} { |
|
upvar #0 $w data |
|
|
|
if {$data(-selectmode) eq "normal"} { |
|
set data(edited) 0 |
|
return |
|
} else { |
|
|
|
after 1 tixControl:invoke $w |
|
} |
|
} |
|
|