Lets start with Actions. We are able to contribute to the menus, toolbars, pull down menu, etc. We are able to specify the UI details like label or tooltip in the plugin.xml itself, which helps in lazy loading. So whats wrong with them?
- The UI and handling are always tied. There is no way you can separate each other
- While Actions can be contributed to different parts of the workbench (popup menu/tool bar), all of them were different extension points and so you end up duplicating the XML in multiple places. The worst of it is that not all the extension points expect the same configuration.
- Specifying Actions in multiple places is a maintenance nightmare. If you have to change the icon of an action, you need to change in all the places.
- Another issue with duplicating Actions in plugin.xml is that multiple instance of the same Actions will be created in the memory
<command
id="com.eclipse-tips.commands.someCommand"
name="Some Command">
</command>
Yeah thats it. That defines a Command! If you want to place this in a tool bar, you have to use the extension point org.eclipse.ui.menus:
<menuContribution
locationURI="toolbar:org.eclipse.ui.main.toolbar">
<toolbar
id="com.eclipse-tips.commands.toolbar1">
<command
commandId="com.eclipse-tips.commands.someCommand"
id="com.eclipse-tips.commands.someCommandInToolBar">
</command>
</toolbar>
</menuContribution>
Now that takes of the placement in the UI. But what about the code that gets executed? That goes into a another extension point, org.eclipse.ui.handlers:
<handler
class="com.eclipse_tips.commads.SomeCommandHandler"
commandId="com.eclipse-tips.commands.someCommand">
</handler>
One last piece is to add an icon to the Command
No price for guessing that you need to use another extension point, org.eclipse.ui.commandImages:
<image
commandId="com.eclipse-tips.commands.someCommand"
icon="icons/sample.gif">
</image>
All set. Lets see the Command in action:
As you see, in the actions we would just use only one extension point, instead of the four which we have used now. Does it sounds like a round about way or doing things? Probably once we get to know about multiple handlers for a Command and context based association & enablement of the handlers etc, we will see the beauty of the framework. That would be the next in this series.
Update (31-Mar-2009): Thanks to Hiroki Kondo, a Japanese version of this blog entry is available here.
Update (29-Sep-2009): Thanks to Peng Zhang, a Chinese version of this blog entry is available here.
See also:
Part 2: Selection and Enablement of Handlers
Part 3: Parameters for Commands
Part 4: Misc items ...
Part 5: ISourceProvider & dynamically updating Commands
Part 6: 'toggle' & 'radio' style menu contribution
16 comments: