From: kjvdheide Date: Fri, 17 Nov 2017 13:34:22 +0000 (+0000) Subject: Merge branch 'kjvdh/features/PhylogenyViewer' of X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=91bea2a1185e438bfd52fc1848cf615068016192;hp=7907e8826153967e245c409b3fc39876f92fb53b;p=jalview.git Merge branch 'kjvdh/features/PhylogenyViewer' of https://source.jalview.org/git/jalview.git into kjvdh/features/PhylogenyViewer Conflicts: src/jalview/ext/archaeopteryx/AptxBinding.java src/jalview/ext/forester/io/ExternalTreeParserI.java src/jalview/ext/forester/io/ForesterTreeParser.java --- diff --git a/_aptx_jalview_configuration_file.txt b/_aptx_jalview_configuration_file.txt index 03788f9..ec248ac 100644 --- a/_aptx_jalview_configuration_file.txt +++ b/_aptx_jalview_configuration_file.txt @@ -266,7 +266,7 @@ click_to: select_nodes display click_to: get_ext_descendents_data display # Default click-to option (any of the above if set to "display") -default_click_to: display_node_data +default_click_to: select_nodes @@ -283,8 +283,8 @@ display_color: branch 0x000000 display_color: node_box 0x000000 display_color: collapsed 0x000000 display_color: matching_a 0xCC6600 -display_color: matching_b 0x0000CC -display_color: matching_a_and_b 0xCC70CC +display_color: matching_b 0xCC70CC +display_color: matching_a_and_b 0x0000CC display_color: duplication 0xFF00FF display_color: speciation 0xFFFF00 display_color: duplication_or_specation 0xFFAA20 diff --git a/forester b/forester index b977efb..eb22dac 160000 --- a/forester +++ b/forester @@ -1 +1 @@ -Subproject commit b977efb66f2d0b539bd433e80762737925035edc +Subproject commit eb22dac14771c467104f57362e3a624d0140f897 diff --git a/src/jalview/ext/archaeopteryx/Aptx.java b/src/jalview/ext/archaeopteryx/Aptx.java new file mode 100644 index 0000000..640dd31 --- /dev/null +++ b/src/jalview/ext/archaeopteryx/Aptx.java @@ -0,0 +1,17 @@ +package jalview.ext.archaeopteryx; + +import jalview.ext.treeviewer.ExternalTreeViewerI; + +import org.forester.archaeopteryx.MainFrame; + +public class Aptx implements ExternalTreeViewerI +{ + private final MainFrame aptxApp; + + public Aptx(MainFrame aptx) + { + aptxApp = aptx; + + + } +} diff --git a/src/jalview/ext/archaeopteryx/ArchaeopteryxInit.java b/src/jalview/ext/archaeopteryx/AptxInit.java similarity index 94% rename from src/jalview/ext/archaeopteryx/ArchaeopteryxInit.java rename to src/jalview/ext/archaeopteryx/AptxInit.java index 602d472..ce34573 100644 --- a/src/jalview/ext/archaeopteryx/ArchaeopteryxInit.java +++ b/src/jalview/ext/archaeopteryx/AptxInit.java @@ -22,7 +22,7 @@ import org.forester.phylogeny.PhylogenyNode; * @author kjvanderheide * */ -public final class ArchaeopteryxInit +public final class AptxInit { /** * Test method, should generally not be used as it does not bind the tree to @@ -56,7 +56,7 @@ public final class ArchaeopteryxInit public static MainFrame createInstance( final TreeBuilder calculatedTree) // very dense method, to be split up { - ExternalTreeBuilderI aptxTreeBuilder = new ArchaeopteryxTreeBuilder( + ExternalTreeBuilderI aptxTreeBuilder = new AptxTreeBuilder( calculatedTree); Phylogeny aptxTree = aptxTreeBuilder.buildTree(); @@ -99,6 +99,8 @@ public final class ArchaeopteryxInit int width = 400; int height = 550; aptxApp.setMinimumSize(new Dimension(width, height)); + // aptxApp.setFont(Desktop.instance.getFont()); + // aptxApp.getMainPanel().setFont(Desktop.instance.getFont()); Desktop.addInternalFrame(aptxApp, "Archaeopteryx Tree View", true, width, height, true, true); diff --git a/src/jalview/ext/archaeopteryx/ArchaeopteryxTreeBuilder.java b/src/jalview/ext/archaeopteryx/AptxTreeBuilder.java similarity index 97% rename from src/jalview/ext/archaeopteryx/ArchaeopteryxTreeBuilder.java rename to src/jalview/ext/archaeopteryx/AptxTreeBuilder.java index 7a2ee64..7b03d5c 100644 --- a/src/jalview/ext/archaeopteryx/ArchaeopteryxTreeBuilder.java +++ b/src/jalview/ext/archaeopteryx/AptxTreeBuilder.java @@ -26,7 +26,7 @@ import org.forester.phylogeny.data.Sequence; * @author kjvanderheide * */ -public class ArchaeopteryxTreeBuilder +public class AptxTreeBuilder implements ExternalTreeBuilderI { protected final SequenceI[] sequences; @@ -45,7 +45,7 @@ public class ArchaeopteryxTreeBuilder private final Map nodesWithAlignment; - public ArchaeopteryxTreeBuilder(final TreeBuilder calculatedTree) + public AptxTreeBuilder(final TreeBuilder calculatedTree) { jalviewTree = calculatedTree; sequences = jalviewTree.getSequences(); diff --git a/src/jalview/ext/archaeopteryx/AptxTreePanel.java b/src/jalview/ext/archaeopteryx/AptxTreePanel.java new file mode 100644 index 0000000..631ff15 --- /dev/null +++ b/src/jalview/ext/archaeopteryx/AptxTreePanel.java @@ -0,0 +1,14 @@ +package jalview.ext.archaeopteryx; + +import jalview.ext.treeviewer.ExternalTreePanelI; + +public class AptxTreePanel implements ExternalTreePanelI +{ + private final org.forester.archaeopteryx.TreePanel treeView; + + public AptxTreePanel(org.forester.archaeopteryx.TreePanel aptxTreePanel) + { + treeView = aptxTreePanel; + + } +} diff --git a/src/jalview/ext/archaeopteryx/JalviewBinding.java b/src/jalview/ext/archaeopteryx/JalviewBinding.java index 19a66f8..ee349b6 100644 --- a/src/jalview/ext/archaeopteryx/JalviewBinding.java +++ b/src/jalview/ext/archaeopteryx/JalviewBinding.java @@ -178,12 +178,12 @@ public final class JalviewBinding @Override public void showMatchingChildSequences(final PhylogenyNode parentNode) { - final List childNodes = PhylogenyMethods + List childNodes = PhylogenyMethods .getAllDescendants(parentNode); - // final BranchColor branchColor = new BranchColor(); for (PhylogenyNode childNode : childNodes) { + SequenceI matchingSequence = nodesBoundToSequences.get(childNode); if (matchingSequence != null) { @@ -227,7 +227,79 @@ public final class JalviewBinding { this.parentAvport = parentAvport; } - + // av.setCurrentTree(tree); + // + // /* + // * isPopupTrigger is set for mousePressed (Mac) + // * or mouseReleased (Windows) + // */ + // if (e.isPopupTrigger()) + // { + // if (highlightNode != null) + // { + // chooseSubtreeColour(); + // } + // return; + // } + // + // /* + // * defer right-click handling on Windows to + // * mouseClicked; note isRightMouseButton + // * also matches Cmd-click on Mac which should do + // * nothing here + // */ + // if (SwingUtilities.isRightMouseButton(e)) + // { + // return; + // } + // + // int x = e.getX(); + // int y = e.getY(); + // + // Object ob = findElement(x, y); + // + // if (ob instanceof SequenceI) + // { + // treeSelectionChanged((Sequence) ob); + // PaintRefresher.Refresh(tp, ap.av.getSequenceSetId()); + // repaint(); + // av.sendSelection(); + // return; + // } + // else if (!(ob instanceof SequenceNode)) + // { + // // Find threshold + // if (tree.getMaxHeight() != 0) + // { + // threshold = (float) (x - offx) + // / (float) (getWidth() - labelLength - (2 * offx)); + // + // List groups = tree.groupNodes(threshold); + // setColor(tree.getTopNode(), Color.black); + // + // AlignmentPanel[] aps = getAssociatedPanels(); + // + // // TODO push calls below into a single AlignViewportI method? + // // see also AlignViewController.deleteGroups + // for (int a = 0; a < aps.length; a++) + // { + // aps[a].av.setSelectionGroup(null); + // aps[a].av.getAlignment().deleteAllGroups(); + // aps[a].av.clearSequenceColours(); + // if (aps[a].av.getCodingComplement() != null) + // { + // aps[a].av.getCodingComplement().setSelectionGroup(null); + // aps[a].av.getCodingComplement().getAlignment() + // .deleteAllGroups(); + // aps[a].av.getCodingComplement().clearSequenceColours(); + // } + // } + // colourGroups(groups); + // } + // + // PaintRefresher.Refresh(tp, ap.av.getSequenceSetId()); + // repaint(); + // } } diff --git a/src/jalview/ext/archaeopteryx/LoadedTreeAssociation.java b/src/jalview/ext/archaeopteryx/LoadedTreeAssociation.java index 3255c69..adea693 100644 --- a/src/jalview/ext/archaeopteryx/LoadedTreeAssociation.java +++ b/src/jalview/ext/archaeopteryx/LoadedTreeAssociation.java @@ -79,6 +79,8 @@ public class LoadedTreeAssociation } + + public Map getAlignmentWithNodes() { return alignmentWithNodes; diff --git a/src/jalview/ext/forester/io/TreeParser.java b/src/jalview/ext/forester/io/TreeParser.java index 2c08e99..54f79bc 100644 --- a/src/jalview/ext/forester/io/TreeParser.java +++ b/src/jalview/ext/forester/io/TreeParser.java @@ -1,8 +1,8 @@ package jalview.ext.forester.io; +import jalview.ext.archaeopteryx.AptxInit; import jalview.ext.archaeopteryx.JalviewBinding; import jalview.ext.archaeopteryx.LoadedTreeAssociation; -import jalview.ext.archaeopteryx.ArchaeopteryxInit; import jalview.ext.treeviewer.ExternalTreeParserI; import jalview.gui.Desktop; import jalview.gui.JvOptionPane; @@ -53,7 +53,7 @@ public class TreeParser implements ExternalTreeParserI } @Override - public MainFrame loadTree(AlignmentViewport viewport) + public MainFrame loadTreeFile(AlignmentViewport viewport) { String[] AptxArgs = new String[] { "-c", "_aptx_jalview_configuration_file", filePath }; @@ -64,15 +64,100 @@ public class TreeParser implements ExternalTreeParserI aptx.getMainPanel().getCurrentTreePanel().getPhylogeny()); bindAptxNodes.associateLeavesToSequences(); + new JalviewBinding(aptx, viewport, bindAptxNodes.getAlignmentWithNodes(), bindAptxNodes.getNodesWithAlignment()); - ArchaeopteryxInit.bindFrameToJalview(aptx); + AptxInit.bindFrameToJalview(aptx); return aptx; } + // + // void readPhylogeniesFromURL() { + // URL url = null; + // Phylogeny[] phys = null; + // final String message = "Please enter a complete URL, for example + // \"http://purl.org/phylo/treebase/phylows/study/TB2:S15480?format=nexus\""; + // final String url_string = JOptionPane + // .showInputDialog( this, + // message, + // "Use URL/webservice to obtain a phylogeny", + // JOptionPane.QUESTION_MESSAGE ); + // boolean nhx_or_nexus = false; + // if ( ( url_string != null ) && ( url_string.length() > 0 ) ) { + // try { + // url = new URL( url_string ); + // PhylogenyParser parser = null; + // if ( url.getHost().toLowerCase().indexOf( "tolweb" ) >= 0 ) { + // parser = new TolParser(); + // } + // else { + // parser = ParserUtils + // .createParserDependingOnUrlContents( url, + // getConfiguration().isValidatePhyloXmlAgainstSchema() ); + // } + // if ( parser instanceof NexusPhylogeniesParser ) { + // nhx_or_nexus = true; + // } + // else if ( parser instanceof NHXParser ) { + // nhx_or_nexus = true; + // } + // if ( _mainpanel.getCurrentTreePanel() != null ) { + // _mainpanel.getCurrentTreePanel().setWaitCursor(); + // } + // else { + // _mainpanel.setWaitCursor(); + // } + // final PhylogenyFactory factory = ParserBasedPhylogenyFactory.getInstance(); + // phys = factory.create( url.openStream(), parser ); + // } + // catch ( final MalformedURLException e ) { + // JOptionPane.showMessageDialog( this, + // "Malformed URL: " + url + "\n" + e.getLocalizedMessage(), + // "Malformed URL", + // JOptionPane.ERROR_MESSAGE ); + // } + // catch ( final IOException e ) { + // JOptionPane.showMessageDialog( this, + // "Could not read from " + url + "\n" + // + ForesterUtil.wordWrap( e.getLocalizedMessage(), 80 ), + // "Failed to read URL", + // JOptionPane.ERROR_MESSAGE ); + // } + // catch ( final Exception e ) { + // JOptionPane.showMessageDialog( this, + // ForesterUtil.wordWrap( e.getLocalizedMessage(), 80 ), + // "Unexpected Exception", + // JOptionPane.ERROR_MESSAGE ); + // } + // finally { + // if ( _mainpanel.getCurrentTreePanel() != null ) { + // _mainpanel.getCurrentTreePanel().setArrowCursor(); + // } + // else { + // _mainpanel.setArrowCursor(); + // } + // } + // if ( ( phys != null ) && ( phys.length > 0 ) ) { + // if ( nhx_or_nexus && + // getOptions().isInternalNumberAreConfidenceForNhParsing() ) { + // for( final Phylogeny phy : phys ) { + // PhylogenyMethods.transferInternalNodeNamesToConfidence( phy, "" ); + // } + // } + // AptxUtil.addPhylogeniesToTabs( phys, + // new File( url.getFile() ).getName(), + // new File( url.getFile() ).toString(), + // getConfiguration(), + // getMainPanel() ); + // _mainpanel.getControlPanel().showWhole(); + // } + // } + // activateSaveAllIfNeeded(); + // System.gc(); + // } } diff --git a/src/jalview/ext/treeviewer/ExternalTreeParserI.java b/src/jalview/ext/treeviewer/ExternalTreeParserI.java index ee466e8..defd744 100644 --- a/src/jalview/ext/treeviewer/ExternalTreeParserI.java +++ b/src/jalview/ext/treeviewer/ExternalTreeParserI.java @@ -14,5 +14,5 @@ import javax.swing.JInternalFrame; */ public interface ExternalTreeParserI { - public F loadTree(AlignmentViewport viewport); + public F loadTreeFile(AlignmentViewport viewport); } diff --git a/src/jalview/ext/treeviewer/ExternalTreeViewerI.java b/src/jalview/ext/treeviewer/ExternalTreeViewerI.java new file mode 100644 index 0000000..20c47f6 --- /dev/null +++ b/src/jalview/ext/treeviewer/ExternalTreeViewerI.java @@ -0,0 +1,6 @@ +package jalview.ext.treeviewer; + +public interface ExternalTreeViewerI +{ + +} diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 5dbfb41..71f240b 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -60,8 +60,8 @@ import jalview.datamodel.SeqCigar; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; -import jalview.ext.forester.io.TreeParser; import jalview.ext.forester.io.SupportedTreeFileFilter; +import jalview.ext.forester.io.TreeParser; import jalview.ext.treeviewer.ExternalTreeParserI; import jalview.gui.ColourMenuHelper.ColourChangeListener; import jalview.gui.ViewSelectionMenu.ViewSetProvider; @@ -3906,7 +3906,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { ExternalTreeParserI treeParser = new TreeParser( filePath); - treeParser.loadTree(viewport); + treeParser.loadTreeFile(viewport); @@ -3930,6 +3930,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } } + @Override + protected void loadTreeUrlItem_actionPerformed(ActionEvent e) + { + + } + + @Override + protected void loadTreeDbItem_actionPerformed(ActionEvent e) + { + + } + public TreePanel showNewickTree(NewickFile nf, String treeTitle) { return showNewickTree(nf, treeTitle, 600, 500, 4, 5); diff --git a/src/jalview/gui/CalculationChooser.java b/src/jalview/gui/CalculationChooser.java index 11ee1a0..30a9b3d 100644 --- a/src/jalview/gui/CalculationChooser.java +++ b/src/jalview/gui/CalculationChooser.java @@ -28,7 +28,7 @@ import jalview.analysis.scoremodels.SimilarityParams; import jalview.api.analysis.ScoreModelI; import jalview.api.analysis.SimilarityParamsI; import jalview.datamodel.SequenceGroup; -import jalview.ext.archaeopteryx.ArchaeopteryxInit; +import jalview.ext.archaeopteryx.AptxInit; import jalview.util.MessageManager; import java.awt.BorderLayout; @@ -497,7 +497,7 @@ public class CalculationChooser extends JPanel substitutionMatrix, params); TreeBuilder calculatedTree = treeCalculator.makeTree(af.getViewport()); - ArchaeopteryxInit.createInstance(calculatedTree); + AptxInit.createInstance(calculatedTree); TreeModel tree = new TreeModel(calculatedTree); openTreePanel(tree, treeAlgo, substitutionMatrix); diff --git a/src/jalview/jbgui/GAlignFrame.java b/src/jalview/jbgui/GAlignFrame.java index 86d0c85..4073fcc 100755 --- a/src/jalview/jbgui/GAlignFrame.java +++ b/src/jalview/jbgui/GAlignFrame.java @@ -199,7 +199,7 @@ public class GAlignFrame extends JInternalFrame private boolean showAutoCalculatedAbove = false; - private Map accelerators = new HashMap(); + private Map accelerators = new HashMap<>(); private SplitContainerI splitFrame; @@ -1077,11 +1077,11 @@ public class GAlignFrame extends JInternalFrame } }); - JMenuItem loadTreeMenuItem = new JMenuItem( - MessageManager.getString("label.load_associated_tree")); - loadTreeMenuItem.setActionCommand( - MessageManager.getString("label.load_tree_for_sequence_set")); - loadTreeMenuItem.addActionListener(new ActionListener() + JMenuItem loadTreeFile = new JMenuItem( + MessageManager.getString("label.from_file")); + // loadTreeMenuItem.setActionCommand( + // MessageManager.getString()); + loadTreeFile.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) @@ -1090,6 +1090,28 @@ public class GAlignFrame extends JInternalFrame } }); + JMenuItem loadTreeUrl = new JMenuItem( + MessageManager.getString("label.from_url")); + loadTreeUrl.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + loadTreeUrlItem_actionPerformed(e); + } + }); + + JMenuItem loadTreeDb = new JMenuItem( + MessageManager.getString("FIX ME")); + loadTreeDb.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + loadTreeDbItem_actionPerformed(e); + } + }); + scaleAbove.setVisible(false); scaleAbove.setText(MessageManager.getString("action.scale_above")); scaleAbove.addActionListener(new ActionListener() @@ -1683,7 +1705,16 @@ public class GAlignFrame extends JInternalFrame JMenu exportImageMenu = new JMenu( MessageManager.getString("label.export_image")); + JMenu loadTreeMenu = new JMenu( + MessageManager.getString("label.load_associated_tree")); + loadTreeMenu.setActionCommand("label.load_tree_for_sequence_set"); + JMenu fileMenu = new JMenu(MessageManager.getString("action.file")); + + loadTreeMenu.add(loadTreeFile); + loadTreeMenu.add(loadTreeUrl); + loadTreeMenu.add(loadTreeDb); + alignFrameMenuBar.add(fileMenu); alignFrameMenuBar.add(editMenu); alignFrameMenuBar.add(selectMenu); @@ -1708,7 +1739,7 @@ public class GAlignFrame extends JInternalFrame fileMenu.add(exportImageMenu); fileMenu.add(exportFeatures); fileMenu.add(exportAnnotations); - fileMenu.add(loadTreeMenuItem); + fileMenu.add(loadTreeMenu); fileMenu.add(associatedData); fileMenu.addSeparator(); fileMenu.add(closeMenuItem); @@ -2368,6 +2399,16 @@ public class GAlignFrame extends JInternalFrame } + protected void loadTreeUrlItem_actionPerformed(ActionEvent e) + { + + } + + protected void loadTreeDbItem_actionPerformed(ActionEvent e) + { + + } + /** * Template method to handle the 'load T-Coffee scores' menu event. *

