From 45c8a0859b626c619f39f9bbe7ba47c677224f92 Mon Sep 17 00:00:00 2001
From: Florian Hoelzl <hoelzl@fortiss.org>
Date: Wed, 16 Feb 2011 16:07:59 +0000
Subject: [PATCH] fixed the new menu contribution

---
 .../trunk/META-INF/MANIFEST.MF                |  3 +-
 org.fortiss.tooling.kernel/trunk/plugin.xml   | 40 +++++++++++++++++--
 .../kernel/internal/CommandStackService.java  | 23 +++++++++++
 ...sitor.java => ProjectSpaceCompositor.java} | 11 +++--
 ...a => ProjectSpaceModelElementHandler.java} | 26 +++++-------
 .../NavigatorTreeContentProvider.java         | 12 +++++-
 .../internal/navigator/NavigatorViewPart.java | 36 +++++++++++++----
 .../kernel/internal/navigator/NewMenu.java    | 19 ++++++---
 .../kernel/services/ICommandStackService.java |  4 +-
 9 files changed, 132 insertions(+), 42 deletions(-)
 rename org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/{EMFStoreECPProjectCompositor.java => ProjectSpaceCompositor.java} (84%)
 rename org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/{EMFStoreECPProjectModelElementHandler.java => ProjectSpaceModelElementHandler.java} (69%)

diff --git a/org.fortiss.tooling.kernel/trunk/META-INF/MANIFEST.MF b/org.fortiss.tooling.kernel/trunk/META-INF/MANIFEST.MF
index add63a01a..0aa3a2b2b 100644
--- a/org.fortiss.tooling.kernel/trunk/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.kernel/trunk/META-INF/MANIFEST.MF
@@ -13,7 +13,8 @@ Require-Bundle: org.eclipse.ui;visibility:=reexport,
  org.conqat.ide.commons.ui;bundle-version="2.7.0";visibility:=reexport,
  org.unicase.workspace;bundle-version="1.0.0",
  org.unicase.ecp.model;bundle-version="1.0.0",
- org.unicase.ecpemfstorebridge;bundle-version="1.0.0"
+ org.unicase.ecpemfstorebridge;bundle-version="1.0.0",
+ org.unicase.ui.common;bundle-version="1.0.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ActivationPolicy: lazy
 Export-Package: org.fortiss.tooling.kernel,
diff --git a/org.fortiss.tooling.kernel/trunk/plugin.xml b/org.fortiss.tooling.kernel/trunk/plugin.xml
index 3581f753c..1e7a37459 100644
--- a/org.fortiss.tooling.kernel/trunk/plugin.xml
+++ b/org.fortiss.tooling.kernel/trunk/plugin.xml
@@ -24,16 +24,48 @@
    <extension
          point="org.fortiss.tooling.kernel.modelElementHandler">
       <modelElementHandler
-            handler="org.fortiss.tooling.kernel.internal.handler.EMFStoreECPProjectModelElementHandler"
-            modelElementClass="org.unicase.ecpemfstorebridge.EMFStoreECPProject">
+            handler="org.fortiss.tooling.kernel.internal.handler.ProjectSpaceModelElementHandler"
+            modelElementClass="org.unicase.workspace.ProjectSpace">
       </modelElementHandler>
    </extension>
    <extension
          point="org.fortiss.tooling.kernel.modelElementCompositor">
       <modelElementCompositor
-            compositor="org.fortiss.tooling.kernel.internal.compose.EMFStoreECPProjectCompositor"
-            modelElementClass="org.unicase.ecpemfstorebridge.EMFStoreECPProject">
+            compositor="org.fortiss.tooling.kernel.internal.compose.ProjectSpaceCompositor"
+            modelElementClass="org.unicase.workspace.ProjectSpace">
       </modelElementCompositor>
    </extension>
