Просмотр исходного кода

Issue 1707 (#1713)

* #1707 : ensure issue stores are shared 

* for editor instances of same resource

* #1707 : avoid init issue store twice

* #1707 : optimize processing of sub diagram issues

* #1707 : ensure decoration provider will handle necessary notifications

* fixes that parents does not show NEW error markers of their childs

* #1707 : ensure a parent will be notified about all childs markers

* #1707 : avoid returning null

* Changed listener to use getAnchestor instead of iterating eAllContents
Johannes Dicks 8 лет назад
Родитель
Сommit
a2fe1809d1

+ 42 - 3
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editor/StatechartDiagramEditor.java

@@ -10,6 +10,9 @@
  */
 package org.yakindu.sct.ui.editor.editor;
 
+import java.util.ArrayList;
+import java.util.Optional;
+
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IProjectDescription;
@@ -34,6 +37,8 @@ import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
 import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.IFileEditorInput;
 import org.eclipse.ui.PartInitException;
@@ -58,6 +63,7 @@ import org.yakindu.sct.ui.editor.utils.HelpContextIds;
 import org.yakindu.sct.ui.editor.validation.IValidationIssueStore;
 import org.yakindu.sct.ui.editor.validation.LiveValidationListener;
 
+import com.google.common.collect.Lists;
 import com.google.inject.Injector;
 import com.google.inject.Key;
 
@@ -133,8 +139,7 @@ public class StatechartDiagramEditor extends DiagramPartitioningEditor implement
 	}
 
 	protected void registerValidationListener() {
-		issueStore = getEditorInjector().getInstance(IValidationIssueStore.class);
-		issueStore.connect(getDiagram().eResource());
+		issueStore = getIssueStore();
 		validationListener = getEditorInjector().getInstance(LiveValidationListener.class);
 		validationListener.setResource(getDiagram().eResource());
 		validationListener.setValidationIssueProcessor(issueStore);
@@ -142,6 +147,38 @@ public class StatechartDiagramEditor extends DiagramPartitioningEditor implement
 		validationListener.scheduleValidation();
 	}
 
+	protected IValidationIssueStore getIssueStore() {
+		Optional<IEditorPart> editorWithSameResource = getEditorWithSameResource();
+		if (editorWithSameResource.isPresent()) {
+			IValidationIssueStore sharedStore = editorWithSameResource.get()
+					.getAdapter(IValidationIssueStore.class);
+			return sharedStore;
+		} else {
+			IValidationIssueStore newStore = getEditorInjector().getInstance(IValidationIssueStore.class);
+			newStore.connect(getDiagram().eResource());
+			return newStore;
+		}
+	}
+
+	protected Optional<IEditorPart> getEditorWithSameResource() {
+		ArrayList<IEditorReference> currentEditors = Lists.newArrayList(
+				PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditorReferences());
+
+		Optional<IEditorPart> editorWithSameResource = currentEditors.stream().filter(e -> {
+			try {
+				IEditorInput otherInput = e.getEditorInput();
+				IEditorInput thisInput = this.getEditorInput();
+
+				return ID.equals(e.getId()) && !otherInput.equals(thisInput) && ((IFileEditorInput) otherInput)
+						.getFile().getLocationURI().equals(((IFileEditorInput) thisInput).getFile().getLocationURI());
+			} catch (PartInitException e1) {
+				e1.printStackTrace();
+				return false;
+			}
+		}).map(e -> e.getEditor(false)).findFirst();
+		return editorWithSameResource;
+	}
+
 	protected Injector getEditorInjector() {
 		IDomain domain = DomainRegistry.getDomain(getDiagram().getElement());
 		Injector injector = domain.getInjector(IDomain.FEATURE_EDITOR);
@@ -294,8 +331,9 @@ public class StatechartDiagramEditor extends DiagramPartitioningEditor implement
 		if (validationListener != null) {
 			validationListener.dispose();
 		}
-		if (issueStore != null)
+		if (issueStore != null && !getEditorWithSameResource().isPresent()) {
 			issueStore.disconnect(getDiagram().eResource());
+		}
 		getEditingDomain().removeResourceSetListener(validationListener);
 		getEditingDomain().removeResourceSetListener(domainAdapter);
 		if (domainAdapter != null)
@@ -303,6 +341,7 @@ public class StatechartDiagramEditor extends DiagramPartitioningEditor implement
 		super.dispose();
 	}
 
