# GDBToolBar # Copyright (C) 2000 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License (GPL) as published by # the Free Software Foundation; either version 2 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # ---------------------------------------------------------------------- # Implements a toolbar. # # PUBLIC ATTRIBUTES: # # # METHODS: # # configure ....... used to change public attributes # # PRIVATE METHODS # # X11 OPTION DATABASE ATTRIBUTES # # # ---------------------------------------------------------------------- itcl::class GDBToolBar { inherit itk::Widget # ------------------------------------------------------------------ # CONSTRUCTOR - create widget # ------------------------------------------------------------------ constructor {args} { # Make a subframe so that the menu can't accidentally conflict # with a name created by some subclass. set ButtonFrame [frame $itk_interior.t] pack $ButtonFrame $itk_interior -fill both -expand true eval itk_initialize $args } # ------------------------------------------------------------------ # DESTRUCTOR - destroy window containing widget # ------------------------------------------------------------------ destructor { #destroy $this } # ------------------------------------------------------------------ # METHOD: show - show the toolbar # ------------------------------------------------------------------ public method show {} { if {[llength $button_list]} { eval standard_toolbar $ButtonFrame $button_list } } # ------------------------------------------------------------------ # METHOD: set_class_state - standard method to control state by class # ------------------------------------------------------------------ public method set_class_state {enable_list} { debug "Enable list is: $enable_list" foreach {type state} $enable_list { # debug $type if {[info exists button_classes($type)]} { set class_list $button_classes($type) if {[llength $class_list]} { # debug "$type $state \{$class_list\}" foreach button $class_list { # debug "$type $button $state" itemconfigure $button -state $state } } } } } #################################################################### # Methods that deal with buttons. #################################################################### # ------------------------------------------------------------------ # METHOD: add - Add something. # It can be a button a separator or a label. # # type - what we want to add # args - arguments appropriate to what is being added # # ------------------------------------------------------------------ method add {type args} { switch $type { button { eval toolbar_add_button $args } label { eval toolbar_add_label $args } separator { toolbar_add_button_separator } custom { eval toolbar_add_custom $args } default { error "Invalid item type: $type" } } } # ------------------------------------------------------------------ # PRIVATE METHOD: toolbar_add_button - Creates a button, and inserts # it at the end of the button list. Call this when # the toolbar is being set up, but has not yet been # made. # ------------------------------------------------------------------ private method toolbar_add_button {name class command balloon args} { lappend button_list \ [eval _register_button 1 \$name \$class \$command \$balloon $args] } # ------------------------------------------------------------------ # PRIVATE METHOD: toolbar_add_label - Create a label to be inserted # in the toolbar. # ------------------------------------------------------------------ private method toolbar_add_label {name text balloon args} { set lname $ButtonFrame.$name set Buttons($name) $lname set Buttons($lname,align) $button_align eval label $lname -text \$text $args balloon register $lname $balloon lappend button_list $lname } # ------------------------------------------------------------------ # PRIVATE METHOD: toolbar_add_custom - Create a user defined widget # to be inserted in the toolbar. # ------------------------------------------------------------------ private method toolbar_add_custom {name createCmd balloon args} { set wname $ButtonFrame.$name set Buttons($name) $wname set Buttons($wname,align) $button_align eval $createCmd $wname $args balloon register $wname $balloon lappend button_list $wname } # ------------------------------------------------------------------ # PRIVATE METHOD: toolbar_add_button_separator - # ------------------------------------------------------------------ private method toolbar_add_button_separator {} { lappend button_list - } # ------------------------------------------------------------------ # PRIVATE METHOD: _register_button - Creates all the bookkeeping # for a button, without actually inserting it in the toolbar. # If the button will not be immediately inserted (INS == 0), # sets its bindings and appearences to the same of a # standard_toolbar button. # ------------------------------------------------------------------ private method _register_button {ins name class command balloon args} { set bname $ButtonFrame.$name set Buttons($name) $bname set Buttons($bname,align) $button_align eval button $bname -command \$command $args balloon register $bname $balloon foreach elem $class { switch $elem { None {} default { lappend button_classes($elem) $name } } } # If the button is not going to be inserted now... if {! $ins} { # This is a bit of a hack, but I need to bind the standard_toolbar bindings # and appearances to these externally, since I am not inserting them in # the original toolbar... # FIXME: Have to add a method to the libgui toolbar to do this. # Make sure the button acts the way we want, not the default Tk way. $bname configure -takefocus 0 -highlightthickness 0 \ -relief flat -borderwidth 1 set index [lsearch -exact [bindtags $bname] Button] bindtags $bname [lreplace [bindtags $bname] $index $index ToolbarButton] } return $bname } # ------------------------------------------------------------------ # METHOD: create - Creates all the bookkeeping for a button, # without actually inserting it in the toolbar. # ------------------------------------------------------------------ method create {name class command balloon args} { return [eval _register_button 0 \$name \$class \$command \$balloon $args] } # ------------------------------------------------------------------ # METHOD: itemconfigure - # ------------------------------------------------------------------ method itemconfigure {button args} { eval $Buttons($button) configure $args } # ------------------------------------------------------------------ # METHOD: itembind - # ------------------------------------------------------------------ method itembind {button key cmd} { eval [list bind $Buttons($button) $key $cmd] } # ------------------------------------------------------------------ # METHOD: itemballoon - # ------------------------------------------------------------------ method itemballoon {button text} { eval [list balloon register $Buttons($button) $text] } # ------------------------------------------------------------------ # PRIVATE METHOD: toolbar_insert_button - Inserts button "name" before # button "before". # The toolbar must be made, and the buttons must have been # created before you run this. # ------------------------------------------------------------------ private method toolbar_insert_button {name before} { if {[string first "-" $name] == 0} { set name [string range $name 1 end] set add_sep 1 } else { set add_sep 0 } if {![info exists Buttons($name)] || ![info exists Buttons($before)]} { error "toolbar_insert_buttons called with non-existant button" } set before_col [gridCGet $Buttons($before) -column] set before_row [gridCGet $Buttons($before) -row] set slaves [grid slaves $ButtonFrame] set incr [expr 1 + $add_sep] foreach slave $slaves { set slave_col [gridCGet $slave -column] if {$slave_col >= $before_col} { grid configure $slave -column [expr $slave_col + $incr] } } if {$add_sep} { grid $Buttons(-$name) -column $before_col -row $before_row } # Now grid our button. Have to put in the pady since this button # may not have been originally inserted by the libgui toolbar # proc. grid $Buttons($name) -column [expr $before_col + $add_sep] \ -row $before_row -pady 2 } # ------------------------------------------------------------------ # PRIVATE METHOD: toolbar_remove_button - # ------------------------------------------------------------------ private method toolbar_remove_button {name} { if {[string first "-" $name] == 0} { set name [string range $name 1 end] set remove_sep 1 } else { set remove_sep 0 } if {![info exists Buttons($name)] } { error "toolbar_remove_buttons called with non-existant button $name" } set name_col [gridCGet $Buttons($name) -column] set name_row [gridCGet $Buttons($name) -row] grid remove $Buttons($name) if {$remove_sep} { set Buttons(-$name) [grid slaves $ButtonFrame \ -column [expr $name_col - 1] \ -row $name_row] grid remove $Buttons(-$name) } set slaves [grid slaves $ButtonFrame -row $name_row] foreach slave $slaves { set slave_col [gridCGet $slave -column] if {($slave_col > $name_col) && ! ([info exists Buttons($slave,align)] && $Buttons($slave,align) == "right")} { grid configure $slave -column [expr $slave_col - 1 - $remove_sep] } } } # ------------------------------------------------------------------ # METHOD: toolbar_button_right_justify - # ------------------------------------------------------------------ method toolbar_button_right_justify {} { lappend button_list -- set button_align "right" } # ------------------------------------------------------------------ # METHOD: toolbar_swap_button_lists - # ------------------------------------------------------------------ method toolbar_swap_button_lists {in_list out_list} { # Now swap out the buttons... set first_out [lindex $out_list 0] if {[info exists Buttons($first_out)] && [grid info $Buttons($first_out)] != ""} { foreach button $in_list { toolbar_insert_button $button $first_out } foreach button $out_list { toolbar_remove_button $button } } elseif {[info exists Buttons($first_out)]} { debug "Error in swap_button_list - $first_out not gridded..." } else { debug "Button $first_out is not in button list" } } #################################################################### # # PRIVATE DATA # #################################################################### # This is the list of buttons that are being built up # private variable button_list {} # This is an array of buttons names -> Tk Window names # and also of Tk Window names -> column position in grid private variable Buttons # This array holds the button classes. The key is the class name, # and the value is the list of buttons belonging to this class. private variable button_classes # Tell if we are inserting buttons left or right justified private variable button_align "left" #The frame to contain the buttons: private variable ButtonFrame #################################################################### # # PROTECTED DATA # #################################################################### # None. #################################################################### # # PUBLIC DATA # #################################################################### # None. }