+   <extension
+         point="org.eclipse.ui.menus">
+         
+      <menuContribution
+            allPopups="false"
+            locationURI="popup:org.fortiss.tooling.kernel.model.navigator?before=repository">
+         <menu
+               icon="icons/add.png"
+               id="org.fortiss.tooling.kernel.model.navigator.newmenu"
+               label="New...">
+            <visibleWhen
+                  checkEnabled="false">
+               <with
+                     variable="activeMenuSelection">
+                  <iterate>
+                     <adapt
+                           type="org.eclipse.emf.ecore.EObject">
+                     </adapt>
+                  </iterate>
+               </with>
+            </visibleWhen>
+         </menu>
+      </menuContribution>
+     <menuContribution
+           allPopups="false"
+           locationURI="popup:org.fortiss.tooling.kernel.model.navigator.newmenu">
+        <dynamic
+              class="org.fortiss.tooling.kernel.internal.navigator.NewMenu"
+              id="org.fortiss.tooling.kernel.model.navigator.newmenu.content">
+        </dynamic>
+     </menuContribution>      
+   </extension>
 
 </plugin>
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 2b2d2b881..01b057fcc 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,7 +17,12 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.internal;
 
+import org.eclipse.emf.ecore.EObject;
 import org.fortiss.tooling.kernel.services.ICommandStackService;
