Fix for Bug 417929 - [Perspectives] Resetting a perspective with an open
minimized stack leaves cheese
diff --git a/bundles/org.eclipse.e4.ui.workbench.addons.swt/src/org/eclipse/e4/ui/workbench/addons/minmax/TrimStack.java b/bundles/org.eclipse.e4.ui.workbench.addons.swt/src/org/eclipse/e4/ui/workbench/addons/minmax/TrimStack.java
index 7689714..c3d6def 100644
--- a/bundles/org.eclipse.e4.ui.workbench.addons.swt/src/org/eclipse/e4/ui/workbench/addons/minmax/TrimStack.java
+++ b/bundles/org.eclipse.e4.ui.workbench.addons.swt/src/org/eclipse/e4/ui/workbench/addons/minmax/TrimStack.java
@@ -102,6 +102,7 @@
private boolean isShowing = false;
private MUIElement minimizedElement;
+ private Composite clientAreaComposite;
private Composite hostPane;
@Inject
@@ -507,9 +508,19 @@
public void widgetDisposed(DisposeEvent e) {
trimStackTB = null;
trimStackMenu = null;
+
+ if (isShowing && hostPane != null && !hostPane.isDisposed())
+ showStack(false);
}
});
+ // Get the shell's client area composite
+ Shell theShell = trimStackTB.getShell();
+ if (theShell.getLayout() instanceof TrimmedPartLayout) {
+ TrimmedPartLayout tpl = (TrimmedPartLayout) theShell.getLayout();
+ clientAreaComposite = tpl.clientArea;
+ }
+
trimStackTB.addListener(SWT.MenuDetect, new Listener() {
public void handleEvent(Event event) {
// Clear any existing menus
@@ -821,14 +832,13 @@
*/
public void showStack(boolean show) {
Control ctrl = (Control) minimizedElement.getWidget();
- Composite clientArea = getShellClientComposite();
- if (clientArea == null)
+ if (clientAreaComposite == null || clientAreaComposite.isDisposed())
return;
if (show && !isShowing) {
hostPane = getHostPane();
ctrl.setParent(hostPane);
- clientArea.addControlListener(caResizeListener);
+ clientAreaComposite.addControlListener(caResizeListener);
// Set the initial location
setPaneLocation(hostPane);
@@ -892,8 +902,8 @@
} else if (!show && isShowing) {
// Check to ensure that the client area is non-null since the
// trimstack may be currently hosted in the limbo shell
- if (clientArea != null) {
- clientArea.removeControlListener(caResizeListener);
+ if (clientAreaComposite != null) {
+ clientAreaComposite.removeControlListener(caResizeListener);
}
if (hostPane != null && hostPane.isVisible()) {
@@ -905,24 +915,11 @@
}
}
- Composite getShellClientComposite() {
- if (trimStackTB == null || trimStackTB.isDisposed()) {
- return null;
- }
- Shell theShell = trimStackTB.getShell();
- if (!(theShell.getLayout() instanceof TrimmedPartLayout))
- return null;
-
- TrimmedPartLayout tpl = (TrimmedPartLayout) theShell.getLayout();
- return tpl.clientArea;
- }
-
private void setPaneLocation(Composite someShell) {
- Composite clientComp = getShellClientComposite();
- if (clientComp == null || clientComp.isDisposed())
+ if (clientAreaComposite == null || clientAreaComposite.isDisposed())
return;
- Rectangle caRect = getShellClientComposite().getBounds();
+ Rectangle caRect = clientAreaComposite.getBounds();
// NOTE: always starts in the persisted (or default) size
Point paneSize = getHostPane().getSize();