diff options
Diffstat (limited to 'bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSubscriberAction.java')
-rw-r--r-- | bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSubscriberAction.java | 65 |
1 files changed, 60 insertions, 5 deletions
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSubscriberAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSubscriberAction.java index 8b39aff2e..c962b4fd8 100644 --- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSubscriberAction.java +++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSubscriberAction.java @@ -12,14 +12,18 @@ package org.eclipse.team.internal.ccvs.ui.subscriber; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.jobs.ISchedulingRule; +import org.eclipse.core.runtime.jobs.MultiRule; import org.eclipse.jface.action.IAction; -import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.team.core.TeamException; import org.eclipse.team.core.subscribers.SyncInfo; @@ -31,10 +35,13 @@ import org.eclipse.team.internal.ccvs.core.ICVSRunnable; import org.eclipse.team.internal.ccvs.core.client.PruneFolderVisitor; import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot; import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; +import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants; import org.eclipse.team.internal.ccvs.ui.Policy; +import org.eclipse.team.internal.ccvs.ui.operations.CVSBlockingRunnableContext; +import org.eclipse.team.internal.ccvs.ui.operations.CVSSubscriberNonblockingContext; +import org.eclipse.team.internal.ccvs.ui.operations.ICVSRunnableContext; import org.eclipse.team.ui.sync.SubscriberAction; import org.eclipse.team.ui.sync.SyncInfoSet; -import org.eclipse.ui.PlatformUI; public abstract class CVSSubscriberAction extends SubscriberAction { @@ -117,7 +124,7 @@ public abstract class CVSSubscriberAction extends SubscriberAction { SyncInfoSet syncSet = getFilteredSyncInfoSet(getFilteredSyncInfos()); if (syncSet == null || syncSet.isEmpty()) return; try { - getRunnableContext().run(true /* fork */, true /* cancelable */, getRunnable(syncSet)); + getCVSRunnableContext().run(getJobName(syncSet), getSchedulingRule(syncSet), true, getRunnable(syncSet)); } catch (InvocationTargetException e) { handle(e); } catch (InterruptedException e) { @@ -156,10 +163,58 @@ public abstract class CVSSubscriberAction extends SubscriberAction { protected abstract void run(SyncInfoSet syncSet, IProgressMonitor monitor) throws TeamException; - protected IRunnableContext getRunnableContext() { - return PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + /* + * Return the ICVSRunnableContext which will be used to run the operation. + */ + private ICVSRunnableContext getCVSRunnableContext() { + if (canRunAsJob() && areJobsEnabled()) { + return new CVSSubscriberNonblockingContext(); + } else { + return new CVSBlockingRunnableContext(shell); + } } + protected boolean areJobsEnabled() { + return CVSUIPlugin.getPlugin().getPreferenceStore().getBoolean(ICVSUIConstants.BACKGROUND_OPERATIONS); + } + + /** + * Return the job name to be used if the action can run as a job. + * + * @param syncSet + * @return + */ + protected String getJobName(SyncInfoSet syncSet) { + return Policy.bind("CVSSubscriberAction.jobName", new Integer(syncSet.size()).toString()); //$NON-NLS-1$ + } + + /** + * Return a scheduling rule that includes all resources that will be operated + * on by the subscriber action. The default behavior is to include all projects + * effected by the operation. Subclasses may override. + * + * @param syncSet + * @return + */ + protected ISchedulingRule getSchedulingRule(SyncInfoSet syncSet) { + IResource[] resources = syncSet.getResources(); + Set set = new HashSet(); + for (int i = 0; i < resources.length; i++) { + IResource resource = resources[i]; + set.add(resource.getProject()); + } + IProject[] projects = (IProject[]) set.toArray(new IProject[set.size()]); + if (projects.length == 1) { + return projects[0]; + } else { + return new MultiRule(projects); + } + } + + protected boolean canRunAsJob() { + return true; + } + /** * Filter the sync resource set using action specific criteria or input from the user. */ |