eclipse中常规菜单、工具栏
workbench的菜单、工具栏
1扩展org.eclipse.ui.actionSets。该action的label(操作集合的名称)显示在“定制透视图”的对话框中。
2创建menu(如果将action插入到已有的菜单中,不需要创建)。label就是菜单在菜单栏中的名字。
3.创建action。指定action在菜单上的位置,在toolbar上的位置。
其中retarget表示重定目标操作时需要的属性,当试图或编辑器中需要使用全局工作台菜单或工具栏中的操作时,将retarget设置为true。
enableFor的取值:!、?、+、n、*、2+/multiple
view中的action
扩展org.eclipse.ui.viewActions.这些action放在View菜单或是工具栏中。
viewAction:viewContribution
其内的上下文菜单同样扩展自popmenu:viewerContribution、objectContribution见弹出菜单popmenu扩展点。
editor的action
扩展org.eclipse.ui.editorActions.
给editor添加顶层工作台菜单,与一般的工作台菜单不同,编辑器的工作台菜单只有当该编辑器使用时,才会出现(或enable)。其中的targetID值为org.eclipse.ui.DefaultTextEditor.
给编辑器添加上下文菜单时,其popmenu中的viewerContribution中的targetID值为#TextEditorContext,eclipse默认文件编辑器上下文菜单标识符,见弹出菜单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:类型,取值为menu、popup或toolbar
· ID:基准,已存在的菜单ID、工具栏ID或视图ID等,常见的包括:
· 主菜单:org.eclipse.ui.main.menu
· 主工具栏:org.eclipse.ui.main.toolbar
· 弹出菜单:org.eclipse.ui.popup.any
· Query:格式为<placement>=<id>,placement为before、after或endof,id为一个已存在的菜单项。
常见的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的显示名称label为File。
给menu添加一个command,指定该command的id和command的显示名称label(Exit)。
上下文菜单扩展点popmenu
弹出菜单有两个扩展项:objectContribution,viewerContribution。
以下是一个过滤txt,xml,java文件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="&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提供了替代nameFilter和objectClass的方法,功能更为强大。
objectContribution中的filter对操作的过滤,是visibility的一种替代形式(但不包含在visibility中),如<filter name=”priority” value=”1”/>。filter和objectState都使用IActionFilter接口,每个选中的对象必须实现IActionFilter接口,并实现其中的testAttribute()方法。
再一种过滤方式是在action中的selection,它也差不多等同于替代nameFilter和objectClass。
注意:enableFor:是使菜单是否可用(变灰)。而过滤(包括visibility,selection,nameFilter和objectClass)是使菜单是否可见。
弹出菜单的实现方式:1通过popmenu扩展点;2通过硬编码;3通过menus扩展项menuContribution:popup:com.mypop.sample.MyView(menuContribution),结合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(…),创建action并register(action)。覆盖方法fillMenuBar(…),在方法中新建一个menuManger(或找个已存在的,其实就是一个菜单),将action添加到menuManager中。
2. 利用org.eclipse.ui.actionSets扩展点
扩展该扩展点,在其上一个actionset,并添加menu,action等。
3. 利用org.eclipse.ui.menus和org.eclipse.ui.commands的组合
扩展commands扩展点,在其上定义一堆command,对每一个command要指定id和defaultHandler类两个值(最低要求);扩展menus扩展点,创建一个menuContribution,在其下可以建立popmenu,menu,dynamicmenu,command等,这里我先简单实现,创建一个menu(id可以先不指定),在menu上创建一个command,对于command将其commandId指定为刚才我们创建的command的id。Ok,菜单就创建好了。
视图/编辑器菜单的实现
实现方式1:在程序creatPartControl()中通过view.getViewSite().getActionBars(). getMenuManager(),(或者getToolBarManager())向其增加action。
实现方式2:扩展org.eclipse.ui.viewActions或org.eclipse.ui.editorActions扩展点
向特定视图添加工具菜单(toolbar),添加下拉式菜单(pull-down),实现接口IViewActionDelegate(IEditorActionDelegate)。须将viewerContribution的属性值设为对应view的ID,如:targetID:org.eclipse.jdt.ui.PackageExplorer即向包资源管理器中添加工具菜单和下拉式菜单(好像只有一个菜单▼)。
上下文菜单
实现方式1:在程序中判断对象等直接写右键菜单和其响应,并注册到视图/编辑器中。
view.getViewSite().registerContextMenu(XXX);
实现方式2:扩展org.eclipse.ui.popupMenus扩展点(待查)
有objectContribution和viewerContribution两类
l objectContribution 实现接口IObjectActionDelegate,向视图上下文中添加弹出式菜单,如包资源管理器、代码编辑区等。
l viewerContribution实现接口IViewActionDelegate,向特定视图中添加弹出式菜单,如将viewerContribution属性设置为对应view的值即可,如
id:org.eclipse.jdt.ui.PackageExplorer
targetID:org.eclipse.jdt.ui.PackageExplorer即向包资源管理器中添加上下文菜单