JAL-3032 adds Java 8 functionality (2/2)
[jalview.git] / src2 / fr / orsay / lri / varna / views / VueBPList.java
1 package fr.orsay.lri.varna.views;
2
3 import java.awt.Color;
4 import java.awt.Dimension;
5 import java.awt.GridLayout;
6 import java.awt.event.ActionEvent;
7 import java.awt.event.ActionListener;
8 import java.beans.PropertyChangeEvent;
9 import java.beans.PropertyVetoException;
10 import java.beans.VetoableChangeListener;
11 import java.util.ArrayList;
12 import java.util.Arrays;
13 import java.util.Collections;
14 import java.util.Vector;
15
16 import javax.swing.DefaultCellEditor;
17 import javax.swing.JButton;
18 import javax.swing.JComboBox;
19 import javax.swing.JOptionPane;
20 import javax.swing.JPanel;
21 import javax.swing.JScrollPane;
22 import javax.swing.JTable;
23 import javax.swing.event.TableModelEvent;
24 import javax.swing.event.TableModelListener;
25 import javax.swing.table.AbstractTableModel;
26
27 import fr.orsay.lri.varna.VARNAPanel;
28 import fr.orsay.lri.varna.components.ActionEditor;
29 import fr.orsay.lri.varna.components.ActionRenderer;
30 import fr.orsay.lri.varna.components.ColorRenderer;
31 import fr.orsay.lri.varna.models.rna.ModeleBase;
32 import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide;
33 import fr.orsay.lri.varna.models.rna.ModeleColorMap;
34 import fr.orsay.lri.varna.models.rna.ModeleBP;
35 import fr.orsay.lri.varna.models.rna.RNA;
36
37 public class VueBPList extends JPanel implements TableModelListener, ActionListener
38 {
39
40         private JTable table;
41         private BPTableModel _tm;
42         private VARNAPanel _vp;
43         private ArrayList<ModeleBP> data;
44         private ArrayList<Double> _backup;
45         private ArrayList<Object> columns;
46         
47         
48         public enum Actions{
49                 ACTION_DELETE,
50                 ACTION_EDIT_STYLE;
51                 
52                 public String toString()
53                 {
54                         switch(this)
55                         {
56                           case ACTION_DELETE:
57                                   return "Delete";
58                           case ACTION_EDIT_STYLE:
59                                   return "Edit Style";
60                         }
61                         return "N/A";
62                 }
63         };
64         
65         public VueBPList(VARNAPanel vp)
66         {
67                 super(new GridLayout(1, 0));
68                 _vp = vp;
69                 init();
70         }
71         
72         private void init()
73         {
74                 Object[] col = {"Sec.Str.","5' partner","3' partner","5' edge","3' edge","Orientation","Remove"};
75                 columns = new ArrayList<Object>();
76                 for (int i = 0; i < col.length; i++)
77                 {
78                         columns.add(col[i]);
79                 }
80                 
81                 _backup = new ArrayList<Double>();
82                 data = new ArrayList<ModeleBP>();
83                 for (ModeleBP ms: _vp.getRNA().getAllBPs()) 
84                 {
85                         data.add(ms);
86                 }
87                 Collections.sort(data);
88                 _tm = new BPTableModel();
89                 table = new JTable(_tm);
90                 
91                 table.setDefaultRenderer(Color.class, new ColorRenderer(true)); 
92                 table.setDefaultRenderer(Actions.class, new ActionRenderer());
93                 
94                 table.setDefaultEditor(ModeleBP.Edge.class, new DefaultCellEditor(new JComboBox(ModeleBP.Edge.values())));
95                 table.setDefaultEditor(ModeleBP.Stericity.class, new DefaultCellEditor(new JComboBox(ModeleBP.Stericity.values())));
96                 table.setDefaultEditor(Actions.class, new ActionEditor(this));
97
98                 table.setPreferredScrollableViewportSize(new Dimension(500, 500));
99                 table.getModel().addTableModelListener(this);
100                 
101                 table.setRowHeight(25);
102                 
103                 JScrollPane scrollPane = new JScrollPane(table);
104                 add(scrollPane);
105                 setOpaque(true); // content panes must be opaque
106                 this.doLayout();
107
108                 JOptionPane.showMessageDialog(_vp, this, "Base pairs Edition", JOptionPane.PLAIN_MESSAGE);
109
110         }
111         
112         public void cancelChanges()
113         {
114                 for (int i = 0; i < _vp.getRNA().get_listeBases().size(); i++) 
115                 {
116                         ModeleBase mb = _vp.getRNA().get_listeBases().get(i);
117                         mb.setValue(_backup.get(i));
118                 }
119           _vp.getRNA().rescaleColorMap(_vp.getColorMap());
120         }
121
122         private class BPTableModel extends AbstractTableModel {
123             /**
124                  * 
125                  */
126                 private static final long serialVersionUID = 1L;
127                 public String getColumnName(int col) {
128                 return columns.get(col).toString();
129             }
130             public int getRowCount() { return data.size(); }
131             public int getColumnCount() { return columns.size(); }
132             public Object getValueAt(int row, int col) {
133                 ModeleBP mb = data.get(row);
134                 if (col==0)
135                 {
136                         return new Boolean(mb.getPartner3().getElementStructure()==mb.getPartner5().getIndex());
137                 }
138                 else if (col==1)
139                 {
140                         return new String(""+mb.getPartner5().getBaseNumber()+"-"+mb.getPartner5().getContent());
141                 } 
142                 else if (col==2)
143                 {
144                         return new String(""+mb.getPartner3().getBaseNumber()+"-"+mb.getPartner3().getContent());
145                 } 
146                 else if (col==3)
147                 {
148                         return mb.getEdgePartner5();
149                 }
150                 else if (col==4)
151                 {
152                         return mb.getEdgePartner3();
153                 }
154                 else if (col==5)
155                 {
156                         return mb.getStericity();
157                 }
158                 else if (col==6)
159                 {
160                         return Actions.ACTION_DELETE;
161                 }
162                 return "N/A";
163             }
164             public boolean isCellEditable(int row, int col)
165                 { 
166                         if ( col == 3 || col ==4 || col ==5 || col ==6) 
167                                 return true;
168                         return false;
169                 }
170             public void setValueAt(Object value, int row, int col) {
171                 if ( col == 3 || col ==4 || col ==5) 
172                 {
173                         ModeleBP mb = data.get(row);
174                         if ( col == 3)
175                         {
176                           mb.setEdge5((ModeleBP.Edge)value);    
177                         }
178                         else if ( col == 4)
179                         {
180                                   mb.setEdge3((ModeleBP.Edge)value);    
181                         }
182                         else if ( col == 5)
183                         {
184                                   mb.setStericity((ModeleBP.Stericity)value);                                   
185                         }
186                   fireTableCellUpdated(row, col);
187                   _vp.repaint();
188                   
189                 }
190             }
191             
192             public Class getColumnClass(int c) {
193                 return getValueAt(0, c).getClass();
194             }
195         }
196
197         public void tableChanged(TableModelEvent e) {
198                 if (e.getType() == TableModelEvent.UPDATE)
199                 {
200                         table.repaint();
201                 }
202                 
203         }
204
205         public void actionPerformed(ActionEvent arg0) {
206                 //System.out.println(""+arg0.toString());
207                 String[] data2 = arg0.getActionCommand().split("-");
208                 int row = Integer.parseInt(data2[data2.length-1]);
209                 if (data2[0].equals("Delete"))
210                 {
211                         ModeleBP ms = data.get(row);
212                         _vp.getVARNAUI().UIRemoveBP(ms);
213                         
214                         
215                         data.remove(row);
216                         
217                         _tm.fireTableRowsDeleted(row, row);
218                 }
219         }
220
221 }