[351579] Add a Validate action
diff --git a/examples/org.eclipse.ocl.examples.xtext.console/icons/elcl16/validate.gif b/examples/org.eclipse.ocl.examples.xtext.console/icons/elcl16/validate.gif
new file mode 100644
index 0000000..acfb2a6
--- /dev/null
+++ b/examples/org.eclipse.ocl.examples.xtext.console/icons/elcl16/validate.gif
Binary files differ
diff --git a/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/OCLConsolePage.java b/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/OCLConsolePage.java
index a2815ea..b631344 100644
--- a/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/OCLConsolePage.java
+++ b/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/OCLConsolePage.java
@@ -86,6 +86,7 @@
 import org.eclipse.ocl.examples.xtext.console.actions.LoadExpressionAction;
 import org.eclipse.ocl.examples.xtext.console.actions.LoadResourceAction;
 import org.eclipse.ocl.examples.xtext.console.actions.SaveExpressionAction;
+import org.eclipse.ocl.examples.xtext.console.actions.ValidateAction;
 import org.eclipse.ocl.examples.xtext.console.messages.ConsoleMessages;
 import org.eclipse.ocl.examples.xtext.console.xtfo.EmbeddedXtextEditor;
 import org.eclipse.ocl.examples.xtext.essentialocl.ui.model.BaseDocument;
@@ -549,6 +550,8 @@
 	private final CancelableMetaModelManager metaModelManager;
 	private DomainModelManager modelManager = null;
 	
+	private ValidateAction validateAction = null;
+	
 //	private Map<TargetMetamodel, IAction> metamodelActions =
 //	    new java.util.HashMap<TargetMetamodel, IAction>();
 	
@@ -760,9 +763,11 @@
 		SaveExpressionAction saveExpression = new SaveExpressionAction(this);
 		LoadExpressionAction loadExpression = new LoadExpressionAction(this);
 		Action loadResource = new LoadResourceAction(this);		
+		validateAction = new ValidateAction(this);		
 		
 		IMenuManager menu = getSite().getActionBars().getMenuManager();
 		menu.add(loadResource);
+		menu.add(validateAction);
 		menu.add(loadExpression);
 		menu.add(saveExpression);
 		menu.add(clear);
@@ -796,6 +801,7 @@
 //        toolbar.appendToGroup(IConsoleConstants.OUTPUT_GROUP, metamodelItem);
 //        toolbar.appendToGroup(IConsoleConstants.OUTPUT_GROUP, levelAction);
 		toolbar.appendToGroup(IConsoleConstants.OUTPUT_GROUP, loadResource);
+		toolbar.appendToGroup(IConsoleConstants.OUTPUT_GROUP, validateAction);
 		toolbar.appendToGroup(IConsoleConstants.OUTPUT_GROUP, loadExpression);
 		toolbar.appendToGroup(IConsoleConstants.OUTPUT_GROUP, saveExpression);
 		toolbar.appendToGroup(IConsoleConstants.OUTPUT_GROUP, clear);
@@ -1137,6 +1143,9 @@
 			    }	        
 		        editorDocument.setContext((EssentialOCLCSResource) resource, contextClassifier, null);
 		        console.setSelection(contextClassifier, contextObject);
+		        if (validateAction != null) {
+		        	validateAction.setSelection(contextObject);
+		        }
 		        return null;
 			}
 		});
