Skip to main content
summaryrefslogtreecommitdiffstats
blob: e3e387273aa06b88e8eaa8ea971f69a3d16987c6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.help.internal.search;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import org.eclipse.core.runtime.*;

/**
 * Distributes progress information from this monitor to multiple monitors.
 */
public class ProgressDistributor implements IProgressMonitor {
	private int totalWork = -1;
	private double worked = 0;
	private boolean done = false;
	String taskName;
	String subTaskName;
	/**
	 * Map work indexed by montitor
	 */
	private Collection<IProgressMonitor> monitors = new ArrayList<>();

	/**
	 * @see IProgressMonitor#beginTask(String, int)
	 */
	@Override
	public synchronized void beginTask(String name, int totalWork) {
		this.totalWork = totalWork;
		this.worked = 0;
		this.done = false;
		for (Iterator<IProgressMonitor> it = monitors.iterator(); it.hasNext();) {
			IProgressMonitor m = it.next();
			m.beginTask(name, totalWork);
		}
	}

	/**
	 * @see IProgressMonitor#done()
	 */
	@Override
	public synchronized void done() {
		done = true;
		for (Iterator<IProgressMonitor> it = monitors.iterator(); it.hasNext();) {
			IProgressMonitor m = it.next();
			m.done();
		}
	}

	/**
	 * @see IProgressMonitor#internalWorked(double)
	 */
	@Override
	public void internalWorked(double work) {
		worked += work;
		for (Iterator<IProgressMonitor> it = monitors.iterator(); it.hasNext();) {
			IProgressMonitor m = it.next();
			m.internalWorked(work);
		}
	}

	/**
	 * @see IProgressMonitor#isCanceled()
	 */
	@Override
	public synchronized boolean isCanceled() {
		for (Iterator<IProgressMonitor> it = monitors.iterator(); it.hasNext();) {
			IProgressMonitor m = it.next();
			if (m.isCanceled()) {
				return true;
			}
		}
		return false;
	}

	/**
	 * @see IProgressMonitor#setCanceled(boolean)
	 */
	@Override
	public void setCanceled(boolean value) {
	}

	/**
	 * @see IProgressMonitor#setTaskName(String)
	 */
	@Override
	public synchronized void setTaskName(String name) {
		taskName = name;
		for (Iterator<IProgressMonitor> it = monitors.iterator(); it.hasNext();) {
			IProgressMonitor m = it.next();
			m.setTaskName(name);
		}
	}

	/**
	 * @see IProgressMonitor#subTask(String)
	 */
	@Override
	public synchronized void subTask(String name) {
		subTaskName = name;
		for (Iterator<IProgressMonitor> it = monitors.iterator(); it.hasNext();) {
			IProgressMonitor m = it.next();
			m.subTask(name);
		}
	}

	/**
	 * @see IProgressMonitor#worked(int)
	 */
	@Override
	public synchronized void worked(int work) {
		internalWorked(work);
	}

	public synchronized void addMonitor(IProgressMonitor m) {
		if (totalWork > -1)
			m.beginTask(taskName, totalWork);
		if (subTaskName != null)
			m.subTask(subTaskName);
		if (worked > 0)
			m.internalWorked(worked);
		if (done)
			m.done();
		monitors.add(m);
	}
	public synchronized void removeMonitor(IProgressMonitor m) {
		monitors.remove(m);
	}
	public synchronized void operationCanceled() {
		totalWork = -1;
		worked = 0;
		done = false;
	}
}

Back to the top