Fix for Bug 348215 - Reattaching a detached stack with multiple views will cause part disposal
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 129dd98..e3ef320 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
@@ -543,6 +543,31 @@
}
}
+ // Reparent the context (or the kid's context)
+ if (element instanceof MContext) {
+ IEclipseContext ctxt = ((MContext) element).getContext();
+ if (ctxt != null)
+ ctxt.setParent(parentContext);
+ } else {
+ List<MContext> childContexts = modelService.findElements(
+ element, null, MContext.class, null);
+ for (MContext c : childContexts) {
+ // Ensure that we only reset the context of our direct
+ // children
+ MUIElement kid = (MUIElement) c;
+ MUIElement parent = kid.getParent();
+ if (parent == null && kid.getCurSharedRef() != null)
+ parent = kid.getCurSharedRef().getParent();
+ if (parent != element)
+ continue;
+
+ if (c.getContext() != null
+ && c.getContext().getParent() != parentContext) {
+ c.getContext().setParent(parentContext);
+ }
+ }
+ }
+
// Now that we have a widget let the parent (if any) know
if (element.getParent() instanceof MUIElement) {
MElementContainer<MUIElement> parentElement = element
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 9273849..247d866 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
@@ -2752,6 +2752,114 @@
assertTrue(window.getWindows().contains(detachedWindow));
}
+ public void testBug348215_PartOnlyContextReparent() {
+ 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);
+
+ assertTrue(part.getContext() != null);
+ assertTrue(part.getContext().getParent() == detachedWindow.getContext());
+
+ detachedWindow.getChildren().remove(part);
+ window.getChildren().add(part);
+
+ assertTrue(part.getContext() != null);
+ assertTrue(part.getContext().getParent() == window.getContext());
+ }
+
+ public void testBug348215_PartContextReparent() {
+ 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);
+
+ MPartStack stack = BasicFactoryImpl.eINSTANCE.createPartStack();
+ detachedWindow.getChildren().add(stack);
+ detachedWindow.setSelectedElement(stack);
+
+ MPart part = BasicFactoryImpl.eINSTANCE.createPart();
+ part.setContributionURI("platform:/plugin/org.eclipse.e4.ui.tests/org.eclipse.e4.ui.tests.workbench.SampleView");
+ stack.getChildren().add(part);
+ stack.setSelectedElement(part);
+
+ application.setContext(appContext);
+ appContext.set(MApplication.class.getName(), application);
+
+ wb = new E4Workbench(application, appContext);
+ wb.createAndRunUI(window);
+
+ assertTrue(part.getContext() != null);
+ assertTrue(part.getContext().getParent() == detachedWindow.getContext());
+
+ detachedWindow.getChildren().remove(stack);
+ window.getChildren().add(stack);
+
+ assertTrue(part.getContext() != null);
+ assertTrue(part.getContext().getParent() == window.getContext());
+ }
+
+ public void testBug348215_PartPlaceholderContextReparent() {
+ 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.getSharedElements().add(part);
+
+ MWindow detachedWindow = BasicFactoryImpl.eINSTANCE.createWindow();
+ window.getWindows().add(detachedWindow);
+
+ MPartStack stack = BasicFactoryImpl.eINSTANCE.createPartStack();
+ detachedWindow.getChildren().add(stack);
+ detachedWindow.setSelectedElement(stack);
+
+ MPlaceholder ph = AdvancedFactoryImpl.eINSTANCE.createPlaceholder();
+ ph.setRef(part);
+ stack.getChildren().add(ph);
+ stack.setSelectedElement(ph);
+
+ application.setContext(appContext);
+ appContext.set(MApplication.class.getName(), application);
+
+ wb = new E4Workbench(application, appContext);
+ wb.createAndRunUI(window);
+
+ assertTrue(part.getContext() != null);
+ assertTrue(part.getContext().getParent() == detachedWindow.getContext());
+
+ detachedWindow.getChildren().remove(stack);
+ window.getChildren().add(stack);
+
+ assertTrue(part.getContext() != null);
+ assertTrue(part.getContext().getParent() == window.getContext());
+ }
+
public void testBug348069_DetachedPerspectiveWindow() {
MApplication application = ApplicationFactoryImpl.eINSTANCE
.createApplication();