操作Action

IActionDelegate的子类型有IWorkbenchWindowActionDelegate为工作台窗口的菜单栏和工具栏提供生命周期事件,还有:

IEditorActionDelegate为编辑器中的操作提供生命周期事件;

IObjectActionDelegate为快捷键相关联的操作代理提供生命周期事件;

IViewActionDelegate为视图中的操作提供生命周期事件;

IWorkbenchWindowActionDelegate接口中的方法:

//每次执行该操作时,都会执行该方法,init方法只有第一次才会执行,后面就不会执行了

public void run(IAction action) 

//当用户焦点离开该操作创建的视图等等时,会执行该方法

public void selectionChanged(IAction action, ISelection selection) 

//该关闭eclipse时,才会调用该方法

public void dispose()

//当第一次执行该操作时,创建该对象后,首先执行init方法,然后执行run方法

public void init(IWorkbenchWindow window) 


操作可以在许多地方出现,如菜单栏、工具栏和上下文菜单,它丰富了编辑器的功能,增强的用户的体验。

eclipse中的操作既可以通过扩展点定义,也可以通过代码定义。

工具栏的按钮被分为多个组,每个组叫一个操作集(action set),用来集合一组相关的操作。

操作集扩展的使用(该扩展点主要是为了添加菜单栏和工具栏按钮的):

<extension

         point="org.eclipse.ui.actionSets">

      <actionSet

            //引用该操作的唯一标识符

            id="com.plugindev.addressbook.actionSet"

            //出现在window->customize perspective 中的标识符

            label="地址本操作"

            //表示初始状态是否可见

            visible="true">

         //用于定义出现在菜单栏中的菜单

         <menu

               //菜单的唯一标识符

               id="AddressBookMenu"

               //菜单的名称,还有个属性path表示在何处插入此菜单

               label="地址本">

            <separator name="content"/>

         </menu>

         定义操作

         <action

               //操作的代理,必须实现IWorkbenchWindowActionDelegate或者               //IWorkbenchWindowPulldownActionDelegate(实现下拉式的工具栏按钮)

               class="com.plugindev.addressbook.actions.OpenAddressViewAction"

               //操作的命令标识符,将该操作绑定到哪个命令上

               definitionId="com.plugindev.addressbook.commands.openAddressView"

               //与该操作关联的图像,出现在工具栏

               icon="icons/sample.gif"

               引用该操作的唯一标识符

               id="com.plugindev.addressbook.actions.OpenAddressViewAction"

               //出现在菜单中的名称

               label="打开视图"

               //表示操作出现在菜单栏中的位置,表示出入到上面定义菜单的content中

               menubarPath="AddressBookMenu/content"

               //表示操作出现工具栏中的位置,Normal为工具栏的标识符,addition是工具栏中的组

               toolbarPath="Normal/addition"

               //用于工具栏按钮的提示信息

               tooltip="在当前透视图中打开地址本视图"/>

      </actionSet>

   </extension>

视图操作包含视图上下文菜单、视图工具栏按钮、视图工具栏的下拉菜单。这些操作都可以通过编程的方式来实现。

popupMenus扩展点,可以为插件添加上下文菜单,并提供需要的菜单项。

<extension

         point="org.eclipse.ui.popupMenus">

      //与上下文特点对象相关联的操作,只有选择该对象才会出现该菜单

      <objectContribution

            //默认为fasle,指出适配IResource对象可接受的目标

            adaptable="false"

            //此操作的唯一标识符

            id="com.plugindev.addressbook.example.objectActionTest"

            //过滤器,表示可接受的目标名称

            nameFilter="T*"

            //表示可接受的目标类型,类型必须是String,其他类型不行

            objectClass="java.lang.String">

         <menu

               id="exampleMenu"

               label="示例菜单"

               path="additions">

            <separator name="example"/>

         </menu>

         <action

               //操作代理类,必须实现IObjectActionDelegate接口

               class="com.plugindev.addressbook.example.ObjExampleAction"

               //表示多选是否也支持该操作,+表示支持,1表示不支持

               enablesFor="1"

               id="com.plugindev.addressbook.objExampleAction"

               label="对象示例操作"

               menubarPath="exampleMenu/example"

               tooltip="举例说明如何添加对象操作"/>

      </objectContribution>

</extension>

IObjectActionDelegate接口中方法的调用时机:

//右键选择目标对象时,先调用这个方法后再调用select,每次右键选择都会执行这2个方法

public void setActivePart(IAction action, IWorkbenchPart targetPart)

public void selectionChanged(IAction action, ISelection selection)

//选择相应菜单项时,执行该方法

public void run(IAction action) 

<extension

         point="org.eclipse.ui.popupMenus">

  //为视图添加上下文菜单,针对所有的对象

  <viewerContribution

            id="com.plugindev.addressbook.example.viewerActionTest"

            //表示为哪个视图提供操作

            targetID="com.plugindev.addressbook.views.AddressView">

         <menu

               id="com.plugindev.viewToolbarMenu"

               label="示例工具栏菜单"

               path="additions">

            <separator name="example"/>

         </menu>

         <action

               //操作代理类必须实现IViewActionDelegate接口

               class="com.plugindev.addressbook.example.ViewerExampleAction"

               enablesFor="+"

               id="com.plugindev.addressbook.viewerExampleAction"

               label="查看器示例操作"

               menubarPath="com.plugindev.viewToolbarMenu/example"

               tooltip="举例说明如何添加查看器操作"/>

      </viewerContribution>

</extension>

