Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java65
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.
*/

Back to the top