Pārlūkot izejas kodu

#1228 - Show an error on states when subdiagram has errors (#1635)

- Adoptions to DecorationProvider to render Error Icons in subdiagram
preview images 
- Add store listener for child elements
Andreas Mülder 8 gadi atpakaļ
vecāks
revīzija
525ff53c2f

+ 49 - 4
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/providers/StatechartValidationDecorationProvider.java

@@ -10,11 +10,14 @@
  */
 package org.yakindu.sct.ui.editor.providers;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.draw2d.FlowLayout;
 import org.eclipse.draw2d.Label;
+import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.gef.EditDomain;
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.editparts.AbstractConnectionEditPart;
@@ -24,6 +27,7 @@ import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.AbstractDecorator;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorProvider;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget;
+import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
 import org.eclipse.gmf.runtime.notation.Edge;
 import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.swt.graphics.Image;
@@ -32,12 +36,15 @@ import org.eclipse.ui.ISharedImages;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.xtext.diagnostics.Severity;
 import org.eclipse.xtext.validation.Issue;
+import org.eclipse.xtext.validation.Issue.IssueImpl;
 import org.yakindu.base.gmf.runtime.decorators.AbstractDecoratorProvider;
 import org.yakindu.sct.model.sgraph.FinalState;
 import org.yakindu.sct.model.sgraph.Pseudostate;
 import org.yakindu.sct.model.sgraph.ui.validation.SCTIssue;
 import org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor;
 import org.yakindu.sct.ui.editor.editparts.BorderItemEditPart;
+import org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil;
+import org.yakindu.sct.ui.editor.utils.GMFNotationUtil;
 import org.yakindu.sct.ui.editor.validation.IValidationIssueStore;
 import org.yakindu.sct.ui.editor.validation.IValidationIssueStore.IValidationIssueStoreListener;
 
@@ -54,7 +61,7 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 
 	public void createDecorators(IDecoratorTarget decoratorTarget) {
 		EditPart editPart = (EditPart) decoratorTarget.getAdapter(EditPart.class);
-		if(editPart instanceof BorderItemEditPart)
+		if (editPart instanceof BorderItemEditPart)
 			return;
 		if (editPart instanceof IPrimaryEditPart
 				&& (editPart instanceof GraphicalEditPart || editPart instanceof AbstractConnectionEditPart)) {
@@ -73,6 +80,10 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 			issueStore = (IValidationIssueStore) part.getAdapter(IValidationIssueStore.class);
 			return true;
 		}
+		// This is required for OffscreenEditPartFactory to render problem markers into
+		// the preview image
+		if (part == null)
+			return true;
 		return false;
 	}
 
@@ -86,8 +97,10 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 
 	public static class ValidationDecorator extends AbstractDecorator implements IValidationIssueStoreListener {
 
+		private static final String SUB_DIAGRAM_ERRORS = "The subdiagram contains errors.";
 		private IValidationIssueStore store;
 		private String semanticID;
+		private String subdiagramSemanticID;
 
 		public ValidationDecorator(IDecoratorTarget decoratorTarget, IValidationIssueStore store) {
 			super(decoratorTarget);
@@ -120,6 +133,9 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 
 		protected void decorate(View view) {
 			List<SCTIssue> issues = store.getIssues(semanticID);
+			SCTIssue subDiagramIssue = getSubDiagramIssue(view);
+			if (subDiagramIssue != null)
+				issues.add(subDiagramIssue);
 			Severity severity = Severity.INFO;
 			Label toolTip = null;
 			if (issues.isEmpty())
@@ -151,11 +167,36 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 				int margin = view.getElement() instanceof Pseudostate || view.getElement() instanceof FinalState ? 0
 						: -1;
 				setDecoration(getDecoratorTarget().addShapeDecoration(getImage(severity),
-						IDecoratorTarget.Direction.NORTH_EAST, margin, true));
+						IDecoratorTarget.Direction.NORTH_EAST, margin, false));
 				getDecoration().setToolTip(toolTip);
 			}
 		}
 
