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
13 public class FeatureSettings extends JPanel
\r
16 final FeatureRenderer fr;
\r
17 final AlignmentPanel ap;
\r
18 Object [][] originalData;
\r
20 public FeatureSettings(AlignViewport av, final AlignmentPanel 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
30 Vector allFeatures = new Vector();
\r
36 for(int i=0; i< av.alignment.getHeight(); i++)
\r
38 features = av.alignment.getSequenceAt(i).getSequenceFeatures();
\r
42 e = features.elements();
\r
43 while(e.hasMoreElements())
\r
45 sf = (SequenceFeature)e.nextElement();
\r
46 if(!allFeatures.contains(sf.getType()))
\r
48 allFeatures.addElement(sf.getType());
\r
52 if(allFeatures.size()<1)
\r
55 frame.setClosed(true);
\r
56 }catch(Exception ex){}
\r
60 int fSize = allFeatures.size();
\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
67 type = allFeatures.elementAt(i).toString();
\r
68 Color col = fr.getColour(type);
\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
77 final JSlider transparency = new JSlider(0,70,0);
\r
78 transparency.addChangeListener(new ChangeListener()
\r
80 public void stateChanged(ChangeEvent evt)
\r
82 fr.setTransparency( (float)(100-transparency.getValue())/100f);
\r
87 JPanel transPanel = new JPanel(new FlowLayout());
\r
88 transPanel.add(new JLabel("Transparency"));
\r
89 transPanel.add(transparency);
\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
102 table.setDefaultEditor(Color.class,
\r
103 new ColorEditor());
\r
105 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
\r
107 table.addMouseListener(new MouseAdapter()
\r
109 public void mousePressed(MouseEvent evt)
\r
111 selectedRow = table.rowAtPoint(evt.getPoint());
\r
115 table.addMouseMotionListener(new MouseMotionAdapter()
\r
117 public void mouseDragged(MouseEvent evt)
\r
119 int newRow = table.rowAtPoint(evt.getPoint());
\r
120 if(newRow!=selectedRow
\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
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
133 table.setValueAt(temp[0], newRow, 0);
\r
134 table.setValueAt(temp[1], newRow, 1);
\r
135 table.setValueAt(temp[2], newRow, 2);
\r
137 selectedRow = newRow;
\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
148 public void actionPerformed(ActionEvent evt)
\r
151 frame.setClosed(true);
\r
153 catch (Exception exe)
\r
157 buttonPanel.add(button);
\r
158 button = new JButton("Cancel");
\r
159 button.addActionListener(new ActionListener()
\r
161 public void actionPerformed(ActionEvent evt)
\r
164 updateFeatureRenderer(originalData);
\r
165 frame.setClosed(true);
\r
166 }catch(Exception exe){}
\r
169 buttonPanel.add(button);
\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
177 add(bigPanel, BorderLayout.CENTER);
\r
178 add(buttonPanel, BorderLayout.SOUTH);
\r
182 public void updateFeatureRenderer(Object [][] data)
\r
184 fr.setFeaturePriority( data );
\r
188 int selectedRow =-1;
\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
197 FeatureTableModel(Object[][] data)
\r
202 private String[] columnNames = {"Feature Type", "Colour","Display"};
\r
203 private Object[][] data;
\r
205 public Object[][] getData()
\r
210 public int getColumnCount() {
\r
211 return columnNames.length;
\r
214 public Object[] getRow(int row)
\r
219 public int getRowCount() {
\r
220 return data.length;
\r
223 public String getColumnName(int col) {
\r
224 return columnNames[col];
\r
227 public Object getValueAt(int row, int col) {
\r
228 return data[row][col];
\r
231 public Class getColumnClass(int c) {
\r
232 return getValueAt(0, c).getClass();
\r
235 public boolean isCellEditable(int row, int col) {
\r
236 return col==0 ? false:true;
\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
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
251 public ColorRenderer() {
\r
252 setOpaque(true); //MUST do this for background to show up.
\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
262 if (selectedBorder == null) {
\r
263 selectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
\r
264 table.getSelectionBackground());
\r
266 setBorder(selectedBorder);
\r
268 if (unselectedBorder == null) {
\r
269 unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
\r
270 table.getBackground());
\r
272 setBorder(unselectedBorder);
\r
275 setToolTipText("RGB value: " + newColor.getRed() + ", "
\r
276 + newColor.getGreen() + ", "
\r
277 + newColor.getBlue());
\r
283 class ColorEditor extends AbstractCellEditor
\r
284 implements TableCellEditor,
\r
286 Color currentColor;
\r
288 JColorChooser colorChooser;
\r
290 protected static final String EDIT = "edit";
\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
307 this, //OK button handler
\r
308 null); //no CANCEL button handler
\r
312 * Handles events from the editor button and from
\r
313 * the dialog's OK button.
\r
315 public void actionPerformed(ActionEvent e) {
\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
324 //Make the renderer reappear.
\r
325 fireEditingStopped();
\r
327 } else { //User pressed dialog's "OK" button.
\r
328 currentColor = colorChooser.getColor();
\r
332 //Implement the one CellEditor method that AbstractCellEditor doesn't.
\r
333 public Object getCellEditorValue() {
\r
334 return currentColor;
\r
337 //Implement the one method defined by TableCellEditor.
\r
338 public Component getTableCellEditorComponent(JTable table,
\r
340 boolean isSelected,
\r
343 currentColor = (Color)value;
\r