package fr.orsay.lri.varna.views; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.beans.PropertyChangeEvent; import java.beans.PropertyVetoException; import java.beans.VetoableChangeListener; import java.util.ArrayList; import java.util.Vector; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; import fr.orsay.lri.varna.VARNAPanel; import fr.orsay.lri.varna.components.ColorRenderer; import fr.orsay.lri.varna.models.rna.ModeleBase; import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide; import fr.orsay.lri.varna.models.rna.ModeleColorMap; import fr.orsay.lri.varna.models.rna.RNA; public class VueBaseValues extends JPanel implements TableModelListener { private JTable table; private ValueTableModel _tm; private VARNAPanel _vp; private ArrayList<ModeleBase> data; private ArrayList<Double> _backup; private ArrayList<Object> columns; public VueBaseValues(VARNAPanel vp) { super(new GridLayout(1, 0)); _vp = vp; init(); } private void init() { Object[] col = {"Number","Base","Value","Preview"}; columns = new ArrayList<Object>(); for (int i = 0; i < col.length; i++) { columns.add(col[i]); } _backup = new ArrayList<Double>(); data = new ArrayList<ModeleBase>(); for (int i = 0; i < _vp.getRNA().get_listeBases().size(); i++) { ModeleBase mb = _vp.getRNA().get_listeBases().get(i); data.add(mb); _backup.add(mb.getValue()); } _tm = new ValueTableModel(); table = new JTable(_tm); table.setDefaultRenderer(Color.class, new ColorRenderer(true)); table.setPreferredScrollableViewportSize(new Dimension(300, 300)); table.getModel().addTableModelListener(this); JScrollPane scrollPane = new JScrollPane(table); this.add(scrollPane); } public void cancelChanges() { for (int i = 0; i < _vp.getRNA().get_listeBases().size(); i++) { ModeleBase mb = _vp.getRNA().get_listeBases().get(i); mb.setValue(_backup.get(i)); } _vp.getRNA().rescaleColorMap(_vp.getColorMap()); } private class ValueTableModel extends AbstractTableModel { public String getColumnName(int col) { return columns.get(col).toString(); } public int getRowCount() { return data.size(); } public int getColumnCount() { return columns.size(); } public Object getValueAt(int row, int col) { ModeleBase mb = data.get(row); if (col==0) { return new Integer(mb.getBaseNumber()); } else if (col==1) { return new String(mb.getContent()); } else if (col==2) { return new Double(mb.getValue()); } else if (col==3) { return _vp.getColorMap().getColorForValue(mb.getValue()); } return "N/A"; } public boolean isCellEditable(int row, int col) { if (getColumnName(col).equals("Value")) return true; return false; } public void setValueAt(Object value, int row, int col) { if (getColumnName(col).equals("Value")) { data.get(row).setValue(((Double)value)); _vp.getRNA().rescaleColorMap(_vp.getColorMap()); _vp.repaint(); fireTableCellUpdated(row, col); } } public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } } public void tableChanged(TableModelEvent e) { if (e.getType() == TableModelEvent.UPDATE) { table.repaint(); } } }