Bug 321757 EPS adds a part without considering its placeholder if target container is not a part stack
diff --git a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/PartServiceImpl.java b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/PartServiceImpl.java
index ca564c0..784240d 100644
--- a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/PartServiceImpl.java
+++ b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/PartServiceImpl.java
@@ -552,15 +552,13 @@
addToLastContainer(category, providedPart);
} else {
Object element = elements.get(0);
- if (element instanceof MPartStack) {
- MPartStack stack = (MPartStack) element;
- if (providedPart.getCurSharedRef() instanceof MPlaceholder) {
- stack.getChildren().add(providedPart.getCurSharedRef());
+ if (element instanceof MElementContainer<?>) {
+ MPlaceholder placeholder = providedPart.getCurSharedRef();
+ if (placeholder == null) {
+ ((MElementContainer) element).getChildren().add(providedPart);
} else {
- stack.getChildren().add(providedPart);
+ ((MElementContainer) element).getChildren().add(placeholder);
}
- } else if (element instanceof MElementContainer<?>) {
- ((MElementContainer<MPart>) element).getChildren().add(providedPart);
} else {
addToLastContainer(category, providedPart);
}
diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/EPartServiceTest.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/EPartServiceTest.java
index 54e298f..79e7582 100644
--- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/EPartServiceTest.java
+++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/application/EPartServiceTest.java
@@ -2251,6 +2251,48 @@
assertEquals(placeholder, perspective.getChildren().get(1));
}
+ public void testShowPart_Bug321757() {
+ MApplication application = ApplicationFactoryImpl.eINSTANCE
+ .createApplication();
+
+ MPartDescriptor partDescriptor = org.eclipse.e4.ui.model.application.descriptor.basic.impl.BasicFactoryImpl.eINSTANCE
+ .createPartDescriptor();
+ partDescriptor.setCategory("containerTag");
+ partDescriptor.setElementId("partId");
+ partDescriptor.setAllowMultiple(true);
+ application.getDescriptors().add(partDescriptor);
+
+ 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();
+ perspective.getTags().add("containerTag");
+ perspectiveStack.getChildren().add(perspective);
+ perspectiveStack.setSelectedElement(perspective);
+
+ initialize(applicationContext, application);
+
+ getEngine().createGui(window);
+
+ EPartService partService = window.getContext().get(EPartService.class);
+
+ MPlaceholder placeholder = partService.createSharedPart("partId",
+ window, true);
+ MPart sharedPart = (MPart) placeholder.getRef();
+ sharedPart.setCurSharedRef(placeholder);
+ partService.showPart(sharedPart, PartState.ACTIVATE);
+
+ assertEquals(1, perspective.getChildren().size());
+ assertEquals(placeholder, perspective.getChildren().get(0));
+ }
+
public void testHidePart_PartInAnotherWindow() {
MApplication application = createApplication(
new String[] { "partInWindow1" },