2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.appletgui;
23 import jalview.api.AlignmentViewPanel;
24 import jalview.api.ViewStyleI;
25 import jalview.bin.JalviewLite;
26 import jalview.datamodel.AlignmentI;
27 import jalview.structure.StructureSelectionManager;
28 import jalview.viewmodel.AlignmentViewport;
30 import java.awt.BorderLayout;
31 import java.awt.Dimension;
32 import java.awt.GridLayout;
33 import java.awt.Panel;
35 public class SplitFrame extends EmbmenuFrame
37 private static final long serialVersionUID = 1L;
39 private AlignFrame topFrame;
41 private AlignFrame bottomFrame;
43 private Panel outermost;
46 * Constructs the split frame placing cdna in the top half. No 'alignment' is
47 * performed here, this should be done by the calling client if wanted.
49 public SplitFrame(AlignFrame af1, AlignFrame af2)
51 boolean af1IsNucleotide = af1.viewport.getAlignment().isNucleotide();
52 topFrame = af1IsNucleotide ? af1 : af2;
53 bottomFrame = topFrame == af1 ? af2 : af1;
58 * Creates a Panel containing two Panels, and adds the first and second
59 * AlignFrame's components to each. At this stage we have not yet committed to
60 * whether the enclosing panel will be added to this frame, for display as a
61 * separate frame, or added to the applet (embedded mode).
68 * Try to make and add dna/protein sequence mappings
70 final AlignViewport topViewport = topFrame.viewport;
71 final AlignViewport bottomViewport = bottomFrame.viewport;
72 final AlignmentI topAlignment = topViewport.getAlignment();
73 final AlignmentI bottomAlignment = bottomViewport.getAlignment();
74 AlignmentViewport cdna = topAlignment.isNucleotide() ? topViewport
75 : (bottomAlignment.isNucleotide() ? bottomViewport : null);
76 AlignmentViewport protein = !topAlignment.isNucleotide() ? topViewport
77 : (!bottomAlignment.isNucleotide() ? bottomViewport : null);
79 final StructureSelectionManager ssm = StructureSelectionManager
80 .getStructureSelectionManager(topViewport.applet);
81 ssm.registerMappings(protein.getAlignment().getCodonFrames());
82 topViewport.setCodingComplement(bottomViewport);
83 ssm.addCommandListener(cdna);
84 ssm.addCommandListener(protein);
87 * Compute cDNA consensus on protein alignment
89 protein.initComplementConsensus();
90 AlignmentViewPanel ap = topAlignment.isNucleotide()
91 ? bottomFrame.alignPanel
92 : topFrame.alignPanel;
93 protein.updateConsensus(ap);
101 protected void constructSplit()
104 outermost = new Panel(new GridLayout(2, 1));
106 Panel topPanel = new Panel();
107 Panel bottomPanel = new Panel();
108 outermost.add(topPanel);
109 outermost.add(bottomPanel);
111 addAlignFrameComponents(topFrame, topPanel);
112 addAlignFrameComponents(bottomFrame, bottomPanel);
116 * Make any adjustments to the layout
118 protected void adjustLayout()
120 AlignmentViewport cdna = topFrame.getAlignViewport().getAlignment()
121 .isNucleotide() ? topFrame.viewport : bottomFrame.viewport;
122 AlignmentViewport protein = cdna == topFrame.viewport
123 ? bottomFrame.viewport
127 * Ensure sequence ids are the same width for good alignment.
129 // TODO should do this via av.getViewStyle/setViewStyle
130 // however at present av.viewStyle is not set in IdPanel.fontChanged
131 int w1 = topFrame.alignPanel.idPanel.idCanvas.getWidth();
132 int w2 = bottomFrame.alignPanel.idPanel.idCanvas.getWidth();
133 int w3 = Math.max(w1, w2);
136 Dimension d = topFrame.alignPanel.idPanel.idCanvas.getSize();
137 topFrame.alignPanel.idPanel.idCanvas
138 .setSize(new Dimension(w3, d.height));
142 Dimension d = bottomFrame.alignPanel.idPanel.idCanvas.getSize();
143 bottomFrame.alignPanel.idPanel.idCanvas
144 .setSize(new Dimension(w3, d.height));
148 * Scale protein to either 1 or 3 times character width of dna
150 if (protein != null && cdna != null)
152 ViewStyleI vs = protein.getViewStyle();
153 int scale = vs.isScaleProteinAsCdna() ? 3 : 1;
154 vs.setCharWidth(scale * cdna.getViewStyle().getCharWidth());
155 protein.setViewStyle(vs);
160 * Add the menu bar, alignment panel and status bar from the AlignFrame to the
161 * panel. The menu bar is a panel 'reconstructed' from the AlignFrame's frame
162 * menu bar. This allows each half of the SplitFrame to have its own menu bar.
167 private void addAlignFrameComponents(AlignFrame af, Panel panel)
169 panel.setLayout(new BorderLayout());
170 Panel menuPanel = af.makeEmbeddedPopupMenu(af.getMenuBar(), true,
172 panel.add(menuPanel, BorderLayout.NORTH);
173 panel.add(af.statusBar, BorderLayout.SOUTH);
174 panel.add(af.alignPanel, BorderLayout.CENTER);
176 af.setSplitFrame(this);
180 * Display the content panel either as a new frame or embedded in the applet.
185 public void addToDisplay(boolean embedded, JalviewLite applet)
187 createSplitFrameWindow(embedded, applet);
189 topFrame.alignPanel.adjustAnnotationHeight();
190 topFrame.alignPanel.paintAlignment(true, true);
191 bottomFrame.alignPanel.adjustAnnotationHeight();
192 bottomFrame.alignPanel.paintAlignment(true, true);
196 * Either show the content panel in this frame as a new frame, or (if
197 * embed=true) add it to the applet container instead.
202 protected void createSplitFrameWindow(boolean embed, JalviewLite applet)
206 applet.add(outermost);
212 int width = Math.max(topFrame.frameWidth, bottomFrame.frameWidth);
213 int height = topFrame.frameHeight + bottomFrame.frameHeight;
214 jalview.bin.JalviewLite.addFrame(this, this.getTitle(), width,
220 * Returns the contained AlignFrame complementary to the one given (or null if
221 * no match to top or bottom component).
226 public AlignFrame getComplement(AlignFrame af)
232 else if (bottomFrame == af)