From 6e85bd1759657d89fe60a9d77304c75d6a5bb643 Mon Sep 17 00:00:00 2001
From: Florian Hoelzl <hoelzl@fortiss.org>
Date: Tue, 3 May 2016 12:04:03 +0000
Subject: [PATCH] Filtering of prototype new menu entries working properly now.
 refs 2567

---
 .../ui/extension/ITutorialUIProvider.java     |  4 +-
 .../ITutorialUIWhitelistProvider.java         |  6 ++-
 .../base/TutorialUIBlacklistAllProvider.java  |  6 ++-
 .../base/TutorialUIWhitelistAllProvider.java  |  6 ++-
 .../ui/extension/data/TutorialStepUI.java     | 40 +++++++++++++++++++
 .../kernel/ui/internal/ActionService.java     | 18 +++++++++
 .../kernel/ui/internal/TutorialUIService.java | 33 +++++++++++----
 .../ui/internal/views/NavigatorNewMenu.java   |  7 +++-
 .../kernel/ui/service/IActionService.java     |  8 ++++
 .../extension/ITutorialWhitelistProvider.java |  7 ++--
 .../kernel/extension/data/TutorialStep.java   |  8 +++-
 11 files changed, 120 insertions(+), 23 deletions(-)
 create mode 100644 org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/data/TutorialStepUI.java

diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/ITutorialUIProvider.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/ITutorialUIProvider.java
index 3afb58b6f..f5f712cc3 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/ITutorialUIProvider.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/ITutorialUIProvider.java
@@ -17,7 +17,7 @@ $Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.ui.extension;
 
-import org.fortiss.tooling.kernel.extension.data.TutorialStep;
+import org.fortiss.tooling.kernel.ui.extension.data.TutorialStepUI;
 
 /**
  * Interface UI parts of tutorial providers.
@@ -37,5 +37,5 @@ public interface ITutorialUIProvider {
 	 * Returns the local whitelist provider for the given step. This method MUST never return
 	 * <code>null</code>.
 	 */
-	public ITutorialUIWhitelistProvider getLocalUIWhitelistProvider(TutorialStep step);
+	public ITutorialUIWhitelistProvider getLocalUIWhitelistProvider(TutorialStepUI step);
 }
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/ITutorialUIWhitelistProvider.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/ITutorialUIWhitelistProvider.java
index 742dfe70e..4829bec1d 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/ITutorialUIWhitelistProvider.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/ITutorialUIWhitelistProvider.java
@@ -20,6 +20,7 @@ package org.fortiss.tooling.kernel.ui.extension;
 import java.util.List;
 
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.action.IContributionItem;
 
 /**
  * Tutorial whitelist provider interface for the UI kernel services.
@@ -38,9 +39,10 @@ public interface ITutorialUIWhitelistProvider {
 	public boolean globalDefaultActionsVisible();
 
 	/** Returns whether the given context menu contribution is visible. */
-	public boolean contextMenuContributionVisible(EObject element, Object contribution);
+	public boolean contextMenuContributionVisible(EObject element, IContributionItem contribution);
 
 	/** Returns whether the given context menu contribution is visible. */
