X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=srcjar%2Ffr%2Forsay%2Flri%2Fvarna%2Fviews%2FVueMenu.java;fp=srcjar%2Ffr%2Forsay%2Flri%2Fvarna%2Fviews%2FVueMenu.java;h=f7ee43f87b88b9f2c9742bacc8db19ff4920a7d2;hb=2d6292c0377bc6b773c6844a45d3f2c5fac352c7;hp=0000000000000000000000000000000000000000;hpb=954af328a2a6a0055572cd1a09ee035301222574;p=jalview.git diff --git a/srcjar/fr/orsay/lri/varna/views/VueMenu.java b/srcjar/fr/orsay/lri/varna/views/VueMenu.java new file mode 100644 index 0000000..f7ee43f --- /dev/null +++ b/srcjar/fr/orsay/lri/varna/views/VueMenu.java @@ -0,0 +1,495 @@ +/* + 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. + Copyright (C) 2008 Kevin Darty, Alain Denise and Yann Ponty. + electronic mail : Yann.Ponty@lri.fr + paper mail : LRI, bat 490 Universit� Paris-Sud 91405 Orsay Cedex France + + This file is part of VARNA version 3.1. + VARNA version 3.1 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. + + VARNA version 3.1 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 VARNA version 3.1. + If not, see http://www.gnu.org/licenses. + */ +package fr.orsay.lri.varna.views; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Font; +import java.awt.Point; +import java.awt.event.KeyEvent; +import java.util.ArrayList; + +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.JSeparator; +import javax.swing.KeyStroke; + +import fr.orsay.lri.varna.VARNAPanel; +import fr.orsay.lri.varna.controlers.ControleurMenu; +import fr.orsay.lri.varna.models.rna.RNA; + +public class VueMenu extends JPopupMenu { + /** + * + */ + private static final long serialVersionUID = 1L; + + private VARNAPanel _vp; + + private ControleurMenu _controlerMenu; + + private JCheckBoxMenuItem _itemOptionSpecialBaseColored = new JCheckBoxMenuItem( + "Custom colored", false); + private JCheckBoxMenuItem _itemShowWarnings = new JCheckBoxMenuItem( + "Show warnings", false); + private JCheckBoxMenuItem _itemDrawBackbone = new JCheckBoxMenuItem( + "Draw backbone", true); + private JCheckBoxMenuItem _itemOptionGapsBaseColored = new JCheckBoxMenuItem( + "Custom colored", false); + private JCheckBoxMenuItem _itemOptionBondsColored = new JCheckBoxMenuItem( + "Use base color for base-pairs", false); + private JCheckBoxMenuItem _itemShowNCBP = new JCheckBoxMenuItem( + "Show non-canonical BPs", true); + private JCheckBoxMenuItem _itemShowOnlyPlanar = new JCheckBoxMenuItem( + "Hide tertiary BPs", false); + private JCheckBoxMenuItem _itemFlatExteriorLoop = new JCheckBoxMenuItem( + "Flat exterior loop", false); + + private JCheckBoxMenuItem _itemShowColorMap = new JCheckBoxMenuItem( + "Show color map", false); + private JMenuItem _dashBasesColor; + + private ArrayList _disabled = new ArrayList(); + + private JMenuItem _rotation; + private JMenuItem _bpHeightIncrement; + + private Point _spawnOrigin = new Point(-1,-1); + + public VueMenu(VARNAPanel vp) { + _vp = vp; + _controlerMenu = new ControleurMenu(_vp, this); + } + + private void addTitle(String title, boolean keep) { + // TOD BH SwingJS -- this should not be necessary + JSeparator sep = new JPopupMenu.Separator(); // BH SWingJS needs JPopupMenu.Separator + //JSeparator sep = new JSeparator(); + JMenuItem titleItem = new JMenuItem(" " + title);//BH SwingJS was JLabel -- need to be able to do this. + // titleItem.setAlignmentX(0.5f); + Font previousFont = titleItem.getFont(); + Font futureFont = previousFont.deriveFont(Font.BOLD).deriveFont( + (float) previousFont.getSize() + 1.0f); + + titleItem.setFont(futureFont); + Color current = titleItem.getForeground(); + Color future = current.brighter().brighter(); + // titleItem.setBackground(future); + titleItem.setForeground(future); + add(titleItem); + add(sep); + if (!keep) { + _disabled.add(sep); + _disabled.add(titleItem); + } + } + + private void configMenuItem(JMenuItem mi, String command, String keyStroke, Container par) + { configMenuItem(mi,command,keyStroke,par,false); } + + private void configMenuItem(JMenuItem mi, String command, String keyStroke, Container par, boolean disabled) + { + mi.setActionCommand(command); + mi.addActionListener(_controlerMenu); + if (keyStroke!=null) + if (!keyStroke.equals("")) + mi.setAccelerator(KeyStroke.getKeyStroke(keyStroke)); + if (disabled) + { _disabled.add(mi);} + par.add(mi); + } + + private JMenuItem createMenuItem(String caption, String command, String keyStroke, Container par, boolean disabled) + { + JMenuItem mi = new JMenuItem(caption); + configMenuItem(mi, command,keyStroke, par, disabled); + return mi; + } + + private JMenuItem createMenuItem(String caption, String command, String keyStroke, Container par) + { return createMenuItem(caption, command, keyStroke, par,false); } + + + public void updateDialog() { + for (int i = 0; i < _disabled.size(); i++) { + JComponent j = _disabled.get(i); + j.setVisible(_vp.isModifiable()); + } + _itemOptionSpecialBaseColored.setState(_vp.getColorSpecialBases()); + _itemShowWarnings.setState(_vp.getShowWarnings()); + _itemOptionGapsBaseColored.setState(_vp.getColorGapsBases()); + _itemOptionGapsBaseColored.setEnabled(_vp.isComparisonMode()); + _dashBasesColor.setEnabled(_vp.isComparisonMode()); + + _rotation.setEnabled(_vp.getDrawMode() != RNA.DRAW_MODE_LINEAR); + _bpHeightIncrement.setEnabled(_vp.getDrawMode() == RNA.DRAW_MODE_LINEAR); + + _itemOptionBondsColored.setState(_vp.getUseBaseColorsForBPs()); + _itemShowNCBP.setState(_vp.getShowNonCanonicalBP()); + _itemShowOnlyPlanar.setState(!_vp.getShowNonPlanarBP()); + _itemShowColorMap.setState(_vp.getColorMapVisible()); + _itemFlatExteriorLoop.setState(_vp.getFlatExteriorLoop()); + _itemFlatExteriorLoop.setEnabled(_vp.getDrawMode() == RNA.DRAW_MODE_RADIATE); + } + + /** + * Builds the popup menu + */ + public void buildPopupMenu() { + addTitle("File", true); + fileMenu(); + exportMenu(); + createMenuItem("Print...", "print", "control P", this); + addSeparator(); + + addTitle("Display", true); + viewMenu(); + displayMenu(); + //JSeparator sep = new JSeparator(); + // TODO BH SwingJS - this should not be necessary + JSeparator sep = new JPopupMenu.Separator(); // BH SWingJS needs JPopupMenu.Separator + add(sep); + _disabled.add(sep); + + addTitle("Edit", false); + editRNAMenu(); + redrawMenu(); + colorClassesMenu(); + annotationMenu(); + _disabled.add(_itemShowNCBP); + _disabled.add(_itemShowOnlyPlanar); + aboutMenu(); + } + + private void annotationMenu() { + JMenu submenuAnnotations = new JMenu("Annotations"); + JMenu addAnnotations = new JMenu("New"); + createMenuItem("Here", "annotationsaddPosition", "", addAnnotations); + createMenuItem("Base", "annotationsaddBase", "", addAnnotations); + createMenuItem("Loop", "annotationsaddLoop", "", addAnnotations); + createMenuItem("Helix", "annotationsaddHelix", "", addAnnotations); + //JSeparator sep = new JSeparator(); + JSeparator sep = new JPopupMenu.Separator(); // BH SWingJS needs JPopupMenu.Separator + + addAnnotations.add(sep); + createMenuItem("Region", "annotationsaddRegion", "", addAnnotations); + createMenuItem("Chem. prob.", "annotationsaddChemProb", "", addAnnotations); + submenuAnnotations.add(addAnnotations); + createMenuItem("Edit from list...", "annotationsedit", "", submenuAnnotations); + createMenuItem("Remove from list...", "annotationsremove", "", submenuAnnotations); + submenuAnnotations.addSeparator(); + createMenuItem("Auto 5'/3'", "annotationsautoextremites", "control alt Q", submenuAnnotations); + createMenuItem("Auto helices", "annotationsautohelices", "control Q", submenuAnnotations); + createMenuItem("Auto interior loops", "annotationsautointerior", "alt shift Q", submenuAnnotations); + createMenuItem("Auto terminal loops", "annotationsautoterminal", "control shift Q", submenuAnnotations); + add(submenuAnnotations); + } + + private void fileMenu() { + createMenuItem("New...", "userInput", "control N", this,true); + createMenuItem("Open...", "file", "control O", this,true); + createMenuItem("Save...", "saveas", "control S", this,true); + JMenu submenuSave = new JMenu("Save as"); + createMenuItem("DBN (Vienna)", "dbn", "", submenuSave); + createMenuItem("BPSEQ", "bpseq", "", submenuSave); + createMenuItem("CT", "ct", "", submenuSave); + add(submenuSave); + } + + private void exportMenu() { + // Export menu + JMenu submenuExport = new JMenu("Export"); + createMenuItem("SVG", "svg", "", submenuExport); + createMenuItem("PGF/TIKZ", "tikz", "", submenuExport); + createMenuItem("XFIG", "xfig", "", submenuExport); + submenuExport.addSeparator(); + createMenuItem("EPS", "eps", "", submenuExport); + submenuExport.addSeparator(); + createMenuItem("PNG", "png", "", submenuExport); + createMenuItem("JPEG", "jpeg", "", submenuExport); + add(submenuExport); + } + + + private void displayMenu() { + + // SubMenu Base-pairs + JMenu subMenuBasePairs = new JMenu("Base Pairs"); + createMenuItem("BP style...", "bpstyle", "control shift P", subMenuBasePairs); + configMenuItem(_itemShowNCBP, "shownc", "control W", subMenuBasePairs); + configMenuItem(_itemShowOnlyPlanar, "shownp", "control E", subMenuBasePairs); + // SubMenu Non standard Bases + JMenu subMenuNSBases = new JMenu("Non-standard bases"); + configMenuItem(_itemOptionSpecialBaseColored, "specialbasecolored", "control J", subMenuNSBases); + createMenuItem("Color", "specialBasesColor", "control shift J", subMenuNSBases); + // SubMenu Gaps Bases + JMenu subMenuGapsBases = new JMenu("'Gaps' bases"); + configMenuItem(_itemOptionGapsBaseColored, "dashbasecolored", "control D", subMenuGapsBases); + _dashBasesColor = createMenuItem("Color", "dashBasesColor", "control shift D", subMenuGapsBases); + // Removable separator + //JSeparator sep = new JSeparator(); + JSeparator sep = new JPopupMenu.Separator(); // BH SWingJS needs JPopupMenu.Separator + _disabled.add(sep); + + // Style menu + JMenu submenuStyle = new JMenu("RNA style"); + createMenuItem("Toggle draw bases", "gaspin", "alt G", submenuStyle,true); + submenuStyle.add(subMenuBasePairs); + submenuStyle.addSeparator(); + submenuStyle.add(subMenuNSBases); + submenuStyle.add(subMenuGapsBases); + submenuStyle.add(sep); + createMenuItem("Backbone color", "backbone", "control K", submenuStyle,true); + configMenuItem(_itemDrawBackbone, "showbackbone", "alt B", submenuStyle); + + // Submenu Title + JMenu submenuTitle = new JMenu("Title"); + createMenuItem("Set Title", "setTitle", "control T", submenuTitle, true); + createMenuItem("Font", "titleDisplay", "control shift T", submenuTitle, true); + createMenuItem("Color", "titleColor", "control alt T", submenuTitle, true); + _disabled.add(submenuTitle); + + // Color map menu + JMenu submenuColorMap = new JMenu("Color map"); + configMenuItem(_itemShowColorMap, "toggleshowcolormap", "control shift L", submenuColorMap, false); + createMenuItem("Caption", "colormapcaption", "control shift C", submenuColorMap,true); + createMenuItem("Style...", "colormapstyle", "control L", submenuColorMap,false); + submenuColorMap.addSeparator(); + createMenuItem("Edit values...", "colormapvalues", "shift L", submenuColorMap,true); + createMenuItem("Load values...", "colormaploadvalues", "control shift K", submenuColorMap,true); + _disabled.add(submenuColorMap); + + // Menu Misc + JMenu submenuMisc = new JMenu("Misc"); + createMenuItem("Num. period.", "numPeriod", "control M", submenuMisc); + createMenuItem("Background color", "background", "control G", submenuMisc); + submenuMisc.add(submenuTitle); + + // Main menu + add(submenuStyle); + add(submenuColorMap); + add(submenuMisc); + + } + + private void editRNAMenu() + { + createMenuItem("Bases...","editallbases","",this,true); + createMenuItem("BasePairs...","editallbps","",this,true); + } + + private void redrawMenu() { + JMenu submenuRedraw = new JMenu("Redraw"); + _disabled.add(submenuRedraw); + + JMenu submenuAlgorithms = new JMenu("Algorithm"); + _disabled.add(submenuAlgorithms); + + createMenuItem("Linear","line","control 1",submenuAlgorithms,true); + createMenuItem("Circular","circular","control 2",submenuAlgorithms,true); + createMenuItem("Radiate","radiate","control 3",submenuAlgorithms,true); + createMenuItem("NAView","naview","control 4",submenuAlgorithms,true); + //createMenuItem("VARNAView","varnaview","control 5",submenuAlgorithms,true); + //createMenuItem("MOTIFView","motifview","control 6",submenuAlgorithms,true); + submenuRedraw.add(submenuAlgorithms); + + // Sets the height increment in LINEAR_MODE type of drawing + _bpHeightIncrement = createMenuItem("BP height increment","bpheightincrement","control H",submenuRedraw); + configMenuItem(_itemFlatExteriorLoop, "flat", "control F", submenuRedraw, true); + + // Item pour le r�glage de l'espace entre chaques bases + createMenuItem("Space between bases","spaceBetweenBases","control shift S",submenuRedraw,true); + createMenuItem("Reset","reset","control shift R",submenuRedraw,true); + + add(submenuRedraw); + } + + @SuppressWarnings("unused") + private void warningMenu() { + // Menu showWarning + configMenuItem(_itemShowWarnings, "showwarnings", "", this, true); + } + + private void viewMenu() { + // View menu + JMenu submenuView = new JMenu("View"); + + // Zoom submenu + JMenu zoomDisplay = new JMenu("Zoom"); + createMenuItem("25%","zoom25","",zoomDisplay); + createMenuItem("50%","zoom50","",zoomDisplay); + createMenuItem("100%","zoom100","",zoomDisplay); + createMenuItem("150%","zoom150","",zoomDisplay); + createMenuItem("200%","zoom200","",zoomDisplay); + createMenuItem("Custom","zoom","control Z",zoomDisplay); + submenuView.add(zoomDisplay); + _rotation = createMenuItem("Rotation...","rotation","control R",submenuView); + createMenuItem("Rescale...","rescale","",submenuView); + submenuView.addSeparator(); + createMenuItem("Border size","borderSize","control B",submenuView); + + add(submenuView); + + } + + JMenu _subMenuBases; + + private Component _selectionMenuIndex = null; + + public void addSelectionMenu(JMenuItem s) { + _selectionMenuIndex = s; + _disabled.add(s); + insert(s, getComponentCount() - 2); + } + + public void removeSelectionMenu() { + if (_selectionMenuIndex != null) { + this.remove(_selectionMenuIndex); + _selectionMenuIndex = null; + } + } + + private void colorClassesMenu() { + // Menu Bases + _subMenuBases = new JMenu("Colors"); + _disabled.add(_subMenuBases); + createMenuItem("By Base","eachKind","control U",_subMenuBases,true); + createMenuItem("By BP","eachCouple","shift U",_subMenuBases,true); + createMenuItem("By Position","eachBase","alt U",_subMenuBases,true); + add(_subMenuBases); + } + + /** + * add default color options to a menu + */ + public void addColorOptions(JMenu submenu) { + createMenuItem("Fill Color",submenu.getActionCommand() + ",InnerColor","",submenu,true); + createMenuItem("Stroke Color",submenu.getActionCommand() + ",OutlineColor","",submenu,true); + createMenuItem("Label Color",submenu.getActionCommand() + ",NameColor","",submenu,true); + submenu.addSeparator(); + createMenuItem("BP Color",submenu.getActionCommand() + ",BPColor","",submenu,true); + createMenuItem("BP Thickness",submenu.getActionCommand() + ",BPThickness","",submenu,true); + submenu.addSeparator(); + createMenuItem("Number Color",submenu.getActionCommand() + ",NumberColor","",submenu,true); + } + + private void aboutMenu() { + addSeparator(); + createMenuItem("About VARNA", "about", "control A", this); + } + + public void addAnnotationMenu(JMenu menu) { + addAnnotationMenu(menu, false); + } + + public void addAnnotationMenu(JMenu menu, boolean existingAnnot) { + String title = "Annotation"; + if (existingAnnot) + { + String debut = ""; + String texte = _vp.get_selectedAnnotation().getTexte(); + if (texte.length() < 5) + debut = texte; + else + debut = texte.substring(0, 5) + "..."; + title = "Annotation: " + debut; + } + JMenu menuAnnotation = new JMenu(title); + if (!existingAnnot) + createMenuItem("Add",menu.getActionCommand() + "annotationadd","",menuAnnotation,true); + createMenuItem("Edit",menu.getActionCommand() + "annotationedit","",menuAnnotation,true); + createMenuItem("Remove",menu.getActionCommand() + "annotationremove","",menuAnnotation,true); + menu.add(menuAnnotation); + } + + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public VARNAPanel get_vp() { + return _vp; + } + + public ControleurMenu get_controleurMenu() { + return _controlerMenu; + } + + public JCheckBoxMenuItem get_itemOptionSpecialBaseColored() { + return _itemOptionSpecialBaseColored; + } + + public JCheckBoxMenuItem get_itemShowWarnings() { + return _itemShowWarnings; + } + + public JCheckBoxMenuItem get_itemOptionDashBaseColored() { + return _itemOptionGapsBaseColored; + } + + public void set_controleurMenu(ControleurMenu menu) { + _controlerMenu = menu; + } + + public void set_itemOptionSpecialBaseColored( + JCheckBoxMenuItem optionSpecialBaseColored) { + _itemOptionSpecialBaseColored = optionSpecialBaseColored; + } + + public void set_itemShowWarnings(JCheckBoxMenuItem showWarnings) { + _itemShowWarnings = showWarnings; + } + + public void set_itemOptionDashBaseColored( + JCheckBoxMenuItem optionDashBaseColored) { + _itemOptionGapsBaseColored = optionDashBaseColored; + } + + public JMenuItem get_rotation() { + return _rotation; + } + + public void set_rotation(JMenuItem _rotation) { + this._rotation = _rotation; + } + + public JCheckBoxMenuItem get_itemOptionBondsColored() { + return _itemOptionBondsColored; + } + + public void set_itemOptionBondsColored(JCheckBoxMenuItem optionBondsColored) { + _itemOptionBondsColored = optionBondsColored; + } + + + public void show(Component invoker,int x,int y) { + _spawnOrigin = new Point(x,y); + super.show(invoker,x,y); + } + + public Point getSpawnPoint() + { + return _spawnOrigin ; + } + +} \ No newline at end of file