source: trunk/gui/scripts/booleanentry.tcl @ 3021

Last change on this file since 3021 was 1929, checked in by gah, 14 years ago
File size: 6.3 KB
RevLine 
[13]1# ----------------------------------------------------------------------
2#  COMPONENT: BooleanEntry - widget for entering boolean values
3#
4#  This widget represents a <boolean> entry on a control panel.
5#  It is used to enter yes/no or on/off values.
6# ======================================================================
7#  AUTHOR:  Michael McLennan, Purdue University
[115]8#  Copyright (c) 2004-2005  Purdue Research Foundation
9#
10#  See the file "license.terms" for information on usage and
11#  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
[13]12# ======================================================================
13package require Itk
14
15itcl::class Rappture::BooleanEntry {
16    inherit itk::Widget
17
[437]18    itk_option define -state state State "normal"
19
[22]20    constructor {owner path args} { # defined below }
[13]21
22    public method value {args}
23
24    public method label {}
25    public method tooltip {}
26
27    protected method _newValue {}
28
[22]29    private variable _owner ""    ;# thing managing this control
[13]30    private variable _path ""     ;# path in XML to this number
31}
32
33itk::usual BooleanEntry {
34    keep -cursor -font
35    keep -foreground -background
36    keep -textbackground
37    keep -selectbackground -selectforeground -selectborderwidth
38}
39
40# ----------------------------------------------------------------------
41# CONSTRUCTOR
42# ----------------------------------------------------------------------
[22]43itcl::body Rappture::BooleanEntry::constructor {owner path args} {
44    if {[catch {$owner isa Rappture::ControlOwner} valid] != 0 || !$valid} {
[1929]45        error "bad object \"$owner\": should be Rappture::ControlOwner"
[13]46    }
[22]47    set _owner $owner
[13]48    set _path $path
49
[1076]50    itk_component add -protected vframe {
[1929]51        frame $itk_interior.vframe
[1076]52    }
53
54    # if the control has an icon, plug it in
55    set icon [$_owner xml get $path.about.icon]
56    if {$icon != ""} {
[1929]57        itk_component add icon {
58            set icon [image create photo -data $icon]
59            set w [image width $icon]
60            set h [image height $icon]
61            canvas $itk_component(vframe).icon -height $h -width $w -borderwidth 0 -highlightthickness 0
62        } {
63            usual
64            ignore -highlightthickness -highlightbackground -highlightcolor
65        }
66        set c $itk_component(icon)
67        $c create image [expr {0.5*$w}] [expr {0.5*$h}] \
68            -anchor center -image $icon
69        pack $itk_component(icon) -fill x -side left
[1076]70    }
71   
[13]72    #
73    # Create the widget and configure it properly based on other
74    # hints in the XML.
75    #
76    itk_component add switch {
[1929]77        set color [$_owner xml get $path.about.color]
78        if {$color != ""} {
79            Rappture::Switch $itk_component(vframe).switch -oncolor $color
80        } else {
81            Rappture::Switch $itk_component(vframe).switch
82        }
[13]83    }
[1076]84
[13]85    bind $itk_component(switch) <<Value>> [itcl::code $this _newValue]
[1076]86    pack $itk_component(switch) -fill x -side left
87    pack $itk_component(vframe) -side left -expand yes -fill both
[13]88    eval itk_initialize $args
89
90    #
91    # Assign the default value to this widget, if there is one.
92    #
[995]93    set str [$_owner xml get $path.default]
94    if {"" != $str} {
[1929]95        $itk_component(switch) value $str
[82]96    } else {
[1929]97        $itk_component(switch) value off
[82]98    }
[13]99}
100
101# ----------------------------------------------------------------------
102# USAGE: value ?-check? ?<newval>?
103#
104# Clients use this to query/set the value for this widget.  With
105# no args, it returns the current value for the widget.  If the
106# <newval> is specified, it sets the value of the widget and
107# sends a <<Value>> event.  If the -check flag is included, the
108# new value is not actually applied, but just checked for correctness.
109# ----------------------------------------------------------------------
110itcl::body Rappture::BooleanEntry::value {args} {
111    set onlycheck 0
112    set i [lsearch -exact $args -check]
113    if {$i >= 0} {
[1929]114        set onlycheck 1
115        set args [lreplace $args $i $i]
[13]116    }
117
118    if {[llength $args] == 1} {
[1929]119        if {$onlycheck} {
120            # someday we may add validation...
121            return
122        }
123        set newval [lindex $args 0]
124        $itk_component(switch) value $newval
125        event generate $itk_component(hull) <<Value>>
126        return $newval
[13]127
128    } elseif {[llength $args] != 0} {
[1929]129        error "wrong # args: should be \"value ?-check? ?newval?\""
[13]130    }
131
132    #
133    # Query the value and return.
134    #
135    return [$itk_component(switch) value]
136}
137
138# ----------------------------------------------------------------------
139# USAGE: label
140#
141# Clients use this to query the label associated with this widget.
142# Reaches into the XML and pulls out the appropriate label string.
143# ----------------------------------------------------------------------
144itcl::body Rappture::BooleanEntry::label {} {
[22]145    set label [$_owner xml get $_path.about.label]
[13]146    if {"" == $label} {
[1929]147        set label "Boolean"
[13]148    }
149    return $label
150}
151
152# ----------------------------------------------------------------------
153# USAGE: tooltip
154#
155# Clients use this to query the tooltip associated with this widget.
156# Reaches into the XML and pulls out the appropriate description
157# string.  Returns the string that should be used with the
158# Rappture::Tooltip facility.
159# ----------------------------------------------------------------------
160itcl::body Rappture::BooleanEntry::tooltip {} {
[22]161    set str [$_owner xml get $_path.about.description]
[437]162    append str "\n\nClick to turn on/off"
[13]163    return [string trim $str]
164}
165
166# ----------------------------------------------------------------------
167# USAGE: _newValue
168#
169# Invoked automatically whenever the value in the gauge changes.
170# Sends a <<Value>> event to notify clients of the change.
171# ----------------------------------------------------------------------
172itcl::body Rappture::BooleanEntry::_newValue {} {
173    event generate $itk_component(hull) <<Value>>
174}
[437]175
176# ----------------------------------------------------------------------
177# CONFIGURATION OPTION: -state
178# ----------------------------------------------------------------------
179itcl::configbody Rappture::BooleanEntry::state {
180    set valid {normal disabled}
181    if {[lsearch -exact $valid $itk_option(-state)] < 0} {
[1929]182        error "bad value \"$itk_option(-state)\": should be [join $valid {, }]"
[437]183    }
184    $itk_component(switch) configure -state $itk_option(-state)
185}
Note: See TracBrowser for help on using the repository browser.