-	public boolean contextMenuContributionVisible(List<EObject> element, Object contribution);
+	public boolean contextMenuContributionVisible(List<EObject> element,
+			IContributionItem contribution);
 	// TODO: define other methods
 }
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/base/TutorialUIBlacklistAllProvider.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/base/TutorialUIBlacklistAllProvider.java
index 5f1bc7dbf..fb1402e2d 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/base/TutorialUIBlacklistAllProvider.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/base/TutorialUIBlacklistAllProvider.java
@@ -20,6 +20,7 @@ package org.fortiss.tooling.kernel.ui.extension.base;
 import java.util.List;
 
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.action.IContributionItem;
 import org.fortiss.tooling.kernel.ui.extension.ITutorialUIWhitelistProvider;
 
 /**
@@ -45,13 +46,14 @@ public class TutorialUIBlacklistAllProvider implements ITutorialUIWhitelistProvi
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean contextMenuContributionVisible(EObject element, Object contribution) {
+	public boolean contextMenuContributionVisible(EObject element, IContributionItem contribution) {
 		return false;
 	}
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean contextMenuContributionVisible(List<EObject> element, Object contribution) {
+	public boolean contextMenuContributionVisible(List<EObject> element,
+			IContributionItem contribution) {
 		return false;
 	}
 }
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/base/TutorialUIWhitelistAllProvider.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/base/TutorialUIWhitelistAllProvider.java
index d8e937f48..3be11c93c 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/base/TutorialUIWhitelistAllProvider.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/base/TutorialUIWhitelistAllProvider.java
@@ -20,6 +20,7 @@ package org.fortiss.tooling.kernel.ui.extension.base;
 import java.util.List;
 
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.action.IContributionItem;
 import org.fortiss.tooling.kernel.ui.extension.ITutorialUIWhitelistProvider;
 
 /**
@@ -45,13 +46,14 @@ public class TutorialUIWhitelistAllProvider implements ITutorialUIWhitelistProvi
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean contextMenuContributionVisible(EObject element, Object contribution) {
+	public boolean contextMenuContributionVisible(EObject element, IContributionItem contribution) {
 		return true;
 	}
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean contextMenuContributionVisible(List<EObject> element, Object contribution) {
+	public boolean contextMenuContributionVisible(List<EObject> element,
+			IContributionItem contribution) {
 		return true;
 	}
 }
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/data/TutorialStepUI.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/data/TutorialStepUI.java
new file mode 100644
index 000000000..dc2faafc7
--- /dev/null
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/extension/data/TutorialStepUI.java
@@ -0,0 +1,40 @@
+/*--------------------------------------------------------------------------+
+$Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $
+|                                                                          |
+| Copyright 2016 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.ui.extension.data;
+
+import org.fortiss.tooling.kernel.extension.data.TutorialStep;
+import org.fortiss.tooling.kernel.ui.extension.ITutorialUIWhitelistProvider;
+import org.fortiss.tooling.kernel.ui.extension.base.TutorialUIBlacklistAllProvider;
+
+/**
+ * Data class for UI parts of {@link TutorialStep}s.
+ * 
+ * @author hoelzl
+ * @author $Author: hoelzl $
+ * @version $Rev: 18709 $
+ * @ConQAT.Rating RED Hash:
+ */
+public abstract class TutorialStepUI extends TutorialStep {
+	/**
+	 * Returns the step-specific whitelist provider. The default returns a provider blacklisting
+	 * everything.
+	 */
+	public ITutorialUIWhitelistProvider getUIWhitelistProvider() {
+		return new TutorialUIBlacklistAllProvider();
+	}
+}
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java
index 7bfa4e047..87ff5d4ad 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ActionService.java
@@ -23,10 +23,13 @@ import java.util.List;
 import org.eclipse.emf.common.command.CommandStackListener;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IContributionItem;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.actions.ActionFactory;
 import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
+import org.fortiss.tooling.kernel.extension.data.Prototype;
 import org.fortiss.tooling.kernel.service.ICommandStackService;
 import org.fortiss.tooling.kernel.service.IPersistencyService;
 import org.fortiss.tooling.kernel.service.listener.IPersistencyServiceListener;
@@ -36,6 +39,7 @@ import org.fortiss.tooling.kernel.ui.internal.actions.DeleteAction;
 import org.fortiss.tooling.kernel.ui.internal.actions.PasteAction;
 import org.fortiss.tooling.kernel.ui.internal.actions.RedoAction;
 import org.fortiss.tooling.kernel.ui.internal.actions.UndoAction;
+import org.fortiss.tooling.kernel.ui.internal.views.NavigatorNewMenu;
 import org.fortiss.tooling.kernel.ui.service.IActionService;
 import org.fortiss.tooling.kernel.ui.util.EObjectSelectionUtils;
 