+
 	@Override
 	protected int getInitialPaletteSize() {
 		return INITIAL_PALETTE_SIZE;

+ 38 - 16
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/providers/StatechartValidationDecorationProvider.java

@@ -10,8 +10,8 @@
  */
 package org.yakindu.sct.ui.editor.providers;
 
-import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 import org.eclipse.draw2d.FlowLayout;
 import org.eclipse.draw2d.Label;
@@ -100,7 +100,6 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 		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);
@@ -108,19 +107,35 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 		}
 
 		public void refresh() {
-			View view = (View) getDecoratorTarget().getAdapter(View.class);
-			if (view == null || view.eResource() == null) {
+			Optional<EObject> element = getTargetEObject();
+			if (!element.isPresent()) {
 				return;
 			}
-			EObject element = view.getElement();
-			if (element != null)
-				semanticID = element.eResource().getURIFragment(element);
+			semanticID = element.get().eResource().getURIFragment(element.get());
 			removeDecoration();
 			EditPart editPart = (EditPart) getDecoratorTarget().getAdapter(EditPart.class);
 			if (editPart == null || editPart.getViewer() == null || !(editPart instanceof IPrimaryEditPart)) {
 				return;
 			}
-			decorate(view);
+			decorate(getTargetView().get());
+		}
+
+		protected Optional<EObject> getTargetEObject() {
+			Optional<View> view = getTargetView();
+			if (view.isPresent()) {
+				EObject element = view.get().getElement();
+				if (element != null)
+					return Optional.of(element);
+			}
+			return Optional.empty();
+		}
+
+		private Optional<View> getTargetView() {
+			View view = (View) getDecoratorTarget().getAdapter(View.class);
+			if (view == null || view.eResource() == null) {
+				return Optional.empty();
+			}
+			return Optional.of(view);
 		}
 
 		public void activate() {
@@ -182,13 +197,13 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 					TreeIterator<EObject> eAllContents = element.eAllContents();
 					while (eAllContents.hasNext()) {
 						EObject next = eAllContents.next();
-						List<SCTIssue> issues = store.getIssues(EcoreUtil.getURI(next).fragment());
+						String semanticURI = EcoreUtil.getURI(next).fragment();
+						List<SCTIssue> issues = store.getIssues(semanticURI);
 						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());
 							}
 						}
@@ -219,12 +234,19 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 		}
 
 		@Override
-		public List<String> getSemanticURIs() {
-			List<String> result = new ArrayList<String>();
-			result.add(semanticID);
-			if (subdiagramSemanticID != null)
-				result.add(subdiagramSemanticID);
-			return result;
+		public String getSemanticURI() {
+			return semanticID;
+		}
+
+		@Override
+		public boolean notifyOnChildChange() {
+			Optional<View> view = getTargetView();
+			if (view.isPresent() && SemanticHints.STATE.equals(view.get().getType())) {
+				BooleanValueStyle style = GMFNotationUtil.getBooleanValueStyle(view.get(),
+						DiagramPartitioningUtil.INLINE_STYLE);
+				return style == null ? false : !style.isBooleanValue();
+			}
+			return false;
 		}
 	}
 }

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

@@ -23,6 +23,7 @@ import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
 import org.eclipse.xtext.diagnostics.Severity;
 import org.eclipse.xtext.validation.CheckType;
@@ -91,9 +92,15 @@ public class DefaultValidationIssueStore implements IValidationIssueStore, IReso
 
 	protected void notifyListeners(String semanticURI) {
 		synchronized (listener) {
-			for (IValidationIssueStoreListener iResourceIssueStoreListener : listener) {
-				if (iResourceIssueStoreListener.getSemanticURIs().contains(semanticURI)) {
-					iResourceIssueStoreListener.issuesChanged();
+			for (IValidationIssueStoreListener currentListener : listener) {
+				String uriToListen = currentListener.getSemanticURI();
+				if (semanticURI.equals(uriToListen)) {
+					currentListener.issuesChanged();
+				} else if (currentListener.notifyOnChildChange() && connectedResource != null) {
+					if (EcoreUtil.isAncestor(connectedResource.getEObject(uriToListen),
+							connectedResource.getEObject(semanticURI))) {
+						currentListener.issuesChanged();
+					}
 				}
 			}
 		}
@@ -187,7 +194,6 @@ public class DefaultValidationIssueStore implements IValidationIssueStore, IReso
 			visibleIssues.putAll(newVisibleIssues);
 		}
 
-
 		SetView<String> changes = Sets.symmetricDifference(oldVisibleIssues.keySet(), newVisibleIssues.keySet());
 		for (String semanticElementID : newVisibleIssues.keySet()) {
 			if (changes.contains(semanticElementID)

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

@@ -31,7 +31,9 @@ public interface IValidationIssueStore extends IValidationIssueProcessor {
 
 		public void issuesChanged();
 		
-		public List<String> getSemanticURIs();
+		public String getSemanticURI();
+		
+		public boolean notifyOnChildChange();
 
 	}