diff --git a/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/actions/ValidateAction.java b/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/actions/ValidateAction.java
new file mode 100644
index 0000000..639f33a
--- /dev/null
+++ b/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/actions/ValidateAction.java
@@ -0,0 +1,111 @@
+/**
+ * <copyright>
+ *
+ * Copyright (c) 2010 E.D.Willink and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     E.D.Willink - initial API and implementation
+ *
+ * </copyright>
+ *
+ * $Id: LoadResourceAction.java,v 1.2 2011/05/07 16:41:05 ewillink Exp $
+ */
+package org.eclipse.ocl.examples.xtext.console.actions;
+
+import java.net.URL;
+import java.util.Collections;
+import java.util.Map;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.Diagnostician;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.ocl.examples.pivot.utilities.PivotDiagnostician;
+import org.eclipse.ocl.examples.xtext.console.OCLConsolePage;
+import org.eclipse.ocl.examples.xtext.console.XtextConsolePlugin;
+import org.eclipse.ocl.examples.xtext.console.messages.ConsoleMessages;
+import org.osgi.framework.Bundle;
+
+/**
+ * An action that validates the selection with added Complete OCL contributions.
+ */
+public class ValidateAction extends org.eclipse.emf.edit.ui.action.ValidateAction
+{
+    protected final OCLConsolePage consolePage;
+	
+	/**
+	 * Initializes me.
+	 */
+	public ValidateAction(OCLConsolePage consolePage) {
+		this.consolePage = consolePage;
+		Bundle bundle = XtextConsolePlugin.getInstance().getBundle();
+		Path imagePath = new Path("$nl$/icons/elcl16/validate.gif"); //$NON-NLS-1$
+		URL imageFile = FileLocator.find(bundle, imagePath, null);
+		setImageDescriptor(ImageDescriptor.createFromURL(imageFile));
+		setToolTipText(ConsoleMessages.ValidateAction_Tip);
+	}
+
+	@Override
+	protected Diagnostician createDiagnostician(final AdapterFactory adapterFactory, final IProgressMonitor progressMonitor) {
+		return new PivotDiagnostician()
+		{
+			@Override
+			public String getObjectLabel(EObject eObject) {
+				if (adapterFactory != null && !eObject.eIsProxy()) {
+					IItemLabelProvider itemLabelProvider = (IItemLabelProvider) adapterFactory
+						.adapt(eObject, IItemLabelProvider.class);
+					if (itemLabelProvider != null) {
+						return itemLabelProvider.getText(eObject);
+					}
+				}
+
+				return super.getObjectLabel(eObject);
+			}
+
+			@Override
+			public boolean validate(EClass eClass, EObject eObject,
+					DiagnosticChain diagnostics, Map<Object, Object> context) {
+				progressMonitor.worked(1);
+				return super.validate(eClass, eObject, diagnostics, context);
+			}
+		};
+	}
+
+	@Override
+	public void selectionChanged(SelectionChangedEvent event) {
+//		super.selectionChanged(event);
+	}
+
+	@Override
+	public boolean updateSelection(IStructuredSelection selection) {
+//		return super.updateSelection(selection);
+		return true;
+	}
+
+	@Override
+	protected Diagnostic validate(IProgressMonitor progressMonitor) {
+		return super.validate(progressMonitor);
+	}
+
+	public void setSelection(EObject contextObject) {
+		if (contextObject != null) {
+			selectedObjects = Collections.singletonList(contextObject);
+		}
+		else {
+			selectedObjects = Collections.emptyList();
+		}
+	}
+}
\ No newline at end of file
diff --git a/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/messages/ConsoleMessages.java b/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/messages/ConsoleMessages.java
index 852b3f0..bf0c6bb 100644
--- a/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/messages/ConsoleMessages.java
+++ b/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/messages/ConsoleMessages.java
@@ -42,6 +42,7 @@
 	public static String LoadActionWarning_Title;
 	public static String LoadActionWarning_NoExpression;
 	public static String LoadResourceAction_Tip;
+	public static String ValidateAction_Tip;
 	public static String Output_Exception;
 //	public static String Progress_AST;
 //	public static String Progress_CST;
diff --git a/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/messages/ConsoleMessages.properties b/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/messages/ConsoleMessages.properties
index e4c6152..d4c8047 100644
--- a/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/messages/ConsoleMessages.properties
+++ b/examples/org.eclipse.ocl.examples.xtext.console/src/org/eclipse/ocl/examples/xtext/console/messages/ConsoleMessages.properties
@@ -25,6 +25,7 @@
 LoadActionWarning_Title = Warning Loading OCL Expression
 LoadActionWarning_NoExpression = No OCL Expression was found in the file.
 LoadResourceAction_Tip = Load a resource into the resource set
+ValidateAction_Tip = Validate the current selection (including Complete OCL)
 Output_Exception = Exception appending to OCL console output.
 #Progress_AST = Creating Abstract Syntax
 #Progress_CST = Parsing Concrete Syntax