X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAlignFrame.java;h=f8bce9ddd90d766305d55cfebe0920ce83b726c4;hb=4a3def9f59cefe629c9a33d87483283aee085928;hp=d79184242a80a5cafdb1703168e159c40f640450;hpb=a6152ff382c65a2cbd95163478cce7a65b1c641a;p=jalview.git diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index d791842..f8bce9d 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -20,11 +20,11 @@ */ package jalview.gui; -import java.util.Locale; - import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; +import java.awt.Dimension; +import java.awt.GridLayout; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; @@ -59,10 +59,15 @@ import java.util.Deque; import java.util.Enumeration; import java.util.Hashtable; import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Map.Entry; +import java.util.StringTokenizer; import java.util.Vector; import javax.swing.ButtonGroup; import javax.swing.JCheckBoxMenuItem; +import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JEditorPane; import javax.swing.JInternalFrame; @@ -74,6 +79,9 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; +import org.forester.archaeopteryx.webservices.PhylogeniesWebserviceClient; +import org.forester.archaeopteryx.webservices.WebservicesManager; + import ext.vamsas.ServiceHandle; import jalview.analysis.AlignmentSorter; import jalview.analysis.AlignmentUtils; @@ -82,6 +90,7 @@ import jalview.analysis.Dna; import jalview.analysis.GeneticCodeI; import jalview.analysis.ParseProperties; import jalview.analysis.SequenceIdMatcher; +import jalview.analysis.TreeModel; import jalview.api.AlignExportSettingsI; import jalview.api.AlignViewControllerGuiI; import jalview.api.AlignViewControllerI; @@ -91,7 +100,6 @@ import jalview.api.FeatureSettingsControllerI; import jalview.api.FeatureSettingsModelI; import jalview.api.SplitContainerI; import jalview.api.ViewStyleI; -import jalview.api.analysis.SimilarityParamsI; import jalview.bin.Cache; import jalview.bin.Console; import jalview.bin.Jalview; @@ -112,12 +120,18 @@ import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentOrder; import jalview.datamodel.AlignmentView; import jalview.datamodel.ColumnSelection; +import jalview.datamodel.DBRefEntry; import jalview.datamodel.HiddenColumns; import jalview.datamodel.PDBEntry; import jalview.datamodel.SeqCigar; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; +import jalview.ext.archaeopteryx.AptxInit; +import jalview.ext.forester.io.SupportedTreeFileFilter; +import jalview.ext.treeviewer.TreeFrameI; +import jalview.ext.treeviewer.TreeViewerBindingI; +import jalview.ext.treeviewer.TreeViewerUtils; import jalview.gui.ColourMenuHelper.ColourChangeListener; import jalview.gui.ViewSelectionMenu.ViewSetProvider; import jalview.io.AlignmentProperties; @@ -147,6 +161,7 @@ import jalview.schemes.ColourSchemeI; import jalview.schemes.ColourSchemes; import jalview.schemes.ResidueColourScheme; import jalview.schemes.TCoffeeColourScheme; +import jalview.util.DBRefUtils; import jalview.util.HttpUtils; import jalview.util.ImageMaker.TYPE; import jalview.util.MessageManager; @@ -369,8 +384,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, // modifyPID.setEnabled(false); } - String sortby = Cache.getDefault("SORT_ALIGNMENT", - "No sort"); + String sortby = Cache.getDefault("SORT_ALIGNMENT", "No sort"); if (sortby.equals("Id")) { @@ -489,8 +503,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, }); if (Cache.getDefault("VERSION", "DEVELOPMENT").toLowerCase(Locale.ROOT) .indexOf("devel") > -1 - || Cache.getDefault("VERSION", "DEVELOPMENT").toLowerCase(Locale.ROOT) - .indexOf("test") > -1) + || Cache.getDefault("VERSION", "DEVELOPMENT") + .toLowerCase(Locale.ROOT).indexOf("test") > -1) { formatMenu.add(vsel); } @@ -579,7 +593,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } if (viewport.cursorMode) { - alignPanel.getSeqPanel().moveCursor(0, -1,evt.isShiftDown()); + alignPanel.getSeqPanel().moveCursor(0, -1, evt.isShiftDown()); } break; @@ -1638,7 +1652,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * DOCUMENT ME! */ - void updateEditMenuBar() + public void updateEditMenuBar() { if (viewport.getHistoryList().size() > 0) @@ -3747,15 +3761,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, /** * Constructs a tree panel and adds it to the desktop * - * @param type - * tree type (NJ or AV) - * @param modelName - * name of score model used to compute the tree - * @param options - * parameters for the distance or similarity calculation + * @param params + * @param treeAlgo + * + * @param tree + * + * */ - void newTreePanel(String type, String modelName, - SimilarityParamsI options) + void newTreePanel(TreeModel tree, String treeAlgo, + String substitutionMatrix) { String frameTitle = ""; TreePanel tp; @@ -3767,7 +3781,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, SequenceGroup sg = viewport.getSelectionGroup(); /* Decide if the selection is a column region */ - for (SequenceI _s : sg.getSequences()) + for (SequenceI _s : sg.getSequences()) // port this to Archaeopteryx? { if (_s.getLength() < sg.getEndRes()) { @@ -3791,7 +3805,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } - tp = new TreePanel(alignPanel, type, modelName, options); + tp = new TreePanel(alignPanel, tree, treeAlgo, substitutionMatrix); frameTitle = tp.getPanelTitle() + (onSelection ? " on region" : ""); frameTitle += " from "; @@ -3920,6 +3934,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } + /** * Maintain the Order by->Displayed Tree menu. Creates a new menu item for a * TreePanel with an appropriate jalview.analysis.AlignmentSorter @@ -3935,15 +3950,21 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, List comps = PaintRefresher.components .get(viewport.getSequenceSetId()); List treePanels = new ArrayList<>(); + + Map aptxFrames = TreeViewerUtils + .getActiveTreeViews(); + for (Component comp : comps) { + // old treepanels if (comp instanceof TreePanel) { treePanels.add((TreePanel) comp); } + } - if (treePanels.size() < 1) + if (treePanels.isEmpty() && aptxFrames.isEmpty()) { sortByTreeMenu.setVisible(false); return; @@ -3951,6 +3972,42 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, sortByTreeMenu.setVisible(true); + for (Entry aptxFrameWithBinding : aptxFrames + .entrySet()) + { + TreeFrameI aptxFrame = aptxFrameWithBinding.getKey(); + TreeViewerBindingI binding = aptxFrameWithBinding.getValue(); + + // future support for multiple tabs + // for (org.forester.archaeopteryx.TreePanel aptxTree : aptxFrame + // .getMainPanel().getTreePanels()) + { + final JMenuItem item = new JMenuItem( + aptxFrame.getTree().getTreeName()); + + item.addActionListener(new ActionListener() + { + + @Override + public void actionPerformed(ActionEvent e) + { + binding.sortByTree_actionPerformed(); // redundant here?? + addHistoryItem(binding.sortAlignmentIn(alignPanel)); + } + + }); + sortByTreeMenu.add(item); + } + + + + } + + + + + + // old treepanels for (final TreePanel tp : treePanels) { final JMenuItem item = new JMenuItem(tp.getTitle()); @@ -4068,49 +4125,201 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void loadTreeMenuItem_actionPerformed(ActionEvent e) { + chooseTreeFile(); + } + + @Override + protected void loadTreeUrlItem_actionPerformed(ActionEvent e) + { + chooseTreeUrl(); + } + + @Override + protected void loadTreeBaseStudy_actionPerformed(ActionEvent e) + { + chooseTreeDb(0, null); + + } + + @Override + protected void loadTreeBase_actionPerformed(ActionEvent e) + { + chooseTreeDb(1, null); + + } + @Override + protected void loadTreePfam_actionPerformed(ActionEvent e) + { + + // only DBRefs of first sequence are checked for matching DB for now, + // iterating through them all seems excessive + SequenceI seq = viewport.getAlignment().getSequenceAt(0); + String dbId = null; + for (DBRefEntry pfamRef : DBRefUtils + .searchRefsForSource(seq.getDBRefs(), "pfam")) + { + if (pfamRef.getAccessionId().startsWith("PF")) + { + dbId = pfamRef.getAccessionId().replaceAll("[A-Za-z]", ""); + } + + } + chooseTreeDb(2, dbId); + + } + @Override + protected void loadTreeFam_actionPerformed(ActionEvent e) + { + chooseTreeDb(3, null); + + } + + @Override + protected void loadTreeOfLife_actionPerformed(ActionEvent e) + { + chooseTreeDb(4, null); + + } + + + + + + public void chooseTreeFile() + { // Pick the tree file JalviewFileChooser chooser = new JalviewFileChooser( Cache.getProperty("LAST_DIRECTORY")); chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle( - MessageManager.getString("label.select_newick_like_tree_file")); + MessageManager.getString("label.select_tree_file")); // modify chooser.setToolTipText( - MessageManager.getString("label.load_tree_file")); - + MessageManager.getString("label.load_tree_for_sequence_set")); + for (SupportedTreeFileFilter treeFormat : SupportedTreeFileFilter + .values()) + { + chooser.setFileFilter(treeFormat.getTreeFilter()); + } + final AlignFrame us=this; chooser.setResponseHandler(0, new Runnable() { @Override public void run() { - String filePath = chooser.getSelectedFile().getPath(); - Cache.setProperty("LAST_DIRECTORY", filePath); - NewickFile fin = null; - try - { - fin = new NewickFile(new FileParse(chooser.getSelectedFile(), - DataSourceType.FILE)); - viewport.setCurrentTree(showNewickTree(fin, filePath).getTree()); - } catch (Exception ex) - { - JvOptionPane.showMessageDialog(Desktop.desktop, ex.getMessage(), - MessageManager - .getString("label.problem_reading_tree_file"), - JvOptionPane.WARNING_MESSAGE); - ex.printStackTrace(); - } - if (fin != null && fin.hasWarningMessage()) - { - JvOptionPane.showMessageDialog(Desktop.desktop, - fin.getWarningMessage(), - MessageManager.getString( - "label.possible_problem_with_tree_file"), - JvOptionPane.WARNING_MESSAGE); - } + String filePath = chooser.getSelectedFile().getPath(); + Cache.setProperty("LAST_DIRECTORY", filePath); + + + NewickFile fin = null; // old tree + try + { + AptxInit.createInstancesFromFile(filePath, viewport); + + // fin = new NewickFile(filePath, DataSourceType.FILE); + // viewport.setCurrentTree(viewport.getAlignPanel().alignFrame + // .showNewickTree(fin, filePath).getTree()); + + } catch (Exception ex) + { + JvOptionPane.showMessageDialog(us, ex.getMessage(), + MessageManager.getString("label.problem_reading_tree_file"), + JvOptionPane.WARNING_MESSAGE); + ex.printStackTrace(); + } } }); chooser.showOpenDialog(this); } + /** + * Break up and move to TreeParser? + */ + public void chooseTreeUrl() + { + + JLabel label = new JLabel( + MessageManager.getString("label.tree_url_example")); + // add "example" button + final JComboBox history = new JComboBox<>(); + + JPanel panel = new JPanel(new GridLayout(2, 1)); + panel.add(label); + panel.add(history); + history.setPreferredSize(new Dimension(400, 20)); + history.setEditable(true); + history.addItem("http://www."); + + String historyItems = jalview.bin.Cache.getProperty("RECENT_URL"); + + StringTokenizer st; + + if (historyItems != null) + { + st = new StringTokenizer(historyItems, "\t"); + + while (st.hasMoreTokens()) + { + history.addItem(st.nextToken()); + } + } + + int reply = JvOptionPane.showInternalConfirmDialog(this, panel, + MessageManager.getString("label.load_tree_url"), + JvOptionPane.OK_CANCEL_OPTION); + + if (reply == JvOptionPane.OK_OPTION) + { + + String urlString = history.getSelectedItem().toString(); + URL treeUrl; + + try + { + FileFormatI format = null; + + format = new IdentifyFile().identify(urlString, DataSourceType.URL); + // add actual use for the format identification (jalview .jar files) + treeUrl = new URL(urlString); + AptxInit.createInstancesFromUrl(treeUrl, viewport); + + } catch (IOException | RuntimeException e) + { + JvOptionPane.showMessageDialog(this, MessageManager.formatMessage( + "exception.failed_to_read_data_from_source", new String[] + { urlString }), + MessageManager.getString("label.url_not_found"), + JvOptionPane.ERROR_MESSAGE); + e.printStackTrace(); + } + } + else + { + + } + } + + /** + * Disgustingly hardcoded atm. + * + * @param databaseIndex + */ + public void chooseTreeDb(int databaseIndex, String defaultIdentifier) + { + final WebservicesManager webservices_manager = WebservicesManager + .getInstance(); + final PhylogeniesWebserviceClient client = webservices_manager + .getAvailablePhylogeniesWebserviceClient(databaseIndex); + String identifier = JvOptionPane + .showInternalInputDialog(Desktop.desktop, + client.getInstructions() + "\n(Reference: " + + client.getReference() + ")", + client.getDescription(), JvOptionPane.QUESTION_MESSAGE, + null, null, defaultIdentifier) + .toString(); + + AptxInit.createInstancesFromDb(client, identifier, viewport); + } + public TreePanel showNewickTree(NewickFile nf, String treeTitle) { return showNewickTree(nf, treeTitle, 600, 500, 4, 5); @@ -4174,6 +4383,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, private boolean buildingMenu = false; + public void BuildTreeDbMenu() + { + + } /** * Generates menu items and listener event actions for web service clients * @@ -4226,6 +4439,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, final JMenu seqsrchmenu = new JMenu("Sequence Database Search"); final JMenu analymenu = new JMenu("Analysis"); final JMenu dismenu = new JMenu("Protein Disorder"); + final JMenu phylogenmenu = new JMenu("Phylogenetic inference"); + // JAL-940 - only show secondary structure prediction services from // the legacy server if (// Cache.getDefault("SHOW_JWS1_SERVICES", true) @@ -4265,6 +4480,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, wsmenu.add(secstrmenu); wsmenu.add(dismenu); wsmenu.add(analymenu); + wsmenu.add(phylogenmenu); // No search services yet // wsmenu.add(seqsrchmenu); @@ -4306,7 +4522,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, jws2servs.attachWSMenuEntry(webService, me); for (Jws2Instance sv : jws2servs.getServices()) { - if (sv.description.toLowerCase(Locale.ROOT).contains("jpred")) + if (sv.description.toLowerCase(Locale.ROOT) + .contains("jpred")) { for (JMenuItem jmi : legacyItems) { @@ -4371,7 +4588,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } buildingMenu = false; } - }).start(); + }, "BuildWebService").start(); } @@ -4479,7 +4696,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, protected void showProductsFor(final SequenceI[] sel, final boolean _odna, final String source) { - new Thread(CrossRefAction.getHandlerFor(sel, _odna, source, this)) + new Thread(CrossRefAction.getHandlerFor(sel, _odna, source, this), + "CrossReferences") .start(); } @@ -4498,8 +4716,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, al = dna.translateCdna(codeTable); } catch (Exception ex) { - Console.error( - "Exception during translation. Please report this !", ex); + Console.error("Exception during translation. Please report this !", + ex); final String msg = MessageManager.getString( "label.error_when_translating_sequences_submit_bug_report"); final String errorTitle = MessageManager @@ -4788,7 +5006,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, ex.printStackTrace(); } } - }).start(); + }, "DropFile").start(); } } @@ -5187,7 +5405,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, }); dbRefFetcher.fetchDBRefs(false); } - }).start(); + }, "BuildFetchDBMenu").start(); }