Pārlūkot izejas kodu

Problem Marker creation for Xtext expressions

Andreas Mülder 14 gadi atpakaļ
vecāks
revīzija
f6a71f51cb

+ 9 - 2
plugins/org.yakindu.sct.statechart.diagram/plugin.xml

@@ -407,7 +407,13 @@
    </extension>
    
    <!-- marker && validation -->
-    <extension id="diagnostic" name="Statechart Plugin problems" point="org.eclipse.core.resources.markers">
+    <extension id="org.yakindu.sct.statechart.diagram.diagnostic" name="Statechart Diagram problems" point="org.eclipse.core.resources.markers">
+      <super type="org.eclipse.core.resources.problemmarker"/>
+      <super type="org.eclipse.gmf.runtime.common.ui.services.marker"/>
+      <persistent value="true"/>
+   </extension>   
+   
+    <extension id="org.yakindu.sct.statechart.diagram.xtext.diagnostic" name="Statechart Expression problems" point="org.eclipse.core.resources.markers">
       <super type="org.eclipse.core.resources.problemmarker"/>
       <super type="org.eclipse.gmf.runtime.common.ui.services.marker"/>
       <persistent value="true"/>
@@ -416,7 +422,8 @@
    <extension point="org.eclipse.gmf.runtime.common.ui.services.markerNavigationProviders" id="markers-navigation">
       <MarkerNavigationProvider class="org.yakindu.sct.statechart.diagram.providers.StatechartMarkerNavigationProvider">
          <MarkerType name="org.yakindu.sct.statechart.diagram.diagnostic"/>
-         <Priority name="Highest"/>
+           <MarkerType name="org.yakindu.sct.statechart.diagram.xtext.diagnostic"/>
+         <Priority name="Medium"/>
       </MarkerNavigationProvider>
    </extension>
    

+ 2 - 3
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/DiagramActivator.java

