Interface IProgressMonitor
- All Known Subinterfaces:
IProgressMonitorWithBlocking
- All Known Implementing Classes:
NullProgressMonitor
,ProgressMonitorPart
,ProgressMonitorWrapper
,SlicedProgressMonitor
,SubMonitor
,SubProgressMonitor
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:
- Will call
beginTask(java.lang.String, int)
on the argument 0 or 1 times, at its option. - Will not promise to invoke
done()
on the monitor. - Will not call
setCanceled(boolean)
on the monitor. - May rely on the monitor not being null.
- May rely on the monitor ignoring the string passed to
beginTask(java.lang.String, int)
.
The caller:
- Will either pass in a fresh instance of
IProgressMonitor
that has not hadbeginTask(java.lang.String, int)
invoked on it yet, or will select an implementation ofIProgressMonitor
that explicitly permits multiple calls tobeginTask(java.lang.String, int)
. - Will not rely on the callee to invoke
done()
on the monitor. It must either select an implementation ofIProgressMonitor
that does not requiredone()
to be called, for exampleSubMonitor
, or it must invokedone()
itself after the method returns. - Will not pass in a null monitor unless the JavaDoc of the callee says that it accepts null.
- Will pass in a monitor that ignores the name argument to
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.
-
Field Summary
Modifier and TypeFieldDescriptionstatic final int
Constant indicating an unknown amount of work. -
Method Summary
Modifier and TypeMethodDescriptionvoid
Notifies that the main task is beginning.default void
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) Callsdone()
on the given monitor if is non-null.void
internalWorked
(double work) Internal method to handle scaling correctly.boolean
Returns whether cancelation of current operation has been requested.static IProgressMonitor
nullSafe
(IProgressMonitor monitor) Returns anull
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 referencedefault 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
(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
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.
-
Field Details
-
UNKNOWN
static final int UNKNOWNConstant indicating an unknown amount of work.- See Also:
-
-
Method Details
-
beginTask
Notifies that the main task is beginning. This must only be called once on a given progress monitor instance.- Parameters:
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 isUNKNOWN
the implementation is free to indicate progress in a way which doesn't require the total number of work units in advance.
-
done
void done()Notifies that the work is done; that is, either the main task is completed or the user canceled it. This method may be called more than once (implementations should be prepared to handle this case). -
internalWorked
void internalWorked(double work) Internal method to handle scaling correctly. This method must not be called by a client. Clients should always use the methodworked(int)
.- Parameters:
work
- the amount of work done
-
isCanceled
boolean isCanceled()Returns whether cancelation of current operation has been requested. Long-running operations should poll to see if cancelation has been requested.- Returns:
true
if cancellation has been requested, andfalse
otherwise- See Also:
-
setCanceled
void setCanceled(boolean value) Sets the cancel state to the given value.- Parameters:
value
-true
indicates that cancelation has been requested (but not necessarily acknowledged);false
clears this flag- See Also:
-
setTaskName
Sets the task name to the given value. This method is used to restore the task label after a nested operation was executed. Normally there is no need for clients to call this method.- Parameters:
name
- the name (or description) of the main task- See Also:
-
subTask
Notifies that a subtask of the main task is beginning. Subtasks are optional; the main task might not have subtasks.- Parameters:
name
- the name (or description) of the subtask
-
worked
void worked(int work) Notifies that a given number of work unit of the main task has been completed. Note that this amount represents an installment, as opposed to a cumulative amount of work done to date.- Parameters:
work
- a non-negative number of work units just completed
-
setBlocked
Indicates that this operation is blocked by some background activity. If a running operation ever callssetBlocked
, it must eventually callclearBlocked
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 informationalIStatus
object.- Parameters:
reason
- an optional status object whose message describes the reason why this operation is blocked, ornull
if this information is not available.- Since:
- 3.13
- See Also:
-
clearBlocked
default void clearBlocked()Clears the blocked state of the running operation. If a running operation ever callssetBlocked
, it must eventually callclearBlocked
before the operation completes.- Since:
- 3.13
- See Also:
-
slice
This method creates a slice out of this monitor. The slice behaves as if a new monitor instance is created that simply reports work back to its parent monitor. Even though it is safe to pass the sliced instance to another thread, instance itself might not be thread-safe and each slice should therefore only be used by one thread at once. To account for this, if sliced instances are passed to another thread, only sliced instances should be used like in this example: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 thatdone()
is called once the monitor is no longer needed.- Parameters:
work
- the amount of work for thisIProgressMonitor
to slice- Returns:
- a
IProgressMonitor
slice for the given amount, the default implementation suppress any strings passed tosetTaskName(String)
,subTask(String)
andbeginTask(String, int)
, and does not propagatesetCanceled(boolean)
(but reports cancelation of the parent - Since:
- 3.14
-
done
Callsdone()
on the given monitor if is non-null. If the given monitor is null, this is a no-op.- Parameters:
monitor
- the monitor to make done, might benull
- Since:
- 3.14
-
nullSafe
Returns anull
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- Parameters:
monitor
- the monitor to check- Returns:
- the passed monitor instance or
NullProgressMonitor
if monitor wasnull
- Since:
- 3.14
-