Bug 334411 Detached windows should be unrendered when closed
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WBWRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WBWRenderer.java
index 14ebe7d..d25c403 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WBWRenderer.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WBWRenderer.java
@@ -158,6 +158,28 @@
}
}
+ private void closeDetachedWindow(MWindow window) {
+ EPartService partService = (EPartService) window.getContext().get(
+ EPartService.class.getName());
+ List<MPart> parts = modelService.findElements(window, null,
+ MPart.class, null);
+ // this saves one part at a time, not ideal but better than not saving
+ // at all
+ for (MPart part : parts) {
+ if (!partService.savePart(part, true)) {
+ return;
+ }
+ }
+
+ // hide every part individually, following 3.x behaviour
+ for (MPart part : parts) {
+ partService.hidePart(part);
+ }
+
+ // finally unrender the window itself
+ window.setToBeRendered(false);
+ }
+
@PostConstruct
public void init() {
shellUpdater = new EventHandler() {
@@ -332,14 +354,7 @@
// Add the shell into the WBW's context
localContext.set(Shell.class.getName(), wbwShell);
localContext.set(E4Workbench.LOCAL_ACTIVE_SHELL, wbwShell);
- localContext.set(IWindowCloseHandler.class.getName(),
- new IWindowCloseHandler() {
- public boolean close(MWindow window) {
- EPartService partService = (EPartService) window
- .getContext().get(EPartService.class.getName());
- return partService.saveAll(true);
- }
- });
+ setCloseHandler(wbwModel);
localContext.set(IShellProvider.class.getName(), new IShellProvider() {
public Shell getShell() {
return wbwShell;
@@ -385,6 +400,30 @@
return newWidget;
}
+ private void setCloseHandler(MWindow window) {
+ IEclipseContext context = window.getContext();
+ // no direct model parent, must be a detached window
+ if (window.getParent() == null) {
+ context.set(IWindowCloseHandler.class.getName(),
+ new IWindowCloseHandler() {
+ public boolean close(MWindow window) {
+ closeDetachedWindow(window);
+ return false;
+ }
+ });
+ } else {
+ context.set(IWindowCloseHandler.class.getName(),
+ new IWindowCloseHandler() {
+ public boolean close(MWindow window) {
+ EPartService partService = (EPartService) window
+ .getContext().get(
+ EPartService.class.getName());
+ return partService.saveAll(true);
+ }
+ });
+ }
+ }
+
@Override
public void hookControllerLogic(MUIElement me) {
super.hookControllerLogic(me);
diff --git a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/ModelServiceImpl.java b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/ModelServiceImpl.java
index 1b5bb7d..3276c95 100644
--- a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/ModelServiceImpl.java
+++ b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/ModelServiceImpl.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
+ * Copyright (c) 2010, 2011 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -41,8 +41,6 @@
import org.eclipse.e4.ui.model.internal.ModelUtils;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
-import org.eclipse.e4.ui.workbench.modeling.EPartService;
-import org.eclipse.e4.ui.workbench.modeling.IWindowCloseHandler;
import org.eclipse.emf.ecore.EObject;
/**
@@ -534,41 +532,11 @@
MWindow window = getTopLevelWindowFor(persp);
IPresentationEngine renderingEngine = persp.getContext().get(IPresentationEngine.class);
renderingEngine.createGui(newWindow, window.getWidget(), persp.getContext());
-
- newWindow.getContext().set(IWindowCloseHandler.class.getName(),
- new IWindowCloseHandler() {
- public boolean close(MWindow window) {
- closeDetachedWindow(window);
- // return false since the close request has been handled
- return false;
- }
- });
} else if (curParent instanceof MWindow) {
((MWindow) curParent).getWindows().add(newWindow);
}
}
- private void closeDetachedWindow(MWindow window) {
- EPartService partService = (EPartService) window.getContext().get(
- EPartService.class.getName());
- List<MPart> parts = findElements(window, null, MPart.class, null);
- // this saves one part at a time, not ideal but better than not saving
- // at all
- for (MPart part : parts) {
- if (!partService.savePart(part, true)) {
- return;
- }
- }
-
- // hide every part individually, following 3.x behaviour
- for (MPart part : parts) {
- partService.hidePart(part);
- }
-
- // finally unrender the window itself
- window.setToBeRendered(false);
- }
-
/**
* @param element
* @return