123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- # -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
- #
- # $Id: OptMenu.tcl,v 1.3 2001/12/09 05:04:02 idiscovery Exp $
- #
- # OptMenu.tcl --
- #
- # This file implements the TixOptionMenu widget.
- #
- # Copyright (c) 1993-1999 Ioi Kim Lam.
- # Copyright (c) 2000-2001 Tix Project Group.
- #
- # See the file "license.terms" for information on usage and redistribution
- # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- #
- 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
- }
- #----------------------------------------------------------------------
- # Private methods
- #----------------------------------------------------------------------
- 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)]} {
- # variable may contain a bogus value
- 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)
- }
- }
- #----------------------------------------------------------------------
- # Configuration
- #----------------------------------------------------------------------
- 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
- # This will tell the Intrinsics: "Please use this value"
- # because "value" might be altered by SetValues
- #
- return $data(-value)
- }
- proc tixOptionMenu:config-variable {w arg} {
- upvar #0 $w data
- if {[tixVariable:ConfigVariable $w $arg]} {
- # The value of data(-value) is changed if tixVariable:ConfigVariable
- # returns true
- tixOptionMenu:SetValue $w $data(-value) 1
- }
- catch {
- unset data(varInited)
- }
- set data(-variable) $arg
- }
- #----------------------------------------------------------------------
- # Public Methdos
- #----------------------------------------------------------------------
- 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"
- }
- # Create a new item inside the menu
- #
- eval $data(w:menu) add command $args \
- [list -label $opt(-label) \
- -command "tixOptionMenu:Invoke $w \{$name\}"]
- set index $data(nItems)
- # Store info about this item
- #
- 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)
- # Store info about this item
- #
- 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"
- }
- # Rehash the item list
- 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
- # Chain this to the superclass
- #
- tixChainMethod $w Destructor
- }
- #----------------------------------------------------------------------
- # Obsolete
- # These have been replaced by new commands in Tk 4.0
- #
- proc tixOptionMenu:Post {w} {
- upvar #0 $w data
- set rootx [winfo rootx $data(w:frame)]
- set rooty [winfo rooty $data(w:frame)]
- # adjust for the border of the menu and 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
- }
|