diff options
Diffstat (limited to 'itcl/iwidgets/generic/toolbar.itk')
-rw-r--r-- | itcl/iwidgets/generic/toolbar.itk | 983 |
1 files changed, 983 insertions, 0 deletions
diff --git a/itcl/iwidgets/generic/toolbar.itk b/itcl/iwidgets/generic/toolbar.itk new file mode 100644 index 00000000000..f49d7aa8348 --- /dev/null +++ b/itcl/iwidgets/generic/toolbar.itk @@ -0,0 +1,983 @@ +# +# Toolbar +# ---------------------------------------------------------------------- +# +# The Toolbar command creates a new window (given by the pathName +# argument) and makes it into a Tool Bar widget. Additional options, +# described above may be specified on the command line or in the +# option database to configure aspects of the Toolbar such as its +# colors, font, and orientation. The Toolbar command returns its +# pathName argument. At the time this command is invoked, there +# must not exist a window named pathName, but pathName's parent +# must exist. +# +# A Toolbar is a widget that displays a collection of widgets arranged +# either in a row or a column (depending on the value of the -orient +# option). This collection of widgets is usually for user convenience +# to give access to a set of commands or settings. Any widget may be +# placed on a Toolbar. However, command or value-oriented widgets (such +# as button, radiobutton, etc.) are usually the most useful kind of +# widgets to appear on a Toolbar. +# +# WISH LIST: +# This section lists possible future enhancements. +# +# Toggle between text and image/bitmap so that the toolbar could +# display either all text or all image/bitmaps. +# Implementation of the -toolbarfile option that allows toolbar +# add commands to be read in from a file. +# ---------------------------------------------------------------------- +# AUTHOR: Bill W. Scott EMAIL: bscott@spd.dsccc.com +# +# @(#) $Id$ +# ---------------------------------------------------------------------- +# Copyright (c) 1995 DSC Technologies Corporation +# ====================================================================== +# Permission to use, copy, modify, distribute and license this software +# and its documentation for any purpose, and without fee or written +# agreement with DSC, is hereby granted, provided that the above copyright +# notice appears in all copies and that both the copyright notice and +# warranty disclaimer below appear in supporting documentation, and that +# the names of DSC Technologies Corporation or DSC Communications +# Corporation not be used in advertising or publicity pertaining to the +# software without specific, written prior permission. +# +# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- +# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE +# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, +# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL +# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, +# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +# SOFTWARE. +# ====================================================================== + +# +# Default resources. +# +option add *Toolbar*padX 5 widgetDefault +option add *Toolbar*padY 5 widgetDefault +option add *Toolbar*orient horizontal widgetDefault +option add *Toolbar*highlightThickness 0 widgetDefault +option add *Toolbar*indicatorOn false widgetDefault +option add *Toolbar*selectColor [. cget -bg] widgetDefault + +# +# Usual options. +# +itk::usual Toolbar { + keep -activebackground -activeforeground -background -balloonbackground \ + -balloondelay1 -balloondelay2 -balloonfont -balloonforeground \ + -borderwidth -cursor -disabledforeground -font -foreground \ + -highlightbackground -highlightcolor -highlightthickness \ + -insertbackground -insertforeground -selectbackground \ + -selectborderwidth -selectcolor -selectforeground -troughcolor +} + +# ------------------------------------------------------------------ +# TOOLBAR +# ------------------------------------------------------------------ +itcl::class iwidgets::Toolbar { + inherit itk::Widget + + constructor {args} {} + destructor {} + + itk_option define -balloonbackground \ + balloonBackground BalloonBackground yellow + itk_option define -balloonforeground \ + balloonForeground BalloonForeground black + itk_option define -balloonfont balloonFont BalloonFont 6x10 + itk_option define -balloondelay1 \ + balloonDelay1 BalloonDelay1 1000 + itk_option define -balloondelay2 \ + balloonDelay2 BalloonDelay2 200 + itk_option define -helpvariable helpVariable HelpVariable {} + itk_option define -orient orient Orient "horizontal" + + # + # The following options implement propogated configurations to + # any widget that might be added to us. The problem is this is + # not deterministic as someone might add a new kind of widget with + # and option like -armbackground, so we would not be aware of + # this kind of option. Anyway we support as many of the obvious + # ones that we can. They can always configure them with itemconfigures. + # + itk_option define -activebackground activeBackground Foreground #c3c3c3 + itk_option define -activeforeground activeForeground Background Black + itk_option define -background background Background #d9d9d9 + itk_option define -borderwidth borderWidth BorderWidth 2 + itk_option define -cursor cursor Cursor {} + itk_option define -disabledforeground \ + disabledForeground DisabledForeground #a3a3a3 + itk_option define -font \ + font Font "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*" + itk_option define -foreground foreground Foreground #000000000000 + itk_option define -highlightbackground \ + highlightBackground HighlightBackground #d9d9d9 + itk_option define -highlightcolor highlightColor HighlightColor Black + itk_option define -highlightthickness \ + highlightThickness HighlightThickness 0 + itk_option define -insertforeground insertForeground Background #c3c3c3 + itk_option define -insertbackground insertBackground Foreground Black + itk_option define -selectbackground selectBackground Foreground #c3c3c3 + itk_option define -selectborderwidth selectBorderWidth BorderWidth {} + itk_option define -selectcolor selectColor Background #b03060 + itk_option define -selectforeground selectForeground Background Black + itk_option define -state state State normal + itk_option define -troughcolor troughColor Background #c3c3c3 + + public method add {widgetCommand name args} + public method delete {args} + public method index {index} + public method insert {beforeIndex widgetCommand name args} + public method itemcget {index args} + public method itemconfigure {index args} + + public method _resetBalloonTimer {} + public method _startBalloonDelay {window} + public method _stopBalloonDelay {window balloonClick} + + private method _deleteWidgets {index1 index2} + private method _addWidget {widgetCommand name args} + private method _index {toolList index} + private method _getAttachedOption {optionListName widget args retValue} + private method _setAttachedOption {optionListName widget option args} + private method _packToolbar {} + + public method hideHelp {} + public method showHelp {window} + public method showBalloon {window} + public method hideBalloon {} + + private variable _balloonTimer 0 + private variable _balloonAfterID 0 + private variable _balloonClick false + + private variable _interior {} + private variable _initialMapping 1 ;# Is this the first mapping? + private variable _toolList {} ;# List of all widgets on toolbar + private variable _opts ;# New options for child widgets + private variable _currHelpWidget {} ;# Widget currently displaying help for + private variable _hintWindow {} ;# Balloon help bubble. + + # list of options we want to propogate to widgets added to toolbar. + private common _optionList { + -activebackground \ + -activeforeground \ + -background \ + -borderwidth \ + -cursor \ + -disabledforeground \ + -font \ + -foreground \ + -highlightbackground \ + -highlightcolor \ + -highlightthickness \ + -insertbackground \ + -insertforeground \ + -selectbackground \ + -selectborderwidth \ + -selectcolor \ + -selectforeground \ + -state \ + -troughcolor \ + } +} + +# ------------------------------------------------------------------ +# CONSTRUCTOR +# ------------------------------------------------------------------ +itcl::body iwidgets::Toolbar::constructor {args} { + component hull configure -borderwidth 0 + set _interior $itk_interior + + # + # Handle configs + # + eval itk_initialize $args + + # build balloon help window + set _hintWindow [toplevel $itk_component(hull).balloonHintWindow] + wm withdraw $_hintWindow + label $_hintWindow.label \ + -foreground $itk_option(-balloonforeground) \ + -background $itk_option(-balloonbackground) \ + -font $itk_option(-balloonfont) \ + -relief raised \ + -borderwidth 1 + pack $_hintWindow.label + + # ... Attach help handler to this widget + bind toolbar-help-$itk_component(hull) \ + <Enter> "+[itcl::code $this showHelp %W]" + bind toolbar-help-$itk_component(hull) \ + <Leave> "+[itcl::code $this hideHelp]" + + # ... Set up Microsoft style balloon help display. + set _balloonTimer $itk_option(-balloondelay1) + bind $_interior \ + <Leave> "+[itcl::code $this _resetBalloonTimer]" + bind toolbar-balloon-$itk_component(hull) \ + <Enter> "+[itcl::code $this _startBalloonDelay %W]" + bind toolbar-balloon-$itk_component(hull) \ + <Leave> "+[itcl::code $this _stopBalloonDelay %W false]" + bind toolbar-balloon-$itk_component(hull) \ + <Button-1> "+[itcl::code $this _stopBalloonDelay %W true]" +} + +# +# Provide a lowercase access method for the Toolbar class +# +proc ::iwidgets::toolbar {pathName args} { + uplevel ::iwidgets::Toolbar $pathName $args +} + +# ------------------------------------------------------------------ +# DESTURCTOR +# ------------------------------------------------------------------ +itcl::body iwidgets::Toolbar::destructor {} { + if {$_balloonAfterID != 0} {after cancel $_balloonAfterID} +} + +# ------------------------------------------------------------------ +# OPTIONS +# ------------------------------------------------------------------ + +# ------------------------------------------------------------------ +# OPTION -balloonbackground +# ------------------------------------------------------------------ +itcl::configbody iwidgets::Toolbar::balloonbackground { + if { $_hintWindow != {} } { + if { $itk_option(-balloonbackground) != {} } { + $_hintWindow.label configure \ + -background $itk_option(-balloonbackground) + } + } +} + +# ------------------------------------------------------------------ +# OPTION -balloonforeground +# ------------------------------------------------------------------ +itcl::configbody iwidgets::Toolbar::balloonforeground { + if { $_hintWindow != {} } { + if { $itk_option(-balloonforeground) != {} } { + $_hintWindow.label configure \ + -foreground $itk_option(-balloonforeground) + } + } +} + +# ------------------------------------------------------------------ +# OPTION -balloonfont +# ------------------------------------------------------------------ +itcl::configbody iwidgets::Toolbar::balloonfont { + if { $_hintWindow != {} } { + if { $itk_option(-balloonfont) != {} } { + $_hintWindow.label configure \ + -font $itk_option(-balloonfont) + } + } +} + +# ------------------------------------------------------------------ +# OPTION: -orient +# +# Position buttons either horizontally or vertically. +# ------------------------------------------------------------------ +itcl::configbody iwidgets::Toolbar::orient { + switch $itk_option(-orient) { + "horizontal" - "vertical" { + _packToolbar + } + default {error "Invalid orientation. Must be either \ + horizontal or vertical" + } + } +} + +# ------------------------------------------------------------------ +# METHODS +# ------------------------------------------------------------------ + +# ------------------------------------------------------------- +# METHOD: add widgetCommand name ?option value? +# +# Adds a widget with the command widgetCommand whose name is +# name to the Toolbar. If widgetCommand is radiobutton +# or checkbutton, its packing is slightly padded to match the +# geometry of button widgets. +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::add { widgetCommand name args } { + + eval "_addWidget $widgetCommand $name $args" + + lappend _toolList $itk_component($name) + + if { $widgetCommand == "radiobutton" || \ + $widgetCommand == "checkbutton" } { + set iPad 1 + } else { + set iPad 0 + } + + # repack the tool bar + _packToolbar + + return $itk_component($name) + +} + +# ------------------------------------------------------------- +# +# METHOD: delete index ?index2? +# +# This command deletes all components between index and +# index2 inclusive. If index2 is omitted then it defaults +# to index. Returns an empty string +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::delete { args } { + # empty toolbar + if { $_toolList == {} } { + error "can't delete widget, no widgets in the Toolbar \ + \"$itk_component(hull)\"" + } + + set len [llength $args] + switch -- $len { + 1 { + set fromWidget [_index $_toolList [lindex $args 0]] + + if { $fromWidget < 0 || $fromWidget >= [llength $_toolList] } { + error "bad Toolbar widget index in delete method: \ + should be between 0 and [expr {[llength $_toolList] - 1} ]" + } + + set toWidget $fromWidget + _deleteWidgets $fromWidget $toWidget + } + + 2 { + set fromWidget [_index $_toolList [lindex $args 0]] + + if { $fromWidget < 0 || $fromWidget >= [llength $_toolList] } { + error "bad Toolbar widget index1 in delete method: \ + should be between 0 and [expr {[llength $_toolList] - 1} ]" + } + + set toWidget [_index $_toolList [lindex $args 1]] + + if { $toWidget < 0 || $toWidget >= [llength $_toolList] } { + error "bad Toolbar widget index2 in delete method: \ + should be between 0 and [expr {[llength $_toolList] - 1} ]" + } + + if { $fromWidget > $toWidget } { + error "bad Toolbar widget index1 in delete method: \ + index1 is greater than index2" + } + + _deleteWidgets $fromWidget $toWidget + } + + default { + # ... too few/many parameters passed + error "wrong # args: should be \ + \"$itk_component(hull) delete index1 ?index2?\"" + } + } + + return {} +} + + +# ------------------------------------------------------------- +# +# METHOD: index index +# +# Returns the widget's numerical index for the entry corresponding +# to index. If index is not found, -1 is returned +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::index { index } { + + return [_index $_toolList $index] + +} + +# ------------------------------------------------------------- +# +# METHOD: insert beforeIndex widgetCommand name ?option value? +# +# Insert a new component named name with the command +# widgetCommand before the com ponent specified by beforeIndex. +# If widgetCommand is radiobutton or checkbutton, its packing +# is slightly padded to match the geometry of button widgets. +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::insert { beforeIndex widgetCommand name args } { + + set beforeIndex [_index $_toolList $beforeIndex] + + if {$beforeIndex < 0 || $beforeIndex > [llength $_toolList] } { + error "bad toolbar entry index $beforeIndex" + } + + eval "_addWidget $widgetCommand $name $args" + + # linsert into list + set _toolList [linsert $_toolList $beforeIndex $itk_component($name)] + + # repack the tool bar + _packToolbar + + return $itk_component($name) + +} + +# ---------------------------------------------------------------------- +# METHOD: itemcget index ?option? +# +# Returns the value for the option setting of the widget at index $index. +# index can be numeric or widget name +# +# ---------------------------------------------------------------------- +itcl::body iwidgets::Toolbar::itemcget { index args} { + + return [lindex [eval itemconfigure $index $args] 4] +} + +# ------------------------------------------------------------- +# +# METHOD: itemconfigure index ?option? ?value? ?option value...? +# +# Query or modify the configuration options of the widget of +# the Toolbar specified by index. If no option is specified, +# returns a list describing all of the available options for +# index (see Tk_ConfigureInfo for information on the format +# of this list). If option is specified with no value, then +# the command returns a list describing the one named option +# (this list will be identical to the corresponding sublist +# of the value returned if no option is specified). If one +# or more option-value pairs are specified, then the command +# modifies the given widget option(s) to have the given +# value(s); in this case the command returns an empty string. +# The component type of index determines the valid available options. +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::itemconfigure { index args } { + + # Get a numeric index. + set index [_index $_toolList $index] + + # Get the tool path + set toolPath [lindex $_toolList $index] + + set len [llength $args] + + switch $len { + 0 { + # show all options + # '''''''''''''''' + + # support display of -helpstr and -balloonstr configs + set optList [$toolPath configure] + + ## @@@ might want to use _getAttachedOption instead... + if { [info exists _opts($toolPath,-helpstr)] } { + set value $_opts($toolPath,-helpstr) + } else { + set value {} + } + lappend optList [list -helpstr helpStr HelpStr {} $value] + if { [info exists _opts($toolPath,-balloonstr)] } { + set value $_opts($toolPath,-balloonstr) + } else { + set value {} + } + lappend optList [list -balloonstr balloonStr BalloonStr {} $value] + return $optList + } + 1 { + # show only option specified + # '''''''''''''''''''''''''' + # did we satisfy the option get request? + + if { [regexp -- {-helpstr} $args] } { + if { [info exists _opts($toolPath,-helpstr)] } { + set value $_opts($toolPath,-helpstr) + } else { + set value {} + } + return [list -helpstr helpStr HelpStr {} $value] + } elseif { [regexp -- {-balloonstr} $args] } { + if { [info exists _opts($toolPath,-balloonstr)] } { + set value $_opts($toolPath,-balloonstr) + } else { + set value {} + } + return [list -balloonstr balloonStr BalloonStr {} $value] + } else { + return [eval $toolPath configure $args] + } + + } + default { + # ... do a normal configure + + # first screen for all our child options we are adding + _setAttachedOption \ + _opts \ + $toolPath \ + "-helpstr" \ + $args + + _setAttachedOption \ + _opts \ + $toolPath \ + "-balloonstr" \ + $args + + # with a clean args list do a configure + + # if the stripping process brought us down to no options + # to set, then forget the configure of widget. + if { [llength $args] != 0 } { + return [eval $toolPath configure $args] + } else { + return "" + } + } + } + +} + +# ------------------------------------------------------------- +# +# METHOD: _resetBalloonDelay1 +# +# Sets the delay that will occur before a balloon could be popped +# up to balloonDelay1 +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::_resetBalloonTimer {} { + set _balloonTimer $itk_option(-balloondelay1) + + # reset the <1> longer delay + set _balloonClick false +} + +# ------------------------------------------------------------- +# +# METHOD: _startBalloonDelay +# +# Starts waiting to pop up a balloon id +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::_startBalloonDelay {window} { + if {$_balloonAfterID != 0} { + after cancel $_balloonAfterID + } + set _balloonAfterID [after $_balloonTimer [itcl::code $this showBalloon $window]] +} + +# ------------------------------------------------------------- +# +# METHOD: _stopBalloonDelay +# +# This method will stop the timer for a balloon popup if one is +# in progress. If however there is already a balloon window up +# it will hide the balloon window and set timing to delay 2 stage. +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::_stopBalloonDelay { window balloonClick } { + + # If <1> then got a click cancel + if { $balloonClick } { + set _balloonClick true + } + if { $_balloonAfterID != 0 } { + after cancel $_balloonAfterID + set _balloonAfterID 0 + } else { + hideBalloon + + # If this was cancelled with a <1> use longer delay. + if { $_balloonClick } { + set _balloonTimer $itk_option(-balloondelay1) + } else { + set _balloonTimer $itk_option(-balloondelay2) + } + } +} + +# ------------------------------------------------------------- +# PRIVATE METHOD: _addWidget +# +# widgetCommand : command to invoke to create the added widget +# name : name of the new widget to add +# args : options for the widget create command +# +# Looks for -helpstr, -balloonstr and grabs them, strips from +# args list. Then tries to add a component and keeps based +# on known type. If it fails, it tries to clean up. Then it +# binds handlers for helpstatus and balloon help. +# +# Returns the path of the widget added. +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::_addWidget { widgetCommand name args } { + + # ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + # Add the widget to the tool bar + # ''''''''''''''''''''''''''''''''''''''''''''''''''''' + + # ... Strip out and save the -helpstr, -balloonstr options from args + # and save it in _opts + _setAttachedOption \ + _opts \ + $_interior.$name \ + -helpstr \ + $args + + _setAttachedOption \ + _opts \ + $_interior.$name \ + -balloonstr \ + $args + + + # ... Add the new widget as a component (catch an error if occurs) + set createFailed [catch { + itk_component add $name { + eval $widgetCommand $_interior.$name $args + } { + } + } errMsg] + + # ... Clean up if the create failed, and exit. + # The _opts list if it has -helpstr, -balloonstr just entered for + # this, it must be cleaned up. + if { $createFailed } { + # clean up + if {![catch {set _opts($_interior.$name,-helpstr)}]} { + set lastIndex [\ + expr {[llength \ + $_opts($_interior.$name,-helpstr) ]-1}] + lreplace $_opts($_interior.$name,-helpstr) \ + $lastIndex $lastIndex "" + } + if {![catch {set _opts($_interior.$name,-balloonstr)}]} { + set lastIndex [\ + expr {[llength \ + $_opts($_interior.$name,-balloonstr) ]-1}] + lreplace $_opts($_interior.$name,-balloonstr) \ + $lastIndex $lastIndex "" + } + error $errMsg + } + + # ... Add in dynamic options that apply from the _optionList + foreach optionSet [$itk_component($name) configure] { + set option [lindex $optionSet 0] + if { [lsearch $_optionList $option] != -1 } { + itk_option add $name.$option + } + } + + bindtags $itk_component($name) \ + [linsert [bindtags $itk_component($name)] end \ + toolbar-help-$itk_component(hull)] + bindtags $itk_component($name) \ + [linsert [bindtags $itk_component($name)] end \ + toolbar-balloon-$itk_component(hull)] + + return $itk_component($name) +} + +# ------------------------------------------------------------- +# +# PRIVATE METHOD: _deleteWidgets +# +# deletes widget range by numerical index numbers. +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::_deleteWidgets { index1 index2 } { + + for { set index $index1 } { $index <= $index2 } { incr index } { + + # kill the widget + set component [lindex $_toolList $index] + destroy $component + + } + + # physically remove the page + set _toolList [lreplace $_toolList $index1 $index2] + +} + +# ------------------------------------------------------------- +# PRIVATE METHOD: _index +# +# toolList : list of widget names to search thru if index +# is non-numeric +# index : either number, 'end', 'last', or pattern +# +# _index takes takes the value $index converts it to +# a numeric identifier. If the value is not already +# an integer it looks it up in the $toolList array. +# If it fails it returns -1 +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::_index { toolList index } { + + switch -- $index { + end - last { + set number [expr {[llength $toolList] -1}] + } + default { + # is it a number already? Then just use the number + if { [regexp {^[0-9]+$} $index] } { + set number $index + # check bounds + if { $number < 0 || $number >= [llength $toolList] } { + set number -1 + } + # otherwise it is a widget name + } else { + if { [catch { set itk_component($index) } ] } { + set number -1 + } else { + set number [lsearch -exact $toolList \ + $itk_component($index)] + } + } + } + } + + return $number +} + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# STATUS HELP for linking to helpVariable +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ------------------------------------------------------------- +# +# PUBLIC METHOD: hideHelp +# +# Bound to the <Leave> event on a toolbar widget. This clears the +# status widget help area and resets the help entry. +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::hideHelp {} { + if { $itk_option(-helpvariable) != {} } { + upvar #0 $itk_option(-helpvariable) helpvar + set helpvar {} + } + set _currHelpWidget {} +} + +# ------------------------------------------------------------- +# +# PUBLIC METHOD: showHelp +# +# Bound to the <Motion> event on a tool bar widget. This puts the +# help string associated with the tool bar widget into the +# status widget help area. If no help exists for the current +# entry, the status widget is cleared. +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::showHelp { window } { + + set widgetPath $window + # already on this item? + if { $window == $_currHelpWidget } { + return + } + + set _currHelpWidget $window + + # Do we have a helpvariable set on the toolbar? + if { $itk_option(-helpvariable) != {} } { + upvar #0 $itk_option(-helpvariable) helpvar + + # is the -helpstr set for this widget? + set args "-helpstr" + if {[_getAttachedOption _opts \ + $window args value]} { + set helpvar $value. + } else { + set helpvar {} + } + } +} + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# BALLOON HELP for show/hide of hint window +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ------------------------------------------------------------- +# +# PUBLIC METHOD: showBalloon +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::showBalloon {window} { + set _balloonClick false + set _balloonAfterID 0 + # Are we still inside the window? + set mouseWindow \ + [winfo containing [winfo pointerx .] [winfo pointery .]] + + if { [string match $window* $mouseWindow] } { + # set up the balloonString + set args "-balloonstr" + if {[_getAttachedOption _opts \ + $window args hintStr]} { + # configure the balloon help + $_hintWindow.label configure -text $hintStr + + # Coordinates of the balloon + set balloonLeft \ + [expr {[winfo rootx $window] + round(([winfo width $window]/2.0))}] + set balloonTop \ + [expr {[winfo rooty $window] + [winfo height $window]}] + + # put up balloon window + wm overrideredirect $_hintWindow 0 + wm geometry $_hintWindow "+$balloonLeft+$balloonTop" + wm overrideredirect $_hintWindow 1 + wm deiconify $_hintWindow + raise $_hintWindow + } else { + #NO BALLOON HELP AVAILABLE + } + } else { + #NOT IN BUTTON + } + +} + +# ------------------------------------------------------------- +# +# PUBLIC METHOD: hideBalloon +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::hideBalloon {} { + wm withdraw $_hintWindow +} + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# OPTION MANAGEMENT for -helpstr, -balloonstr +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ------------------------------------------------------------- +# PRIVATE METHOD: _getAttachedOption +# +# optionListName : the name of the array that holds all attached +# options. It is indexed via widget,option to get +# the value. +# widget : the widget that the option is associated with +# option : the option whose value we are looking for on +# this widget. +# +# expects to be called only if the $option is length 1 +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::_getAttachedOption { optionListName widget args retValue} { + + # get a reference to the option, so we can change it. + upvar $args argsRef + upvar $retValue retValueRef + + set success false + + if { ![catch { set retValueRef \ + [eval set [subst [set optionListName]]($widget,$argsRef)]}]} { + + # remove the option argument + set success true + set argsRef "" + } + + return $success +} + +# ------------------------------------------------------------- +# PRIVATE METHOD: _setAttachedOption +# +# This method allows us to attach new options to a widget. It +# catches the 'option' to be attached, strips it out of 'args' +# attaches it to the 'widget' by stuffing the value into +# 'optionList(widget,option)' +# +# optionListName: where to store the option and widget association +# widget: is the widget we want to associate the attached option +# option: is the attached option (unknown to this widget) +# args: the arg list to search and remove the option from (if found) +# +# Modifies the args parameter. +# Returns boolean indicating the success of the method +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::_setAttachedOption {optionListName widget option args} { + + upvar args argsRef + + set success false + + # check for 'option' in the 'args' list for the 'widget' + set optPos [eval lsearch $args $option] + + # ... found it + if { $optPos != -1 } { + # grab a copy of the option from arg list + set [subst [set optionListName]]($widget,$option) \ + [eval lindex $args [expr {$optPos + 1}]] + + # remove the option argument and value from the arg list + set argsRef [eval lreplace $args $optPos [expr {$optPos + 1}]] + set success true + } + # ... if not found, will leave args alone + + return $success +} + +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# GEOMETRY MANAGEMENT for tool widgets +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# ------------------------------------------------------------- +# +# PRIVATE METHOD: _packToolbar +# +# +# +# ------------------------------------------------------------- +itcl::body iwidgets::Toolbar::_packToolbar {} { + + # forget the previous locations + foreach tool $_toolList { + pack forget $tool + } + + # pack in order of _toolList. + foreach tool $_toolList { + # adjust for radios and checks to match buttons + if { [winfo class $tool] == "Radiobutton" || + [winfo class $tool] == "Checkbutton" } { + set iPad 1 + } else { + set iPad 0 + } + + # pack by horizontal or vertical orientation + if {$itk_option(-orient) == "horizontal" } { + pack $tool -side left -fill y \ + -ipadx $iPad -ipady $iPad + } else { + pack $tool -side top -fill x \ + -ipadx $iPad -ipady $iPad + } + } +} |