X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=4beacd9d7d3d6f4a237a831805f704af705bd50e;hb=d10280f7592e21f1ed4d1030d3ece3e95f3b385b;hp=cb6bc6e803a69d53e1c26f8867d2f51e58789174;hpb=cc6d26d2738c5854ef81ce6787d66564c2281220;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index cb6bc6e..4beacd9 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -20,6 +20,7 @@ */ package jalview.gui; +import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; import jalview.bin.Cache; import jalview.io.FileLoader; @@ -27,6 +28,7 @@ import jalview.io.FormatAdapter; import jalview.io.IdentifyFile; import jalview.io.JalviewFileChooser; import jalview.io.JalviewFileView; +import jalview.jbgui.GSplitFrame; import jalview.jbgui.GStructureViewer; import jalview.structure.StructureSelectionManager; import jalview.util.ImageMaker; @@ -1694,6 +1696,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements /** * * @param alignmentId + * - if null, all sets are returned * @return all AlignmentPanels concerning the alignmentId sequence set */ public static AlignmentPanel[] getAlignmentPanels(String alignmentId) @@ -1714,19 +1717,11 @@ public class Desktop extends jalview.jbgui.GDesktop implements { for (AlignmentPanel ap : af.alignPanels) { - if (alignmentId.equals(ap.av.getSequenceSetId())) + if (alignmentId==null || alignmentId.equals(ap.av.getSequenceSetId())) { aps.add(ap); } } - // for (int a = 0; a < af.alignPanels.size(); a++) - // { - // if (alignmentId.equals(af.alignPanels - // .get(a).av.getSequenceSetId())) - // { - // aps.add(af.alignPanels.get(a)); - // } - // } } if (aps.size() == 0) { @@ -1740,7 +1735,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements * get all the viewports on an alignment. * * @param sequenceSetId - * unique alignment id + * unique alignment id (may be null - all viewports returned in that + * case) * @return all viewports on the alignment bound to sequenceSetId */ public static AlignmentViewport[] getViewports(String sequenceSetId) @@ -1752,13 +1748,14 @@ public class Desktop extends jalview.jbgui.GDesktop implements for (AlignFrame afr : frames) { - if (afr.getViewport().getSequenceSetId().equals(sequenceSetId)) + if (sequenceSetId==null || afr.getViewport().getSequenceSetId().equals(sequenceSetId)) { if (afr.alignPanels != null) { for (AlignmentPanel ap : afr.alignPanels) { - if (sequenceSetId.equals(ap.av.getSequenceSetId())) + if (sequenceSetId == null + || sequenceSetId.equals(ap.av.getSequenceSetId())) { viewp.add(ap.av); } @@ -1795,13 +1792,19 @@ public class Desktop extends jalview.jbgui.GDesktop implements { AlignmentPanel ap = af.alignPanels.get(i); AlignFrame newaf = new AlignFrame(ap); - if (ap.av.explodedPosition != null - && !ap.av.explodedPosition.equals(af.getBounds())) + + /* + * Restore the view's last exploded frame geometry if known. Multiple + * views from one exploded frame share and restore the same (frame) + * position and size. + */ + Rectangle geometry = ap.av.getExplodedGeometry(); + if (geometry != null) { - newaf.setBounds(ap.av.explodedPosition); + newaf.setBounds(geometry); } - ap.av.gatherViewsHere = false; + ap.av.setGatherViewsHere(false); addInternalFrame(newaf, af.getTitle(), AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); @@ -1822,8 +1825,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements */ public void gatherViews(AlignFrame source) { - source.viewport.gatherViewsHere = true; - source.viewport.explodedPosition = source.getBounds(); + source.viewport.setGatherViewsHere(true); + source.viewport.setExplodedGeometry(source.getBounds()); JInternalFrame[] frames = desktop.getAllFrames(); String viewId = source.viewport.getSequenceSetId(); @@ -1839,8 +1842,8 @@ public class Desktop extends jalview.jbgui.GDesktop implements if (viewId.equals(ap.av.getSequenceSetId())) { gatherThis = true; - ap.av.gatherViewsHere = false; - ap.av.explodedPosition = af.getBounds(); + ap.av.setGatherViewsHere(false); + ap.av.setExplodedGeometry(af.getBounds()); source.addAlignmentPanel(ap, false); } } @@ -2380,7 +2383,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements /* * Also check for a split frame containing an AlignFrame */ - SplitFrame sf = (SplitFrame) frames[i]; + GSplitFrame sf = (GSplitFrame) frames[i]; if (sf.getTopFrame() instanceof AlignFrame) { avp.add((AlignFrame) sf.getTopFrame()); @@ -2554,20 +2557,21 @@ public class Desktop extends jalview.jbgui.GDesktop implements } /** - * This will return the first AlignFrame viewing AlignViewport av. It will - * break if there are more than one AlignFrames viewing a particular av. + * This will return the first AlignFrame holding the given viewport instance. It + * will break if there are more than one AlignFrames viewing a particular av. * - * @param av - * @return alignFrame for av + * @param viewport + * @return alignFrame for viewport */ - public static AlignFrame getAlignFrameFor(AlignmentViewport av) + public static AlignFrame getAlignFrameFor(AlignViewportI viewport) { if (desktop != null) { - AlignmentPanel[] aps = getAlignmentPanels(av.getSequenceSetId()); + AlignmentPanel[] aps = getAlignmentPanels(viewport + .getSequenceSetId()); for (int panel = 0; aps != null && panel < aps.length; panel++) { - if (aps[panel] != null && aps[panel].av == av) + if (aps[panel] != null && aps[panel].av == viewport) { return aps[panel].alignFrame; } @@ -2945,7 +2949,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements } /** - * Explode the views in the given frame into separate AlignFrame + * Explode the views in the given frame into separate AlignFrame windows. * * @param sf */ @@ -2975,21 +2979,23 @@ public class Desktop extends jalview.jbgui.GDesktop implements * cdna/protein relationships between the viewports is carried over to the * new split frames. */ - AlignFrame newTopFrame = new AlignFrame( - (AlignmentPanel) topPanels.get(i)); + AlignmentViewPanel topPanel = topPanels.get(i); + AlignFrame newTopFrame = new AlignFrame((AlignmentPanel) topPanel); newTopFrame.setVisible(true); - AlignFrame newBottomFrame = new AlignFrame( - (AlignmentPanel) bottomPanels.get(i)); + AlignmentPanel bottomPanel = (AlignmentPanel) bottomPanels.get(i); + AlignFrame newBottomFrame = new AlignFrame(bottomPanel); newBottomFrame.setVisible(true); JInternalFrame splitFrame = new SplitFrame(newTopFrame, newBottomFrame); + // either panel may hold previous exploded frame geometry + Rectangle geometry = ((AlignViewport) topPanel.getAlignViewport()) + .getExplodedGeometry(); + if (geometry != null) + { + splitFrame.setBounds(geometry); + } Desktop.addInternalFrame(splitFrame, sf.getTitle(), -1, -1); - // if (ap.av.explodedPosition != null - // && !ap.av.explodedPosition.equals(af.getBounds())) - // { - // newaf.setBounds(ap.av.explodedPosition); - // } // // ap.av.gatherViewsHere = false; } @@ -3010,12 +3016,14 @@ public class Desktop extends jalview.jbgui.GDesktop implements * * @param source */ - public void gatherViews(SplitFrame source) + public void gatherViews(GSplitFrame source) { - // source.viewport.gatherViewsHere = true; - // source.viewport.explodedPosition = source.getBounds(); AlignFrame myTopFrame = (AlignFrame) source.getTopFrame(); AlignFrame myBottomFrame = (AlignFrame) source.getBottomFrame(); + myTopFrame.viewport.setExplodedGeometry(source.getBounds()); + myBottomFrame.viewport.setExplodedGeometry(source.getBounds()); + myTopFrame.viewport.setGatherViewsHere(true); + myBottomFrame.viewport.setGatherViewsHere(true); String topViewId = myTopFrame.viewport.getSequenceSetId(); String bottomViewId = myBottomFrame.viewport.getSequenceSetId(); @@ -3036,9 +3044,12 @@ public class Desktop extends jalview.jbgui.GDesktop implements && bottomViewId.equals(bottomPanel.av.getSequenceSetId())) { gatherThis = true; - topPanel.av.gatherViewsHere = false; - bottomPanel.av.gatherViewsHere = false; - // topPanel.av.explodedPosition = af.getBounds(); + topPanel.av.setGatherViewsHere(false); + bottomPanel.av.setGatherViewsHere(false); + // both panels refer to the same split frame geometry + Rectangle position = sf.getBounds(); + topPanel.av.setExplodedGeometry(position); + bottomPanel.av.setExplodedGeometry(position); myTopFrame.addAlignmentPanel(topPanel, false); myBottomFrame.addAlignmentPanel(bottomPanel, false); }