-/*
- * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
- * Copyright (C) $$Year-Rel$$ The Jalview Authors
- *
- * This file is part of Jalview.
- *
- * Jalview is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation, either version 3
- * of the License, or (at your option) any later version.
- *
- * Jalview 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
- * The Jalview Authors are detailed in the 'AUTHORS' file.
- */
-package jalview.appletgui;
-
-import jalview.util.Platform;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.FlowLayout;
-import java.awt.Font;
-import java.awt.HeadlessException;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-
-/**
- * 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
- * (which isn't allowed anyhow). TODO: try to modify the embeddedMenu display so
- * it looks like a real toolbar menu TODO: modify click/mouse handler for
- * embeddedMenu so it behaves more like a real pulldown menu toolbar
- *
- * @author Jim Procter and Andrew Waterhouse
- *
- */
-public class EmbmenuFrame extends JFrame 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 Map<JLabel, JPopupMenu> embeddedPopup = new HashMap<JLabel, JPopupMenu>();
-
- /**
- * the embedded menu is built on this and should be added to the frame at the
- * appropriate position.
- *
- */
- protected JPanel embeddedMenu;
-
- public EmbmenuFrame() throws HeadlessException
- {
- super();
- }
-
- public EmbmenuFrame(String title) throws HeadlessException
- {
- //super(title);
- }
-
- /**
- * Check if the applet is running on a platform that requires the Frame
- * menuBar to be embedded, and if so, embeds it.
- *
- * @param tobeAdjusted
- * the panel that is to be reduced to make space for the embedded
- * menu bar
- * @return true if menuBar was embedded and tobeAdjusted's height modified
- */
- protected boolean embedMenuIfNeeded(JPanel tobeAdjusted)
- {
- JMenuBar topMenuBar = getJMenuBar();
- if (topMenuBar == null)
- {
- return false;
- }
- // DEBUG Hint: can test embedded menus by inserting true here.
- if (Platform.isAMac())
- {
- // Build the embedded menu panel, allowing override with system font
- embeddedMenu = makeEmbeddedPopupMenu(topMenuBar, true, false);
- setJMenuBar(null);
- // add the components to the Panel area.
- add(embeddedMenu, BorderLayout.NORTH);
- tobeAdjusted.setSize(getSize().width,
- getSize().height - embeddedMenu.getHeight());
- return true;
- }
- return 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 overrideFonts
- * @param append
- * true means existing menu will be emptied before adding new
- * elements
- * @return
- */
- protected JPanel makeEmbeddedPopupMenu(JMenuBar menuBar,
- boolean overrideFonts, boolean append)
- {
- if (!append)
- {
- embeddedPopup.clear(); // TODO: check if j1.1
- if (embeddedMenu != null)
- {
- embeddedMenu.removeAll();
- }
- }
- embeddedMenu = makeEmbeddedPopupMenu(menuBar, DEFAULT_MENU_FONT,
- overrideFonts, new JPanel(), this);
- return embeddedMenu;
- }
-
- /**
- * Generic method to move elements from menubar onto embeddedMenu using the
- * existing or the supplied font, and adds binding from panel to attached
- * menus in embeddedPopup 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
- * must be non-null
- * @param font
- * @param overrideFonts
- * @param embeddedMenu
- * if null, a new panel will be created and returned
- * @param clickHandler
- * - usually the instance of EmbmenuFrame that holds references to
- * embeddedPopup and embeddedMenu
- * @return the panel instance for convenience.
- */
- protected JPanel makeEmbeddedPopupMenu(JMenuBar menuBar, Font font,
- boolean overrideFonts,
- JPanel embeddedMenu,
- MouseListener clickHandler)
- {
- if (overrideFonts)
- {
- Font mbf = menuBar.getFont();
- if (mbf != null)
- {
- font = mbf;
- }
- }
- if (embeddedMenu == null)
- {
- embeddedMenu = new JPanel();
- }
- FlowLayout flowLayout1 = new FlowLayout();
- embeddedMenu.setBackground(Color.lightGray);
- embeddedMenu.setLayout(flowLayout1);
- // loop thru
- for (int mbi = 0, nMbi = menuBar.getMenuCount(); mbi < nMbi; mbi++)
- {
- JMenu mi = menuBar.getMenu(mbi);
- JLabel elab = new JLabel(mi.getLabel());
- elab.setFont(font);
- // add the menu entries
- JPopupMenu popup = new JPopupMenu();
- int m, mSize = mi.getItemCount();
- for (m = 0; m < mSize; m++)
- {
- popup.add(mi.getItem(m));
- mSize--;
- m--;
- }
- embeddedPopup.put(elab, popup);
- embeddedMenu.add(elab);
- elab.addMouseListener(clickHandler);
- }
- flowLayout1.setAlignment(FlowLayout.LEFT);
- flowLayout1.setHgap(2);
- flowLayout1.setVgap(0);
- return embeddedMenu;
- }
-
- public void mousePressed(MouseEvent evt)
- {
- JPopupMenu popup = null;
- JLabel source = (JLabel) evt.getSource();
- popup = getPopupMenu(source);
- if (popup != null)
- {
- embeddedMenu.add(popup);
- popup.show(embeddedMenu, source.getBounds().x, source.getBounds().y
- + source.getBounds().getSize().height);
- }
- }
-
- /**
- * get the menu for source from the hash.
- *
- * @param source
- * what was clicked on.
- */
- JPopupMenu getPopupMenu(JLabel source)
- {
- return embeddedPopup.get(source);
- }
-
- public void mouseClicked(MouseEvent evt)
- {
- }
-
- public void mouseReleased(MouseEvent evt)
- {
- }
-
- public void mouseEntered(MouseEvent evt)
- {
- }
-
- public void mouseExited(MouseEvent evt)
- {
- }
-
- /**
- * called to clear the GUI resources taken up for embedding and remove any
- * self references so we can be garbage collected.
- */
- public void destroyMenus()
- {
- if (embeddedPopup != null)
- {
- for (JLabel lb : embeddedPopup.keySet())
- {
- lb.removeMouseListener(this);
- }
- embeddedPopup.clear();
- }
- if (embeddedMenu != null)
- {
- embeddedMenu.removeAll();
- }
- }
-
- /**
- * calls destroyMenus()
- */
- public void finalize() throws Throwable
- {
- destroyMenus();
- embeddedPopup = null;
- embeddedMenu = null;
- super.finalize();
- }
-}
+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)\r
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors\r
+ * \r
+ * This file is part of Jalview.\r
+ * \r
+ * Jalview is free software: you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License \r
+ * as published by the Free Software Foundation, either version 3\r
+ * of the License, or (at your option) any later version.\r
+ * \r
+ * Jalview is distributed in the hope that it will be useful, but \r
+ * WITHOUT ANY WARRANTY; without even the implied warranty \r
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
+ * PURPOSE. See the GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.\r
+ * The Jalview Authors are detailed in the 'AUTHORS' file.\r
+ */\r
+package jalview.appletgui;\r
+\r
+import jalview.util.Platform;\r
+\r
+import java.awt.BorderLayout;\r
+import java.awt.Color;\r
+import java.awt.FlowLayout;\r
+import java.awt.Font;\r
+import java.awt.HeadlessException;\r
+import java.awt.event.MouseEvent;\r
+import java.awt.event.MouseListener;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import javax.swing.JFrame;\r
+import javax.swing.JLabel;\r
+import javax.swing.JMenu;\r
+import javax.swing.JMenuBar;\r
+import javax.swing.JPanel;\r
+import javax.swing.JPopupMenu;\r
+\r
+/**\r
+ * This class implements a pattern for embedding toolbars as a panel with popups\r
+ * for situations where the system menu bar is either invisible or\r
+ * inappropriate. It was derived from the code for embedding the jalview applet\r
+ * alignFrame as a component on the web-page, which requires the local\r
+ * alignFrame menu to be attached to that panel rather than placed on the parent\r
+ * (which isn't allowed anyhow). TODO: try to modify the embeddedMenu display so\r
+ * it looks like a real toolbar menu TODO: modify click/mouse handler for\r
+ * embeddedMenu so it behaves more like a real pulldown menu toolbar\r
+ * \r
+ * @author Jim Procter and Andrew Waterhouse\r
+ * \r
+ */\r
+public class EmbmenuFrame extends JFrame implements MouseListener\r
+{\r
+ protected static final Font FONT_ARIAL_PLAIN_11 = new Font(\r
+ "Arial", Font.PLAIN, 11);\r
+\r
+ public static final Font DEFAULT_MENU_FONT = FONT_ARIAL_PLAIN_11;\r
+\r
+ /**\r
+ * map from labels to popup menus for the embedded menubar\r
+ */\r
+ protected Map<JLabel, JPopupMenu> embeddedPopup = new HashMap<JLabel, JPopupMenu>();\r
+\r
+ /**\r
+ * the embedded menu is built on this and should be added to the frame at the\r
+ * appropriate position.\r
+ * \r
+ */\r
+ protected JPanel embeddedMenu;\r
+\r
+ public EmbmenuFrame() throws HeadlessException\r
+ {\r
+ super();\r
+ }\r
+\r
+ public EmbmenuFrame(String title) throws HeadlessException\r
+ {\r
+ //super(title);\r
+ }\r
+\r
+ /**\r
+ * Check if the applet is running on a platform that requires the Frame\r
+ * menuBar to be embedded, and if so, embeds it.\r
+ * \r
+ * @param tobeAdjusted\r
+ * the panel that is to be reduced to make space for the embedded\r
+ * menu bar\r
+ * @return true if menuBar was embedded and tobeAdjusted's height modified\r
+ */\r
+ protected boolean embedMenuIfNeeded(JPanel tobeAdjusted)\r
+ {\r
+ JMenuBar topMenuBar = getJMenuBar();\r
+ if (topMenuBar == null)\r
+ {\r
+ return false;\r
+ }\r
+ // DEBUG Hint: can test embedded menus by inserting true here.\r
+ if (Platform.isAMac())\r
+ {\r
+ // Build the embedded menu panel, allowing override with system font\r
+ embeddedMenu = makeEmbeddedPopupMenu(topMenuBar, true, false);\r
+ setJMenuBar(null);\r
+ // add the components to the Panel area.\r
+ add(embeddedMenu, BorderLayout.NORTH);\r
+ tobeAdjusted.setSize(getSize().width,\r
+ getSize().height - embeddedMenu.getHeight());\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+ /**\r
+ * Create or add elements to the embedded menu from menuBar. This removes all\r
+ * menu from menuBar and it is up to the caller to remove the now useless\r
+ * menuBar from the Frame if it is already attached.\r
+ * \r
+ * @param menuBar\r
+ * @param overrideFonts\r
+ * @param append\r
+ * true means existing menu will be emptied before adding new\r
+ * elements\r
+ * @return\r
+ */\r
+ protected JPanel makeEmbeddedPopupMenu(JMenuBar menuBar,\r
+ boolean overrideFonts, boolean append)\r
+ {\r
+ if (!append)\r
+ {\r
+ embeddedPopup.clear(); // TODO: check if j1.1\r
+ if (embeddedMenu != null)\r
+ {\r
+ embeddedMenu.removeAll();\r
+ }\r
+ }\r
+ embeddedMenu = makeEmbeddedPopupMenu(menuBar, DEFAULT_MENU_FONT,\r
+ overrideFonts, new JPanel(), this);\r
+ return embeddedMenu;\r
+ }\r
+\r
+ /**\r
+ * Generic method to move elements from menubar onto embeddedMenu using the\r
+ * existing or the supplied font, and adds binding from panel to attached\r
+ * menus in embeddedPopup This removes all menu from menuBar and it is up to\r
+ * the caller to remove the now useless menuBar from the Frame if it is\r
+ * already attached.\r
+ * \r
+ * @param menuBar\r
+ * must be non-null\r
+ * @param font\r
+ * @param overrideFonts\r
+ * @param embeddedMenu\r
+ * if null, a new panel will be created and returned\r
+ * @param clickHandler\r
+ * - usually the instance of EmbmenuFrame that holds references to\r
+ * embeddedPopup and embeddedMenu\r
+ * @return the panel instance for convenience.\r
+ */\r
+ protected JPanel makeEmbeddedPopupMenu(JMenuBar menuBar, Font font,\r
+ boolean overrideFonts,\r
+ JPanel embeddedMenu,\r
+ MouseListener clickHandler)\r
+ {\r
+ if (overrideFonts)\r
+ {\r
+ Font mbf = menuBar.getFont();\r
+ if (mbf != null)\r
+ {\r
+ font = mbf;\r
+ }\r
+ }\r
+ if (embeddedMenu == null)\r
+ {\r
+ embeddedMenu = new JPanel();\r
+ }\r
+ FlowLayout flowLayout1 = new FlowLayout();\r
+ embeddedMenu.setBackground(Color.lightGray);\r
+ embeddedMenu.setLayout(flowLayout1);\r
+ // loop thru\r
+ for (int mbi = 0, nMbi = menuBar.getMenuCount(); mbi < nMbi; mbi++)\r
+ {\r
+ JMenu mi = menuBar.getMenu(mbi);\r
+ JLabel elab = new JLabel(mi.getLabel());\r
+ elab.setFont(font);\r
+ // add the menu entries\r
+ JPopupMenu popup = new JPopupMenu();\r
+ int m, mSize = mi.getItemCount();\r
+ for (m = 0; m < mSize; m++)\r
+ {\r
+ popup.add(mi.getItem(m));\r
+ mSize--;\r
+ m--;\r
+ }\r
+ embeddedPopup.put(elab, popup);\r
+ embeddedMenu.add(elab);\r
+ elab.addMouseListener(clickHandler);\r
+ }\r
+ flowLayout1.setAlignment(FlowLayout.LEFT);\r
+ flowLayout1.setHgap(2);\r
+ flowLayout1.setVgap(0);\r
+ return embeddedMenu;\r
+ }\r
+\r
+ public void mousePressed(MouseEvent evt)\r
+ {\r
+ JPopupMenu popup = null;\r
+ JLabel source = (JLabel) evt.getSource();\r
+ popup = getPopupMenu(source);\r
+ if (popup != null)\r
+ {\r
+ embeddedMenu.add(popup);\r
+ popup.show(embeddedMenu, source.getBounds().x, source.getBounds().y\r
+ + source.getBounds().getSize().height);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * get the menu for source from the hash.\r
+ * \r
+ * @param source\r
+ * what was clicked on.\r
+ */\r
+ JPopupMenu getPopupMenu(JLabel source)\r
+ {\r
+ return embeddedPopup.get(source);\r
+ }\r
+\r
+ public void mouseClicked(MouseEvent evt)\r
+ {\r
+ }\r
+\r
+ public void mouseReleased(MouseEvent evt)\r
+ {\r
+ }\r
+\r
+ public void mouseEntered(MouseEvent evt)\r
+ {\r
+ }\r
+\r
+ public void mouseExited(MouseEvent evt)\r
+ {\r
+ }\r
+\r
+ /**\r
+ * called to clear the GUI resources taken up for embedding and remove any\r
+ * self references so we can be garbage collected.\r
+ */\r
+ public void destroyMenus()\r
+ {\r
+ if (embeddedPopup != null)\r
+ {\r
+ for (JLabel lb : embeddedPopup.keySet())\r
+ {\r
+ lb.removeMouseListener(this);\r
+ }\r
+ embeddedPopup.clear();\r
+ }\r
+ if (embeddedMenu != null)\r
+ {\r
+ embeddedMenu.removeAll();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * calls destroyMenus()\r
+ */\r
+ public void finalize() throws Throwable\r
+ {\r
+ destroyMenus();\r
+ embeddedPopup = null;\r
+ embeddedMenu = null;\r
+ super.finalize();\r
+ }\r
+}\r