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.

333 lines
11 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.

# GDBMenuBar
# Copyright (C) 2000, 2004 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 GDB menubar.
#
# PUBLIC ATTRIBUTES:
#
#
# METHODS:
#
# configure ....... used to change public attributes
#
# PRIVATE METHODS
#
# X11 OPTION DATABASE ATTRIBUTES
#
#
# ----------------------------------------------------------------------
itcl::class GDBMenuBar {
inherit itk::Widget
# ------------------------------------------------------------------
# CONSTRUCTOR - create widget
# ------------------------------------------------------------------
constructor {args} {
set Menu [menu $itk_interior.m -tearoff 0]
eval itk_initialize $args
}
# ------------------------------------------------------------------
# DESTRUCTOR - destroy window containing widget
# ------------------------------------------------------------------
destructor {
#destroy $this
}
# ------------------------------------------------------------------
# METHOD: show - attach menu to the toplevel window
# ------------------------------------------------------------------
public method show {} {
[winfo toplevel $itk_interior] configure -menu $Menu
}
# ------------------------------------------------------------------
# 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 menu_classes($type)]} {
set class_list $menu_classes($type)
if {[llength $class_list]} {
# debug "$type $state \{$class_list\}"
foreach menu $class_list {
# debug "$type $menu $state"
menubar_change_menu_state $menu $state
}
}
}
}
}
####################################################################
# Methods that deal with menus.
#
# The next set of methods control the menubar associated with the
# toolbar. Currently, only sequential addition of submenu's and menu
# entries is allowed. Here's what you do. First, create a submenu
# with the "new_menu" command. This submenu is the targeted menu.
# Subsequent calls to add_menu_separator, and add_menu_command add
# separators and commands to the end of this submenu.
# If you need to edit a submenu, call clear_menu and then add all the
# items again.
#
# Each menu command also has a class list. Transitions between states
# of gdb will enable and disable different classes of menus.
#
# FIXME - support insert_command, and also cascade menus, whenever
# we need it...
####################################################################
# ------------------------------------------------------------------
# METHOD: add - Add something.
# It can be a menubutton for the main menu,
# a separator or a command.
#
# type - what we want to add
# args - arguments appropriate to what is being added
#
# RETURNS: the cascade menu widget path.
# ------------------------------------------------------------------
method add {type args} {
switch $type {
menubutton {
eval menubar_new_menu $args
}
command {
eval menubar_add_menu_command $args
}
separator {
menubar_add_menu_separator
}
cascade {
eval menubar_add_cascade $args
}
default {
error "Invalid item type: $type"
}
}
return $current_menu
}
# ------------------------------------------------------------------
# NAME: private method GDBMenuBar::menubar_add_cascade
# DESCRIPTION: Create a new cascading menu in the current menu
#
# ARGUMENTS: menu_name - the name of the menu to be created
# label - label to be displayed for the menu
# underline - which element to underline for shortcuts
# RETURNS: Nothing
# ------------------------------------------------------------------
private method menubar_add_cascade {menu_name class label underline} {
set m [menu $current_menu.$menu_name -tearoff false]
$current_menu add cascade -menu $m -label $label \
-underline $underline
incr item_number
switch $class {
None {}
default {
foreach elem $class {
lappend menu_classes($elem) [list $current_menu $item_number]
}
}
}
set current_menu $m
}
# ------------------------------------------------------------------
# PRIVATE METHOD: menubar_new_menu - Add a new menu to the main
# menu.
# Also target this menu for subsequent
# menubar_add_menu_command calls.
#
# name - the token for the new menu
# label - The label used for the label
# underline - the index of the underlined character for this menu item.
#
# ------------------------------------------------------------------
private method menubar_new_menu {name label underline args} {
set current_menu $Menu.$name
$Menu add cascade -menu $current_menu -label $label \
-underline $underline
eval menu $current_menu -tearoff 0 $args
# Save the index number of this menu. It is always the last one.
set menu_list($name) [$Menu index end]
set menu_list($name,label) $label
set item_number -1
}
# ------------------------------------------------------------------
# PRIVATE METHOD: menubar_add_menu_command - Adds a menu command item
# to the currently targeted submenu of the main menu.
#
# class - The class of the command, used for disabling entries.
# label - The text for the command.
# command - The command for the menu entry
# args - Passed to the menu entry creation command (eval'ed)
# ------------------------------------------------------------------
private method menubar_add_menu_command {class label command args} {
eval $current_menu add command -label \$label -command \$command \
$args
incr item_number
switch $class {
None {}
default {
foreach elem $class {
lappend menu_classes($elem) [list $current_menu $item_number]
}
}
}
}
# ------------------------------------------------------------------
# PRIVATE METHOD: menubar_add_menu_separator - Adds a menu separator
# to the currently targeted submenu of the main menu.
#
# ------------------------------------------------------------------
private method menubar_add_menu_separator {} {
incr item_number
$current_menu add separator
}
# ------------------------------------------------------------------
# METHOD: exists - Report whether a menu keyed by NAME exists.
#
# name - the token for the menu sought
#
# RETURNS: 1 if the menu exists, 0 otherwise.
# ------------------------------------------------------------------
method exists {name} {
return [info exists menu_list($name)]
}
# ------------------------------------------------------------------
# METHOD: clear - Deletes the items from one of the
# main menu cascade menus. Also makes this menu
# the target menu.
#
# name - the token for the new menu
#
# RETURNS: then item number of the menu, or "" if the menu is not found.
#
# FIXME: Does not remove the deleted menus from their class lists.
# ------------------------------------------------------------------
method clear {name} {
if {[info exists menu_list($name)]} {
set current_menu [$Menu entrycget $menu_list($name) -menu]
$current_menu delete 0 end
set item_number -1
return $current_menu
} else {
return ""
}
}
# ------------------------------------------------------------------
# METHOD: delete - Deletes one of the main menu
# cascade menus. Also makes the previous menu the
# target menu.
#
# name - the token for the new menu
#
# RETURNS: then item number of the menu, or "" if the menu is not found.
#
# FIXME: Does not remove the deleted menus from their class lists.
# ------------------------------------------------------------------
method delete {name} {
if {[info exists menu_list($name)]} {
$Menu delete $menu_list($name,label)
set current_menu {}
unset menu_list($name,label)
unset menu_list($name)
}
}
# ------------------------------------------------------------------
# PRIVATE METHOD: menubar_change_menu_state - Does the actual job of
# enabling menus...
#
# INPUT: Pass normal or disabled for the state.
# ------------------------------------------------------------------
private method menubar_change_menu_state {menu state} {
[lindex $menu 0] entryconfigure [lindex $menu 1] -state $state
}
# ------------------------------------------------------------------
# METHOD: menubar_set_current_menu - Change the current_menu pointer.
# Returns the current value so it can be restored.
# ------------------------------------------------------------------
method menubar_set_current_menu {menup} {
set saved_menu $current_menu
set current_menu $menup
return $saved_menu
}
# ------------------------------------------------------------------
# METHOD: menubar_get_current_menu - Get the current_menu pointer.
# Returns the current value so it can be restored.
# ------------------------------------------------------------------
method menubar_get_current_menu {} {
return $current_menu
}
####################################################################
#
# PRIVATE DATA
#
####################################################################
# This array holds the menu classes. The key is the class name,
# and the value is the list of menus belonging to this class.
private variable menu_classes
# This array holds the pathname that corresponds to a menu name
private variable menu_list
private variable item_number -1
private variable current_menu {}
####################################################################
#
# PROTECTED DATA
#
####################################################################
# The menu Tk widget
protected variable Menu
####################################################################
#
# PUBLIC DATA
#
####################################################################
# None
}