diff --git a/test/jalview/ext/archaeopteryx/AptxJalviewSequenceTreeTest.java b/test/jalview/ext/archaeopteryx/AptxJalviewSequenceTreeTest.java index 569855c..e7324eb 100644 --- a/test/jalview/ext/archaeopteryx/AptxJalviewSequenceTreeTest.java +++ b/test/jalview/ext/archaeopteryx/AptxJalviewSequenceTreeTest.java @@ -60,7 +60,7 @@ public class AptxJalviewSequenceTreeTest extends TreeViewTest @BeforeClass(dependsOnMethods = { "setUpTree" }) public void createTreeView() { - treeView = ArchaeopteryxInit.createInstance(jalviewTree); + treeView = AptxInit.createInstance(jalviewTree); aptx = (MainFrame) treeView; // still pretty ugly treePanel = aptx.getMainPanel().getCurrentTreePanel(); diff --git a/test/jalview/ext/archaeopteryx/AptxPhylogenyTreeTest.java b/test/jalview/ext/archaeopteryx/AptxPhylogenyTreeTest.java index 921150c..9d62eb1 100644 --- a/test/jalview/ext/archaeopteryx/AptxPhylogenyTreeTest.java +++ b/test/jalview/ext/archaeopteryx/AptxPhylogenyTreeTest.java @@ -61,7 +61,7 @@ public class AptxPhylogenyTreeTest extends TreeViewTest @BeforeClass(dependsOnMethods = { "setUpJalview", "setUpTree" }) public void createTreeView() { - treeView = ArchaeopteryxInit.createUnboundInstance(inputTree); + treeView = AptxInit.createUnboundInstance(inputTree); aptx = (MainFrame) treeView; // pretty ugly treePanel = aptx.getMainPanel().getCurrentTreePanel(); tree = treePanel.getPhylogeny();