From f868baefcc488ece91a9295a362cf114e52fc73c Mon Sep 17 00:00:00 2001
From: Florian Hoelzl <hoelzl@fortiss.org>
Date: Wed, 6 Apr 2011 11:59:50 +0000
Subject: [PATCH] moved from org.unicase to org.eclipse.emf.emfstore,
 org.eclipse.emf.ecp

---
 .../kernel/internal/CommandStackService.java  | 91 ++++---------------
 .../NavigatorTreeContentProvider.java         |  2 +-
 .../internal/navigator/NavigatorViewPart.java | 44 ++++++++-
 3 files changed, 60 insertions(+), 77 deletions(-)

diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/CommandStackService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/CommandStackService.java
index 08ba85fbc..48a431e0a 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/CommandStackService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/CommandStackService.java
@@ -17,24 +17,15 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.internal;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.ChangeCommand;
-import org.eclipse.emf.emfstore.client.model.ProjectSpace;
-import org.eclipse.emf.emfstore.client.model.Workspace;
+import org.eclipse.emf.emfstore.client.model.Configuration;
 import org.eclipse.emf.emfstore.client.model.WorkspaceManager;
-import org.eclipse.emf.emfstore.common.model.Project;
+import org.eclipse.emf.emfstore.client.model.util.EMFStoreCommand;
 import org.fortiss.tooling.kernel.services.ICommandStackService;
 
 /**
- * This class implements the {@link ICommandStackService} interface. We have to
- * mimic the command stack behavior, because EMFStore does not support redo of
- * commands. Once this capability is available, this service class could be
- * simplified.
+ * This class implements the {@link ICommandStackService} interface.
  * 
  * @author hoelzl
  * @author $Author$
@@ -43,100 +34,52 @@ import org.fortiss.tooling.kernel.services.ICommandStackService;
  */
 public class CommandStackService implements ICommandStackService {
 
-	/** Stores the workspace listener. */
-	private AdapterImpl workspaceListener;
-
-	/** Stores the EmfStore workspace. */
-	private Workspace workspace;
-
-	/** Stores the project command stacks. */
-	private Map<Project, BasicCommandStack> commandStackMap = new HashMap<Project, BasicCommandStack>();
+	/** Stores the EMFStore command stack. */
+	private BasicCommandStack globalCommandStack;
 
 	/** Constructor. */
 	public CommandStackService() {
-		workspace = WorkspaceManager.getInstance().getCurrentWorkspace();
+		// make sure workspace is initialized
+		// before fetching command stack
+		WorkspaceManager.getInstance().getCurrentWorkspace();
+		globalCommandStack = (BasicCommandStack) Configuration
+				.getEditingDomain().getCommandStack();
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public void runAsCommand(EObject target, final Runnable runner) {
-		ChangeCommand chgCommand = new ChangeCommand(target) {
+		EMFStoreCommand command = new EMFStoreCommand() {
 
 			@Override
-			protected void doExecute() {
+			protected void doRun() {
 				runner.run();
 			}
 		};
-		// commandStackMap.get(ProjectRootElementUtils.getECPProject(target))
-		// .execute(chgCommand);
+		globalCommandStack.execute(command);
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public boolean canUndo(EObject target) {
-		return false;
-		// return commandStackMap.get(
-		// ProjectRootElementUtils.getECPProject(target)).canUndo();
+		return globalCommandStack.canUndo();
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public boolean canRedo(EObject target) {
-		return false;
-		// return commandStackMap.get(
-		// ProjectRootElementUtils.getECPProject(target)).canRedo();
+		return globalCommandStack.canRedo();
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public void undo(EObject target) {
-		// commandStackMap.get(ProjectRootElementUtils.getECPProject(target))
-		// .undo();
+		globalCommandStack.undo();
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public void redo(EObject target) {
-		// commandStackMap.get(ProjectRootElementUtils.getECPProject(target))
-		// .redo();
-	}
-
-	/**
-	 * Creates the workspace listener, which adds the command stacks for the
-	 * added projects. It also unregisters command stacks from removed projects.
-	 */
-	private void createWorkspaceListener() {
-		// workspaceListener = new AdapterImpl() {
-		//
-		// @Override
-		// public void notifyChanged(Notification msg) {
-		// if ((msg.getFeatureID(Workspace.class)) ==
-		// WorkSpaceModelPackage.ECP_WORKSPACE__PROJECTS) {
-		// if (msg.getEventType() == Notification.ADD
-		// && WorkSpaceModelPackage.eINSTANCE.getECPProject()
-		// .isInstance(msg.getNewValue())) {
-		// addCommandStack((ECPProject) msg.getNewValue());
-		// } else if (msg.getEventType() == Notification.REMOVE
-		// && WorkSpaceModelPackage.eINSTANCE.getECPProject()
-		// .isInstance(msg.getOldValue())) {
-		// removeCommandStack((ECPProject) msg.getOldValue());
-		// }
-		// }
-		// super.notifyChanged(msg);
-		// }
-		// };
-	}
-
-	/** Adds the command stack for the given project space. */
-	private void addCommandStack(ProjectSpace projectSpace) {
-		// BasicCommandStack cmdStack = (BasicCommandStack)
-		// projectSpace.getProject()
-		// .getEditingDomain().getCommandStack();
-		// commandStackMap.put(project, cmdStack);
-	}
-
-	/** Removes the command stack for the given project. */
-	private void removeCommandStack(ProjectSpace project) {
-		// commandStackMap.remove(project);
+		globalCommandStack.redo();
 	}
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorTreeContentProvider.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorTreeContentProvider.java
index 885ec05e5..b7ab04a74 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorTreeContentProvider.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorTreeContentProvider.java
@@ -59,7 +59,7 @@ public class NavigatorTreeContentProvider implements ITreeContentProvider {
 	/** {@inheritDoc} */
 	@Override
 	public Object getParent(Object element) {
-		if (element instanceof EObject) {
+		if (element instanceof EObject && !(element instanceof Workspace)) {
 			return ((EObject) element).eContainer();
 		}
 		return null;
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorViewPart.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorViewPart.java
index bd4ecebf0..d51f4f11a 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorViewPart.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorViewPart.java
@@ -30,6 +30,8 @@ import org.eclipse.emf.emfstore.client.model.ModelPackage;
 import org.eclipse.emf.emfstore.client.model.ProjectSpace;
 import org.eclipse.emf.emfstore.client.model.Workspace;
 import org.eclipse.emf.emfstore.client.model.WorkspaceManager;
+import org.eclipse.emf.emfstore.common.model.Project;
+import org.eclipse.emf.emfstore.common.model.util.ProjectChangeObserver;
 import org.eclipse.jface.action.IContributionItem;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.viewers.DecoratingLabelProvider;
@@ -80,6 +82,9 @@ public final class NavigatorViewPart extends ViewPart implements
 	/** Stores the workspace listener. */
 	private AdapterImpl workspaceListener;
 
+	/** Stores the project listener. */
+	private ProjectChangeObserver projectListener;
+
 	/** Stores the menu manager. */
 	private MenuManager menuManager;
 
@@ -97,11 +102,44 @@ public final class NavigatorViewPart extends ViewPart implements
 		workspace = WorkspaceManager.getInstance().getCurrentWorkspace();
 
 		createWorkspaceListener();
+		createProjectListener();
 
 		((NavigatorService) INavigatorService.INSTANCE)
 				.setNavigatorViewPart(this);
 	}
 
+	/** Creates the project listener. */
+	private void createProjectListener() {
+		projectListener = new ProjectChangeObserver() {
+
+			@Override
+			public void projectDeleted(Project project) {
+				updateUI.schedule();
+			}
+
+			@Override
+			public void notify(Notification notification, Project project,
+					EObject modelElement) {
+				updateUI.schedule();
+			}
+
+			@Override
+			public void modelElementRemoved(Project project,
+					EObject modelElement) {
+				updateUI.schedule();
+			}
+
+			@Override
+			public void modelElementAdded(Project project, EObject modelElement) {
+				updateUI.schedule();
+			}
+		};
+
+		for (ProjectSpace projectSpace : workspace.getProjectSpaces()) {
+			projectSpace.getProject().addProjectChangeObserver(projectListener);
+		}
+	}
+
 	/** Creates the workspace listener. */
 	private void createWorkspaceListener() {
 		workspaceListener = new AdapterImpl() {
@@ -113,13 +151,15 @@ public final class NavigatorViewPart extends ViewPart implements
 									.isInstance(msg.getNewValue())) {
 						ProjectSpace projectSpace = (ProjectSpace) msg
 								.getNewValue();
-						// projectSpace.addECPProjectListener(projectListener);
+						projectSpace.getProject().addProjectChangeObserver(
+								projectListener);
 					} else if (msg.getEventType() == Notification.REMOVE
 							&& ModelPackage.eINSTANCE.getProjectSpace()
 									.isInstance(msg.getOldValue())) {
 						ProjectSpace projectSpace = (ProjectSpace) msg
 								.getOldValue();
-						// projectSpace.removeECPProjectListener(projectListener);
+						projectSpace.getProject().removeProjectChangeObserver(
+								projectListener);
 					}
 					updateUI.schedule();
 				}
-- 
GitLab