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 import jalview.io.JalviewFileChooser;
\r
14 public class FeatureSettings extends JPanel
\r
17 final FeatureRenderer fr;
\r
18 final AlignmentPanel ap;
\r
19 final AlignViewport av;
\r
20 Object [][] originalData;
\r
21 final JInternalFrame frame;
\r
22 JScrollPane scrollPane = new JScrollPane();
\r
25 public FeatureSettings(AlignViewport av, final AlignmentPanel ap)
\r
29 fr = ap.seqPanel.seqCanvas.getFeatureRenderer();
\r
30 av.alignment.getSequences();
\r
31 frame = new JInternalFrame();
\r
32 frame.setContentPane(this);
\r
33 Desktop.addInternalFrame(frame, "Sequence Feature Settings", 400, 300);
\r
37 final JSlider transparency = new JSlider(0, 70, 0);
\r
38 transparency.addChangeListener(new ChangeListener()
\r
40 public void stateChanged(ChangeEvent evt)
\r
42 fr.setTransparency( (float) (100 - transparency.getValue()) / 100f);
\r
47 JPanel transPanel = new JPanel(new FlowLayout());
\r
48 transPanel.add(new JLabel("Transparency"));
\r
49 transPanel.add(transparency);
\r
51 //////////////////////////////////////////////
\r
52 //We're going to need those OK cancel buttons
\r
53 JPanel buttonPanel = new JPanel(new FlowLayout());
\r
54 JButton button = new JButton("OK");
\r
55 button.addActionListener(new ActionListener()
\r
57 public void actionPerformed(ActionEvent evt)
\r
61 frame.setClosed(true);
\r
63 catch (Exception exe)
\r
67 buttonPanel.add(button);
\r
68 button = new JButton("Cancel");
\r
69 button.addActionListener(new ActionListener()
\r
71 public void actionPerformed(ActionEvent evt)
\r
75 updateFeatureRenderer(originalData);
\r
76 frame.setClosed(true);
\r
78 catch (Exception exe)
\r
82 buttonPanel.add(button);
\r
84 button = new JButton("Load Colours");
\r
85 button.addActionListener(new ActionListener()
\r
87 public void actionPerformed(ActionEvent evt)
\r
92 buttonPanel.add(button);
\r
93 button = new JButton("Save Colours");
\r
94 button.addActionListener(new ActionListener()
\r
96 public void actionPerformed(ActionEvent evt)
\r
101 buttonPanel.add(button);
\r
103 this.setLayout(new BorderLayout());
\r
104 JPanel bigPanel = new JPanel(new BorderLayout());
\r
105 bigPanel.add(transPanel, BorderLayout.SOUTH);
\r
106 bigPanel.add(scrollPane, BorderLayout.CENTER);
\r
108 add(bigPanel, BorderLayout.CENTER);
\r
109 add(buttonPanel, BorderLayout.SOUTH);
\r
114 void setTableData()
\r
116 Vector allFeatures = new Vector();
\r
119 SequenceFeature sf;
\r
121 for(int i=0; i< av.alignment.getHeight(); i++)
\r
123 features = av.alignment.getSequenceAt(i).getDatasetSequence().getSequenceFeatures();
\r
127 e = features.elements();
\r
128 while(e.hasMoreElements())
\r
130 sf = (SequenceFeature)e.nextElement();
\r
131 if(!allFeatures.contains(sf.getType()))
\r
133 allFeatures.addElement(sf.getType());
\r
137 if(allFeatures.size()<1)
\r
140 frame.setClosed(true);
\r
141 }catch(Exception ex){}
\r
145 int fSize = allFeatures.size();
\r
148 Object [][] data = new Object[fSize][3];
\r
149 originalData = new Object[fSize][3];
\r
150 for(int i=0; i<fSize; i++)
\r
152 type = allFeatures.elementAt(i).toString();
\r
153 Color col = fr.getColour(type);
\r
156 if(fr.featuresDisplayed!=null)
\r
157 data[i][2] = new Boolean(fr.featuresDisplayed.contains(type));
\r
159 data[i][2] = new Boolean(true);
\r
161 originalData[i][0]=type;
\r
162 originalData[i][1]=col;
\r
163 if(fr.featuresDisplayed!=null)
\r
164 originalData[i][2] = new Boolean(fr.featuresDisplayed.contains(type));
\r
166 originalData[i][2] = new Boolean(true);
\r
168 ////////////////////////////////////
\r
169 //Now build the table
\r
170 table = new JTable(new FeatureTableModel(data));
\r
171 scrollPane.setViewportView(table);
\r
172 table.getTableHeader().setFont(new Font("Verdana", Font.PLAIN, 12));
\r
173 table.setFont(new Font("Verdana", Font.PLAIN, 12));
\r
174 table.setDefaultRenderer(Color.class,
\r
175 new ColorRenderer());
\r
177 table.setDefaultEditor(Color.class,
\r
178 new ColorEditor());
\r
180 table.getColumnModel().getColumn(0).setPreferredWidth(200);
\r
182 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
\r
184 table.addMouseListener(new MouseAdapter()
\r
186 public void mousePressed(MouseEvent evt)
\r
188 selectedRow = table.rowAtPoint(evt.getPoint());
\r
192 table.addMouseMotionListener(new MouseMotionAdapter()
\r
194 public void mouseDragged(MouseEvent evt)
\r
196 int newRow = table.rowAtPoint(evt.getPoint());
\r
197 if(newRow!=selectedRow
\r
201 Object[] temp = new Object[3];
\r
202 temp[0] = table.getValueAt(selectedRow, 0);
\r
203 temp[1] = table.getValueAt(selectedRow, 1);
\r
204 temp[2] = table.getValueAt(selectedRow, 2);
\r
206 table.setValueAt(table.getValueAt(newRow, 0), selectedRow, 0);
\r
207 table.setValueAt(table.getValueAt(newRow, 1), selectedRow, 1);
\r
208 table.setValueAt(table.getValueAt(newRow, 2), selectedRow, 2);
\r
210 table.setValueAt(temp[0], newRow, 0);
\r
211 table.setValueAt(temp[1], newRow, 1);
\r
212 table.setValueAt(temp[2], newRow, 2);
\r
214 selectedRow = newRow;
\r
223 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(
\r
224 "LAST_DIRECTORY"), new String[] { "fc" },
\r
225 new String[] { "Sequence Feature Colours" }, "Sequence Feature Colours");
\r
226 chooser.setFileView(new jalview.io.JalviewFileView());
\r
227 chooser.setDialogTitle("Load Feature Colours");
\r
228 chooser.setToolTipText("Load");
\r
230 int value = chooser.showOpenDialog(this);
\r
232 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
234 File file = chooser.getSelectedFile();
\r
238 InputStreamReader in = new InputStreamReader(new FileInputStream(
\r
241 jalview.binding.JalviewUserColours jucs = new jalview.binding.
\r
242 JalviewUserColours();
\r
243 jucs = (jalview.binding.JalviewUserColours) jucs.unmarshal(in);
\r
246 for (int i = 0; i < jucs.getColourCount(); i++)
\r
248 fr.setColour( jucs.getColour(i).getName(),
\r
249 new Color(Integer.parseInt( jucs.getColour(i).getRGB(), 16)));
\r
255 catch (Exception ex)
\r
257 System.out.println("Error loading User ColourFile\n" + ex);
\r
264 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache.getProperty(
\r
265 "LAST_DIRECTORY"), new String[] { "fc" },
\r
266 new String[] { "Sequence Feature Colours" }, "Sequence Feature Colours");
\r
267 chooser.setFileView(new jalview.io.JalviewFileView());
\r
268 chooser.setDialogTitle("Save Feature Colour Scheme");
\r
269 chooser.setToolTipText("Save");
\r
271 int value = chooser.showSaveDialog(this);
\r
273 if (value == JalviewFileChooser.APPROVE_OPTION)
\r
275 String choice = chooser.getSelectedFile().getPath();
\r
276 jalview.binding.JalviewUserColours ucs = new jalview.binding.JalviewUserColours();
\r
277 ucs.setSchemeName("Sequence Features");
\r
280 PrintWriter out = new PrintWriter(new OutputStreamWriter(
\r
281 new FileOutputStream(choice), "UTF-8"));
\r
283 Enumeration e = fr.featureColours.keys();
\r
284 while(e.hasMoreElements())
\r
288 jalview.binding.Colour col = new jalview.binding.Colour();
\r
289 col.setName(e.nextElement().toString());
\r
290 col.setRGB(jalview.util.Format.getHexString(
\r
291 fr.getColour(col.getName())));
\r
292 ucs.addColour(col);
\r
298 catch (Exception ex)
\r
300 ex.printStackTrace();
\r
306 public void updateFeatureRenderer(Object [][] data)
\r
308 fr.setFeaturePriority( data );
\r
312 int selectedRow =-1;
\r
315 /////////////////////////////////////////////////////////////////////////
\r
316 // http://java.sun.com/docs/books/tutorial/uiswing/components/table.html
\r
317 /////////////////////////////////////////////////////////////////////////
\r
318 class FeatureTableModel
\r
319 extends AbstractTableModel
\r
321 FeatureTableModel(Object[][] data)
\r
326 private String[] columnNames = {"Feature Type", "Colour","Display"};
\r
327 private Object[][] data;
\r
329 public Object[][] getData()
\r
334 public int getColumnCount() {
\r
335 return columnNames.length;
\r
338 public Object[] getRow(int row)
\r
343 public int getRowCount() {
\r
344 return data.length;
\r
347 public String getColumnName(int col) {
\r
348 return columnNames[col];
\r
351 public Object getValueAt(int row, int col) {
\r
352 return data[row][col];
\r
355 public Class getColumnClass(int c) {
\r
356 return getValueAt(0, c).getClass();
\r
359 public boolean isCellEditable(int row, int col) {
\r
360 return col==0 ? false:true;
\r
363 public void setValueAt(Object value, int row, int col) {
\r
364 data[row][col] = value;
\r
365 fireTableCellUpdated(row, col);
\r
366 updateFeatureRenderer(data);
\r
370 class ColorRenderer extends JLabel
\r
371 implements TableCellRenderer {
\r
372 javax.swing.border.Border unselectedBorder = null;
\r
373 javax.swing.border.Border selectedBorder = null;
\r
375 public ColorRenderer() {
\r
376 setOpaque(true); //MUST do this for background to show up.
\r
379 public Component getTableCellRendererComponent(
\r
380 JTable table, Object color,
\r
381 boolean isSelected, boolean hasFocus,
\r
382 int row, int column) {
\r
383 Color newColor = (Color)color;
\r
384 setBackground(newColor);
\r
386 if (selectedBorder == null) {
\r
387 selectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
\r
388 table.getSelectionBackground());
\r
390 setBorder(selectedBorder);
\r
392 if (unselectedBorder == null) {
\r
393 unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
\r
394 table.getBackground());
\r
396 setBorder(unselectedBorder);
\r
399 setToolTipText("RGB value: " + newColor.getRed() + ", "
\r
400 + newColor.getGreen() + ", "
\r
401 + newColor.getBlue());
\r
407 class ColorEditor extends AbstractCellEditor
\r
408 implements TableCellEditor,
\r
410 Color currentColor;
\r
412 JColorChooser colorChooser;
\r
414 protected static final String EDIT = "edit";
\r
416 public ColorEditor() {
\r
417 //Set up the editor (from the table's point of view),
\r
418 //which is a button.
\r
419 //This button brings up the color chooser dialog,
\r
420 //which is the editor from the user's point of view.
\r
421 button = new JButton();
\r
422 button.setActionCommand(EDIT);
\r
423 button.addActionListener(this);
\r
424 button.setBorderPainted(false);
\r
425 //Set up the dialog that the button brings up.
\r
426 colorChooser = new JColorChooser();
\r
427 dialog = JColorChooser.createDialog(button,
\r
428 "Select new Colour",
\r
431 this, //OK button handler
\r
432 null); //no CANCEL button handler
\r
436 * Handles events from the editor button and from
\r
437 * the dialog's OK button.
\r
439 public void actionPerformed(ActionEvent e) {
\r
441 if (EDIT.equals(e.getActionCommand())) {
\r
442 //The user has clicked the cell, so
\r
443 //bring up the dialog.
\r
444 button.setBackground(currentColor);
\r
445 colorChooser.setColor(currentColor);
\r
446 dialog.setVisible(true);
\r
448 //Make the renderer reappear.
\r
449 fireEditingStopped();
\r
451 } else { //User pressed dialog's "OK" button.
\r
452 currentColor = colorChooser.getColor();
\r
456 //Implement the one CellEditor method that AbstractCellEditor doesn't.
\r
457 public Object getCellEditorValue() {
\r
458 return currentColor;
\r
461 //Implement the one method defined by TableCellEditor.
\r
462 public Component getTableCellEditorComponent(JTable table,
\r
464 boolean isSelected,
\r
467 currentColor = (Color)value;
\r