diff options
Diffstat (limited to 'bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/FastSyncInfoFilter.java')
-rw-r--r-- | bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/FastSyncInfoFilter.java | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/FastSyncInfoFilter.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/FastSyncInfoFilter.java new file mode 100644 index 000000000..c987c54ec --- /dev/null +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/FastSyncInfoFilter.java @@ -0,0 +1,211 @@ +/******************************************************************************* + * Copyright (c) 2000, 2017 IBM Corporation 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.team.core.synchronize; + +import org.eclipse.core.runtime.IProgressMonitor; + +/** + * A specialized <code>SyncInfoFilter</code> that does not require a progress monitor. + * This enables these filters to be used when determining menu enablement or other + * operations that must be short running. + * + * @see SyncInfo + * @see SyncInfoSet + * @see SyncInfoFilter + * @since 3.0 + */ +public class FastSyncInfoFilter extends SyncInfoFilter { + + /** + * Selects <code>SyncInfo</code> that match the given change type and direction. + * + * @param direction the change direction (<code>SyncInfo.OUTGOING</code>, + * <code>SyncInfo.INCOMING</code> and <code>SyncInfo.CONFLICTING</code>) that this filter matches + * @param change the change type (<code>SyncInfo.ADDITION</code>, + * <code>SyncInfo.DELETION</code> and <code>SyncInfo.CHANGE</code>) that this filter matches + * @return a <code>FastSyncInfoFilter</code> that selects <code>SyncInfo</code> that match the given + * change type and direction. + */ + public static FastSyncInfoFilter getDirectionAndChangeFilter(int direction, int change) { + return new AndSyncInfoFilter(new FastSyncInfoFilter[]{new SyncInfoDirectionFilter(direction), new SyncInfoChangeTypeFilter(change)}); + } + + /** + * An abstract class which contains a set of <code>FastSyncInfoFilter</code> instances. + * Subclasses must provide the <code>select(SyncInfo)</code> method for determining + * matches. + */ + public static abstract class CompoundSyncInfoFilter extends FastSyncInfoFilter { + /** + * Instance variable which contains all the child filters for this compound filter. + */ + protected FastSyncInfoFilter[] filters; + /** + * Create a compound filter that contains the provided filters. + * @param filters the child filters + */ + protected CompoundSyncInfoFilter(FastSyncInfoFilter[] filters) { + this.filters = filters; + } + } + + /** + * Selects <code>SyncInfo</code> which match all child filters. + */ + public static class AndSyncInfoFilter extends CompoundSyncInfoFilter { + /** + * Create an AND filter from the given filters + * @param filters the filters to be ANDed + */ + public AndSyncInfoFilter(FastSyncInfoFilter[] filters) { + super(filters); + } + @Override + public boolean select(SyncInfo info) { + for (int i = 0; i < filters.length; i++) { + FastSyncInfoFilter filter = filters[i]; + if (!filter.select(info)) { + return false; + } + } + return true; + } + } + + /** + * Selects <code>SyncInfo</code> instances that are auto-mergable. + */ + public static class AutomergableFilter extends FastSyncInfoFilter { + @Override + public boolean select(SyncInfo info) { + return (info.getKind() & SyncInfo.AUTOMERGE_CONFLICT) != 0; + } + } + + /** + * Selects <code>SyncInfo</code> instances that are pseudo-conflicts. + */ + public static class PseudoConflictFilter extends FastSyncInfoFilter { + @Override + public boolean select(SyncInfo info) { + return info.getKind() != 0 && (info.getKind() & SyncInfo.PSEUDO_CONFLICT) == 0; + } + } + + /** + * Selects <code>SyncInfo</code> that match any of the child filters. + */ + public static class OrSyncInfoFilter extends CompoundSyncInfoFilter { + /** + * Create an OR filter from the given filters + * @param filters the filters to be ORed + */ + public OrSyncInfoFilter(FastSyncInfoFilter[] filters) { + super(filters); + } + @Override + public boolean select(SyncInfo info) { + for (int i = 0; i < filters.length; i++) { + FastSyncInfoFilter filter = filters[i]; + if (filter.select(info)) { + return true; + } + } + return false; + } + } + + /** + * Selects <code>SyncInfo</code> whose change type match those of the filter. + */ + public static class SyncInfoChangeTypeFilter extends FastSyncInfoFilter { + private int[] changeFilters = new int[]{SyncInfo.ADDITION, SyncInfo.DELETION, SyncInfo.CHANGE}; + /** + * Create a filter that will match <code>SyncInfo</code> whose change type + * match those passed as arguments to this constructor. + * @param changeFilters the array of change types (<code>SyncInfo.ADDITION</code>, + * <code>SyncInfo.DELETION</code> and <code>SyncInfo.CHANGE</code>) that this filter match + */ + public SyncInfoChangeTypeFilter(int[] changeFilters) { + this.changeFilters = changeFilters; + } + /** + * Create a filter that will match <code>SyncInfo</code> whose change type + * match that passed as an argument to this constructor. + * @param change the change type (<code>SyncInfo.ADDITION</code>, + * <code>SyncInfo.DELETION</code> and <code>SyncInfo.CHANGE</code>) that this filter matches + */ + public SyncInfoChangeTypeFilter(int change) { + this(new int[]{change}); + } + @Override + public boolean select(SyncInfo info) { + int syncKind = info.getKind(); + for (int i = 0; i < changeFilters.length; i++) { + int filter = changeFilters[i]; + if ((syncKind & SyncInfo.CHANGE_MASK) == filter) + return true; + } + return false; + } + } + + /** + * Selects <code>SyncInfo</code> whose change direction match those of the filter. + */ + public static class SyncInfoDirectionFilter extends FastSyncInfoFilter { + int[] directionFilters = new int[] {SyncInfo.OUTGOING, SyncInfo.INCOMING, SyncInfo.CONFLICTING}; + /** + * Create a filter that will match <code>SyncInfo</code> whose change direction + * match those passed as arguments to this constructor. + * @param directionFilters the array of change directions (<code>SyncInfo.OUTGOING</code>, + * <code>SyncInfo.INCOMING</code> and <code>SyncInfo.CONFLICTING</code>) that this filter match + */ + public SyncInfoDirectionFilter(int[] directionFilters) { + this.directionFilters = directionFilters; + } + /** + * Create a filter that will match <code>SyncInfo</code> whose change direction + * match that passed as arguments to this constructor. + * @param direction the change direction (<code>SyncInfo.OUTGOING</code>, + * <code>SyncInfo.INCOMING</code> and <code>SyncInfo.CONFLICTING</code>) that this filter matches + */ + public SyncInfoDirectionFilter(int direction) { + this(new int[] { direction }); + } + @Override + public boolean select(SyncInfo info) { + int syncKind = info.getKind(); + for (int i = 0; i < directionFilters.length; i++) { + int filter = directionFilters[i]; + if ((syncKind & SyncInfo.DIRECTION_MASK) == filter) + return true; + } + return false; + } + } + + /** + * Return whether the provided <code>SyncInfo</code> matches the filter. The default + * behavior it to include resources whose syncKind is non-zero. + * + * @param info the <code>SyncInfo</code> being tested + * @return <code>true</code> if the <code>SyncInfo</code> matches the filter + */ + public boolean select(SyncInfo info) { + return info.getKind() != 0; + } + + @Override + public final boolean select(SyncInfo info, IProgressMonitor monitor) { + return select(info); + } +} |