+		protected SCTIssue getSubDiagramIssue(View view) {
+			if (SemanticHints.STATE.equals(view.getType())) {
+				BooleanValueStyle style = GMFNotationUtil.getBooleanValueStyle(view,
+						DiagramPartitioningUtil.INLINE_STYLE);
+				if (style == null ? false : !style.isBooleanValue()) {
+					EObject element = view.getElement();
+					TreeIterator<EObject> eAllContents = element.eAllContents();
+					while (eAllContents.hasNext()) {
+						EObject next = eAllContents.next();
+						List<SCTIssue> issues = store.getIssues(EcoreUtil.getURI(next).fragment());
+						for (final SCTIssue issue : issues) {
+							if (Severity.ERROR.equals(issue.getSeverity())) {
+								IssueImpl result = new Issue.IssueImpl();
+								result.setMessage(SUB_DIAGRAM_ERRORS);
+								result.setSeverity(Severity.ERROR);
+								subdiagramSemanticID = issue.getSemanticURI();
+								return new SCTIssue(result, issue.getSemanticURI());
+							}
+						}
+					}
+				}
+			}
+			return null;
+		}
+
 		protected Image getImage(Severity severity) {
 			String imageName = ISharedImages.IMG_OBJS_ERROR_TSK;
 			switch (severity) {
@@ -177,8 +218,12 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 		}
 
 		@Override
-		public String getSemanticURI() {
-			return semanticID;
+		public List<String> getSemanticURIs() {
+			List<String> result = new ArrayList<String>();
+			result.add(semanticID);
+			if (subdiagramSemanticID != null)
+				result.add(subdiagramSemanticID);
+			return result;
 		}
 	}
 }

+ 0 - 65
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/utils/InteractionUtil.java

@@ -1,65 +0,0 @@
-/** 
- * Copyright (c) 2015 committers of YAKINDU 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:
- * committers of YAKINDU - initial API and implementation
- *
-*/
-package org.yakindu.sct.ui.editor.utils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.xtext.nodemodel.INode;
-import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
-import org.eclipse.xtext.ui.editor.XtextEditor;
-
-public class InteractionUtil {
-
-	public InteractionUtil() {
-		// TODO Auto-generated constructor stub
-	}
-
-	static public void openElement(EObject obj) {
-		if (obj != null) {
-			URI uri = EcoreUtil.getURI(obj);
-			IFile file = ResourcesPlugin.getWorkspace().getRoot()
-					.getFile(new Path(uri.toPlatformString(true)));
-			IEditorPart editor = null;
-			try {
-				IEditorDescriptor desc = PlatformUI.getWorkbench()
-						.getEditorRegistry().getDefaultEditor(file.getName());
-
-				final IWorkbenchPage wbPage = PlatformUI.getWorkbench()
-						.getActiveWorkbenchWindow().getActivePage();
-				editor = wbPage.openEditor(new FileEditorInput(file),
-						desc.getId());
-
-				if (editor instanceof XtextEditor) {
-					INode node = NodeModelUtils.findActualNodeFor(obj);
-					if (node != null) {
-						((XtextEditor) editor).selectAndReveal(
-								node.getOffset(), node.getLength());
-					}
-				}
-
-				// BreadcrumbEditorUtil.openEditor(file);
-			} catch (PartInitException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-}

+ 1 - 1
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/validation/DefaultValidationIssueStore.java

@@ -91,7 +91,7 @@ public class DefaultValidationIssueStore implements IValidationIssueStore, IReso
 	protected void notifyListeners(String semanticURI) {
 		synchronized (listener) {
 			for (IValidationIssueStoreListener iResourceIssueStoreListener : listener) {
-				if (semanticURI.equals(iResourceIssueStoreListener.getSemanticURI())) {
+				if (iResourceIssueStoreListener.getSemanticURIs().contains(semanticURI)) {
 					iResourceIssueStoreListener.issuesChanged();
 				}
 			}

+ 2 - 2
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/validation/IValidationIssueStore.java

@@ -31,7 +31,7 @@ public interface IValidationIssueStore extends IValidationIssueProcessor {
 
 		public void issuesChanged();
 		
-		public String getSemanticURI();
+		public List<String> getSemanticURIs();
 
 	}
 
@@ -43,5 +43,5 @@ public interface IValidationIssueStore extends IValidationIssueProcessor {
 
 	public void disconnect(Resource resource);
 
-	public List<SCTIssue> getIssues(String uri);
+	public List<SCTIssue> getIssues(String uriFragment);
 }