欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

eclipse中常规菜单、工具栏

程序员文章站 2022-06-16 22:17:35
...

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.

 

给编辑器添加上下文菜单时,其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即向包资源管理器中添加上下文菜单