package jalview.ext.archaeopteryx; import jalview.datamodel.ColumnSelection; import jalview.datamodel.HiddenColumns; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.gui.PaintRefresher; import jalview.structure.SelectionSource; import jalview.structure.StructureSelectionManager; import jalview.viewmodel.AlignmentViewport; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.util.HashSet; import java.util.Map; import org.forester.archaeopteryx.MainFrame; import org.forester.phylogeny.PhylogenyNode; public class JalviewAptxBinding implements JalviewTreeViewerBindingI { org.forester.archaeopteryx.TreePanel treeView; AlignmentViewport parentAvport; StructureSelectionManager ssm; Map sequencesBoundToNodes; Map nodesBoundToSequences; public JalviewAptxBinding(MainFrame archaeopteryx, AlignmentViewport jalviewAlignmentViewport, Map alignMappedToNodes, Map nodesMappedToAlign) { parentAvport = jalviewAlignmentViewport; sequencesBoundToNodes = alignMappedToNodes; nodesBoundToSequences = nodesMappedToAlign; treeView = archaeopteryx.getMainPanel().getCurrentTreePanel(); ssm = parentAvport.getStructureSelectionManager(); ssm.addSelectionListener(this); treeView.addMouseListener(this); PaintRefresher.Register(treeView, parentAvport.getSequenceSetId()); } @Override public void actionPerformed(ActionEvent e) { } @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { showNodeSelectionOnAlign(e); } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void selection(SequenceGroup seqsel, ColumnSelection colsel, HiddenColumns hidden, SelectionSource source) { if (source == parentAvport) // check if source is alignment from where the // tree originates { treeView.setFoundNodes0( new HashSet(seqsel.getSequences().size())); for (SequenceI sequence : seqsel.getSequences()) { PhylogenyNode matchingNode = sequencesBoundToNodes.get(sequence); if (matchingNode != null) { treeView.getFoundNodes0().add(matchingNode.getId()); } } PaintRefresher.Refresh(treeView, parentAvport.getSequenceSetId()); } } @Override public void showNodeSelectionOnAlign(MouseEvent e) { final PhylogenyNode node = treeView.findNode(e.getX(), e.getY()); if (node != null && node.isExternal()) { SequenceI matchingSequence = nodesBoundToSequences.get(node); if ((e.getModifiers() & InputEvent.SHIFT_MASK) != 0) // shift is pressed // (so multiple nodes // can be selected) { } else { parentAvport.setSelectionGroup(null); // reset selection if shift isn't // pressed } treeSelectionChanged(matchingSequence); parentAvport.sendSelection(); // not actually needed? PaintRefresher.Refresh(treeView, parentAvport.getSequenceSetId()); } } /** * Refactored from TreeCanvas * * @param sequence */ public void treeSelectionChanged(SequenceI sequence) { SequenceGroup selected = parentAvport.getSelectionGroup(); if (selected == null) { selected = new SequenceGroup(); parentAvport.setSelectionGroup(selected); } selected.setEndRes(parentAvport.getAlignment().getWidth() - 1); selected.addOrRemove(sequence, true); } public AlignmentViewport getParentAvport() { return parentAvport; } public void setParentAvport(AlignmentViewport parentAvport) { this.parentAvport = parentAvport; } }