diff options
author | Michael Valenta | 2005-01-19 21:50:04 +0000 |
---|---|---|
committer | Michael Valenta | 2005-01-19 21:50:04 +0000 |
commit | 5348e1083bb2edd885e25c32465d8bf7aaad8f56 (patch) | |
tree | ee95f297f782b222e18ac38c5f2a9a62fb561a01 | |
parent | 422ea0a7a6575444d16a1f2dee962e7223ae1663 (diff) | |
download | eclipse.platform.team-5348e1083bb2edd885e25c32465d8bf7aaad8f56.tar.gz eclipse.platform.team-5348e1083bb2edd885e25c32465d8bf7aaad8f56.tar.xz eclipse.platform.team-5348e1083bb2edd885e25c32465d8bf7aaad8f56.zip |
Added resource filtering to selection dialog
4 files changed, 178 insertions, 35 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/TagLocalAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/TagLocalAction.java index 969f288dd..ec22c99a4 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/TagLocalAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/TagLocalAction.java @@ -15,6 +15,7 @@ import java.util.*; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceVisitor; import org.eclipse.core.resources.mapping.ResourceMapping; +import org.eclipse.core.resources.mapping.ResourceTraversal; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Status; import org.eclipse.swt.widgets.Shell; @@ -28,18 +29,28 @@ import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants; import org.eclipse.team.internal.ccvs.ui.operations.ITagOperation; import org.eclipse.team.internal.ccvs.ui.operations.TagOperation; +import org.eclipse.team.internal.ui.dialogs.*; import org.eclipse.team.internal.ui.dialogs.MappingSelectionDialog; import org.eclipse.team.internal.ui.dialogs.ResourceMappingResourceDisplayArea; public class TagLocalAction extends TagAction { + private final class UncommittedFilter implements IResourceMappingResourceFilter { + public boolean select(IResource resource, + ResourceMapping mapping, ResourceTraversal traversal) + throws CoreException { + SyncInfo info = CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber().getSyncInfo(resource); + return (info != null && getResourceFilter().select(info)); + } + } + private final class UncommittedChangesDialog extends MappingSelectionDialog { - private final Subscriber subscriber = CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber(); + private final Subscriber subscriber = CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber(); private final FastSyncInfoFilter resourceFilter = getResourceFilter(); - + private UncommittedChangesDialog(Shell parentShell, String dialogTitle, ResourceMapping[] mappings) { - super(parentShell, dialogTitle, mappings); + super(parentShell, dialogTitle, mappings, new UncommittedFilter()); } protected String getSingleMappingMessage(ResourceMapping mapping) { diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/IResourceMappingResourceFilter.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/IResourceMappingResourceFilter.java new file mode 100644 index 000000000..b7dedece2 --- /dev/null +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/IResourceMappingResourceFilter.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.team.internal.ui.dialogs; + +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.mapping.ResourceMapping; +import org.eclipse.core.resources.mapping.ResourceTraversal; +import org.eclipse.core.runtime.CoreException; + +/** + * A filter for selecting resources of a resource mapping for + * inclusion in a view. + */ +public interface IResourceMappingResourceFilter { + boolean select(IResource resource, ResourceMapping mapping, ResourceTraversal traversal) throws CoreException; +} diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/MappingSelectionDialog.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/MappingSelectionDialog.java index 158030469..b571adfb8 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/MappingSelectionDialog.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/MappingSelectionDialog.java @@ -28,10 +28,12 @@ public abstract class MappingSelectionDialog extends DetailsDialog implements IP private ResourceMapping[] checkedMappings; private ResourceMappingSelectionArea mappingArea; private ResourceMappingResourceDisplayArea resourceArea; + private final IResourceMappingResourceFilter filter; - public MappingSelectionDialog(Shell parentShell, String dialogTitle, ResourceMapping[] mappings) { + public MappingSelectionDialog(Shell parentShell, String dialogTitle, ResourceMapping[] mappings, IResourceMappingResourceFilter filter) { super(parentShell, dialogTitle); this.mappings = mappings; + this.filter = filter; } /* (non-Javadoc) @@ -66,7 +68,7 @@ public abstract class MappingSelectionDialog extends DetailsDialog implements IP */ protected Composite createDropDownDialogArea(Composite parent) { if (resourceArea == null) { - resourceArea = new ResourceMappingResourceDisplayArea(getSelectedMapping()); + resourceArea = new ResourceMappingResourceDisplayArea(getSelectedMapping(), filter); } Composite c = createComposite(parent); resourceArea.createArea(c); diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/ResourceMappingResourceDisplayArea.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/ResourceMappingResourceDisplayArea.java index 62b0ea105..fdcf9f4f8 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/ResourceMappingResourceDisplayArea.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/ResourceMappingResourceDisplayArea.java @@ -10,27 +10,25 @@ *******************************************************************************/ package org.eclipse.team.internal.ui.dialogs; -import java.util.ArrayList; -import java.util.List; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import org.eclipse.core.resources.*; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.mapping.*; -import org.eclipse.core.resources.mapping.ResourceMapping; -import org.eclipse.core.resources.mapping.ResourceTraversal; import org.eclipse.core.runtime.*; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; +import org.eclipse.team.internal.core.Policy; import org.eclipse.team.internal.ui.TeamUIPlugin; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.model.*; -import org.eclipse.ui.model.IWorkbenchAdapter; -import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.views.navigator.ResourceSorter; /** @@ -42,13 +40,15 @@ public class ResourceMappingResourceDisplayArea extends DialogArea { private ResourceMappingContext context; private TreeViewer viewer; private Label label; + private IResourceMappingResourceFilter filter; + private Map cachedFiltering = new HashMap(); // String(mapping)-> Map: Resource -> List(IResource) private static IWorkbenchAdapter getWorkbenchAdapter(IAdaptable o) { return (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class); } /** - * Return the label that shgould be used for the given mapping + * Return the label that should be used for the given mapping * as determined using the IWorkbnchAdaptable for the mapping * or it's model object. * @param mapping the mappings @@ -89,22 +89,16 @@ public class ResourceMappingResourceDisplayArea extends DialogArea { ResourceTraversal traversal = traversals[i]; IResource[] resources = traversal.getResources(); for (int j = 0; j < resources.length; j++) { - IResource resource = resources[j]; - result.add(new ResourceTraversalElement(this, traversal, resource, context)); + IResource resource = resources[j]; + if (isIncludedInFilter(resource, traversal)) + result.add(new ResourceTraversalElement(this, traversal, resource, context)); } } return result.toArray(new Object[result.size()]); } private ResourceTraversal[] getTraversals() { - try { - IProgressMonitor monitor = new NullProgressMonitor(); // TODO - ResourceTraversal[] traversals = mapping.getTraversals(context, monitor); - return traversals; - } catch (CoreException e) { - TeamUIPlugin.log(IStatus.ERROR, "An error occurred fetching the traversals of " + getLabel(mapping), e); //$NON-NLS-1$ - return new ResourceTraversal[0]; - } + return ResourceMappingResourceDisplayArea.getTraversals(mapping, context); } /* (non-Javadoc) @@ -185,7 +179,8 @@ public class ResourceMappingResourceDisplayArea extends DialogArea { List result = new ArrayList(); for (int i = 0; i < members.length; i++) { IResource child = members[i]; - if (includeFolders || child.getType() == IResource.FILE) + if ((includeFolders || child.getType() == IResource.FILE) + && isIncludedInFilter(child, traversal)) result.add(new ResourceTraversalElement(this, traversal, child, context)); } return result.toArray(new Object[result.size()]); @@ -199,7 +194,7 @@ public class ResourceMappingResourceDisplayArea extends DialogArea { private IResource[] members(IContainer container) throws CoreException { if (context == null) return container.members(); - return context.fetchMembers(container, null); // TODO progress + return ResourceMappingResourceDisplayArea.members(container, context); } /* (non-Javadoc) @@ -222,14 +217,7 @@ public class ResourceMappingResourceDisplayArea extends DialogArea { } private boolean isTraversalRoot(IResource resource) { - IResource[] resources = traversal.getResources(); - for (int i = 0; i < resources.length; i++) { - IResource root = resources[i]; - if (root.equals(resource)) { - return true; - } - } - return false; + return ResourceMappingResourceDisplayArea.isTraversalRoot(traversal, resource); } /* (non-Javadoc) @@ -252,9 +240,11 @@ public class ResourceMappingResourceDisplayArea extends DialogArea { /** * Create a dialog area tht will display the resources contained in the * given mapping + * @param filter */ - public ResourceMappingResourceDisplayArea(ResourceMapping mapping) { + public ResourceMappingResourceDisplayArea(ResourceMapping mapping, IResourceMappingResourceFilter filter) { this.mapping = mapping; + this.filter = filter; } /* (non-Javadoc) @@ -292,4 +282,120 @@ public class ResourceMappingResourceDisplayArea extends DialogArea { this.mapping = mapping; setInput(labelText); } + + private boolean isIncludedInFilter(IResource resource, ResourceTraversal traversal) { + if (filter == null) + return true; + Map mappingResources = (Map)cachedFiltering.get(mapping); + if (mappingResources == null) { + mappingResources = buildFilteredResourceMap(mapping, context); + cachedFiltering.put(mapping, mappingResources); + } + return mappingResources.containsKey(resource); + } + + private Map buildFilteredResourceMap(final ResourceMapping mapping, final ResourceMappingContext context) { + final Map result = new HashMap(); + try { + PlatformUI.getWorkbench().getProgressService().busyCursorWhile(new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + try { + monitor.beginTask(null, IProgressMonitor.UNKNOWN); + ResourceTraversal[] traversals = mapping.getTraversals(context, Policy.subMonitorFor(monitor, IProgressMonitor.UNKNOWN)); + for (int i = 0; i < traversals.length; i++) { + ResourceTraversal traversal = traversals[i]; + buildFilteredResourceMap(mapping, traversal, Policy.subMonitorFor(monitor, IProgressMonitor.UNKNOWN), result); + } + } catch (CoreException e) { + throw new InvocationTargetException(e); + } finally { + monitor.done(); + } + } + + private void buildFilteredResourceMap(final ResourceMapping mapping, final ResourceTraversal traversal, IProgressMonitor monitor, final Map result) throws CoreException { + traversal.visit(new IResourceVisitor() { + public boolean visit(IResource resource) throws CoreException { + if (filter.select(resource, mapping, traversal)) { + // Add the resource to the result + result.put(resource, new ArrayList()); + // Make sure that there are parent folders for the resource up to the traversal root + IResource child = resource; + while (!isTraversalRoot(traversal, child)) { + IContainer parent = child.getParent(); + List children = (List)result.get(parent); + if (children == null) { + children = new ArrayList(); + result.put(parent, children); + } + children.add(child); + child = parent; + } + } + return true; + } + }); + + } + }); + } catch (InvocationTargetException e) { + TeamUIPlugin.log(IStatus.ERROR, "An error occurred while filtering " + getLabel(mapping), e); //$NON-NLS-1$ + } catch (InterruptedException e) { + // Ignore + } + return result; + } + + /* private */ static ResourceTraversal[] getTraversals(final ResourceMapping mapping, final ResourceMappingContext context) { + final List traversals = new ArrayList(); + try { + PlatformUI.getWorkbench().getProgressService().busyCursorWhile(new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + try { + traversals.add(mapping.getTraversals(context, monitor)); + } catch (CoreException e) { + throw new InvocationTargetException(e); + } + } + }); + return (ResourceTraversal[])traversals.get(0); + } catch (InvocationTargetException e) { + TeamUIPlugin.log(IStatus.ERROR, "An error occurred while traversing " + getLabel(mapping), e); //$NON-NLS-1$ + } catch (InterruptedException e) { + // Ignore + } + return new ResourceTraversal[0]; + } + + /* private */ static IResource[] members(final IContainer container, final ResourceMappingContext context) { + final List members = new ArrayList(); + try { + PlatformUI.getWorkbench().getProgressService().busyCursorWhile(new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + try { + members.add(context.fetchMembers(container, monitor)); + } catch (CoreException e) { + throw new InvocationTargetException(e); + } + } + }); + return (IResource[])members.get(0); + } catch (InvocationTargetException e) { + TeamUIPlugin.log(IStatus.ERROR, "An error occurred while fetching the members of" + container.getFullPath(), e); //$NON-NLS-1$ + } catch (InterruptedException e) { + // Ignore + } + return new IResource[0]; + } + + /* private */ static boolean isTraversalRoot(ResourceTraversal traversal, IResource resource) { + IResource[] resources = traversal.getResources(); + for (int i = 0; i < resources.length; i++) { + IResource root = resources[i]; + if (root.equals(resource)) { + return true; + } + } + return false; + } } |