Clover icon

Coverage Report

  1. Project Clover database Fri Dec 6 2024 13:47:14 GMT
  2. Package jalview.appletgui

File EmbmenuFrame.java

 

Coverage histogram

../../img/srcFileCovDistChart0.png
60% of files have more coverage

Code metrics

24
60
13
1
280
163
25
0.42
4.62
13
1.92

Classes

Class Line # Actions
EmbmenuFrame 54 60 25
0.00%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
7    * Jalview is free software: you can redistribute it and/or
8    * modify it under the terms of the GNU General Public License
9    * as published by the Free Software Foundation, either version 3
10    * of the License, or (at your option) any later version.
11    *
12    * Jalview is distributed in the hope that it will be useful, but
13    * WITHOUT ANY WARRANTY; without even the implied warranty
14    * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15    * PURPOSE. See the GNU General Public License for more details.
16    *
17    * You should have received a copy of the GNU General Public License
18    * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19    * The Jalview Authors are detailed in the 'AUTHORS' file.
20    */
21    package jalview.appletgui;
22   
23    import jalview.util.Platform;
24   
25    import java.awt.BorderLayout;
26    import java.awt.Color;
27    import java.awt.FlowLayout;
28    import java.awt.Font;
29    import java.awt.Frame;
30    import java.awt.HeadlessException;
31    import java.awt.Label;
32    import java.awt.Menu;
33    import java.awt.MenuBar;
34    import java.awt.Panel;
35    import java.awt.PopupMenu;
36    import java.awt.event.MouseEvent;
37    import java.awt.event.MouseListener;
38    import java.util.HashMap;
39    import java.util.Map;
40   
41    /**
42    * This class implements a pattern for embedding toolbars as a panel with popups
43    * for situations where the system menu bar is either invisible or
44    * inappropriate. It was derived from the code for embedding the jalview applet
45    * alignFrame as a component on the web-page, which requires the local
46    * alignFrame menu to be attached to that panel rather than placed on the parent
47    * (which isn't allowed anyhow). TODO: try to modify the embeddedMenu display so
48    * it looks like a real toolbar menu TODO: modify click/mouse handler for
49    * embeddedMenu so it behaves more like a real pulldown menu toolbar
50    *
51    * @author Jim Procter and Andrew Waterhouse
52    *
53    */
 
