Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Langer2017-09-15 09:10:19 +0000
committerLaurent Goubet2018-04-30 11:33:10 +0000
commit51dfa20fbd856362447ad084f81dc81b01fdb718 (patch)
treecd31697d82f41ad87839af0955cc9e7f9cc3510a /plugins/org.eclipse.emf.compare.rcp.ui/src/org
parenta95d0854c5c5ee74956f4e20dbdcb1b00f1881fc (diff)
downloadorg.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.java25
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));

Back to the top