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