Bug 348069 Closing an additional window of an Eclipse 4 application doesn't unrender it
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 75d4e94..93aaab4 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
@@ -461,7 +461,18 @@
EPartService partService = (EPartService) window
.getContext().get(
EPartService.class.getName());
- return partService.saveAll(true);
+ if (partService.saveAll(true)) {
+ // unrender the window
+ window.setToBeRendered(false);
+ Object parent = ((EObject) window).eContainer();
+ if (parent instanceof MApplication) {
+ // remove it from the application
+ ((MApplication) parent).getChildren()
+ .remove(window);
+ }
+ return true;
+ }
+ return false;
}
});
}
diff --git a/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java b/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java
index 8c528a6..129dd98 100644
--- a/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java
+++ b/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java
@@ -1005,7 +1005,7 @@
// FIXME Without this call the test-suite fails
cleanUp();
if (theApp != null) {
- for (MWindow window : theApp.getChildren()) {
+ for (MWindow window : new ArrayList<MWindow>(theApp.getChildren())) {
if (window.getWidget() != null) {
((Shell) window.getWidget()).close();
}
diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java
index 82596f5..9273849 100644
--- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java
+++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/PartRenderingEngineTests.java
@@ -2695,6 +2695,103 @@
assertTrue(area.isToBeRendered());
}
+ public void testBug348069() {
+ MApplication application = ApplicationFactoryImpl.eINSTANCE
+ .createApplication();
+
+ MWindow window = BasicFactoryImpl.eINSTANCE.createWindow();
+ application.getChildren().add(window);
+ application.setSelectedElement(window);
+
+ MPart part = BasicFactoryImpl.eINSTANCE.createPart();
+ part.setContributionURI("platform:/plugin/org.eclipse.e4.ui.tests/org.eclipse.e4.ui.tests.workbench.SampleView");
+ window.getChildren().add(part);
+ window.setSelectedElement(part);
+
+ application.setContext(appContext);
+ appContext.set(MApplication.class.getName(), application);
+
+ wb = new E4Workbench(application, appContext);
+ wb.createAndRunUI(window);
+
+ SampleView view = (SampleView) part.getObject();
+ assertFalse(view.isDestroyed());
+
+ ((Shell) window.getWidget()).close();
+ assertTrue(view.isDestroyed());
+ assertFalse(application.getChildren().contains(window));
+ }
+
+ public void testBug348069_DetachedWindow() {
+ MApplication application = ApplicationFactoryImpl.eINSTANCE
+ .createApplication();
+
+ MWindow window = BasicFactoryImpl.eINSTANCE.createWindow();
+ application.getChildren().add(window);
+ application.setSelectedElement(window);
+
+ MWindow detachedWindow = BasicFactoryImpl.eINSTANCE.createWindow();
+ window.getWindows().add(detachedWindow);
+
+ MPart part = BasicFactoryImpl.eINSTANCE.createPart();
+ part.setContributionURI("platform:/plugin/org.eclipse.e4.ui.tests/org.eclipse.e4.ui.tests.workbench.SampleView");
+ detachedWindow.getChildren().add(part);
+ detachedWindow.setSelectedElement(part);
+
+ application.setContext(appContext);
+ appContext.set(MApplication.class.getName(), application);
+
+ wb = new E4Workbench(application, appContext);
+ wb.createAndRunUI(window);
+
+ SampleView view = (SampleView) part.getObject();
+ assertFalse(view.isDestroyed());
+
+ ((Shell) detachedWindow.getWidget()).close();
+ assertTrue(view.isDestroyed());
+ assertTrue(window.getWindows().contains(detachedWindow));
+ }
+
+ public void testBug348069_DetachedPerspectiveWindow() {
+ MApplication application = ApplicationFactoryImpl.eINSTANCE
+ .createApplication();
+
+ MWindow window = BasicFactoryImpl.eINSTANCE.createWindow();
+ application.getChildren().add(window);
+ application.setSelectedElement(window);
+
+ MPerspectiveStack perspectiveStack = AdvancedFactoryImpl.eINSTANCE
+ .createPerspectiveStack();
+ window.getChildren().add(perspectiveStack);
+ window.setSelectedElement(perspectiveStack);
+
+ MPerspective perspective = AdvancedFactoryImpl.eINSTANCE
+ .createPerspective();
+ perspectiveStack.getChildren().add(perspective);
+ perspectiveStack.setSelectedElement(perspective);
+
+ MWindow detachedWindow = BasicFactoryImpl.eINSTANCE.createWindow();
+ perspective.getWindows().add(detachedWindow);
+
+ MPart part = BasicFactoryImpl.eINSTANCE.createPart();
+ part.setContributionURI("platform:/plugin/org.eclipse.e4.ui.tests/org.eclipse.e4.ui.tests.workbench.SampleView");
+ detachedWindow.getChildren().add(part);
+ detachedWindow.setSelectedElement(part);
+
+ application.setContext(appContext);
+ appContext.set(MApplication.class.getName(), application);
+
+ wb = new E4Workbench(application, appContext);
+ wb.createAndRunUI(window);
+
+ SampleView view = (SampleView) part.getObject();
+ assertFalse(view.isDestroyed());
+
+ ((Shell) detachedWindow.getWidget()).close();
+ assertTrue(view.isDestroyed());
+ assertTrue(perspective.getWindows().contains(detachedWindow));
+ }
+
private MWindow createWindowWithOneView(String partName) {
final MWindow window = BasicFactoryImpl.eINSTANCE.createWindow();
window.setHeight(300);