@@ -16,9 +16,8 @@ import org.osgi.framework.BundleContext;
 
 /**
  * 
- * @author Andreas Muelder <a
- *         href="mailto:andreas.muelder@itemis.de">andreas.muelder@itemis.de</a>
- * 
+ * @author muelder
+ *
  */
 public class DiagramActivator extends AbstractUIPlugin {
 

+ 32 - 35
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/policies/ExpressionDirectEditPolicy.java

@@ -3,26 +3,25 @@ package org.yakindu.sct.statechart.diagram.policies;
 import java.util.List;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.emf.ecore.resource.Resource.Diagnostic;
 import org.eclipse.gef.commands.Command;
 import org.eclipse.gef.editpolicies.DirectEditPolicy;
 import org.eclipse.gef.requests.DirectEditRequest;
 import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
 import org.eclipse.gmf.runtime.emf.type.core.commands.SetValueCommand;
 import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
-import org.eclipse.xtext.validation.IDiagnosticConverter;
-import org.eclipse.xtext.validation.Issue;
-import org.eclipse.xtext.validation.Issue.Severity;
 import org.yakindu.model.sct.statechart.StatechartPackage;
+import org.yakindu.sct.statechart.diagram.DiagramActivator;
 import org.yakindu.sct.statechart.diagram.validation.GMFMarkerUtil;
 import org.yakindu.sct.statechart.diagram.validation.IMarkerType;
-import org.yakindu.sct.statechart.diagram.validation.XTextMarkerCreator;
-
-import com.google.inject.Inject;
 
 import de.itemis.xtext.utils.gmf.directedit.IXtextAwareEditPart;
 import de.itemis.xtext.utils.gmf.directedit.XtextCellEditor;
@@ -35,14 +34,11 @@ import de.itemis.xtext.utils.gmf.directedit.XtextCellEditor;
 public class ExpressionDirectEditPolicy extends DirectEditPolicy implements
 		IMarkerType {
 
-	@Inject
-	private IDiagnosticConverter converter;
-
 	@Override
 	protected Command getDirectEditCommand(DirectEditRequest request) {
 		Assert.isTrue(request.getCellEditor() instanceof XtextCellEditor);
 		XtextCellEditor cellEditor = (XtextCellEditor) request.getCellEditor();
-		createMarkers(cellEditor.getDiagnostics());
+		handleDiagnostics(cellEditor.getDiagnostics());
 		SetValueCommand command = new SetValueCommand(new SetRequest(getHost()
 				.resolveSemanticElement(),
 				StatechartPackage.Literals.EXPRESSION_ELEMENT__EXPRESSION,
@@ -50,36 +46,37 @@ public class ExpressionDirectEditPolicy extends DirectEditPolicy implements
 		return new ICommandProxy(command);
 	}
 
-	private void createMarkers(List<Diagnostic> diagnostics) {
-		final IFile target = GMFMarkerUtil.getTargetFile(getHost()
-				.getNotationView());
-		if (target != null) {
-			try {
-				target.deleteMarkers(MARKER_TYPE, true, IResource.DEPTH_ZERO);
-			} catch (CoreException e) {
-				e.printStackTrace();
-			}
+	private void handleDiagnostics(List<Diagnostic> diagnostics) {
+		deleteOldMarkers();
+		createNewMarkers(diagnostics);
+	}
+
+	private void createNewMarkers(List<Diagnostic> diagnostics) {
+		IFile target = GMFMarkerUtil.getTargetFile(getHost().getNotationView());
+		for (Diagnostic diagnostic : diagnostics) {
+			GMFMarkerUtil.createMarker(target, new Status(IStatus.ERROR,
+					DiagramActivator.PLUGIN_ID, diagnostic.getMessage()),
+					getHost().getNotationView().getDiagram(),
+					XTEXT_MARKER_TYPE, getHost().resolveSemanticElement());
 		}
 
-		final String elementId = getHost().getNotationView().eResource()
-				.getURIFragment(getHost().getNotationView());
-		IDiagnosticConverter.Acceptor acceptor = new IDiagnosticConverter.Acceptor() {
-			
-			public void accept(Issue issue) {
-				if (issue == null)
-					return;
-				try {
+	}
 
-					XTextMarkerCreator.createMarker(issue, target, MARKER_TYPE,
-							elementId);
-				} catch (CoreException e) {
-					e.printStackTrace();
+	private void deleteOldMarkers() {
+		final IFile target = GMFMarkerUtil.getTargetFile(getHost()
+				.getNotationView());
+		try {
+			IMarker[] markers = target.findMarkers(XTEXT_MARKER_TYPE, true,
+					IResource.DEPTH_ZERO);
+			for (IMarker iMarker : markers) {
+				if (iMarker.getAttribute(IMarker.LOCATION).equals(
+						EMFCoreUtil.getQualifiedName(getHost()
+								.resolveSemanticElement(), true))) {
+					iMarker.delete();
 				}
 			}
-		};
-		for (Diagnostic diagnostic : diagnostics) {
-			converter.convertResourceDiagnostic(diagnostic, Severity.ERROR,
-					acceptor);
+		} catch (CoreException e) {
+			e.printStackTrace();
 		}
 	}
 

+ 13 - 7
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/providers/StatechartValidationDecorationProvider.java

@@ -1,6 +1,7 @@
 package org.yakindu.sct.statechart.diagram.providers;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -41,6 +42,8 @@ import org.yakindu.model.sct.statechart.Pseudostate;
 import org.yakindu.sct.statechart.diagram.editor.StatechartDiagramEditor;
 import org.yakindu.sct.statechart.diagram.validation.IMarkerType;
 
+import com.google.common.collect.Lists;
+
 /**
  * This class is copied from GMF Generator code...
  * 
@@ -168,19 +171,21 @@ public class StatechartValidationDecorationProvider extends AbstractProvider
 			if (resource == null || !resource.exists()) {
 				return;
 			}
-			IMarker[] markers = null;
+			List<IMarker> markers = Lists.newArrayList();
 			try {
-				markers = resource.findMarkers(MARKER_TYPE, true,
-						IResource.DEPTH_INFINITE);
+				markers.addAll(Arrays.asList(resource.findMarkers(
+						DIAGRAM_MARKER_TYPE, true, IResource.DEPTH_INFINITE)));
+				markers.addAll(Arrays.asList(resource.findMarkers(
+						XTEXT_MARKER_TYPE, true, IResource.DEPTH_INFINITE)));
 			} catch (CoreException e) {
 				e.printStackTrace();
 			}
-			if (markers == null || markers.length == 0) {
+			if (markers == null || markers.size() == 0) {
 				return;
 			}
 			Label toolTip = null;
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
+			for (int i = 0; i < markers.size(); i++) {
+				IMarker marker = markers.get(i);
 				String attribute = marker
 						.getAttribute(
 								org.eclipse.gmf.runtime.common.ui.resources.IMarker.ELEMENT_ID,
@@ -344,7 +349,8 @@ public class StatechartValidationDecorationProvider extends AbstractProvider
 		}
 
 		public void handleMarkerChanged(IMarker marker) {
-			if (!MARKER_TYPE.equals(getType(marker))) {
+			if (!DIAGRAM_MARKER_TYPE.equals(getType(marker))
+					&& !XTEXT_MARKER_TYPE.equals(getType(marker))) {
 				return;
 			}
 			String viewId = marker

+ 5 - 1
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/validation/GMFMarkerUtil.java

@@ -34,7 +34,11 @@ public final class GMFMarkerUtil {
 		}
 		View view = findNotationView(diagram,
 				semanticTarget);
-		addMarker(target, view.eResource().getURIFragment(view),
+		String uriFragment = view.eResource().getURIFragment(view);
+		
+		System.out.println("URI Fragment " + uriFragment);
+		
+		addMarker(target, uriFragment,
 				EMFCoreUtil.getQualifiedName(semanticTarget, true),
 				validationStatus.getMessage(), validationStatus.getSeverity(),
 				markerType);

+ 6 - 3
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/validation/IMarkerType.java

@@ -4,12 +4,15 @@ import org.yakindu.sct.statechart.diagram.DiagramActivator;
 
 /**
  * 
- * @author Andreas Muelder <a
- *         href="mailto:andreas.muelder@itemis.de">andreas.muelder@itemis.de</a>
+ * @author Lev0r
  * 
  */
 public interface IMarkerType {
 
-	public static final String MARKER_TYPE = DiagramActivator.PLUGIN_ID + ".diagnostic";
+	public static final String DIAGRAM_MARKER_TYPE = DiagramActivator.PLUGIN_ID
+			+ ".diagnostic";
+
+	public static final String XTEXT_MARKER_TYPE = DiagramActivator.PLUGIN_ID
+			+ ".xtext.diagnostic";
 
 }

+ 2 - 2
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/validation/ValidationAction.java

@@ -27,7 +27,7 @@ public class ValidationAction implements IMarkerType {
 		IFile target = GMFMarkerUtil.getTargetFile(view);
 		if (target != null) {
 			try {
-				target.deleteMarkers(MARKER_TYPE, true, IResource.DEPTH_ZERO);
+				target.deleteMarkers(DIAGRAM_MARKER_TYPE, true, IResource.DEPTH_ZERO);
 			} catch (CoreException e) {
 				e.printStackTrace();
 			}
@@ -48,7 +48,7 @@ public class ValidationAction implements IMarkerType {
 						for (IStatus validationStatus : status) {
 							GMFMarkerUtil.createMarker(target,
 									validationStatus, diagramEditPart.getDiagramView(),
-									MARKER_TYPE, current);
+									DIAGRAM_MARKER_TYPE, current);
 						}
 					}
 				}

+ 3 - 3
plugins/org.yakindu.sct.statechart.diagram/src/org/yakindu/sct/statechart/diagram/validation/XTextMarkerCreator.java

@@ -22,9 +22,9 @@ public class XTextMarkerCreator {
 		marker.setAttribute(IMarker.MESSAGE, issue.getMessage());
 		marker.setAttribute(IMarker.SEVERITY, getSeverity(issue));
 		marker.setAttribute(Issue.CODE_KEY, issue.getCode());
-		marker.setAttribute(
-				org.eclipse.gmf.runtime.common.ui.resources.IMarker.ELEMENT_ID,
-		elementId);
+//		marker.setAttribute(
+//				org.eclipse.gmf.runtime.common.ui.resources.IMarker.ELEMENT_ID,
+//		elementId);
 		if (issue.getUriToProblem()!=null) 
 			marker.setAttribute(Issue.URI_KEY, issue.getUriToProblem().toString());
 		if(issue.getData() != null && issue.getData().length > 0) {