blob: c1f0f30880918cd0bbc0fe7c8bfe996056304516 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2009 EclipseSource and others. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* EclipseSource - initial API and implementation
******************************************************************************/
package org.eclipse.equinox.concurrent.future;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ProgressMonitorWrapper;
/**
* Progress Monitor for use with future. This progress monitor provides a wrapper
* for potentially two progress monitors: one provided by the {@link IFuture}
* client in a method call, the other (a child progress monitor) provided by the
* IExecutor that creates the future instance.
*
*/
public class FutureProgressMonitor extends ProgressMonitorWrapper {
private IProgressMonitor monitor;
private Object lock = new Object();
/**
* Create a new progress monitor wrappering the given monitor. The nested
* monitor is the one exposed to clients of futures.
* @param progressMonitor the client-facing monitor used with a future. May be <code>null</code>.
*
* @see #setChildProgressMonitor(IProgressMonitor)
*/
public FutureProgressMonitor(IProgressMonitor progressMonitor) {
super(progressMonitor);
}
public void beginTask(String name, int totalWork) {
super.beginTask(name, totalWork);
synchronized (lock) {
if (monitor != null)
monitor.beginTask(name, totalWork);
}
}
public void done() {
super.done();
synchronized (lock) {
monitor.done();
monitor = null;
}
}
public void internalWorked(double work) {
super.internalWorked(work);
synchronized (lock) {
if (monitor != null)
monitor.internalWorked(work);
}
}
public void setCanceled(boolean value) {
super.setCanceled(value);
synchronized (lock) {
if (monitor != null)
monitor.setCanceled(value);
}
}
public void setTaskName(String name) {
super.setTaskName(name);
synchronized (lock) {
if (monitor != null)
monitor.setTaskName(name);
}
}
public void subTask(String name) {
super.subTask(name);
synchronized (lock) {
if (monitor != null)
monitor.subTask(name);
}
}
public void worked(int work) {
super.worked(work);
synchronized (lock) {
if (monitor != null)
monitor.worked(work);
}
}
/**
* Set the client-facing progress monitor to the given value.
*
* @param value a second (child) monitor to report progress/take cancelation from.
* If the parent progress monitor has been previously canceled, the child progress monitor's
* setCanceled method will be called.
*/
public void setChildProgressMonitor(IProgressMonitor value) {
synchronized (lock) {
this.monitor = value;
if (monitor != null && isCanceled())
this.monitor.setCanceled(true);
}
}
}