diff options
Diffstat (limited to 'plugins')
2 files changed, 109 insertions, 31 deletions
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java index e4bd93bf0..a534fc66b 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java @@ -15,15 +15,14 @@ package org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer; import static com.google.common.base.Predicates.instanceOf; import static com.google.common.collect.Iterables.any; -import static com.google.common.collect.Iterables.size; import static org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.EMFCompareStructureMergeViewerContentProvider.CallbackType.IN_UI_ASYNC; import static org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.EMFCompareStructureMergeViewerContentProvider.CallbackType.IN_UI_SYNC; import static org.eclipse.emf.compare.utils.EMFComparePredicates.hasState; import com.google.common.base.Function; import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.base.Throwables; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; import com.google.common.collect.Lists; @@ -36,7 +35,6 @@ import java.util.Collections; import java.util.EnumSet; import java.util.EventObject; import java.util.Iterator; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -104,6 +102,7 @@ import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions.Merg import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.provider.TreeCompareInputAdapterFactory; import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.provider.TreeNodeCompareInput; import org.eclipse.emf.compare.ide.ui.internal.util.CompareHandlerService; +import org.eclipse.emf.compare.ide.ui.internal.util.FilteredIterator; import org.eclipse.emf.compare.ide.ui.internal.util.JFaceUtil; import org.eclipse.emf.compare.ide.ui.internal.util.PlatformElementUtil; import org.eclipse.emf.compare.internal.merge.MergeMode; @@ -122,6 +121,7 @@ import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.Struc import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.provider.TreeItemProviderAdapterFactorySpec; import org.eclipse.emf.compare.rcp.ui.internal.util.SWTUtil; import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.filters.IDifferenceFilterChange; +import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroup; import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider; import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProviderChange; import org.eclipse.emf.compare.scope.IComparisonScope; @@ -177,7 +177,7 @@ import org.eclipse.ui.themes.ITheme; import org.eclipse.ui.themes.IThemeManager; /** - * Implementation of {@link AbstractViewerWrapper}. + * Implementation of {@link AbstractStructuredViewerWrapper}. * * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a> */ @@ -679,37 +679,57 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap private void refreshTitle() { // TODO Make sure this is called as little as possible // Or make this asynchronous? - if (!getControl().isDisposed()) { - Composite parent = getControl().getParent(); - Comparison comparison = getCompareConfiguration().getComparison(); - if (parent instanceof CompareViewerSwitchingPane && comparison != null) { - final Predicate<? super TreeNode> unfilteredNode = new Predicate<TreeNode>() { - public boolean apply(TreeNode input) { - return input != null && !JFaceUtil.isFiltered(getViewer(), input, null); + if (getControl().isDisposed() || !(getControl().getParent() instanceof CompareViewerSwitchingPane)) { + return; + } + + if (getCompareConfiguration().getComparison() == null) { + return; + } + + Set<Diff> allDiffs = getAllDiffs(); + Set<Diff> visibleDiffs = getVisibleDiffs(); + + int visibleDiffCount = visibleDiffs.size(); + int filteredDiffCount = Sets.difference(allDiffs, visibleDiffs).size(); + int diffsToMergeCount = Iterables.size(Iterables.filter(visibleDiffs, hasState( + DifferenceState.UNRESOLVED))); + String titleArgument = EMFCompareIDEUIMessages.getString("EMFCompareStructureMergeViewer.titleDesc", //$NON-NLS-1$ + diffsToMergeCount, visibleDiffCount, filteredDiffCount); + + ((CompareViewerSwitchingPane)getControl().getParent()).setTitleArgument(titleArgument); + } + + private Set<Diff> getAllDiffs() { + Comparison comparison = getCompareConfiguration().getComparison(); + return Sets.newHashSet(comparison.getDifferences()); + } + + private Set<Diff> getVisibleDiffs() { + Set<Diff> visibleDiffs = Sets.newHashSet(); + + EMFCompareConfiguration configuration = getCompareConfiguration(); + Comparison comparison = configuration.getComparison(); + IDifferenceGroupProvider groupProvider = configuration.getStructureMergeViewerGrouper().getProvider(); + Predicate<? super EObject> filterPredicate = configuration.getStructureMergeViewerFilter() + .getAggregatedPredicate(); + for (IDifferenceGroup group : groupProvider.getGroups(comparison)) { + for (TreeNode node : group.getChildren()) { + if (filterPredicate.apply(node)) { + if (node.getData() instanceof Diff) { + visibleDiffs.add((Diff)node.getData()); } - }; - final IDifferenceGroupProvider groupProvider = getCompareConfiguration() - .getStructureMergeViewerGrouper().getProvider(); - final Set<Diff> differences = new LinkedHashSet<Diff>(); - final List<Iterable<TreeNode>> allTreeNodes = new ArrayList<Iterable<TreeNode>>(); - for (Diff diff : comparison.getDifferences()) { - differences.add(diff); - allTreeNodes.add(groupProvider.getTreeNodes(diff)); + + Iterator<TreeNode> nodes = Iterators.filter(new FilteredIterator<EObject>(node + .eAllContents(), filterPredicate), TreeNode.class); + Iterator<Diff> diffs = Iterators.filter(Iterators.transform(nodes, TREE_NODE_AS_DIFF), + Predicates.notNull()); + Iterators.addAll(visibleDiffs, diffs); } - final Iterable<TreeNode> treeNodes = Iterables.concat(allTreeNodes); - final Set<TreeNode> visibleNodes = ImmutableSet.copyOf(Iterables.filter(treeNodes, - unfilteredNode)); - final Set<Diff> visibleDiffs = ImmutableSet.copyOf(Iterables.filter(Iterables.transform( - visibleNodes, TREE_NODE_AS_DIFF), Diff.class)); - - final int filteredDiff = Sets.difference(differences, visibleDiffs).size(); - final int differencesToMerge = size(Iterables.filter(visibleDiffs, - hasState(DifferenceState.UNRESOLVED))); - ((CompareViewerSwitchingPane)parent).setTitleArgument(EMFCompareIDEUIMessages.getString( - "EMFCompareStructureMergeViewer.titleDesc", differencesToMerge, visibleNodes.size(), //$NON-NLS-1$ - filteredDiff)); } } + + return visibleDiffs; } static EObject getDataOfTreeNodeOfAdapter(Object object) { diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/util/FilteredIterator.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/util/FilteredIterator.java new file mode 100644 index 000000000..71f206ca2 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/util/FilteredIterator.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (c) 2016 Obeo. + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andreas Mayer - initial implementation + *******************************************************************************/ +package org.eclipse.emf.compare.ide.ui.internal.util; + +import com.google.common.base.Predicate; +import com.google.common.collect.AbstractIterator; + +import org.eclipse.emf.common.util.TreeIterator; + +/** + * A wrapper for a {@link TreeIterator} that only returns nodes that satisfy a predicate and skips all others + * and their descendants. + * + * @param <E> + * the type of elements returned by this iterator + */ +public class FilteredIterator<E> extends AbstractIterator<E> { + private TreeIterator<E> delegate; + + private Predicate<? super E> predicate; + + /** + * Constructs a new iterator. + * + * @param delegate + * a tree iterator + * @param predicate + * the predicate to satisfy; all nodes (including their descendants) for which the predicate + * yields {@code false} are skipped + */ + public FilteredIterator(TreeIterator<E> delegate, Predicate<? super E> predicate) { + this.delegate = delegate; + this.predicate = predicate; + } + + @Override + protected E computeNext() { + while (delegate.hasNext()) { + E next = delegate.next(); + if (predicate.apply(next)) { + return next; + } + + delegate.prune(); + } + + endOfData(); + return null; + } +} |