Bug 545069 - GenericEditor should support validation on tree

Change-Id: I98d131a86c0e6ea73fb92986e1e86a325c3aa185
Signed-off-by: Eugen Neufeld <eneufeld@eclipsesource.com>
diff --git a/bundles/org.eclipse.emfforms.editor/META-INF/MANIFEST.MF b/bundles/org.eclipse.emfforms.editor/META-INF/MANIFEST.MF
index 28ce25e..333a85a 100644
--- a/bundles/org.eclipse.emfforms.editor/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.emfforms.editor/META-INF/MANIFEST.MF
@@ -29,7 +29,8 @@
  org.eclipse.emfforms.core.services;bundle-version="[1.20.0,1.21.0)",
  org.eclipse.emfforms.core.services.editsupport;bundle-version="[1.20.0,1.21.0)",
  org.eclipse.emfforms.swt.treemasterdetail;bundle-version="[1.20.0,1.21.0)",
- org.eclipse.emf.ecp.view.validation;bundle-version="[1.20.0,1.21.0)"
+ org.eclipse.emf.ecp.view.validation;bundle-version="[1.20.0,1.21.0)",
+ org.eclipse.emfforms.swt.treemasterdetail.decorator.validation.default;bundle-version="[1.20.0,1.21.0)"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Import-Package: org.eclipse.emfforms.spi.swt.core.di;version="[1.20.0,1.21.0)"
diff --git a/bundles/org.eclipse.emfforms.editor/src/org/eclipse/emfforms/spi/editor/GenericEditor.java b/bundles/org.eclipse.emfforms.editor/src/org/eclipse/emfforms/spi/editor/GenericEditor.java
index b3c2185..420f62a 100644
--- a/bundles/org.eclipse.emfforms.editor/src/org/eclipse/emfforms/spi/editor/GenericEditor.java
+++ b/bundles/org.eclipse.emfforms.editor/src/org/eclipse/emfforms/spi/editor/GenericEditor.java
@@ -69,13 +69,16 @@
 import org.eclipse.emfforms.spi.swt.treemasterdetail.MenuProvider;
 import org.eclipse.emfforms.spi.swt.treemasterdetail.TreeMasterDetailComposite;
 import org.eclipse.emfforms.spi.swt.treemasterdetail.TreeMasterDetailMenuListener;
+import org.eclipse.emfforms.spi.swt.treemasterdetail.TreeMasterDetailSWTBuilder;
 import org.eclipse.emfforms.spi.swt.treemasterdetail.TreeMasterDetailSWTFactory;
 import org.eclipse.emfforms.spi.swt.treemasterdetail.TreeViewerBuilder;
 import org.eclipse.emfforms.spi.swt.treemasterdetail.actions.ActionCollector;
 import org.eclipse.emfforms.spi.swt.treemasterdetail.actions.MasterDetailAction;
+import org.eclipse.emfforms.spi.swt.treemasterdetail.decorator.validation.ecp.ECPValidationLabelDecoratorProvider;
 import org.eclipse.emfforms.spi.swt.treemasterdetail.diagnostic.DiagnosticCache;
 import org.eclipse.emfforms.spi.swt.treemasterdetail.diagnostic.DiagnosticCache.ValidationListener;
 import org.eclipse.emfforms.spi.swt.treemasterdetail.util.CreateElementCallback;
+import org.eclipse.emfforms.spi.swt.treemasterdetail.util.RootObject;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.dialogs.MessageDialog;
@@ -382,12 +385,26 @@
 			IResource.DEPTH_ZERO);
 	}
 
-	private void setupDiagnosticCache(Object editorInput) {
-		if (!Notifier.class.isInstance(editorInput)) {
-			return;
+	/**
+	 * Get the Notifier from the tree input.
+	 * 
+	 * @param editorInput The editor input to transform
+	 * @return {@link Notifier}
+	 * @throws IllegalStateException if the editor input is not a Notifier
+	 */
+	protected Notifier getNotifierFromEditorInput(Object editorInput) {
+		Object input = editorInput;
+		if (input instanceof RootObject) {
+			input = ((RootObject) input).getRoot();
 		}
-		final Notifier input = (Notifier) editorInput;
-		cache = createDiangosticCache(input);
+		if (!Notifier.class.isInstance(input)) {
+			throw new IllegalStateException("The editor input is not a Notifier!"); //$NON-NLS-1$
+		}
+		return (Notifier) input;
+	}
+
+	private void setupDiagnosticCache(Object editorInput) {
+		cache = createDiangosticCache(getNotifierFromEditorInput(editorInput));
 	}
 
 	/**
@@ -474,7 +491,7 @@
 		final Composite composite,
 		Object editorInput,
 		final CreateElementCallback createElementCallback) {
-		final TreeMasterDetailComposite treeMasterDetail = TreeMasterDetailSWTFactory
+		final TreeMasterDetailSWTBuilder builder = TreeMasterDetailSWTFactory
 			.fillDefaults(composite, SWT.NONE, editorInput)
 			.customizeCildCreation(createElementCallback)
 			.customizeMenu(new MenuProvider() {
@@ -493,8 +510,14 @@
 
 				}
 			})
-			.customizeTree(createTreeViewerBuilder())
-			.create();
+			.customizeTree(createTreeViewerBuilder());
+
+		if (enableValidation()) {
+			builder.customizeLabelDecorator(
+				new ECPValidationLabelDecoratorProvider(getNotifierFromEditorInput(editorInput), getDiagnosticCache()));
+		}
+
+		final TreeMasterDetailComposite treeMasterDetail = builder.create();
 		return treeMasterDetail;
 	}