<extension

         point="org.eclipse.ui.popupMenus">

 //为编辑器的上下文菜单提供操作

 <viewerContribution

            id="com.plugindev.addressbook.example.editorActionTest"

            //表示为哪个编辑器提供上下文菜单,在此表示eclipse默认的文本编辑器

            targetID="#TextEditorContext">

         <menu

               id="com.plugindev.defaultEditorMenu"

               label="示例编辑器菜单"

               path="additions">

            <separator name="example"/>

         </menu>

         <action

               //操作代理类必须实现IEditorActionDelegate接口

               class="com.plugindev.addressbook.example.EditorExampleAction"

               icon="icons/sample.gif"

               id="com.plugindev.addressbook.editorExampleAction"

               label="编辑器操作"

               menubarPath="com.plugindev.defaultEditorMenu/example"

               tooltip="举例说明如何添加编辑器操作"/>

      </viewerContribution>

</extension>

//用户定义编辑器的上下文菜单

<viewerContribution

            id="com.plugindev.addressbook.example.editorActionTest"

            targetID="#TextEditorContext">

         <menu

               id="com.plugindev.defaultEditorMenu"

               label="示例编辑器菜单"

               path="additions">

            <separator name="example1"/>

            <separator name="example2"/>

         </menu>

//只有action的ID不同,可以放置多个action,并定义它在菜单中出现的位置

         <action

               class="com.plugindev.addressbook.example.EditorExampleAction"

               icon="icons/sample.gif"

               id="com.plugindev.addressbook.editorExampleAction"

               label="编辑器操作2"

               menubarPath="com.plugindev.defaultEditorMenu/example1"

               tooltip="举例说明如何添加编辑器操作"/>

          <action

               class="com.plugindev.addressbook.example.EditorExampleAction"

               icon="icons/sample.gif"

               id="com.plugindev.addressbook.editorExampleAction2"

               label="编辑器操作2"

               menubarPath="com.plugindev.defaultEditorMenu/example2"

               tooltip="举例说明如何添加编辑器操作"/>

      </viewerContribution>

//此扩展点用于添加视图工具栏按钮

 <extension

         point="org.eclipse.ui.viewActions">

      //要和viewerContribution区别开来

      <viewContribution

            id="com.plugindev.addressbook.example.viewActionTest"

            targetID="com.plugindev.addressbook.views.AddressView">

         <action

               //操作代理类必须实现IViewActionDelegate接口

               class="com.plugindev.addressbook.example.ViewExampleAction"

               icon="icons/sample.gif"

               id="com.plugindev.addressbook.viewExampleAction"

               label="视图操作"

               menubarPath="com.plugindev.addressViewPullDownMenu/example"

               style="push"

               toolbarPath="additions"

               tooltip="举例说明如何添加视图操作"/>

         <menu

               id="com.plugindev.addressViewPullDownMenu"

               label="下拉菜单示例"

               path="addtions">

            <separator name="example"/>

         </menu>

      </viewContribution>

   </extension>

      </editorContribution>

   </extension>

为编辑器添加顶层工作台菜单和工具栏按钮,要扩展org.eclipse.ui.editorActions扩展点。与org.eclipse.ui.actionSets扩展点不同,后者对任何视图都可见,前者只对定义的

视图可见。

<extension

         point="org.eclipse.ui.editorActions">

      <editorContribution

            id="com.plugindev.addressbook.example.editorActionTest"

            //定义对默认的文本编辑器显示顶层菜单和工具栏

            targetID="org.eclipse.ui.DefaultTextEditor">

         <menu

               id="com.plugindev.defaultEditorMenu"

               label="顶层编辑器菜单"

               path="additions">

            <separator name="example"/>

         </menu>

         <action

               //操作代理必须实现IEditorActionDelegate接口

               class="com.plugindev.addressbook.example.TopEditorAction"

               icon="icons/sample.gif"

               id="com.plugindev.addressbook.TopEditorAction"

               label="顶层编辑操作"

               menubarPath="com.plugindev.defaultEditorMenu/example"

               style="push"

               toolbarPath="Normal/additions"

               tooltip="编辑器操作示例"/>

      </editorContribution>

   </extension>

键绑定策略

命令是键序列与相应操作之间的桥梁,当按下快捷键时,通过命令就可以找到相应的操作

操作通过定义 definitionId来与命令ID相关联,绑定通过定义commandId与命令ID相关联

<extension

         point="org.eclipse.ui.commands">

      //定义命令所属的类别

      <category

            description="地址本插件添加的命令"

            id="com.plugindev.addressbook.commands"

            name="地址本"/>

      <command

            categoryId="com.plugindev.addressbook.commands"

            description="打开地址本视图"

            id="com.plugindev.addressbook.commands.openAddressView"

            name="打开地址本"/>

      <command

            categoryId="com.plugindev.addressbook.commands"

            description="打开地址本视图222"

            id="com.plugindev.addressbook.commands.openAddressView22"

            name="打开地址本222"/>

   </extension>

   <extension

         point="org.eclipse.ui.bindings">

      <key

            commandId="com.plugindev.addressbook.commands.openAddressView"

            contextId="org.eclipse.ui.contexts.window"

            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"

            sequence="CTRL+SHIFT+V"/>

       <key

            commandId="com.plugindev.addressbook.commands.openAddressView22"

            //激活键序列时的上下文环境

            contextId="org.eclipse.ui.contexts.window"

            //激活键序列所使用的配置

            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"

            //键序列

            sequence="CTRL+SHIFT+V"/>

   </extension>

猜你喜欢

转载自longcxm.iteye.com/blog/1718595