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
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.
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.
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.
18 package fr.orsay.lri.varna.views;
20 import java.awt.Color;
21 import java.awt.Component;
22 import java.awt.Container;
24 import java.awt.Point;
25 import java.awt.event.KeyEvent;
26 import java.util.ArrayList;
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;
37 import fr.orsay.lri.varna.VARNAPanel;
38 import fr.orsay.lri.varna.controlers.ControleurMenu;
39 import fr.orsay.lri.varna.models.rna.RNA;
41 public class VueMenu extends JPopupMenu {
45 private static final long serialVersionUID = 1L;
47 private VARNAPanel _vp;
49 private ControleurMenu _controlerMenu;
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);
68 private JCheckBoxMenuItem _itemShowColorMap = new JCheckBoxMenuItem(
69 "Show color map", false);
70 private JMenuItem _dashBasesColor;
72 private ArrayList<JComponent> _disabled = new ArrayList<JComponent>();
74 private JMenuItem _rotation;
75 private JMenuItem _bpHeightIncrement;
77 private Point _spawnOrigin = new Point(-1,-1);
79 public VueMenu(VARNAPanel vp) {
81 _controlerMenu = new ControleurMenu(_vp, this);
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);
94 titleItem.setFont(futureFont);
95 Color current = titleItem.getForeground();
96 Color future = current.brighter().brighter();
97 // titleItem.setBackground(future);
98 titleItem.setForeground(future);
103 _disabled.add(titleItem);
107 private void configMenuItem(JMenuItem mi, String command, String keyStroke, Container par)
108 { configMenuItem(mi,command,keyStroke,par,false); }
110 private void configMenuItem(JMenuItem mi, String command, String keyStroke, Container par, boolean disabled)
112 mi.setActionCommand(command);
113 mi.addActionListener(_controlerMenu);
115 if (!keyStroke.equals(""))
116 mi.setAccelerator(KeyStroke.getKeyStroke(keyStroke));
118 { _disabled.add(mi);}
122 private JMenuItem createMenuItem(String caption, String command, String keyStroke, Container par, boolean disabled)
124 JMenuItem mi = new JMenuItem(caption);
125 configMenuItem(mi, command,keyStroke, par, disabled);
129 private JMenuItem createMenuItem(String caption, String command, String keyStroke, Container par)
130 { return createMenuItem(caption, command, keyStroke, par,false); }
133 public void updateDialog() {
134 for (int i = 0; i < _disabled.size(); i++) {
135 JComponent j = _disabled.get(i);
136 j.setVisible(_vp.isModifiable());
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());
144 _rotation.setEnabled(_vp.getDrawMode() != RNA.DRAW_MODE_LINEAR);
145 _bpHeightIncrement.setEnabled(_vp.getDrawMode() == RNA.DRAW_MODE_LINEAR);
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);
156 * Builds the popup menu
158 public void buildPopupMenu() {
159 addTitle("File", true);
162 createMenuItem("Print...", "print", "control P", this);
165 addTitle("Display", true);
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
174 addTitle("Edit", false);
179 _disabled.add(_itemShowNCBP);
180 _disabled.add(_itemShowOnlyPlanar);
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
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);
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);
219 private void exportMenu() {
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);
234 private void displayMenu() {
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
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);
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);
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);
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);
290 add(submenuColorMap);
295 private void editRNAMenu()
297 createMenuItem("Bases...","editallbases","",this,true);
298 createMenuItem("BasePairs...","editallbps","",this,true);
301 private void redrawMenu() {
302 JMenu submenuRedraw = new JMenu("Redraw");
303 _disabled.add(submenuRedraw);
305 JMenu submenuAlgorithms = new JMenu("Algorithm");
306 _disabled.add(submenuAlgorithms);
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);
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);
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);
327 @SuppressWarnings("unused")
328 private void warningMenu() {
330 configMenuItem(_itemShowWarnings, "showwarnings", "", this, true);
333 private void viewMenu() {
335 JMenu submenuView = new JMenu("View");
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);
357 private Component _selectionMenuIndex = null;
359 public void addSelectionMenu(JMenuItem s) {
360 _selectionMenuIndex = s;
362 insert(s, getComponentCount() - 2);
365 public void removeSelectionMenu() {
366 if (_selectionMenuIndex != null) {
367 this.remove(_selectionMenuIndex);
368 _selectionMenuIndex = null;
372 private void colorClassesMenu() {
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);
383 * add default color options to a menu
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);
396 private void aboutMenu() {
398 createMenuItem("About VARNA", "about", "control A", this);
401 public void addAnnotationMenu(JMenu menu) {
402 addAnnotationMenu(menu, false);
405 public void addAnnotationMenu(JMenu menu, boolean existingAnnot) {
406 String title = "Annotation";
410 String texte = _vp.get_selectedAnnotation().getTexte();
411 if (texte.length() < 5)
414 debut = texte.substring(0, 5) + "...";
415 title = "Annotation: " + debut;
417 JMenu menuAnnotation = new JMenu(title);
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);
426 public static long getSerialVersionUID() {
427 return serialVersionUID;
430 public VARNAPanel get_vp() {
434 public ControleurMenu get_controleurMenu() {
435 return _controlerMenu;
438 public JCheckBoxMenuItem get_itemOptionSpecialBaseColored() {
439 return _itemOptionSpecialBaseColored;
442 public JCheckBoxMenuItem get_itemShowWarnings() {
443 return _itemShowWarnings;
446 public JCheckBoxMenuItem get_itemOptionDashBaseColored() {
447 return _itemOptionGapsBaseColored;
450 public void set_controleurMenu(ControleurMenu menu) {
451 _controlerMenu = menu;
454 public void set_itemOptionSpecialBaseColored(
455 JCheckBoxMenuItem optionSpecialBaseColored) {
456 _itemOptionSpecialBaseColored = optionSpecialBaseColored;
459 public void set_itemShowWarnings(JCheckBoxMenuItem showWarnings) {
460 _itemShowWarnings = showWarnings;
463 public void set_itemOptionDashBaseColored(
464 JCheckBoxMenuItem optionDashBaseColored) {
465 _itemOptionGapsBaseColored = optionDashBaseColored;
468 public JMenuItem get_rotation() {
472 public void set_rotation(JMenuItem _rotation) {
473 this._rotation = _rotation;
476 public JCheckBoxMenuItem get_itemOptionBondsColored() {
477 return _itemOptionBondsColored;
480 public void set_itemOptionBondsColored(JCheckBoxMenuItem optionBondsColored) {
481 _itemOptionBondsColored = optionBondsColored;
485 public void show(Component invoker,int x,int y) {
486 _spawnOrigin = new Point(x,y);
487 super.show(invoker,x,y);
490 public Point getSpawnPoint()
492 return _spawnOrigin ;