diff options
author | Camille Letavernier | 2014-07-21 15:43:31 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2014-07-21 15:43:31 +0000 |
commit | a3846c88c1c9bb8764153a8b2162bad106d21a38 (patch) | |
tree | 3076c045059c3f0cc7d059246cbec46583814ff6 /extraplugins | |
parent | 5ab06e3232056fdea6708b153e2c22d4b99eaa14 (diff) | |
parent | b254781fb01527bdab7a2bd6357825166f7e6b26 (diff) | |
download | org.eclipse.papyrus-a3846c88c1c9bb8764153a8b2162bad106d21a38.tar.gz org.eclipse.papyrus-a3846c88c1c9bb8764153a8b2162bad106d21a38.tar.xz org.eclipse.papyrus-a3846c88c1c9bb8764153a8b2162bad106d21a38.zip |
Merge "431618: [Model Validation View] Problems on deleted elements become zombies https://bugs.eclipse.org/bugs/show_bug.cgi?id=431618"
Diffstat (limited to 'extraplugins')
-rw-r--r-- | extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/markers/CDOMarkerProvider.java | 112 |
1 files changed, 110 insertions, 2 deletions
diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/markers/CDOMarkerProvider.java b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/markers/CDOMarkerProvider.java index 59b26693f43..ea4a6ed3cd1 100644 --- a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/markers/CDOMarkerProvider.java +++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/markers/CDOMarkerProvider.java @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2013 CEA LIST. + * Copyright (c) 2013, 2014 CEA LIST and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -8,13 +8,17 @@ * * Contributors: * CEA LIST - Initial API and implementation + * Christian W. Damus (CEA) - bug 431618 + * *****************************************************************************/ package org.eclipse.papyrus.cdo.internal.ui.markers; import java.util.Collection; import java.util.Iterator; +import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.emf.cdo.eresource.CDOResource; @@ -28,6 +32,9 @@ import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.emf.transaction.RunnableWithResult; import org.eclipse.emf.transaction.util.TransactionUtil; +import org.eclipse.gmf.runtime.common.core.command.AbstractCommand; +import org.eclipse.gmf.runtime.common.core.command.CommandResult; +import org.eclipse.gmf.runtime.common.core.command.ICommand; import org.eclipse.papyrus.cdo.internal.ui.Activator; import org.eclipse.papyrus.cdo.validation.problems.EProblem; import org.eclipse.papyrus.cdo.validation.problems.edit.ProblemEditUtil; @@ -35,6 +42,7 @@ import org.eclipse.papyrus.cdo.validation.problems.util.ProblemsManager; import org.eclipse.papyrus.infra.core.resource.ModelSet; import org.eclipse.papyrus.infra.services.markerlistener.IPapyrusMarker; import org.eclipse.papyrus.infra.services.markerlistener.providers.AbstractMarkerProvider; +import org.eclipse.papyrus.infra.services.markerlistener.providers.IMarkerProvider2; import org.eclipse.papyrus.infra.services.markerlistener.util.MarkerListenerUtils; import com.google.common.base.Predicate; @@ -45,7 +53,7 @@ import com.google.common.collect.Lists; /** * This is the CDOMarkerProvider type. Enjoy. */ -public class CDOMarkerProvider extends AbstractMarkerProvider { +public class CDOMarkerProvider extends AbstractMarkerProvider implements IMarkerProvider2 { private final ProblemEditUtil defaultUtil = new ProblemEditUtil(new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE)); @@ -53,15 +61,18 @@ public class CDOMarkerProvider extends AbstractMarkerProvider { super(); } + @Override public boolean canProvideMarkersFor(Resource resource) { return resource instanceof CDOResource; } + @Override public Collection<? extends IPapyrusMarker> getMarkers(final Resource resource, final String type, final boolean includeSubtypes) throws CoreException { // run in a read-only transaction because the problems manager accesses // a cross-reference adapter return run(resource, CoreException.class, new RunnableWithResult.Impl<Collection<? extends IPapyrusMarker>>() { + @Override public void run() { setResult(Lists.newArrayList(Iterators.transform( // getProblems(resource, type, includeSubtypes), // @@ -78,6 +89,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider { } else if(includeSubtypes) { filter = new Predicate<EProblem>() { + @Override public boolean apply(EProblem input) { return MarkerListenerUtils.isMarkerTypeSubtypeOf(input.getType(), type); } @@ -85,6 +97,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider { } else { filter = new Predicate<EProblem>() { + @Override public boolean apply(EProblem input) { return type.equals(input.getType()); } @@ -102,6 +115,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider { // (the problems model is not stored in a resource) run(resource, CoreException.class, new Runnable() { + @Override public void run() { try { basicCreateMarkers(resource, diagnostic, monitor); @@ -145,6 +159,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider { // (the problems model is not stored in a resource) run(object.eResource(), CoreException.class, new Runnable() { + @Override public void run() { try { basicDeleteMarkers(object, monitor, type, includeSubtypes); @@ -159,6 +174,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider { super.deleteMarkers(object, monitor, type, includeSubtypes); } + @Override public void deleteMarkers(final Resource resource, IProgressMonitor monitor) { try { this.deleteMarkers(resource, monitor, null, true); @@ -167,6 +183,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider { } } + @Override public void deleteMarkers(final Resource resource, IProgressMonitor monitor, final String markerType, final boolean includeSubtypes) throws CoreException { SubMonitor sub = SubMonitor.convert(monitor, IProgressMonitor.UNKNOWN); @@ -176,6 +193,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider { // (the problems model is not stored in a resource) run(resource, new Runnable() { + @Override public void run() { ProblemsManager mgr = getProblemsManager(resource); if(markerType == null) { @@ -193,6 +211,18 @@ public class CDOMarkerProvider extends AbstractMarkerProvider { sub.done(); } + @Override + public boolean hasMarkers(Resource context, EObject object) { + ProblemsManager manager = getProblemsManager(context); + + return (manager != null) && manager.getAllProblems(object).hasNext(); + } + + @Override + public ICommand getMarkerDeletionCommand(Resource context, EObject object) { + return new MarkerDeletionCommand(context, object); + } + private ProblemsManager getProblemsManager(Resource resource) { return ProblemsManager.getProblemsManager(resource.getResourceSet()); } @@ -249,4 +279,82 @@ public class CDOMarkerProvider extends AbstractMarkerProvider { return result; } + // + // Nested types + // + + private class MarkerDeletionCommand extends AbstractCommand { + + private Resource context; + + private EObject object; + + private Collection<? extends EProblem> problemsForUndo; + + public MarkerDeletionCommand(Resource context, EObject object) { + super("Delete markers"); + + this.context = context; + this.object = object; + } + + @Override + public void dispose() { + context = null; + object = null; + problemsForUndo = null; + + super.dispose(); + } + + @Override + protected CommandResult doExecuteWithResult(IProgressMonitor progressMonitor, IAdaptable info) throws ExecutionException { + ProblemsManager manager = getProblemsManager(context); + Collection<EProblem> problems = Lists.newArrayList(manager.getAllProblems(object)); + if(problems.isEmpty()) { + // Nothing to do + return CommandResult.newOKCommandResult(); + } + + for(EProblem problem : problems) { + ProblemsManager.delete(problem); + } + + // Initialize undo information + problemsForUndo = problems; + + return CommandResult.newOKCommandResult(); + } + + @Override + protected CommandResult doUndoWithResult(IProgressMonitor progressMonitor, IAdaptable info) throws ExecutionException { + if(problemsForUndo == null) { + // Nothing to do + return CommandResult.newOKCommandResult(); + } + + // Detach undo information + final Collection<? extends EProblem> problems = problemsForUndo; + problemsForUndo = null; + + Resource resource = object.eResource(); + if(resource != null) { // Should have been reattached by now + context = resource; + ProblemsManager manager = getProblemsManager(resource); + for(EProblem problem : problems) { + problem.setElement(object); + manager.addProblem(problem); + } + } + + return CommandResult.newOKCommandResult(); + } + + @Override + protected CommandResult doRedoWithResult(IProgressMonitor progressMonitor, IAdaptable info) throws ExecutionException { + return doExecuteWithResult(progressMonitor, info); + } + + } + } |