@@ -216,4 +220,18 @@ public class ActionService implements IActionService, IPersistencyServiceListene
 	public void runGlobalCutAction() {
 		globalCutAction.run();
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Prototype getNewMenuContributionPrototype(IContributionItem contributionItem) {
+		if(contributionItem instanceof ActionContributionItem) {
+			ActionContributionItem aItem = (ActionContributionItem)contributionItem;
+			if(aItem.getAction() instanceof NavigatorNewMenu.AddPrototypeAction) {
+				NavigatorNewMenu.AddPrototypeAction action =
+						(NavigatorNewMenu.AddPrototypeAction)aItem.getAction();
+				return action.getPrototype();
+			}
+		}
+		return null;
+	}
 }
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/TutorialUIService.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/TutorialUIService.java
index 7cefc2e21..90bb6bf54 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/TutorialUIService.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/TutorialUIService.java
@@ -24,11 +24,13 @@ import java.util.List;
 import java.util.Map;
 
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.action.IContributionItem;
 import org.fortiss.tooling.kernel.extension.ITutorialProvider;
 import org.fortiss.tooling.kernel.extension.data.TutorialStep;
 import org.fortiss.tooling.kernel.service.ITutorialService;
 import org.fortiss.tooling.kernel.ui.ToolingKernelUIActivator;
 import org.fortiss.tooling.kernel.ui.extension.ITutorialUIProvider;
+import org.fortiss.tooling.kernel.ui.extension.data.TutorialStepUI;
 import org.fortiss.tooling.kernel.ui.service.ITutorialUIService;
 
 /**
@@ -85,7 +87,11 @@ public final class TutorialUIService implements ITutorialUIService {
 			return true;
 		}
 		TutorialStep step = ITutorialService.INSTANCE.getActiveTutorialStep();
-		return p.getLocalUIWhitelistProvider(step).elementVisibleInNavigator(element);
+		if(step instanceof TutorialStepUI) {
+			return p.getLocalUIWhitelistProvider((TutorialStepUI)step).elementVisibleInNavigator(
+					element);
+		}
+		return false;
 	}
 
 	/** {@inheritDoc} */
@@ -96,30 +102,41 @@ public final class TutorialUIService implements ITutorialUIService {
 			return true;
 		}
 		TutorialStep step = ITutorialService.INSTANCE.getActiveTutorialStep();
