blob: cf335d43cc0f1aeda06fb03192d89161b62aa519 [file] [log] [blame]
package org.eclipse.update.internal.ui.search;
import org.eclipse.core.runtime.IProgressMonitor;
import java.util.*;
import org.eclipse.swt.widgets.Display;
public class BackgroundProgressMonitor implements IProgressMonitor {
private Vector monitors=new Vector();
private boolean canceled=false;
private String taskName;
private String subTaskName;
private int totalWorked=0;
private int taskCount;
private boolean inProgress;
private Display display;
public void setDisplay(Display display) {
this.display = display;
}
public Display getDisplay() {
return display;
}
public void addProgressMonitor(final IProgressMonitor monitor) {
if (monitors.contains(monitor)==false) {
monitors.add(monitor);
if (inProgress && display!=null) {
display.asyncExec(new Runnable() {
public void run() {
// we are late - catch up
monitor.beginTask(taskName, taskCount);
monitor.worked(totalWorked);
if (subTaskName!=null)
monitor.subTask(subTaskName);
}
});
}
}
}
public void removeProgressMonitor(IProgressMonitor monitor) {
if (monitors.contains(monitor))
monitors.remove(monitor);
}
/**
* @see IProgressMonitor#beginTask(String, int)
*/
public void beginTask(final String taskName, final int count) {
totalWorked = 0;
taskCount = count;
this.taskName = taskName;
subTaskName = null;
canceled = false;
display.asyncExec(new Runnable() {
public void run() {
for (Iterator iter=monitors.iterator(); iter.hasNext();) {
IProgressMonitor m = (IProgressMonitor)iter.next();
m.beginTask(taskName, count);
}
}
});
}
/**
* @see IProgressMonitor#done()
*/
public void done() {
final Vector safeMonitors = (Vector)monitors.clone();
display.asyncExec(new Runnable() {
public void run() {
for (Iterator iter=safeMonitors.iterator(); iter.hasNext();) {
IProgressMonitor m = (IProgressMonitor)iter.next();
m.done();
}
inProgress = false;
}
});
}
/**
* @see IProgressMonitor#internalWorked(double)
*/
public void internalWorked(double arg0) {
}
/**
* @see IProgressMonitor#isCanceled()
*/
public boolean isCanceled() {
return canceled;
}
/**
* @see IProgressMonitor#setCanceled(boolean)
*/
public void setCanceled(final boolean canceled) {
display.asyncExec(new Runnable() {
public void run() {
for (Iterator iter=monitors.iterator(); iter.hasNext();) {
IProgressMonitor m = (IProgressMonitor)iter.next();
m.setCanceled(canceled);
}
BackgroundProgressMonitor.this.canceled = canceled;
}
});
}
/**
* @see IProgressMonitor#setTaskName(String)
*/
public void setTaskName(final String name) {
display.asyncExec(new Runnable() {
public void run() {
for (Iterator iter=monitors.iterator(); iter.hasNext();) {
IProgressMonitor m = (IProgressMonitor)iter.next();
m.setTaskName(name);
}
BackgroundProgressMonitor.this.taskName = name;
}
});
}
/**
* @see IProgressMonitor#subTask(String)
*/
public void subTask(final String name) {
subTaskName = name;
display.asyncExec(new Runnable() {
public void run() {
for (Iterator iter=monitors.iterator(); iter.hasNext();) {
IProgressMonitor m = (IProgressMonitor)iter.next();
m.subTask(name);
}
}
});
}
/**
* @see IProgressMonitor#worked(int)
*/
public void worked(final int amount) {
totalWorked += amount;
display.asyncExec(new Runnable() {
public void run() {
for (Iterator iter=monitors.iterator(); iter.hasNext();) {
IProgressMonitor m = (IProgressMonitor)iter.next();
m.worked(amount);
}
}
});
}
}