public abstract class AsynchronousController extends java.lang.Object implements Controller
handleEvent(oracle.ide.controller.IdeAction, oracle.ide.Context)
call handleAsynchronously(oracle.ide.controller.IdeAction, oracle.ide.Context, boolean)
or
its version without the last parameter add return true. Doing so will result in
a call to handleEvent(oracle.ide.controller.IdeAction, oracle.ide.Context, oracle.ide.controller.AsynchronousController.TaskInfo)
done out of the event dispatch thread. Implement this method to handle
your actions.
Notice that the AsynchronousController.TaskInfo
objects allows for showing all kinds of
progress during run of the action. Progress can be shown as determinate or
indeterminate, it can be shown in the status bar or in a modal dialog and
both dialog and status bar progress can be made either cancelable or not
cancelable. If you need to block user's interaction with the IDE and you don't
want to use modal dialog there is a method AsynchronousController.TaskInfo.showWaitCursor()
for showing the wait cursor.AsynchronousController.TaskInfo
can also be used for canceling running tasks programmatically
and to wait for the end of a task execution or cancellation. This is necessary
in cases where running two or more invocations of actions(s) is undesirable.
This class is also good for breaking a controller into separate methods
handling/updating one or more actions. This makes it easier to write/read/maintain
the controller's code and avoid several hunderts lines long if-else statements.AsynchronousController.Updater
and AsynchronousController.Handler
annotations
and these methods will be called accordingly to the parameters specified in
the annotations and to the method's signatures to update/handle the actions.
If you only use annotations for distributing the actions you may don't
need to override the handleEvent(oracle.ide.controller.IdeAction, oracle.ide.Context)
or handleEvent(oracle.ide.controller.IdeAction, oracle.ide.Context, oracle.ide.controller.AsynchronousController.TaskInfo)
at all. In case you mix the annotations with the classic if-else/switch
distribution you will want to call to super in these methods.
If you are sure you don't want to use the annotations you call a super constructor
from your constructor and set the parameter useAnnotations
to
false
. This will result in performance improvement when the controller
class is loaded. Scan for the annotations will not be performed.Modifier and Type | Class and Description |
---|---|
static interface |
AsynchronousController.Handler
Marker annotation for handle methods.
|
static class |
AsynchronousController.TaskInfo
Utility class for showing progress, canceling, waiting on task
running out of EDT.
|
static interface |
AsynchronousController.Updater
Marker interface for update methods.
|
UPDATE_FROM_ACTION_PERFORMED, UPDATE_FROM_ACTIVE_VIEW_CHANGED, UPDATE_FROM_UNDO, UPDATE_FROM_USER_EXTENSION, UPDATE_FROM_VIEW_SELECTION_CHANGED
Modifier | Constructor and Description |
---|---|
protected |
AsynchronousController()
Default constructor for using the controller with annotations.
|
protected |
AsynchronousController(boolean useAnnotations)
Constructor which permits for switch off the Annotation support.
|
Modifier and Type | Method and Description |
---|---|
protected boolean |
handleAsynchronously(IdeAction action,
Context context)
Call this method in from
handleEvent(oracle.ide.controller.IdeAction, oracle.ide.Context)
to move the execution out of event dispatch thread. |
protected boolean |
handleAsynchronously(IdeAction action,
Context context,
boolean useThreadInterrupt)
Call this method in from handleEvent(IdeAction, Context) to move the execution out of EDT.
|
boolean |
handleEvent(IdeAction action,
Context context)
This method is called when a user interaction with a
View
triggers the execution of a command. |
protected void |
handleEvent(IdeAction action,
Context context,
AsynchronousController.TaskInfo taskInfo)
Override this method to handle some actions out of EDT.
|
boolean |
update(IdeAction action,
Context context)
Allows to set the action state according to current context.
|
protected AsynchronousController()
AsynchronousController(boolean)
with the
parameter set to true.protected AsynchronousController(boolean useAnnotations)
false
the class will not be
scanned for the annotations (which is faster) and thus methods
annotated with AsynchronousController.Updater
and AsynchronousController.Handler
annotations will be
ignored and not called. Use this constructor if your code does not make
use of the annotations.useAnnotations
- Should annotations be taken into account?protected final boolean handleAsynchronously(IdeAction action, Context context)
handleEvent(oracle.ide.controller.IdeAction, oracle.ide.Context)
to move the execution out of event dispatch thread. Doing so
results in call to
handleEvent(oracle.ide.controller.IdeAction, oracle.ide.Context, oracle.ide.controller.AsynchronousController.TaskInfo)
in separate thread. Same as call to handleAsynchronously(oracle.ide.controller.IdeAction, oracle.ide.Context, boolean)
with the last parameter set to false.action
- The Action to be handled.context
- Current contextprotected final boolean handleAsynchronously(IdeAction action, Context context, boolean useThreadInterrupt)
action
- The Action to be handled.context
- Current contextuseThreadInterrupt
- Should AsynchronousController.TaskInfo.cancel()
invoke Thread.interrupt()
.protected void handleEvent(IdeAction action, Context context, AsynchronousController.TaskInfo taskInfo)
action
- The action to be handled.context
- Current context.taskInfo
- Utility parameter for showing progress and/or canceling the task.public boolean handleEvent(IdeAction action, Context context)
View
triggers the execution of a command.handleEvent
in interface Controller
action
- action whose command is to be executed.public boolean update(IdeAction action, Context context)
update
in interface Controller
action
- Action to be updated.context
- Current context.