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