JAL-3032 adds Java 8 functionality (2/2)
[jalview.git] / src2 / fr / orsay / lri / varna / views / VueMenu.java
1 /*
2  VARNA is a tool for the automated drawing, visualization and annotation of the secondary structure of RNA, designed as a companion software for web servers and databases.
3  Copyright (C) 2008  Kevin Darty, Alain Denise and Yann Ponty.
4  electronic mail : Yann.Ponty@lri.fr
5  paper mail : LRI, bat 490 Universit� Paris-Sud 91405 Orsay Cedex France
6
7  This file is part of VARNA version 3.1.
8  VARNA version 3.1 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
9  as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
10
11  VARNA version 3.1 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  See the GNU General Public License for more details.
14
15  You should have received a copy of the GNU General Public License along with VARNA version 3.1.
16  If not, see http://www.gnu.org/licenses.
17  */
18 package fr.orsay.lri.varna.views;
19
20 import java.awt.Color;
21 import java.awt.Component;
22 import java.awt.Container;
23 import java.awt.Font;
24 import java.awt.Point;
25 import java.awt.event.KeyEvent;
26 import java.util.ArrayList;
27
28 import javax.swing.JCheckBoxMenuItem;
29 import javax.swing.JComponent;
30 import javax.swing.JLabel;
31 import javax.swing.JMenu;
32 import javax.swing.JMenuItem;
33 import javax.swing.JPopupMenu;
34 import javax.swing.JSeparator;
35 import javax.swing.KeyStroke;
36
37 import fr.orsay.lri.varna.VARNAPanel;
38 import fr.orsay.lri.varna.controlers.ControleurMenu;
39 import fr.orsay.lri.varna.models.rna.RNA;
40
41 public class VueMenu extends JPopupMenu {
42         /**
43          * 
44          */
45         private static final long serialVersionUID = 1L;
46
47         private VARNAPanel _vp;
48
49         private ControleurMenu _controlerMenu;
50
51         private JCheckBoxMenuItem _itemOptionSpecialBaseColored = new JCheckBoxMenuItem(
52                         "Custom colored", false);
53         private JCheckBoxMenuItem _itemShowWarnings = new JCheckBoxMenuItem(
54                         "Show warnings", false);
55         private JCheckBoxMenuItem _itemDrawBackbone = new JCheckBoxMenuItem(
56                         "Draw backbone", true);
57         private JCheckBoxMenuItem _itemOptionGapsBaseColored = new JCheckBoxMenuItem(
58                         "Custom colored", false);
59         private JCheckBoxMenuItem _itemOptionBondsColored = new JCheckBoxMenuItem(
60                         "Use base color for base-pairs", false);
61         private JCheckBoxMenuItem _itemShowNCBP = new JCheckBoxMenuItem(
62                         "Show non-canonical BPs", true);
63         private JCheckBoxMenuItem _itemShowOnlyPlanar = new JCheckBoxMenuItem(
64                         "Hide tertiary BPs", false);
65         private JCheckBoxMenuItem _itemFlatExteriorLoop = new JCheckBoxMenuItem(
66                         "Flat exterior loop", false);
67         
68         private JCheckBoxMenuItem _itemShowColorMap = new JCheckBoxMenuItem(
69                         "Show color map", false);
70         private JMenuItem _dashBasesColor;
71
72         private ArrayList<JComponent> _disabled = new ArrayList<JComponent>();
73
74         private JMenuItem _rotation;
75         private JMenuItem _bpHeightIncrement;
76
77         private Point _spawnOrigin = new Point(-1,-1);
78         
79         public VueMenu(VARNAPanel vp) {
80                 _vp = vp;
81                 _controlerMenu = new ControleurMenu(_vp, this);
82         }
83
84         private void addTitle(String title, boolean keep) {
85                 // TOD BH SwingJS -- this should not be necessary
86                 JSeparator sep = new JPopupMenu.Separator(); // BH SWingJS needs JPopupMenu.Separator
87                 //JSeparator sep = new JSeparator();
88                 JMenuItem titleItem = new JMenuItem(" " + title);//BH SwingJS was JLabel -- need to be able to do this.
89                 // titleItem.setAlignmentX(0.5f);
90                 Font previousFont = titleItem.getFont();
91                 Font futureFont = previousFont.deriveFont(Font.BOLD).deriveFont(
92                                 (float) previousFont.getSize() + 1.0f);
93
94                 titleItem.setFont(futureFont);
95                 Color current = titleItem.getForeground();
96                 Color future = current.brighter().brighter();
97                 // titleItem.setBackground(future);
98                 titleItem.setForeground(future);
99                 add(titleItem);
100                 add(sep);
101                 if (!keep) {
102                         _disabled.add(sep);
103                         _disabled.add(titleItem);
104                 }
105         }
106         
107         private void configMenuItem(JMenuItem mi, String command, String keyStroke, Container par)
108         { configMenuItem(mi,command,keyStroke,par,false); }
109
110         private void configMenuItem(JMenuItem mi, String command, String keyStroke, Container par, boolean disabled)
111         { 
112                 mi.setActionCommand(command);
113                 mi.addActionListener(_controlerMenu);
114                 if (keyStroke!=null)
115                         if (!keyStroke.equals(""))
116                                 mi.setAccelerator(KeyStroke.getKeyStroke(keyStroke));
117                 if (disabled)
118                 { _disabled.add(mi);}
119                 par.add(mi);
120         }
121         
122         private JMenuItem createMenuItem(String caption, String command, String keyStroke, Container par, boolean disabled)
123         {
124                 JMenuItem mi = new JMenuItem(caption);
125                 configMenuItem(mi, command,keyStroke, par, disabled);
126                 return mi;
127         }
128
129         private JMenuItem createMenuItem(String caption, String command, String keyStroke, Container par)
130         { return createMenuItem(caption, command, keyStroke, par,false); }
131
132
133         public void updateDialog() {
134                 for (int i = 0; i < _disabled.size(); i++) {
135                         JComponent j = _disabled.get(i);
136                         j.setVisible(_vp.isModifiable());
137                 }
138                 _itemOptionSpecialBaseColored.setState(_vp.getColorSpecialBases());
139                 _itemShowWarnings.setState(_vp.getShowWarnings());
140                 _itemOptionGapsBaseColored.setState(_vp.getColorGapsBases());
141                 _itemOptionGapsBaseColored.setEnabled(_vp.isComparisonMode());
142                 _dashBasesColor.setEnabled(_vp.isComparisonMode());
143                 
144                 _rotation.setEnabled(_vp.getDrawMode() != RNA.DRAW_MODE_LINEAR);
145                 _bpHeightIncrement.setEnabled(_vp.getDrawMode() == RNA.DRAW_MODE_LINEAR);
146
147                 _itemOptionBondsColored.setState(_vp.getUseBaseColorsForBPs());
148                 _itemShowNCBP.setState(_vp.getShowNonCanonicalBP());
149                 _itemShowOnlyPlanar.setState(!_vp.getShowNonPlanarBP());
150                 _itemShowColorMap.setState(_vp.getColorMapVisible());
151                 _itemFlatExteriorLoop.setState(_vp.getFlatExteriorLoop());
152                 _itemFlatExteriorLoop.setEnabled(_vp.getDrawMode() == RNA.DRAW_MODE_RADIATE);
153         }
154
155         /**
156          * Builds the popup menu
157          */
158         public void buildPopupMenu() {
159                 addTitle("File", true);
160                 fileMenu();
161                 exportMenu();
162                 createMenuItem("Print...", "print", "control P", this);
163                 addSeparator();
164
165                 addTitle("Display", true);
166                 viewMenu();
167                 displayMenu();
168                 //JSeparator sep = new JSeparator();
169                 // TODO BH SwingJS - this should not be necessary
170                 JSeparator sep = new JPopupMenu.Separator(); // BH SWingJS needs JPopupMenu.Separator
171                 add(sep);
172                 _disabled.add(sep);
173
174                 addTitle("Edit", false);
175                 editRNAMenu();
176                 redrawMenu();
177                 colorClassesMenu();
178                 annotationMenu();
179                 _disabled.add(_itemShowNCBP);
180                 _disabled.add(_itemShowOnlyPlanar);
181                 aboutMenu();
182         }
183
184         private void annotationMenu() {
185                 JMenu submenuAnnotations = new JMenu("Annotations");
186                 JMenu addAnnotations = new JMenu("New");
187                 createMenuItem("Here", "annotationsaddPosition", "", addAnnotations);
188                 createMenuItem("Base", "annotationsaddBase", "", addAnnotations);
189                 createMenuItem("Loop", "annotationsaddLoop", "", addAnnotations);
190                 createMenuItem("Helix", "annotationsaddHelix", "", addAnnotations);
191                 //JSeparator sep = new JSeparator();
192                 JSeparator sep = new JPopupMenu.Separator(); // BH SWingJS needs JPopupMenu.Separator
193
194                 addAnnotations.add(sep);
195                 createMenuItem("Region", "annotationsaddRegion", "", addAnnotations);
196                 createMenuItem("Chem. prob.", "annotationsaddChemProb", "", addAnnotations);
197                 submenuAnnotations.add(addAnnotations);
198                 createMenuItem("Edit from list...", "annotationsedit", "", submenuAnnotations);
199                 createMenuItem("Remove from list...", "annotationsremove", "", submenuAnnotations);
200                 submenuAnnotations.addSeparator();
201                 createMenuItem("Auto 5'/3'", "annotationsautoextremites", "control alt Q", submenuAnnotations);
202                 createMenuItem("Auto helices", "annotationsautohelices", "control Q", submenuAnnotations);
203                 createMenuItem("Auto interior loops", "annotationsautointerior", "alt shift Q", submenuAnnotations);
204                 createMenuItem("Auto terminal loops", "annotationsautoterminal", "control shift Q", submenuAnnotations);
205                 add(submenuAnnotations);
206         }
207
208         private void fileMenu() {
209                 createMenuItem("New...", "userInput", "control N", this,true);
210                 createMenuItem("Open...", "file", "control O", this,true);
211                 createMenuItem("Save...", "saveas", "control S", this,true);
212                 JMenu submenuSave = new JMenu("Save as");
213                 createMenuItem("DBN (Vienna)", "dbn", "", submenuSave);
214                 createMenuItem("BPSEQ", "bpseq", "", submenuSave);
215                 createMenuItem("CT", "ct", "", submenuSave);
216                 add(submenuSave);
217         }
218
219         private void exportMenu() {
220                 // Export menu
221                 JMenu submenuExport = new JMenu("Export");
222                 createMenuItem("SVG", "svg", "", submenuExport);
223                 createMenuItem("PGF/TIKZ", "tikz", "", submenuExport);
224                 createMenuItem("XFIG", "xfig", "", submenuExport);
225                 submenuExport.addSeparator();
226                 createMenuItem("EPS", "eps", "", submenuExport);
227                 submenuExport.addSeparator();
228                 createMenuItem("PNG", "png", "", submenuExport);
229                 createMenuItem("JPEG", "jpeg", "", submenuExport);
230                 add(submenuExport);
231         }
232
233
234         private void displayMenu() {
235                 
236                 // SubMenu Base-pairs
237                 JMenu subMenuBasePairs = new JMenu("Base Pairs");
238                 createMenuItem("BP style...", "bpstyle", "control shift P", subMenuBasePairs);
239                 configMenuItem(_itemShowNCBP, "shownc", "control W", subMenuBasePairs);
240                 configMenuItem(_itemShowOnlyPlanar, "shownp", "control E", subMenuBasePairs);
241                 // SubMenu Non standard Bases
242                 JMenu subMenuNSBases = new JMenu("Non-standard bases");
243                 configMenuItem(_itemOptionSpecialBaseColored, "specialbasecolored", "control J", subMenuNSBases);
244                 createMenuItem("Color", "specialBasesColor", "control shift J", subMenuNSBases);
245                 // SubMenu Gaps Bases
246                 JMenu subMenuGapsBases = new JMenu("'Gaps' bases");
247                 configMenuItem(_itemOptionGapsBaseColored, "dashbasecolored", "control D", subMenuGapsBases);           
248                 _dashBasesColor = createMenuItem("Color", "dashBasesColor", "control shift D", subMenuGapsBases);
249                 // Removable separator 
250                 //JSeparator sep = new JSeparator();
251                 JSeparator sep = new JPopupMenu.Separator(); // BH SWingJS needs JPopupMenu.Separator
252                 _disabled.add(sep);
253                 
254                 // Style menu
255                 JMenu submenuStyle = new JMenu("RNA style");
256                 createMenuItem("Toggle draw bases", "gaspin", "alt G", submenuStyle,true);
257                 submenuStyle.add(subMenuBasePairs);
258                 submenuStyle.addSeparator();
259                 submenuStyle.add(subMenuNSBases);
260                 submenuStyle.add(subMenuGapsBases);
261                 submenuStyle.add(sep);
262                 createMenuItem("Backbone color", "backbone", "control K", submenuStyle,true);
263                 configMenuItem(_itemDrawBackbone, "showbackbone", "alt B", submenuStyle);
264                 
265                 // Submenu Title
266                 JMenu submenuTitle = new JMenu("Title");                
267                 createMenuItem("Set Title", "setTitle", "control T", submenuTitle, true);
268                 createMenuItem("Font", "titleDisplay", "control shift T", submenuTitle, true);
269                 createMenuItem("Color", "titleColor", "control alt T", submenuTitle, true);
270                 _disabled.add(submenuTitle);
271
272                 // Color map menu
273                 JMenu submenuColorMap = new JMenu("Color map");
274                 configMenuItem(_itemShowColorMap, "toggleshowcolormap", "control shift L", submenuColorMap, false);
275                 createMenuItem("Caption", "colormapcaption", "control shift C", submenuColorMap,true);
276                 createMenuItem("Style...", "colormapstyle", "control L", submenuColorMap,false);
277                 submenuColorMap.addSeparator();
278                 createMenuItem("Edit values...", "colormapvalues", "shift L", submenuColorMap,true);
279                 createMenuItem("Load values...", "colormaploadvalues", "control shift K", submenuColorMap,true);
280                 _disabled.add(submenuColorMap);
281                 
282                 // Menu Misc
283                 JMenu submenuMisc = new JMenu("Misc");
284                 createMenuItem("Num. period.", "numPeriod", "control M", submenuMisc);
285                 createMenuItem("Background color", "background", "control G", submenuMisc);
286                 submenuMisc.add(submenuTitle);
287                 
288                 // Main menu
289                 add(submenuStyle);              
290                 add(submenuColorMap);
291                 add(submenuMisc);
292
293         }
294         
295         private void editRNAMenu()
296         {
297                 createMenuItem("Bases...","editallbases","",this,true);
298                 createMenuItem("BasePairs...","editallbps","",this,true);
299         }
300
301         private void redrawMenu() {
302                 JMenu submenuRedraw = new JMenu("Redraw");
303                 _disabled.add(submenuRedraw);
304
305                 JMenu submenuAlgorithms = new JMenu("Algorithm");
306                 _disabled.add(submenuAlgorithms);
307
308                 createMenuItem("Linear","line","control 1",submenuAlgorithms,true);
309                 createMenuItem("Circular","circular","control 2",submenuAlgorithms,true);
310                 createMenuItem("Radiate","radiate","control 3",submenuAlgorithms,true);
311                 createMenuItem("NAView","naview","control 4",submenuAlgorithms,true);
312                 //createMenuItem("VARNAView","varnaview","control 5",submenuAlgorithms,true);
313                 //createMenuItem("MOTIFView","motifview","control 6",submenuAlgorithms,true);
314                 submenuRedraw.add(submenuAlgorithms);
315                 
316                 // Sets the height increment in LINEAR_MODE type of drawing
317                 _bpHeightIncrement = createMenuItem("BP height increment","bpheightincrement","control H",submenuRedraw);
318                 configMenuItem(_itemFlatExteriorLoop, "flat", "control F", submenuRedraw, true);
319
320                 // Item pour le r�glage de l'espace entre chaques bases
321                 createMenuItem("Space between bases","spaceBetweenBases","control shift S",submenuRedraw,true);         
322                 createMenuItem("Reset","reset","control shift R",submenuRedraw,true);           
323
324                 add(submenuRedraw);
325         }
326
327         @SuppressWarnings("unused")
328         private void warningMenu() {
329                 // Menu showWarning
330                 configMenuItem(_itemShowWarnings, "showwarnings", "", this, true);
331         }
332
333         private void viewMenu() {
334                 // View menu
335                 JMenu submenuView = new JMenu("View");
336
337                 // Zoom submenu
338                 JMenu zoomDisplay = new JMenu("Zoom");
339                 createMenuItem("25%","zoom25","",zoomDisplay);
340                 createMenuItem("50%","zoom50","",zoomDisplay);
341                 createMenuItem("100%","zoom100","",zoomDisplay);
342                 createMenuItem("150%","zoom150","",zoomDisplay);
343                 createMenuItem("200%","zoom200","",zoomDisplay);
344                 createMenuItem("Custom","zoom","control Z",zoomDisplay);
345                 submenuView.add(zoomDisplay);           
346                 _rotation = createMenuItem("Rotation...","rotation","control R",submenuView);
347                 createMenuItem("Rescale...","rescale","",submenuView);
348                 submenuView.addSeparator();             
349                 createMenuItem("Border size","borderSize","control B",submenuView);
350                 
351                 add(submenuView);
352
353         }
354
355         JMenu _subMenuBases;
356
357         private Component _selectionMenuIndex = null;
358
359         public void addSelectionMenu(JMenuItem s) {
360                 _selectionMenuIndex = s;
361                 _disabled.add(s);
362                 insert(s, getComponentCount() - 2);
363         }
364
365         public void removeSelectionMenu() {
366                 if (_selectionMenuIndex != null) {
367                         this.remove(_selectionMenuIndex);
368                         _selectionMenuIndex = null;
369                 }
370         }
371
372         private void colorClassesMenu() {
373                 // Menu Bases
374                 _subMenuBases = new JMenu("Colors");
375                 _disabled.add(_subMenuBases);
376                 createMenuItem("By Base","eachKind","control U",_subMenuBases,true);
377                 createMenuItem("By BP","eachCouple","shift U",_subMenuBases,true);
378                 createMenuItem("By Position","eachBase","alt U",_subMenuBases,true);
379                 add(_subMenuBases);
380         }
381
382         /**
383          * add default color options to a menu
384          */
385         public void addColorOptions(JMenu submenu) {
386                 createMenuItem("Fill Color",submenu.getActionCommand() + ",InnerColor","",submenu,true);
387                 createMenuItem("Stroke Color",submenu.getActionCommand() + ",OutlineColor","",submenu,true);
388                 createMenuItem("Label Color",submenu.getActionCommand() + ",NameColor","",submenu,true);                
389                 submenu.addSeparator();
390                 createMenuItem("BP Color",submenu.getActionCommand() + ",BPColor","",submenu,true);             
391                 createMenuItem("BP Thickness",submenu.getActionCommand() + ",BPThickness","",submenu,true);             
392                 submenu.addSeparator();
393                 createMenuItem("Number Color",submenu.getActionCommand() + ",NumberColor","",submenu,true);             
394         }
395
396         private void aboutMenu() {
397                 addSeparator();
398                 createMenuItem("About VARNA", "about", "control A", this);
399         }
400
401         public void addAnnotationMenu(JMenu menu) {
402                 addAnnotationMenu(menu, false);
403         }       
404         
405         public void addAnnotationMenu(JMenu menu, boolean existingAnnot) {
406                 String title = "Annotation";
407                 if (existingAnnot)
408                 {
409                         String debut = "";
410                         String texte = _vp.get_selectedAnnotation().getTexte();
411                         if (texte.length() < 5)
412                                 debut = texte;
413                         else
414                                 debut = texte.substring(0, 5) + "...";
415                         title = "Annotation: " + debut;                 
416                 }
417                 JMenu menuAnnotation = new JMenu(title);
418                 if (!existingAnnot)
419                         createMenuItem("Add",menu.getActionCommand() + "annotationadd","",menuAnnotation,true);         
420                 createMenuItem("Edit",menu.getActionCommand() + "annotationedit","",menuAnnotation,true);               
421                 createMenuItem("Remove",menu.getActionCommand() + "annotationremove","",menuAnnotation,true);           
422                 menu.add(menuAnnotation);
423         }       
424         
425         
426         public static long getSerialVersionUID() {
427                 return serialVersionUID;
428         }
429
430         public VARNAPanel get_vp() {
431                 return _vp;
432         }
433
434         public ControleurMenu get_controleurMenu() {
435                 return _controlerMenu;
436         }
437
438         public JCheckBoxMenuItem get_itemOptionSpecialBaseColored() {
439                 return _itemOptionSpecialBaseColored;
440         }
441
442         public JCheckBoxMenuItem get_itemShowWarnings() {
443                 return _itemShowWarnings;
444         }
445
446         public JCheckBoxMenuItem get_itemOptionDashBaseColored() {
447                 return _itemOptionGapsBaseColored;
448         }
449
450         public void set_controleurMenu(ControleurMenu menu) {
451                 _controlerMenu = menu;
452         }
453
454         public void set_itemOptionSpecialBaseColored(
455                         JCheckBoxMenuItem optionSpecialBaseColored) {
456                 _itemOptionSpecialBaseColored = optionSpecialBaseColored;
457         }
458
459         public void set_itemShowWarnings(JCheckBoxMenuItem showWarnings) {
460                 _itemShowWarnings = showWarnings;
461         }
462
463         public void set_itemOptionDashBaseColored(
464                         JCheckBoxMenuItem optionDashBaseColored) {
465                 _itemOptionGapsBaseColored = optionDashBaseColored;
466         }
467
468         public JMenuItem get_rotation() {
469                 return _rotation;
470         }
471
472         public void set_rotation(JMenuItem _rotation) {
473                 this._rotation = _rotation;
474         }
475
476         public JCheckBoxMenuItem get_itemOptionBondsColored() {
477                 return _itemOptionBondsColored;
478         }
479
480         public void set_itemOptionBondsColored(JCheckBoxMenuItem optionBondsColored) {
481                 _itemOptionBondsColored = optionBondsColored;
482         }
483
484
485         public void show(Component invoker,int x,int y) {
486                  _spawnOrigin = new Point(x,y);
487                  super.show(invoker,x,y); 
488          }
489         
490         public Point getSpawnPoint()
491         {
492                 return _spawnOrigin ;
493         }
494
495 }