JAL-2089 patch broken merge to master for Release 2.10.0b1
[jalview.git] / src / jalview / appletgui / EmbmenuFrame.java
index bea9e13..f61077a 100644 (file)
@@ -20,8 +20,6 @@
  */
 package jalview.appletgui;
 
-import jalview.util.MessageManager;
-
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.FlowLayout;
@@ -35,12 +33,12 @@ import java.awt.Panel;
 import java.awt.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;
 
 /**
- * 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 +51,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<Label, PopupMenu> embeddedPopup = new HashMap<Label, PopupMenu>();
 
   /**
    * the embedded menu is built on this and should be added to the frame at the
@@ -94,77 +97,43 @@ public class EmbmenuFrame extends Frame implements MouseListener
     // DEBUG Hint: can test embedded menus by inserting true here.
     if (new jalview.util.Platform().isAMac())
     {
-      // Build the embedded menu panel
-      embeddedMenu = makeEmbeddedPopupMenu(topMenuBar, "Arial", Font.PLAIN,
-              11, true); // try to pickup system font.
+      // Build the embedded menu panel, allowing override with system font
+      embeddedMenu = makeEmbeddedPopupMenu(topMenuBar, true, false);
       setMenuBar(null);
-      // add the components to the TreePanel area.
+      // 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 +146,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,27 +155,22 @@ 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);
@@ -219,7 +179,7 @@ public class EmbmenuFrame extends Frame implements MouseListener
     {
       Menu mi = 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();
@@ -260,7 +220,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 +247,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();