| # |
| # 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: toolbar.itk,v 1.5 2001/08/17 19:05:54 smithc Exp $ |
| # ---------------------------------------------------------------------- |
| # 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 |
| } |
| } |
| } |