*** empty log message ***
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIPlugin.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIPlugin.java index 6d49acf..c1ff81d 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIPlugin.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIPlugin.java
@@ -32,7 +32,6 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.team.internal.ui.jobs.RefreshSubscriberInputJob; import org.eclipse.team.internal.ui.jobs.RefreshSubscriberJob; -import org.eclipse.team.internal.ui.jobs.ViewFeedbackManager; import org.eclipse.team.internal.ui.sync.actions.SyncViewerDirectionFilters; import org.eclipse.team.internal.ui.sync.views.SyncViewerTableSorter; import org.eclipse.team.ui.ISharedImages; @@ -198,7 +197,7 @@ refreshJob.setRestartOnCancel(true); refreshJob.setReschedule(true); // start once the platform has started and stabilized - ViewFeedbackManager.getInstance().schedule(refreshJob, 20000 /* 20 seconds */, SubscriberAction.SUBSCRIBER_JOB_TYPE); + SubscriberAction.getJobStatusHandler().schedule(refreshJob, 20000 /* 20 seconds */); } }
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/jobs/JobStatusHandler.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/jobs/JobStatusHandler.java new file mode 100644 index 0000000..7d05049 --- /dev/null +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/jobs/JobStatusHandler.java
@@ -0,0 +1,134 @@ +/******************************************************************************* + * Copyright (c) 2000, 2003 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.team.internal.ui.jobs; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.eclipse.core.runtime.QualifiedName; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; + +/** + * This class is reponsible for notifying listeners when jobs registered + * with the handler start and stop. Start is invoked when the first registered job starts + * anf finish is invoked when the last registered job finishes. + */ +public class JobStatusHandler { + + private QualifiedName jobType; + private Set jobs = new HashSet(); + private List listeners = new ArrayList(); + + public JobStatusHandler(QualifiedName jobType) { + super(); + this.jobType = jobType; + } + + public void schedule(Job job) { + job.addJobChangeListener(getJobChangeListener()); + // indicate that the job has started since it will be schdulued immediatley + jobStarted(job); + job.schedule(); + } + + public void schedule(Job job, long delay) { + job.addJobChangeListener(getJobChangeListener()); + job.schedule(delay); + } + + private JobChangeAdapter getJobChangeListener() { + return new JobChangeAdapter() { + public void done(IJobChangeEvent event) { + jobDone(event.getJob()); + + } + public void running(IJobChangeEvent event) { + jobStarted(event.getJob()); + } + }; + } + + public void addJobListener(IJobListener listener) { + synchronized (listeners) { + listeners.add(listener); + } + } + public void removeJobListener(IJobListener listener) { + synchronized (listeners) { + listeners.remove(listener); + } + } + + private IJobListener[] getJobListeners() { + synchronized (listeners) { + return (IJobListener[]) listeners.toArray(new IJobListener[listeners.size()]); + } + } + + /* internal use only */ void jobStarted(Job job) { + if (recordJob(job)) { + fireStartNotification(); + } + } + + /* + * Record the job and return true if it's the first job of that type + */ + private boolean recordJob(Job job) { + if (!jobs.add(job)) { + // The job was already in the set. + return false; + } + return jobs.size() == 1; + } + + /* + * Remove the job and return true if it is the last job for the type + */ + private boolean removeJob(Job job) { + if (!jobs.remove(job)) { + // The job wasn't in the list. + return false; + } + return jobs.isEmpty(); + } + + private void fireStartNotification() { + IJobListener[] listenerArray = getJobListeners(); + for (int i = 0; i < listenerArray.length; i++) { + IJobListener listener = listenerArray[i]; + listener.started(jobType); + } + } + + /* internal use only */ void jobDone(Job job) { + if (removeJob(job)) { + fireEndNotification(); + } + } + + private void fireEndNotification() { + IJobListener[] listenerArray = getJobListeners(); + for (int i = 0; i < listenerArray.length; i++) { + IJobListener listener = listenerArray[i]; + listener.finished(jobType); + } + } + + public boolean hasRunningJobs() { + return !jobs.isEmpty(); + } + +}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/jobs/ViewFeedbackManager.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/jobs/ViewFeedbackManager.java deleted file mode 100644 index 40f9e1b..0000000 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/jobs/ViewFeedbackManager.java +++ /dev/null
@@ -1,147 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.team.internal.ui.jobs; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.eclipse.core.runtime.QualifiedName; -import org.eclipse.core.runtime.jobs.IJobChangeEvent; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.core.runtime.jobs.JobChangeAdapter; - -/** - * This class is reponisble for notifying views when jobs that effect - * the contents of the view start and stop - */ -public class ViewFeedbackManager { - - private List listeners = new ArrayList(); - private Map jobTypes = new HashMap(); - - private static ViewFeedbackManager instance; - - public synchronized static ViewFeedbackManager getInstance() { - if (instance == null) { - instance = new ViewFeedbackManager(); - } - return instance; - } - public void schedule(Job job, final QualifiedName jobType) { - job.addJobChangeListener(getJobChangeListener(jobType)); - // indicate that the job has started since it will be schdulued immediatley - jobStarted(job, jobType); - job.schedule(); - } - - public void schedule(Job job, long delay, final QualifiedName jobType) { - job.addJobChangeListener(getJobChangeListener(jobType)); - job.schedule(delay); - } - - private JobChangeAdapter getJobChangeListener(final QualifiedName jobType) { - return new JobChangeAdapter() { - public void done(IJobChangeEvent event) { - jobDone(event.getJob(), jobType); - - } - public void running(IJobChangeEvent event) { - jobStarted(event.getJob(), jobType); - } - }; - } - - public void addJobListener(IJobListener listener) { - synchronized (listeners) { - listeners.add(listener); - } - } - public void removeJobListener(IJobListener listener) { - synchronized (listeners) { - listeners.remove(listener); - } - } - - private IJobListener[] getJobListeners() { - synchronized (listeners) { - return (IJobListener[]) listeners.toArray(new IJobListener[listeners.size()]); - } - } - - /* internal use only */ void jobStarted(Job job, QualifiedName jobType) { - if (recordJob(job, jobType)) { - fireStartNotification(jobType); - } - } - - /* - * Record the job and return true if it's the first job of that type - */ - private boolean recordJob(Job job, QualifiedName jobType) { - Set jobs = (Set)jobTypes.get(jobType); - if (jobs == null) { - jobs = new HashSet(); - jobTypes.put(jobType, jobs); - } - if (!jobs.add(job)) { - // The job was already in the set. Invalid? - return false; - } - return jobs.size() == 1; - } - - /* - * Remove the job and return true if it is the last job for the type - */ - private boolean removeJob(Job job, QualifiedName jobType) { - Set jobs = (Set)jobTypes.get(jobType); - if (jobs == null) { - // TODO: Is this invalid? - return false; - } - if (!jobs.remove(job)) { - // The job wasn't in the list. Probably invalid - return false; - } - return jobs.isEmpty(); - } - - private void fireStartNotification(QualifiedName jobType) { - IJobListener[] listenerArray = getJobListeners(); - for (int i = 0; i < listenerArray.length; i++) { - IJobListener listener = listenerArray[i]; - listener.started(jobType); - } - } - - /* internal use only */ void jobDone(Job job, QualifiedName jobType) { - if (removeJob(job, jobType)) { - fireEndNotification(jobType); - } - } - - private void fireEndNotification(QualifiedName jobType) { - IJobListener[] listenerArray = getJobListeners(); - for (int i = 0; i < listenerArray.length; i++) { - IJobListener listener = listenerArray[i]; - listener.finished(jobType); - } - } - - public boolean hasRunningJobs(QualifiedName jobType) { - Set jobs = (Set)jobTypes.get(jobType); - return jobs != null && !jobs.isEmpty(); - } -}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/RefreshAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/RefreshAction.java index b7151b6..0bcf179 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/RefreshAction.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/actions/RefreshAction.java
@@ -26,7 +26,6 @@ import org.eclipse.team.internal.ui.Utils; import org.eclipse.team.internal.ui.actions.TeamAction; import org.eclipse.team.internal.ui.jobs.RefreshSubscriberJob; -import org.eclipse.team.internal.ui.jobs.ViewFeedbackManager; import org.eclipse.team.internal.ui.sync.sets.SubscriberInput; import org.eclipse.team.internal.ui.sync.views.SynchronizeView; import org.eclipse.team.ui.sync.SubscriberAction; @@ -70,7 +69,7 @@ Platform.getJobManager().cancel(RefreshSubscriberJob.getFamily()); if(TeamUIPlugin.getPlugin().getPreferenceStore().getBoolean(IPreferenceIds.SYNCVIEW_BACKGROUND_SYNC)) { RefreshSubscriberJob job = new RefreshSubscriberJob(Policy.bind("SyncViewRefresh.taskName", new Integer(resources.length).toString(), subscriber.getName()), resources, subscriber); //$NON-NLS-1$ - ViewFeedbackManager.getInstance().schedule(job, SubscriberAction.SUBSCRIBER_JOB_TYPE); + SubscriberAction.getJobStatusHandler().schedule(job); } else { runBlocking(viewer, subscriber, resources); }
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/sets/SubscriberEventHandler.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/sets/SubscriberEventHandler.java index 5390c92..98e1722 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/sets/SubscriberEventHandler.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/sets/SubscriberEventHandler.java
@@ -25,7 +25,6 @@ import org.eclipse.team.internal.core.ExceptionCollector; import org.eclipse.team.internal.ui.Policy; import org.eclipse.team.internal.ui.TeamUIPlugin; -import org.eclipse.team.internal.ui.jobs.ViewFeedbackManager; import org.eclipse.team.ui.sync.SubscriberAction; /** @@ -119,7 +118,7 @@ * Schedule the job or process the events now. */ public void schedule() { - ViewFeedbackManager.getInstance().schedule(eventHandlerJob, SubscriberAction.SUBSCRIBER_JOB_TYPE); + SubscriberAction.getJobStatusHandler().schedule(eventHandlerJob); } /** * Initialize all resources for the subscriber associated with the set. This will basically recalculate
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SynchronizeView.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SynchronizeView.java index cb7d968..b38d05f 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SynchronizeView.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/sync/views/SynchronizeView.java
@@ -66,7 +66,6 @@ import org.eclipse.team.internal.ui.actions.TeamAction; import org.eclipse.team.internal.ui.jobs.IJobListener; import org.eclipse.team.internal.ui.jobs.RefreshSubscriberInputJob; -import org.eclipse.team.internal.ui.jobs.ViewFeedbackManager; import org.eclipse.team.internal.ui.sync.actions.OpenInCompareAction; import org.eclipse.team.internal.ui.sync.actions.RefreshAction; import org.eclipse.team.internal.ui.sync.actions.SyncViewerActions; @@ -139,7 +138,6 @@ */ private IJobListener jobListener = new IJobListener() { public synchronized void started(QualifiedName jobType) { - if (!jobType.equals(SubscriberAction.SUBSCRIBER_JOB_TYPE)) return; Display.getDefault().asyncExec(new Runnable() { public void run() { showBusyCursor(); @@ -148,7 +146,6 @@ } public synchronized void finished(QualifiedName jobType) { - if (!jobType.equals(SubscriberAction.SUBSCRIBER_JOB_TYPE)) return; Display.getDefault().asyncExec(new Runnable() { public void run() { showNormalCursor(); @@ -310,12 +307,13 @@ // Register for feedback from subscriber jobs. // Synchronize so the state doesn't change while setting the cursor synchronized (jobListener) { - ViewFeedbackManager.getInstance().addJobListener(jobListener); - if (ViewFeedbackManager.getInstance().hasRunningJobs(SubscriberAction.SUBSCRIBER_JOB_TYPE)) { + SubscriberAction.getJobStatusHandler().addJobListener(jobListener); + if (SubscriberAction.getJobStatusHandler().hasRunningJobs()) { showBusyCursor(); } } } + protected void initializeActions() { actions = new SyncViewerActions(this); actions.restore(memento); @@ -541,7 +539,7 @@ input.dispose(); } - ViewFeedbackManager.getInstance().removeJobListener(jobListener); + SubscriberAction.getJobStatusHandler().removeJobListener(jobListener); waitCursor.dispose(); }
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/sync/SubscriberAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/sync/SubscriberAction.java index 24d2465..daf4df2 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/sync/SubscriberAction.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/sync/SubscriberAction.java
@@ -22,6 +22,7 @@ import org.eclipse.team.core.subscribers.SyncInfo; import org.eclipse.team.internal.ui.TeamUIPlugin; import org.eclipse.team.internal.ui.actions.TeamAction; +import org.eclipse.team.internal.ui.jobs.JobStatusHandler; /** * This is the abstract superclass for actions associated with a subscriber. @@ -31,6 +32,19 @@ public static final QualifiedName SUBSCRIBER_JOB_TYPE = new QualifiedName(TeamUIPlugin.ID, "subcriber_job"); //$NON-NLS-1$ + private static final JobStatusHandler feedbackManager = new JobStatusHandler(SUBSCRIBER_JOB_TYPE); + + /** + * Return the <code>JobStatusHandler</code> that is used to show busy indication + * in the Synchronize view. Subscribers should use the handler to schedule jobs + * that affect the Synchronize view so that the view shows proper busy indication + * to the user. + * @return the JobStatusHandler linked to the Sychcronize view + */ + public static JobStatusHandler getJobStatusHandler() { + return feedbackManager; + } + /** * This method returns all instances of SynchronizeViewNode that are in the current * selection. For a table view, this is any resource that is directly selected.