public interface IProgressMonitor
IProgressMonitor interface is implemented
by objects that monitor the progress of an activity; the methods
in this interface are invoked by code that performs the activity.
All activity is broken down into a linear sequence of tasks against
which progress is reported. When a task begins, a beginTask(String, int)
notification is reported, followed by any number and mixture of
progress reports (worked()) and subtask notifications
(subTask(String)). When the task is eventually completed, a
done() notification is reported. After the done()
notification, the progress monitor cannot be reused; i.e.,
beginTask(String, int) cannot be called again after the call to
done().
A request to cancel an operation can be signaled using the
setCanceled method. Operations taking a progress
monitor are expected to poll the monitor (using isCanceled)
periodically and abort at their earliest convenience. Operation can however
choose to ignore cancelation requests.
Since notification is synchronous with the activity itself, the listener should provide a fast and robust implementation. If the handling of notifications would involve blocking operations, or operations which might throw uncaught exceptions, the notifications should be queued, and the actual processing deferred (or perhaps delegated to a separate thread).
CALLER/CALLEE RESPONSIBILITIES:
Methods that receive an IProgressMonitor ("callees") must either obey the following
conventions or include JavaDoc explaining how it differs from these rules.
The called method:
beginTask(java.lang.String, int) on the argument 0 or 1 times, at its option.done() on the monitor.setCanceled(boolean) on the monitor.beginTask(java.lang.String, int).The caller:
IProgressMonitor that has
not had beginTask(java.lang.String, int) invoked on it yet, or will select an
implementation of IProgressMonitor that explicitly permits multiple calls
to beginTask(java.lang.String, int).done() on the monitor.
It must either select an implementation of IProgressMonitor that
does not require done() to be called, for example SubMonitor,
or it must invoke done() itself after the method returns.beginTask(java.lang.String, int)
unless the JavaDoc for the callee states otherwise.
The responsibilities described above were introduced in Eclipse 4.7 (Oxygen). Prior to
Eclipse 4.7, it was common practice for the callee to invoke done() on
its monitor and for the caller to rely upon this fact. As of Eclipse 4.6, all
the important top-level entry points have been updated to call done(),
meaning they work with both methods that invoke done() and methods
that don't.
Since this convention was introduced in Eclipse 4.7, some plugin code may need to
change. In particular, callers that pass a monitor are no longer allowed to rely upon
the callee invoking done() and must do so themselves if necessary.
This interface can be used without OSGi running.
Clients may implement this interface.
| Modifier and Type | Field and Description |
|---|---|
static int |
UNKNOWN
Constant indicating an unknown amount of work.
|
| Modifier and Type | Method and Description |
|---|---|
void |
beginTask(java.lang.String name,
int totalWork)
Notifies that the main task is beginning.
|
default void |
clearBlocked()
Clears the blocked state of the running operation.
|
void |
done()
Notifies that the work is done; that is, either the main task is completed
or the user canceled it.
|
static void |
done(IProgressMonitor monitor)
Calls
done() on the given monitor if is non-null. |
void |
internalWorked(double work)
Internal method to handle scaling correctly.
|
boolean |
isCanceled()
Returns whether cancelation of current operation has been requested.
|
static IProgressMonitor |
nullSafe(IProgressMonitor monitor)
Returns a
null safe access to the given monitor, for example in cases where a monitor is passed to
a function the implementation can call this method to get a guaranteed non-null monitor reference |
default void |
setBlocked(IStatus reason)
Indicates that this operation is blocked by some background activity.
|
void |
setCanceled(boolean value)
Sets the cancel state to the given value.
|
void |
setTaskName(java.lang.String name)
Sets the task name to the given value.
|
default IProgressMonitor |
slice(int work)
This method creates a slice out of this monitor.
|
void |
subTask(java.lang.String name)
Notifies that a subtask of the main task is beginning.
|
void |
worked(int work)
Notifies that a given number of work unit of the main task
has been completed.
|
static final int UNKNOWN
void beginTask(java.lang.String name,
int totalWork)
name - the name (or description) of the main tasktotalWork - the total number of work units into which
the main task is been subdivided. If the value is UNKNOWN
the implementation is free to indicate progress in a way which
doesn't require the total number of work units in advance.void done()
void internalWorked(double work)
worked(int).work - the amount of work doneboolean isCanceled()
true if cancellation has been requested,
and false otherwisesetCanceled(boolean)void setCanceled(boolean value)
value - true indicates that cancelation has
been requested (but not necessarily acknowledged);
false clears this flagisCanceled()void setTaskName(java.lang.String name)
name - the name (or description) of the main taskbeginTask(java.lang.String, int)void subTask(java.lang.String name)
name - the name (or description) of the subtaskvoid worked(int work)
work - a non-negative number of work units just completeddefault void setBlocked(IStatus reason)
setBlocked, it must
eventually call clearBlocked before the operation
completes.
If the caller is blocked by a currently executing job, this method will return
an IJobStatus indicating the job that is currently blocking
the caller. If this blocking job is not known, this method will return a plain
informational IStatus object.
reason - an optional status object whose message describes the
reason why this operation is blocked, or null if this
information is not available.clearBlocked()default void clearBlocked()
setBlocked, it must eventually call
clearBlocked before the operation completes.setBlocked(IStatus)default IProgressMonitor slice(int work)
IProgressMonitor monitor = ...
processAsync(monitor.slice(70));
monitor = monitor.slice(30); // get a local slice so we can use the monitor
// without interference with the async processing
monitor.beginTask("Working on private slice", 1);
...
monitor.worked(1); // this is now safe to be called further on
...
monitor.done(); // mark our part as done,
// the other slice will be finished by processAsync(...)
// ... and the original monitor by the caller of this method
The caller of this method (or the Thread that gets this instance passed) is responsible to make sure that done() is called once the monitor is no longer needed.work - the amount of work for this IProgressMonitor to sliceIProgressMonitor slice for the given amount,
the default implementation suppress any strings passed to setTaskName(String), subTask(String) and beginTask(String, int), and does not propagate setCanceled(boolean) (but reports cancelation of the parentstatic void done(IProgressMonitor monitor)
done() on the given monitor if is non-null. If the given monitor is null,
this is a no-op.monitor - the monitor to make done, might be nullstatic IProgressMonitor nullSafe(IProgressMonitor monitor)
null safe access to the given monitor, for example in cases where a monitor is passed to
a function the implementation can call this method to get a guaranteed non-null monitor referencemonitor - the monitor to checkNullProgressMonitor if monitor was null