Moved vector features
[jalview.git] / src / jalview / gui / FeatureSettings.java
1 package jalview.gui;\r
2 \r
3 import jalview.datamodel.*;\r
4 import javax.swing.*;\r
5 import javax.swing.event.*;\r
6 import java.awt.*;\r
7 import java.util.*;\r
8 import javax.swing.BorderFactory;\r
9 import java.awt.event.*;\r
10 import javax.swing.table.*;\r
11 import java.io.*;\r
12 \r
13 public class FeatureSettings extends JPanel\r
14 {\r
15 \r
16   final FeatureRenderer fr;\r
17   final AlignmentPanel ap;\r
18   Object [][] originalData;\r
19 \r
20   public FeatureSettings(AlignViewport av, final AlignmentPanel ap)\r
21   {\r
22     this.ap = ap;\r
23     fr = ap.seqPanel.seqCanvas.getFeatureRenderer();\r
24     av.alignment.getSequences();\r
25     final JInternalFrame frame = new JInternalFrame();\r
26     frame.setContentPane(this);\r
27     Desktop.addInternalFrame(frame, "Sequence Feature Settings", 500, 300);\r
28 \r
29 \r
30     Vector allFeatures = new Vector();\r
31     Vector features;\r
32     Enumeration e;\r
33     SequenceFeature sf;\r
34 \r
35 \r
36     for(int i=0; i< av.alignment.getHeight(); i++)\r
37     {\r
38        features = av.alignment.getSequenceAt(i).getSequenceFeatures();\r
39        if(features==null)\r
40          continue;\r
41 \r
42        e = features.elements();\r
43        while(e.hasMoreElements())\r
44        {\r
45          sf = (SequenceFeature)e.nextElement();\r
46          if(!allFeatures.contains(sf.getType()))\r
47          {\r
48            allFeatures.addElement(sf.getType());\r
49          }\r
50        }\r
51     }\r
52     if(allFeatures.size()<1)\r
53      {\r
54        try{\r
55          frame.setClosed(true);\r
56        }catch(Exception ex){}\r
57        return;\r
58      }\r
59 \r
60     int fSize = allFeatures.size();\r
61 \r
62     String type;\r
63     Object [][] data = new Object[fSize][3];\r
64     originalData = new Object[fSize][3];\r
65     for(int i=0; i<fSize; i++)\r
66     {\r
67       type = allFeatures.elementAt(i).toString();\r
68       Color col = fr.getColour(type);\r
69       data[i][0]=type;\r
70       data[i][1]=col;\r
71       data[i][2]= new Boolean(true);\r
72       originalData[i][0]=type;\r
73       originalData[i][1]=col;\r
74       originalData[i][2]= new Boolean(true);\r
75     }\r
76 \r
77     final JSlider transparency = new JSlider(0,70,0);\r
78     transparency.addChangeListener(new ChangeListener()\r
79         {\r
80           public void stateChanged(ChangeEvent evt)\r
81           {\r
82             fr.setTransparency( (float)(100-transparency.getValue())/100f);\r
83             ap.repaint();\r
84           }\r
85         });\r
86 \r
87     JPanel transPanel = new JPanel(new FlowLayout());\r
88     transPanel.add(new JLabel("Transparency"));\r
89     transPanel.add(transparency);\r
90 \r
91 \r
92 \r
93     ////////////////////////////////////\r
94     //Now build the table\r
95     final JTable table = new JTable(new FeatureTableModel(data));\r
96     JScrollPane scrollPane = new JScrollPane(table);\r
97     table.getTableHeader().setFont(new Font("Verdana", Font.PLAIN, 12));\r
98     table.setFont(new Font("Verdana", Font.PLAIN, 12));\r
99     table.setDefaultRenderer(Color.class,\r
100                          new ColorRenderer());\r
101 \r
102     table.setDefaultEditor(Color.class,\r
103                       new ColorEditor());\r
104 \r
105     table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
106 \r
107     table.addMouseListener(new MouseAdapter()\r
108         {\r
109           public void mousePressed(MouseEvent evt)\r
110           {\r
111             selectedRow = table.rowAtPoint(evt.getPoint());\r
112           }\r
113         });\r
114 \r
115     table.addMouseMotionListener(new MouseMotionAdapter()\r
116         {\r
117           public void mouseDragged(MouseEvent evt)\r
118           {\r
119             int newRow = table.rowAtPoint(evt.getPoint());\r
120             if(newRow!=selectedRow\r
121                && selectedRow!=-1\r
122                && newRow!=-1)\r
123             {\r
124               Object[] temp = new Object[3];\r
125               temp[0] = table.getValueAt(selectedRow, 0);\r
126               temp[1] = table.getValueAt(selectedRow, 1);\r
127               temp[2] = table.getValueAt(selectedRow, 2);\r
128 \r
129               table.setValueAt(table.getValueAt(newRow, 0), selectedRow, 0);\r
130               table.setValueAt(table.getValueAt(newRow, 1), selectedRow, 1);\r
131               table.setValueAt(table.getValueAt(newRow, 2), selectedRow, 2);\r
132 \r
133               table.setValueAt(temp[0], newRow, 0);\r
134               table.setValueAt(temp[1], newRow, 1);\r
135               table.setValueAt(temp[2], newRow, 2);\r
136 \r
137               selectedRow = newRow;\r
138             }\r
139           }\r
140         });\r
141 \r
142       //////////////////////////////////////////////\r
143       //We're going to need those OK cancel buttons\r
144       JPanel buttonPanel = new JPanel(new FlowLayout());\r
145         JButton button = new JButton("OK");\r
146         button.addActionListener(new ActionListener()\r
147         {\r
148           public void actionPerformed(ActionEvent evt)\r
149           {\r
150             try {\r
151               frame.setClosed(true);\r
152             }\r
153             catch (Exception exe)\r
154             {}\r
155           }\r
156         });\r
157         buttonPanel.add(button);\r
158         button = new JButton("Cancel");\r
159         button.addActionListener(new ActionListener()\r
160         {\r
161           public void actionPerformed(ActionEvent evt)\r
162           {\r
163             try{\r
164               updateFeatureRenderer(originalData);\r
165               frame.setClosed(true);\r
166             }catch(Exception exe){}\r
167           }\r
168         });\r
169         buttonPanel.add(button);\r
170 \r
171 \r
172         this.setLayout(new BorderLayout());\r
173         JPanel bigPanel = new JPanel(new BorderLayout());\r
174         bigPanel.add(transPanel, BorderLayout.SOUTH);\r
175         bigPanel.add(scrollPane, BorderLayout.CENTER);\r
176 \r
177         add(bigPanel, BorderLayout.CENTER);\r
178         add(buttonPanel, BorderLayout.SOUTH);\r
179 \r
180   }\r
181 \r
182   public void updateFeatureRenderer(Object [][] data)\r
183   {\r
184     fr.setFeaturePriority( data );\r
185     ap.repaint();\r
186   }\r
187 \r
188   int selectedRow =-1;\r
189 \r
190 \r
191   /////////////////////////////////////////////////////////////////////////\r
192   // http://java.sun.com/docs/books/tutorial/uiswing/components/table.html\r
193   /////////////////////////////////////////////////////////////////////////\r
194   class FeatureTableModel\r
195       extends AbstractTableModel\r
196   {\r
197     FeatureTableModel(Object[][] data)\r
198     {\r
199       this.data = data;\r
200     }\r
201 \r
202     private String[] columnNames = {"Feature Type", "Colour","Display"};\r
203           private Object[][] data;\r
204 \r
205           public Object[][] getData()\r
206           {\r
207             return data;\r
208           }\r
209 \r
210           public int getColumnCount() {\r
211               return columnNames.length;\r
212           }\r
213 \r
214           public Object[] getRow(int row)\r
215           {\r
216             return data[row];\r
217           }\r
218 \r
219           public int getRowCount() {\r
220               return data.length;\r
221           }\r
222 \r
223           public String getColumnName(int col) {\r
224               return columnNames[col];\r
225           }\r
226 \r
227           public Object getValueAt(int row, int col) {\r
228               return data[row][col];\r
229           }\r
230 \r
231           public Class getColumnClass(int c) {\r
232               return getValueAt(0, c).getClass();\r
233           }\r
234 \r
235           public boolean isCellEditable(int row, int col) {\r
236               return col==0 ? false:true;\r
237           }\r
238 \r
239           public void setValueAt(Object value, int row, int col) {\r
240               data[row][col] = value;\r
241               fireTableCellUpdated(row, col);\r
242               updateFeatureRenderer(data);\r
243           }\r
244 \r
245     }\r
246     class ColorRenderer extends JLabel\r
247                               implements TableCellRenderer {\r
248        javax.swing.border.Border unselectedBorder = null;\r
249        javax.swing.border.Border selectedBorder = null;\r
250 \r
251        public ColorRenderer() {\r
252            setOpaque(true); //MUST do this for background to show up.\r
253        }\r
254 \r
255        public Component getTableCellRendererComponent(\r
256                                JTable table, Object color,\r
257                                boolean isSelected, boolean hasFocus,\r
258                                int row, int column) {\r
259            Color newColor = (Color)color;\r
260            setBackground(newColor);\r
261                if (isSelected) {\r
262                    if (selectedBorder == null) {\r
263                        selectedBorder = BorderFactory.createMatteBorder(2,5,2,5,\r
264                                                  table.getSelectionBackground());\r
265                    }\r
266                    setBorder(selectedBorder);\r
267                } else {\r
268                    if (unselectedBorder == null) {\r
269                        unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5,\r
270                                                  table.getBackground());\r
271                    }\r
272                    setBorder(unselectedBorder);\r
273                }\r
274 \r
275            setToolTipText("RGB value: " + newColor.getRed() + ", "\r
276                                         + newColor.getGreen() + ", "\r
277                                         + newColor.getBlue());\r
278            return this;\r
279        }\r
280    }\r
281 }\r
282 \r
283  class ColorEditor extends AbstractCellEditor\r
284                           implements TableCellEditor,\r
285                                      ActionListener {\r
286      Color currentColor;\r
287      JButton button;\r
288      JColorChooser colorChooser;\r
289      JDialog dialog;\r
290      protected static final String EDIT = "edit";\r
291 \r
292      public ColorEditor() {\r
293          //Set up the editor (from the table's point of view),\r
294          //which is a button.\r
295          //This button brings up the color chooser dialog,\r
296          //which is the editor from the user's point of view.\r
297          button = new JButton();\r
298          button.setActionCommand(EDIT);\r
299          button.addActionListener(this);\r
300          button.setBorderPainted(false);\r
301          //Set up the dialog that the button brings up.\r
302          colorChooser = new JColorChooser();\r
303          dialog = JColorChooser.createDialog(button,\r
304                                          "Select new Colour",\r
305                                          true,  //modal\r
306                                          colorChooser,\r
307                                          this,  //OK button handler\r
308                                          null); //no CANCEL button handler\r
309      }\r
310 \r
311      /**\r
312       * Handles events from the editor button and from\r
313       * the dialog's OK button.\r
314       */\r
315      public void actionPerformed(ActionEvent e) {\r
316 \r
317           if (EDIT.equals(e.getActionCommand())) {\r
318              //The user has clicked the cell, so\r
319              //bring up the dialog.\r
320              button.setBackground(currentColor);\r
321              colorChooser.setColor(currentColor);\r
322              dialog.setVisible(true);\r
323 \r
324              //Make the renderer reappear.\r
325              fireEditingStopped();\r
326 \r
327          } else { //User pressed dialog's "OK" button.\r
328              currentColor = colorChooser.getColor();\r
329          }\r
330      }\r
331 \r
332      //Implement the one CellEditor method that AbstractCellEditor doesn't.\r
333      public Object getCellEditorValue() {\r
334          return currentColor;\r
335      }\r
336 \r
337      //Implement the one method defined by TableCellEditor.\r
338      public Component getTableCellEditorComponent(JTable table,\r
339                                                   Object value,\r
340                                                   boolean isSelected,\r
341                                                   int row,\r
342                                                   int column) {\r
343          currentColor = (Color)value;\r
344          return button;\r
345      }\r
346 }\r