-		return p.getLocalUIWhitelistProvider(step).globalDefaultActionsVisible();
+		if(step instanceof TutorialStepUI) {
+			return p.getLocalUIWhitelistProvider((TutorialStepUI)step)
+					.globalDefaultActionsVisible();
+		}
+		return false;
 	}
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean contextMenuContributionVisible(EObject element, Object contribution) {
+	public boolean contextMenuContributionVisible(EObject element, IContributionItem contribution) {
 		ITutorialUIProvider p = getCurrentUIProvider();
 		if(p.getGlobalUIWhitelistProvider().contextMenuContributionVisible(element, contribution)) {
 			return true;
 		}
 		TutorialStep step = ITutorialService.INSTANCE.getActiveTutorialStep();
-		return p.getLocalUIWhitelistProvider(step).contextMenuContributionVisible(element,
-				contribution);
+		if(step instanceof TutorialStepUI) {
+			return p.getLocalUIWhitelistProvider((TutorialStepUI)step)
+					.contextMenuContributionVisible(element, contribution);
+		}
+		return false;
 	}
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean contextMenuContributionVisible(List<EObject> element, Object contribution) {
+	public boolean contextMenuContributionVisible(List<EObject> element,
+			IContributionItem contribution) {
 		ITutorialUIProvider p = getCurrentUIProvider();
 		if(p.getGlobalUIWhitelistProvider().contextMenuContributionVisible(element, contribution)) {
 			return true;
 		}
 		TutorialStep step = ITutorialService.INSTANCE.getActiveTutorialStep();
-		return p.getLocalUIWhitelistProvider(step).contextMenuContributionVisible(element,
-				contribution);
+		if(step instanceof TutorialStepUI) {
+			return p.getLocalUIWhitelistProvider((TutorialStepUI)step)
+					.contextMenuContributionVisible(element, contribution);
+		}
+		return false;
 	}
 }
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/views/NavigatorNewMenu.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/views/NavigatorNewMenu.java
index a1ddee8c8..ff832453a 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/views/NavigatorNewMenu.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/views/NavigatorNewMenu.java
@@ -89,7 +89,7 @@ public class NavigatorNewMenu implements IContextMenuContributor {
 	}
 
 	/** Action for creating a new prototype. */
-	private static class AddPrototypeAction extends Action {
+	public static class AddPrototypeAction extends Action {
 
 		/** The prototype. */
 		private final Prototype prototype;
@@ -152,5 +152,10 @@ public class NavigatorNewMenu implements IContextMenuContributor {
 			return IElementCompositorService.INSTANCE.canCompose(container,
 					prototype.getPrototype(), null);
 		}
+
+		/** Returns the associated prototype. */
+		public Prototype getPrototype() {
+			return prototype;
+		}
 	}
 }
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/service/IActionService.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/service/IActionService.java
index 0ba78dbaf..bce2072d3 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/service/IActionService.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/service/IActionService.java
@@ -17,8 +17,10 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.ui.service;
 
+import org.eclipse.jface.action.IContributionItem;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.ui.IActionBars;
+import org.fortiss.tooling.kernel.extension.data.Prototype;
 import org.fortiss.tooling.kernel.ui.internal.ActionService;
 
 /**
@@ -83,4 +85,10 @@ public interface IActionService {
 	 * service when any command stack changes.
 	 */
 	void refresh();
+
+	/**
+	 * Returns whether the given contribution item was provided by the navigator's new menu and
+	 * returns the associated prototype.
+	 */
+	Prototype getNewMenuContributionPrototype(IContributionItem contributionItem);
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/ITutorialWhitelistProvider.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/ITutorialWhitelistProvider.java
index 3bdd5e594..b23be6357 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/ITutorialWhitelistProvider.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/ITutorialWhitelistProvider.java
@@ -17,11 +17,10 @@ $Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.extension;
 
-import org.eclipse.emf.ecore.EObject;
 import org.fortiss.tooling.kernel.extension.data.Prototype;
 
 /**
- * Instances of this interface provide white lists for tool functions
+ * Instances of this interface provide white lists for non-UI tool functions
  * globally enabled in tutorial or locally enabled in a tutorial step.
  * 
  * @author hoelzl
@@ -33,8 +32,8 @@ public interface ITutorialWhitelistProvider {
 
 	/**
 	 * Returns whether the given prototype is active in this tutorial. Note that active
-	 * prototypes may still be filtered by other methods of this whitelist provider, e.g.,
-	 * {@link #contextMenuContributionVisible(EObject, Object)}.
+	 * prototypes may still be filtered by other methods of whitelist providers, in particular those
+	 * related to the UI services.
 	 */
 	public boolean prototypeActive(Prototype prototype);
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/data/TutorialStep.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/data/TutorialStep.java
index ed5e29b87..9c946a81f 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/data/TutorialStep.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/data/TutorialStep.java
@@ -18,6 +18,7 @@ $Id: codetemplates.xml 1 2011-01-01 00:00:01Z hoelzl $
 package org.fortiss.tooling.kernel.extension.data;
 
 import org.fortiss.tooling.kernel.extension.ITutorialWhitelistProvider;
+import org.fortiss.tooling.kernel.extension.base.TutorialBlacklistAllProvider;
 
 /**
  * Data class for steps of tutorials.
@@ -28,8 +29,11 @@ import org.fortiss.tooling.kernel.extension.ITutorialWhitelistProvider;
  * @ConQAT.Rating RED Hash:
  */
 public abstract class TutorialStep {
-	/** Returns the step-specific whitelist provider. */
+	/**
+	 * Returns the step-specific whitelist provider. The default returns a provider blacklisting
+	 * everything.
+	 */
 	public ITutorialWhitelistProvider getWhitelistProvider() {
-		return null;
+		return new TutorialBlacklistAllProvider();
 	}
 }
-- 
GitLab