Browse Source

Issue validation store performance (#1271)

* Only refresh decorator when issue changed

* schedule with delay to have time to show editor
Andreas Mülder 8 years ago
parent
commit
0ae456c136

+ 8 - 5
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/providers/StatechartValidationDecorationProvider.java

@@ -83,6 +83,7 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 	public static class ValidationDecorator extends AbstractDecorator implements IResourceIssueStoreListener {
 	public static class ValidationDecorator extends AbstractDecorator implements IResourceIssueStoreListener {
 
 
 		private IValidationIssueStore store;
 		private IValidationIssueStore store;
+		private String elementId;
 
 
 		public ValidationDecorator(IDecoratorTarget decoratorTarget, IValidationIssueStore store) {
 		public ValidationDecorator(IDecoratorTarget decoratorTarget, IValidationIssueStore store) {
 			super(decoratorTarget);
 			super(decoratorTarget);
@@ -90,11 +91,12 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 		}
 		}
 
 
 		public void refresh() {
 		public void refresh() {
-			removeDecoration();
 			View view = (View) getDecoratorTarget().getAdapter(View.class);
 			View view = (View) getDecoratorTarget().getAdapter(View.class);
 			if (view == null || view.eResource() == null) {
 			if (view == null || view.eResource() == null) {
 				return;
 				return;
 			}
 			}
+			elementId = ViewUtil.getIdStr(view);
+			removeDecoration();
 			EditPart editPart = (EditPart) getDecoratorTarget().getAdapter(EditPart.class);
 			EditPart editPart = (EditPart) getDecoratorTarget().getAdapter(EditPart.class);
 			if (editPart == null || editPart.getViewer() == null || !(editPart instanceof IPrimaryEditPart)) {
 			if (editPart == null || editPart.getViewer() == null || !(editPart instanceof IPrimaryEditPart)) {
 				return;
 				return;
@@ -111,10 +113,6 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 		}
 		}
 
 
 		protected void decorate(View view) {
 		protected void decorate(View view) {
-			String elementId = ViewUtil.getIdStr(view);
-			if (elementId == null) {
-				return;
-			}
 			List<SCTIssue> issues = store.getIssues(elementId);
 			List<SCTIssue> issues = store.getIssues(elementId);
 			Severity severity = Severity.INFO;
 			Severity severity = Severity.INFO;
 			Label toolTip = null;
 			Label toolTip = null;
@@ -171,5 +169,10 @@ public class StatechartValidationDecorationProvider extends AbstractDecoratorPro
 		public void issuesChanged() {
 		public void issuesChanged() {
 			refresh();
 			refresh();
 		}
 		}
+
+		@Override
+		public String getNotationURI() {
+			return elementId;
+		}
 	}
 	}
 }
 }

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

@@ -12,6 +12,8 @@ package org.yakindu.sct.ui.editor.validation;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
@@ -89,6 +91,15 @@ public class DefaultValidationIssueStore implements IValidationIssueStore, IFile
 		}
 		}
 	}
 	}
 
 
+	protected void notifyListeners(String notationURI) {
+		synchronized (this.listener) {
+			for (IResourceIssueStoreListener iResourceIssueStoreListener : listener) {
+				if (notationURI.equals(iResourceIssueStoreListener.getNotationURI()))
+					iResourceIssueStoreListener.issuesChanged();
+			}
+		}
+	}
+
 	@Override
 	@Override
 	public void connect(Resource resource) {
 	public void connect(Resource resource) {
 		if (connected)
 		if (connected)
@@ -174,12 +185,23 @@ public class DefaultValidationIssueStore implements IValidationIssueStore, IFile
 
 
 	@Override
 	@Override
 	public void handleMarkerAdded(IMarker marker) {
 	public void handleMarkerAdded(IMarker marker) {
-		reloadMarkerIssues();
+		SCTIssue issue = createFromMarker(marker);
+		persistentIssues.put(issue.getNotationViewURI(), issue);
+		notifyListeners(issue.getNotationViewURI());
 	}
 	}
 
 
 	@Override
 	@Override
 	public void handleMarkerDeleted(IMarker marker, @SuppressWarnings("rawtypes") Map attributes) {
 	public void handleMarkerDeleted(IMarker marker, @SuppressWarnings("rawtypes") Map attributes) {
-		reloadMarkerIssues();
+		String viewId = (String) attributes.get(org.eclipse.gmf.runtime.common.ui.resources.IMarker.ELEMENT_ID);
+		String message = (String) attributes.get(IMarker.MESSAGE);
+		Collection<SCTIssue> collection = persistentIssues.get(viewId);
+		Iterator<SCTIssue> iterator = collection.iterator();
+		while (iterator.hasNext()) {
+			SCTIssue sctIssue = (SCTIssue) iterator.next();
+			if (sctIssue.getMessage().equals(message))
+				iterator.remove();
+		}
+		notifyListeners(viewId);
 
 
 	}
 	}
 
 

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

@@ -30,6 +30,8 @@ public interface IValidationIssueStore extends IValidationIssueProcessor {
 	public interface IResourceIssueStoreListener {
 	public interface IResourceIssueStoreListener {
 
 
 		public void issuesChanged();
 		public void issuesChanged();
+		
+		public String getNotationURI();
 
 
 	}
 	}
 
 

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

@@ -63,7 +63,7 @@ public class LiveValidationListener extends ResourceSetListenerImpl {
 
 
 	public void scheduleValidation() {
 	public void scheduleValidation() {
 		if (liveValidationEnabled()) {
 		if (liveValidationEnabled()) {
-			validationJob.schedule();
+			validationJob.schedule(DELAY);
 		}
 		}
 	}
 	}