3 import jalview.datamodel.*;
\r
4 import javax.swing.*;
\r
5 import javax.swing.event.*;
\r
8 import javax.swing.BorderFactory;
\r
9 import java.awt.event.*;
\r
10 import javax.swing.table.*;
\r
12 public class FeatureSettings extends JPanel
\r
15 final FeatureRenderer fr;
\r
16 final AlignmentPanel ap;
\r
17 Object [][] originalData;
\r
19 public FeatureSettings(AlignViewport av, final AlignmentPanel 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
29 allFeatures = new Vector();
\r
33 for(int i=0; i< av.alignment.getHeight(); i++)
\r
35 features = av.alignment.getSequenceAt(i).getSequenceFeatures();
\r
39 e = features.elements();
\r
40 while(e.hasMoreElements())
\r
42 sf = (SequenceFeature)e.nextElement();
\r
43 if(!allFeatures.contains(sf.getType()))
\r
45 allFeatures.addElement(sf.getType());
\r
49 if(allFeatures.size()<1)
\r
52 frame.setClosed(true);
\r
53 }catch(Exception ex){}
\r
57 int fSize = allFeatures.size();
\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
64 type = allFeatures.elementAt(i).toString();
\r
65 Color col = fr.getColour(type);
\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
74 final JSlider transparency = new JSlider(0,70,0);
\r
75 transparency.addChangeListener(new ChangeListener()
\r
77 public void stateChanged(ChangeEvent evt)
\r
79 fr.setTransparency( (float)(100-transparency.getValue())/100f);
\r
84 JPanel transPanel = new JPanel(new FlowLayout());
\r
85 transPanel.add(new JLabel("Transparency"));
\r
86 transPanel.add(transparency);
\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
99 table.setDefaultEditor(Color.class,
\r
100 new ColorEditor());
\r
102 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
\r
104 table.addMouseListener(new MouseAdapter()
\r
106 public void mousePressed(MouseEvent evt)
\r
108 selectedRow = table.rowAtPoint(evt.getPoint());
\r
112 table.addMouseMotionListener(new MouseMotionAdapter()
\r
114 public void mouseDragged(MouseEvent evt)
\r
116 int newRow = table.rowAtPoint(evt.getPoint());
\r
117 if(newRow!=selectedRow
\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
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
130 table.setValueAt(temp[0], newRow, 0);
\r
131 table.setValueAt(temp[1], newRow, 1);
\r
132 table.setValueAt(temp[2], newRow, 2);
\r
134 selectedRow = newRow;
\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
145 public void actionPerformed(ActionEvent evt)
\r
148 frame.setClosed(true);
\r
150 catch (Exception exe)
\r
154 buttonPanel.add(button);
\r
155 button = new JButton("Cancel");
\r
156 button.addActionListener(new ActionListener()
\r
158 public void actionPerformed(ActionEvent evt)
\r
161 updateFeatureRenderer(originalData);
\r
162 frame.setClosed(true);
\r
163 }catch(Exception exe){}
\r
166 buttonPanel.add(button);
\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
174 add(bigPanel, BorderLayout.CENTER);
\r
175 add(buttonPanel, BorderLayout.SOUTH);
\r
179 public void updateFeatureRenderer(Object [][] data)
\r
181 fr.setFeaturePriority( data );
\r
185 int selectedRow =-1;
\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
194 FeatureTableModel(Object[][] data)
\r
199 private String[] columnNames = {"Feature Type", "Colour","Display"};
\r
200 private Object[][] data;
\r
202 public Object[][] getData()
\r
207 public int getColumnCount() {
\r
208 return columnNames.length;
\r
211 public Object[] getRow(int row)
\r
216 public int getRowCount() {
\r
217 return data.length;
\r
220 public String getColumnName(int col) {
\r
221 return columnNames[col];
\r
224 public Object getValueAt(int row, int col) {
\r
225 return data[row][col];
\r
228 public Class getColumnClass(int c) {
\r
229 return getValueAt(0, c).getClass();
\r
232 public boolean isCellEditable(int row, int col) {
\r
233 return col==0 ? false:true;
\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
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
248 public ColorRenderer() {
\r
249 setOpaque(true); //MUST do this for background to show up.
\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
259 if (selectedBorder == null) {
\r
260 selectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
\r
261 table.getSelectionBackground());
\r
263 setBorder(selectedBorder);
\r
265 if (unselectedBorder == null) {
\r
266 unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
\r
267 table.getBackground());
\r
269 setBorder(unselectedBorder);
\r
272 setToolTipText("RGB value: " + newColor.getRed() + ", "
\r
273 + newColor.getGreen() + ", "
\r
274 + newColor.getBlue());
\r
280 class ColorEditor extends AbstractCellEditor
\r
281 implements TableCellEditor,
\r
283 Color currentColor;
\r
285 JColorChooser colorChooser;
\r
287 protected static final String EDIT = "edit";
\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
304 this, //OK button handler
\r
305 null); //no CANCEL button handler
\r
309 * Handles events from the editor button and from
\r
310 * the dialog's OK button.
\r
312 public void actionPerformed(ActionEvent e) {
\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
321 //Make the renderer reappear.
\r
322 fireEditingStopped();
\r
324 } else { //User pressed dialog's "OK" button.
\r
325 currentColor = colorChooser.getColor();
\r
329 //Implement the one CellEditor method that AbstractCellEditor doesn't.
\r
330 public Object getCellEditorValue() {
\r
331 return currentColor;
\r
334 //Implement the one method defined by TableCellEditor.
\r
335 public Component getTableCellEditorComponent(JTable table,
\r
337 boolean isSelected,
\r
340 currentColor = (Color)value;
\r