X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Farchaeopteryx%2FJalviewBinding.java;h=9296583bf323b4560e3d95c53baed1a4eecfe23a;hb=1b3cfcaa6095f0f83c7faefacd75efebbfae8710;hp=11aab2bad3a8bea7206d6796b9fea0fea4931503;hpb=b39c593c3799dc8a2ec799ce015c86d201d43da7;p=jalview.git diff --git a/src/jalview/ext/archaeopteryx/JalviewBinding.java b/src/jalview/ext/archaeopteryx/JalviewBinding.java index 11aab2b..9296583 100644 --- a/src/jalview/ext/archaeopteryx/JalviewBinding.java +++ b/src/jalview/ext/archaeopteryx/JalviewBinding.java @@ -5,11 +5,18 @@ import jalview.analysis.Conservation; import jalview.api.AlignViewportI; import jalview.commands.CommandI; import jalview.commands.OrderCommand; +import jalview.datamodel.AlignmentI; import jalview.datamodel.ColumnSelection; import jalview.datamodel.HiddenColumns; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; -import jalview.ext.treeviewer.ExternalTreeViewerBindingI; +import jalview.ext.treeviewer.LoadedTreeSequenceAssociation; +import jalview.ext.treeviewer.TreeFrameI; +import jalview.ext.treeviewer.TreeI; +import jalview.ext.treeviewer.TreeNodeI; +import jalview.ext.treeviewer.TreePanelI; +import jalview.ext.treeviewer.TreeViewerBindingI; +import jalview.ext.treeviewer.TreeViewerUtils; import jalview.gui.AlignViewport; import jalview.gui.AlignmentPanel; import jalview.gui.Desktop; @@ -25,6 +32,7 @@ import jalview.util.MessageManager; import jalview.viewmodel.AlignmentViewport; import java.awt.Color; +import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; @@ -34,19 +42,10 @@ import java.util.List; import java.util.Map; import java.util.Set; -import javax.swing.JTabbedPane; import javax.swing.SwingUtilities; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import javax.swing.event.InternalFrameAdapter; import javax.swing.event.InternalFrameEvent; -import org.forester.archaeopteryx.MainFrame; -import org.forester.phylogeny.Phylogeny; -import org.forester.phylogeny.PhylogenyMethods; -import org.forester.phylogeny.PhylogenyNode; -import org.forester.phylogeny.data.BranchColor; - /** * Class for binding the Archaeopteryx tree viewer to the Jalview alignment that * it originates from, meaning that selecting sequences in the tree viewer also @@ -56,23 +55,19 @@ import org.forester.phylogeny.data.BranchColor; * */ public final class JalviewBinding - implements ExternalTreeViewerBindingI + implements TreeViewerBindingI { - private final MainFrame aptxFrame; + private final TreeFrameI aptxFrame; - private org.forester.archaeopteryx.TreePanel treeView; + private TreePanelI treeView; private AlignmentViewport parentAvport; - private final JTabbedPane treeTabs; - private final StructureSelectionManager ssm; - private AlignmentPanel[] associatedPanels; + private Map sequencesBoundToNodes; - private Map sequencesBoundToNodes; - - private Map nodesBoundToSequences; + private Map nodesBoundToSequences; private float rootX; @@ -97,13 +92,13 @@ public final class JalviewBinding * map with tree nodes and matching sequences used to calculate the * tree as key, value pair respectively. */ - public JalviewBinding(final MainFrame archaeopteryx, + public JalviewBinding(final TreeFrameI archaeopteryx, final AlignmentViewport jalviewAlignmentViewport, - final Map alignMappedToNodes, - final Map nodesMappedToAlign) + final Map alignMappedToNodes, + final Map nodesMappedToAlign) { - if (archaeopteryx.getMainPanel().getTabbedPane().getTabCount() > 1) + if (archaeopteryx.getNumberOfTrees() > 1) { JvOptionPane.showMessageDialog(Desktop.desktop, MessageManager.getString("label.tabs_detected_archaeopteryx"), @@ -118,74 +113,74 @@ public final class JalviewBinding sequencesBoundToNodes = alignMappedToNodes; nodesBoundToSequences = nodesMappedToAlign; - treeView = archaeopteryx.getMainPanel().getCurrentTreePanel(); - treeTabs = archaeopteryx.getMainPanel().getTabbedPane(); + treeView = archaeopteryx.getTreePanel(); ssm = parentAvport.getStructureSelectionManager(); ssm.addSelectionListener(this); treeView.addMouseListener(this); + treeView.registerWithPaintRefresher( + parentAvport.getSequenceSetId()); - PaintRefresher.Register(treeView, parentAvport.getSequenceSetId()); - associatedPanels = PaintRefresher - .getAssociatedPanels(parentAvport.getSequenceSetId()); - - aptxFrame.addInternalFrameListener(new InternalFrameAdapter() + aptxFrame.addFrameListener(new InternalFrameAdapter() { @Override public void internalFrameClosed(InternalFrameEvent e) { - AptxInit.getAllAptxFrames().remove(aptxFrame); + TreeViewerUtils.getActiveTreeViews().remove(aptxFrame); ssm.removeSelectionListener(JalviewBinding.this); } }); - treeTabs.addChangeListener(new ChangeListener() - { - - @Override - public void stateChanged(ChangeEvent e) - { - - SwingUtilities.invokeLater(new Runnable() - { - - @Override - /** - * Resend the selection to the tree view when tabs get switched, this - * has to be buried in invokeLater as Forester first resets the tree - * view on switching tabs, without invokeLater this would get called - * before Forester resets which would nullify the selection. - */ - public void run() - { - treeView = archaeopteryx.getMainPanel().getCurrentTreePanel(); - parentAvport.sendSelection(); - // PaintRefresher.Refresh(treeView, - // parentAvport.getSequenceSetId()); - - } - }); - - } - - }); + // treeTabs.addChangeListener(new ChangeListener() + // { + // + // @Override + // public void stateChanged(ChangeEvent e) + // { + // + // SwingUtilities.invokeLater(new Runnable() + // { + // + // @Override + // /** + // * Resend the selection to the tree view when tabs get switched, this + // * has to be buried in invokeLater as Forester first resets the tree + // * view on switching tabs, without invokeLater this would get called + // * before Forester resets which would nullify the selection. + // */ + // public void run() + // { + // treeView = archaeopteryx.getMainPanel().getCurrentTreePanel(); + // parentAvport.sendSelection(); + // // PaintRefresher.Refresh(treeView, + // // parentAvport.getSequenceSetId()); + // + // } + // }); + // + // } + // + // }); } @Override public void actionPerformed(ActionEvent e) { - if (treeView.isCurrentTreeIsSubtree()) + // reset hidden sequences first + parentAvport.showAllHiddenSeqs(); + + if (treeView.showingSubTree()) { LoadedTreeSequenceAssociation bindAptxNodes = new LoadedTreeSequenceAssociation( parentAvport.getAlignment().getSequencesArray(), - treeView.getPhylogeny()); + treeView.getTree()); bindAptxNodes.associateLeavesToSequences(); sequencesBoundToNodes = bindAptxNodes.getAlignmentWithNodes(); nodesBoundToSequences = bindAptxNodes.getNodesWithAlignment(); - AptxInit.bindNodesToJalviewSequences(aptxFrame, parentAvport, + TreeViewerUtils.associateNodesWithJalviewSequences(aptxFrame, parentAvport, sequencesBoundToNodes, nodesBoundToSequences); @@ -198,6 +193,27 @@ public final class JalviewBinding } } + else + { + + Rectangle visibleView = treeView.getVisibleArea(); + + for (TreeNodeI node : treeView.getTree().getRoot() + .getAllDescendants()) + { + if (!(node.getXcoord() > visibleView.getMinX() + && node.getXcoord() < visibleView.getMaxX() + && node.getYcoord() > visibleView.getMinY() + && node.getYcoord() < visibleView.getMaxY())) + { + parentAvport + .hideSequence(new SequenceI[] + { nodesBoundToSequences.get(node) }); + } + } + + } + } @@ -213,9 +229,8 @@ public final class JalviewBinding */ public void run() { - - - final PhylogenyNode node = treeView.findNode(e.getX(), e.getY()); + final TreeNodeI node = treeView.findNode(e.getX(), + e.getY()); if (node != null) { if ((e.getModifiers() & InputEvent.SHIFT_MASK) == 0) // clear previous @@ -226,14 +241,14 @@ public final class JalviewBinding } showNodeSelectionOnAlign(node); - } else { - partitionTree(e.getX()); + partitionTree(e.getX()); } - PaintRefresher.Refresh(treeView, parentAvport.getSequenceSetId()); + treeView.notifyPaintRefresher(parentAvport.getSequenceSetId(), + false, false); treeView.repaint(); @@ -273,26 +288,27 @@ public final class JalviewBinding if (source == parentAvport) // check if source is alignment from where the // tree originates { - treeView.setFoundNodes0( + treeView.setMatchingNodes( new HashSet(seqsel.getSequences().size())); for (SequenceI selectedSequence : seqsel.getSequences()) { - PhylogenyNode matchingNode = sequencesBoundToNodes.get(selectedSequence); + TreeNodeI matchingNode = sequencesBoundToNodes + .get(selectedSequence); if (matchingNode != null) { - treeView.getFoundNodes0().add(matchingNode.getId()); + treeView.getMatchingNodes().add(matchingNode.getId()); - if (!matchingNode.getBranchData().isHasBranchColor()) - { - // Color foundNodesColour = treeView.getTreeColorSet() - // .getFoundColor0(); - // matchingNode.getBranchData() - // .setBranchColor(new BranchColor(foundNodesColour)); - - } + // if (!matchingNode.getBranchData().isHasBranchColor()) + // { + // // Color foundNodesColour = treeView.getTreeColorSet() + // // .getFoundColor0(); + // // matchingNode.getBranchData() + // // .setBranchColor(new BranchColor(foundNodesColour)); + // + // } } @@ -309,36 +325,39 @@ public final class JalviewBinding */ public void partitionTree(final int x) { - Phylogeny tree = treeView.getPhylogeny(); + TreeI tree = treeView.getTree(); if (!tree.isEmpty()) { // should be calculated on each partition as the tree can theoretically // change in the meantime - PhylogenyNode furthestNode = PhylogenyMethods - .calculateNodeWithMaxDistanceToRoot(tree); + TreeNodeI furthestNode = tree.getFurthestNode(); furthestNodeX = furthestNode.getXcoord(); rootX = tree.getRoot().getXcoord(); - // don't bother if 0 distance tree or clicked x lies outside of tree if (furthestNodeX != rootX && !(x > furthestNodeX)) { float threshold = (x - rootX) / (furthestNodeX - rootX); - List foundNodes = getNodesAboveThreshold(threshold, + List foundNodes = getNodesAboveThreshold( + threshold, tree.getRoot()); } + else + { + // clear previous colours? + } } } - public List getNodesAboveThreshold(double threshold, - PhylogenyNode node) + public List getNodesAboveThreshold(double threshold, + TreeNodeI node) { - List nodesAboveThreshold = new ArrayList<>(); + List nodesAboveThreshold = new ArrayList<>(); parentAvport.setSelectionGroup(null); parentAvport.getAlignment().deleteAllGroups(); @@ -366,15 +385,14 @@ public final class JalviewBinding * @param node * @return */ - private List colourNodesAboveThreshold( - List nodeList, double threshold, - PhylogenyNode node) + private List colourNodesAboveThreshold( + List nodeList, double threshold, + TreeNodeI node) { - for (PhylogenyNode childNode : node.getDescendants()) + for (TreeNodeI childNode : node.getDirectChildren()) { - childNode.getBranchData() - .setBranchColor(new BranchColor(Color.black)); + childNode.setBranchColor(Color.black); float nodeCutoff = (childNode.getXcoord() - rootX) / (furthestNodeX - rootX); @@ -384,8 +402,7 @@ public final class JalviewBinding Color randomColour = new Color((int) (Math.random() * 255), (int) (Math.random() * 255), (int) (Math.random() * 255)); - childNode.getBranchData() - .setBranchColor(new BranchColor(randomColour)); + childNode.setBranchColor(randomColour); List groupSeqs = new ArrayList<>(); SequenceI seq = nodesBoundToSequences.get(childNode); @@ -395,10 +412,10 @@ public final class JalviewBinding parentAvport.setSequenceColour(seq, randomColour); } - List descendantNodes = PhylogenyMethods - .getAllDescendants(childNode); + List descendantNodes = childNode + .getAllDescendants(); // .forEach instead? - for (PhylogenyNode descNode : descendantNodes) + for (TreeNodeI descNode : descendantNodes) { seq = nodesBoundToSequences.get(descNode); if (seq != null) @@ -407,8 +424,7 @@ public final class JalviewBinding parentAvport.setSequenceColour(seq, randomColour); } - descNode.getBranchData() - .setBranchColor(new BranchColor(randomColour)); + descNode.setBranchColor(randomColour); } if (groupSeqs != null) @@ -423,8 +439,8 @@ public final class JalviewBinding } } - - for (AlignmentPanel associatedPanel : associatedPanels) { + for (AlignmentPanel associatedPanel : getAssociatedPanels()) + { associatedPanel.updateAnnotation(); @@ -474,7 +490,7 @@ public final class JalviewBinding treeGroup.setName("Tree Group " + nrTreeGroups); treeGroup.setIdColour(groupColour); - for (AlignmentPanel associatedPanel : associatedPanels) + for (AlignmentPanel associatedPanel : getAssociatedPanels()) { AlignViewportI altViewport = associatedPanel .getAlignViewport(); @@ -518,7 +534,7 @@ public final class JalviewBinding * does) */ @Override - public void showNodeSelectionOnAlign(final PhylogenyNode node) + public void showNodeSelectionOnAlign(final TreeNodeI node) { if (node.isInternal()) @@ -539,13 +555,13 @@ public final class JalviewBinding @Override - public void showMatchingSequence(final PhylogenyNode nodeToMatch) + public void showMatchingSequence(final TreeNodeI nodeToMatch) { SequenceI matchingSequence = nodesBoundToSequences.get(nodeToMatch); if (matchingSequence != null) { long nodeId = nodeToMatch.getId(); - addOrRemoveInSet(treeView.getFoundNodes0(), nodeId); + addOrRemoveInSet(treeView.getMatchingNodes(), nodeId); treeSelectionChanged(matchingSequence); parentAvport.sendSelection(); @@ -553,15 +569,14 @@ public final class JalviewBinding } @Override - public void showMatchingChildSequences(final PhylogenyNode parentNode) + public void showMatchingChildSequences(final TreeNodeI parentNode) { // redundancy here, Forester already iterates through tree to get all // descendants - List childNodes = PhylogenyMethods - .getAllDescendants(parentNode); + List childNodes = parentNode.getAllDescendants(); - for (PhylogenyNode childNode : childNodes) + for (TreeNodeI childNode : childNodes) { // childNode.getBranchData().setBranchColor(new BranchColor(Color.BLUE)); @@ -569,7 +584,7 @@ public final class JalviewBinding if (matchingSequence != null) { long nodeId = childNode.getId(); - addOrRemoveInSet(treeView.getFoundNodes0(), nodeId); + addOrRemoveInSet(treeView.getMatchingNodes(), nodeId); treeSelectionChanged(matchingSequence); @@ -609,64 +624,60 @@ public final class JalviewBinding @Override public void sortByTree_actionPerformed() { - // - // if (treeCanvas.applyToAllViews) - // { - // final ArrayList commands = new ArrayList<>(); - // for (AlignmentPanel ap : PaintRefresher - // .getAssociatedPanels(parentAvport.getSequenceSetId())) - // { - // commands.add(sortAlignmentIn(ap.av.getAlignPanel())); - // } - // parentAvport.getAlignPanel().alignFrame.addHistoryItem(new CommandI() - // { - // - // @Override - // public void undoCommand(AlignmentI[] views) - // { - // for (CommandI tsort : commands) - // { - // tsort.undoCommand(views); - // } - // } - // - // @Override - // public int getSize() - // { - // return commands.size(); - // } - // - // @Override - // public String getDescription() - // { - // return "Tree Sort (many views)"; - // } - // - // @Override - // public void doCommand(AlignmentI[] views) - // { - // - // for (CommandI tsort : commands) - // { - // tsort.doCommand(views); - // } - // } - // }); - // for (AlignmentPanel ap : PaintRefresher - // .getAssociatedPanels(av.getSequenceSetId())) - // { - // // ensure all the alignFrames refresh their GI after adding an undo item - // ap.alignFrame.updateEditMenuBar(); - // } - // } - // else - // { - // treeCanvas.ap.alignFrame - // .addHistoryItem(sortAlignmentIn(treeCanvas.ap)); - // } - } + // if (applyToAllViews) + final ArrayList commands = new ArrayList<>(); + for (AlignmentPanel ap : PaintRefresher + .getAssociatedPanels(parentAvport.getSequenceSetId())) + { + commands.add(sortAlignmentIn(ap.av.getAlignPanel())); + ap.alignFrame.addHistoryItem(new CommandI() + { + + @Override + public void undoCommand(AlignmentI[] views) + { + for (CommandI tsort : commands) + { + tsort.undoCommand(views); + } + } + + @Override + public int getSize() + { + return commands.size(); + } + + @Override + public String getDescription() + { + return "Tree Sort (many views)"; + } + + @Override + public void doCommand(AlignmentI[] views) + { + + for (CommandI tsort : commands) + { + tsort.doCommand(views); + } + } + }); + + ap.alignFrame.updateEditMenuBar(); + } + } + // else + // { + // alignPanel.alignFrame.addHistoryItem(sortAlignmentIn(alignPanel)); + // } + + + + @Override public CommandI sortAlignmentIn(AlignmentPanel ap) { // TODO: move to alignment view controller @@ -677,7 +688,7 @@ public final class JalviewBinding { AlignmentSorter.sortByTree(viewport.getAlignment(), nodesBoundToSequences, - treeView.getPhylogeny()); + treeView.getTree()); CommandI undo; undo = new OrderCommand("Tree Sort", oldOrder, viewport.getAlignment()); @@ -726,13 +737,11 @@ public final class JalviewBinding public AlignmentPanel[] getAssociatedPanels() { - return associatedPanels; + return PaintRefresher + .getAssociatedPanels(parentAvport.getSequenceSetId()); } - public void setAssociatedPanels(AlignmentPanel[] associatedPanels) - { - this.associatedPanels = associatedPanels; - } + }