- Am I enabled?
- Do something.
Responsibility #1 is implemented as state (
isEnabled()) on the Command itself. Because a command is a global singleton (it's supposed to represent the operation) this has the unintended side effect that a command is enabled or disabled globally for the application. The active handler determines the state, but based on whatever information it wants (which may or may not be the same information it will execute against).
Responsibility #2 is implemented in the handler's execute method. It can then use the execution event to get the
IEvaluationContextand extract information out of it. This mostly works well, and you end up treating the
IEvaluationContextas a map.
In e4 we're looking
IEclipseContext"Contexts: the service broker" which provides a localized view into the application state (i.e. what you can see from your view or editor makes sense). Information relevant to the state of the application is stored in your context in 2 forms. Some information is identified by class (
ECommandService.class.getName(), EventAdmin.class.getName()) and some information is identified by name (
Now the fun part. In e4 a handler for a command can define 2 methods:
canExecute(*)- This will be called by the framework before trying to execute a command
execute(*)- This will be called by the framework when appropriate (can you guess what it does? :-)
public boolean canExecute(
@Named("selection") IStructuredSelection selection);
public void execute(
@Named("selection") IStructuredSelection selection,
When the framework needs to call either method, it will inject the needed information from the appropriate
IEclipseContext. It uses the
@Namedannotation if it is present, or the type of the parameter (for example,
In e4 1.0 we're adopting the JSR 330 annotations for injection (plus a few extras that we need). This is still a work in progress, but it's moving right along. If you are interested, now is the time to get involved - http://wiki.eclipse.org/E4.
There's a lot more to this story, so stay tuned for the next update.