Bug 514935 - Reset of Perspective restores not restorable views

- on perspective save, update the toBeRendered state of elements before
placeholder references are removed and the perspective is saved as a
snippet


Change-Id: I4d05c576382c4c08dcb137ac9468e54ada9fa42d
Signed-off-by: Alexandra Buzila <abuzila@eclipsesource.com>
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPage.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPage.java
index 8243083..cfd0568 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPage.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchPage.java
@@ -87,6 +87,7 @@
 import org.eclipse.e4.ui.workbench.modeling.EPartService;
 import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.jface.dialogs.DialogSettings;
 import org.eclipse.jface.dialogs.IDialogSettings;
 import org.eclipse.jface.dialogs.IPageChangeProvider;
@@ -3969,24 +3970,19 @@
 		visiblePerspective.setLabel(perspective.getLabel());
 		visiblePerspective.setTooltip(perspective.getLabel());
 		visiblePerspective.setElementId(perspective.getId());
-		MUIElement clone = modelService.cloneElement(visiblePerspective, application);
-		MWindow window = WorkbenchWindow.class.cast(getActivePart().getSite().getWorkbenchWindow()).getModel();
-		ModelServiceImpl.class.cast(modelService).getNullRefPlaceHolders(clone, window);
-		List<MPlaceholder> elementsToHide = modelService.findElements(clone, null, MPlaceholder.class, null);
+
+		MPerspective copy = (MPerspective) EcoreUtil.copy((EObject) visiblePerspective);
+
+		List<MPlaceholder> elementsToHide = modelService.findElements(copy, null, MPlaceholder.class, null);
 		for (MPlaceholder elementToHide : elementsToHide) {
-			if (elementToHide.getRef().getTags().contains(IPresentationEngine.NO_RESTORE)) {
+			if (elementToHide.isToBeRendered()
+					&& elementToHide.getRef().getTags().contains(IPresentationEngine.NO_RESTORE)) {
 				elementToHide.setToBeRendered(false);
-				MElementContainer<MUIElement> phParent = elementToHide.getParent();
-				if (phParent.getSelectedElement() == elementToHide) {
-					phParent.setSelectedElement(null);
-				}
-				int vc = modelService.countRenderableChildren(phParent);
-				if (vc == 0) {
-					if (!modelService.isLastEditorStack(phParent))
-						phParent.setToBeRendered(false);
-				}
+				updateSelectionAndParentVisibility(elementToHide);
 			}
 		}
+		// remove placeholder refs and save as snippet
+		modelService.cloneElement(copy, application);
 		if (perspective instanceof PerspectiveDescriptor) {
 			((PerspectiveDescriptor) perspective).setHasCustomDefinition(true);
 		}
@@ -3994,6 +3990,18 @@
 		UIEvents.publishEvent(UIEvents.UILifeCycle.PERSPECTIVE_SAVED, visiblePerspective);
 	}
 
+	private void updateSelectionAndParentVisibility(MUIElement element) {
+		MElementContainer<MUIElement> parent = element.getParent();
+		if (parent.getSelectedElement() == element) {
+			parent.setSelectedElement(null);
+		}
+		int renderableChildren = modelService.countRenderableChildren(parent);
+		if (renderableChildren == 0 && !modelService.isLastEditorStack(parent)) {
+			parent.setToBeRendered(false);
+			updateSelectionAndParentVisibility(parent);
+		}
+	}
+
 	@Override
 	public void setEditorAreaVisible(boolean showEditorArea) {
 		MUIElement find = findSharedArea();