Wrong handler activation [message #946444] |
Tue, 16 October 2012 03:54  |
Eclipse User |
|
|
|
Hi all,
I discovered a strange behavior with handler activation.
I have a command
<command categoryId="myCategory" id="myCommand"></command>
two handlers for that command
<handler class="EditorHandler" commandId="myCommand">
<activeWhen>
<reference definitionId="myReference"></reference>
</activeWhen>
</handler>
<handler class="SelectionHandler" commandId="myCommand">
<activeWhen>
<iterate ifEmpty="false" operator="and">
<instanceof value="SelectableObject"></instanceof>
</iterate>
</activeWhen>
</handler>
and a core expression definition
<definition id="myReference">
<with variable="activeEditorId">
<equals value="editorWithSelectedObjectId"></equals>
</with>
</definition>
The SelectionHandler should be active only when the workbench selection contains instances of a SelectableObject.
The EditorHandler should be active only when a specific editor is active.
There are two editors, the first one is the one with editorWithSelectedObjectId id. It has no selection provider registered with its site.
The second one is an editor containing a table of SelectableObjects, so it has registered a selection provider with its site.
I put the command in main toolbar and open the editor with a table of SelectableObjects.
The SelectionHandler becomes active (ok). Now I open the second editor and the SelectionHandler is still active (bad)!! When I try it next time (the application must be restarted), the EditorHandler becomes active as it should (ok). This happens randomly. It looks like the sequence of handler activation matters or something.
Sometimes the SelectionHandler stay active forever. No matter what editor or view is active.
Does anybody have an idea what's going here? Thanks
|
|
|
Re: Wrong handler activation [message #946755 is a reply to message #946444] |
Tue, 16 October 2012 09:22  |
Eclipse User |
|
|
|
I got it. I have another handler
<handler class="deleteHandler" commandId="deleteCommandId">
<activeWhen>
<iterate operator="and">
<instanceof value="SelectableObject"></instanceof>
</iterate>
</activeWhen>
</handler>
Note that it does't have defined ifEmpty parameter and also note that it has the same expressions as SelectionHandler above.
When platform starts it reads all contributed handlers. For all handlers with the same expression it evaluate this expression only once - from the first one contribution that is read.
Then it uses this cached evaluation result for all other handlers with that expression. See (HandlerAuthority.calss, EvaluationResultCache.class and IterateExpression.class).
So when the first loaded handler was the deleteHandler, it evaluates its expression as true, because the default context variable is a collection (empty during startup) and the IterateExpression evaluate itself against empty collection without ifEmpty as true.
This also activated the SelectionHandler, because it has the same expression, so it uses the cached version.
|
|
|
Powered by
FUDForum. Page generated in 0.04966 seconds