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.
All progress display elements (including wait cursor) are automatically dismissed after the task finishes.
The 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.
To do so annotate your methods with 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)
It is generally desirable to return false from this method in case of setting the enablemet of the action to false in order to give other controllers in chain to set the enablement to true if they later handle the action.
update
in interface Controller
action
- Action to be updated.context
- Current context.