package bndtools.utils; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.jface.operation.IRunnableWithProgress; public class CompositeTask implements IRunnableWithProgress { private final List<IRunnableWithProgress> tasks = new ArrayList<IRunnableWithProgress>(); private final List<Integer> weights = new ArrayList<Integer>(); private int totalWeight = 0; public void addTask(IRunnableWithProgress task, int weight) { tasks.add(task); weights.add(weight); totalWeight += weight; } public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { SubMonitor progress = SubMonitor.convert(monitor, "Composite Task...", totalWeight); for (int i = 0; i < tasks.size(); i++) { tasks.get(i).run(progress.newChild(weights.get(i), SubMonitor.SUPPRESS_NONE)); if (progress.isCanceled()) return; } } }