RESOLVED - bug 293012: [modeling] Live validation and cross resource containment
https://bugs.eclipse.org/bugs/show_bug.cgi?id=293012
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF b/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF
index 88de96e..4a10c29 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF
+++ b/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF
@@ -18,7 +18,8 @@
  org.eclipse.wst.xml.ui;bundle-version="1.0.400";resolution:=optional,
  org.eclipse.wst.xsd.core;bundle-version="1.1.300";resolution:=optional,
  org.eclipse.jface.text;bundle-version="3.4.0",
- org.eclipse.ui.editors;bundle-version="3.4.0"
+ org.eclipse.ui.editors;bundle-version="3.4.0",
+ org.eclipse.emf.transaction;bundle-version="[1.2.0,2.0.0)"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-Localization: plugin
 Bundle-ActivationPolicy: lazy
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/RichTooltipHyperlinkAdapter.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/RichTooltipHyperlinkAdapter.java
index 508f29b..0196eac 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/RichTooltipHyperlinkAdapter.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/RichTooltipHyperlinkAdapter.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     Anyware Technologies - initial API and implementation
  *
- * $Id: RichTooltipHyperlinkAdapter.java,v 1.1 2009/09/13 20:32:58 bcabe Exp $
+ * $Id: RichTooltipHyperlinkAdapter.java,v 1.2 2009/09/13 21:28:29 bcabe Exp $
  */
 package org.eclipse.pde.emfforms.internal.validation;
 
@@ -143,8 +143,10 @@
 					pw.print("\"> <a href=\"");
 					pw.print(message.hashCode() + "");
 					pw.print("\">");
+					//FIXME prefix should be HTML escaped
 					if (message.getPrefix() != null)
 						pw.print(message.getPrefix());
+					//FIXME message should be HTML escaped
 					pw.print(message.getMessage());
 					pw.println("</a></li>");
 				}
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingEContentAdapter.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingEContentAdapter.java
index a7635df..960a584 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingEContentAdapter.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingEContentAdapter.java
@@ -8,18 +8,21 @@
  * Contributors:
  *     Anyware Technologies - initial API and implementation
  *
- * $Id: ValidatingEContentAdapter.java,v 1.10 2009/09/07 13:16:30 bcabe Exp $
+ * $Id: ValidatingEContentAdapter.java,v 1.11 2009/09/22 14:54:31 bcabe Exp $
  */
 package org.eclipse.pde.emfforms.internal.validation;
 
-import java.util.Properties;
+import java.util.*;
 import org.eclipse.core.databinding.DataBindingContext;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.util.Diagnostician;
 import org.eclipse.emf.ecore.util.EContentAdapter;
 import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.transaction.NotificationFilter;
 import org.eclipse.pde.emfforms.editor.EmfFormEditor;
 import org.eclipse.pde.emfforms.editor.ValidatingService;
 import org.eclipse.pde.emfforms.internal.Activator;
@@ -55,8 +58,27 @@
 
 				return super.getObjectLabel(eObject);
 			}
-		};
 
+			protected boolean doValidateContents(EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context) {
+
+				Resource eContainerResource = eObject.eResource();
+				List<EObject> eContents = eObject.eContents();
+				if (!eContents.isEmpty()) {
+					boolean result = true;
+					for (Iterator<EObject> i = eContents.iterator(); i.hasNext() && (result || diagnostics != null);) {
+						EObject child = i.next();
+						// in case of cross resource containment, 
+						// avoid to validate a child which are not in the container resource
+						Resource eChildResource = child.eResource();
+						if (eContainerResource != null && eChildResource == eContainerResource) {
+							result &= validate(child, diagnostics, context);
+						}
+					}
+					return result;
+				}
+				return true;
+			}
+		};
 	}
 
 	private void forceValidatingService34Registration() {
@@ -71,7 +93,7 @@
 	@Override
 	public void notifyChanged(Notification notification) {
 		super.notifyChanged(notification);
-		if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
+		if (!NotificationFilter.READ.matches(notification)) {
 			validate();
 		}
 	}
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingService34.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingService34.java
index 9a7f158..252398e 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingService34.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingService34.java
@@ -43,11 +43,7 @@
 				if (diagnosticData.get(1) == emfObservable.getValueType()) {
 					if (swtObservable.getWidget() instanceof Control) {
 						Control control = (Control) swtObservable.getWidget();
-
-						if (true || control.isVisible())
-							messageManager.addMessage(swtObservable, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()), control);
-						else
-							messageManager.addMessage(swtObservable, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()));
+						messageManager.addMessage(swtObservable, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()), control);
 
 						return true;
 					}