From 30f18a33b64957cd5a8a9f7f1cf291ef9f5cc96d Mon Sep 17 00:00:00 2001
From: Florian Hoelzl <hoelzl@fortiss.org>
Date: Tue, 10 May 2011 09:43:57 +0000
Subject: [PATCH] removed trial patches completed working undo/redo mechanism
 fixed global actions update in navigator

---
 .../trunk/META-INF/MANIFEST.MF                |   1 +
 org.fortiss.tooling.kernel/trunk/plugin.xml   |   8 +-
 .../tooling/kernel/base/EObjectAction.java    |  51 ++++++
 .../kernel/internal/ActionService.java        | 101 +++++++-----
 .../kernel/internal/CommandStackService.java  | 145 ++++++++++++++++--
 .../kernel/internal/EditorService.java        |   1 +
 .../kernel/internal/NavigatorService.java     |   8 +
 ...Compositor.java => ProjectCompositor.java} |  10 +-
 ...r.java => ProjectModelElementHandler.java} |  21 +--
 .../NavigatorTreeContentProvider.java         |  12 +-
 .../internal/navigator/NavigatorViewPart.java |  20 ++-
 .../kernel/internal/navigator/NewMenu.java    |   6 +-
 .../properties/PropertiesAdapterFactory.java  |   4 +-
 .../kernel/services/ICommandStackService.java |  15 +-
 .../kernel/services/INavigatorService.java    |   4 +
 15 files changed, 319 insertions(+), 88 deletions(-)
 create mode 100644 org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/base/EObjectAction.java
 rename org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/{ProjectSpaceCompositor.java => ProjectCompositor.java} (85%)
 rename org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/{ProjectSpaceModelElementHandler.java => ProjectModelElementHandler.java} (78%)

diff --git a/org.fortiss.tooling.kernel/trunk/META-INF/MANIFEST.MF b/org.fortiss.tooling.kernel/trunk/META-INF/MANIFEST.MF
index 907d43c5d..3b108be87 100644
--- a/org.fortiss.tooling.kernel/trunk/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.kernel/trunk/META-INF/MANIFEST.MF
@@ -16,6 +16,7 @@ Require-Bundle: org.eclipse.core.runtime;visibility:=reexport,
  org.conqat.ide.commons.ui;bundle-version="2.7.0";visibility:=reexport,
  org.conqat.ide.commons.gef;bundle-version="2.7.0",
  org.eclipse.jdt.ui;bundle-version="3.6.2",
+ org.eclipse.emf.transaction;bundle-version="1.4.0",
  org.eclipse.emf.emfstore.server;bundle-version="0.7.3",
  org.eclipse.emf.emfstore.client;bundle-version="0.7.3",
  org.eclipse.emf.emfstore.client.ui;bundle-version="0.7.3"
diff --git a/org.fortiss.tooling.kernel/trunk/plugin.xml b/org.fortiss.tooling.kernel/trunk/plugin.xml
index 9c66cdec6..004894271 100644
--- a/org.fortiss.tooling.kernel/trunk/plugin.xml
+++ b/org.fortiss.tooling.kernel/trunk/plugin.xml
@@ -185,15 +185,15 @@
    <extension
          point="org.fortiss.tooling.kernel.modelElementHandler">
       <modelElementHandler
-            handler="org.fortiss.tooling.kernel.internal.handler.ProjectSpaceModelElementHandler"
-            modelElementClass="org.eclipse.emf.emfstore.client.model.ProjectSpace">
+            handler="org.fortiss.tooling.kernel.internal.handler.ProjectModelElementHandler"
+            modelElementClass="org.eclipse.emf.emfstore.common.model.Project">
       </modelElementHandler>
    </extension>
    <extension
          point="org.fortiss.tooling.kernel.modelElementCompositor">
       <modelElementCompositor
