332 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			332 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| # 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
 | ||
| }
 |