package jalview.appletgui; import jalview.analysis.AlignmentUtils; import jalview.analysis.AlignmentUtils.MappingResult; import jalview.api.ViewStyleI; import jalview.bin.JalviewLite; import jalview.datamodel.AlignmentI; import jalview.structure.StructureSelectionManager; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.Panel; public class SplitFrame extends EmbmenuFrame { private static final long serialVersionUID = 1L; private AlignFrame topFrame; private AlignFrame bottomFrame; private Panel outermost; /** * Constructor */ public SplitFrame(AlignFrame af1, AlignFrame af2) { topFrame = af1; bottomFrame = af2; init(); } /** * Creates a Panel containing two Panels, and adds the first and second * AlignFrame's components to each. At this stage we have not yet committed to * whether the enclosing panel will be added to this frame, for display as a * separate frame, or added to the applet (embedded mode). */ public void init() { setMenuBar(null); outermost = new Panel(); outermost.setLayout(new GridLayout(2, 1)); Panel topPanel = new Panel(); Panel bottomPanel = new Panel(); outermost.add(topPanel); outermost.add(bottomPanel); addAlignFrameComponents(topFrame, topPanel); addAlignFrameComponents(bottomFrame, bottomPanel); /* * Try to make and add dna/protein sequence mappings */ final AlignViewport topViewport = topFrame.viewport; final AlignViewport bottomViewport = bottomFrame.viewport; final AlignmentI topAlignment = topViewport.getAlignment(); final AlignmentI bottomAlignment = bottomViewport.getAlignment(); // topAlignment.setDataset(null); // bottomAlignment.setDataset(null); AlignViewport cdna = topAlignment.isNucleotide() ? topViewport : (bottomAlignment.isNucleotide() ? bottomViewport : null); AlignViewport protein = !topAlignment.isNucleotide() ? topViewport : (!bottomAlignment.isNucleotide() ? bottomViewport : null); MappingResult mapped = AlignmentUtils.mapProteinToCdna( protein.getAlignment(), cdna.getAlignment()); if (mapped != MappingResult.NotMapped) { final StructureSelectionManager ssm = StructureSelectionManager .getStructureSelectionManager(topViewport.applet); ssm.addMappings(protein.getAlignment().getCodonFrames()); topViewport.setCodingComplement(bottomViewport); ssm.addCommandListener(cdna); ssm.addCommandListener(protein); } /* * Expand protein to 3 times character width of dna */ if (protein != null && cdna != null) { ViewStyleI vs = protein.getViewStyle(); vs.setCharWidth(3 * vs.getCharWidth()); protein.setViewStyle(vs); } } /** * Add the menu bar, alignment panel and status bar from the AlignFrame to the * panel. The menu bar is a panel 'reconstructed' from the AlignFrame's frame * menu bar. This allows each half of the SplitFrame to have its own menu bar. * * @param af * @param panel */ private void addAlignFrameComponents(AlignFrame af, Panel panel) { panel.setLayout(new BorderLayout()); Panel menuPanel = af .makeEmbeddedPopupMenu(af.getMenuBar(), true, false); panel.add(menuPanel, BorderLayout.NORTH); panel.add(af.statusBar, BorderLayout.SOUTH); panel.add(af.alignPanel, BorderLayout.CENTER); } /** * Display the content panel either as a new frame or embedded in the applet. * * @param embedded * @param applet */ public void addToDisplay(boolean embedded, JalviewLite applet) { createAlignFrameWindow(embedded, applet); validate(); topFrame.alignPanel.adjustAnnotationHeight(); topFrame.alignPanel.paintAlignment(true); bottomFrame.alignPanel.adjustAnnotationHeight(); bottomFrame.alignPanel.paintAlignment(true); } /** * Either show the content panel in this frame as a new frame, or (if * embed=true) add it to the applet container instead. * * @param embed * @param applet */ public void createAlignFrameWindow(boolean embed, JalviewLite applet) { if (embed) { applet.add(outermost); applet.validate(); } else { this.add(outermost); int width = Math.max(topFrame.DEFAULT_WIDTH, bottomFrame.DEFAULT_WIDTH); int height = topFrame.DEFAULT_HEIGHT + bottomFrame.DEFAULT_HEIGHT; jalview.bin.JalviewLite .addFrame(this, this.getTitle(), width, height); } } }