Merge branch 'kjvdh/features/PhylogenyViewer' of
authorkjvdheide <kjvanderheide@dundee.ac.uk>
Fri, 17 Nov 2017 13:34:22 +0000 (13:34 +0000)
committerkjvdheide <kjvanderheide@dundee.ac.uk>
Fri, 17 Nov 2017 13:34:22 +0000 (13:34 +0000)
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

16 files changed:
_aptx_jalview_configuration_file.txt
forester
src/jalview/ext/archaeopteryx/Aptx.java [new file with mode: 0644]
src/jalview/ext/archaeopteryx/AptxInit.java [moved from src/jalview/ext/archaeopteryx/ArchaeopteryxInit.java with 94% similarity]
src/jalview/ext/archaeopteryx/AptxTreeBuilder.java [moved from src/jalview/ext/archaeopteryx/ArchaeopteryxTreeBuilder.java with 97% similarity]
src/jalview/ext/archaeopteryx/AptxTreePanel.java [new file with mode: 0644]
src/jalview/ext/archaeopteryx/JalviewBinding.java
src/jalview/ext/archaeopteryx/LoadedTreeAssociation.java
src/jalview/ext/forester/io/TreeParser.java
src/jalview/ext/treeviewer/ExternalTreeParserI.java
src/jalview/ext/treeviewer/ExternalTreeViewerI.java [new file with mode: 0644]
src/jalview/gui/AlignFrame.java
src/jalview/gui/CalculationChooser.java
src/jalview/jbgui/GAlignFrame.java
test/jalview/ext/archaeopteryx/AptxJalviewSequenceTreeTest.java
test/jalview/ext/archaeopteryx/AptxPhylogenyTreeTest.java

index 03788f9..ec248ac 100644 (file)
@@ -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
index b977efb..eb22dac 160000 (submodule)
--- 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 (file)
index 0000000..640dd31
--- /dev/null
@@ -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;
+
+
+  }
+}
@@ -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<Phylogeny, PhylogenyNode> aptxTreeBuilder = new ArchaeopteryxTreeBuilder(
+    ExternalTreeBuilderI<Phylogeny, PhylogenyNode> 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);
@@ -26,7 +26,7 @@ import org.forester.phylogeny.data.Sequence;
  * @author kjvanderheide
  *
  */
-public class ArchaeopteryxTreeBuilder
+public class AptxTreeBuilder
         implements ExternalTreeBuilderI<Phylogeny, PhylogenyNode>
 {
   protected final SequenceI[] sequences;
@@ -45,7 +45,7 @@ public class ArchaeopteryxTreeBuilder
 
   private final Map<PhylogenyNode, SequenceI> 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 (file)
index 0000000..631ff15
--- /dev/null
@@ -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;
+
+  }
+}
index 19a66f8..ee349b6 100644 (file)
@@ -178,12 +178,12 @@ public final class JalviewBinding
   @Override
   public void showMatchingChildSequences(final PhylogenyNode parentNode)
   {
-    final List<PhylogenyNode> childNodes = PhylogenyMethods
+    List<PhylogenyNode> 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<SequenceNode> 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();
+  // }
 }
 
 
index 3255c69..adea693 100644 (file)
@@ -79,6 +79,8 @@ public class LoadedTreeAssociation
 
   }
 
+
+
   public Map<SequenceI, PhylogenyNode> getAlignmentWithNodes()
   {
     return alignmentWithNodes;
index 2c08e99..54f79bc 100644 (file)
@@ -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<MainFrame>
   }
 
   @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<MainFrame>
             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();
+  // }
 
 }
 
index ee466e8..defd744 100644 (file)
@@ -14,5 +14,5 @@ import javax.swing.JInternalFrame;
  */
 public interface ExternalTreeParserI<F extends JInternalFrame>
 {
-  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 (file)
index 0000000..20c47f6
--- /dev/null
@@ -0,0 +1,6 @@
+package jalview.ext.treeviewer;
+
+public interface ExternalTreeViewerI
+{
+
+}
index 5dbfb41..71f240b 100644 (file)
@@ -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);
index 11ee1a0..30a9b3d 100644 (file)
@@ -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);
index 86d0c85..4073fcc 100755 (executable)
@@ -199,7 +199,7 @@ public class GAlignFrame extends JInternalFrame
 
   private boolean showAutoCalculatedAbove = false;
 
-  private Map<KeyStroke, JMenuItem> accelerators = new HashMap<KeyStroke, JMenuItem>();
+  private Map<KeyStroke, JMenuItem> 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.
    * <p>
index 569855c..e7324eb 100644 (file)
@@ -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();
index 921150c..9d62eb1 100644 (file)
@@ -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();