diff --git a/org.fortiss.tooling.kernel.ui/trunk/plugin.xml b/org.fortiss.tooling.kernel.ui/trunk/plugin.xml index eae388ffcd619ae46d84705673523f7746df3b1a..951c33d73c17843b168386a7b2507a39bcd1da43 100644 --- a/org.fortiss.tooling.kernel.ui/trunk/plugin.xml +++ b/org.fortiss.tooling.kernel.ui/trunk/plugin.xml @@ -112,25 +112,12 @@ </extension> <extension point="org.eclipse.ui.decorators"> - <decorator - class="org.fortiss.tooling.kernel.ui.internal.MarkerServiceLabelDecorator" - id="org.fortiss.tooling.kernel.ui.internal.MarkerServiceLabelDecorator" - label="Marker Service Decorator" - lightweight="true" - location="BOTTOM_LEFT" - state="true"> - <enablement> - <objectClass - name="org.eclipse.emf.ecore.EObject"> - </objectClass> - </enablement> - </decorator> <decorator class="org.fortiss.tooling.kernel.ui.internal.ConstraintLabelDecorator" id="org.fortiss.tooling.kernel.ui.internal.ConstraintLabelDecorator" label="Constraint Decorator" lightweight="true" - location="TOP_LEFT" + location="BOTTOM_LEFT" state="true"> <enablement> <objectClass diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ConstraintLabelDecorator.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ConstraintLabelDecorator.java index d7546958cc86448d6f673cc378d134f5c52d2963..7495f09023b20ebbbf635bb026a824e2513139be 100644 --- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ConstraintLabelDecorator.java +++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ConstraintLabelDecorator.java @@ -17,14 +17,14 @@ $Id$ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.kernel.ui.internal; +import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.BaseLabelProvider; import org.eclipse.jface.viewers.IDecoration; import org.eclipse.jface.viewers.ILightweightLabelDecorator; -import org.fortiss.tooling.kernel.model.constraints.IConstrained; -import org.fortiss.tooling.kernel.ui.ToolingKernelUIActivator; +import org.fortiss.tooling.kernel.extension.data.IConstraintViolation.ESeverity; +import org.fortiss.tooling.kernel.ui.ESharedImages; import org.fortiss.tooling.kernel.ui.service.IMarkerService; import org.fortiss.tooling.kernel.ui.util.ConstraintsUtils; -import org.fortiss.tooling.kernel.ui.util.ConstraintsUtils.ClassifiedStatuses; /** * Label decorator for the {@link IMarkerService} decorations: errors, warnings, etc. @@ -40,21 +40,21 @@ public final class ConstraintLabelDecorator extends BaseLabelProvider implements /** {@inheritDoc} */ @Override public void decorate(Object element, IDecoration decoration) { - if(element instanceof IConstrained) { - IConstrained constrained = (IConstrained)element; - ClassifiedStatuses classifiedStatuses = - ConstraintsUtils.getClassifiedStatuses(constrained); - if(!classifiedStatuses.failedStatuses.isEmpty()) { - decoration.addOverlay(ToolingKernelUIActivator - .getImageDescriptor("icons/constraintFailOverlay.png")); - } else if(!classifiedStatuses.errorStatuses.isEmpty()) { - decoration.addOverlay(ToolingKernelUIActivator - .getImageDescriptor("icons/constraintErrorOverlay.png")); - } else if(!classifiedStatuses.outdatedStatuses.isEmpty()) { - decoration.addOverlay(ToolingKernelUIActivator - .getImageDescriptor("icons/constraintOutdatedOverlay.png")); - } else if(!classifiedStatuses.failedStatuses.isEmpty()) { - decoration.addOverlay(null); + if(element instanceof EObject) { + ESeverity sev = IMarkerService.INSTANCE.getHighestViolationSeverity((EObject)element); + sev = ConstraintsUtils.augmentSeverityWithConstraintSeverity(sev, (EObject)element); + switch(sev) { + case FATAL: + decoration.addOverlay(ESharedImages.FATAL_OVERLAY.getImageDescriptor()); + break; + case ERROR: + decoration.addOverlay(ESharedImages.ERROR_OVERLAY.getImageDescriptor()); + break; + case WARNING: + decoration.addOverlay(ESharedImages.WARNING_OVERLAY.getImageDescriptor()); + break; + default: + // ignore info and debug } } } diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java index 5850a190e01b68282b1044042e15a9d1c20bddfd..f924e917d5a6958ccb192b44a6831e986029df4f 100644 --- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java +++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java @@ -41,10 +41,12 @@ import org.eclipse.ui.progress.UIJob; import org.fortiss.tooling.kernel.extension.data.IConstraintViolation; import org.fortiss.tooling.kernel.extension.data.IConstraintViolation.ESeverity; import org.fortiss.tooling.kernel.extension.data.ITopLevelElement; +import org.fortiss.tooling.kernel.model.constraints.IConstrained; import org.fortiss.tooling.kernel.service.IPersistencyService; import org.fortiss.tooling.kernel.service.listener.IPersistencyServiceListener; import org.fortiss.tooling.kernel.ui.internal.views.MarkerViewPart; import org.fortiss.tooling.kernel.ui.service.IMarkerService; +import org.fortiss.tooling.kernel.ui.util.ConstraintsUtils; /** * This class implements the {@link IMarkerService} interface. @@ -259,10 +261,10 @@ public class MarkerService implements IMarkerService, IPersistencyServiceListene /** Returns the highest severity for the given element. */ public ESeverity getHighestSeverity(EObject element) { ESeverity sev = highestSeverityMap.get(element); - if(sev == null) { - return ESeverity.lowest(); + if(element instanceof IConstrained) { + sev = ConstraintsUtils.augmentSeverityWithConstraintSeverity(sev, element); } - return sev; + return sev == null ? ESeverity.lowest() : sev; } /** Updates the cache entry. */ diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/util/ConstraintsUtils.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/util/ConstraintsUtils.java index 01cbd06994c275e5ac0ee706837269aed63e296b..a5e02a372eec1b9e9f3f0fe3678cc7750f554e2d 100644 --- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/util/ConstraintsUtils.java +++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/util/ConstraintsUtils.java @@ -17,9 +17,14 @@ $Id$ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.kernel.ui.util; +import static org.fortiss.tooling.kernel.extension.data.IConstraintViolation.SEVERITY_DIRECT_COMPARATOR; + import java.util.ArrayList; import java.util.List; +import org.eclipse.emf.ecore.EObject; +import org.fortiss.tooling.kernel.extension.data.IConstraintViolation; +import org.fortiss.tooling.kernel.extension.data.IConstraintViolation.ESeverity; import org.fortiss.tooling.kernel.model.constraints.ConstraintsFactory; import org.fortiss.tooling.kernel.model.constraints.ErrorVerificationStatus; import org.fortiss.tooling.kernel.model.constraints.FailVerificationStatus; @@ -101,4 +106,44 @@ public class ConstraintsUtils { } return res; } + + /** + * @param c + * @return {@link ESeverity} corresponding to the status of the constraint <code>c</code> + */ + public static ESeverity getConstraintSeverity(IConstraint c) { + if(c.getVerificationStatus() instanceof FailVerificationStatus) { + return ESeverity.ERROR; + } else if(c.getVerificationStatus() instanceof ErrorVerificationStatus) { + return ESeverity.ERROR; + } else if(c.getVerificationStatus() instanceof OutdatedVerificationStatus) { + return ESeverity.WARNING; + } else { + return ESeverity.lowest(); + } + } + + /** + * @param c + * @return Severity corresponding to the status of the constraints of <code>c</code>. + */ + public static ESeverity getSeverity(IConstrained c) { + try { + return c.getConstraints().stream().map(cstr -> getConstraintSeverity(cstr)) + .sorted(IConstraintViolation.SEVERITY_DIRECT_COMPARATOR).findFirst().get(); + } catch(Exception e) { + return null; + } + } + + public static ESeverity augmentSeverityWithConstraintSeverity(ESeverity sev, + EObject modelElement) { + if(modelElement instanceof IConstrained) { + ESeverity sev2 = ConstraintsUtils.getSeverity((IConstrained)modelElement); + if(sev == null || (sev2 != null && SEVERITY_DIRECT_COMPARATOR.compare(sev2, sev) < 0)) { + sev = sev2; + } + } + return sev == null ? ESeverity.lowest() : sev; + } } diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/data/IConstraintViolation.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/data/IConstraintViolation.java index 7c42012c4165d302e744e72d746b0f61a8cdb94b..b3aaba7e3b286ac34fdb694c1db2be8bd160db10 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/data/IConstraintViolation.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/data/IConstraintViolation.java @@ -101,6 +101,16 @@ public interface IConstraintViolation<T extends EObject> extends IAdaptable { void applyQuickFix(); } + /** Severity comparator. To use directly with lists of severities. */ + public static final Comparator<ESeverity> SEVERITY_DIRECT_COMPARATOR = + new Comparator<ESeverity>() { + /** {@inheritDoc} */ + @Override + public int compare(ESeverity sev0, ESeverity sev1) { + return ESeverity.getIntSeverity(sev0) - ESeverity.getIntSeverity(sev1); + } + }; + /** Stores the severity comparator used during violation sorting. */ public static final Comparator<IConstraintViolation<? extends EObject>> SEVERITY_COMPARATOR = new Comparator<IConstraintViolation<? extends EObject>>() { @@ -108,9 +118,9 @@ public interface IConstraintViolation<T extends EObject> extends IAdaptable { @Override public int compare(IConstraintViolation<? extends EObject> arg0, IConstraintViolation<? extends EObject> arg1) { - int sev0 = ESeverity.getIntSeverity(arg0.getSeverity()); - int sev1 = ESeverity.getIntSeverity(arg1.getSeverity()); - return sev0 - sev1; + return SEVERITY_DIRECT_COMPARATOR.compare(arg0.getSeverity(), + arg1.getSeverity()); } }; + }