Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java211
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);
+ }
+}

Back to the top