-            compositor="org.fortiss.tooling.kernel.internal.compose.ProjectSpaceCompositor"
-            modelElementClass="org.eclipse.emf.emfstore.client.model.ProjectSpace">
+            compositor="org.fortiss.tooling.kernel.internal.compose.ProjectCompositor"
+            modelElementClass="org.eclipse.emf.emfstore.common.model.Project">
       </modelElementCompositor>
    </extension>
 
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/base/EObjectAction.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/base/EObjectAction.java
new file mode 100644
index 000000000..f107dbf32
--- /dev/null
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/base/EObjectAction.java
@@ -0,0 +1,51 @@
+/*--------------------------------------------------------------------------+
+$Id$
+|                                                                          |
+| Copyright 2011 ForTISS GmbH                     |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.kernel.base;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+
+/**
+ * JFace {@link Action}, which uses an EObject as target.
+ * 
+ * @author hoelzlf
+ * @author $Author$
+ * @version $Rev$
+ * @levd.rating RED Rev:
+ */
+public abstract class EObjectAction extends Action {
+
+	/** Stores the target {@link EObject}. */
+	private EObject target;
+
+	/** Constructor. */
+	public EObjectAction(String text, ImageDescriptor image) {
+		super(text, image);
+	}
+
+	/** Sets the target object. */
+	public void setTarget(EObject target) {
+		this.target = target;
+	}
+
+	/** Returns the current target. */
+	public EObject getTarget() {
+		return target;
+	}
+}
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ActionService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ActionService.java
index 21f0f8296..e41893138 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ActionService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ActionService.java
@@ -20,8 +20,7 @@ package org.fortiss.tooling.kernel.internal;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.emfstore.client.model.ProjectSpace;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
+import org.eclipse.emf.emfstore.common.model.Project;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IEditorSite;
@@ -29,6 +28,7 @@ import org.eclipse.ui.ISharedImages;
 import org.eclipse.ui.IViewSite;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.actions.ActionFactory;
+import org.fortiss.tooling.kernel.base.EObjectAction;
 import org.fortiss.tooling.kernel.model.IRemovable;
 import org.fortiss.tooling.kernel.services.IActionService;
 import org.fortiss.tooling.kernel.services.ICommandStackService;
@@ -48,65 +48,53 @@ public class ActionService implements IActionService {
 	public static final String GROUP_GLOBAL_DEFAULTS = "globalDefaults";
 
 	/** The global undo action. */
-	public final IAction globalUndoAction = new Action("Undo", PlatformUI
-			.getWorkbench().getSharedImages()
-			.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO)) {
+	public final EObjectAction globalUndoAction = new EObjectAction("Undo",
+			PlatformUI.getWorkbench().getSharedImages()
+					.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO)) {
 
 		@Override
 		public void run() {
-			EObject selectedObject = EObjectSelectionUtils
-					.getCurrentSelectionFirstElement();
-			if (selectedObject != null) {
-				ICommandStackService.INSTANCE.undo(selectedObject);
+			if (getTarget() != null) {
+				ICommandStackService.INSTANCE.undo(getTarget());
 			}
 		}
+	};
+
+	/** The global redo action. */
+	public final EObjectAction globalRedoAction = new EObjectAction("Redo",
+			PlatformUI.getWorkbench().getSharedImages()
+					.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO)) {
 
 		@Override
-		public boolean isEnabled() {
-			EObject selectedObject = EObjectSelectionUtils
-					.getCurrentSelectionFirstElement();
-			return selectedObject != null
-					&& ICommandStackService.INSTANCE.canUndo(selectedObject);
+		public void run() {
+			if (getTarget() != null) {
+				ICommandStackService.INSTANCE.redo(getTarget());
+			}
 		}
 	};
 
 	/** The global delete action. */
-	public final IAction globalDeleteAction = new Action("Delete", PlatformUI
-			.getWorkbench().getSharedImages()
-			.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)) {
+	public final EObjectAction globalDeleteAction = new EObjectAction("Delete",
+			PlatformUI.getWorkbench().getSharedImages()
+					.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)) {
 		@Override
 		public void run() {
-			final EObject selectedObject = EObjectSelectionUtils
-					.getCurrentSelectionFirstElement();
+			final EObject selectedObject = getTarget();
+			if (selectedObject == null) {
+				return;
+			}
 			ICommandStackService.INSTANCE.runAsCommand(selectedObject,
 					new Runnable() {
 						@Override
 						public void run() {
-							if (selectedObject != null) {
-								if (selectedObject instanceof IRemovable) {
-									((IRemovable) selectedObject).remove();
-								} else {
-									EcoreUtil.delete(selectedObject, true);
-								}
+							if (selectedObject instanceof IRemovable) {
+								((IRemovable) selectedObject).remove();
+							} else {
+								EcoreUtil.delete(selectedObject, true);
 							}
 						}
 					});
 		}
-
-		@Override
-		public boolean isEnabled() {
-			EObject selectedObject = EObjectSelectionUtils
-					.getCurrentSelectionFirstElement();
-			if (selectedObject != null) {
-				if (selectedObject instanceof IRemovable) {
-					return ((IRemovable) selectedObject).canRemove();
-				}
-				// ProjectSpace must be deleted with repository command
-				return !(selectedObject instanceof ProjectSpace)
-						&& selectedObject.eContainer() != null;
-			}
-			return false;
-		}
 	};
 
 	/** {@inheritDoc} */
@@ -114,6 +102,7 @@ public class ActionService implements IActionService {
 	public void addGlobalDefaultActionSectionToMenu(IMenuManager menuManager) {
 		menuManager.appendToGroup(GROUP_GLOBAL_DEFAULTS, globalDeleteAction);
 		menuManager.appendToGroup(GROUP_GLOBAL_DEFAULTS, globalUndoAction);
+		menuManager.appendToGroup(GROUP_GLOBAL_DEFAULTS, globalRedoAction);
 	}
 
 	/** {@inheritDoc} */
@@ -136,12 +125,42 @@ public class ActionService implements IActionService {
 		actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
 				globalUndoAction);
 
+		globalRedoAction.setId(ActionFactory.REDO.getId());
+		globalRedoAction.setActionDefinitionId(ActionFactory.REDO
+				.getCommandId());
+		actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
+				globalRedoAction);
+
 		actionBars.updateActionBars();
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public void update() {
-		globalUndoAction.setEnabled(globalUndoAction.isEnabled());
+		EObject target = EObjectSelectionUtils
+				.getCurrentSelectionFirstElement();
+
+		if (target == null) {
+			globalUndoAction.setEnabled(false);
+			globalRedoAction.setEnabled(false);
+			globalDeleteAction.setEnabled(false);
+			return;
+		}
+
+		globalUndoAction.setTarget(target);
+		globalUndoAction.setEnabled(ICommandStackService.INSTANCE
+				.canUndo(target));
+
+		globalRedoAction.setTarget(target);
+		globalRedoAction.setEnabled(ICommandStackService.INSTANCE
+				.canRedo(target));
+
+		boolean canDelete = (target instanceof IRemovable)
+				&& ((IRemovable) target).canRemove();
+		canDelete = canDelete || !(target instanceof Project)
+				&& !(target instanceof ProjectSpace)
+				&& target.eContainer() != null;
+		globalDeleteAction.setTarget(target);
+		globalDeleteAction.setEnabled(canDelete);
 	}
 }
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 48a431e0a..aff44d5db 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,11 +17,24 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.internal;
 
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Stack;
+
 import org.eclipse.emf.common.command.BasicCommandStack;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.emfstore.client.model.Configuration;
+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.client.model.impl.ProjectSpaceImpl;
+import org.eclipse.emf.emfstore.client.model.observers.OperationListener;
 import org.eclipse.emf.emfstore.client.model.util.EMFStoreCommand;
+import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation;
 import org.fortiss.tooling.kernel.services.ICommandStackService;
 
 /**
@@ -35,14 +48,27 @@ import org.fortiss.tooling.kernel.services.ICommandStackService;
 public class CommandStackService implements ICommandStackService {
 
 	/** Stores the EMFStore command stack. */
-	private BasicCommandStack globalCommandStack;
+	private BasicCommandStack emfStoreCommandStack;
+
+	/** Stores the project state observers. */
+	private Map<ProjectSpace, ProjectSpaceObserver> projectSpaceObserverMap = new HashMap<ProjectSpace, CommandStackService.ProjectSpaceObserver>();
+
+	/** Stores the workspace listener. */
+	private AdapterImpl workspaceListener;
 
 	/** Constructor. */
 	public CommandStackService() {
-		// make sure workspace is initialized
-		// before fetching command stack
-		WorkspaceManager.getInstance().getCurrentWorkspace();
-		globalCommandStack = (BasicCommandStack) Configuration
+
+		Workspace ws = WorkspaceManager.getInstance().getCurrentWorkspace();
+		createWorkspaceListener();
+		ws.eAdapters().add(workspaceListener);
+
+		for (ProjectSpace ps : ws.getProjectSpaces()) {
+			ProjectSpaceObserver state = new ProjectSpaceObserver(ps);
+			projectSpaceObserverMap.put(ps, state);
+		}
+
+		emfStoreCommandStack = (BasicCommandStack) Configuration
 				.getEditingDomain().getCommandStack();
 	}
 
