X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=9b91255f50ba15bc43994c328c9457f6738509c0;hb=797df64fa2a0a30773d0f48f5494d4155e5a8be3;hp=87776d30399b229c783508f3c7e28717652449a1;hpb=6b544d4a85673db44b7f75f40c22d9b7425d444e;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 87776d3..9b91255 100755 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5) - * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle * * This file is part of Jalview. * @@ -17,28 +17,110 @@ */ package jalview.gui; -import java.beans.*; -import java.io.*; -import java.util.*; - -import java.awt.*; -import java.awt.datatransfer.*; -import java.awt.dnd.*; -import java.awt.event.*; -import java.awt.print.*; -import javax.swing.*; -import javax.swing.event.MenuEvent; - -import jalview.analysis.*; -import jalview.commands.*; -import jalview.datamodel.*; -import jalview.io.*; -import jalview.jbgui.*; -import jalview.schemes.*; -import jalview.ws.*; +import jalview.analysis.AAFrequency; +import jalview.analysis.AlignmentSorter; +import jalview.analysis.Conservation; +import jalview.analysis.CrossRef; +import jalview.analysis.NJTree; +import jalview.analysis.ParseProperties; +import jalview.analysis.SequenceIdMatcher; +import jalview.bin.Cache; +import jalview.commands.CommandI; +import jalview.commands.EditCommand; +import jalview.commands.OrderCommand; +import jalview.commands.RemoveGapColCommand; +import jalview.commands.RemoveGapsCommand; +import jalview.commands.SlideSequencesCommand; +import jalview.commands.TrimRegionCommand; +import jalview.datamodel.AlignedCodonFrame; +import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.AlignmentOrder; +import jalview.datamodel.AlignmentView; +import jalview.datamodel.ColumnSelection; +import jalview.datamodel.PDBEntry; +import jalview.datamodel.SeqCigar; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceGroup; +import jalview.datamodel.SequenceI; +import jalview.io.AlignmentProperties; +import jalview.io.AnnotationFile; +import jalview.io.FeaturesFile; +import jalview.io.FileLoader; +import jalview.io.FormatAdapter; +import jalview.io.HTMLOutput; +import jalview.io.IdentifyFile; +import jalview.io.JalviewFileChooser; +import jalview.io.JalviewFileView; +import jalview.io.JnetAnnotationMaker; +import jalview.io.NewickFile; +import jalview.jbgui.GAlignFrame; +import jalview.schemes.Blosum62ColourScheme; +import jalview.schemes.BuriedColourScheme; +import jalview.schemes.ClustalxColourScheme; +import jalview.schemes.ColourSchemeI; +import jalview.schemes.ColourSchemeProperty; +import jalview.schemes.HelixColourScheme; +import jalview.schemes.HydrophobicColourScheme; +import jalview.schemes.NucleotideColourScheme; +import jalview.schemes.PIDColourScheme; +import jalview.schemes.PurinePyrimidineColourScheme; +import jalview.schemes.ResidueProperties; +import jalview.schemes.StrandColourScheme; +import jalview.schemes.TaylorColourScheme; +import jalview.schemes.TurnColourScheme; +import jalview.schemes.UserColourScheme; +import jalview.schemes.ZappoColourScheme; +import jalview.ws.WSMenuEntryProviderI; import jalview.ws.jws1.Discoverer; import jalview.ws.jws2.Jws2Discoverer; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.GridLayout; +import java.awt.Rectangle; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.awt.dnd.DnDConstants; +import java.awt.dnd.DropTargetDragEvent; +import java.awt.dnd.DropTargetDropEvent; +import java.awt.dnd.DropTargetEvent; +import java.awt.dnd.DropTargetListener; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.print.PageFormat; +import java.awt.print.PrinterJob; +import java.beans.PropertyChangeEvent; +import java.io.File; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Vector; + +import javax.swing.JButton; +import javax.swing.JEditorPane; +import javax.swing.JInternalFrame; +import javax.swing.JLabel; +import javax.swing.JLayeredPane; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.JScrollPane; +import javax.swing.SwingUtilities; + /** * DOCUMENT ME! * @@ -320,7 +402,22 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, || evt.isShiftDown() || evt.isAltDown()); } break; - + + //case KeyEvent.VK_A: + // if (viewport.cursorMode) + // { + // alignPanel.seqPanel.insertNucAtCursor(false,"A"); + // //System.out.println("A"); + // } + // break; + /* + case KeyEvent.VK_CLOSE_BRACKET: + if (viewport.cursorMode) + { + System.out.println("closing bracket"); + } + break; + */ case KeyEvent.VK_DELETE: case KeyEvent.VK_BACK_SPACE: if (!viewport.cursorMode) @@ -493,6 +590,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } ap.av.updateConservation(ap); ap.av.updateConsensus(ap); + ap.av.updateStrucConsensus(ap); } } @@ -514,25 +612,22 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /* Set up intrinsic listeners for dynamically generated GUI bits. */ private void addServiceListeners() { - final java.beans.PropertyChangeListener thisListener, thatListener; - // Do this once to get current state - BuildWebServiceMenu(); - Desktop.discoverer - .addPropertyChangeListener(thisListener = new java.beans.PropertyChangeListener() + final java.beans.PropertyChangeListener thisListener; + Desktop.instance.addJalviewPropertyChangeListener("services", + thisListener = new java.beans.PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { - // System.out.println("Discoverer property change."); - if (evt.getPropertyName().equals("services")) + // // System.out.println("Discoverer property change."); + // if (evt.getPropertyName().equals("services")) { SwingUtilities.invokeLater(new Runnable() { - @Override public void run() { System.err - .println("Change support JWS1: build services again."); + .println("Rebuild WS Menu for service change"); BuildWebServiceMenu(); } @@ -540,29 +635,25 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } }); - jalview.ws.jws2.Jws2Discoverer.getDiscoverer() - .addPropertyChangeListener( - thatListener = new java.beans.PropertyChangeListener() - { - public void propertyChange(PropertyChangeEvent evt) - { - System.err - .println("Change support JWS2: build services again."); - BuildWebServiceMenu(); - } - }); addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() { public void internalFrameClosed( javax.swing.event.InternalFrameEvent evt) { - // System.out.println("deregistering discoverer listener"); - Desktop.discoverer.removePropertyChangeListener(thisListener); - jalview.ws.jws2.Jws2Discoverer.getDiscoverer() - .removePropertyChangeListener(thatListener); + System.out.println("deregistering discoverer listener"); + Desktop.instance.removeJalviewPropertyChangeListener("services", + thisListener); closeMenuItem_actionPerformed(true); }; }); + // Finally, build the menu once to get current service state + new Thread(new Runnable() + { + public void run() + { + BuildWebServiceMenu(); + } + }).start(); } public void setGUINucleotide(boolean nucleotide) @@ -571,11 +662,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, conservationMenuItem.setEnabled(!nucleotide); modifyConservation.setEnabled(!nucleotide); showGroupConservation.setEnabled(!nucleotide); + rnahelicesColour.setEnabled(nucleotide); + purinePyrimidineColour.setEnabled(nucleotide); // Remember AlignFrame always starts as protein - if (!nucleotide) - { - calculateMenu.remove(calculateMenu.getItemCount() - 2); - } + //if (!nucleotide) + // { + // showTr + // calculateMenu.remove(calculateMenu.getItemCount() - 2); + // } } /** @@ -625,7 +719,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, applyToAllGroups.setState(av.colourAppliesToAllGroups); showNpFeatsMenuitem.setSelected(av.isShowNpFeats()); showDbRefsMenuitem.setSelected(av.isShowDbRefs()); - + autoCalculate.setSelected(av.autoCalculateConsensus); + sortByTree.setSelected(av.sortByTree); + listenToViewSelections.setSelected(av.followSelection); + rnahelicesColour.setEnabled(av.alignment.hasRNAStructure()); + rnahelicesColour.setSelected(av.getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour); setShowProductsEnabled(); updateEditMenuBar(); @@ -681,7 +779,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, progressBars.put(lId, progressPanel); } // update GUI - setMenusForViewport(); + // setMenusForViewport(); validate(); } @@ -705,8 +803,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void actionPerformed(ActionEvent e) { handler.cancelActivity(id); - us.setProgressBar("Cancelled " - + ((JLabel) progressPanel.getComponent(0)).getText(), id); + us.setProgressBar( + "Cancelled " + + ((JLabel) progressPanel.getComponent(0)) + .getText(), id); } }); progressPanel.add(cancel, BorderLayout.EAST); @@ -844,8 +944,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ public void saveAs_actionPerformed(ActionEvent e) { - JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache - .getProperty("LAST_DIRECTORY"), + JalviewFileChooser chooser = new JalviewFileChooser( + jalview.bin.Cache.getProperty("LAST_DIRECTORY"), jalview.io.AppletFormatAdapter.WRITABLE_EXTENSIONS, jalview.io.AppletFormatAdapter.WRITABLE_FNAMES, currentFileFormat, false); @@ -1015,11 +1115,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, CutAndPasteTransfer cap = new CutAndPasteTransfer(); cap.setForInput(null); - Desktop.addInternalFrame(cap, "Alignment output - " - + e.getActionCommand(), 600, 500); - cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(), - viewport.alignment, omitHidden, viewport.colSel)); + try + { + cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(), + viewport.alignment, omitHidden, viewport.colSel)); + Desktop.addInternalFrame(cap, + "Alignment output - " + e.getActionCommand(), 600, 500); + } catch (OutOfMemoryError oom) + { + new OOMWarning("Outputting alignment as " + e.getActionCommand(), oom); + cap.dispose(); + } + } /** @@ -1030,9 +1138,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ protected void htmlMenuItem_actionPerformed(ActionEvent e) { - new HTMLOutput(alignPanel, alignPanel.seqPanel.seqCanvas - .getSequenceRenderer(), alignPanel.seqPanel.seqCanvas - .getFeatureRenderer()); + new HTMLOutput(alignPanel, + alignPanel.seqPanel.seqCanvas.getSequenceRenderer(), + alignPanel.seqPanel.seqCanvas.getFeatureRenderer()); } public void createImageMap(File file, String image) @@ -1088,7 +1196,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void exportAnnotations_actionPerformed(ActionEvent e) { - new AnnotationExporter().exportAnnotations(alignPanel, + new AnnotationExporter().exportAnnotations( + alignPanel, viewport.showAnnotation ? viewport.alignment .getAlignmentAnnotation() : null, viewport.alignment .getGroups(), @@ -1098,8 +1207,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void associatedData_actionPerformed(ActionEvent e) { // Pick the tree file - JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache - .getProperty("LAST_DIRECTORY")); + JalviewFileChooser chooser = new JalviewFileChooser( + jalview.bin.Cache.getProperty("LAST_DIRECTORY")); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Load Jalview Annotations or Features File"); chooser.setToolTipText("Load Jalview Annotations / Features file"); @@ -1110,7 +1219,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { String choice = chooser.getSelectedFile().getPath(); jalview.bin.Cache.setProperty("LAST_DIRECTORY", choice); - loadJalviewDataFile(choice); + loadJalviewDataFile(choice, null, null, null); } } @@ -1539,11 +1648,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, jalview.gui.Desktop.internalCopy = true; // Its really worth setting the clipboard contents // to empty before setting the large StringSelection!! - Toolkit.getDefaultToolkit().getSystemClipboard().setContents( - new StringSelection(""), null); + Toolkit.getDefaultToolkit().getSystemClipboard() + .setContents(new StringSelection(""), null); - Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, - Desktop.instance); + Toolkit.getDefaultToolkit().getSystemClipboard() + .setContents(ss, Desktop.instance); } catch (OutOfMemoryError er) { new OOMWarning("copying region", er); @@ -1806,8 +1915,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } buildSortByAnnotationScoresMenu(); } - viewport.firePropertyChange("alignment", null, alignment - .getSequences()); + viewport.firePropertyChange("alignment", null, + alignment.getSequences()); } else @@ -1995,6 +2104,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, alignPanel.idPanel.idCanvas.searchResults = null; alignPanel.paintAlignment(true); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); + viewport.sendSelection(); } /** @@ -2020,14 +2130,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } alignPanel.paintAlignment(true); - viewport.sendSelection(); PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId()); + viewport.sendSelection(); } public void invertColSel_actionPerformed(ActionEvent e) { viewport.invertColumnSelection(); alignPanel.paintAlignment(true); + viewport.sendSelection(); } /** @@ -2238,8 +2349,57 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void newView_actionPerformed(ActionEvent e) { + newView(true); + } + + /** + * + * @param copyAnnotation + * if true then duplicate all annnotation, groups and settings + * @return new alignment panel, already displayed. + */ + public AlignmentPanel newView(boolean copyAnnotation) + { + return newView(null, copyAnnotation); + } + + /** + * + * @param viewTitle + * title of newly created view + * @return new alignment panel, already displayed. + */ + public AlignmentPanel newView(String viewTitle) + { + return newView(viewTitle, true); + } + + /** + * + * @param viewTitle + * title of newly created view + * @param copyAnnotation + * if true then duplicate all annnotation, groups and settings + * @return new alignment panel, already displayed. + */ + public AlignmentPanel newView(String viewTitle, boolean copyAnnotation) + { AlignmentPanel newap = new Jalview2XML().copyAlignPanel(alignPanel, true); + if (!copyAnnotation) + { + // just remove all the current annotation except for the automatic stuff + newap.av.alignment.deleteAllGroups(); + for (AlignmentAnnotation alan : newap.av.alignment + .getAlignmentAnnotation()) + { + if (!alan.autoCalculated) + { + newap.av.alignment.deleteAnnotation(alan); + } + ; + } + } newap.av.gatherViewsHere = false; @@ -2252,8 +2412,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, newap.av.redoList = viewport.redoList; int index = Desktop.getViewCount(viewport.getSequenceSetId()); - String newViewName = "View " + index; - + // make sure the new view has a unique name - this is essential for Jalview + // 2 archives + boolean addFirstIndex = false; + if (viewTitle == null || viewTitle.trim().length() == 0) + { + viewTitle = "View"; + addFirstIndex = true; + } + else + { + index = 1;// we count from 1 if given a specific name + } + String newViewName = viewTitle + ((addFirstIndex) ? " " + index : ""); Vector comps = (Vector) PaintRefresher.components.get(viewport .getSequenceSetId()); Vector existingNames = new Vector(); @@ -2271,7 +2442,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, while (existingNames.contains(newViewName)) { - newViewName = "View " + (++index); + newViewName = viewTitle + " " + (++index); } newap.av.viewName = newViewName; @@ -2283,6 +2454,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, viewport.gatherViewsHere = true; } tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1); + return newap; } public void expandViews_actionPerformed(ActionEvent e) @@ -2658,58 +2830,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { JEditorPane editPane = new JEditorPane("text/html", ""); editPane.setEditable(false); - StringBuffer contents = new StringBuffer(""); - - float avg = 0; - int min = Integer.MAX_VALUE, max = 0; - for (int i = 0; i < viewport.alignment.getHeight(); i++) - { - int size = viewport.alignment.getSequenceAt(i).getEnd() - - viewport.alignment.getSequenceAt(i).getStart(); - avg += size; - if (size > max) - max = size; - if (size < min) - min = size; - } - avg = avg / (float) viewport.alignment.getHeight(); - - contents.append("
Sequences: " + viewport.alignment.getHeight()); - contents.append("
Minimum Sequence Length: " + min); - contents.append("
Maximum Sequence Length: " + max); - contents.append("
Average Length: " + (int) avg); - - if (((Alignment) viewport.alignment).getProperties() != null) - { - Hashtable props = ((Alignment) viewport.alignment).getProperties(); - Enumeration en = props.keys(); - contents.append("

"); - while (en.hasMoreElements()) - { - String key = en.nextElement().toString(); - StringBuffer val = new StringBuffer(); - String vals = props.get(key).toString(); - int pos = 0, npos; - do - { - npos = vals.indexOf("\n", pos); - if (npos == -1) - { - val.append(vals.substring(pos)); - } - else - { - val.append(vals.substring(pos, npos)); - val.append("
"); - } - pos = npos + 1; - } while (npos != -1); - contents - .append(""); - } - contents.append("
" + key + "" + val + "
"); - } - editPane.setText(contents.toString() + ""); + StringBuffer contents = new AlignmentProperties(viewport.alignment) + .formatAsHtml(); + editPane.setText("" + contents.toString() + ""); JInternalFrame frame = new JInternalFrame(); frame.getContentPane().add(new JScrollPane(editPane)); @@ -2733,19 +2856,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, JInternalFrame frame = new JInternalFrame(); OverviewPanel overview = new OverviewPanel(alignPanel); frame.setContentPane(overview); - Desktop.addInternalFrame(frame, "Overview " + this.getTitle(), frame - .getWidth(), frame.getHeight()); + Desktop.addInternalFrame(frame, "Overview " + this.getTitle(), + frame.getWidth(), frame.getHeight()); frame.pack(); frame.setLayer(JLayeredPane.PALETTE_LAYER); - frame - .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() - { - public void internalFrameClosed( - javax.swing.event.InternalFrameEvent evt) - { - alignPanel.setOverviewPanel(null); - }; - }); + frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() + { + public void internalFrameClosed( + javax.swing.event.InternalFrameEvent evt) + { + alignPanel.setOverviewPanel(null); + }; + }); alignPanel.setOverviewPanel(overview); } @@ -2775,8 +2897,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void clustalColour_actionPerformed(ActionEvent e) { changeColour(new ClustalxColourScheme( - viewport.alignment.getSequences(), viewport.alignment - .getWidth())); + viewport.alignment.getSequences(), + viewport.alignment.getWidth())); } /** @@ -2867,10 +2989,25 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, changeColour(new NucleotideColourScheme()); } + public void purinePyrimidineColour_actionPerformed(ActionEvent e) + { + changeColour(new PurinePyrimidineColourScheme()); + } + /* + public void covariationColour_actionPerformed(ActionEvent e) + { + changeColour(new CovariationColourScheme(viewport.alignment.getAlignmentAnnotation()[0])); + } + */ public void annotationColour_actionPerformed(ActionEvent e) { new AnnotationColourChooser(viewport, alignPanel); } + + public void rnahelicesColour_actionPerformed(ActionEvent e) + { + new RNAHelicesColourChooser(viewport, alignPanel); + } /** * DOCUMENT ME! @@ -2914,8 +3051,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, Alignment al = (Alignment) viewport.alignment; Conservation c = new Conservation("All", - ResidueProperties.propHash, 3, al.getSequences(), 0, al - .getWidth() - 1); + ResidueProperties.propHash, 3, al.getSequences(), 0, + al.getWidth() - 1); c.calculate(); c.verdict(false, viewport.ConsPercGaps); @@ -2951,8 +3088,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (cs instanceof ClustalxColourScheme) { - sg.cs = new ClustalxColourScheme(sg - .getSequences(viewport.hiddenRepSequences), sg.getWidth()); + sg.cs = new ClustalxColourScheme( + sg.getSequences(viewport.hiddenRepSequences), + sg.getWidth()); } else if (cs instanceof UserColourScheme) { @@ -2974,9 +3112,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus()); - sg.cs.setConsensus(AAFrequency.calculate(sg - .getSequences(viewport.hiddenRepSequences), sg - .getStartRes(), sg.getEndRes() + 1)); + sg.cs.setConsensus(AAFrequency.calculate( + sg.getSequences(viewport.hiddenRepSequences), + sg.getStartRes(), sg.getEndRes() + 1)); } else { @@ -2986,9 +3124,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (viewport.getConservationSelected()) { Conservation c = new Conservation("Group", - ResidueProperties.propHash, 3, sg - .getSequences(viewport.hiddenRepSequences), sg - .getStartRes(), sg.getEndRes() + 1); + ResidueProperties.propHash, 3, + sg.getSequences(viewport.hiddenRepSequences), + sg.getStartRes(), sg.getEndRes() + 1); c.calculate(); c.verdict(false, viewport.ConsPercGaps); sg.cs.setConservation(c); @@ -3019,8 +3157,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (viewport.getAbovePIDThreshold() && viewport.globalColourScheme != null) { - SliderPanel.setPIDSliderSource(alignPanel, viewport - .getGlobalColourScheme(), "Background"); + SliderPanel.setPIDSliderSource(alignPanel, + viewport.getGlobalColourScheme(), "Background"); SliderPanel.showPIDSlider(); } } @@ -3130,8 +3268,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (evt.isControlDown() || SwingUtilities.isRightMouseButton(evt)) { - radioItem - .removeActionListener(radioItem.getActionListeners()[0]); + radioItem.removeActionListener(radioItem.getActionListeners()[0]); int option = JOptionPane.showInternalConfirmDialog( jalview.gui.Desktop.desktop, @@ -3322,7 +3459,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .getAlignment().getSequences()); } } + public void sortByTreeOption_actionPerformed(ActionEvent e) + { + viewport.sortByTree = sortByTree.isSelected(); + } + @Override + protected void listenToViewSelections_actionPerformed(ActionEvent e) + { + viewport.followSelection = listenToViewSelections.isSelected(); + } /** * DOCUMENT ME! * @@ -3505,8 +3651,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void actionPerformed(ActionEvent e) { SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); - AlignmentSorter.sortByAnnotationScore(scoreLabel, viewport - .getAlignment());// ,viewport.getSelectionGroup()); + AlignmentSorter.sortByAnnotationScore(scoreLabel, + viewport.getAlignment());// ,viewport.getSelectionGroup()); addHistoryItem(new OrderCommand("Sort by " + scoreLabel, oldOrder, viewport.alignment)); alignPanel.paintAlignment(true); @@ -3554,8 +3700,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, Enumeration labels = scoreSorts.keys(); while (labels.hasMoreElements()) { - addSortByAnnotScoreMenuItem(sortByAnnotScore, (String) labels - .nextElement()); + addSortByAnnotScoreMenuItem(sortByAnnotScore, + (String) labels.nextElement()); } sortByAnnotScore.setVisible(scoreSorts.size() > 0); scoreSorts.clear(); @@ -3605,21 +3751,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, for (i = 0; i < treePanels.size(); i++) { - TreePanel tp = (TreePanel) treePanels.elementAt(i); + final TreePanel tp = (TreePanel) treePanels.elementAt(i); final JMenuItem item = new JMenuItem(tp.getTitle()); final NJTree tree = ((TreePanel) treePanels.elementAt(i)).getTree(); item.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { - SequenceI[] oldOrder = viewport.getAlignment() - .getSequencesArray(); - AlignmentSorter.sortByTree(viewport.getAlignment(), tree); - - addHistoryItem(new OrderCommand("Tree Sort", oldOrder, - viewport.alignment)); - - alignPanel.paintAlignment(true); + tp.sortByTree_actionPerformed(null); + addHistoryItem(tp.sortAlignmentIn(alignPanel)); + } }); @@ -3627,6 +3768,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } + public boolean sortBy(AlignmentOrder alorder, String undoname) + { + SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray(); + AlignmentSorter.sortBy(viewport.getAlignment(), alorder); + if (undoname != null) + { + addHistoryItem(new OrderCommand(undoname, oldOrder, + viewport.alignment)); + } + alignPanel.paintAlignment(true); + return true; + } + /** * Work out whether the whole set of sequences or just the selected set will * be submitted for multiple alignment. @@ -3710,8 +3864,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, protected void LoadtreeMenuItem_actionPerformed(ActionEvent e) { // Pick the tree file - JalviewFileChooser chooser = new JalviewFileChooser(jalview.bin.Cache - .getProperty("LAST_DIRECTORY")); + JalviewFileChooser chooser = new JalviewFileChooser( + jalview.bin.Cache.getProperty("LAST_DIRECTORY")); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle("Select a newick-like tree file"); chooser.setToolTipText("Load a tree file"); @@ -3735,8 +3889,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } if (fin != null && fin.hasWarningMessage()) { - JOptionPane.showMessageDialog(Desktop.desktop, fin - .getWarningMessage(), "Possible problem with tree file", + JOptionPane.showMessageDialog(Desktop.desktop, + fin.getWarningMessage(), "Possible problem with tree file", JOptionPane.WARNING_MESSAGE); } } @@ -3828,130 +3982,149 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } ; } + final AlignFrame me = this; buildingMenu = true; - try + new Thread(new Runnable() { - System.err - .println("Building ws menu again " + Thread.currentThread()); - // TODO: add support for context dependent disabling of services based on - // alignment and current selection - // TODO: add additional serviceHandle parameter to specify abstract - // handler - // class independently of AbstractName - // TODO: add in rediscovery GUI function to restart discoverer - // TODO: group services by location as well as function and/or introduce - // object broker mechanism. - Vector wsmenu = new Vector(); - final IProgressIndicator af = this; - if ((Discoverer.services != null) && (Discoverer.services.size() > 0)) + public void run() { - // TODO: refactor to allow list of AbstractName/Handler bindings to be - // stored or retrieved from elsewhere - Vector msaws = (Vector) Discoverer.services.get("MsaWS"); - Vector secstrpr = (Vector) Discoverer.services.get("SecStrPred"); - Vector seqsrch = (Vector) Discoverer.services.get("SeqSearch"); - // TODO: move GUI generation code onto service implementation - so a - // client instance attaches itself to the GUI with method call like - // jalview.ws.MsaWSClient.bind(servicehandle, Desktop.instance, - // alignframe) - if (msaws != null) + try { - // Add any Multiple Sequence Alignment Services + System.err.println("Building ws menu again " + + Thread.currentThread()); + // TODO: add support for context dependent disabling of services based + // on + // alignment and current selection + // TODO: add additional serviceHandle parameter to specify abstract + // handler + // class independently of AbstractName + // TODO: add in rediscovery GUI function to restart discoverer + // TODO: group services by location as well as function and/or + // introduce + // object broker mechanism. + final Vector wsmenu = new Vector(); + final IProgressIndicator af = me; final JMenu msawsmenu = new JMenu("Alignment"); - for (int i = 0, j = msaws.size(); i < j; i++) - { - final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws - .get(i); - jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer - .getServiceClient(sh); - impl.attachWSMenuEntry(msawsmenu, this); - - } - wsmenu.add(msawsmenu); - } - if (secstrpr != null) - { - // Add any secondary structure prediction services final JMenu secstrmenu = new JMenu( "Secondary Structure Prediction"); - for (int i = 0, j = secstrpr.size(); i < j; i++) - { - final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr - .get(i); - jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer - .getServiceClient(sh); - impl.attachWSMenuEntry(secstrmenu, this); - } - wsmenu.add(secstrmenu); - } - if (seqsrch != null) - { - // Add any sequence search services - final JMenu seqsrchmenu = new JMenu("Sequence Database Search"); - for (int i = 0, j = seqsrch.size(); i < j; i++) + final JMenu seqsrchmenu = new JMenu( + "Sequence Database Search"); + final JMenu analymenu = new JMenu( + "Analysis"); + // JAL-940 - only show secondary structure prediction services from the legacy server + if (// Cache.getDefault("SHOW_JWS1_SERVICES", true) + // && + Discoverer.services != null + && (Discoverer.services.size() > 0)) { - final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) seqsrch - .elementAt(i); - jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer - .getServiceClient(sh); - impl.attachWSMenuEntry(seqsrchmenu, this); + // TODO: refactor to allow list of AbstractName/Handler bindings to + // be + // stored or retrieved from elsewhere + Vector msaws = null; // (Vector) Discoverer.services.get("MsaWS"); + Vector secstrpr = (Vector) Discoverer.services + .get("SecStrPred"); + Vector seqsrch = null; // (Vector) Discoverer.services.get("SeqSearch"); + // TODO: move GUI generation code onto service implementation - so a + // client instance attaches itself to the GUI with method call like + // jalview.ws.MsaWSClient.bind(servicehandle, Desktop.instance, + // alignframe) + if (msaws != null) + { + // Add any Multiple Sequence Alignment Services + for (int i = 0, j = msaws.size(); i < j; i++) + { + final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws + .get(i); + jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer + .getServiceClient(sh); + impl.attachWSMenuEntry(msawsmenu, me); + + } + } + if (secstrpr != null) + { + // Add any secondary structure prediction services + for (int i = 0, j = secstrpr.size(); i < j; i++) + { + final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr + .get(i); + jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer + .getServiceClient(sh); + impl.attachWSMenuEntry(secstrmenu, me); + } + } + if (seqsrch != null) + { + // Add any sequence search services + for (int i = 0, j = seqsrch.size(); i < j; i++) + { + final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) seqsrch + .elementAt(i); + jalview.ws.WSMenuEntryProviderI impl = jalview.ws.jws1.Discoverer + .getServiceClient(sh); + impl.attachWSMenuEntry(seqsrchmenu, me); + } + } } - wsmenu.add(seqsrchmenu); - } - } - // TODO: move into separate menu builder class. - { - Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer(); - if (jws2servs != null) - { - if (jws2servs.hasServices()) + // TODO: move into separate menu builder class. + if (Cache.getDefault("SHOW_JWS2_SERVICES", true)) { - JMenu jws2men = new JMenu("Jalview 2 Services"); - jws2servs.attachWSMenuEntry(jws2men, this); - wsmenu.add(jws2men); + Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer(); + if (jws2servs != null) + { + if (jws2servs.hasServices()) + { + jws2servs.attachWSMenuEntry(msawsmenu, me); + } + } } - else + // Add all submenus in the order they should appear on the web services menu + wsmenu.add(msawsmenu); + wsmenu.add(secstrmenu); + wsmenu.add(analymenu); + // No search services yet + // wsmenu.add(seqsrchmenu); + + javax.swing.SwingUtilities.invokeLater(new Runnable() { - if (!jws2servs.isRunning()) + public void run() { - new Thread(jws2servs).start(); + try + { + webService.removeAll(); + // first, add discovered services onto the webservices menu + if (wsmenu.size() > 0) + { + for (int i = 0, j = wsmenu.size(); i < j; i++) + { + webService.add((JMenu) wsmenu.get(i)); + } + } + else + { + webService.add(me.webServiceNoServices); + } + build_urlServiceMenu(me.webService); + build_fetchdbmenu(webService); + } catch (Exception e) + { + } + ; } - } - } - } - resetWebServiceMenu(); - // finally, add the whole shebang onto the webservices menu - if (wsmenu.size() > 0) - { - for (int i = 0, j = wsmenu.size(); i < j; i++) + }); + } catch (Exception e) { - webService.add((JMenu) wsmenu.get(i)); } + ; + + buildingMenu = false; } - else - { - this.webService.add(this.webServiceNoServices); - } - } catch (Exception e) - { - } - ; - buildingMenu = false; - } + }).start(); - /** - * empty the web service menu and add any ad-hoc functions not dynamically - * discovered. - * - */ - private void resetWebServiceMenu() - { - webService.removeAll(); - build_fetchdbmenu(webService); - build_urlServiceMenu(webService); } + /** * construct any groupURL type service menu entries. * @@ -3959,8 +4132,32 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, */ private void build_urlServiceMenu(JMenu webService) { - jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry( - webService, this); + // TODO: remove this code when 2.7 is released + // DEBUG - alignmentView + /* + * JMenuItem testAlView = new JMenuItem("Test AlignmentView"); final + * AlignFrame af = this; testAlView.addActionListener(new ActionListener() { + * + * @Override public void actionPerformed(ActionEvent e) { + * jalview.datamodel.AlignmentView.testSelectionViews(af.viewport.alignment, + * af.viewport.colSel, af.viewport.selectionGroup); } + * + * }); webService.add(testAlView); + */ + // TODO: refactor to RestClient discoverer and merge menu entries for + // rest-style services with other types of analysis/calculation service + // SHmmr test client - still being implemented. + // DEBUG - alignmentView + + for (jalview.ws.rest.RestClient client: jalview.ws.rest.RestClient.getRestClients()) { + client.attachWSMenuEntry(JvSwingUtils.findOrCreateMenu(webService, client.getAction()), this); + } + + if (Cache.getDefault("SHOW_ENFIN_SERVICES", true)) + { + jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry( + webService, this); + } } /* @@ -4045,8 +4242,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } catch (Exception e) { jalview.bin.Cache.log - .warn( - "canTranslate threw an exception - please report to help@jalview.org", + .warn("canTranslate threw an exception - please report to help@jalview.org", e); return false; } @@ -4136,13 +4332,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // old way try { - return (jalview.analysis.Dna.canTranslate(selection, viewport - .getViewAsVisibleContigs(true))); + return (jalview.analysis.Dna.canTranslate(selection, + viewport.getViewAsVisibleContigs(true))); } catch (Exception e) { jalview.bin.Cache.log - .warn( - "canTranslate threw an exception - please report to help@jalview.org", + .warn("canTranslate threw an exception - please report to help@jalview.org", e); return false; } @@ -4231,9 +4426,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, boolean featuresFile = false; try { - featuresFile = new FeaturesFile(file, type).parse(viewport.alignment - .getDataset(), alignPanel.seqPanel.seqCanvas - .getFeatureRenderer().featureColours, false); + featuresFile = new FeaturesFile(file, type) + .parse(viewport.alignment.getDataset(), + alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureColours, + false, jalview.bin.Cache.getDefault( + "RELAXEDSEQIDMATCHING", false)); } catch (Exception ex) { ex.printStackTrace(); @@ -4328,10 +4525,127 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { try { - + // check to see if any of these files have names matching sequences in + // the alignment + SequenceIdMatcher idm = new SequenceIdMatcher(viewport + .getAlignment().getSequencesArray()); + /** + * Object[] { String,SequenceI} + */ + ArrayList filesmatched = new ArrayList(); + ArrayList filesnotmatched = new ArrayList(); for (int i = 0; i < files.size(); i++) { - loadJalviewDataFile(files.get(i).toString()); + String file = files.get(i).toString(); + String pdbfn = ""; + String protocol = FormatAdapter.checkProtocol(file); + if (protocol == jalview.io.FormatAdapter.FILE) + { + File fl = new File(file); + pdbfn = fl.getName(); + } + else if (protocol == jalview.io.FormatAdapter.URL) + { + URL url = new URL(file); + pdbfn = url.getFile(); + } + if (pdbfn.length() > 0) + { + // attempt to find a match in the alignment + SequenceI[] mtch = idm.findAllIdMatches(pdbfn); + int l = 0, c = pdbfn.indexOf("."); + while (mtch == null && c != -1) + { + do + { + l = c; + } while ((c = pdbfn.indexOf(".", l)) > l); + if (l > -1) + { + pdbfn = pdbfn.substring(0, l); + } + mtch = idm.findAllIdMatches(pdbfn); + } + if (mtch != null) + { + String type = null; + try + { + type = new IdentifyFile().Identify(file, protocol); + } catch (Exception ex) + { + type = null; + } + if (type != null) + { + if (type.equalsIgnoreCase("PDB")) + { + filesmatched.add(new Object[] + { file, protocol, mtch }); + continue; + } + } + } + // File wasn't named like one of the sequences or wasn't a PDB file. + filesnotmatched.add(file); + } + } + int assocfiles = 0; + if (filesmatched.size() > 0) + { + if (Cache.getDefault("AUTOASSOCIATE_PDBANDSEQS", false) + || JOptionPane + .showConfirmDialog( + this, + "Do you want to automatically associate the " + + filesmatched.size() + + " PDB files with sequences in the alignment that have the same name ?", + "Automatically Associate PDB files by name", + JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) + + { + for (Object[] fm : filesmatched) + { + // try and associate + // TODO: may want to set a standard ID naming formalism for + // associating PDB files which have no IDs. + for (SequenceI toassoc: (SequenceI[])fm[2]) { + PDBEntry pe = new AssociatePdbFileWithSeq() + .associatePdbWithSeq((String) fm[0], (String) fm[1], + toassoc, false); + if (pe != null) + { + System.err + .println("Associated file : " + ((String) fm[0]) + + " with " + + toassoc.getDisplayId(true)); + assocfiles++; + } + } + alignPanel.paintAlignment(true); + } + } + } + if (filesnotmatched.size() > 0) + { + if (assocfiles > 0 + && (Cache.getDefault( + "AUTOASSOCIATE_PDBANDSEQS_IGNOREOTHERS", false) || JOptionPane + .showConfirmDialog( + this, + "Do you want to ignore the " + + filesnotmatched.size() + + " files whose names did not match any sequence IDs ?", + "Ignore unmatched dropped files ?", + JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)) + { + return; + } + for (String fn : filesnotmatched) + { + loadJalviewDataFile(fn, null, null, null); + } + } } catch (Exception ex) { @@ -4349,36 +4663,62 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, * @param file * either a filename or a URL string. */ - public void loadJalviewDataFile(String file) + public void loadJalviewDataFile(String file, String protocol, + String format, SequenceI assocSeq) { try { - String protocol = jalview.io.FormatAdapter.FILE; - String f = file.toLowerCase(); - if (f.indexOf("http:") == 0 || f.indexOf("https:") == 0 - || f.indexOf("file:") == 0) + if (protocol == null) { - protocol = jalview.io.FormatAdapter.URL; + protocol = jalview.io.FormatAdapter.checkProtocol(file); } - - boolean isAnnotation = new AnnotationFile().readAnnotationFile( - viewport.alignment, file, protocol); + // if the file isn't identified, or not positively identified as some + // other filetype (PFAM is default unidentified alignment file type) then + // try to parse as annotation. + boolean isAnnotation = (format == null || format + .equalsIgnoreCase("PFAM")) ? new AnnotationFile() + .readAnnotationFile(viewport.alignment, file, protocol) + : false; if (!isAnnotation) { // try to see if its a JNet 'concise' style annotation file *before* we // try to parse it as a features file - String format = new IdentifyFile().Identify(file, protocol); + if (format == null) + { + format = new IdentifyFile().Identify(file, protocol); + } if (format.equalsIgnoreCase("JnetFile")) { jalview.io.JPredFile predictions = new jalview.io.JPredFile(file, protocol); - new JnetAnnotationMaker().add_annotation(predictions, viewport - .getAlignment(), 0, false); + new JnetAnnotationMaker().add_annotation(predictions, + viewport.getAlignment(), 0, false); isAnnotation = true; } else { + /* + * if (format.equalsIgnoreCase("PDB")) { + * + * String pdbfn = ""; // try to match up filename with sequence id try + * { if (protocol == jalview.io.FormatAdapter.FILE) { File fl = new + * File(file); pdbfn = fl.getName(); } else if (protocol == + * jalview.io.FormatAdapter.URL) { URL url = new URL(file); pdbfn = + * url.getFile(); } } catch (Exception e) { } ; if (assocSeq == null) + * { SequenceIdMatcher idm = new SequenceIdMatcher(viewport + * .getAlignment().getSequencesArray()); if (pdbfn.length() > 0) { // + * attempt to find a match in the alignment SequenceI mtch = + * idm.findIdMatch(pdbfn); int l = 0, c = pdbfn.indexOf("."); while + * (mtch == null && c != -1) { while ((c = pdbfn.indexOf(".", l)) > l) + * { l = c; } if (l > -1) { pdbfn = pdbfn.substring(0, l); } mtch = + * idm.findIdMatch(pdbfn); } if (mtch != null) { // try and associate + * // prompt ? PDBEntry pe = new AssociatePdbFileWithSeq() + * .associatePdbWithSeq(file, protocol, mtch, true); if (pe != null) { + * System.err.println("Associated file : " + file + " with " + + * mtch.getDisplayId(true)); alignPanel.paintAlignment(true); } } // + * TODO: maybe need to load as normal otherwise return; } } + */ // try to parse it as a features file boolean isGroupsFile = parseFeaturesFile(file, protocol); // if it wasn't a features file then we just treat it as a general @@ -4514,14 +4854,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // TODO We probably want to store a sequence database checklist in // preferences and have checkboxes.. rather than individual sources selected // here - JMenu rfetch = new JMenu("Fetch DB References"); - rfetch - .setToolTipText("Retrieve and parse sequence database records for the alignment or the currently selected sequences"); + final JMenu rfetch = new JMenu("Fetch DB References"); + rfetch.setToolTipText("Retrieve and parse sequence database records for the alignment or the currently selected sequences"); webService.add(rfetch); JMenuItem fetchr = new JMenuItem("Standard Databases"); - fetchr - .setToolTipText("Fetch from EMBL/EMBLCDS or Uniprot/PDB and any selected DAS sources"); + fetchr.setToolTipText("Fetch from EMBL/EMBLCDS or Uniprot/PDB and any selected DAS sources"); fetchr.addActionListener(new ActionListener() { @@ -4542,57 +4880,74 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, }); rfetch.add(fetchr); - JMenu dfetch = new JMenu(); - rfetch.add(dfetch); - jalview.ws.SequenceFetcher sf = SequenceFetcher - .getSequenceFetcherSingleton(this); - String[] otherdb = sf.getOrderedSupportedSources(); - // sf.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class); - // jalview.util.QuickSort.sort(otherdb, otherdb); - int comp = 0, mcomp = 15; - String mname = null; - if (otherdb != null && otherdb.length > 0) - { - for (int i = 0; i < otherdb.length; i++) + final AlignFrame me = this; + new Thread(new Runnable() + { + public void run() { - String dbname = sf.getSourceProxy(otherdb[i]).getDbName(); - if (mname == null) - { - mname = "from '" + dbname + "'"; - } - fetchr = new JMenuItem(otherdb[i]); - final String[] dassource = new String[] - { otherdb[i] }; - fetchr.addActionListener(new ActionListener() + final jalview.ws.SequenceFetcher sf = SequenceFetcher + .getSequenceFetcherSingleton(me); + final String[] otherdb = sf.getOrderedSupportedSources(); + // sf.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class); + // jalview.util.QuickSort.sort(otherdb, otherdb); + javax.swing.SwingUtilities.invokeLater(new Runnable() { - - public void actionPerformed(ActionEvent e) + public void run() { - new Thread(new Runnable() - { - public void run() + JMenu dfetch = new JMenu(); + JMenuItem fetchr; + rfetch.add(dfetch); + int comp = 0, mcomp = 15; + String mname = null; + if (otherdb != null && otherdb.length > 0) + { + for (int i = 0; i < otherdb.length; i++) { - new jalview.ws.DBRefFetcher(alignPanel.av - .getSequenceSelection(), alignPanel.alignFrame, - dassource).fetchDBRefs(false); + String dbname = sf.getSourceProxy(otherdb[i]).getDbName(); + if (mname == null) + { + mname = "from '" + dbname + "'"; + } + fetchr = new JMenuItem(otherdb[i]); + final String[] dassource = new String[] + { otherdb[i] }; + fetchr.addActionListener(new ActionListener() + { + + public void actionPerformed(ActionEvent e) + { + new Thread(new Runnable() + { + + public void run() + { + new jalview.ws.DBRefFetcher(alignPanel.av + .getSequenceSelection(), + alignPanel.alignFrame, dassource) + .fetchDBRefs(false); + } + }).start(); + } + + }); + fetchr.setToolTipText("Retrieve from " + dbname); + dfetch.add(fetchr); + if (comp++ == mcomp || i == (otherdb.length - 1)) + { + dfetch.setText(mname + " to '" + dbname + "'"); + rfetch.add(dfetch); + dfetch = new JMenu(); + mname = null; + comp = 0; + } } - }).start(); + } } - }); - fetchr.setToolTipText("Retrieve from " + dbname); - dfetch.add(fetchr); - if (comp++ == mcomp || i == (otherdb.length - 1)) - { - dfetch.setText(mname + " to '" + dbname + "'"); - rfetch.add(dfetch); - dfetch = new JMenu(); - mname = null; - comp = 0; - } } - } + }).start(); + } /** @@ -4704,8 +5059,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (viewport.getSelectionGroup() != null) { SequenceGroup[] gps = jalview.analysis.Grouping.makeGroupsFrom( - viewport.getSequenceSelection(), viewport.getAlignmentView( - true).getSequenceStrings(viewport.getGapCharacter()), + viewport.getSequenceSelection(), + viewport.getAlignmentView(true).getSequenceStrings( + viewport.getGapCharacter()), viewport.alignment.getGroups()); viewport.alignment.deleteAllGroups(); viewport.sequenceColours = null; @@ -4716,8 +5072,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, gps[g].setShowNonconserved(viewport.getShowUnconserved()); gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo()); viewport.alignment.addGroup(gps[g]); - Color col = new Color((int) (Math.random() * 255), (int) (Math - .random() * 255), (int) (Math.random() * 255)); + Color col = new Color((int) (Math.random() * 255), + (int) (Math.random() * 255), (int) (Math.random() * 255)); col = col.brighter(); for (Enumeration sq = gps[g].getSequences(null).elements(); sq .hasMoreElements(); viewport.setSequenceColour( @@ -4729,6 +5085,26 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, alignPanel.paintAlignment(true); } } + + /** + * make the given alignmentPanel the currently selected tab + * + * @param alignmentPanel + */ + public void setDisplayedView(AlignmentPanel alignmentPanel) + { + if (!viewport.getSequenceSetId().equals( + alignmentPanel.av.getSequenceSetId())) + { + throw new Error( + "Implementation error: cannot show a view from another alignment in an AlignFrame."); + } + if (tabbedPane != null + & alignPanels.indexOf(alignmentPanel) != tabbedPane.getSelectedIndex()) + { + tabbedPane.setSelectedIndex(alignPanels.indexOf(alignmentPanel)); + } + } } class PrintThread extends Thread