2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
3 * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25 import java.awt.event.*;
26 import java.beans.PropertyChangeEvent;
27 import java.beans.PropertyChangeListener;
30 import javax.swing.event.*;
31 import javax.swing.table.*;
33 import jalview.analysis.AlignmentSorter;
34 import jalview.commands.OrderCommand;
35 import jalview.datamodel.*;
38 public class FeatureSettings extends JPanel
40 DasSourceBrowser dassourceBrowser;
42 jalview.ws.DasSequenceFeatureFetcher dasFeatureFetcher;
44 JPanel settingsPane = new JPanel();
46 JPanel dasSettingsPane = new JPanel();
48 final FeatureRenderer fr;
50 public final AlignFrame af;
52 Object[][] originalData;
54 final JInternalFrame frame;
56 JScrollPane scrollPane = new JScrollPane();
62 JSlider transparency = new JSlider();
64 JPanel transPanel = new JPanel(new FlowLayout());
66 public FeatureSettings(AlignFrame af)
69 fr = af.getFeatureRenderer();
71 transparency.setMaximum(100 - (int) (fr.transparency * 100));
76 } catch (Exception ex)
82 table.getTableHeader().setFont(new Font("Verdana", Font.PLAIN, 12));
83 table.setFont(new Font("Verdana", Font.PLAIN, 12));
84 table.setDefaultRenderer(Color.class, new ColorRenderer());
86 table.setDefaultEditor(Color.class, new ColorEditor());
88 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
90 table.addMouseListener(new MouseAdapter()
92 public void mousePressed(MouseEvent evt)
94 selectedRow = table.rowAtPoint(evt.getPoint());
95 if (javax.swing.SwingUtilities.isRightMouseButton(evt))
97 popupSort((String)table.getValueAt(selectedRow, 0), evt.getX(), evt.getY());
102 table.addMouseMotionListener(new MouseMotionAdapter()
104 public void mouseDragged(MouseEvent evt)
106 int newRow = table.rowAtPoint(evt.getPoint());
107 if (newRow != selectedRow && selectedRow != -1 && newRow != -1)
109 Object[] temp = new Object[3];
110 temp[0] = table.getValueAt(selectedRow, 0);
111 temp[1] = table.getValueAt(selectedRow, 1);
112 temp[2] = table.getValueAt(selectedRow, 2);
114 table.setValueAt(table.getValueAt(newRow, 0), selectedRow, 0);
115 table.setValueAt(table.getValueAt(newRow, 1), selectedRow, 1);
116 table.setValueAt(table.getValueAt(newRow, 2), selectedRow, 2);
118 table.setValueAt(temp[0], newRow, 0);
119 table.setValueAt(temp[1], newRow, 1);
120 table.setValueAt(temp[2], newRow, 2);
122 selectedRow = newRow;
127 scrollPane.setViewportView(table);
129 dassourceBrowser = new DasSourceBrowser();
130 dasSettingsPane.add(dassourceBrowser, BorderLayout.CENTER);
132 if (af.getViewport().featuresDisplayed == null
133 || fr.renderOrder == null)
135 fr.findAllFeatures(true); // display everything!
139 final PropertyChangeListener change;
140 final FeatureSettings fs = this;
141 fr.addPropertyChangeListener(change = new PropertyChangeListener()
143 public void propertyChange(PropertyChangeEvent evt)
145 if (!fs.resettingTable && !fs.handlingUpdate)
147 fs.handlingUpdate = true;
148 fs.resetTable(null); // new groups may be added with new seuqence
149 // feature types only
150 fs.handlingUpdate = false;
156 frame = new JInternalFrame();
157 frame.setContentPane(this);
158 Desktop.addInternalFrame(frame, "Sequence Feature Settings", 400, 450);
160 .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
162 public void internalFrameClosed(
163 javax.swing.event.InternalFrameEvent evt)
165 fr.removePropertyChangeListener(change);
168 frame.setLayer(JLayeredPane.PALETTE_LAYER);
171 protected void popupSort(final String type, int x, int y)
173 JPopupMenu men = new JPopupMenu();
174 men.setName("Sort by "+type);
175 JMenuItem scr = new JMenuItem("Score");
177 final FeatureSettings me=this;
178 scr.addActionListener(new ActionListener() {
180 public void actionPerformed(ActionEvent e)
182 me.sortByScore(new String[] {type});
186 JMenuItem dens = new JMenuItem("Density");
187 dens.addActionListener(new ActionListener() {
189 public void actionPerformed(ActionEvent e)
191 me.sortByDens(new String[] { type });
196 men.show(table, x, y);
200 * true when Feature Settings are updating from feature renderer
202 private boolean handlingUpdate = false;
205 * contains a float[3] for each feature type string. created by setTableData
207 Hashtable typeWidth = null;
209 synchronized public void setTableData()
211 if (fr.featureGroups == null)
213 fr.featureGroups = new Hashtable();
215 Vector allFeatures = new Vector();
216 Vector allGroups = new Vector();
217 SequenceFeature[] tmpfeatures;
219 for (int i = 0; i < af.getViewport().alignment.getHeight(); i++)
221 if (af.getViewport().alignment.getSequenceAt(i).getDatasetSequence()
222 .getSequenceFeatures() == null)
227 tmpfeatures = af.getViewport().alignment.getSequenceAt(i)
228 .getDatasetSequence().getSequenceFeatures();
231 while (index < tmpfeatures.length)
233 if (tmpfeatures[index].begin == 0 && tmpfeatures[index].end == 0)
239 if (tmpfeatures[index].getFeatureGroup() != null)
241 group = tmpfeatures[index].featureGroup;
242 if (!allGroups.contains(group))
244 allGroups.addElement(group);
247 checkGroupState(group);
252 if (!allFeatures.contains(tmpfeatures[index].getType()))
254 allFeatures.addElement(tmpfeatures[index].getType());
268 * @return true if group has been seen before and is already added to set.
270 private boolean checkGroupState(String group)
273 if (fr.featureGroups.containsKey(group))
275 visible = ((Boolean) fr.featureGroups.get(group)).booleanValue();
279 visible = true; // new group is always made visible
282 if (groupPanel == null)
284 groupPanel = new JPanel();
287 boolean alreadyAdded = false;
288 for (int g = 0; g < groupPanel.getComponentCount(); g++)
290 if (((JCheckBox) groupPanel.getComponent(g)).getText().equals(group))
293 ((JCheckBox) groupPanel.getComponent(g)).setSelected(visible);
304 fr.featureGroups.put(group, new Boolean(visible));
305 final String grp = group;
306 final JCheckBox check = new JCheckBox(group, visible);
307 check.setFont(new Font("Serif", Font.BOLD, 12));
308 check.addItemListener(new ItemListener()
310 public void itemStateChanged(ItemEvent evt)
312 fr.featureGroups.put(check.getText(), new Boolean(check
314 af.alignPanel.seqPanel.seqCanvas.repaint();
315 if (af.alignPanel.overviewPanel != null)
317 af.alignPanel.overviewPanel.updateOverviewImage();
320 resetTable(new String[]
324 groupPanel.add(check);
328 boolean resettingTable = false;
330 synchronized void resetTable(String[] groupChanged)
332 if (resettingTable == true)
336 resettingTable = true;
337 typeWidth = new Hashtable();
338 // TODO: change avWidth calculation to 'per-sequence' average and use long
340 float[] avWidth = null;
341 SequenceFeature[] tmpfeatures;
342 String group = null, type;
343 Vector visibleChecks = new Vector();
345 // Find out which features should be visible depending on which groups
346 // are selected / deselected
347 // and recompute average width ordering
348 for (int i = 0; i < af.getViewport().alignment.getHeight(); i++)
351 tmpfeatures = af.getViewport().alignment.getSequenceAt(i)
352 .getDatasetSequence().getSequenceFeatures();
353 if (tmpfeatures == null)
359 while (index < tmpfeatures.length)
361 group = tmpfeatures[index].featureGroup;
363 if (tmpfeatures[index].begin == 0 && tmpfeatures[index].end == 0)
369 if (group == null || fr.featureGroups.get(group) == null
370 || ((Boolean) fr.featureGroups.get(group)).booleanValue())
373 checkGroupState(group);
374 type = tmpfeatures[index].getType();
375 if (!visibleChecks.contains(type))
377 visibleChecks.addElement(type);
380 if (!typeWidth.containsKey(tmpfeatures[index].getType()))
382 typeWidth.put(tmpfeatures[index].getType(),
383 avWidth = new float[3]);
387 avWidth = (float[]) typeWidth.get(tmpfeatures[index].getType());
390 if (tmpfeatures[index].getBegin() > tmpfeatures[index].getEnd())
392 avWidth[1] += 1 + tmpfeatures[index].getBegin()
393 - tmpfeatures[index].getEnd();
397 avWidth[1] += 1 + tmpfeatures[index].getEnd()
398 - tmpfeatures[index].getBegin();
404 int fSize = visibleChecks.size();
405 Object[][] data = new Object[fSize][3];
408 if (fr.renderOrder != null)
411 fr.findAllFeatures(groupChanged != null); // prod to update
412 // colourschemes. but don't
414 // First add the checks in the previous render order,
415 // in case the window has been closed and reopened
416 for (int ro = fr.renderOrder.length - 1; ro > -1; ro--)
418 type = fr.renderOrder[ro];
420 if (!visibleChecks.contains(type))
425 data[dataIndex][0] = type;
426 data[dataIndex][1] = fr.getColour(type);
427 data[dataIndex][2] = new Boolean(af.getViewport().featuresDisplayed
430 visibleChecks.removeElement(type);
434 fSize = visibleChecks.size();
435 for (int i = 0; i < fSize; i++)
437 // These must be extra features belonging to the group
438 // which was just selected
439 type = visibleChecks.elementAt(i).toString();
440 data[dataIndex][0] = type;
442 data[dataIndex][1] = fr.getColour(type);
443 if (data[dataIndex][1] == null)
445 // "Colour has been updated in another view!!"
446 fr.renderOrder = null;
450 data[dataIndex][2] = new Boolean(true);
454 if (originalData == null)
456 originalData = new Object[data.length][3];
457 System.arraycopy(data, 0, originalData, 0, data.length);
460 table.setModel(new FeatureTableModel(data));
461 table.getColumnModel().getColumn(0).setPreferredWidth(200);
463 if (groupPanel != null)
465 groupPanel.setLayout(new GridLayout(fr.featureGroups.size() / 4 + 1,
468 groupPanel.validate();
469 bigPanel.add(groupPanel, BorderLayout.NORTH);
472 updateFeatureRenderer(data, groupChanged != null);
473 resettingTable = false;
477 * reorder data based on the featureRenderers global priority list.
481 private void ensureOrder(Object[][] data)
483 boolean sort = false;
484 float[] order = new float[data.length];
485 for (int i = 0; i < order.length; i++)
487 order[i] = fr.getOrder(data[i][0].toString());
489 order[i] = fr.setOrder(data[i][0].toString(), i / order.length);
491 sort = sort || order[i - 1] > order[i];
494 jalview.util.QuickSort.sort(order, data);
499 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache
500 .getProperty("LAST_DIRECTORY"), new String[]
501 { "fc" }, new String[]
502 { "Sequence Feature Colours" }, "Sequence Feature Colours");
503 chooser.setFileView(new jalview.io.JalviewFileView());
504 chooser.setDialogTitle("Load Feature Colours");
505 chooser.setToolTipText("Load");
507 int value = chooser.showOpenDialog(this);
509 if (value == JalviewFileChooser.APPROVE_OPTION)
511 File file = chooser.getSelectedFile();
515 InputStreamReader in = new InputStreamReader(new FileInputStream(
518 jalview.binding.JalviewUserColours jucs = new jalview.binding.JalviewUserColours();
519 jucs = (jalview.binding.JalviewUserColours) jucs.unmarshal(in);
521 for (int i = jucs.getColourCount() - 1; i >= 0; i--)
524 fr.setColour(name = jucs.getColour(i).getName(), new Color(
525 Integer.parseInt(jucs.getColour(i).getRGB(), 16)));
526 fr.setOrder(name, (i == 0) ? 0 : i / jucs.getColourCount());
531 Object[][] data = ((FeatureTableModel) table.getModel())
534 updateFeatureRenderer(data, false);
537 } catch (Exception ex)
539 System.out.println("Error loading User Colour File\n" + ex);
546 JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache
547 .getProperty("LAST_DIRECTORY"), new String[]
548 { "fc" }, new String[]
549 { "Sequence Feature Colours" }, "Sequence Feature Colours");
550 chooser.setFileView(new jalview.io.JalviewFileView());
551 chooser.setDialogTitle("Save Feature Colour Scheme");
552 chooser.setToolTipText("Save");
554 int value = chooser.showSaveDialog(this);
556 if (value == JalviewFileChooser.APPROVE_OPTION)
558 String choice = chooser.getSelectedFile().getPath();
559 jalview.binding.JalviewUserColours ucs = new jalview.binding.JalviewUserColours();
560 ucs.setSchemeName("Sequence Features");
563 PrintWriter out = new PrintWriter(new OutputStreamWriter(
564 new FileOutputStream(choice), "UTF-8"));
566 Enumeration e = fr.featureColours.keys();
567 float[] sortOrder = new float[fr.featureColours.size()];
568 String[] sortTypes = new String[fr.featureColours.size()];
570 while (e.hasMoreElements())
572 sortTypes[i] = e.nextElement().toString();
573 sortOrder[i] = fr.getOrder(sortTypes[i]);
576 jalview.util.QuickSort.sort(sortOrder, sortTypes);
578 for (i = 0; i < sortTypes.length; i++)
580 jalview.binding.Colour col = new jalview.binding.Colour();
581 col.setName(sortTypes[i]);
582 col.setRGB(jalview.util.Format.getHexString(fr.getColour(col
588 } catch (Exception ex)
590 ex.printStackTrace();
595 public void invertSelection()
597 for (int i = 0; i < table.getRowCount(); i++)
599 Boolean value = (Boolean) table.getValueAt(i, 2);
601 table.setValueAt(new Boolean(!value.booleanValue()), i, 2);
605 public void orderByAvWidth()
607 if (table == null || table.getModel() == null)
609 Object[][] data = ((FeatureTableModel) table.getModel()).getData();
610 float[] width = new float[data.length];
614 for (int i = 0; i < data.length; i++)
616 awidth = (float[]) typeWidth.get(data[i][0]);
619 width[i] = awidth[1] / awidth[0];// *awidth[0]*awidth[2]; - better
620 // weight - but have to make per
621 // sequence, too (awidth[2])
622 // if (width[i]==1) // hack to distinguish single width sequences.
632 boolean sort = false;
633 for (int i = 0; i < width.length; i++)
635 // awidth = (float[]) typeWidth.get(data[i][0]);
638 width[i] = fr.getOrder(data[i][0].toString());
641 width[i] = fr.setOrder(data[i][0].toString(), i / data.length);
646 width[i] /= max; // normalize
647 fr.setOrder(data[i][0].toString(), width[i]); // store for later
650 sort = sort || width[i - 1] > width[i];
653 jalview.util.QuickSort.sort(width, data);
654 // update global priority order
656 updateFeatureRenderer(data, false);
664 frame.setClosed(true);
665 } catch (Exception exe)
671 public void updateFeatureRenderer(Object[][] data)
673 updateFeatureRenderer(data, true);
676 private void updateFeatureRenderer(Object[][] data, boolean visibleNew)
678 fr.setFeaturePriority(data, visibleNew);
679 af.alignPanel.paintAlignment(true);
682 int selectedRow = -1;
684 JTabbedPane tabbedPane = new JTabbedPane();
686 BorderLayout borderLayout1 = new BorderLayout();
688 BorderLayout borderLayout2 = new BorderLayout();
690 BorderLayout borderLayout3 = new BorderLayout();
692 JPanel bigPanel = new JPanel();
694 BorderLayout borderLayout4 = new BorderLayout();
696 JButton invert = new JButton();
698 JPanel buttonPanel = new JPanel();
700 JButton cancel = new JButton();
702 JButton ok = new JButton();
704 JButton loadColours = new JButton();
706 JButton saveColours = new JButton();
708 JPanel dasButtonPanel = new JPanel();
710 JButton fetchDAS = new JButton();
712 JButton saveDAS = new JButton();
714 JButton cancelDAS = new JButton();
716 JButton optimizeOrder = new JButton();
717 JButton sortByScore = new JButton();
718 JButton sortByDens = new JButton();
720 JPanel transbuttons = new JPanel(new BorderLayout());
722 private void jbInit() throws Exception
724 this.setLayout(borderLayout1);
725 settingsPane.setLayout(borderLayout2);
726 dasSettingsPane.setLayout(borderLayout3);
727 bigPanel.setLayout(borderLayout4);
728 invert.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));
729 invert.setText("Invert Selection");
730 invert.addActionListener(new ActionListener()
732 public void actionPerformed(ActionEvent e)
737 optimizeOrder.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));
738 optimizeOrder.setText("Optimise Order");
739 optimizeOrder.addActionListener(new ActionListener()
741 public void actionPerformed(ActionEvent e)
746 sortByScore.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));
747 sortByScore.setText("Seq sort by Score");
748 sortByScore.addActionListener(new ActionListener()
750 public void actionPerformed(ActionEvent e)
755 sortByDens.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));
756 sortByDens.setText("Seq Sort by density");
757 sortByDens.addActionListener(new ActionListener()
759 public void actionPerformed(ActionEvent e)
763 }); cancel.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));
764 cancel.setText("Cancel");
765 cancel.addActionListener(new ActionListener()
767 public void actionPerformed(ActionEvent e)
769 updateFeatureRenderer(originalData);
773 ok.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));
775 ok.addActionListener(new ActionListener()
777 public void actionPerformed(ActionEvent e)
782 loadColours.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));
783 loadColours.setText("Load Colours");
784 loadColours.addActionListener(new ActionListener()
786 public void actionPerformed(ActionEvent e)
791 saveColours.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));
792 saveColours.setText("Save Colours");
793 saveColours.addActionListener(new ActionListener()
795 public void actionPerformed(ActionEvent e)
800 transparency.addChangeListener(new ChangeListener()
802 public void stateChanged(ChangeEvent evt)
804 fr.setTransparency((float) (100 - transparency.getValue()) / 100f);
805 af.alignPanel.paintAlignment(true);
809 transparency.setMaximum(70);
810 fetchDAS.setText("Fetch DAS Features");
811 fetchDAS.addActionListener(new ActionListener()
813 public void actionPerformed(ActionEvent e)
815 fetchDAS_actionPerformed(e);
818 saveDAS.setText("Save as default");
819 saveDAS.addActionListener(new ActionListener()
821 public void actionPerformed(ActionEvent e)
823 saveDAS_actionPerformed(e);
826 dasButtonPanel.setBorder(BorderFactory.createEtchedBorder());
827 dasSettingsPane.setBorder(null);
828 cancelDAS.setEnabled(false);
829 cancelDAS.setText("Cancel Fetch");
830 cancelDAS.addActionListener(new ActionListener()
832 public void actionPerformed(ActionEvent e)
834 cancelDAS_actionPerformed(e);
837 this.add(tabbedPane, java.awt.BorderLayout.CENTER);
838 tabbedPane.addTab("Feature Settings", settingsPane);
839 tabbedPane.addTab("DAS Settings", dasSettingsPane);
840 bigPanel.add(transPanel, java.awt.BorderLayout.SOUTH);
841 transPanel.add(transparency);
842 transbuttons.add(invert, java.awt.BorderLayout.NORTH);
843 transbuttons.add(optimizeOrder, java.awt.BorderLayout.SOUTH);
844 transPanel.add(transbuttons);
846 buttonPanel.add(cancel);
847 buttonPanel.add(loadColours);
848 buttonPanel.add(saveColours);
849 buttonPanel.add(sortByScore);
850 buttonPanel.add(sortByDens);
851 bigPanel.add(scrollPane, java.awt.BorderLayout.CENTER);
852 dasSettingsPane.add(dasButtonPanel, java.awt.BorderLayout.SOUTH);
853 dasButtonPanel.add(fetchDAS);
854 dasButtonPanel.add(cancelDAS);
855 dasButtonPanel.add(saveDAS);
856 settingsPane.add(bigPanel, java.awt.BorderLayout.CENTER);
857 settingsPane.add(buttonPanel, java.awt.BorderLayout.SOUTH);
860 protected void sortByDens(String[] typ)
862 sortBy(typ, "Sort by Density", AlignmentSorter.FEATURE_DENSITY);
864 protected void sortBy(String[] typ, String methodText, final String method) {
867 typ = getDisplayedFeatureTypes();
870 gps = getDisplayedFeatureGroups();
873 for (int i=0;i<typ.length; i++)
875 System.err.println("Sorting on Types:"+typ[i]);
881 for (int i=0;i<gps.length; i++)
883 System.err.println("Sorting on groups:"+gps[i]);
886 AlignmentPanel alignPanel = af.alignPanel;
887 AlignmentI al = alignPanel.av.getAlignment();
890 SequenceGroup sg = alignPanel.av.getSelectionGroup();
893 start = sg.getStartRes();
894 stop = sg.getEndRes();
897 stop = al.getWidth();
899 SequenceI[] oldOrder = al.getSequencesArray();
900 AlignmentSorter.sortByFeature(typ, gps, start, stop,
902 af.addHistoryItem(new OrderCommand(methodText, oldOrder,
903 alignPanel.av.getAlignment()));
904 alignPanel.paintAlignment(true);
908 protected void sortByScore(String[] typ)
910 sortBy(typ, "Sort by Feature Score", AlignmentSorter.FEATURE_SCORE);
913 private String[] getDisplayedFeatureTypes()
918 synchronized (fr.renderOrder) {
919 typ = new String[fr.renderOrder.length];
920 System.arraycopy(fr.renderOrder, 0, typ, 0, typ.length);
921 for (int i=0;i<typ.length;i++)
923 if (af.viewport.featuresDisplayed.get(typ[i])==null)
933 private String[] getDisplayedFeatureGroups()
939 if (fr.featureGroups!=null)
941 Enumeration en = fr.featureGroups.keys();
942 gps = new String[fr.featureColours.size()];
945 while (en.hasMoreElements())
947 String gp = (String) en.nextElement();
948 Boolean on = (Boolean )fr.featureGroups.get(gp);
949 if (on!=null && on.booleanValue())
968 public void fetchDAS_actionPerformed(ActionEvent e)
970 fetchDAS.setEnabled(false);
971 cancelDAS.setEnabled(true);
972 Vector selectedSources = dassourceBrowser.getSelectedSources();
973 doDasFeatureFetch(selectedSources, true, true);
977 * get the features from selectedSources for all or the current selection
979 * @param selectedSources
981 * @param promptFetchDbRefs
983 private void doDasFeatureFetch(Vector selectedSources,
984 boolean checkDbRefs, boolean promptFetchDbRefs)
986 SequenceI[] dataset, seqs;
988 AlignViewport vp = af.getViewport();
989 if (vp.getSelectionGroup() != null
990 && vp.getSelectionGroup().getSize() > 0)
992 iSize = vp.getSelectionGroup().getSize();
993 dataset = new SequenceI[iSize];
994 seqs = vp.getSelectionGroup().getSequencesInOrder(vp.getAlignment());
998 iSize = vp.getAlignment().getHeight();
999 seqs = vp.getAlignment().getSequencesArray();
1002 dataset = new SequenceI[iSize];
1003 for (int i = 0; i < iSize; i++)
1005 dataset[i] = seqs[i].getDatasetSequence();
1008 cancelDAS.setEnabled(true);
1009 dasFeatureFetcher = new jalview.ws.DasSequenceFeatureFetcher(dataset,
1010 this, selectedSources, checkDbRefs, promptFetchDbRefs);
1011 af.getViewport().setShowSequenceFeatures(true);
1012 af.showSeqFeatures.setSelected(true);
1016 * blocking call to initialise the das source browser
1018 public void initDasSources()
1020 dassourceBrowser.initDasSources();
1023 * examine the current list of das sources and return any matching the given nicknames in sources
1024 * @param sources Vector of Strings to resolve to DAS source nicknames.
1025 * @return sources that are present in source list.
1027 public Vector resolveSourceNicknames(Vector sources)
1029 return dassourceBrowser.resolveSourceNicknames(sources);
1032 * get currently selected das sources. ensure you have called initDasSources before calling this.
1033 * @return vector of selected das source nicknames
1035 public Vector getSelectedSources()
1037 return dassourceBrowser.getSelectedSources();
1040 * properly initialise DAS fetcher and then initiate a new thread to fetch
1041 * features from the named sources (rather than any turned on by default)
1045 public void fetchDasFeatures(Vector sources)
1048 Vector resolved = resolveSourceNicknames(sources);
1049 if (resolved.size() == 0)
1051 resolved = dassourceBrowser.getSelectedSources();
1053 if (resolved.size() > 0)
1055 final Vector dassources = resolved;
1056 SwingUtilities.invokeLater(new Runnable()
1061 fetchDAS.setEnabled(false);
1062 cancelDAS.setEnabled(true);
1063 doDasFeatureFetch(dassources, true, false);
1070 public void saveDAS_actionPerformed(ActionEvent e)
1073 .saveProperties(jalview.bin.Cache.applicationProperties);
1076 public void complete()
1078 fetchDAS.setEnabled(true);
1079 cancelDAS.setEnabled(false);
1082 public void cancelDAS_actionPerformed(ActionEvent e)
1084 if (dasFeatureFetcher != null)
1086 dasFeatureFetcher.cancel();
1088 fetchDAS.setEnabled(true);
1089 cancelDAS.setEnabled(false);
1092 public void noDasSourceActive()
1095 JOptionPane.showInternalConfirmDialog(Desktop.desktop,
1096 "No das sources were selected.\n"
1097 + "Please select some sources and\n" + " try again.",
1098 "No Sources Selected", JOptionPane.DEFAULT_OPTION,
1099 JOptionPane.INFORMATION_MESSAGE);
1102 // ///////////////////////////////////////////////////////////////////////
1103 // http://java.sun.com/docs/books/tutorial/uiswing/components/table.html
1104 // ///////////////////////////////////////////////////////////////////////
1105 class FeatureTableModel extends AbstractTableModel
1107 FeatureTableModel(Object[][] data)
1112 private String[] columnNames =
1113 { "Feature Type", "Colour", "Display" };
1115 private Object[][] data;
1117 public Object[][] getData()
1122 public void setData(Object[][] data)
1127 public int getColumnCount()
1129 return columnNames.length;
1132 public Object[] getRow(int row)
1137 public int getRowCount()
1142 public String getColumnName(int col)
1144 return columnNames[col];
1147 public Object getValueAt(int row, int col)
1149 return data[row][col];
1152 public Class getColumnClass(int c)
1154 return getValueAt(0, c).getClass();
1157 public boolean isCellEditable(int row, int col)
1159 return col == 0 ? false : true;
1162 public void setValueAt(Object value, int row, int col)
1164 data[row][col] = value;
1165 fireTableCellUpdated(row, col);
1166 updateFeatureRenderer(data);
1171 class ColorRenderer extends JLabel implements TableCellRenderer
1173 javax.swing.border.Border unselectedBorder = null;
1175 javax.swing.border.Border selectedBorder = null;
1177 public ColorRenderer()
1179 setOpaque(true); // MUST do this for background to show up.
1182 public Component getTableCellRendererComponent(JTable table,
1183 Object color, boolean isSelected, boolean hasFocus, int row,
1186 Color newColor = (Color) color;
1187 setBackground(newColor);
1190 if (selectedBorder == null)
1192 selectedBorder = BorderFactory.createMatteBorder(2, 5, 2, 5,
1193 table.getSelectionBackground());
1195 setBorder(selectedBorder);
1199 if (unselectedBorder == null)
1201 unselectedBorder = BorderFactory.createMatteBorder(2, 5, 2, 5,
1202 table.getBackground());
1204 setBorder(unselectedBorder);
1207 setToolTipText("RGB value: " + newColor.getRed() + ", "
1208 + newColor.getGreen() + ", " + newColor.getBlue());
1214 class ColorEditor extends AbstractCellEditor implements TableCellEditor,
1221 JColorChooser colorChooser;
1225 protected static final String EDIT = "edit";
1227 public ColorEditor()
1229 // Set up the editor (from the table's point of view),
1230 // which is a button.
1231 // This button brings up the color chooser dialog,
1232 // which is the editor from the user's point of view.
1233 button = new JButton();
1234 button.setActionCommand(EDIT);
1235 button.addActionListener(this);
1236 button.setBorderPainted(false);
1237 // Set up the dialog that the button brings up.
1238 colorChooser = new JColorChooser();
1239 dialog = JColorChooser.createDialog(button, "Select new Colour", true, // modal
1240 colorChooser, this, // OK button handler
1241 null); // no CANCEL button handler
1245 * Handles events from the editor button and from the dialog's OK button.
1247 public void actionPerformed(ActionEvent e)
1250 if (EDIT.equals(e.getActionCommand()))
1252 // The user has clicked the cell, so
1253 // bring up the dialog.
1254 button.setBackground(currentColor);
1255 colorChooser.setColor(currentColor);
1256 dialog.setVisible(true);
1258 // Make the renderer reappear.
1259 fireEditingStopped();
1263 { // User pressed dialog's "OK" button.
1264 currentColor = colorChooser.getColor();
1268 // Implement the one CellEditor method that AbstractCellEditor doesn't.
1269 public Object getCellEditorValue()
1271 return currentColor;
1274 // Implement the one method defined by TableCellEditor.
1275 public Component getTableCellEditorComponent(JTable table, Object value,
1276 boolean isSelected, int row, int column)
1278 currentColor = (Color) value;