neingeist
/
arduinisten
Archived
1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

397 lines
13 KiB
Plaintext

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

# 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.
}