diff options
31 files changed, 1443 insertions, 70 deletions
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/diff/DiffFilter.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/diff/DiffFilter.java index e5d0e30c9..fd50ad5e7 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/diff/DiffFilter.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/diff/DiffFilter.java @@ -27,9 +27,9 @@ public abstract class DiffFilter { /** * Return <code>true</code> if the provided <code>IDiffNode</code> matches the filter. * - * @param node the <code>IDiffNode</code> to be tested + * @param diff the <code>IDiffNode</code> to be tested * @param monitor a progress monitor * @return <code>true</code> if the <code>IDiffNode</code> matches the filter */ - public abstract boolean select(IDiff node, IProgressMonitor monitor); + public abstract boolean select(IDiff diff, IProgressMonitor monitor); } diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/diff/FastDiffFilter.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/diff/FastDiffFilter.java index c4be8523b..1d8e58676 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/diff/FastDiffFilter.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/diff/FastDiffFilter.java @@ -43,15 +43,15 @@ public abstract class FastDiffFilter extends DiffFilter { /* (non-Javadoc) * @see org.eclipse.team.core.diff.DiffNodeFilter#select(org.eclipse.team.core.diff.IDiffNode, org.eclipse.core.runtime.IProgressMonitor) */ - public final boolean select(IDiff node, IProgressMonitor monitor) { - return select(node); + public final boolean select(IDiff diff, IProgressMonitor monitor) { + return select(diff); } /** * Return <code>true</code> if the provided <code>IDiffNode</code> matches the filter. * - * @param node the <code>IDiffNode</code> to be tested + * @param diff the <code>IDiffNode</code> to be tested * @return <code>true</code> if the <code>IDiffNode</code> matches the filter */ - public abstract boolean select(IDiff node); + public abstract boolean select(IDiff diff); } diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/ISynchronizationContext.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/ISynchronizationContext.java index ef340cb90..f9bca8069 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/ISynchronizationContext.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/mapping/ISynchronizationContext.java @@ -84,9 +84,9 @@ public interface ISynchronizationContext { /** * Return a tree that contains {@link IDiff} entries for resources that - * are out-of-sync. The tree will contain diffs for any out-of-sync + * are out-of-sync. The tree will contain entries for any out-of-sync * resources that are within the scope of this context. The tree may include - * diffs for additional resources, which should be ignored by the client. + * entries for additional resources, which should be ignored by the client. * Clients can test for inclusion using the method * {@link ISynchronizationScope#contains(IResource)}. * <p> @@ -94,7 +94,7 @@ public interface ISynchronizationContext { * {@link IResourceDiff} or {@link IThreeWayDiff} instances. Any * {@link IThreeWayDiff} contained in the returned tree will contain * {@link IResourceDiff} instances as the local and remote changes. This - * interface also has several helper methods for handling diffs contained in + * interface also has several helper methods for handling entries contained in * the returned diff tree. * * @return a tree that contains an entry for any diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/ChangeSet.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/ChangeSet.java index 3c479f897..944777106 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/ChangeSet.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/ChangeSet.java @@ -104,4 +104,14 @@ public abstract class ChangeSet { protected void setName(String name) { this.name = name; } + + /** + * Return whether the set contains descendants of the given resource + * to the given depth. + * @param resource the resource + * @param depth the depth + * @return whether the set contains descendants of the given resource + * to the given depth + */ + public abstract boolean containsChildren(IResource resource, int depth); } diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/CheckedInChangeSet.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/CheckedInChangeSet.java index 59006959c..df66d0b4a 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/CheckedInChangeSet.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/CheckedInChangeSet.java @@ -145,4 +145,8 @@ public abstract class CheckedInChangeSet extends ChangeSet { set.removeAll(resources); } } + + public boolean containsChildren(IResource resource, int depth) { + return set.getSyncInfos(resource, depth).length > 0; + } } diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/DiffChangeSet.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/DiffChangeSet.java index 1264b5f56..1a56dc065 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/DiffChangeSet.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/DiffChangeSet.java @@ -140,5 +140,9 @@ public abstract class DiffChangeSet extends ChangeSet { public boolean contains(IPath path) { return getDiffTree().getDiff(path) != null; } + + public boolean containsChildren(IResource resource, int depth) { + return getDiffTree().getDiffs(resource, depth).length > 0; + } } diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberChangeSetCollector.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberChangeSetCollector.java index 6e3582c5f..cb69064bf 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberChangeSetCollector.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberChangeSetCollector.java @@ -325,7 +325,7 @@ public class SubscriberChangeSetCollector extends DiffTreeChangeSetCollector imp * @return the created set */ public ActiveChangeSet createSet(String title, IDiff[] diffs) { - ActiveChangeSet commitSet = new ActiveChangeSet(this, title); + ActiveChangeSet commitSet = doCreateSet(title); if (diffs != null && diffs.length > 0) { commitSet.add(diffs); } @@ -333,6 +333,15 @@ public class SubscriberChangeSetCollector extends DiffTreeChangeSetCollector imp } /** + * Create a change set with the given name. + * @param name the name of the change set + * @return the created change set + */ + protected ActiveChangeSet doCreateSet(String name) { + return new ActiveChangeSet(this, name); + } + + /** * Create a change set containing the given files if * they have been modified locally. * @param title the title of the commit set @@ -486,7 +495,7 @@ public class SubscriberChangeSetCollector extends DiffTreeChangeSetCollector imp * @return the created change set */ protected ActiveChangeSet createSet(String title, Preferences childPrefs) { - ActiveChangeSet changeSet = new ActiveChangeSet(this, title); + ActiveChangeSet changeSet = doCreateSet(title); changeSet.init(childPrefs); return changeSet; } diff --git a/bundles/org.eclipse.team.cvs.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.team.cvs.core/META-INF/MANIFEST.MF index 80b03f542..d31d8dadf 100644 --- a/bundles/org.eclipse.team.cvs.core/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.team.cvs.core/META-INF/MANIFEST.MF @@ -12,6 +12,7 @@ Export-Package: org.eclipse.team.internal.ccvs.core;x-friends:="org.eclipse.team org.eclipse.team.internal.ccvs.core.connection;x-friends:="org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui", org.eclipse.team.internal.ccvs.core.filehistory;x-friends:="org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui", org.eclipse.team.internal.ccvs.core.filesystem;x-friends:="org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui", + org.eclipse.team.internal.ccvs.core.mapping, org.eclipse.team.internal.ccvs.core.resources;x-friends:="org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui", org.eclipse.team.internal.ccvs.core.syncinfo;x-friends:="org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui", org.eclipse.team.internal.ccvs.core.util;x-friends:="org.eclipse.team.cvs.ssh,org.eclipse.team.cvs.ssh2,org.eclipse.team.cvs.ui" diff --git a/bundles/org.eclipse.team.cvs.core/plugin.xml b/bundles/org.eclipse.team.cvs.core/plugin.xml index 2afc8d4ab..48425197a 100644 --- a/bundles/org.eclipse.team.cvs.core/plugin.xml +++ b/bundles/org.eclipse.team.cvs.core/plugin.xml @@ -213,5 +213,22 @@ <run class="org.eclipse.team.internal.ccvs.core.filesystem.CVSFileSystem"/> </filesystem> </extension> + <extension + id="changeSetModel" + name="Change Sets" + point="org.eclipse.core.resources.modelProviders"> + <modelProvider + class="org.eclipse.team.internal.ccvs.core.mapping.ChangeSetModelProvider" + name="Change Sets"/> + <extends-model id="org.eclipse.core.resources.modelProvider"/> + </extension> + <extension + point="org.eclipse.core.runtime.adapters"> + <factory + adaptableType="org.eclipse.team.internal.ccvs.core.mapping.CVSActiveChangeSet" + class="org.eclipse.team.internal.ccvs.core.mapping.ChangeSetAdapterFactory"> + <adapter type="org.eclipse.core.resources.mapping.ResourceMapping"/> + </factory> + </extension> </plugin> diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/CVSActiveChangeSet.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/CVSActiveChangeSet.java new file mode 100644 index 000000000..1f13e6bed --- /dev/null +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/CVSActiveChangeSet.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2006 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.internal.ccvs.core.mapping; + +import org.eclipse.team.internal.core.subscribers.ActiveChangeSet; +import org.eclipse.team.internal.core.subscribers.SubscriberChangeSetCollector; + +public class CVSActiveChangeSet extends ActiveChangeSet { + + public CVSActiveChangeSet(SubscriberChangeSetCollector manager, String title) { + super(manager, title); + } + +} diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/CVSActiveChangeSetCollector.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/CVSActiveChangeSetCollector.java new file mode 100644 index 000000000..9c51a8105 --- /dev/null +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/CVSActiveChangeSetCollector.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2006 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.internal.ccvs.core.mapping; + +import org.eclipse.team.core.subscribers.Subscriber; +import org.eclipse.team.internal.core.subscribers.ActiveChangeSet; +import org.eclipse.team.internal.core.subscribers.SubscriberChangeSetCollector; + +public class CVSActiveChangeSetCollector extends SubscriberChangeSetCollector { + + public CVSActiveChangeSetCollector(Subscriber subscriber) { + super(subscriber); + } + + protected ActiveChangeSet doCreateSet(String name) { + return new CVSActiveChangeSet(this, name); + } + + +} diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/ChangeSetAdapterFactory.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/ChangeSetAdapterFactory.java new file mode 100644 index 000000000..b1fdd18f2 --- /dev/null +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/ChangeSetAdapterFactory.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2006 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.internal.ccvs.core.mapping; + +import org.eclipse.core.resources.mapping.ResourceMapping; +import org.eclipse.core.runtime.IAdapterFactory; + +public class ChangeSetAdapterFactory implements IAdapterFactory { + + public Object getAdapter(Object adaptableObject, Class adapterType) { + if (adaptableObject instanceof CVSActiveChangeSet && adapterType == ResourceMapping.class) { + CVSActiveChangeSet cs = (CVSActiveChangeSet) adaptableObject; + return new ChangeSetResourceMapping(cs); + } + return null; + } + + public Class[] getAdapterList() { + return new Class[] { ResourceMapping.class }; + } + +} diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/ChangeSetModelProvider.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/ChangeSetModelProvider.java new file mode 100644 index 000000000..ae32d20af --- /dev/null +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/ChangeSetModelProvider.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2006 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.internal.ccvs.core.mapping; + +import org.eclipse.core.resources.mapping.ModelProvider; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.team.internal.core.TeamPlugin; + +public class ChangeSetModelProvider extends ModelProvider { + + public static final String ID = "org.eclipse.team.cvs.core.changeSetModel"; //$NON-NLS-1$ + private static ChangeSetModelProvider provider; + + public ChangeSetModelProvider() { + super(); + } + + public static ChangeSetModelProvider getProvider() { + if (provider == null) { + try { + provider = (ChangeSetModelProvider)ModelProvider.getModelProviderDescriptor(ChangeSetModelProvider.ID).getModelProvider(); + } catch (CoreException e) { + TeamPlugin.log(e); + } + } + return provider; + } + +} diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/ChangeSetResourceMapping.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/ChangeSetResourceMapping.java new file mode 100644 index 000000000..42d903d41 --- /dev/null +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/mapping/ChangeSetResourceMapping.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2006 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.internal.ccvs.core.mapping; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.mapping.*; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +public class ChangeSetResourceMapping extends ResourceMapping { + + private final CVSActiveChangeSet changeSet; + + public ChangeSetResourceMapping(CVSActiveChangeSet changeSet) { + this.changeSet = changeSet; + } + + public Object getModelObject() { + return changeSet; + } + + public String getModelProviderId() { + return ChangeSetModelProvider.ID; + } + + public IProject[] getProjects() { + Set result = new HashSet(); + IResource[] resources = changeSet.getResources(); + for (int i = 0; i < resources.length; i++) { + IResource resource = resources[i]; + result.add(resource.getProject()); + } + return (IProject[]) result.toArray(new IProject[result.size()]); + } + + public ResourceTraversal[] getTraversals(ResourceMappingContext context, + IProgressMonitor monitor) throws CoreException { + IResource[] resources = changeSet.getResources(); + if (resources.length == 0) { + return new ResourceTraversal[0]; + } + return new ResourceTraversal[] { + new ResourceTraversal(resources, IResource.DEPTH_ZERO, IResource.NONE) + }; + } + +} diff --git a/bundles/org.eclipse.team.cvs.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.team.cvs.ui/META-INF/MANIFEST.MF index 270b45900..0e8e12b58 100644 --- a/bundles/org.eclipse.team.cvs.ui/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.team.cvs.ui/META-INF/MANIFEST.MF @@ -30,5 +30,6 @@ Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)";resolution:=op org.eclipse.team.ui;bundle-version="[3.2.0,4.0.0)", org.eclipse.team.cvs.core;bundle-version="[3.2.0,4.0.0)", org.eclipse.compare;bundle-version="[3.2.0,4.0.0)", - org.eclipse.ui.navigator.resources;bundle-version="[3.2.0,4.0.0) + org.eclipse.ui.navigator.resources;bundle-version="[3.2.0,4.0.0)", + org.eclipse.ui.navigator Eclipse-LazyStart: true diff --git a/bundles/org.eclipse.team.cvs.ui/plugin.xml b/bundles/org.eclipse.team.cvs.ui/plugin.xml index e6023f49c..2057589c7 100644 --- a/bundles/org.eclipse.team.cvs.ui/plugin.xml +++ b/bundles/org.eclipse.team.cvs.ui/plugin.xml @@ -110,6 +110,9 @@ name="otherActions2" separator="true"/> <insertionPoint + name="changeSetActions" + separator="true"/> + <insertionPoint name="sort" separator="true"/> <insertionPoint @@ -1520,5 +1523,39 @@ class="org.eclipse.team.internal.ccvs.ui.CVSResourceDropAdapter" id="org.eclipse.team.cvs.ui.cvsRemoteDrop"/> </extension> + <extension + point="org.eclipse.ui.navigator.navigatorContent"> + <navigatorContent + activeByDefault="false" + contentProvider="org.eclipse.team.internal.ccvs.ui.mappings.ChangeSetContentProvider" + icon="$nl$/icons/full/obj16/changelog_obj.gif" + id="org.eclipse.team.cvs.ui.changeSetContent" + labelProvider="org.eclipse.team.internal.ccvs.ui.mappings.ChangeSetLabelProvider" + name="CVS Change Sets" + priority="normal"> + <enablement> + <or> + <instanceof value="org.eclipse.team.internal.ccvs.core.mapping.ChangeSetModelProvider"/> + <instanceof value="org.eclipse.team.internal.ccvs.core.mapping.CVSActiveChangeSet"/> + <instanceof value="org.eclipse.core.resources.IResource"/> + <instanceof value="org.eclipse.team.core.mapping.ISynchronizationScope"/> + <instanceof value="org.eclipse.team.core.mapping.ISynchronizationContext"/> + </or> + </enablement> + <commonSorter + class="org.eclipse.team.internal.ccvs.ui.mappings.ChangeSetSorter" + id="org.eclipse.team.cvs.ui.changeSetSorter"/> + <actionProvider + class="org.eclipse.team.internal.ccvs.ui.mappings.ChangeSetActionProvider" + id="org.eclipse.team.cvs.ui.changeSetActions"/> + </navigatorContent> + </extension> + <extension + point="org.eclipse.team.ui.teamContentProviders"> + <teamContentProvider + contentExtensionId="org.eclipse.team.cvs.ui.changeSetContent" + icon="$nl$/icons/full/obj16/changelog_obj.gif" + modelProviderId="org.eclipse.team.cvs.core.changeSetModel"/> + </extension> </plugin> diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java index 4477ac6f7..cd6deb45f 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java @@ -37,6 +37,7 @@ import org.eclipse.team.core.TeamException; import org.eclipse.team.internal.ccvs.core.*; import org.eclipse.team.internal.ccvs.core.client.Command.KSubstOption; import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation; +import org.eclipse.team.internal.ccvs.core.mapping.CVSActiveChangeSetCollector; import org.eclipse.team.internal.ccvs.ui.console.CVSOutputConsole; import org.eclipse.team.internal.ccvs.ui.model.CVSAdapterFactory; import org.eclipse.team.internal.ccvs.ui.repo.RepositoryManager; @@ -81,7 +82,7 @@ public class CVSUIPlugin extends AbstractUIPlugin { */ private RepositoryManager repositoryManager; - private SubscriberChangeSetCollector changeSetManager; + private CVSActiveChangeSetCollector changeSetManager; /** * CVSUIPlugin constructor @@ -268,7 +269,7 @@ public class CVSUIPlugin extends AbstractUIPlugin { public synchronized SubscriberChangeSetCollector getChangeSetManager() { if (changeSetManager == null) { - changeSetManager = new SubscriberChangeSetCollector(CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber()); + changeSetManager = new CVSActiveChangeSetCollector(CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber()); } return changeSetManager; } diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/ChangeSetActionProvider.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/ChangeSetActionProvider.java new file mode 100644 index 000000000..6e98ed316 --- /dev/null +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/ChangeSetActionProvider.java @@ -0,0 +1,421 @@ +/******************************************************************************* + * Copyright (c) 2006 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.internal.ccvs.ui.mappings; + +import java.util.*; + +import org.eclipse.core.resources.*; +import org.eclipse.core.resources.mapping.ResourceTraversal; +import org.eclipse.jface.action.*; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.viewers.*; +import org.eclipse.osgi.util.NLS; +import org.eclipse.swt.widgets.Control; +import org.eclipse.team.core.diff.*; +import org.eclipse.team.core.mapping.IResourceDiffTree; +import org.eclipse.team.core.mapping.provider.ResourceDiffTree; +import org.eclipse.team.internal.ccvs.core.mapping.ChangeSetModelProvider; +import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; +import org.eclipse.team.internal.core.subscribers.*; +import org.eclipse.team.internal.ui.*; +import org.eclipse.team.internal.ui.synchronize.ChangeSetCapability; +import org.eclipse.team.internal.ui.synchronize.IChangeSetProvider; +import org.eclipse.team.ui.mapping.SynchronizationActionProvider; +import org.eclipse.team.ui.synchronize.*; +import org.eclipse.ui.actions.ActionContext; +import org.eclipse.ui.actions.BaseSelectionListenerAction; +import org.eclipse.ui.navigator.INavigatorContentExtension; +import org.eclipse.ui.navigator.INavigatorContentService; + +public class ChangeSetActionProvider extends SynchronizationActionProvider { + + /** + * Menu group that can be added to the context menu + */ + public final static String CHANGE_SET_GROUP = "changeSetActions"; //$NON-NLS-1$ + + private CreateChangeSetAction createChangeSet; + private MenuManager addToChangeSet; + private EditChangeSetAction editChangeSet; + private RemoveChangeSetAction removeChangeSet; + private MakeDefaultChangeSetAction makeDefault; + + private class CreateChangeSetAction extends ModelParticipantAction { + + public CreateChangeSetAction(ISynchronizePageConfiguration configuration) { + super(TeamUIMessages.ChangeLogModelProvider_0, configuration); + } + + public void run() { + final IDiff[] diffs = getLocalChanges(getStructuredSelection()); + syncExec(new Runnable() { + public void run() { + createChangeSet(diffs); + } + }); + } + + private void createChangeSet(IDiff[] diffs) { + ActiveChangeSet set = getChangeSetCapability().createChangeSet(getConfiguration(), diffs); + if (set != null) { + getActiveChangeSetManager().add(set); + } + } + + protected boolean isEnabledForSelection(IStructuredSelection selection) { + return containsLocalChanges(selection); + } + } + + private class AddToChangeSetAction extends ModelParticipantAction { + + private final ActiveChangeSet set; + + public AddToChangeSetAction(ISynchronizePageConfiguration configuration, ActiveChangeSet set, ISelection selection) { + super(set == null ? TeamUIMessages.ChangeSetActionGroup_2 : set.getTitle(), configuration); + this.set = set; + selectionChanged(selection); + } + + public void run() { + IDiff[] diffArray = getLocalChanges(getStructuredSelection()); + if (set != null) { + set.add(diffArray); + } else { + ChangeSet[] sets = getActiveChangeSetManager().getSets(); + IResource[] resources = getResources(diffArray); + for (int i = 0; i < sets.length; i++) { + ActiveChangeSet activeSet = (ActiveChangeSet)sets[i]; + activeSet.remove(resources); + } + } + } + + private IResource[] getResources(IDiff[] diffArray) { + List result = new ArrayList(); + for (int i = 0; i < diffArray.length; i++) { + IDiff diff = diffArray[i]; + IResource resource = ResourceDiffTree.getResourceFor(diff); + if (resource != null) { + result.add(resource); + } + } + return (IResource[]) result.toArray(new IResource[result.size()]); + } + + protected boolean isEnabledForSelection(IStructuredSelection selection) { + return containsLocalChanges(selection); + } + } + + private abstract class ChangeSetAction extends BaseSelectionListenerAction { + + public ChangeSetAction(String title, ISynchronizePageConfiguration configuration) { + super(title); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.actions.BaseSelectionListenerAction#updateSelection(org.eclipse.jface.viewers.IStructuredSelection) + */ + protected boolean updateSelection(IStructuredSelection selection) { + return getSelectedSet() != null; + } + + protected ActiveChangeSet getSelectedSet() { + IStructuredSelection selection = getStructuredSelection(); + if (selection.size() == 1) { + Object first = selection.getFirstElement(); + if (first instanceof ActiveChangeSet) { + return (ActiveChangeSet) first; + } + } + return null; + } + } + + private class EditChangeSetAction extends ChangeSetAction { + + public EditChangeSetAction(ISynchronizePageConfiguration configuration) { + super(TeamUIMessages.ChangeLogModelProvider_6, configuration); + } + + public void run() { + ActiveChangeSet set = getSelectedSet(); + if (set == null) return; + getChangeSetCapability().editChangeSet(getSynchronizePageConfiguration(), set); + } + } + + private class RemoveChangeSetAction extends ChangeSetAction { + + public RemoveChangeSetAction(ISynchronizePageConfiguration configuration) { + super("Remove Change Set", configuration); //$NON-NLS-1$ + } + + public void run() { + ActiveChangeSet set = getSelectedSet(); + if (set == null) return; + if (MessageDialog.openConfirm(getSynchronizePageConfiguration().getSite().getShell(), TeamUIMessages.ChangeSetActionGroup_0, NLS.bind(TeamUIMessages.ChangeSetActionGroup_1, new String[] { set.getTitle() }))) { // + getActiveChangeSetManager().remove(set); + } + } + } + + private class MakeDefaultChangeSetAction extends ChangeSetAction { + public MakeDefaultChangeSetAction(ISynchronizePageConfiguration configuration) { + super(TeamUIMessages.ChangeLogModelProvider_9, configuration); + } + + public void run() { + ActiveChangeSet set = getSelectedSet(); + if (set == null) return; + getActiveChangeSetManager().makeDefault(set); + } + } + + public ChangeSetActionProvider() { + super(); + } + + protected void initialize() { + super.initialize(); + if (getChangeSetCapability().supportsActiveChangeSets()) { + addToChangeSet = new MenuManager(TeamUIMessages.ChangeLogModelProvider_12); + addToChangeSet.setRemoveAllWhenShown(true); + addToChangeSet.addMenuListener(new IMenuListener() { + public void menuAboutToShow(IMenuManager manager) { + addChangeSets(manager); + } + }); + createChangeSet = new CreateChangeSetAction(getSynchronizePageConfiguration()); + addToChangeSet.add(createChangeSet); + addToChangeSet.add(new Separator()); + editChangeSet = new EditChangeSetAction(getSynchronizePageConfiguration()); + makeDefault = new MakeDefaultChangeSetAction(getSynchronizePageConfiguration()); + removeChangeSet = new RemoveChangeSetAction(getSynchronizePageConfiguration()); + } + } + + public void fillContextMenu(IMenuManager menu) { + super.fillContextMenu(menu); + if (getChangeSetCapability().enableActiveChangeSetsFor(getSynchronizePageConfiguration())) { + appendToGroup( + menu, + CHANGE_SET_GROUP, + addToChangeSet); + appendToGroup( + menu, + CHANGE_SET_GROUP, + editChangeSet); + appendToGroup( + menu, + CHANGE_SET_GROUP, + removeChangeSet); + appendToGroup( + menu, + CHANGE_SET_GROUP, + makeDefault); + } + } + + public void dispose() { + if (addToChangeSet != null) { + addToChangeSet.dispose(); + addToChangeSet.removeAll(); + } + super.dispose(); + } + + protected void addChangeSets(IMenuManager manager) { + ChangeSet[] sets = getActiveChangeSetManager().getSets(); + ISelection selection = getContext().getSelection(); + createChangeSet.selectionChanged(selection); + addToChangeSet.add(createChangeSet); + addToChangeSet.add(new Separator()); + for (int i = 0; i < sets.length; i++) { + ActiveChangeSet set = (ActiveChangeSet)sets[i]; + AddToChangeSetAction action = new AddToChangeSetAction(getSynchronizePageConfiguration(), set, selection); + manager.add(action); + } + addToChangeSet.add(new Separator()); + // Action that removes change set resources + addToChangeSet.add(new AddToChangeSetAction(getSynchronizePageConfiguration(), null, selection)); + } + + private boolean appendToGroup(IContributionManager manager, String groupId, IContributionItem item) { + if (manager == null || item == null) return false; + IContributionItem group = manager.find(groupId); + if (group != null) { + manager.appendToGroup(group.getId(), item); + return true; + } + return false; + } + + private boolean appendToGroup(IContributionManager manager, String groupId, IAction action) { + if (manager == null || action == null) return false; + IContributionItem group = manager.find(groupId); + if (group != null) { + manager.appendToGroup(group.getId(), action); + //registerActionWithWorkbench(action); + return true; + } + return false; + } + + public ChangeSetCapability getChangeSetCapability() { + ISynchronizeParticipant participant = getSynchronizePageConfiguration().getParticipant(); + if (participant instanceof IChangeSetProvider) { + IChangeSetProvider provider = (IChangeSetProvider) participant; + return provider.getChangeSetCapability(); + } + return null; + } + + private void syncExec(final Runnable runnable) { + final Control ctrl = getSynchronizePageConfiguration().getPage().getViewer().getControl(); + Utils.syncExec(runnable, ctrl); + } + + private SubscriberChangeSetCollector getActiveChangeSetManager() { + return CVSUIPlugin.getPlugin().getChangeSetManager(); + } + + + public IDiff[] getLocalChanges(IStructuredSelection selection) { + if (selection instanceof ITreeSelection) { + ITreeSelection ts = (ITreeSelection) selection; + TreePath[] paths = ts.getPaths(); + List result = new ArrayList(); + for (int i = 0; i < paths.length; i++) { + TreePath path = paths[i]; + IDiff[] diffs = getLocalChanges(path); + for (int j = 0; j < diffs.length; j++) { + IDiff diff = diffs[j]; + result.add(diff); + } + } + return (IDiff[]) result.toArray(new IDiff[result.size()]); + } + return new IDiff[0]; + } + + private IDiff[] getLocalChanges(TreePath path) { + IResourceDiffTree tree = getDiffTree(path); + if (path.getSegmentCount() == 1) { + return ((ResourceDiffTree)tree).getDiffs(); + } + ResourceTraversal[] traversals = getTraversals(path.getLastSegment()); + return tree.getDiffs(traversals); + } + + private IResourceDiffTree getDiffTree(TreePath path) { + return getContentProvider().getDiffTree(path); + } + + public boolean containsLocalChanges(IStructuredSelection selection) { + if (selection instanceof ITreeSelection) { + ITreeSelection ts = (ITreeSelection) selection; + TreePath[] paths = ts.getPaths(); + for (int i = 0; i < paths.length; i++) { + TreePath path = paths[i]; + if (containsLocalChanges(path)) { + return true; + } + } + } + return false; + } + + private boolean containsLocalChanges(TreePath path) { + IResourceDiffTree tree = getDiffTree(path); + ResourceTraversal[] traversals = getTraversals(path.getLastSegment()); + return tree.hasMatchingDiffs(traversals, getVisibleLocalChangesFilter()); + } + + private ResourceTraversal[] getTraversals(Object element) { + if (element instanceof ChangeSet) { + ChangeSet set = (ChangeSet) element; + return new ResourceTraversal[] { new ResourceTraversal(set.getResources(), IResource.DEPTH_ZERO, IResource.NONE) }; + } + if (element instanceof IProject) { + IProject project = (IProject) element; + return new ResourceTraversal[] { new ResourceTraversal(new IResource[] { project }, IResource.DEPTH_INFINITE, IResource.NONE) }; + } + if (element instanceof IFile) { + IFile file = (IFile) element; + return new ResourceTraversal[] { new ResourceTraversal(new IResource[] { file }, IResource.DEPTH_ZERO, IResource.NONE) }; + } + if (element instanceof IFolder) { + IFolder folder = (IFolder) element; + if (getLayout().equals(IPreferenceIds.COMPRESSED_LAYOUT)) { + return new ResourceTraversal[] { new ResourceTraversal(new IResource[] { folder }, IResource.DEPTH_ONE, IResource.NONE) }; + } else if (getLayout().equals(IPreferenceIds.TREE_LAYOUT)) { + return new ResourceTraversal[] { new ResourceTraversal(new IResource[] { folder }, IResource.DEPTH_INFINITE, IResource.NONE) }; + } else if (getLayout().equals(IPreferenceIds.FLAT_LAYOUT)) { + return new ResourceTraversal[] { new ResourceTraversal(new IResource[] { folder }, IResource.DEPTH_ZERO, IResource.NONE) }; + } + } + return null; + } + + private FastDiffFilter getVisibleLocalChangesFilter() { + return new FastDiffFilter() { + public boolean select(IDiff diff) { + if (diff instanceof IThreeWayDiff && isVisible(diff)) { + IThreeWayDiff twd = (IThreeWayDiff) diff; + if (twd.getDirection() == IThreeWayDiff.OUTGOING || twd.getDirection() == IThreeWayDiff.CONFLICTING) { + return true; + } + } + return false; + } + }; + } + + private boolean isVisible(IDiff diff) { + ChangeSetContentProvider provider = getContentProvider(); + return provider.isVisible(diff); + } + + private ChangeSetContentProvider getContentProvider() { + INavigatorContentService service = getActionSite().getContentService(); + Set set = service.findContentExtensionsByTriggerPoint(getModelProvider()); + for (Iterator iter = set.iterator(); iter.hasNext();) { + INavigatorContentExtension extension = (INavigatorContentExtension) iter.next(); + ITreeContentProvider provider = extension.getContentProvider(); + if (provider instanceof ChangeSetContentProvider) { + return (ChangeSetContentProvider) provider; + } + } + throw new IllegalStateException(); + } + + private Object getModelProvider() { + return ChangeSetModelProvider.getProvider(); + } + + private String getLayout() { + return TeamUIPlugin.getPlugin().getPreferenceStore().getString(IPreferenceIds.SYNCVIEW_DEFAULT_LAYOUT); + } + + public void setContext(ActionContext context) { + super.setContext(context); + if (context != null) { + if (editChangeSet != null) + editChangeSet.selectionChanged((IStructuredSelection)getContext().getSelection()); + if (removeChangeSet != null) + removeChangeSet.selectionChanged((IStructuredSelection)getContext().getSelection()); + if (makeDefault != null) + makeDefault.selectionChanged((IStructuredSelection)getContext().getSelection()); + } + } +} diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/ChangeSetContentProvider.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/ChangeSetContentProvider.java new file mode 100644 index 000000000..8e5b53a20 --- /dev/null +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/ChangeSetContentProvider.java @@ -0,0 +1,465 @@ +/******************************************************************************* + * Copyright (c) 2006 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.internal.ccvs.ui.mappings; + +import java.util.*; + +import org.eclipse.core.resources.*; +import org.eclipse.core.resources.mapping.ModelProvider; +import org.eclipse.core.resources.mapping.ResourceTraversal; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.viewers.*; +import org.eclipse.team.core.diff.*; +import org.eclipse.team.core.mapping.IResourceDiffTree; +import org.eclipse.team.core.mapping.ISynchronizationContext; +import org.eclipse.team.core.mapping.provider.ResourceDiffTree; +import org.eclipse.team.internal.ccvs.core.mapping.ChangeSetModelProvider; +import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; +import org.eclipse.team.internal.core.subscribers.*; +import org.eclipse.team.internal.ui.IPreferenceIds; +import org.eclipse.team.internal.ui.Utils; +import org.eclipse.team.internal.ui.mapping.ResourceModelContentProvider; +import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; +import org.eclipse.ui.navigator.ICommonContentExtensionSite; + +public class ChangeSetContentProvider extends ResourceModelContentProvider implements ITreePathContentProvider { + + private ResourceDiffTree theRest; + private Map diffTrees = new HashMap(); + + /* + * Listener that reacts to changes made to the active change set collector + */ + private IChangeSetChangeListener activeListener = new IChangeSetChangeListener() { + + /* (non-Javadoc) + * @see org.eclipse.team.internal.core.subscribers.IChangeSetChangeListener#setAdded(org.eclipse.team.internal.core.subscribers.ChangeSet) + */ + public void setAdded(final ChangeSet set) { + // TODO: Should we listen to all sets for changes or just to the collector? + addListener((DiffChangeSet)set); + if (isVisible(set)) { + Utils.syncExec(new Runnable() { + public void run() { + Object input = getViewer().getInput(); + ((AbstractTreeViewer)getViewer()).add(input, set); + } + }, (StructuredViewer)getViewer()); + } + IResource[] resources = set.getResources(); + try { + getTheRest().beginInput(); + for (int i = 0; i < resources.length; i++) { + IResource resource = resources[i]; + getTheRest().remove(resource); + } + } finally { + getTheRest().endInput(null); + } + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.core.subscribers.IChangeSetChangeListener#defaultSetChanged(org.eclipse.team.internal.core.subscribers.ChangeSet, org.eclipse.team.internal.core.subscribers.ChangeSet) + */ + public void defaultSetChanged(final ChangeSet previousDefault, final ChangeSet set) { + if (isVisible(set) || isVisible(previousDefault)) { + Utils.asyncExec(new Runnable() { + public void run() { + ((AbstractTreeViewer)getViewer()).update(new Object[] {previousDefault, set}, null); + } + }, (StructuredViewer)getViewer()); + } + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.core.subscribers.IChangeSetChangeListener#setRemoved(org.eclipse.team.internal.core.subscribers.ChangeSet) + */ + public void setRemoved(final ChangeSet set) { + removeListener((DiffChangeSet)set); + if (isVisible(set)) { + Utils.syncExec(new Runnable() { + public void run() { + ((AbstractTreeViewer)getViewer()).remove(TreePath.EMPTY.createChildPath(set)); + } + }, (StructuredViewer)getViewer()); + } + IResource[] resources = set.getResources(); + try { + getTheRest().beginInput(); + for (int i = 0; i < resources.length; i++) { + IResource resource = resources[i]; + IDiff diff = getContext().getDiffTree().getDiff(resource); + if (diff != null && !isContainedInSet(diff)) + getTheRest().add(diff); + } + } finally { + getTheRest().endInput(null); + } + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.core.subscribers.IChangeSetChangeListener#nameChanged(org.eclipse.team.internal.core.subscribers.ChangeSet) + */ + public void nameChanged(final ChangeSet set) { + if (isVisible(set)) { + Utils.asyncExec(new Runnable() { + public void run() { + ((AbstractTreeViewer)getViewer()).update(set, null); + } + }, (StructuredViewer)getViewer()); + } + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.core.subscribers.IChangeSetChangeListener#resourcesChanged(org.eclipse.team.internal.core.subscribers.ChangeSet, org.eclipse.core.runtime.IPath[]) + */ + public void resourcesChanged(final ChangeSet set, final IPath[] paths) { + if (isVisible(set)) { + Utils.syncExec(new Runnable() { + public void run() { + // TODO: Should we refresh here or in a diff change listener + ((AbstractTreeViewer)getViewer()).refresh(set, true); + } + }, (StructuredViewer)getViewer()); + } + try { + getTheRest().beginInput(); + for (int i = 0; i < paths.length; i++) { + IPath path = paths[i]; + boolean isContained = ((DiffChangeSet)set).contains(path); + if (isContained) { + IDiff diff = ((DiffChangeSet)set).getDiffTree().getDiff(path); + if (diff != null) { + getTheRest().remove(ResourceDiffTree.getResourceFor(diff)); + } + } else { + IDiff diff = getContext().getDiffTree().getDiff(path); + if (diff != null && !isContainedInSet(diff)) { + getTheRest().add(diff); + } + } + } + } finally { + getTheRest().endInput(null); + } + } + }; + + private IDiffChangeListener diffTreeListener = new IDiffChangeListener() { + + /* (non-Javadoc) + * @see org.eclipse.team.core.diff.IDiffChangeListener#propertyChanged(org.eclipse.team.core.diff.IDiffTree, int, org.eclipse.core.runtime.IPath[]) + */ + public void propertyChanged(IDiffTree tree, int property, IPath[] paths) { + // Ignore + } + + /* (non-Javadoc) + * @see org.eclipse.team.core.diff.IDiffChangeListener#diffsChanged(org.eclipse.team.core.diff.IDiffChangeEvent, org.eclipse.core.runtime.IProgressMonitor) + */ + public void diffsChanged(IDiffChangeEvent event, IProgressMonitor monitor) { + Object input = getViewer().getInput(); + if (input instanceof ChangeSetModelProvider) { + Utils.asyncExec(new Runnable() { + public void run() { + // TODO: Need to be a bit more precise + ((AbstractTreeViewer)getViewer()).refresh(); + } + }, (StructuredViewer)getViewer()); + } + } + + }; + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.mapping.ResourceModelContentProvider#getModelProviderId() + */ + protected String getModelProviderId() { + return ChangeSetModelProvider.ID; + } + + protected boolean isVisible(ChangeSet set) { + final Object input = getViewer().getInput(); + if (input instanceof ChangeSetModelProvider) { + if (set instanceof ActiveChangeSet) { + ActiveChangeSet acs = (ActiveChangeSet) set; + // TODO: may nee to be more precise that this + return getConfiguration().getMode() != ISynchronizePageConfiguration.INCOMING_MODE; + } + } + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.mapping.ResourceModelContentProvider#getElements(java.lang.Object) + */ + public Object[] getElements(Object parent) { + if (parent instanceof ISynchronizationContext) { + // Do not show change sets when all models are visible because + // model providers that override the resource content may cause + // problems for the change set content provider + return new Object[0]; + } + if (parent == getModelProvider()) { + return getRootElements(); + } + return super.getElements(parent); + } + + private Object[] getRootElements() { + List result = new ArrayList(); + ChangeSet[] sets = getAllSets(); + for (int i = 0; i < sets.length; i++) { + ChangeSet set = sets[i]; + if (hasChildren(TreePath.EMPTY.createChildPath(set))) + result.add(set); + } + // Include resources that are not in a set + ResourceDiffTree tree = getTheRest(); + IPath[] otherRoots = tree.getChildren(ResourcesPlugin.getWorkspace().getRoot().getFullPath()); + for (int i = 0; i < otherRoots.length; i++) { + IPath path = otherRoots[i]; + IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(path.lastSegment()); + if (project.isAccessible()) + result.add(project); + } + return result.toArray(); + } + + private synchronized ResourceDiffTree getTheRest() { + if (theRest == null) { + theRest = new ResourceDiffTree(); + theRest.addDiffChangeListener(diffTreeListener); + IResourceDiffTree allChanges = getContext().getDiffTree(); + allChanges.accept(ResourcesPlugin.getWorkspace().getRoot().getFullPath(), new IDiffVisitor() { + public boolean visit(IDiff diff) { + if (!isContainedInSet(diff)) + theRest.add(diff); + return true; + } + }, IResource.DEPTH_INFINITE); + } + return theRest; + } + + protected boolean isContainedInSet(IDiff diff) { + ChangeSet[] sets = getAllSets(); + for (int i = 0; i < sets.length; i++) { + ChangeSet set = sets[i]; + if (set.contains(ResourceDiffTree.getResourceFor(diff))) { + return true; + } + } + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.mapping.ResourceModelContentProvider#getTraversals(org.eclipse.team.core.mapping.ISynchronizationContext, java.lang.Object) + */ + protected ResourceTraversal[] getTraversals( + ISynchronizationContext context, Object object) { + if (object instanceof ChangeSet) { + ChangeSet set = (ChangeSet) object; + IResource[] resources = set.getResources(); + return new ResourceTraversal[] { new ResourceTraversal(resources, IResource.DEPTH_ZERO, IResource.NONE) }; + } + return super.getTraversals(context, object); + } + + public Object[] getChildren(TreePath parentPath) { + if (parentPath.getSegmentCount() == 0) + return getRootElements(); + Object first = parentPath.getFirstSegment(); + IResourceDiffTree diffTree; + Object parent = parentPath.getLastSegment(); + if (first instanceof DiffChangeSet) { + DiffChangeSet set = (DiffChangeSet) first; + diffTree = set.getDiffTree(); + if (parent instanceof DiffChangeSet) { + parent = getModelRoot(); + } + } else { + diffTree = getTheRest(); + if (parent instanceof ModelProvider) { + parent = getModelRoot(); + } + } + Object[] children = getChildren(parent); + Set result = new HashSet(); + for (int i = 0; i < children.length; i++) { + Object child = children[i]; + if (isVisible(child, diffTree)) { + result.add(child); + } + } + return result.toArray(); + } + + private boolean isVisible(Object object, IResourceDiffTree tree) { + if (object instanceof IResource) { + IResource resource = (IResource) object; + if (tree.getDiff(resource) != null) + return true; + switch (resource.getType()) { + case IResource.PROJECT: + return tree.getDiffs(resource, IResource.DEPTH_INFINITE).length > 0; + case IResource.FOLDER: + if (getLayout().equals(IPreferenceIds.COMPRESSED_LAYOUT)) { + return tree.getDiffs(resource, IResource.DEPTH_ONE).length > 0; + } else if (getLayout().equals(IPreferenceIds.TREE_LAYOUT)) { + return tree.getDiffs(resource, IResource.DEPTH_INFINITE).length > 0; + } + } + } + return false; + } + + public boolean hasChildren(TreePath path) { + return getChildren(path).length > 0; + } + + public TreePath[] getParents(Object element) { + if (element instanceof ChangeSet) { + return new TreePath[] { TreePath.EMPTY }; + } + if (element instanceof IResource) { + IResource resource = (IResource) element; + DiffChangeSet[] sets = getSetsContaining(resource); + if (sets.length > 0) { + List result = new ArrayList(); + for (int i = 0; i < sets.length; i++) { + DiffChangeSet set = sets[i]; + TreePath path = getPathForElement(set.getDiffTree(), resource); + if (path != null) + result.add(path); + } + return (TreePath[]) result.toArray(new TreePath[result.size()]); + } else { + TreePath path = getPathForElement(getTheRest(), resource); + if (path != null) + return new TreePath[] { path }; + } + } + + return new TreePath[0]; + } + + private DiffChangeSet[] getSetsContaining(IResource resource) { + List result = new ArrayList(); + DiffChangeSet[] allSets = getAllSets(); + for (int i = 0; i < allSets.length; i++) { + DiffChangeSet set = allSets[i]; + if (isVisible(resource, set.getDiffTree())) { + result.add(set); + } + } + return (DiffChangeSet[]) result.toArray(new DiffChangeSet[result.size()]); + } + + private DiffChangeSet[] getAllSets() { + SubscriberChangeSetCollector collector = CVSUIPlugin.getPlugin().getChangeSetManager(); + ChangeSet[] sets = collector.getSets(); + List result = new ArrayList(); + for (int i = 0; i < sets.length; i++) { + ChangeSet set = sets[i]; + result.add(set); + } + return (DiffChangeSet[]) result.toArray(new DiffChangeSet[result.size()]); + } + + private TreePath getPathForElement(IResourceDiffTree tree, IResource resource) { + // TODO Auto-generated method stub + return null; + } + + public void init(ICommonContentExtensionSite site) { + super.init(site); + SubscriberChangeSetCollector collector = CVSUIPlugin.getPlugin().getChangeSetManager(); + collector.addListener(activeListener); + ChangeSet[] sets = collector.getSets(); + for (int i = 0; i < sets.length; i++) { + DiffChangeSet set = (DiffChangeSet)sets[i]; + set.getDiffTree().addDiffChangeListener(diffTreeListener); + } + } + + public void dispose() { + CVSUIPlugin.getPlugin().getChangeSetManager().removeListener(activeListener); + for (Iterator iter = diffTrees.values().iterator(); iter.hasNext();) { + IDiffTree tree = (IDiffTree) iter.next(); + tree.removeDiffChangeListener(diffTreeListener); + } + if (theRest != null) { + theRest.removeDiffChangeListener(diffTreeListener); + } + super.dispose(); + } + + protected void addListener(DiffChangeSet set) { + IResourceDiffTree tree = set.getDiffTree(); + diffTrees.put(tree, set); + tree.addDiffChangeListener(diffTreeListener); + } + + protected void removeListener(DiffChangeSet set) { + IResourceDiffTree tree = set.getDiffTree(); + diffTrees.remove(tree); + tree.removeDiffChangeListener(diffTreeListener); + } + + public boolean isVisible(IDiff diff) { + return super.isVisible(diff); + } + + public IResourceDiffTree getDiffTree(TreePath path) { + if (path.getSegmentCount() > 0) { + Object first = path.getFirstSegment(); + if (first instanceof DiffChangeSet) { + DiffChangeSet set = (DiffChangeSet) first; + return set.getDiffTree(); + } + } + return getTheRest(); + } + + public void diffsChanged(IDiffChangeEvent event, IProgressMonitor monitor) { + // Override inherited method to reconcile sub-trees + IPath[] removed = event.getRemovals(); + IDiff[] added = event.getAdditions(); + IDiff[] changed = event.getChanges(); + // Only adjust the set of the rest. The others will be handled by the collectors + try { + getTheRest().beginInput(); + for (int i = 0; i < removed.length; i++) { + IPath path = removed[i]; + getTheRest().remove(path); + } + for (int i = 0; i < added.length; i++) { + IDiff diff = added[i]; + // Only add the diff if it is not already in another set + if (!isContainedInSet(diff)) { + getTheRest().add(diff); + } + } + for (int i = 0; i < changed.length; i++) { + IDiff diff = changed[i]; + // Only add the diff if it is already contained in the free set + if (getTheRest().getDiff(diff.getPath()) != null) { + getTheRest().add(diff); + } + } + } finally { + getTheRest().endInput(monitor); + } + } + +} diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/ChangeSetLabelProvider.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/ChangeSetLabelProvider.java new file mode 100644 index 000000000..c6d383206 --- /dev/null +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/ChangeSetLabelProvider.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2006 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.internal.ccvs.ui.mappings; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.graphics.Image; +import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; +import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants; +import org.eclipse.team.internal.core.subscribers.ActiveChangeSet; +import org.eclipse.team.internal.ui.mapping.ResourceModelLabelProvider; + +public class ChangeSetLabelProvider extends ResourceModelLabelProvider { + + private Image changeSetImage; + + protected String getDelegateText(Object element) { + if (element instanceof ActiveChangeSet) { + ActiveChangeSet set = (ActiveChangeSet) element; + return set.getName(); + } + return super.getDelegateText(element); + } + + protected Image getDelegateImage(Object element) { + if (element instanceof ActiveChangeSet) { + return getChangeSetImage(); + } + return super.getDelegateImage(element); + } + + private Image getChangeSetImage() { + if (changeSetImage == null) { + ImageDescriptor imageDescriptor = CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_CHANGELOG); + if (imageDescriptor != null) + changeSetImage = imageDescriptor.createImage(); + } + return changeSetImage; + } + + public void dispose() { + if (changeSetImage != null) { + changeSetImage.dispose(); + } + super.dispose(); + } + +} diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/ChangeSetSorter.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/ChangeSetSorter.java new file mode 100644 index 000000000..65bd2419f --- /dev/null +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/ChangeSetSorter.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2006 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.internal.ccvs.ui.mappings; + +import org.eclipse.team.internal.ui.mapping.ResourceModelSorter; + +public class ChangeSetSorter extends ResourceModelSorter { + + public ChangeSetSorter() { + super(); + } + +} diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/WorkspaceChangeSetCapability.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/WorkspaceChangeSetCapability.java new file mode 100644 index 000000000..f7d03a933 --- /dev/null +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/WorkspaceChangeSetCapability.java @@ -0,0 +1,89 @@ +/******************************************************************************* + * Copyright (c) 2006 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.internal.ccvs.ui.mappings; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.core.resources.IResource; +import org.eclipse.jface.window.Window; +import org.eclipse.team.core.diff.IDiff; +import org.eclipse.team.core.mapping.provider.ResourceDiffTree; +import org.eclipse.team.internal.ccvs.ui.*; +import org.eclipse.team.internal.ccvs.ui.subscriber.CommitSetDialog; +import org.eclipse.team.internal.core.subscribers.ActiveChangeSet; +import org.eclipse.team.internal.core.subscribers.SubscriberChangeSetCollector; +import org.eclipse.team.internal.ui.synchronize.ChangeSetCapability; +import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; + +public class WorkspaceChangeSetCapability extends ChangeSetCapability { + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.synchronize.ChangeSetCapability#enableChangeSetsByDefault() + */ + public boolean enableChangeSetsByDefault() { + return CVSUIPlugin.getPlugin().getPreferenceStore().getBoolean(ICVSUIConstants.PREF_COMMIT_SET_DEFAULT_ENABLEMENT); + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.synchronize.ChangeSetCapability#supportsActiveChangeSets() + */ + public boolean supportsActiveChangeSets() { + return true; + } + + public boolean enableActiveChangeSetsFor(ISynchronizePageConfiguration configuration) { + return supportsActiveChangeSets() && + configuration.getMode() != ISynchronizePageConfiguration.INCOMING_MODE; + } + + /* (non-Javadoc) + * @see org.eclipse.team.internal.ui.synchronize.ChangeSetCapability#createChangeSet(org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration, org.eclipse.team.core.diff.IDiff[]) + */ + public ActiveChangeSet createChangeSet(ISynchronizePageConfiguration configuration, IDiff[] infos) { + ActiveChangeSet set = getActiveChangeSetManager().createSet(CVSUIMessages.WorkspaceChangeSetCapability_1, new IDiff[0]); + CommitSetDialog dialog = new CommitSetDialog(configuration.getSite().getShell(), set, getResources(infos), + CVSUIMessages.WorkspaceChangeSetCapability_2, CVSUIMessages.WorkspaceChangeSetCapability_3); // + dialog.open(); + if (dialog.getReturnCode() != Window.OK) return null; + set.add(infos); + return set; + } + + private IResource[] getResources(IDiff[] diffs) { + Set result = new HashSet(); + for (int i = 0; i < diffs.length; i++) { + IDiff diff = diffs[i]; + IResource resource = ResourceDiffTree.getResourceFor(diff); + if (resource != null) + result.add(resource); + } + return (IResource[]) result.toArray(new IResource[result.size()]); + } + + /* (non-Javadoc) + * @see org.eclipse.team.ui.synchronize.ChangeSetCapability#editChangeSet(org.eclipse.team.core.subscribers.ActiveChangeSet) + */ + public void editChangeSet(ISynchronizePageConfiguration configuration, ActiveChangeSet set) { + CommitSetDialog dialog = new CommitSetDialog(configuration.getSite().getShell(), set, set.getResources(), + CVSUIMessages.WorkspaceChangeSetCapability_7, CVSUIMessages.WorkspaceChangeSetCapability_8); // + dialog.open(); + if (dialog.getReturnCode() != Window.OK) return; + // Nothing to do here as the set was updated by the dialog + } + + /* (non-Javadoc) + * @see org.eclipse.team.ui.synchronize.ChangeSetCapability#getActiveChangeSetManager() + */ + public SubscriberChangeSetCollector getActiveChangeSetManager() { + return CVSUIPlugin.getPlugin().getChangeSetManager(); + } +} diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/WorkspaceModelParticipant.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/WorkspaceModelParticipant.java index 76ee32463..fa1471427 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/WorkspaceModelParticipant.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/mappings/WorkspaceModelParticipant.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.team.internal.ccvs.ui.mappings; +import org.eclipse.core.resources.mapping.ModelProvider; import org.eclipse.core.resources.mapping.ResourceMapping; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.action.*; @@ -22,19 +23,22 @@ import org.eclipse.team.core.mapping.provider.MergeContext; import org.eclipse.team.core.mapping.provider.SynchronizationContext; import org.eclipse.team.core.subscribers.SubscriberScopeManager; import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; +import org.eclipse.team.internal.ccvs.core.mapping.ChangeSetModelProvider; import org.eclipse.team.internal.ccvs.ui.*; import org.eclipse.team.internal.ccvs.ui.actions.*; import org.eclipse.team.internal.ccvs.ui.subscriber.CVSActionDelegateWrapper; import org.eclipse.team.internal.ui.TeamUIPlugin; import org.eclipse.team.internal.ui.Utils; import org.eclipse.team.internal.ui.mapping.MergeAllActionHandler; +import org.eclipse.team.internal.ui.synchronize.ChangeSetCapability; +import org.eclipse.team.internal.ui.synchronize.IChangeSetProvider; import org.eclipse.team.ui.TeamUI; import org.eclipse.team.ui.mapping.ITeamContentProviderManager; import org.eclipse.team.ui.mapping.SynchronizationActionProvider; import org.eclipse.team.ui.synchronize.*; public class WorkspaceModelParticipant extends - ModelSynchronizeParticipant { + ModelSynchronizeParticipant implements IChangeSetProvider { public static final String VIEWER_ID = "org.eclipse.team.cvs.ui.workspaceSynchronization"; //$NON-NLS-1$ @@ -169,6 +173,8 @@ public class WorkspaceModelParticipant extends } } } + + private WorkspaceChangeSetCapability capability; public WorkspaceModelParticipant() { } @@ -229,5 +235,30 @@ public class WorkspaceModelParticipant extends pages[pages.length - 1].setTitle(CVSUIMessages.CVSParticipant_2); return pages; } + + public ModelProvider[] getEnabledModelProviders() { + ModelProvider[] enabledProviders = super.getEnabledModelProviders(); + for (int i = 0; i < enabledProviders.length; i++) { + ModelProvider provider = enabledProviders[i]; + if (provider.getId().equals(ChangeSetModelProvider.ID)) + return enabledProviders; + } + ModelProvider[] extended = new ModelProvider[enabledProviders.length + 1]; + for (int i = 0; i < enabledProviders.length; i++) { + extended[i] = enabledProviders[i]; + } + ChangeSetModelProvider provider = ChangeSetModelProvider.getProvider(); + if (provider == null) + return enabledProviders; + extended[extended.length - 1] = provider; + return extended; + } + + public ChangeSetCapability getChangeSetCapability() { + if (capability == null) { + capability = new WorkspaceChangeSetCapability(); + } + return capability; + } } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java index a1e213b93..9d818e8c7 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java @@ -10,10 +10,10 @@ *******************************************************************************/ package org.eclipse.team.internal.ui.mapping; -import java.util.*; +import java.util.HashSet; +import java.util.Set; -import org.eclipse.core.resources.mapping.ResourceMapping; -import org.eclipse.core.resources.mapping.ResourceTraversal; +import org.eclipse.core.resources.mapping.*; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.util.IPropertyChangeListener; @@ -119,7 +119,7 @@ public class CommonViewerAdvisor extends AbstractTreeViewerAdvisor implements IN * @param configuration the configuration for the viewer * @return a newly created common viewer */ - private static CommonViewer createViewer(Composite parent, ISynchronizePageConfiguration configuration, IEmptyTreeListener listener) { + private static CommonViewer createViewer(Composite parent, final ISynchronizePageConfiguration configuration, IEmptyTreeListener listener) { final CommonViewer v = new NavigableCommonViewer(configuration.getViewerId(), parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, listener); v.setSorter(new TeamViewerSorter(new CommonViewerSorter())); ISynchronizationScope scope = getScope(configuration); @@ -127,7 +127,7 @@ public class CommonViewerAdvisor extends AbstractTreeViewerAdvisor implements IN scope.addScopeChangeListener(new ISynchronizationScopeChangeListener() { public void scopeChanged(final ISynchronizationScope scope, ResourceMapping[] newMappings, ResourceTraversal[] newTraversals) { - enableContentProviders(v, scope); + enableContentProviders(v, configuration); Utils.asyncExec(new Runnable() { public void run() { v.refresh(); @@ -136,13 +136,32 @@ public class CommonViewerAdvisor extends AbstractTreeViewerAdvisor implements IN }, v); } }); - enableContentProviders(v, scope); + enableContentProviders(v, configuration); configuration.getSite().setSelectionProvider(v); return v; } - private static void enableContentProviders(CommonViewer v, ISynchronizationScope scope) { - v.getNavigatorContentService().getActivationService().activateExtensions(TeamUI.getTeamContentProviderManager().getContentProviderIds(scope), true); + private static void enableContentProviders(CommonViewer v, ISynchronizePageConfiguration configuration) { + v.getNavigatorContentService().getActivationService().activateExtensions(getEnabledContentProviders(configuration), true); + } + + private static String[] getEnabledContentProviders(ISynchronizePageConfiguration configuration) { + String visibleModel = (String)configuration.getProperty(ModelSynchronizeParticipant.P_VISIBLE_MODEL_PROVIDER); + if (visibleModel != null && !visibleModel.equals(ModelSynchronizeParticipant.ALL_MODEL_PROVIDERS_VISIBLE)) { + ITeamContentProviderDescriptor desc = TeamUI.getTeamContentProviderManager().getDescriptor(visibleModel); + if (desc != null) + return new String[] { desc.getContentExtensionId() }; + } + ModelSynchronizeParticipant participant = (ModelSynchronizeParticipant)configuration.getParticipant(); + ModelProvider[] providers = participant.getEnabledModelProviders(); + Set result = new HashSet(); + for (int i = 0; i < providers.length; i++) { + ModelProvider provider = providers[i]; + ITeamContentProviderDescriptor desc = TeamUI.getTeamContentProviderManager().getDescriptor(provider.getId()); + if (desc != null) + result.add(desc.getContentExtensionId()); + } + return (String[]) result.toArray(new String[result.size()]); } private static void bindTeamContentProviders(CommonViewer v) { @@ -169,6 +188,7 @@ public class CommonViewerAdvisor extends AbstractTreeViewerAdvisor implements IN super(configuration); final CommonViewer viewer = CommonViewerAdvisor.createViewer(parent, configuration, this); TeamUI.getTeamContentProviderManager().addPropertyChangeListener(this); + configuration.addPropertyChangeListener(this); GridData data = new GridData(GridData.FILL_BOTH); viewer.getControl().setLayoutData(data); viewer.getNavigatorContentService().addListener(this); @@ -276,6 +296,7 @@ public class CommonViewerAdvisor extends AbstractTreeViewerAdvisor implements IN */ public void dispose() { TeamUI.getTeamContentProviderManager().removePropertyChangeListener(this); + getConfiguration().removePropertyChangeListener(this); actionService.dispose(); super.dispose(); } @@ -322,7 +343,9 @@ public class CommonViewerAdvisor extends AbstractTreeViewerAdvisor implements IN public void propertyChange(PropertyChangeEvent event) { if (event.getProperty().equals(ITeamContentProviderManager.PROP_ENABLED_MODEL_PROVIDERS)) { - enableContentProviders((CommonViewer)getViewer(), getScope(getConfiguration())); + enableContentProviders((CommonViewer)getViewer(), getConfiguration()); + } else if (event.getProperty().equals(ModelSynchronizeParticipant.P_VISIBLE_MODEL_PROVIDER)) { + enableContentProviders((CommonViewer)getViewer(), getConfiguration()); } } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DiffTreeChangesSection.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DiffTreeChangesSection.java index 54d9e425b..d7cd618eb 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DiffTreeChangesSection.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/DiffTreeChangesSection.java @@ -94,7 +94,12 @@ public class DiffTreeChangesSection extends ForwardingChangesSection implements private boolean hasChangesFor(String id, ISynchronizationCompareAdapter adapter, ISynchronizationContext context, int[] states, int mask) { ResourceTraversal[] traversals = context.getScope().getTraversals(id); - return context.getDiffTree().hasMatchingDiffs(traversals, FastDiffFilter.getStateFilter(states, mask)); + if (context.getDiffTree().hasMatchingDiffs(traversals, FastDiffFilter.getStateFilter(states, mask))) + return true; + // Return true if there are no traversals to accommodate change sets + if (traversals.length == 0) + return true; + return false; } protected long getVisibleChangesCount() { diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ModelSelectionDropDownAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ModelSelectionDropDownAction.java index 196f2b7b4..d020625cf 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ModelSelectionDropDownAction.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ModelSelectionDropDownAction.java @@ -48,7 +48,7 @@ public class ModelSelectionDropDownAction extends Action implements IMenuCreator this.configuration.addPropertyChangeListener(listener); TeamUI.getTeamContentProviderManager().addPropertyChangeListener(listener); getSynchronizationContext().getScope().addScopeChangeListener(this); - showAllAction = new Action(TeamUIMessages.ModelSelectionDropDownAction_0) { + showAllAction = new Action(TeamUIMessages.ModelSelectionDropDownAction_0, IAction.AS_RADIO_BUTTON) { public void run() { Viewer v = ModelSelectionDropDownAction.this.configuration.getPage().getViewer(); v.setInput(getSynchronizationContext()); @@ -86,6 +86,7 @@ public class ModelSelectionDropDownAction extends Action implements IMenuCreator menuManager = new MenuManager(); fMenu = menuManager.createContextMenu(parent); menuManager.add(showAllAction); + showAllAction.setChecked(getActiveProviderId().equals(ModelSynchronizeParticipant.ALL_MODEL_PROVIDERS_VISIBLE)); ModelProvider[] modelProviders = getEnabledModelProviders(); if (modelProviders.length > 0) menuManager.add(new Separator()); @@ -157,6 +158,7 @@ public class ModelSelectionDropDownAction extends Action implements IMenuCreator setToolTipText(text); setText(text); if (menuManager != null) { + showAllAction.setChecked(getActiveProviderId().equals(ModelSynchronizeParticipant.ALL_MODEL_PROVIDERS_VISIBLE)); IContributionItem[] items = menuManager.getItems(); for (int i = 0; i < items.length; i++) { IContributionItem item = items[i]; diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelActionProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelActionProvider.java index 3dc3ef6ff..d6f562e10 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelActionProvider.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelActionProvider.java @@ -49,7 +49,7 @@ public class ResourceModelActionProvider extends SynchronizationActionProvider { (ISynchronizePageConfiguration)getExtensionStateModel().getProperty(ITeamContentProviderManager.P_SYNCHRONIZATION_PAGE_CONFIGURATION)); registerHandler(MARK_AS_MERGE_ACTION_ID, markAsMergedHandler); - ICommonViewerSite cvs = getExtensionSite().getViewSite(); + ICommonViewerSite cvs = getActionSite().getViewSite(); ISynchronizePageConfiguration configuration = getSynchronizePageConfiguration(); if (cvs instanceof ICommonViewerWorkbenchSite && configuration != null) { ICommonViewerWorkbenchSite cvws = (ICommonViewerWorkbenchSite) cvs; diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelContentProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelContentProvider.java index 2100d15e7..7b5544a02 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelContentProvider.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelContentProvider.java @@ -127,24 +127,29 @@ public class ResourceModelContentProvider extends SynchronizationContentProvider IResource resource = (IResource) parent; if (!resource.isAccessible()) return new Object[0]; - Object[] allChildren; - if (getLayout().equals(IPreferenceIds.FLAT_LAYOUT) && resource.getType() == IResource.PROJECT) { - allChildren = getFlatChildren(context, resource); - } else if (getLayout().equals(IPreferenceIds.COMPRESSED_LAYOUT) && resource.getType() == IResource.PROJECT) { - allChildren = getCompressedChildren(context, (IProject)resource, children); - } else if (getLayout().equals(IPreferenceIds.COMPRESSED_LAYOUT) && resource.getType() == IResource.FOLDER) { - allChildren = getCompressedChildren(context, (IFolder)resource, children); - } else { - allChildren = getTreeChildren(context, resource, children); - } + IResourceDiffTree diffTree = context.getDiffTree(); + Object[] allChildren = filterChildren(diffTree, resource, children); return super.getChildrenInContext(context, parent, allChildren); } return super.getChildrenInContext(context, parent, children); } - private Object[] getCompressedChildren(ISynchronizationContext context, IProject project, Object[] children) { + protected Object[] filterChildren(IResourceDiffTree diffTree, IResource resource, Object[] children) { + Object[] allChildren; + if (getLayout().equals(IPreferenceIds.FLAT_LAYOUT) && resource.getType() == IResource.PROJECT) { + allChildren = getFlatChildren(diffTree, resource); + } else if (getLayout().equals(IPreferenceIds.COMPRESSED_LAYOUT) && resource.getType() == IResource.PROJECT) { + allChildren = getCompressedChildren(diffTree, (IProject)resource, children); + } else if (getLayout().equals(IPreferenceIds.COMPRESSED_LAYOUT) && resource.getType() == IResource.FOLDER) { + allChildren = getCompressedChildren(diffTree, (IFolder)resource, children); + } else { + allChildren = getTreeChildren(diffTree, resource, children); + } + return allChildren; + } + + private Object[] getCompressedChildren(IResourceDiffTree diffTree, IProject project, Object[] children) { Set result = new HashSet(); - IResourceDiffTree diffTree = context.getDiffTree(); IDiff[] diffs = diffTree.getDiffs(project, IResource.DEPTH_INFINITE); for (int i = 0; i < diffs.length; i++) { IDiff diff = diffs[i]; @@ -164,7 +169,7 @@ public class ResourceModelContentProvider extends SynchronizationContentProvider /* * Only return the files that are direct children of the folder */ - private Object[] getCompressedChildren(ISynchronizationContext context, IFolder folder, Object[] children) { + private Object[] getCompressedChildren(IResourceDiffTree diffTree, IFolder folder, Object[] children) { Set result = new HashSet(); for (int i = 0; i < children.length; i++) { Object object = children[i]; @@ -174,7 +179,6 @@ public class ResourceModelContentProvider extends SynchronizationContentProvider result.add(resource); } } - IResourceDiffTree diffTree = context.getDiffTree(); IDiff[] diffs = diffTree.getDiffs(folder, IResource.DEPTH_ONE); for (int i = 0; i < diffs.length; i++) { IDiff diff = diffs[i]; @@ -185,9 +189,8 @@ public class ResourceModelContentProvider extends SynchronizationContentProvider return result.toArray(); } - private Object[] getFlatChildren(ISynchronizationContext context, IResource resource) { + private Object[] getFlatChildren(IResourceDiffTree diffTree, IResource resource) { Object[] allChildren; - IResourceDiffTree diffTree = context.getDiffTree(); IDiff[] diffs = diffTree.getDiffs(resource, IResource.DEPTH_INFINITE); ArrayList result = new ArrayList(); for (int i = 0; i < diffs.length; i++) { @@ -198,16 +201,16 @@ public class ResourceModelContentProvider extends SynchronizationContentProvider return allChildren; } - private Object[] getTreeChildren(ISynchronizationContext context, IResource resource, Object[] children) { + private Object[] getTreeChildren(IResourceDiffTree diffTree, IResource resource, Object[] children) { Set result = new HashSet(); for (int i = 0; i < children.length; i++) { Object object = children[i]; result.add(object); } - IPath[] childPaths = context.getDiffTree().getChildren(resource.getFullPath()); + IPath[] childPaths = diffTree.getChildren(resource.getFullPath()); for (int i = 0; i < childPaths.length; i++) { IPath path = childPaths[i]; - IDiff delta = context.getDiffTree().getDiff(path); + IDiff delta = diffTree.getDiff(path); IResource child; if (delta == null) { // the path has descendent deltas so it must be a folder @@ -217,11 +220,9 @@ public class ResourceModelContentProvider extends SynchronizationContentProvider child = ((IContainer)resource).getFolder(new Path(path.lastSegment())); } } else { - child = context.getDiffTree().getResource(delta); - } - if (isInScope(context.getScope(), resource, child)) { - result.add(child); + child = diffTree.getResource(delta); } + result.add(child); } Object[] allChildren = result.toArray(new Object[result.size()]); return allChildren; @@ -364,7 +365,7 @@ public class ResourceModelContentProvider extends SynchronizationContentProvider return (StructuredViewer)getViewer(); } - private String getLayout() { + protected String getLayout() { return TeamUIPlugin.getPlugin().getPreferenceStore().getString(IPreferenceIds.SYNCVIEW_DEFAULT_LAYOUT); } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/TeamViewerSorter.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/TeamViewerSorter.java index 111dc1ec5..22a0d238a 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/TeamViewerSorter.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/TeamViewerSorter.java @@ -38,7 +38,7 @@ public class TeamViewerSorter extends TreePathViewerSorter { } public int compare(Viewer viewer, TreePath parentPath, Object e1, Object e2) { - if (parentPath.getSegmentCount() == 0) { + if (parentPath == null || parentPath.getSegmentCount() == 0) { // We need to handle the sorting at the top level int cat1 = category(e1); int cat2 = category(e2); diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizePageConfiguration.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizePageConfiguration.java index 979b1a67a..110cdaae9 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizePageConfiguration.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizePageConfiguration.java @@ -70,14 +70,14 @@ public class SynchronizePageConfiguration extends SynchronizePageActionGroup imp /** * Property that gives access to a set the - * contains all out-of-sync resources for the particpant + * contains all out-of-sync resources for the participant * in the selected working set. */ public static final String P_WORKING_SET_SYNC_INFO_SET = TeamUIPlugin.ID + ".P_WORKING_SET_SYNC_INFO_SET"; //$NON-NLS-1$ /** * Property that gives access to a set the - * contains all out-of-sync resources for the particpant + * contains all out-of-sync resources for the participant * before any filtering (working set or modes) is applied. */ public static final String P_PARTICIPANT_SYNC_INFO_SET = TeamUIPlugin.ID + ".P_PARTICIPANT_SYNC_INFO_SET"; //$NON-NLS-1$ @@ -111,8 +111,8 @@ public class SynchronizePageConfiguration extends SynchronizePageActionGroup imp private IRunnableContext context; /** - * Create a configuration for creating a page from the given particpant. - * @param participant the particpant whose page is being configured + * Create a configuration for creating a page from the given participant. + * @param participant the participant whose page is being configured */ public SynchronizePageConfiguration(ISynchronizeParticipant participant) { this.participant = participant; @@ -224,7 +224,7 @@ public class SynchronizePageConfiguration extends SynchronizePageActionGroup imp final PropertyChangeEvent event = new PropertyChangeEvent(this, key, oldValue, newValue); for (int i = 0; i < listeners.length; i++) { final IPropertyChangeListener listener = (IPropertyChangeListener)listeners[i]; - Platform.run(new ISafeRunnable() { + SafeRunner.run(new ISafeRunnable() { public void handleException(Throwable exception) { // Error is logged by platform } @@ -252,7 +252,7 @@ public class SynchronizePageConfiguration extends SynchronizePageActionGroup imp } for (int i= 0; i < listeners.length; i++) { final SynchronizePageActionGroup contribution = (SynchronizePageActionGroup)listeners[i]; - Platform.run(new ISafeRunnable() { + SafeRunner.run(new ISafeRunnable() { public void handleException(Throwable exception) { // Logged by Platform } @@ -274,7 +274,7 @@ public class SynchronizePageConfiguration extends SynchronizePageActionGroup imp } for (int i= 0; i < listeners.length; i++) { final SynchronizePageActionGroup contribution = (SynchronizePageActionGroup)listeners[i]; - Platform.run(new ISafeRunnable() { + SafeRunner.run(new ISafeRunnable() { public void handleException(Throwable exception) { // Logged by Platform } @@ -297,7 +297,7 @@ public class SynchronizePageConfiguration extends SynchronizePageActionGroup imp } for (int i= 0; i < listeners.length; i++) { final SynchronizePageActionGroup contribution = (SynchronizePageActionGroup)listeners[i]; - Platform.run(new ISafeRunnable() { + SafeRunner.run(new ISafeRunnable() { public void handleException(Throwable exception) { // Logged by Platform } @@ -309,7 +309,7 @@ public class SynchronizePageConfiguration extends SynchronizePageActionGroup imp } /** - * Callback invoked from the page to fil the action bars. + * Callback invoked from the page to fill the action bars. * @param actionBars the action bars of the view */ public void fillActionBars(final IActionBars actionBars) { @@ -322,7 +322,7 @@ public class SynchronizePageConfiguration extends SynchronizePageActionGroup imp } for (int i= 0; i < listeners.length; i++) { final SynchronizePageActionGroup contribution = (SynchronizePageActionGroup)listeners[i]; - Platform.run(new ISafeRunnable() { + SafeRunner.run(new ISafeRunnable() { public void handleException(Throwable exception) { // Logged by Platform } @@ -343,7 +343,7 @@ public class SynchronizePageConfiguration extends SynchronizePageActionGroup imp } for (int i= 0; i < listeners.length; i++) { final SynchronizePageActionGroup contribution = (SynchronizePageActionGroup)listeners[i]; - Platform.run(new ISafeRunnable() { + SafeRunner.run(new ISafeRunnable() { public void handleException(Throwable exception) { // Logged by Platform } @@ -364,7 +364,7 @@ public class SynchronizePageConfiguration extends SynchronizePageActionGroup imp } for (int i= 0; i < listeners.length; i++) { final SynchronizePageActionGroup contribution = (SynchronizePageActionGroup)listeners[i]; - Platform.run(new ISafeRunnable() { + SafeRunner.run(new ISafeRunnable() { public void handleException(Throwable exception) { // Logged by Platform } @@ -387,7 +387,7 @@ public class SynchronizePageConfiguration extends SynchronizePageActionGroup imp } for (int i= 0; i < listeners.length; i++) { final SynchronizePageActionGroup contribution = (SynchronizePageActionGroup)listeners[i]; - Platform.run(new ISafeRunnable() { + SafeRunner.run(new ISafeRunnable() { public void handleException(Throwable exception) { // Logged by Platform } diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/SynchronizationActionProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/SynchronizationActionProvider.java index 4207cd904..732bc73f5 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/SynchronizationActionProvider.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/mapping/SynchronizationActionProvider.java @@ -63,10 +63,9 @@ public class SynchronizationActionProvider extends CommonActionProvider { private Map handlers = new HashMap(); private OpenWithActionGroup openWithActions; - private ICommonActionExtensionSite site; public void init(ICommonActionExtensionSite site) { - this.site = site; + super.init(site); initialize(); } @@ -93,7 +92,7 @@ public class SynchronizationActionProvider extends CommonActionProvider { * */ protected void initializeOpenActions() { - ICommonViewerSite cvs = site.getViewSite(); + ICommonViewerSite cvs = getActionSite().getViewSite(); ISynchronizePageConfiguration configuration = getSynchronizePageConfiguration(); if (cvs instanceof ICommonViewerWorkbenchSite && configuration != null) { ICommonViewerWorkbenchSite cvws = (ICommonViewerWorkbenchSite) cvs; @@ -121,7 +120,7 @@ public class SynchronizationActionProvider extends CommonActionProvider { * action provider */ protected final IExtensionStateModel getExtensionStateModel() { - return site.getExtensionStateModel(); + return getActionSite().getExtensionStateModel(); } /** @@ -198,10 +197,11 @@ public class SynchronizationActionProvider extends CommonActionProvider { /** * Return the extension site for this action provider. + * This method just calls {@link #getActionSite()}. * @return the extension site for this action provider */ public ICommonActionExtensionSite getExtensionSite() { - return site; + return getActionSite(); } } |