/* * MenuStrip.java * (FScape) * * Copyright (c) 2001-2016 Hanns Holger Rutz. All rights reserved. * * This software is published under the GNU General Public License v3+ * * * For further information, please contact Hanns Holger Rutz at * contact@sciss.de */ package de.sciss.fscape.gui; import java.awt.event.*; import java.util.*; import javax.swing.*; /** * MenuBar-Klasse */ public class MenuStrip extends JMenu { // -------- private variables -------- protected Hashtable<String, JMenuItem> h; // Objects = Menus/Items, Keys = ActionCommands (z.B. "&ZUndo") protected String label; protected ActionListener listener; // -------- public methods -------- // public boolean setItemEnabled( String menuItem, boolean enable ); // public static boolean setItemEnabled( MenuBar mb, String menuItem, boolean enable ); // public boolean setItemJLabel( String menuItem, String label ); // public static boolean setItemJLabel( MenuBar mb, String menuItem, String label ); // public JMenuItem getItem( String menuItem ); // public static JMenuItem getItem( MenuBar mb, String menuItem ); /** * @param label Name fuer den Strip * @param menuItems inneres Array: 1 String fuer normale Items, mehrere fuer SubMenus * ( "&c"-Anfang fuer Shortcuts; "#"-Ende fuer JCheckBoxes ) * @param listener ActionListener, der die Menuwahlen verarbeiten soll */ public MenuStrip( String label, String menuItems[][], ActionListener listener ) { super( label ); this.label = label; this.listener = listener; h = new Hashtable<String, JMenuItem>(); h.put( label, this ); // register myself createStrip( this, h, menuItems, listener ); } /** * JMenuItem waehlbar/ghosted-Status aendern * * @param menuItem ActionString des gewuenschten Items * @param enable true (waehlbar) bzw. false (ghosted) * @return false, wenn Item nicht gefunden wurde */ public boolean setItemEnabled( String menuItem, boolean enable ) { JMenuItem mi = h.get( menuItem ); if( mi != null ) { mi.setEnabled( enable ); } return( mi != null ); } /** * JMenuItem waehlbar/ghosted-Status aendern; durchsucht alle Menues einer MenuBar * * @param mb MenuBar, in dessen Menus sich das Item befindet * @param menuItem ActionString des gewuenschten Items * @param enable true (waehlbar) bzw. false (ghosted) * @return false, wenn Item nicht gefunden wurde */ public static boolean setItemEnabled( JMenuBar mb, String menuItem, boolean enable ) { MenuStrip m; JMenuItem mi; for( int i = 0; i < mb.getMenuCount(); i++ ) { m = (MenuStrip) mb.getMenu( i ); mi = m.getItem( menuItem ); if( mi != null ) { mi.setEnabled( enable ); return true; } } return false; } /** * JLabel eines JMenuItems setzen * * @param menuItem ActionString des gewuenschten Items * @param label neuer String ggf. mit Shortcut; entspricht dem ActionCommand * @return false, wenn Item nicht gefunden wurde */ public boolean setItemJLabel( String menuItem, String label ) { JMenuItem mi = h.get( menuItem ); if( mi != null ) { h.remove( menuItem ); // alter Key ungueltig setItemLabelAndCut( mi, label ); h.put( menuItem, mi ); // mit neuem wieder anmelden } return( mi != null ); } /** * JLabel eines JMenuItems setzen; durchsucht alle Menues einer MenuBar * * @param mb MenuBar, in dessen Menus sich das Item befindet * @param menuItem ActionString des gewuenschten Items * @param label neuer String ggf. mit Shortcut; entspricht dem ActionCommand * @return false, wenn Item nicht gefunden wurde */ public static boolean setItemJLabel( JMenuBar mb, String menuItem, String label ) { MenuStrip m; JMenuItem mi; for( int i = 0; i < mb.getMenuCount(); i++ ) { m = (MenuStrip) mb.getMenu( i ); mi = m.getItem( menuItem ); if( mi != null ) { return( m.setItemJLabel( menuItem, label )); } } return false; } /** * JMenuItem aus ActionCommand bzw. JLabel ermitteln * * @param menuItem ActionString des gewuenschten Items * @return null, wenn Item nicht gefunden wurde */ public JMenuItem getItem( String menuItem ) { return h.get( menuItem ); } /** * JMenuItem aus ActionCommand bzw. JLabel ermitteln; durchsucht alle Menues einer MenuBar * * @param mb MenuBar, in dessen Menus sich das Item befindet * @param menuItem ActionString des gewuenschten Items * @return null, wenn Item nicht gefunden wurde */ public static JMenuItem getItem( JMenuBar mb, String menuItem ) { MenuStrip m; JMenuItem mi; for( int i = 0; i < mb.getMenuCount(); i++ ) { m = (MenuStrip) mb.getMenu( i ); mi = m.getItem( menuItem ); if( mi != null ) { return mi; } } return null; } // -------- quasi-protected methods -------- /** * Strip erstellen * ONLY TO BE CALLED BY THIS CLASS OR POPUPSTRIP !!! * * @param m aufrufender MenuStrip oder PopupStrip * @param h Hashtable mit Items als Objekte und ActionCommand als Keys * @param menuItems inneres Array: 1 String fuer normale Items, mehrere fuer SubMenus * ( "&c"-Anfang fuer Shortcuts; "#"-Ende fuer JCheckBoxes ) * @param listener ActionListener, der die Menuwahlen verarbeiten soll */ public static void createStrip( JMenu m, Hashtable<String, JMenuItem> h, String[][] menuItems, ActionListener listener ) { JMenu m2; JMenuItem mi; boolean sub; String miStr; for( int i = 0; i < menuItems.length; i++ ) { sub = (menuItems[ i ].length > 1); m2 = m; for( int j = 0; j < menuItems[ i ].length; j++ ) { miStr = menuItems[ i ][ j ]; if( miStr == null ) { m2.addSeparator(); } else { if( (j == 0) && (sub) ) { m2 = new JMenu(); mi = m2; m.add( mi ); } else { if( miStr.endsWith( "#" )) { // JCheckBox mi = new JCheckBoxMenuItem(); } else { mi = new JMenuItem(); } m2.add( mi ); } setItemLabelAndCut( mi, miStr ); mi.addActionListener( listener ); h.put( miStr, mi ); // Item in die Hashtable aufnehmen; Key = ActionCommand } } } } /** * Sichtbares JLabel und Shortcut des JMenuItems setzen * ONLY TO BE CALLED BY THIS CLASS AND POPUPSTRIP !!! * * @param mi JMenuItem * @param label String ggf. inklusive Shortcut */ public static void setItemLabelAndCut( JMenuItem mi, String label ) { mi.setActionCommand( label ); if( label.endsWith( "#" )) { // JCheckBox label = label.substring( 0, label.length() - 1 ); } if( label.startsWith( "&" )) { // mi.setShortcut( new MenuShortcut( label.charAt( 1 ))); label = label.substring( 2 ); } else { // mi.deleteShortcut(); } mi.setText( label ); } } // class MenuStrip