eclipse中常规菜单、工具栏

workbench的菜单、工具栏

1扩展org.eclipse.ui.actionSets。该actionlabel(操作集合的名称)显示在“定制透视图”的对话框中。

2创建menu(如果将action插入到已有的菜单中,不需要创建)。label就是菜单在菜单栏中的名字。

3.创建action。指定action在菜单上的位置,在toolbar上的位置。

其中retarget表示重定目标操作时需要的属性,当试图或编辑器中需要使用全局工作台菜单或工具栏中的操作时,将retarget设置为true

enableFor的取值:!、?、+n*2+/multiple

view中的action

扩展org.eclipse.ui.viewActions.这些action放在View菜单或是工具栏中。

viewActionviewContribution

其内的上下文菜单同样扩展自popmenuviewerContributionobjectContribution弹出菜单popmenu扩展点

editoraction

扩展org.eclipse.ui.editorActions.

editor添加顶层工作台菜单,与一般的工作台菜单不同,编辑器的工作台菜单只有当该编辑器使用时,才会出现(或enable)。其中的targetID值为org.eclipse.ui.DefaultTextEditor.

 

扫描二维码关注公众号,回复: 697046 查看本文章

给编辑器添加上下文菜单时,其popmenu中的viewerContribution中的targetID值为#TextEditorContexteclipse默认文件编辑器上下文菜单标识符,弹出菜单popmenu扩展点

菜单的快捷键

快捷键可以用编程方式实现,也可以通过添加扩展点方式。

由于eclipse的开源性,实现不冲突的快捷键需要解决3个问题。

1 相同功能操作,不同的开发者有了不同的快捷键。

2 不同的功能操作,有了相同的快捷键。

3 快捷键可能与平台定义的快捷键冲突。

为此,引入org.eclipse.ui.commands扩展点。命令与键绑定、操作和处理程序相关,但不定义操作的实现。该实现由操作本身来完成。

还需要添加扩展点org.eclipse.ui.bindings,在该扩展点新增key元素,包括sequence(键组合)、schemeId(激活该快捷键使用的配置,一般情况将键绑定添加到默认的eclipse的配置org.eclipse.ui.defaultAcceleratorConfiguration)、contextId(激活该快捷键所使用的上下文标识符,默认使用org.eclipse.ui.context.windows)commandId(命令)。

最后将commandId添加到菜单属性中的definitionId中。

菜单扩展点org.eclipse.ui.menus

org.eclipse.ui.menus (Eclipse3.3)

——负责显示。如菜单的位置、文字、图标、提示信息、样式、是否可见等。

org.eclipse.ui.commands (Eclipse2.1)

——负责定义菜单ID。同时可以指定实现该菜单行为的类。

org.eclipse.ui.handlers (Eclipse3.1)

——负责定义实现菜单行为的类以及是否可执行(灰化)

org.eclipse.ui.bindings (Eclipse3.1)

——负责定义菜单的快捷键。

org.eclipse.core.expressions.definitions (Eclipse3.3)

——定义表达式。在实现菜单灰化时,起辅助作用。

菜单项定义

locationURI的一般格式为:

PID:VID

PID:VID?after=MID

PID:VID?abefore=MID

PID为菜单项的归属,只有3个可选值:菜单栏(menu)、工具栏(toolbar)、弹出菜单(popup)

VID为菜单项所附的位置:

如果PID表示的是菜单栏,那么VID就表示该菜单项的上一级菜单的ID

如果PID表示的是工具栏,那么VID就表示该菜单项所在的工具组ID

如果PID表示的是弹出菜单,那么VID就表示该菜单所在的视图ID或编辑器ID

MID表示的是与该菜单项相邻的菜单项ID

 

添加一个menuContribution

设置"menuContribution"属性:

·         locationURI是设定所在位置,由一个字符串定义,字符串的格式为:[Scheme]:[ID]?[Query]分为三部分:

·         Scheme:类型,取值为menupopuptoolbar

·         ID:基准,已存在的菜单ID、工具栏ID或视图ID等,常见的包括:

·         主菜单:org.eclipse.ui.main.menu

·         主工具栏:org.eclipse.ui.main.toolbar

·         弹出菜单:org.eclipse.ui.popup.any

·         Query:格式为<placement>=<id>placementbeforeafterendofid为一个已存在的菜单项。

常见的locationURI:

·         主菜单栏:menu:org.eclipse.ui.main.menu

·         主工具栏:toolbar:org.eclipse.ui.main.toolbar

·         所有弹出菜单:popup:org.eclipse.ui.popup.any

这里指定locationURI为主菜单上:menu:org.eclipse.ui.main.menu

如果是popmenu我们针对某一个视图,则:popup:com.my.eclipse.MyView.

放在某一菜单的某个菜单项之后为:menu:com.my.main.menu?after=com.my.menuitem

menucontribution添加一个menu,指定该menu的显示名称labelFile

menu添加一个command,指定该commandidcommand的显示名称labelExit)。

上下文菜单扩展点popmenu

弹出菜单有两个扩展项:objectContributionviewerContribution

以下是一个过滤txtxmljava文件popupMenus配置文件代码

<extension
        point="org.eclipse.ui.popupMenus">
     <objectContribution
           adaptable="false"
           id="cn.ceopen.eclipseone.gencodetools.objectContribution5"
           objectClass="org.eclipse.core.resources.IResource">

<action
               class="jnewscollector.action.JTopElementImport"
               id="JNewsCollector.TopElementImport"
               label="
导出"/>
         <action
               class="jnewscollector.action.JTopElementAutoTrace"
               id="JNewsCollector.TopElementAutoTrace"
               label="
开始跟踪"/>
        <action
              class="cn.ceopen.eclipseone.gencodetools.Action5"
              id="cn.ceopen.eclipseone.gencodetools.action5"
              label="ffffffffff"
              menubarPath="cn.ceopen.eclipseone.gencodetools.Domainmenu">
        </action>
        <visibility>
           <or>
              <objectState
                    name="name"
                    value="*.xml">
              </objectState>
              <objectState
                    name="name"
                    value="*.txt">
              </objectState>
              <objectState
                    name="name"
                    value="*.java">
              </objectState>
           </or>
        </visibility>
     </objectContribution>

<viewerContribution
      id="com.xyz.C2"
      targetID="org.eclipse.ui.views.TaskList">
    <action
      id="com.xyz.showXYZ"
      label="&amp;Show XYZ"
      style="toggle"
      state="true"
      menubarPath="additions"
      icon="icons/showXYZ.gif"
      helpContextId="com.xyz.show_action_context"
      class="com.xyz.actions.XYZShowActionDelegate" />
</viewerContribution>
</extension>

objectClass指出可以接受的目标对象类型。

adaptable指出适配IResource的对象是可接受的目标。一般为false

nameFilter通配符过滤器。

objectContribution中的visibility提供了替代nameFilterobjectClass的方法,功能更为强大。

objectContribution中的filter对操作的过滤,是visibility的一种替代形式(但不包含在visibility中),如<filter name=”priority” value=”1”/>filterobjectState都使用IActionFilter接口,每个选中的对象必须实现IActionFilter接口,并实现其中的testAttribute()方法。

再一种过滤方式是在action中的selection,它也差不多等同于替代nameFilterobjectClass

 

注意:enableFor:是使菜单是否可用(变灰)。而过滤(包括visibilityselectionnameFilterobjectClass)是使菜单是否可见。

 

弹出菜单的实现方式:1通过popmenu扩展点;2通过硬编码;3通过menus扩展项menuContributionpopup:com.mypop.sample.MyViewmenuContribution),结合commands实现扩展点。

 

另一部分:

SWT中的菜单

shell上创建菜单

主要是注意几个参数

Menu bar = new Menu (shell, SWT.BAR);//定义menuBar(位置)

    shell.setMenuBar (bar);

    MenuItem editItem = new MenuItem (bar, SWT.CASCADE);//(在bar创建item

    editItem.setText ("Edit");

    Menu submenu = new Menu (shell, SWT.DROP_DOWN);//创建下拉菜单

    editItem.setMenu (submenu);

    MenuItem item = new MenuItem (submenu, SWT.PUSH);//创建菜单项

    item.addListener (SWT.Selection, new Listener () {

       public void handleEvent (Event e) {

           t.selectAll();

       }

    });

    item.setText ("Select &All\tCtrl+A");

实现动态的menu菜单项

移除然后重新建立

menu.addListener (SWT.Show, new Listener () {

       public void handleEvent (Event event) {

           MenuItem [] menuItems = menu.getItems ();

           for (int i=0; i<menuItems.length; i++) {

              menuItems [i].dispose ();

           }

           TreeItem [] treeItems = tree.getSelection ();

           for (int i=0; i<treeItems.length; i++) {

              MenuItem menuItem = new MenuItem (menu, SWT.PUSH);

              menuItem.setText (treeItems [i].getText ());

           }

       }

    });

实现动态的MenuManager菜单项

menuManager.setRemoveAllWhenShown(true);

eclipse rcp菜单实现

菜单分类

主菜单、视图菜单、上下文菜单

主菜单的实现

1.         ApplicationActionBarAdvisor中实现

覆盖方法makeAction(…),创建actionregister(action)。覆盖方法fillMenuBar(…),在方法中新建一个menuManger(或找个已存在的,其实就是一个菜单),将action添加到menuManager中。

2.         利用org.eclipse.ui.actionSets扩展点

扩展该扩展点,在其上一个actionset,并添加menuaction等。

3.         利用org.eclipse.ui.menusorg.eclipse.ui.commands的组合

扩展commands扩展点,在其上定义一堆command,对每一个command要指定iddefaultHandler类两个值(最低要求);扩展menus扩展点,创建一个menuContribution,在其下可以建立popmenumenudynamicmenucommand等,这里我先简单实现,创建一个menuid可以先不指定),在menu上创建一个command,对于command将其commandId指定为刚才我们创建的commandidOk,菜单就创建好了。

视图/编辑器菜单的实现

实现方式1:在程序creatPartControl()中通过view.getViewSite().getActionBars(). getMenuManager(),(或者getToolBarManager())向其增加action

实现方式2:扩展org.eclipse.ui.viewActionsorg.eclipse.ui.editorActions扩展点

向特定视图添加工具菜单(toolbar),添加下拉式菜单(pull-down),实现接口IViewActionDelegate(IEditorActionDelegate)。须将viewerContribution的属性值设为对应viewID如:targetIDorg.eclipse.jdt.ui.PackageExplorer即向包资源管理器中添加工具菜单和下拉式菜单(好像只有一个菜单)。

上下文菜单

实现方式1:在程序中判断对象等直接写右键菜单和其响应,并注册到视图/编辑器中。

view.getViewSite().registerContextMenu(XXX);

实现方式2:扩展org.eclipse.ui.popupMenus扩展点(待查)

objectContributionviewerContribution两类

objectContribution 实现接口IObjectActionDelegate,向视图上下文中添加弹出式菜单,如包资源管理器、代码编辑区等。

viewerContribution实现接口IViewActionDelegate,向特定视图中添加弹出式菜单,如将viewerContribution属性设置为对应view的值即可,如

idorg.eclipse.jdt.ui.PackageExplorer

targetIDorg.eclipse.jdt.ui.PackageExplorer即向包资源管理器中添加上下文菜单

 

 

 

 

猜你喜欢

转载自sdfx.iteye.com/blog/1941003