@@ -56,30 +82,129 @@ public class CommandStackService implements ICommandStackService {
 				runner.run();
 			}
 		};
-		globalCommandStack.execute(command);
+		emfStoreCommandStack.execute(command);
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public boolean canUndo(EObject target) {
-		return globalCommandStack.canUndo();
+		ProjectSpace projectSpace = WorkspaceManager.getProjectSpace(target);
+		return !projectSpace.getOperations().isEmpty();
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public boolean canRedo(EObject target) {
-		return globalCommandStack.canRedo();
+		ProjectSpace projectSpace = WorkspaceManager.getProjectSpace(target);
+		return projectSpaceObserverMap.get(projectSpace).canRedo();
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public void undo(EObject target) {
-		globalCommandStack.undo();
+		final ProjectSpace projectSpace = WorkspaceManager
+				.getProjectSpace(target);
+		// also pushes the operation on the project state observer's redo stack
+		emfStoreCommandStack.execute(new EMFStoreCommand() {
+
+			@Override
+			protected void doRun() {
+				projectSpace.undoLastOperation();
+			}
+		});
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public void redo(EObject target) {
-		globalCommandStack.redo();
+		ProjectSpace projectSpace = WorkspaceManager.getProjectSpace(target);
+		projectSpaceObserverMap.get(projectSpace).redo();
+	}
+
+	/** Creates the workspace listener. */
+	private void createWorkspaceListener() {
+		workspaceListener = new AdapterImpl() {
+			@Override
+			public void notifyChanged(Notification msg) {
+				if ((msg.getFeatureID(Workspace.class)) == ModelPackage.WORKSPACE__PROJECT_SPACES) {
+					if (msg.getEventType() == Notification.ADD
+							&& ModelPackage.eINSTANCE.getProjectSpace()
+									.isInstance(msg.getNewValue())) {
+						ProjectSpace projectSpace = (ProjectSpace) msg
+								.getNewValue();
+						ProjectSpaceObserver obs = new ProjectSpaceObserver(
+								projectSpace);
+						projectSpaceObserverMap.put(projectSpace, obs);
+					} else if (msg.getEventType() == Notification.REMOVE
+							&& ModelPackage.eINSTANCE.getProjectSpace()
+									.isInstance(msg.getOldValue())) {
+						ProjectSpace projectSpace = (ProjectSpace) msg
+								.getOldValue();
+						ProjectSpaceObserver obs = projectSpaceObserverMap
+								.remove(projectSpace);
+						obs.dispose();
+					}
+				}
+			}
+		};
+	}
+
+	/** Observes the state of a {@link ProjectSpace}. */
+	private class ProjectSpaceObserver implements OperationListener {
+
+		/** Stores the project space reference. */
+		private final ProjectSpace projectSpace;
+
+		/** Stores the redo stack. */
+		private final Stack<AbstractOperation> redoStack = new Stack<AbstractOperation>();
+
+		/** Flag indicating the current operation is a redo. */
+		private boolean redoInProgress = false;
+
+		/** Constructor. */
+		public ProjectSpaceObserver(ProjectSpace projectSpace) {
+			this.projectSpace = projectSpace;
+			projectSpace.addOperationListener(this);
+		}
+
+		/** {@inheritDoc} */
+		@Override
+		public void operationExecuted(AbstractOperation operation) {
+			if (!redoInProgress) {
+				// clear stack if not observing a redo
+				redoStack.clear();
+			}
+		}
+
+		/** {@inheritDoc} */
+		@Override
+		public void operationUnDone(AbstractOperation operation) {
+			redoStack.add(operation);
+		}
+
+		/** Returns whether redo is possible. */
+		public boolean canRedo() {
+			return !redoStack.isEmpty();
+		}
+
+		/** Redo the last operation. */
+		public void redo() {
+			final LinkedList<AbstractOperation> ops = new LinkedList<AbstractOperation>();
+			ops.add(redoStack.pop());
+			emfStoreCommandStack.execute(new EMFStoreCommand() {
+
+				@Override
+				protected void doRun() {
+					redoInProgress = true;
+					((ProjectSpaceImpl) projectSpace).applyOperations(ops);
+					redoInProgress = false;
+				}
+			});
+		}
+
+		/** Disposes the project state observer. */
+		public void dispose() {
+			projectSpace.removeOperationListener(this);
+		}
 	}
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/EditorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/EditorService.java
index 39c4f23da..d2b6654e4 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/EditorService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/EditorService.java
@@ -67,6 +67,7 @@ public class EditorService extends EObjectAwareServiceBase<IEditorBinding<EObjec
 	@Override
 	public void openInEditor(EObject element) {
 		try {
+			// FIXME (FH): only open editor, if at least one bound appear
 			PlatformUI
 					.getWorkbench()
 					.getActiveWorkbenchWindow()
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/NavigatorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/NavigatorService.java
index 8735111d1..44e58a433 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/NavigatorService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/NavigatorService.java
@@ -17,6 +17,7 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.internal;
 
+import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.ui.part.ViewPart;
 import org.fortiss.tooling.kernel.internal.navigator.NavigatorViewPart;
 import org.fortiss.tooling.kernel.services.INavigatorService;
@@ -44,4 +45,11 @@ public class NavigatorService implements INavigatorService {
 	public ViewPart getNavigatorView() {
 		return navigatorViewPart;
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public ISelection getCurrentSelection() {
+		return navigatorViewPart.getSite().getSelectionProvider()
+				.getSelection();
+	}
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectSpaceCompositor.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectCompositor.java
similarity index 85%
rename from org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectSpaceCompositor.java
rename to org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectCompositor.java
index 12293e48c..dc8d0923f 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectSpaceCompositor.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectCompositor.java
@@ -18,7 +18,7 @@ $Id$
 package org.fortiss.tooling.kernel.internal.compose;
 
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.emfstore.client.model.ProjectSpace;
+import org.eclipse.emf.emfstore.common.model.Project;
 import org.fortiss.tooling.kernel.interfaces.ICompositionContext;
 import org.fortiss.tooling.kernel.interfaces.ICompositor;
 import org.fortiss.tooling.kernel.model.IProjectRootElement;
@@ -31,20 +31,20 @@ import org.fortiss.tooling.kernel.model.IProjectRootElement;
  * @version $Rev$
  * @levd.rating RED Rev:
  */
-public final class ProjectSpaceCompositor implements ICompositor<ProjectSpace> {
+public final class ProjectCompositor implements ICompositor<Project> {
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean canCompose(ProjectSpace container, EObject contained,
+	public boolean canCompose(Project container, EObject contained,
 			ICompositionContext context) {
 		return contained instanceof IProjectRootElement;
 	}
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean compose(ProjectSpace container, EObject contained,
+	public boolean compose(Project container, EObject contained,
 			ICompositionContext context) {
-		container.getProject().addModelElement(contained);
+		container.addModelElement(contained);
 		return true;
 	}
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectSpaceModelElementHandler.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectModelElementHandler.java
similarity index 78%
rename from org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectSpaceModelElementHandler.java
rename to org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectModelElementHandler.java
index 606b2e6c4..d657e121d 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectSpaceModelElementHandler.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectModelElementHandler.java
@@ -21,7 +21,8 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.emfstore.client.model.ProjectSpace;
+import org.eclipse.emf.emfstore.client.model.WorkspaceManager;
+import org.eclipse.emf.emfstore.common.model.Project;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.fortiss.tooling.kernel.ToolingKernelActivator;
 import org.fortiss.tooling.kernel.base.HandlerBase;
@@ -29,26 +30,26 @@ import org.fortiss.tooling.kernel.interfaces.IHandler;
 import org.fortiss.tooling.kernel.model.IProjectRootElement;
 
 /**
- * {@link IHandler} for {@link ProjectSpace}s.
+ * {@link IHandler} for {@link Project}s.
  * 
  * @author hoelzlf
  * @author $Author$
  * @version $Rev$
  * @levd.rating RED Rev:
  */
-public final class ProjectSpaceModelElementHandler extends
-		HandlerBase<ProjectSpace> {
+public final class ProjectModelElementHandler extends HandlerBase<Project> {
 
 	/** {@inheritDoc} */
 	@Override
-	public String getName(ProjectSpace element) {
-		return element.getProjectName();
+	public String getName(Project element) {
+		return WorkspaceManager.getProjectSpace(element).getProjectName();
 	}
 
 	/** {@inheritDoc} */
 	@Override
-	public String getDescription(ProjectSpace element) {
-		return element.getProjectDescription();
+	public String getDescription(Project element) {
+		return WorkspaceManager.getProjectSpace(element)
+				.getProjectDescription();
 	}
 
 	/** {@inheritDoc} */
@@ -59,9 +60,9 @@ public final class ProjectSpaceModelElementHandler extends
 
 	/** {@inheritDoc} */
 	@Override
-	public List<EObject> getSubnodes(ProjectSpace element) {
+	public List<EObject> getSubnodes(Project element) {
 		List<EObject> list = new ArrayList<EObject>();
-		for (EObject node : element.getProject().getModelElements()) {
+		for (EObject node : element.getModelElements()) {
 			if (node instanceof IProjectRootElement) {
 				list.add(node);
 			}
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 b7ab04a74..35f60cb74 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
@@ -17,8 +17,13 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.internal.navigator;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.emfstore.client.model.ProjectSpace;
 import org.eclipse.emf.emfstore.client.model.Workspace;
+import org.eclipse.emf.emfstore.common.model.Project;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 import org.fortiss.tooling.kernel.interfaces.IHandler;
@@ -38,7 +43,12 @@ public class NavigatorTreeContentProvider implements ITreeContentProvider {
 	@Override
 	public Object[] getElements(Object inputElement) {
 		if (inputElement instanceof Workspace) {
-			return ((Workspace) inputElement).getProjectSpaces().toArray();
+			List<Project> result = new ArrayList<Project>();
+			for (ProjectSpace space : ((Workspace) inputElement)
+					.getProjectSpaces()) {
+				result.add(space.getProject());
+			}
+			return result.toArray();
 		}
 		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 d51f4f11a..699317bd4 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
@@ -38,7 +38,9 @@ import org.eclipse.jface.viewers.DecoratingLabelProvider;
 import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
@@ -70,7 +72,7 @@ import org.fortiss.tooling.kernel.util.EObjectSelectionUtils;
  * @levd.rating RED Rev:
  */
 public final class NavigatorViewPart extends ViewPart implements
-		ISelectionListener, IDoubleClickListener,
+		ISelectionListener, ISelectionChangedListener, IDoubleClickListener,
 		ITabbedPropertySheetPageContributor, ICustomMenuContributor {
 
 	/** Stores the TreeViewer. */
@@ -185,8 +187,9 @@ public final class NavigatorViewPart extends ViewPart implements
 							.getLabelDecorator()));
 			viewer.setContentProvider(new NavigatorTreeContentProvider());
 
-			createContextMenu();
 			getSite().setSelectionProvider(viewer);
+			createContextMenu();
+			viewer.addSelectionChangedListener(this);
 
 			viewer.setInput(workspace);
 
@@ -227,14 +230,16 @@ public final class NavigatorViewPart extends ViewPart implements
 	/** {@inheritDoc} */
 	@Override
 	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		EObject selectedElement = EObjectSelectionUtils
-				.getCurrentSelectionFirstElement();
-		if (selectedElement != null) {
-			IActionService.INSTANCE.update();
-		}
+		IActionService.INSTANCE.update();
 		// TODO (FH): implement link with editor feature here
 	}
 
+	/** {@inheritDoc} */
+	@Override
+	public void selectionChanged(SelectionChangedEvent event) {
+		IActionService.INSTANCE.update();
+	}
+
 	/** {@inheritDoc} */
 	@Override
 	public void dispose() {
@@ -288,5 +293,4 @@ public final class NavigatorViewPart extends ViewPart implements
 		result.add(new NewMenu());
 		return result;
 	}
-
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NewMenu.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NewMenu.java
index 583819daf..f574b1820 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NewMenu.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NewMenu.java
@@ -27,6 +27,7 @@ import org.fortiss.tooling.kernel.services.ICommandStackService;
 import org.fortiss.tooling.kernel.services.ICompositorService;
 import org.fortiss.tooling.kernel.services.IEditorService;
 import org.fortiss.tooling.kernel.services.IModelElementService;
+import org.fortiss.tooling.kernel.services.INavigatorService;
 import org.fortiss.tooling.kernel.services.IPrototypeService;
 import org.fortiss.tooling.kernel.services.IPrototypeService.Prototype;
 import org.fortiss.tooling.kernel.util.EObjectSelectionUtils;
@@ -60,8 +61,11 @@ public class NewMenu extends CompoundContributionItem {
 	/** {@inheritDoc} */
 	@Override
 	protected IContributionItem[] getContributionItems() {
+		// FIXME (FH): this assumes the navigator is providing the
+		// selection, which might not be what we want!
 		EObject selectedObject = EObjectSelectionUtils
-				.getCurrentSelectionFirstElement();
+				.getFirstElement(INavigatorService.INSTANCE
+						.getCurrentSelection());
 
 		List<IContributionItem> contributionItems = new ArrayList<IContributionItem>();
 		if (selectedObject != null) {
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/properties/PropertiesAdapterFactory.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/properties/PropertiesAdapterFactory.java
index 3b9df3381..836ce2931 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/properties/PropertiesAdapterFactory.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/properties/PropertiesAdapterFactory.java
@@ -19,9 +19,9 @@ package org.fortiss.tooling.kernel.internal.properties;
 
 import org.eclipse.core.runtime.IAdapterFactory;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
 import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
 import org.fortiss.tooling.kernel.services.IPropertiesService;
-import org.fortiss.tooling.kernel.util.ProjectRootElementUtils;
 
 /**
  * Adapter factory for tabbed property sheets.
@@ -40,7 +40,7 @@ public final class PropertiesAdapterFactory implements IAdapterFactory {
 		if (adapterType == ITabbedPropertySheetPageContributor.class
 				&& adaptableObject instanceof EObject) {
 			EObject modelElement = (EObject) adaptableObject;
-			if (ProjectRootElementUtils.getProjectSpace(modelElement) != null) {
+			if (ModelUtil.getProject(modelElement) != null) {
 				return new ITabbedPropertySheetPageContributor() {
 
 					@Override
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/ICommandStackService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/ICommandStackService.java
index e4b941dcb..4d2925ff9 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/ICommandStackService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/ICommandStackService.java
@@ -22,7 +22,8 @@ import org.fortiss.tooling.kernel.internal.CommandStackService;
 
 /**
  * The command stack service manages the access to the command stack and editing
- * domain.
+ * domain. It provides a Undo/Redo mechanism and allows {@link Runnable}s to be
+ * executed, which need to modify the model.
  * 
  * @author hoelzl
  * @author $Author$
@@ -34,18 +35,20 @@ public interface ICommandStackService {
 	/** Returns the singleton instance of the service. */
 	public static final ICommandStackService INSTANCE = new CommandStackService();
 
-	/** Runs the given Runnable within a emfStore transaction. */
+	/** Runs the given {@link Runnable} within a emfStore transaction. */
 	void runAsCommand(EObject target, Runnable runner);
 
-	/** Checks if an undo action is possible. */
+	/** Checks if an undo command is possible on the given target's project. */
 	boolean canUndo(EObject target);
 
-	/** Executes the undo action. */
+	/** Executes the undo command on the target's project. */
 	void undo(EObject target);
 
-	/** Checks if a redo action is possible. */
+	/**
+	 * Checks if a redo command is possible on the given target's project.
+	 */
 	boolean canRedo(EObject target);
 
-	/** Executes the redo action. */
+	/** Executes the redo command on the target's project. */
 	void redo(EObject target);
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/INavigatorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/INavigatorService.java
index eda351ed1..9a63ab9b3 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/INavigatorService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/INavigatorService.java
@@ -17,6 +17,7 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.services;
 
+import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.ui.part.ViewPart;
 import org.fortiss.tooling.kernel.internal.NavigatorService;
 
@@ -41,4 +42,7 @@ public interface INavigatorService {
 	 * navigator has not yet been created or has already been disposed.
 	 */
 	ViewPart getNavigatorView();
+
+	/** Returns the current naviaator selection. */
+	ISelection getCurrentSelection();
 }
-- 
GitLab