X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fappletgui%2FEmbmenuFrame.java;h=afb2c1e21b4287ba345fb8478ee1fc9237a9173d;hb=eb40ed78f348375efcd74b5a683bdc2380b3bd61;hp=359f5d8dec7a0b12fecd62f7d7ffc45999b99d19;hpb=ab43013b7e357b84b4abade0dba949668dfb2a0e;p=jalview.git diff --git a/src/jalview/appletgui/EmbmenuFrame.java b/src/jalview/appletgui/EmbmenuFrame.java index 359f5d8..afb2c1e 100644 --- a/src/jalview/appletgui/EmbmenuFrame.java +++ b/src/jalview/appletgui/EmbmenuFrame.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1) - * Copyright (C) 2014 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * @@ -20,27 +20,30 @@ */ package jalview.appletgui; -import jalview.util.MessageManager; +import jalview.util.Platform; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Font; -import java.awt.Frame; +import awt2swing.Frame; import java.awt.HeadlessException; -import java.awt.Label; -import java.awt.Menu; -import java.awt.MenuBar; -import java.awt.Panel; -import java.awt.PopupMenu; +import awt2swing.Label; +import awt2swing.Menu; +import awt2swing.MenuBar; +import awt2swing.MenuItem; +import awt2swing.Panel; +import awt2swing.PopupMenu; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; -import java.util.Enumeration; -import java.util.Hashtable; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.JMenuItem; /** - * This class implements a pattern form embedding toolbars as a panel with - * popups for situations where the system menu bar is either invisible or + * This class implements a pattern for embedding toolbars as a panel with popups + * for situations where the system menu bar is either invisible or * inappropriate. It was derived from the code for embedding the jalview applet * alignFrame as a component on the web-page, which requires the local * alignFrame menu to be attached to that panel rather than placed on the parent @@ -53,10 +56,15 @@ import java.util.Hashtable; */ public class EmbmenuFrame extends Frame implements MouseListener { + protected static final Font FONT_ARIAL_PLAIN_11 = new Font( + "Arial", Font.PLAIN, 11); + + public static final Font DEFAULT_MENU_FONT = FONT_ARIAL_PLAIN_11; + /** * map from labels to popup menus for the embedded menubar */ - protected Hashtable embeddedPopup; + protected Map embeddedPopup = new HashMap(); /** * the embedded menu is built on this and should be added to the frame at the @@ -86,85 +94,51 @@ public class EmbmenuFrame extends Frame implements MouseListener */ protected boolean embedMenuIfNeeded(Panel tobeAdjusted) { - MenuBar topMenuBar = getMenuBar(); + MenuBar topMenuBar = (MenuBar) getJMenuBar(); if (topMenuBar == null) { return false; } // DEBUG Hint: can test embedded menus by inserting true here. - if (new jalview.util.Platform().isAMac()) + if (Platform.isAMac()) { - // Build the embedded menu panel - embeddedMenu = makeEmbeddedPopupMenu(topMenuBar, "Arial", Font.PLAIN, - 11, true); // try to pickup system font. - setMenuBar(null); - // add the components to the TreePanel area. + // Build the embedded menu panel, allowing override with system font + embeddedMenu = makeEmbeddedPopupMenu(topMenuBar, true, false); + unsetMenuBar(); + // add the components to the Panel area. add(embeddedMenu, BorderLayout.NORTH); - tobeAdjusted.setSize(getSize().width, getSize().height - - embeddedMenu.HEIGHT); + tobeAdjusted.setSize(getSize().width, + getSize().height - embeddedMenu.getHeight()); return true; } return false; } /** - * move all menus on menuBar onto embeddedMenu. embeddedPopup is used to store - * the popups for each menu removed from the menuBar and added to the panel. - * NOTE: it is up to the caller to remove menuBar from the Frame if it is - * already attached. - * - * @param menuBar - * @param fn - * @param fstyle - * @param fsz - * @param overrideFonts - * true if we take the menuBar fonts in preference to the supplied - * defaults - * @return the embedded menu instance to be added to the frame. - */ - protected Panel makeEmbeddedPopupMenu(MenuBar menuBar, String fn, - int fstyle, int fsz, boolean overrideFonts) - { - return makeEmbeddedPopupMenu(menuBar, fn, fstyle, fsz, overrideFonts, - false); - } - - /** * Create or add elements to the embedded menu from menuBar. This removes all * menu from menuBar and it is up to the caller to remove the now useless * menuBar from the Frame if it is already attached. * * @param menuBar - * @param fn - * @param fstyle - * @param fsz * @param overrideFonts * @param append * true means existing menu will be emptied before adding new * elements * @return */ - protected Panel makeEmbeddedPopupMenu(MenuBar menuBar, String fn, - int fstyle, int fsz, boolean overrideFonts, boolean append) + protected Panel makeEmbeddedPopupMenu(MenuBar menuBar, + boolean overrideFonts, boolean append) { if (!append) { - if (embeddedPopup != null) - { - embeddedPopup.clear(); // TODO: check if j1.1 - } + embeddedPopup.clear(); // TODO: check if j1.1 if (embeddedMenu != null) { embeddedMenu.removeAll(); } } - if (embeddedPopup == null) - { - embeddedPopup = new Hashtable(); - } - - embeddedMenu = makeEmbeddedPopupMenu(menuBar, fn, fstyle, fsz, - overrideFonts, embeddedPopup, new Panel(), this); + embeddedMenu = makeEmbeddedPopupMenu(menuBar, DEFAULT_MENU_FONT, + overrideFonts, new Panel(), this); return embeddedMenu; } @@ -177,12 +151,8 @@ public class EmbmenuFrame extends Frame implements MouseListener * * @param menuBar * must be non-null - * @param fn - * @param fstyle - * @param fsz + * @param font * @param overrideFonts - * @param embeddedPopup - * must be non-null * @param embeddedMenu * if null, a new panel will be created and returned * @param clickHandler @@ -190,42 +160,43 @@ public class EmbmenuFrame extends Frame implements MouseListener * embeddedPopup and embeddedMenu * @return the panel instance for convenience. */ - protected Panel makeEmbeddedPopupMenu(MenuBar menuBar, String fn, - int fstyle, int fsz, boolean overrideFonts, - Hashtable embeddedPopup, Panel embeddedMenu, + protected Panel makeEmbeddedPopupMenu(MenuBar menuBar, Font font, + boolean overrideFonts, + Panel embeddedMenu, MouseListener clickHandler) { - if (embeddedPopup == null) - { - throw new Error(MessageManager.getString("error.implementation_error_embeddedpopup_not_null")); - } + if (overrideFonts) { Font mbf = menuBar.getFont(); if (mbf != null) { - fn = mbf.getName(); - fstyle = mbf.getStyle(); - fsz = mbf.getSize(); + font = mbf; } } if (embeddedMenu == null) + { embeddedMenu = new Panel(); + } FlowLayout flowLayout1 = new FlowLayout(); embeddedMenu.setBackground(Color.lightGray); embeddedMenu.setLayout(flowLayout1); // loop thru for (int mbi = 0, nMbi = menuBar.getMenuCount(); mbi < nMbi; mbi++) { - Menu mi = menuBar.getMenu(mbi); + Menu mi = (Menu) menuBar.getMenu(mbi); Label elab = new Label(mi.getLabel()); - elab.setFont(new java.awt.Font(fn, fstyle, fsz)); + elab.setFont(font); // add the menu entries PopupMenu popup = new PopupMenu(); int m, mSize = mi.getItemCount(); for (m = 0; m < mSize; m++) { - popup.add(mi.getItem(m)); + // BH slight difference in Swing -- no actual item separator, just null + if (mi.getItem(m) == null) + popup.addSeparator(); + else + popup.add(mi.getItem(m)); mSize--; m--; } @@ -260,7 +231,7 @@ public class EmbmenuFrame extends Frame implements MouseListener */ PopupMenu getPopupMenu(Label source) { - return (PopupMenu) embeddedPopup.get(source); + return embeddedPopup.get(source); } public void mouseClicked(MouseEvent evt) @@ -287,10 +258,8 @@ public class EmbmenuFrame extends Frame implements MouseListener { if (embeddedPopup != null) { - Enumeration e = embeddedPopup.keys(); - while (e.hasMoreElements()) + for (Label lb : embeddedPopup.keySet()) { - Label lb = (Label) e.nextElement(); lb.removeMouseListener(this); } embeddedPopup.clear();