Eclipse插件开发中的Action

插入点用来定义菜单出现的位置。由于Eclipse由插件组成,而每个插件又都可以添加操作,这些插件直接可能不会彼此知道。为此,Eclipse仿照标示符的使用方法,使用“插入点”(insertion point)来指定菜单或操作将在工作台的什么位置出现。
Eclipse系统中定义了标准的插入标示符additions,用来将新创建的操作插入指定的位置,这个标示符作为常量定义在org.eclipse.ui的IWorkbenchActionConstants中,可以使用IWorkbenchActionConstant.MB_ADDITIONS来获得。例如,如果希望将某个菜单放入“帮助”菜单中,就应该将其属性设置为help/additions
-------------
IAction和IActionDelegate接口
----------------------------
IActionDelegate接口的子类型IWorkbenchWindowDelegate为工作台窗口的菜单栏和工具栏提供生命周期事件,还有其他的几个子类型:
--IEditorActionDelegate,为编辑器中的操作代理提供生命周期事件;
--IObjectActionDelegate,为快捷键相关联的的操作代理提供生命周期事件;
--IViewActionDelegate,为视图中的操作代理提供生命周期事件;

Eclipse的Action由几个部分组成,包括插件清单中操作的XML声明,用来代表这个操作的由Eclipse UI实例化的IAction对象,以及在插件清单中定义的实现了IActionDelegate的类。
Eclipse工作台根据清单中描述的信息(标题,图标,工具提示等)实例化一个IAction对象(WWinPluginAction,继承了抽象类PluginAction,该抽象类可以将Action对象变为真正动作的代理对象),这个对象具备Action的所有信息。
执行Action的任务由具体的实现了IActionDelegate的类来定义。在用户单击某个工具栏的按钮时,PluginAction对象会加载这个实现了IActionDelegate的类,并且调用其run方法,使操作真正得到执行。Eclipse通过这种方式成功地将显示和实现相分离,延迟了对象的加载。

下图显示的就是workbench action bars 的结构,正方形的框表示的是IActionBars的实现类(主要就是ActionSetActionBars、EditorActionBars、ViewActionBars);椭圆形的表示操作(创建、更新等)ActionBars的类。
另外,WorkbenchWindow有一个最高级别的IActionBars的实现,可以通过
WorkbenchWindow.getActionBars()获得。它主要是控制菜单栏、工具栏的Action的集合。
/**
	 * Returns the action bars for this window.
	 */
	public WWinActionBars getActionBars() {
		if (actionBars == null) {
			actionBars = new WWinActionBars(this);
		}
		return actionBars;
  	}



---------------------------
对象操作

在Eclipse视图中创建的Action可以分为两种,一种是指向特定对象类型的Action,另一种是在视图的专用菜单中提供的Action。

Eclipse的“包资源管理器”视图的树状结构中的操作就是基于对象的。

添加org.eclipse.ui.popupMenus扩展--->新建objectContribution-->实现IObjectActionDelegate代理类接口

这个代理来中要实现三个方法:
setActivePart()--为代理指定当前活动的部分,
selectionChanged()--响应选择部分的更改
run()--Action运行的主要方法
----------------------------
视图操作

同objectContribution不同的是,viewerContribution不是针对视图中的对象决定应出现的上下文菜单,而是根据查看器(Viewer)的类型而选择的,也就是说,viewerContribution规定的是针对该视图中所有对象的通用操作。
1)添加视图的上下文菜单
添加org.eclipse.ui.popupMenus扩展--->新建viewerContribution--->实现
org.eclipse.ui.IViewerActionDelegate接口,要实现init()和run()方法
2)添加视图的工具栏
添加org.eclipse.ui.viewActions扩展--》这个扩展包含viewContribution(注意和上面提到的viewerContribution的区别,它们是不同扩展点的元素,在不同的位置添加操作)
3)添加视图的下拉菜单
视图的下拉菜单一般进行过滤、排序等操作。添加视图下拉菜单的操作很简单,只需要定义一个菜单,将其path设置为additions,然后在添加menubarPath
-----------------------------
编辑器操作

1)创建编辑器上下文操作
要在编辑器中添加上下文菜单项,仍需要使用org.eclipse.ui.popupMenus的viewerContribution元素,只要将其targetID的值设置为“#TextEditorContent”---这是Eclipse默认文件编辑器的上下文菜单标示符。
2)添加顶层工作台编辑器菜单
添加顶层工作台菜单,可以使用org.eclipse.ui.editorActoins扩展点。为编辑器添加的顶层工作台菜单与org.eclipse.ui.actionSets扩展实现的顶层工作台菜单的不同之处是,actionSets实现的是所有情况下均可见的工作台菜单,而为编辑器添加的顶层工作台菜单只有当使用与之关联的特定的编辑器时才会出现。

添加org.eclipse.ui.editorActoins扩展-->添加editorContribution元素---》在editorContribution中创建一个Menu--》添加Action,实现了IEditorActionDelegate接口,并在menubarPath中设置所放的菜单

实现IEditorActionDelegate接口需要重写setActivePart()方法和run()方法

3)添加顶层工作台工具栏编辑器相关的工具项
类似于工作台菜单操作,可以为编辑器定制工作台工具栏按钮。
添加Action配置时,设置toolbarPath="Normal/additoins",Normal是工具栏的标识符,"Normal/additoins"表示将工具栏按钮添加在所有已定义的按钮之后。
-------------------------------
快捷键映射
-------------
为了解决快捷键设置冲突的问题,Eclipse引用了Command的概念,使用命令来定义语义操作。
命令就是Action及其相关联类别的声明。可以使用命令与键绑定、操作和处理程序相关联,但它并不定义操作的具体实现。这样做的好处就是将命令从操作实现中分离处理,以便允许多个插件定义实现相同语义命令的操作。
添加org.eclipse.ui.commands扩展---》创建command元素,设置id-----》添加
org.eclipse.ui.bindings扩展---》新建Key元素,设置key元素的属性(sequence:指定绑定的键序列;schemeId:激活该键序列使用的配置,一般设置默认的配置org.eclipse.ui.defaultAcceleratorConfiguration;contextId:激活该序列使用的上下文环境的标识符,默认使用的上下文环境标识符为org.eclipse.ui.context.windows;commandId:该键激活后,所触发的命令)----》最后命令和操作的关联,找到org.eclipse.ui.actionSets下对应的Action设置其definitionId属性为刚才设置的commandId,这样就可以通过设置的快捷键打开action了

猜你喜欢

转载自niub.iteye.com/blog/1814047
今日推荐