package fr.orsay.lri.varna.views;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Arrays;
import java.util.Comparator;
import javax.swing.BoxLayout;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import fr.orsay.lri.varna.VARNAPanel;
import fr.orsay.lri.varna.components.GradientEditorPanel;
import fr.orsay.lri.varna.models.VARNAConfig;
import fr.orsay.lri.varna.models.rna.ModeleColorMap;
import fr.orsay.lri.varna.models.rna.ModeleColorMap.NamedColorMapTypes;
public class VueColorMapStyle extends JPanel implements ActionListener, ItemListener, PropertyChangeListener {
private VARNAPanel _vp;
private GradientEditorPanel _gp;
private JComboBox _cb;
private JTextField _code;
private ModeleColorMap _backup;
public VueColorMapStyle(VARNAPanel vp)
{
super();
_vp = vp;
init();
}
private void init()
{
JLabel gradientCaption = new JLabel("Click gradient to add new color...");
_gp = new GradientEditorPanel(_vp.getColorMap().clone());
_backup = _vp.getColorMap();
_gp.setPreferredSize(new Dimension(300,70));
_gp.addPropertyChangeListener(this);
JPanel codePanel = new JPanel();
JLabel codeCaption = new JLabel("Param. code: ");
_code = new JTextField("");
_code.setFont(Font.decode("Monospaced-PLAIN-12"));
_code.setEditable(false);
_code.addFocusListener(new FocusListener(){
public void focusGained(FocusEvent arg0) {
_code.setSelectionStart(0);
_code.setSelectionEnd(_code.getText().length());
}
public void focusLost(FocusEvent arg0) {
}
});
NamedColorMapTypes[] palettes = ModeleColorMap.NamedColorMapTypes.values();
Arrays.sort(palettes,new Comparator<ModeleColorMap.NamedColorMapTypes>(){
public int compare(ModeleColorMap.NamedColorMapTypes arg0, ModeleColorMap.NamedColorMapTypes arg1) {
return arg0.getId().compareTo(arg1.getId());
}
});
Object[] finalArray = new Object[palettes.length+1];
int selected = -1;
for (int i=0;i<palettes.length;i++)
{
if (palettes[i].getColorMap().equals(_vp.getColorMap()))
{
selected = i;
//System.out.println(selected);
}
finalArray[i] = palettes[i];
}
String custom = new String("Custom...");
finalArray[palettes.length] = custom;
_cb = new JComboBox(finalArray);
if (selected!=-1)
{
_cb.setSelectedIndex(selected);
_code.setText(palettes[selected].getId());
}
else
{
_cb.setSelectedItem(finalArray.length-1);
_code.setText(_gp.getColorMap().getParamEncoding());
}
_cb.addItemListener(this);
codePanel.setLayout(new BoxLayout(codePanel,BoxLayout.LINE_AXIS));
codePanel.add(codeCaption);
codePanel.add(_code);
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(_cb);
add(gradientCaption);
add(_gp);
add(codePanel);
}
public void cancelChanges()
{
_vp.setColorMap(_backup);
}
public ModeleColorMap getColorMap()
{
return _gp.getColorMap();
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
private void refreshCode()
{
int selected = -1;
NamedColorMapTypes n = null;
for (int i=0;i<_cb.getItemCount()-1;i++)
{
Object o = _cb.getItemAt(i);
if (o instanceof NamedColorMapTypes)
{
NamedColorMapTypes ni = (NamedColorMapTypes) o;
if (ni.getColorMap().equals(_gp.getColorMap()))
{
selected = i; n = ni;
}
}
}
if (selected!=-1)
{
_code.setText(n.getId());
_cb.setSelectedIndex(selected);
}
else
{
_code.setText(_gp.getColorMap().getParamEncoding());
}
_vp.setColorMap(_gp.getColorMap());
_gp.repaint();
}
public void itemStateChanged(ItemEvent arg0) {
if (arg0.getStateChange()==ItemEvent.SELECTED)
{
Object o = arg0.getItem();
if (o instanceof ModeleColorMap.NamedColorMapTypes)
{
ModeleColorMap.NamedColorMapTypes n = ((ModeleColorMap.NamedColorMapTypes) o);
_gp.setColorMap(n.getColorMap().clone());
refreshCode();
}
}
}
public void propertyChange(PropertyChangeEvent arg0) {
if (arg0.getPropertyName().equals("PaletteChanged"))
{
_cb.setSelectedIndex(_cb.getItemCount()-1);
refreshCode();
};
}
}