+import org.unicase.ecp.model.ECPWorkspaceManager;
+import org.unicase.ecp.model.NoWorkspaceException;
+import org.unicase.ecp.model.workSpaceModel.ECPProject;
+import org.unicase.ui.common.commands.ECPCommand;
 
 /**
  * This class implements the {@link ICommandStackService} interface.
@@ -29,4 +34,22 @@ import org.fortiss.tooling.kernel.services.ICommandStackService;
  */
 public class CommandStackService implements ICommandStackService {
 
+	/** {@inheritDoc} */
+	@Override
+	public void runAsCommand(final EObject target, final Runnable runner) {
+		ECPProject project;
+		try {
+			project = ECPWorkspaceManager.getInstance().getWorkSpace()
+					.getProject(target);
+		} catch (NoWorkspaceException e) {
+			return;
+		}
+		new ECPCommand(project.getRootObject()) {
+
+			@Override
+			protected void doRun() {
+				runner.run();
+			}
+		}.run(false);
+	}
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/EMFStoreECPProjectCompositor.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectSpaceCompositor.java
similarity index 84%
rename from org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/EMFStoreECPProjectCompositor.java
rename to org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectSpaceCompositor.java
index 77591a088..f65943700 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/EMFStoreECPProjectCompositor.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectSpaceCompositor.java
@@ -21,7 +21,7 @@ import org.eclipse.emf.ecore.EObject;
 import org.fortiss.tooling.kernel.interfaces.ICompositionContext;
 import org.fortiss.tooling.kernel.interfaces.ICompositor;
 import org.fortiss.tooling.kernel.model.IProjectRootElement;
-import org.unicase.ecpemfstorebridge.EMFStoreECPProject;
+import org.unicase.workspace.ProjectSpace;
 
 /**
  * {@link ICompositor} implementation for the {@link IProjectRootElement}s.
@@ -31,21 +31,20 @@ import org.unicase.ecpemfstorebridge.EMFStoreECPProject;
  * @version $Rev$
  * @levd.rating RED Rev:
  */
-public final class EMFStoreECPProjectCompositor implements
-		ICompositor<EMFStoreECPProject> {
+public final class ProjectSpaceCompositor implements ICompositor<ProjectSpace> {
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean canCompose(EMFStoreECPProject container, EObject contained,
+	public boolean canCompose(ProjectSpace container, EObject contained,
 			ICompositionContext context) {
 		return contained instanceof IProjectRootElement;
 	}
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean compose(EMFStoreECPProject container, EObject contained,
+	public boolean compose(ProjectSpace container, EObject contained,
 			ICompositionContext context) {
-		container.addModelElementToRoot(contained);
+		container.getProject().addModelElement(contained);
 		return true;
 	}
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/EMFStoreECPProjectModelElementHandler.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectSpaceModelElementHandler.java
similarity index 69%
rename from org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/EMFStoreECPProjectModelElementHandler.java
rename to org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectSpaceModelElementHandler.java
index ad3c2307a..446b25f84 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/EMFStoreECPProjectModelElementHandler.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectSpaceModelElementHandler.java
@@ -26,37 +26,29 @@ import org.fortiss.tooling.kernel.ToolingKernelActivator;
 import org.fortiss.tooling.kernel.base.ModelElementHandlerBase;
 import org.fortiss.tooling.kernel.interfaces.IModelElementHandler;
 import org.fortiss.tooling.kernel.model.IProjectRootElement;
-import org.unicase.ecp.model.workSpaceModel.ECPProject;
-import org.unicase.ecpemfstorebridge.EMFStoreECPProject;
 import org.unicase.workspace.ProjectSpace;
 
 /**
- * {@link IModelElementHandler} for {@link ECPProject}s.
+ * {@link IModelElementHandler} for {@link ProjectSpace}s.
  * 
  * @author hoelzlf
  * @author $Author$
  * @version $Rev$
  * @levd.rating RED Rev:
  */
-public final class EMFStoreECPProjectModelElementHandler extends
-		ModelElementHandlerBase<EMFStoreECPProject> {
+public final class ProjectSpaceModelElementHandler extends
+		ModelElementHandlerBase<ProjectSpace> {
 
 	/** {@inheritDoc} */
 	@Override
-	public String getName(EMFStoreECPProject element) {
-		ProjectSpace projectSpace = (ProjectSpace) element.getRootObject();
-		String projectName = projectSpace.getProjectName();
-		String baseRevision = " @"
-				+ projectSpace.getBaseVersion().getIdentifier();
-		String username = projectSpace.getUsersession().getUsername();
-		return projectName + baseRevision + " (" + username + ")";
+	public String getName(ProjectSpace element) {
+		return element.getProjectName();
 	}
 
 	/** {@inheritDoc} */
 	@Override
-	public String getDescription(EMFStoreECPProject element) {
-		ProjectSpace projectSpace = (ProjectSpace) element.getRootObject();
-		return projectSpace.getProjectDescription();
+	public String getDescription(ProjectSpace element) {
+		return element.getProjectDescription();
 	}
 
 	/** {@inheritDoc} */
@@ -67,9 +59,9 @@ public final class EMFStoreECPProjectModelElementHandler extends
 
 	/** {@inheritDoc} */
 	@Override
-	public List<EObject> getSubnodes(EMFStoreECPProject element) {
+	public List<EObject> getSubnodes(ProjectSpace element) {
 		List<EObject> list = new ArrayList<EObject>();
-		for (EObject node : element.getAllModelElements()) {
+		for (EObject node : element.getProject().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 fbe50590f..cd166b317 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,11 +17,15 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.internal.navigator;
 
+import java.util.ArrayList;
+
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.Viewer;
 import org.fortiss.tooling.kernel.interfaces.IModelElementHandler;
 import org.fortiss.tooling.kernel.services.IModelElementService;
+import org.unicase.ecp.model.workSpaceModel.ECPProject;
 import org.unicase.ecp.model.workSpaceModel.ECPWorkspace;
 
 /**
@@ -38,7 +42,13 @@ public class NavigatorTreeContentProvider implements ITreeContentProvider {
 	@Override
 	public Object[] getElements(Object inputElement) {
 		if (inputElement instanceof ECPWorkspace) {
-			return ((ECPWorkspace) inputElement).getProjects().toArray();
+			ArrayList<EObject> ret = new ArrayList<EObject>();
+			EList<ECPProject> projects = ((ECPWorkspace) inputElement)
+					.getProjects();
+			for (ECPProject ecpProject : projects) {
+				ret.add(ecpProject.getRootObject());
+			}
+			return ret.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 362ba00a3..01aaabf28 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
@@ -77,6 +77,9 @@ public final class NavigatorViewPart extends ViewPart implements
 	/** Stores the menu manager. */
 	private MenuManager menuManager;
 
+	/** Stores the new model element menu. */
+	private NewMenu newMenu;
+
 	/** Constructor. */
 	public NavigatorViewPart() {
 		try {
@@ -186,13 +189,32 @@ public final class NavigatorViewPart extends ViewPart implements
 
 	/** Creates the context menu. */
 	private void createContextMenu() {
-		menuManager = new MenuManager();
-
-		MenuManager newMenuManager = new MenuManager("New ...",
-				ToolingKernelActivator.getImageDescriptor("icons/add.png"),
-				NewMenu.MENU_ID);
-		newMenuManager.add(new NewMenu());
-		menuManager.add(newMenuManager);
+		menuManager = new MenuManager("#PopupMenu");
+		// menuManager.setRemoveAllWhenShown(true);
+		// IMenuListener listener = new IMenuListener() {
+		// @Override
+		// public void menuAboutToShow(IMenuManager m) {
+		// ISelection selection = PlatformUI.getWorkbench()
+		// .getActiveWorkbenchWindow().getSelectionService()
+		// .getSelection();
+		// EObject selectedObject = EObjectSelectionUtils
+		// .getFirstElement(selection);
+		//
+		// IContextMenuService.INSTANCE.fillNavigatorContextMenu(m,
+		// selectedObject);
+		// }
+		// };
+		//
+		// final MenuManager newMenuManager = new MenuManager("New ...",
+		// ToolingKernelActivator.getImageDescriptor("icons/add.png"),
+		// NewMenu.MENU_ID);
+		// // newMenuManager.setRemoveAllWhenShown(true);
+		// newMenu = new NewMenu();
+		// newMenuManager.add(newMenu);
+		//
+		// menuManager.addMenuListener(listener);
+
+		// menuManager.add(newMenuManager);
 
 		Separator repositorySection = new Separator("repository");
 		repositorySection.setVisible(true);
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 22f929679..d1cd7b88b 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
@@ -26,6 +26,7 @@ import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.actions.CompoundContributionItem;
 import org.fortiss.tooling.kernel.interfaces.IPrototypeProvider;
 import org.fortiss.tooling.kernel.internal.util.EObjectSelectionUtils;
+import org.fortiss.tooling.kernel.services.ICommandStackService;
 import org.fortiss.tooling.kernel.services.ICompositorService;
 import org.fortiss.tooling.kernel.services.IModelElementService;
 import org.fortiss.tooling.kernel.services.IPrototypeService;
@@ -42,7 +43,7 @@ import org.fortiss.tooling.kernel.services.IPrototypeService.Prototype;
 public class NewMenu extends CompoundContributionItem {
 
 	/** The menu id. */
-	public static final String MENU_ID = "org.fortiss.tooling.kernel.newmenu";
+	public static final String MENU_ID = "org.fortiss.tooling.kernel.navigator.newmenu";
 
 	/** List of available actions. */
 	private final List<AddPrototypeAction> actions = new ArrayList<AddPrototypeAction>();
@@ -98,10 +99,18 @@ public class NewMenu extends CompoundContributionItem {
 		/** {@inheritDoc} */
 		@Override
 		public void run() {
-			EObject newObject = prototype.getPrototypeCopy();
-			if (ICompositorService.INSTANCE.compose(container, newObject, null)) {
-				// TODO (FH): open editor
-			}
+			ICommandStackService.INSTANCE.runAsCommand(container,
+					new Runnable() {
+
+						@Override
+						public void run() {
+							EObject newObject = prototype.getPrototypeCopy();
+							if (ICompositorService.INSTANCE.compose(container,
+									newObject, null)) {
+								// TODO (FH): open editor
+							}
+						}
+					});
 		}
 
 		/**
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 6f1451f61..4301b8191 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
@@ -17,6 +17,7 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.services;
 
+import org.eclipse.emf.ecore.EObject;
 import org.fortiss.tooling.kernel.internal.CommandStackService;
 
 /**
@@ -33,5 +34,6 @@ public interface ICommandStackService {
 	/** Returns the singleton instance of the service. */
 	public static final ICommandStackService INSTANCE = new CommandStackService();
 
-	// TODO (FH): define
+	/** Runs the given Runnable within a emfStore transaction. */
+	void runAsCommand(EObject target, Runnable runner);
 }
-- 
GitLab