finished, ready to merge into HEAD
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CVSAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CVSAction.java index 3f6b7a3..cd285ae 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CVSAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CVSAction.java
@@ -12,6 +12,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; @@ -422,10 +423,11 @@ /** * A helper prompt condition for prompting for CVS dirty state. */ - public static IPromptCondition getOverwriteLocalChangesPrompt(final List dirtyResources) { + public static IPromptCondition getOverwriteLocalChangesPrompt(final IResource[] dirtyResources) { return new IPromptCondition() { + List resources = Arrays.asList(dirtyResources); public boolean needsPrompt(IResource resource) { - return dirtyResources.contains(resource); + return resources.contains(resource); } public String promptMessage(IResource resource) { return Policy.bind("ReplaceWithAction.localChanges", resource.getName());//$NON-NLS-1$
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithRemoteAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithRemoteAction.java index 825d8f0..230f658 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithRemoteAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithRemoteAction.java
@@ -11,7 +11,6 @@ package org.eclipse.team.internal.ccvs.ui.actions; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; @@ -25,10 +24,10 @@ import org.eclipse.team.internal.ccvs.core.CVSException; import org.eclipse.team.internal.ccvs.core.CVSTeamProvider; import org.eclipse.team.internal.ccvs.core.ICVSResource; -import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; import org.eclipse.team.internal.ccvs.ui.Policy; -import org.eclipse.team.internal.ui.PromptingDialog; +import org.eclipse.team.internal.core.InfiniteSubProgressMonitor; +import org.eclipse.team.internal.ui.IPromptCondition; import org.eclipse.ui.actions.WorkspaceModifyOperation; public class ReplaceWithRemoteAction extends WorkspaceAction { @@ -37,21 +36,11 @@ run(new WorkspaceModifyOperation() { public void execute(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException { try { - - IResource resources[] = checkOverwriteOfDirtyResources(getSelectedResources()); - - // Do the replace - Hashtable table = getProviderMapping(resources); - Set keySet = table.keySet(); - monitor.beginTask(null, keySet.size() * 1000); //$NON-NLS-1$ - monitor.setTaskName(Policy.bind("ReplaceWithRemoteAction.replacing")); //$NON-NLS-1$ - Iterator iterator = keySet.iterator(); - while (iterator.hasNext()) { - IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1000); - CVSTeamProvider provider = (CVSTeamProvider)iterator.next(); - List list = (List)table.get(provider); - IResource[] providerResources = (IResource[])list.toArray(new IResource[list.size()]); - provider.get(providerResources, IResource.DEPTH_INFINITE, subMonitor); + monitor = Policy.monitorFor(monitor); + monitor.beginTask(null, 100); + IResource resources[] = checkOverwriteOfDirtyResources(getSelectedResources(), new InfiniteSubProgressMonitor(monitor, 20)); + if(resources.length > 0) { + performReplace(resources, Policy.subMonitorFor(monitor, 80)); } } catch (TeamException e) { throw new InvocationTargetException(e); @@ -59,34 +48,32 @@ monitor.done(); } } - - }, true /* cancelable */, PROGRESS_DIALOG); } - private IResource[] checkOverwriteOfDirtyResources(IResource[] resources, IProgressMonitor monitor) throws CVSException, InterruptedException { - List dirtyResources = new ArrayList(); - IResource[] selectedResources = getSelectedResources(); - + private void performReplace(IResource[] resources, IProgressMonitor monitor) throws TeamException { try { - monitor = Policy.monitorFor(monitor); - monitor.beginTask(null, selectedResources.length * 1000); - for (int i = 0; i < selectedResources.length; i++) { - IResource resource = selectedResources[i]; - ICVSResource cvsResource = CVSWorkspaceRoot.getCVSResourceFor(resource); - if(cvsResource.isModified(Policy.subMonitorFor(monitor, 1000))) { - dirtyResources.add(resource); - } + Hashtable table = getProviderMapping(resources); + Set keySet = table.keySet(); + monitor.beginTask(null, keySet.size() * 10); //$NON-NLS-1$ + monitor.setTaskName(Policy.bind("ReplaceWithRemoteAction.replacing")); //$NON-NLS-1$ + Iterator iterator = keySet.iterator(); + while (iterator.hasNext()) { + IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 10); + CVSTeamProvider provider = (CVSTeamProvider)iterator.next(); + List list = (List)table.get(provider); + IResource[] providerResources = (IResource[])list.toArray(new IResource[list.size()]); + provider.get(providerResources, IResource.DEPTH_INFINITE, subMonitor); } } finally { - monitor.done(); + monitor.done(); } - - PromptingDialog dialog = new PromptingDialog(getShell(), selectedResources, - getOverwriteLocalChangesPrompt(dirtyResources), Policy.bind("ReplaceWithAction.confirmOverwrite"));//$NON-NLS-1$ - return dialog.promptForMultiple(); } + protected IPromptCondition getPromptCondition(IResource[] dirtyResources) { + return getOverwriteLocalChangesPrompt(dirtyResources); + } + /** * @see org.eclipse.team.internal.ccvs.ui.actions.CVSAction#getErrorTitle() */
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithTagAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithTagAction.java index 9aa1f68..89107d2 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithTagAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithTagAction.java
@@ -50,10 +50,16 @@ // Show a busy cursor while display the tag selection dialog run(new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException { - PromptingDialog prompt = new PromptingDialog(getShell(), getSelectedResources(), - getOverwriteLocalChangesPrompt(), - Policy.bind("ReplaceWithAction.confirmOverwrite"));//$NON-NLS-1$ - final IResource[] resources = prompt.promptForMultiple(); + + IResource[] resources; + try { + resources = + checkOverwriteOfDirtyResources( + getSelectedResources(), + null /* no progress just a busy cursor for now */); + } catch (CVSException e) { + throw new InvocationTargetException(e); + } if(resources.length == 0) { // nothing to do return;
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java index 46767f1..809a193 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java
@@ -46,6 +46,7 @@ import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo; import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo; import org.eclipse.team.internal.ccvs.ui.Policy; +import org.eclipse.team.internal.ui.PromptingDialog; /** * This class represents an action performed on a local CVS workspace @@ -522,4 +523,28 @@ return Policy.bind("ReplaceWithLatestAction.multipleTags"); //$NON-NLS-1$ } } + + protected IResource[] checkOverwriteOfDirtyResources(IResource[] resources, IProgressMonitor monitor) throws CVSException, InterruptedException { + List dirtyResources = new ArrayList(); + IResource[] selectedResources = getSelectedResources(); + + try { + monitor = Policy.monitorFor(monitor); + monitor.beginTask(null, selectedResources.length * 100); + monitor.setTaskName(Policy.bind("ReplaceWithAction.calculatingDirtyResources")); //$NON-NLS-1$ + for (int i = 0; i < selectedResources.length; i++) { + IResource resource = selectedResources[i]; + ICVSResource cvsResource = CVSWorkspaceRoot.getCVSResourceFor(resource); + if(cvsResource.isModified(Policy.subMonitorFor(monitor, 100))) { + dirtyResources.add(resource); + } + } + } finally { + monitor.done(); + } + + PromptingDialog dialog = new PromptingDialog(getShell(), selectedResources, + getOverwriteLocalChangesPrompt((IResource[]) dirtyResources.toArray(new IResource[dirtyResources.size()])), Policy.bind("ReplaceWithAction.confirmOverwrite"));//$NON-NLS-1$ + return dialog.promptForMultiple(); + } }
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties index 35acdf3..f399527 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties
@@ -438,6 +438,7 @@ ReplaceWithAction.confirmOverwrite=Confirm Overwrite ReplaceWithAction.localChanges={0} has local changes which you are about to overwrite. Do you wish to overwrite? +ReplaceWithAction.calculatingDirtyResources=Finding outgoing changes... ReplaceWithLatestAction.multipleTags=&Latest from Repository ReplaceWithLatestAction.multipleVersions=&Versions from Repository
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/CVSUITestCase.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/CVSUITestCase.java index db00ef6..02c9098 100644 --- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/CVSUITestCase.java +++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/CVSUITestCase.java
@@ -164,7 +164,7 @@ */ protected void actionReplaceWithRemote(IResource[] resources) { ReplaceWithRemoteAction action = new ReplaceWithRemoteAction() { - protected IPromptCondition getPromptCondition() { + protected IPromptCondition getPromptCondition(IResource[] resources) { return new DummyPromptCondition(); } }; @@ -215,7 +215,7 @@ protected String promptForTag(ICVSFolder folder) { return name; } - protected IPromptCondition getPromptCondition() { + protected IPromptCondition getPromptCondition(IResource[] resources) { return new DummyPromptCondition(); } };