X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSplitFrame.java;h=d594051767e25f0977569649c56fe37768dc71d1;hb=25348635f6c655180aa796107613f13b0bd30969;hp=791e04fb7db0c7e471defa3ddc2837d7158c4563;hpb=23635fe385da9ea48690349c0530739121600a00;p=jalview.git diff --git a/src/jalview/gui/SplitFrame.java b/src/jalview/gui/SplitFrame.java index 791e04f..d594051 100644 --- a/src/jalview/gui/SplitFrame.java +++ b/src/jalview/gui/SplitFrame.java @@ -1,8 +1,12 @@ package jalview.gui; +import jalview.api.SplitContainerI; +import jalview.api.ViewStyleI; +import jalview.datamodel.AlignmentI; import jalview.jbgui.GAlignFrame; import jalview.jbgui.GSplitFrame; import jalview.structure.StructureSelectionManager; +import jalview.viewmodel.AlignmentViewport; import java.awt.Component; import java.awt.Toolkit; @@ -34,7 +38,7 @@ import javax.swing.event.InternalFrameEvent; * @author gmcarstairs * */ -public class SplitFrame extends GSplitFrame +public class SplitFrame extends GSplitFrame implements SplitContainerI { private static final long serialVersionUID = 1L; @@ -49,13 +53,78 @@ public class SplitFrame extends GSplitFrame */ protected void init() { + getTopFrame().setSplitFrame(this); + getBottomFrame().setSplitFrame(this); + getTopFrame().setVisible(true); + getBottomFrame().setVisible(true); + + ((AlignFrame) getTopFrame()).getViewport().setCodingComplement( + ((AlignFrame) getBottomFrame()).getViewport()); + setSize(AlignFrame.DEFAULT_WIDTH, Desktop.instance.getHeight() - 20); + adjustLayout(); + addCloseFrameListener(); addKeyListener(); addKeyBindings(); + + addCommandListeners(); + } + + /** + * Set the top and bottom frames to listen to each others Commands (e.g. Edit, + * Order). + */ + protected void addCommandListeners() + { + // TODO if CommandListener is only ever 1:1 for complementary views, + // may change broadcast pattern to direct messaging (more efficient) + final StructureSelectionManager ssm = StructureSelectionManager + .getStructureSelectionManager(Desktop.instance); + ssm.addCommandListener(((AlignFrame) getTopFrame()).getViewport()); + ssm.addCommandListener(((AlignFrame) getBottomFrame()).getViewport()); + } + + /** + * Do any tweaking and twerking of the layout wanted. + */ + private void adjustLayout() + { + /* + * Ensure sequence ids are the same width for good alignment. + */ + int w1 = ((AlignFrame) getTopFrame()).getViewport().getIdWidth(); + int w2 = ((AlignFrame) getBottomFrame()).getViewport().getIdWidth(); + int w3 = Math.max(w1, w2); + if (w1 != w3) + { + ((AlignFrame) getTopFrame()).getViewport().setIdWidth(w3); + } + if (w2 != w3) + { + ((AlignFrame) getBottomFrame()).getViewport().setIdWidth(w3); + } + + /* + * Set the character width for protein to 3 times that for dna. + */ + final AlignViewport topViewport = ((AlignFrame) getTopFrame()).viewport; + final AlignViewport bottomViewport = ((AlignFrame) getBottomFrame()).viewport; + final AlignmentI topAlignment = topViewport.getAlignment(); + final AlignmentI bottomAlignment = bottomViewport.getAlignment(); + AlignmentViewport cdna = topAlignment.isNucleotide() ? topViewport + : (bottomAlignment.isNucleotide() ? bottomViewport : null); + AlignmentViewport protein = !topAlignment.isNucleotide() ? topViewport + : (!bottomAlignment.isNucleotide() ? bottomViewport : null); + if (protein != null && cdna != null) + { + ViewStyleI vs = cdna.getViewStyle(); + vs.setCharWidth(3 * vs.getCharWidth()); + protein.setViewStyle(vs); + } } /** @@ -472,4 +541,59 @@ public class SplitFrame extends GSplitFrame { Desktop.instance.gatherViews(this); } + + /** + * Returns the alignment in the complementary frame to the one given. + */ + @Override + public AlignmentI getComplement(Object alignFrame) + { + if (alignFrame == this.getTopFrame()) + { + return ((AlignFrame) getBottomFrame()).viewport.getAlignment(); + } + else if (alignFrame == this.getBottomFrame()) + { + return ((AlignFrame) getTopFrame()).viewport.getAlignment(); + } + return null; + } + + /** + * Returns the title of the complementary frame to the one given. + */ + @Override + public String getComplementTitle(Object alignFrame) + { + if (alignFrame == this.getTopFrame()) + { + return ((AlignFrame) getBottomFrame()).getTitle(); + } + else if (alignFrame == this.getBottomFrame()) + { + return ((AlignFrame) getTopFrame()).getTitle(); + } + return null; + } + + /** + * Set the 'other half' to hidden / revealed. + */ + @Override + public void setComplementVisible(Object alignFrame, boolean show) + { + /* + * Hiding the AlignPanel suppresses unnecessary repaints + */ + if (alignFrame == getTopFrame()) + { + ((AlignFrame) getBottomFrame()).alignPanel.setVisible(show); + } + else if (alignFrame == getBottomFrame()) + { + ((AlignFrame) getTopFrame()).alignPanel.setVisible(show); + } + super.setComplementVisible(alignFrame, show); + } } +