--- /dev/null
+/*
+ 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.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+import java.awt.geom.Point2D.Double;
+
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSlider;
+import javax.swing.JTextArea;
+import javax.swing.border.Border;
+import javax.swing.plaf.basic.BasicBorders;
+
+import fr.orsay.lri.varna.VARNAPanel;
+import fr.orsay.lri.varna.controlers.ControleurSliderLabel;
+import fr.orsay.lri.varna.controlers.ControleurVueAnnotation;
+import fr.orsay.lri.varna.models.annotations.TextAnnotation;
+
+/**
+ *
+ * BH SwingJS using asynchronous JOptionPane.showConfirmDialog
+ *
+ * annoted text view for edition
+ *
+ * @author Darty@lri.fr
+ *
+ */
+public class VueAnnotation {
+
+ protected VARNAPanel _vp;
+ private JSlider ySlider, xSlider;
+ private JButton colorButton;
+ private JTextArea textArea;
+ private JPanel panel;
+ protected TextAnnotation textAnnotation, textAnnotationSave;
+ private VueFont vueFont;
+ private ControleurVueAnnotation _controleurVueAnnotation;
+ protected boolean newAnnotation, limited;
+ private Double position;
+ private JSlider rotationSlider;
+
+ /**
+ * creates a view for a new annoted text
+ *
+ * @param vp
+ * @param limited
+ * if true, lets custom position and angle.
+ */
+ public VueAnnotation(VARNAPanel vp, boolean limited) {
+ this(
+ vp,
+ (int) (vp.getExtendedRNABBox().x + vp.getExtendedRNABBox().width / 2.0),
+ (int) (vp.getExtendedRNABBox().y + vp.getExtendedRNABBox().height / 2.0),
+ limited);
+ }
+
+ /**
+ * creates a view for a new annoted text, without limited option
+ *
+ * @param vp
+ */
+ public VueAnnotation(VARNAPanel vp) {
+ this(vp, false);
+ }
+
+ /**
+ * creates a view for a new annoted text at a given position, without
+ * limited option
+ *
+ * @param vp
+ */
+ public VueAnnotation(VARNAPanel vp, int x, int y) {
+ this(vp, x, y, false);
+ }
+
+ /**
+ * creates a view for a new annoted text at a given position, without
+ * limited option
+ *
+ * @param vp
+ */
+ public VueAnnotation(VARNAPanel vp, int x, int y, boolean limited) {
+ this(vp, new TextAnnotation("", x, y), false, true);
+ }
+
+ /**
+ * creates a view for an annoted text, without limited option
+ *
+ * @param vp
+ * @param textAnnot
+ */
+ public VueAnnotation(VARNAPanel vp, TextAnnotation textAnnot,
+ boolean newAnnotation) {
+ this(vp, textAnnot, (textAnnot.getType()!=TextAnnotation.AnchorType.POSITION), newAnnotation);
+ }
+
+ /**
+ * creates a view for an annoted text
+ *
+ *
+ * @param vp
+ * @param textAnnot
+ * @param reduite
+ * if true, lets custom position and angle.
+ * @param newAnnotation
+ * if true, deleted if cancelled.
+ */
+ public VueAnnotation(VARNAPanel vp, TextAnnotation textAnnot,
+ boolean reduite, boolean newAnnotation) {
+ this.limited = reduite;
+ this.newAnnotation = newAnnotation;
+ _vp = vp;
+ textAnnotation = textAnnot;
+ textAnnotationSave = textAnnotation.clone();
+
+ if (!_vp.getListeAnnotations().contains(textAnnot)) {
+ _vp.addAnnotation(textAnnotation);
+ }
+
+ _controleurVueAnnotation = new ControleurVueAnnotation(this);
+
+ position = textAnnotation.getCenterPosition();
+
+ /*
+ * if (textAnnotation.getType() != TextAnnotation.POSITION) { position =
+ * _vp.transformCoord(position); }
+ */
+
+ JPanel py = new JPanel();
+ JPanel px = new JPanel();
+ panel = new JPanel();
+ panel.setLayout(new GridLayout(0, 1));
+ py.setLayout(new FlowLayout(FlowLayout.LEFT));
+ px.setLayout(new FlowLayout(FlowLayout.LEFT));
+
+ ySlider = new JSlider(JSlider.HORIZONTAL, 0, (int) (_vp
+ .getExtendedRNABBox().height), Math.max(0, Math.min((int) (_vp
+ .getExtendedRNABBox().height), (int) (position.y - _vp
+ .getExtendedRNABBox().y))));
+ // Turn on labels at major tick marks.
+ ySlider.setMajorTickSpacing(500);
+ ySlider.setMinorTickSpacing(100);
+ ySlider.setPaintTicks(true);
+ ySlider.setPaintLabels(true);
+ ySlider.setPreferredSize(new Dimension(400,
+ ySlider.getPreferredSize().height));
+
+ JLabel yValueLabel = new JLabel(String.valueOf((int) position.y
+ - _vp.getExtendedRNABBox().y));
+ yValueLabel.setPreferredSize(new Dimension(50, yValueLabel
+ .getPreferredSize().height));
+ ySlider
+ .addChangeListener(new ControleurSliderLabel(yValueLabel, false));
+ ySlider.addChangeListener(_controleurVueAnnotation);
+
+ xSlider = new JSlider(JSlider.HORIZONTAL, 0, (int) (_vp
+ .getExtendedRNABBox().width), Math.max(0, Math.min((int) _vp
+ .getExtendedRNABBox().width, (int) (position.x - _vp
+ .getExtendedRNABBox().x))));
+ // Turn on labels at major tick marks.
+ xSlider.setMajorTickSpacing(500);
+ xSlider.setMinorTickSpacing(100);
+ xSlider.setPaintTicks(true);
+ xSlider.setPaintLabels(true);
+ xSlider.setPreferredSize(new Dimension(400,
+ xSlider.getPreferredSize().height));
+
+ JLabel xValueLabel = new JLabel(String.valueOf((int) position.x
+ - _vp.getExtendedRNABBox().x));
+ xValueLabel.setPreferredSize(new Dimension(50, xValueLabel
+ .getPreferredSize().height));
+ xSlider
+ .addChangeListener(new ControleurSliderLabel(xValueLabel, false));
+ xSlider.addChangeListener(_controleurVueAnnotation);
+
+ JLabel labelY = new JLabel("Y:");
+ JLabel labelX = new JLabel("X:");
+
+ py.add(labelY);
+ py.add(ySlider);
+ py.add(yValueLabel);
+ px.add(labelX);
+ px.add(xSlider);
+ px.add(xValueLabel);
+
+ /*if (!limited) {
+ panel.add(px);
+ panel.add(py);
+ }*/
+
+ JPanel panelTexte = new JPanel();
+ panelTexte.setLayout(new BorderLayout());
+ textArea = new JTextArea(textAnnotation.getTexte());
+ textArea.addCaretListener(_controleurVueAnnotation);
+ textArea.setPreferredSize(panelTexte.getSize());
+ Border border = new BasicBorders.FieldBorder(Color.black, Color.black,
+ Color.black, Color.black);
+ textArea.setBorder(border);
+ JLabel labelTexte = new JLabel("Text:");
+ panelTexte.add(textArea, BorderLayout.CENTER);
+ panelTexte.add(labelTexte, BorderLayout.NORTH);
+ panel.add(panelTexte);
+
+ vueFont = new VueFont(textAnnot.getFont());
+ vueFont.getBoxPolice().addActionListener(_controleurVueAnnotation);
+ vueFont.getSizeSlider().addChangeListener(_controleurVueAnnotation);
+ vueFont.getStylesBox().addActionListener(_controleurVueAnnotation);
+
+ colorButton = new JButton("Set color");
+ colorButton.setActionCommand("setcolor");
+ colorButton.setForeground(textAnnot.getColor());
+ colorButton.addActionListener(_controleurVueAnnotation);
+
+ JPanel fontAndColor = new JPanel();
+ fontAndColor.add(vueFont.getPanel());
+ fontAndColor.add(colorButton);
+
+ panel.add(fontAndColor);
+
+ JPanel rotationPanel = new JPanel();
+
+ rotationSlider = new JSlider(JSlider.HORIZONTAL, -360, 360,
+ (int) textAnnotation.getAngleInDegres());
+ rotationSlider.setMajorTickSpacing(60);
+ rotationSlider.setPaintTicks(true);
+ rotationSlider.setPaintLabels(true);
+ rotationSlider.setPreferredSize(new Dimension(500, 50));
+
+ JLabel rotationLabel = new JLabel(String.valueOf(0));
+ rotationLabel.setPreferredSize(new Dimension(50, rotationLabel
+ .getPreferredSize().height));
+ rotationSlider.addChangeListener(new ControleurSliderLabel(
+ rotationLabel, false));
+ rotationSlider.addChangeListener(_controleurVueAnnotation);
+
+ JLabel labelZ = new JLabel("Rotation (degrees):");
+
+ rotationPanel.add(labelZ);
+ rotationPanel.add(rotationSlider);
+ rotationPanel.add(rotationLabel);
+
+ /*
+ * if (!limited) { panel.add(rotationPanel); }
+ */
+
+ if (limited) {
+ ySlider.setEnabled(false);
+ xSlider.setEnabled(false);
+ rotationSlider.setEnabled(false);
+ }
+ textArea.requestFocusInWindow();
+
+ }
+
+ private void applyFont() {
+ textAnnotation.setFont(vueFont.getFont());
+ }
+
+ /**
+ * update the annoted text on the VARNAPanel
+ */
+ public void update() {
+ applyFont();
+ if (textAnnotation.getType() == TextAnnotation.AnchorType.POSITION)
+ textAnnotation.setAncrage((double) xSlider.getValue()
+ + _vp.getExtendedRNABBox().x, ySlider.getValue()
+ + _vp.getExtendedRNABBox().y);
+ textAnnotation.setText(textArea.getText());
+ textAnnotation.setAngleInDegres(rotationSlider.getValue());
+ _vp.clearSelection();
+ _vp.repaint();
+ }
+
+ public JPanel getPanel() {
+ return panel;
+ }
+
+ /**
+ *
+ * @return the annoted text
+ */
+ public TextAnnotation getTextAnnotation() {
+ return textAnnotation;
+ }
+
+ public VARNAPanel get_vp() {
+ return _vp;
+ }
+
+ /**
+ * shows the dialog which add it to the VARNAPanel for previsualization.
+ * <p>
+ * if validate, just update the annoted text
+ * <p>
+ * if cancelled : remove the annoted text if it was a new one, otherwise
+ * cancel modifications
+ * <p>
+ *
+ */
+ public void show() {
+ _vp.set_selectedAnnotation(textAnnotation);
+ _vp.highlightSelectedAnnotation();
+
+ // BH SwingjS using asynchronous dialog
+ Runnable ok = new Runnable() {
+
+ @Override
+ public void run() {
+ update();
+ }
+
+ };
+
+ Runnable cancel = new Runnable() {
+
+ @Override
+ public void run() {
+ if (newAnnotation) {
+ _vp.set_selectedAnnotation(null);
+ if (!_vp.removeAnnotation(textAnnotation))
+ _vp.errorDialog(new Exception("Impossible de supprimer"));
+ } else {
+ textAnnotation.copy(textAnnotationSave);
+ }
+ }
+
+ };
+
+ Runnable final_ = new Runnable() {
+
+ @Override
+ public void run() {
+ _vp.resetAnnotationHighlight();
+ _vp.set_selectedAnnotation(null);
+ _vp.repaint();
+ }
+
+ };
+
+ _vp.getVARNAUI().showConfirmDialog(getPanel(), "Add/edit annotation", ok, cancel, cancel, final_);
+ }
+
+ public boolean isLimited() {
+ return limited;
+ }
+
+ public void setLimited(boolean limited) {
+ this.limited = limited;
+ }
+
+ public boolean isNewAnnotation() {
+ return this.newAnnotation;
+ }
+
+ public void updateColor(Color c) {
+ colorButton.setForeground(c);
+ textAnnotation.setColor(c);
+
+ }
+
+}