blob: 56f1d94f803affbc6981ca551d6c237ce3533150 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2011 Tasktop Technologies 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:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.commons.core;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ProgressMonitorWrapper;
/**
* Delegates to all attached monitors.
*
* @author Steffen Pingel
* @author Thomas Ehrnhoefer
* @author Robert Elves
* @since 3.2
*/
public class DelegatingProgressMonitor implements IDelegatingProgressMonitor {
/**
* Returns the parent delegating progress monitor of <code>monitor</code>.
*
* @param monitor
* the child monitor
* @return the monitor; null, if none
* @since 3.5
*/
public static IDelegatingProgressMonitor getMonitorFrom(IProgressMonitor monitor) {
if (monitor == null) {
return null;
} else if (monitor instanceof IDelegatingProgressMonitor) {
return (IDelegatingProgressMonitor) monitor;
} else if (monitor instanceof ProgressMonitorWrapper) {
return getMonitorFrom(((ProgressMonitorWrapper) monitor).getWrappedProgressMonitor());
}
return null;
}
private boolean calledBeginTask;
private boolean canceled;
private Object data;
private boolean done;
private double internalWorked;
private final List<IProgressMonitor> monitors;
private String subTaskName;
private String taskName;
private int totalWork;
private int worked;
public DelegatingProgressMonitor() {
monitors = new CopyOnWriteArrayList<IProgressMonitor>();
}
public void attach(IProgressMonitor monitor) {
Assert.isNotNull(monitor);
if (calledBeginTask) {
monitor.beginTask(taskName, totalWork);
}
if (taskName != null) {
monitor.setTaskName(taskName);
}
if (subTaskName != null) {
monitor.subTask(subTaskName);
}
if (worked > 0) {
monitor.worked(worked);
}
if (internalWorked > 0) {
monitor.internalWorked(internalWorked);
}
if (canceled) {
monitor.setCanceled(canceled);
}
if (done) {
monitor.done();
}
monitors.add(monitor);
}
public void beginTask(String name, int totalWork) {
if (!calledBeginTask) {
this.taskName = name;
this.totalWork = totalWork;
this.calledBeginTask = true;
}
for (IProgressMonitor monitor : monitors) {
monitor.beginTask(name, totalWork);
}
}
public void detach(IProgressMonitor monitor) {
monitors.remove(monitor);
}
public void done() {
this.done = true;
for (IProgressMonitor monitor : monitors) {
monitor.done();
}
}
/**
* @see IDelegatingProgressMonitor#getData()
* @since 3.5
*/
public Object getData() {
return data;
}
public void internalWorked(double work) {
this.internalWorked += work;
for (IProgressMonitor monitor : monitors) {
monitor.internalWorked(work);
}
}
public boolean isCanceled() {
boolean canceled = false;
for (IProgressMonitor monitor : monitors) {
canceled |= monitor.isCanceled();
}
if (canceled) {
setCanceled(canceled);
}
return canceled;
}
public void setCanceled(boolean value) {
this.canceled = value;
for (IProgressMonitor monitor : monitors) {
monitor.setCanceled(value);
}
}
/**
* @see IDelegatingProgressMonitor#setData()
* @since 3.5
*/
public void setData(Object o) {
this.data = o;
}
public void setTaskName(String name) {
this.taskName = name;
for (IProgressMonitor monitor : monitors) {
monitor.setTaskName(name);
}
}
public void subTask(String name) {
this.subTaskName = name;
for (IProgressMonitor monitor : monitors) {
monitor.subTask(name);
}
}
public void worked(int work) {
this.worked += work;
for (IProgressMonitor monitor : monitors) {
monitor.worked(work);
}
}
}