package fr.orsay.lri.varna.views;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import fr.orsay.lri.varna.VARNAPanel;
import fr.orsay.lri.varna.models.annotations.HighlightRegionAnnotation;
import fr.orsay.lri.varna.models.rna.ModeleBase;
public class VueHighlightRegionEdit implements ChangeListener, ActionListener {
private VARNAPanel _vp;
private JSlider _fromSlider;
private JSlider _toSlider;
private JPanel panel;
private HighlightRegionAnnotation _an;
private static int CONTROL_HEIGHT = 50;
private static int TITLE_WIDTH = 70;
private static int CONTROL_WIDTH = 200;
private JButton fillShow = new JButton();
private JButton outlineShow = new JButton();
JSpinner rad;
public VueHighlightRegionEdit(VARNAPanel vp, HighlightRegionAnnotation an) {
_an = an;
_vp = vp;
_toSlider = new JSlider(JSlider.HORIZONTAL, 0,vp.getRNA().getSize()-1,0);
_toSlider.setMajorTickSpacing(10);
_toSlider.setPaintTicks(true);
_toSlider.setPaintLabels(true);
_toSlider.setPreferredSize(new Dimension(CONTROL_WIDTH, CONTROL_HEIGHT));
_fromSlider = new JSlider(JSlider.HORIZONTAL, 0,vp.getRNA().getSize()-1,0);
_fromSlider.setMajorTickSpacing(10);
_fromSlider.setPaintTicks(true);
_fromSlider.setPaintLabels(true);
_fromSlider.setPreferredSize(new Dimension(CONTROL_WIDTH, CONTROL_HEIGHT));
_fromSlider.addChangeListener(this);
_toSlider.addChangeListener(this);
panel = new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.LEFT));
JPanel fromp = new JPanel();
JLabel l1 = new JLabel("From: ");
l1.setPreferredSize(new Dimension(TITLE_WIDTH,CONTROL_HEIGHT));
fromp.add(l1);
fromp.add(_fromSlider);
JPanel top = new JPanel();
l1 = new JLabel("To: ");
l1.setPreferredSize(new Dimension(TITLE_WIDTH,CONTROL_HEIGHT));
top.add(l1);
top.add(_toSlider);
JPanel outlinep = new JPanel();
l1 = new JLabel("Outline color: ");
l1.setPreferredSize(new Dimension(TITLE_WIDTH,CONTROL_HEIGHT));
outlineShow.setContentAreaFilled(false);
outlineShow.setOpaque(true);
outlineShow.setPreferredSize(new Dimension(CONTROL_WIDTH,CONTROL_HEIGHT));
outlineShow.setBackground(an.getOutlineColor());
outlineShow.addActionListener(this);
outlineShow.setActionCommand("outline");
outlinep.add(l1);
outlinep.add(outlineShow);
JPanel fillp = new JPanel();
l1 = new JLabel("Fill color: ");
l1.setPreferredSize(new Dimension(TITLE_WIDTH,CONTROL_HEIGHT));
fillShow.setContentAreaFilled(false);
fillShow.setOpaque(true);
fillShow.setPreferredSize(new Dimension(CONTROL_WIDTH,CONTROL_HEIGHT));
fillShow.setBackground(an.getFillColor());
fillShow.addActionListener(this);
fillShow.setActionCommand("fill");
fillp.add(l1);
fillp.add(fillShow);
JPanel radiusp = new JPanel();
l1 = new JLabel("Radius: ");
l1.setPreferredSize(new Dimension(TITLE_WIDTH,CONTROL_HEIGHT));
SpinnerNumberModel jm = new SpinnerNumberModel(_an.getRadius(),1.0,50.0,0.1);
rad = new JSpinner(jm);
rad.setPreferredSize(new Dimension(CONTROL_WIDTH,CONTROL_HEIGHT));
radiusp.add(l1);
radiusp.add(rad);
rad.addChangeListener(this);
JPanel jp = new JPanel();
jp.setLayout(new GridLayout(5,1));
jp.add(fromp);
jp.add(top);
jp.add(outlinep);
jp.add(fillp);
jp.add(radiusp);
panel.add(jp);
}
public JPanel getPanel() {
return panel;
}
public double getAngle() {
return _toSlider.getValue();
}
public VARNAPanel get_vp() {
return _vp;
}
HighlightRegionAnnotation _backup = null;
public boolean show() {
boolean accept = false;
int from = _an.getMinIndex();
int to = _an.getMaxIndex();
_fromSlider.setValue(from);
_toSlider.setValue(to );
if (JOptionPane.showConfirmDialog(_vp, getPanel(),
"Edit region annotation", JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE) == JOptionPane.OK_OPTION)
{
accept = true;
}
_vp.repaint();
return accept;
}
public void stateChanged(ChangeEvent e) {
if ((e.getSource()==_toSlider)||(e.getSource()==_fromSlider))
{
int from = _fromSlider.getValue();
int to = _toSlider.getValue();
if (from>to)
{
if (e.getSource().equals(_fromSlider))
{
_toSlider.setValue(from);
}
else if (e.getSource().equals(_toSlider))
{
_fromSlider.setValue(to);
}
}
from = _fromSlider.getValue();
to = _toSlider.getValue();
_an.setBases(_vp.getRNA().getBasesBetween(from, to));
_vp.repaint();
}
else if (e.getSource().equals(rad))
{
Object val = rad.getValue();
if (val instanceof Double)
{
_an.setRadius(((Double)val).doubleValue());
}
}
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("outline"))
{
Color c = JColorChooser.showDialog(getPanel(), "Choose new outline color", _an.getOutlineColor());
if (c!= null)
{ _an.setOutlineColor(c); }
}
else if (e.getActionCommand().equals("fill"))
{
Color c = JColorChooser.showDialog(getPanel(), "Choose new fill color", _an.getFillColor());
if (c!= null)
{ _an.setFillColor(c); }
}
outlineShow.setBackground(_an.getOutlineColor());
fillShow.setBackground(_an.getFillColor());
_vp.repaint();
}
}