1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 398611. Avoid calling IResource.findMarkers multiple times for the

same resource.
This commit is contained in:
Sergey Prigogin 2013-01-20 21:57:33 -08:00
parent 7be456a5de
commit 1cfda1b6e4

View file

@ -7,9 +7,13 @@
* *
* Contributors: * Contributors:
* IBM Corporation - initial API and implementation * IBM Corporation - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.viewsupport; package org.eclipse.cdt.internal.ui.viewsupport;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceStatus; import org.eclipse.core.resources.IResourceStatus;
@ -81,14 +85,43 @@ public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabe
} }
} }
private static class MarkersCacheKey {
private IResource res;
private int depth;
public MarkersCacheKey(IResource res, int depth) {
this.res = res;
this.depth = depth;
}
@Override
public int hashCode() {
return res.hashCode() + 31 * depth;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MarkersCacheKey other = (MarkersCacheKey) obj;
return depth == other.depth && res.equals(other.res);
}
}
private static final int ERRORTICK_WARNING= CElementImageDescriptor.WARNING; private static final int ERRORTICK_WARNING= CElementImageDescriptor.WARNING;
private static final int ERRORTICK_ERROR= CElementImageDescriptor.ERROR; private static final int ERRORTICK_ERROR= CElementImageDescriptor.ERROR;
private static final IMarker[] EMPTY_MARKER_ARRAY = {};
private ImageDescriptorRegistry fRegistry; private ImageDescriptorRegistry fRegistry;
private boolean fUseNewRegistry; private boolean fUseNewRegistry;
private IProblemChangedListener fProblemChangedListener; private IProblemChangedListener fProblemChangedListener;
private ListenerList fListeners; private ListenerList fListeners;
private Map<MarkersCacheKey, IMarker[]> fMarkersCache = new HashMap<MarkersCacheKey, IMarker[]>();
/** /**
* Creates a new <code>ProblemsLabelDecorator</code>. * Creates a new <code>ProblemsLabelDecorator</code>.
@ -179,8 +212,14 @@ public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabe
} }
int info= 0; int info= 0;
IMarker[] markers= res.findMarkers(IMarker.PROBLEM, true, depth); MarkersCacheKey cacheKey = new MarkersCacheKey(res, depth);
if (markers != null) { IMarker[] markers = fMarkersCache .get(cacheKey);
if (markers == null) {
markers= res.findMarkers(IMarker.PROBLEM, true, depth);
if (markers == null)
markers = EMPTY_MARKER_ARRAY;
fMarkersCache.put(cacheKey, markers);
}
for (int i= 0; i < markers.length && (info != ERRORTICK_ERROR); i++) { for (int i= 0; i < markers.length && (info != ERRORTICK_ERROR); i++) {
IMarker curr= markers[i]; IMarker curr= markers[i];
if (sourceElement == null || isMarkerInRange(curr, sourceElement)) { if (sourceElement == null || isMarkerInRange(curr, sourceElement)) {
@ -192,7 +231,6 @@ public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabe
} }
} }
} }
}
return info; return info;
} }
@ -280,6 +318,7 @@ public class ProblemsLabelDecorator implements ILabelDecorator, ILightweightLabe
} }
protected void fireProblemsChanged(IResource[] changedResources, boolean isMarkerChange) { protected void fireProblemsChanged(IResource[] changedResources, boolean isMarkerChange) {
fMarkersCache.clear();
if (fListeners != null && !fListeners.isEmpty()) { if (fListeners != null && !fListeners.isEmpty()) {
LabelProviderChangedEvent event= new ProblemsLabelChangedEvent(this, changedResources, isMarkerChange); LabelProviderChangedEvent event= new ProblemsLabelChangedEvent(this, changedResources, isMarkerChange);
Object[] listeners= fListeners.getListeners(); Object[] listeners= fListeners.getListeners();