54    public class EmbmenuFrame extends Frame
55    implements MouseListener, AutoCloseable
56    {
57    protected static final Font FONT_ARIAL_PLAIN_11 = new Font("Arial",
58    Font.PLAIN, 11);
59   
60    public static final Font DEFAULT_MENU_FONT = FONT_ARIAL_PLAIN_11;
61   
62    /**
63    * map from labels to popup menus for the embedded menubar
64    */
65    protected Map<Label, PopupMenu> embeddedPopup = new HashMap<>();
66   
67    /**
68    * the embedded menu is built on this and should be added to the frame at the
69    * appropriate position.
70    *
71    */
72    protected Panel embeddedMenu;
73   
 
74  0 toggle public EmbmenuFrame() throws HeadlessException
75    {
76  0 super();
77    }
78   
 
79  0 toggle public EmbmenuFrame(String title) throws HeadlessException
80    {
81  0 super(title);
82    }
83   
84    /**
85    * Check if the applet is running on a platform that requires the Frame
86    * menuBar to be embedded, and if so, embeds it.
87    *
88    * @param tobeAdjusted
89    * the panel that is to be reduced to make space for the embedded
90    * menu bar
91    * @return true if menuBar was embedded and tobeAdjusted's height modified
92    */
 
93  0 toggle protected boolean embedMenuIfNeeded(Panel tobeAdjusted)
94    {
95  0 MenuBar topMenuBar = getMenuBar();
96  0 if (topMenuBar == null)
97    {
98  0 return false;
99    }
100    // DEBUG Hint: can test embedded menus by inserting true here.
101  0 if (Platform.isAMacAndNotJS())
102    {
103    // Build the embedded menu panel, allowing override with system font
104  0 embeddedMenu = makeEmbeddedPopupMenu(topMenuBar, true, false);
105  0 setMenuBar(null);
106    // add the components to the Panel area.
107  0 add(embeddedMenu, BorderLayout.NORTH);
108  0 tobeAdjusted.setSize(getSize().width,
109    getSize().height - embeddedMenu.getHeight());
110  0 return true;
111    }
112  0 return false;
113    }
114   
115    /**
116    * Create or add elements to the embedded menu from menuBar. This removes all
117    * menu from menuBar and it is up to the caller to remove the now useless
118    * menuBar from the Frame if it is already attached.
119    *
120    * @param menuBar
121    * @param overrideFonts
122    * @param append
123    * true means existing menu will be emptied before adding new
124    * elements
125    * @return
126    */
 
127  0 toggle protected Panel makeEmbeddedPopupMenu(MenuBar menuBar,
128    boolean overrideFonts, boolean append)
129    {
130  0 if (!append)
131    {
132  0 embeddedPopup.clear(); // TODO: check if j1.1
133  0 if (embeddedMenu != null)
134    {
135  0 embeddedMenu.removeAll();
136    }
137    }
138  0 embeddedMenu = makeEmbeddedPopupMenu(menuBar, DEFAULT_MENU_FONT,
139    overrideFonts, new Panel(), this);
140  0 return embeddedMenu;
141    }
142   
143    /**
144    * Generic method to move elements from menubar onto embeddedMenu using the
145    * existing or the supplied font, and adds binding from panel to attached
146    * menus in embeddedPopup This removes all menu from menuBar and it is up to
147    * the caller to remove the now useless menuBar from the Frame if it is
148    * already attached.
149    *
150    * @param menuBar
151    * must be non-null
152    * @param font
153    * @param overrideFonts
154    * @param embeddedMenu
155    * if null, a new panel will be created and returned
156    * @param clickHandler
157    * - usually the instance of EmbmenuFrame that holds references to
158    * embeddedPopup and embeddedMenu
159    * @return the panel instance for convenience.
160    */
 
161  0 toggle protected Panel makeEmbeddedPopupMenu(MenuBar menuBar, Font font,
162    boolean overrideFonts, Panel embeddedMenu,
163    MouseListener clickHandler)
164    {
165  0 if (overrideFonts)
166    {
167  0 Font mbf = menuBar.getFont();
168  0 if (mbf != null)
169    {
170  0 font = mbf;
171    }
172    }
173  0 if (embeddedMenu == null)
174    {
175  0 embeddedMenu = new Panel();
176    }
177  0 FlowLayout flowLayout1 = new FlowLayout();
178  0 embeddedMenu.setBackground(Color.lightGray);
179  0 embeddedMenu.setLayout(flowLayout1);
180    // loop thru
181  0 for (int mbi = 0, nMbi = menuBar.getMenuCount(); mbi < nMbi; mbi++)
182    {
183  0 Menu mi = menuBar.getMenu(mbi);
184  0 Label elab = new Label(mi.getLabel());
185  0 elab.setFont(font);
186    // add the menu entries
187  0 PopupMenu popup = new PopupMenu();
188  0 int m, mSize = mi.getItemCount();
189  0 for (m = 0; m < mSize; m++)
190    {
191  0 popup.add(mi.getItem(m));
192  0 mSize--;
193  0 m--;
194    }
195  0 embeddedPopup.put(elab, popup);
196  0 embeddedMenu.add(elab);
197  0 elab.addMouseListener(clickHandler);
198    }
199  0 flowLayout1.setAlignment(FlowLayout.LEFT);
200  0 flowLayout1.setHgap(2);
201  0 flowLayout1.setVgap(0);
202  0 return embeddedMenu;
203    }
204   
 
205  0 toggle @Override
206    public void mousePressed(MouseEvent evt)
207    {
208  0 PopupMenu popup = null;
209  0 Label source = (Label) evt.getSource();
210  0 popup = getPopupMenu(source);
211  0 if (popup != null)
212    {
213  0 embeddedMenu.add(popup);
214  0 popup.show(embeddedMenu, source.getBounds().x,
215    source.getBounds().y + source.getBounds().getSize().height);
216    }
217    }
218   
219    /**
220    * get the menu for source from the hash.
221    *
222    * @param source
223    * what was clicked on.
224    */
 
225  0 toggle PopupMenu getPopupMenu(Label source)
226    {
227  0 return embeddedPopup.get(source);
228    }
229   
 
230  0 toggle @Override
231    public void mouseClicked(MouseEvent evt)
232    {
233    }
234   
 
235  0 toggle @Override
236    public void mouseReleased(MouseEvent evt)
237    {
238    }
239   
 
240  0 toggle @Override
241    public void mouseEntered(MouseEvent evt)
242    {
243    }
244   
 
245  0 toggle @Override
246    public void mouseExited(MouseEvent evt)
247    {
248    }
249   
250    /**
251    * called to clear the GUI resources taken up for embedding and remove any
252    * self references so we can be garbage collected.
253    */
 
254  0 toggle public void destroyMenus()
255    {
256  0 if (embeddedPopup != null)
257    {
258  0 for (Label lb : embeddedPopup.keySet())
259    {
260  0 lb.removeMouseListener(this);
261    }
262  0 embeddedPopup.clear();
263    }
264  0 if (embeddedMenu != null)
265    {
266  0 embeddedMenu.removeAll();
267    }
268    }
269   
270    /**
271    * calls destroyMenus()
272    */
 
273  0 toggle @Override
274    public void close()
275    {
276  0 destroyMenus();
277  0 embeddedPopup = null;
278  0 embeddedMenu = null;
279    }
280    }