package fr.orsay.lri.varna.views; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyVetoException; import java.beans.VetoableChangeListener; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Vector; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JOptionPane; 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.ActionEditor; import fr.orsay.lri.varna.components.ActionRenderer; 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.ModeleBP; import fr.orsay.lri.varna.models.rna.RNA; public class VueBPList extends JPanel implements TableModelListener, ActionListener { private JTable table; private BPTableModel _tm; private VARNAPanel _vp; private ArrayList<ModeleBP> data; private ArrayList<Double> _backup; private ArrayList<Object> columns; public enum Actions{ ACTION_DELETE, ACTION_EDIT_STYLE; public String toString() { switch(this) { case ACTION_DELETE: return "Delete"; case ACTION_EDIT_STYLE: return "Edit Style"; } return "N/A"; } }; public VueBPList(VARNAPanel vp) { super(new GridLayout(1, 0)); _vp = vp; init(); } private void init() { Object[] col = {"Sec.Str.","5' partner","3' partner","5' edge","3' edge","Orientation","Remove"}; columns = new ArrayList<Object>(); for (int i = 0; i < col.length; i++) { columns.add(col[i]); } _backup = new ArrayList<Double>(); data = new ArrayList<ModeleBP>(); for (ModeleBP ms: _vp.getRNA().getAllBPs()) { data.add(ms); } Collections.sort(data); _tm = new BPTableModel(); table = new JTable(_tm); table.setDefaultRenderer(Color.class, new ColorRenderer(true)); table.setDefaultRenderer(Actions.class, new ActionRenderer()); table.setDefaultEditor(ModeleBP.Edge.class, new DefaultCellEditor(new JComboBox(ModeleBP.Edge.values()))); table.setDefaultEditor(ModeleBP.Stericity.class, new DefaultCellEditor(new JComboBox(ModeleBP.Stericity.values()))); table.setDefaultEditor(Actions.class, new ActionEditor(this)); table.setPreferredScrollableViewportSize(new Dimension(500, 500)); table.getModel().addTableModelListener(this); table.setRowHeight(25); JScrollPane scrollPane = new JScrollPane(table); add(scrollPane); setOpaque(true); // content panes must be opaque this.doLayout(); JOptionPane.showMessageDialog(_vp, this, "Base pairs Edition", JOptionPane.PLAIN_MESSAGE); } 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 BPTableModel extends AbstractTableModel { /** * */ private static final long serialVersionUID = 1L; 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) { ModeleBP mb = data.get(row); if (col==0) { return new Boolean(mb.getPartner3().getElementStructure()==mb.getPartner5().getIndex()); } else if (col==1) { return new String(""+mb.getPartner5().getBaseNumber()+"-"+mb.getPartner5().getContent()); } else if (col==2) { return new String(""+mb.getPartner3().getBaseNumber()+"-"+mb.getPartner3().getContent()); } else if (col==3) { return mb.getEdgePartner5(); } else if (col==4) { return mb.getEdgePartner3(); } else if (col==5) { return mb.getStericity(); } else if (col==6) { return Actions.ACTION_DELETE; } return "N/A"; } public boolean isCellEditable(int row, int col) { if ( col == 3 || col ==4 || col ==5 || col ==6) return true; return false; } public void setValueAt(Object value, int row, int col) { if ( col == 3 || col ==4 || col ==5) { ModeleBP mb = data.get(row); if ( col == 3) { mb.setEdge5((ModeleBP.Edge)value); } else if ( col == 4) { mb.setEdge3((ModeleBP.Edge)value); } else if ( col == 5) { mb.setStericity((ModeleBP.Stericity)value); } fireTableCellUpdated(row, col); _vp.repaint(); } } public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } } public void tableChanged(TableModelEvent e) { if (e.getType() == TableModelEvent.UPDATE) { table.repaint(); } } public void actionPerformed(ActionEvent arg0) { //System.out.println(""+arg0.toString()); String[] data2 = arg0.getActionCommand().split("-"); int row = Integer.parseInt(data2[data2.length-1]); if (data2[0].equals("Delete")) { ModeleBP ms = data.get(row); _vp.getVARNAUI().UIRemoveBP(ms); data.remove(row); _tm.fireTableRowsDeleted(row, row); } } }