Consider the following action definition used in Eclipse 3.2.
<extension point="org.eclipse.ui.popupMenus"> <objectContribution adaptable="false" id="com.rcpcompany.demo.providers.ui.objectContributions.ires.general" objectClass="com.rcpcompany.training.demo.core.IRes"> <action class="com.rcpcompany.training.demo.providers.ui.actions.ShowName" icon="icons/ShowName.gif" id="com.rcpcompany.demo.providers.ui.actions.showname" label="Show Name"> </action> <filter name="folder" value="true"> </filter> </objectContribution> </extension>This definition will add a new action with the text "Show Name" to all popup menus if the current selection contains at least one object of the
IRes
interface and this object returns true
for the folder (using an IActionFilter
). It is a rather tense description.For Eclipse 3.3, this description is spread over a number of extension.
First a
commands
extension is used to declare the command itself:<extension point="org.eclipse.ui.commands"> <command description="Shows the name of the current resource" id="com.rcpcompany.training.demo33.providers.ui.commands.showName" name="&Show Name"> </command> </extension>
Then the image of the command must be added:
<extension point="org.eclipse.ui.commandImages"> <image commandId="com.rcpcompany.training.demo33.providers.ui.commands.showName" icon="icons/ShowName.gif"> </image> </extension>
The next thing is to add a handler for the command:
<extension point="org.eclipse.ui.handlers"> <handler class="com.rcpcompany.training.demo33.providers.ui.handlers.ShowName" commandId="com.rcpcompany.training.demo33.providers.ui.commands.showName"> <enabledWhen> <with variable="selection"> <iterate ifEmpty="false" operator="and"> <and> <instanceof value="com.rcpcompany.training.demo33.core.IRes"> </instanceof> <test property="com.rcpcompany.isFolder"> </test> </and> </iterate> </with> </enabledWhen> </handler> </extension>
This is where most of the complexity is in the new implementation: the tense declaration from 3.2 is now rather verbose. Having said that, the new notation also allows for much more complicated stuff than what was possible before. Note that the
IActionFilter
has been replaced with a IPropertyTester
- which is very good, as all properties now need not be in a single test object, but can be distributed over any number of o objects.Last the popup menus must be added to all popup menus:
<extension point="org.eclipse.ui.menus"> <menuContribution locationURI="popup:org.eclipse.ui.popup.any"> <command commandId="com.rcpcompany.training.demo33.providers.ui.commands.showName"> </command> </menuContribution> </extension>
Depending on the small details, there can be some changes to this - e.g. if the command should only be shown when the selection includes the right objects.
So what didn't work? I hadn't added the
iterate
test declaration! And since my selection actually was a StructedSelection
, then the implicit iteration from 3.2 had to be handled explicitly.Having worked with the new notation for a number of days now, I think the new notation is better than the old notation. If you just use a command in a single place, then the new notation will take longer to use, but if the same command is used in at least a few places, then the new notation is faster. With other words: the basic overhead of the new notation is larger than for the old notation...
2 comments:
I have an issue with . My Eclipse plug-in developed works fine in 3.4 but same does not work in v 3.2.1 of eclipse. In probing the issue I found does not get invoked in 3.2.1 but same works fine in 3.4. What could be the reason/solution to this? Please help. Thanks and regards, Ranjit
@ranjit The command-handler pattern does NOT work with Eclipse 3.2.x. Here you have to use the action pattern. Sorry.
Post a Comment