/*
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 _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<JComponent> _disabled = new ArrayList<JComponent>();
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) {
JSeparator sep = new JSeparator();
JLabel titleItem = new JLabel(" " + title);
// 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();
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();
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("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();
_disabled.add(sep);
// Style menu
JMenu submenuStyle = new JMenu("RNA style");
createMenuItem("Toggle 'Gaspin' mode", "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);
// 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);
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 ;
}
}