diff options
author | Philip Langer | 2017-09-15 09:10:19 +0000 |
---|---|---|
committer | Laurent Goubet | 2018-04-30 11:33:10 +0000 |
commit | 51dfa20fbd856362447ad084f81dc81b01fdb718 (patch) | |
tree | cd31697d82f41ad87839af0955cc9e7f9cc3510a /plugins/org.eclipse.emf.compare.rcp.ui/src/org | |
parent | a95d0854c5c5ee74956f4e20dbdcb1b00f1881fc (diff) | |
download | org.eclipse.emf.compare-51dfa20fbd856362447ad084f81dc81b01fdb718.tar.gz org.eclipse.emf.compare-51dfa20fbd856362447ad084f81dc81b01fdb718.tar.xz org.eclipse.emf.compare-51dfa20fbd856362447ad084f81dc81b01fdb718.zip |
Cache StructureMergeViewerFilter results
StructureMergeViewerFilter.select is rather expensive, so we should
cache the result and clear the cache when the filter changes.
Change-Id: I984d5ffe57bcbe8aa6ab0ee326db28221d0aadf6
Signed-off-by: Philip Langer <planger@eclipsesource.com>
Diffstat (limited to 'plugins/org.eclipse.emf.compare.rcp.ui/src/org')
-rw-r--r-- | plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java index bfece618b..b847a3650 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/filters/StructureMergeViewerFilter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2012, 2016 Obeo. + * Copyright (c) 2012, 2017 Obeo and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * Obeo - initial API and implementation + * Philip Langer - cache result *******************************************************************************/ package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters; @@ -14,6 +15,7 @@ import static com.google.common.base.Predicates.alwaysFalse; import static com.google.common.base.Predicates.not; import static com.google.common.base.Predicates.or; import static com.google.common.collect.Iterables.any; +import static com.google.common.collect.Maps.newHashMap; import static com.google.common.collect.Sets.newLinkedHashSet; import com.google.common.base.Predicate; @@ -22,6 +24,7 @@ import com.google.common.collect.Iterables; import com.google.common.eventbus.EventBus; import java.util.Collection; +import java.util.Map; import java.util.Set; import org.eclipse.emf.common.notify.Adapter; @@ -72,6 +75,9 @@ public class StructureMergeViewerFilter extends ViewerFilter { /** The {@link EventBus} associated with this filter. */ private final EventBus eventBus; + /** The cached values for {@link #select(Viewer, Object, Object)}. */ + private final Map<Object, Boolean> selectedObjects; + /** * The predicate used by this StructureMergeViewerFilter. */ @@ -116,6 +122,7 @@ public class StructureMergeViewerFilter extends ViewerFilter { this.unselectedDifferenceFilters = newLinkedHashSet(); this.activeDifferenceFilters = newLinkedHashSet(); this.aggregatedPredicate = DEFAULT_PREDICATE; + this.selectedObjects = newHashMap(); } /** @@ -130,6 +137,11 @@ public class StructureMergeViewerFilter extends ViewerFilter { return true; } + Boolean cachedResult = selectedObjects.get(element); + if (cachedResult != null) { + return cachedResult.booleanValue(); + } + final boolean result; if (element instanceof GroupItemProviderAdapter) { Collection<?> children = ((GroupItemProviderAdapter)element).getChildren(element); @@ -150,6 +162,7 @@ public class StructureMergeViewerFilter extends ViewerFilter { result = true; } + selectedObjects.put(element, Boolean.valueOf(result)); return result; } @@ -167,6 +180,7 @@ public class StructureMergeViewerFilter extends ViewerFilter { changed = unselectedDifferenceFilters.remove(filter) || changed; if (changed) { + clearCache(); aggregatedPredicate = computeAggregatedPredicate(); eventBus.post(new DifferenceFilterChange(aggregatedPredicate, selectedDifferenceFilters, unselectedDifferenceFilters)); @@ -181,10 +195,18 @@ public class StructureMergeViewerFilter extends ViewerFilter { * unselected state predicates of unselected filters. */ private Predicate<? super EObject> computeAggregatedPredicate() { + clearCache(); return not(or(predicates)); } /** + * Clears the cached results. + */ + private void clearCache() { + selectedObjects.clear(); + } + + /** * Remove the predicate of the given {@link IDifferenceFilter}. * * @param filter @@ -198,6 +220,7 @@ public class StructureMergeViewerFilter extends ViewerFilter { changed |= selectedDifferenceFilters.remove(filter); if (changed) { + clearCache(); aggregatedPredicate = computeAggregatedPredicate(); eventBus.post(new DifferenceFilterChange(aggregatedPredicate, selectedDifferenceFilters, unselectedDifferenceFilters)); |