|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tixWidgetClass tixOptionMenu { |
|
-classname TixOptionMenu |
|
-superclass tixLabelWidget |
|
-method { |
|
add delete disable enable entrycget entryconfigure entries |
|
} |
|
-flag { |
|
-command -disablecallback -dynamicgeometry -value -variable |
|
-validatecmd -state |
|
} |
|
-forcecall { |
|
-variable -state |
|
} |
|
-configspec { |
|
{-command command Command ""} |
|
{-disablecallback disableCallback DisableCallback 0 tixVerifyBoolean} |
|
{-dynamicgeometry dynamicGeometry DynamicGeometry 0 tixVerifyBoolean} |
|
{-state state State normal} |
|
{-value value Value ""} |
|
{-validatecmd validateCmd ValidateCmd ""} |
|
{-variable variable Variable ""} |
|
} |
|
-default { |
|
{.highlightThickness 0} |
|
{.takeFocus 0} |
|
{.frame.menubutton.relief raised} |
|
{.frame.menubutton.borderWidth 2} |
|
{.frame.menubutton.anchor w} |
|
{.frame.menubutton.highlightThickness 2} |
|
{.frame.menubutton.takeFocus 1} |
|
} |
|
} |
|
|
|
proc tixOptionMenu:InitWidgetRec {w} { |
|
upvar #0 $w data |
|
|
|
tixChainMethod $w InitWidgetRec |
|
|
|
set data(nItems) 0 |
|
set data(items) "" |
|
set data(posted) 0 |
|
set data(varInited) 0 |
|
set data(maxWidth) 0 |
|
} |
|
|
|
proc tixOptionMenu:ConstructFramedWidget {w frame} { |
|
upvar #0 $w data |
|
|
|
tixChainMethod $w ConstructFramedWidget $frame |
|
|
|
set data(w:menubutton) [menubutton $frame.menubutton -indicatoron 1] |
|
set data(w:menu) [menu $frame.menubutton.menu -tearoff 0] |
|
pack $data(w:menubutton) -side left -expand yes -fill both |
|
|
|
$data(w:menubutton) config -menu $data(w:menu) |
|
|
|
bind $data(w:menubutton) <Up> [bind Menubutton <space>] |
|
bind $data(w:menubutton) <Down> [bind Menubutton <space>] |
|
|
|
tixSetMegaWidget $data(w:menubutton) $w |
|
} |
|
|
|
proc tixOptionMenu:SetBindings {w} { |
|
upvar #0 $w data |
|
|
|
tixChainMethod $w SetBindings |
|
} |
|
|
|
|
|
|
|
|
|
proc tixOptionMenu:Invoke {w name} { |
|
upvar #0 $w data |
|
|
|
if {"$data(-state)" == "normal"} { |
|
tixOptionMenu:SetValue $w $name |
|
} |
|
} |
|
|
|
proc tixOptionMenu:SetValue {w value {noUpdate 0}} { |
|
upvar #0 $w data |
|
|
|
if {$data(-validatecmd) != ""} { |
|
set value [tixEvalCmdBinding $w $data(-validatecmd) "" $value] |
|
} |
|
|
|
set name $value |
|
|
|
if {$name == "" || [info exists data(varInited)]} { |
|
|
|
if {![info exists data($name,index)]} { |
|
set data(-value) "" |
|
tixVariable:UpdateVariable $w |
|
$data(w:menubutton) config -text "" |
|
return |
|
} |
|
} |
|
|
|
if {[info exists data($name,index)]} { |
|
$data(w:menubutton) config -text $data($name,label) |
|
|
|
set data(-value) $value |
|
|
|
if {! $noUpdate} { |
|
tixVariable:UpdateVariable $w |
|
} |
|
|
|
if {$data(-command) != "" && !$data(-disablecallback)} { |
|
if {![info exists data(varInited)]} { |
|
set bind(specs) "" |
|
tixEvalCmdBinding $w $data(-command) bind $value |
|
} |
|
} |
|
} else { |
|
error "item \"$value\" does not exist" |
|
} |
|
} |
|
|
|
proc tixOptionMenu:SetMaxWidth {w} { |
|
upvar #0 $w data |
|
|
|
foreach name $data(items) { |
|
set len [string length $data($name,label)] |
|
if {$data(maxWidth) < $len} { |
|
set data(maxWidth) $len |
|
} |
|
} |
|
|
|
if {$data(maxWidth) > 0} { |
|
$data(w:menubutton) config -width $data(maxWidth) |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
proc tixOptionMenu:config-state {w value} { |
|
upvar #0 $w data |
|
|
|
if {![info exists data(w:label)]} { |
|
return |
|
} |
|
|
|
if {$value == "normal"} { |
|
catch { |
|
$data(w:label) config -fg \ |
|
[$data(w:menubutton) cget -foreground] |
|
} |
|
$data(w:menubutton) config -state $value |
|
} else { |
|
catch { |
|
$data(w:label) config -fg \ |
|
[$data(w:menubutton) cget -disabledforeground] |
|
} |
|
$data(w:menubutton) config -state $value |
|
} |
|
} |
|
|
|
proc tixOptionMenu:config-value {w value} { |
|
upvar #0 $w data |
|
|
|
tixOptionMenu:SetValue $w $value |
|
|
|
|
|
|
|
|
|
return $data(-value) |
|
} |
|
|
|
proc tixOptionMenu:config-variable {w arg} { |
|
upvar #0 $w data |
|
|
|
if {[tixVariable:ConfigVariable $w $arg]} { |
|
|
|
|
|
tixOptionMenu:SetValue $w $data(-value) 1 |
|
} |
|
catch { |
|
unset data(varInited) |
|
} |
|
set data(-variable) $arg |
|
} |
|
|
|
|
|
|
|
|
|
proc tixOptionMenu:add {w type name args} { |
|
upvar #0 $w data |
|
|
|
if {[info exists data($name,index)]} { |
|
error "item $name already exists in the option menu $w" |
|
} |
|
|
|
case $type { |
|
"command" { |
|
set validOptions { |
|
-command -label |
|
} |
|
set opt(-command) "" |
|
set opt(-label) $name |
|
|
|
tixHandleOptions -nounknown opt $validOptions $args |
|
|
|
if {$opt(-command) != ""} { |
|
error "option -command cannot be specified" |
|
} |
|
|
|
|
|
|
|
eval $data(w:menu) add command $args \ |
|
[list -label $opt(-label) \ |
|
-command "tixOptionMenu:Invoke $w \{$name\}"] |
|
set index $data(nItems) |
|
|
|
|
|
|
|
set data($index,name) $name |
|
set data($name,type) cmd |
|
set data($name,label) $opt(-label) |
|
set data($name,index) $index |
|
|
|
if {$index == 0} { |
|
$data(w:menubutton) config -text $data($name,label) |
|
tixOptionMenu:SetValue $w $name |
|
} |
|
|
|
incr data(nItems) |
|
lappend data(items) $name |
|
|
|
if $data(-dynamicgeometry) { |
|
tixOptionMenu:SetMaxWidth $w |
|
} |
|
} |
|
"separator" { |
|
$data(w:menu) add separator |
|
|
|
set index $data(nItems) |
|
|
|
|
|
set data($index,name) $name |
|
set data($name,type) sep |
|
set data($name,label) "" |
|
set data($name,index) $index |
|
|
|
incr data(nItems) |
|
lappend data(items) $name |
|
} |
|
default { |
|
error "only types \"separator\" and \"command\" are allowed" |
|
} |
|
} |
|
|
|
return "" |
|
} |
|
|
|
proc tixOptionMenu:delete {w item} { |
|
upvar #0 $w data |
|
|
|
if {![info exists data($item,index)]} { |
|
error "item $item does not exist in $w" |
|
} |
|
|
|
|
|
set newItems "" |
|
set oldIndex 0 |
|
set newIndex 0 |
|
foreach name $data(items) { |
|
if {$item == $name} { |
|
unset data($name,label) |
|
unset data($name,index) |
|
unset data($name,type) |
|
$data(w:menu) delete $oldIndex |
|
} else { |
|
set data($name,index) $newIndex |
|
set data($newIndex,name) $name |
|
incr newIndex |
|
lappend newItems $name |
|
} |
|
incr oldIndex |
|
} |
|
incr oldIndex -1; unset data($oldIndex,name) |
|
set data(nItems) $newIndex |
|
set data(items) $newItems |
|
|
|
if {$data(-value) == $item} { |
|
set newVal "" |
|
foreach item $data(items) { |
|
if {$data($item,type) == "cmd"} { |
|
set newVal $item |
|
} |
|
} |
|
tixOptionMenu:SetValue $w $newVal |
|
} |
|
|
|
return "" |
|
} |
|
|
|
|
|
proc tixOptionMenu:disable {w item} { |
|
upvar #0 $w data |
|
|
|
if {![info exists data($item,index)]} { |
|
error "item $item does not exist in $w" |
|
} else { |
|
catch {$data(w:menu) entryconfig $data($item,index) -state disabled} |
|
} |
|
} |
|
|
|
proc tixOptionMenu:enable {w item} { |
|
upvar #0 $w data |
|
|
|
if {![info exists data($item,index)]} { |
|
error "item $item does not exist in $w" |
|
} else { |
|
catch {$data(w:menu) entryconfig $data($item,index) -state normal} |
|
} |
|
} |
|
|
|
proc tixOptionMenu:entryconfigure {w item args} { |
|
upvar #0 $w data |
|
|
|
if {![info exists data($item,index)]} { |
|
error "item $item does not exist in $w" |
|
} else { |
|
return [eval $data(w:menu) entryconfig $data($item,index) $args] |
|
} |
|
} |
|
|
|
proc tixOptionMenu:entrycget {w item arg} { |
|
upvar #0 $w data |
|
|
|
if {![info exists data($item,index)]} { |
|
error "item $item does not exist in $w" |
|
} else { |
|
return [$data(w:menu) entrycget $data($item,index) $arg] |
|
} |
|
} |
|
|
|
proc tixOptionMenu:entries {w} { |
|
upvar #0 $w data |
|
|
|
return $data(items) |
|
} |
|
|
|
|
|
proc tixOptionMenu:Destructor {w} { |
|
|
|
tixVariable:DeleteVariable $w |
|
|
|
|
|
|
|
tixChainMethod $w Destructor |
|
} |
|
|
|
|
|
|
|
|
|
|
|
proc tixOptionMenu:Post {w} { |
|
upvar #0 $w data |
|
|
|
set rootx [winfo rootx $data(w:frame)] |
|
set rooty [winfo rooty $data(w:frame)] |
|
|
|
|
|
|
|
incr rootx [lindex [$data(w:menu) config -border] 4] |
|
incr rooty [lindex [$data(w:frame) config -border] 4] |
|
incr rooty [lindex [$data(w:menu) config -border] 4] |
|
|
|
set value $data(-value) |
|
set y [$data(w:menu) yposition $data($value,index)] |
|
|
|
$data(w:menu) post $rootx [expr $rooty - $y] |
|
$data(w:menu) activate $data($value,index) |
|
grab -global $data(w:menubutton) |
|
set data(posted) 1 |
|
} |
|
|