这几天一直在研究popupMenu的Action,想要达到的目是选中不同的东西弹出不同的菜单。网上有很多介绍的文章,不过很多文章都是一些翻译过来并且作者没有自己实践过的东西,浪费了我很多时间,最后自己通过摸索,终于找出了这个问题的解决办法。
1.文章类型: 这是一篇解决问题的教程,不讨论技术的背景知识,比如运用到何种设计模式,以及实现背后的原理等问题。
2.此文对您的帮助: 看完此文后您将能够创建一个由选择内容指定弹出项的动态菜单。
setp1.创建一个rcp工程,模板使用有一个view的
step2.创建popupMenu step2_1.新建类Action1:
- package solonote.example.popupmenu;
-
- import org.eclipse.jface.action.IAction;
- import org.eclipse.jface.viewers.ISelection;
- import org.eclipse.ui.IObjectActionDelegate;
- import org.eclipse.ui.IWorkbenchPart;
-
- public class Action1 implements IObjectActionDelegate {
-
- @Override
- public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-
-
- }
-
- @Override
- public void run(IAction action) {
-
-
- }
-
- @Override
- public void selectionChanged(IAction action, ISelection selection) {
-
-
- }
-
- }
step2_2.添加扩展点:
- <?xml version="1.0" encoding="UTF-8"?>
- <?eclipse version="3.2"?>
- <plugin>
-
- <extension
- id="application"
- point="org.eclipse.core.runtime.applications">
- <application>
- <run
- class="solonote.example.popupmenu.Application">
- </run>
- </application>
- </extension>
- <extension
- point="org.eclipse.ui.perspectives">
- <perspective
- name="Perspective"
- class="solonote.example.popupmenu.Perspective"
- id="solonote.example.popupMenu.perspective">
- </perspective>
- </extension>
- <extension
- point="org.eclipse.ui.views">
- <view
- name="View"
- class="solonote.example.popupmenu.View"
- id="solonote.example.popupMenu.view">
- </view>
- </extension>
- <!-- 弹出菜单的定义 -->
- <extension
- point="org.eclipse.ui.popupMenus">
- <objectContribution
- id="objectContribution"
- objectClass="java.lang.Object">
- <action
- class="solonote.example.popupmenu.Action1"
- id="solonote.example.popupMenu.action1"
- label="label">
- </action>
- </objectContribution>
- </extension>
-
- </plugin>
step2_3设置弹出菜单的弹出位置 修改View类
- package solonote.example.popupmenu;
-
- import org.eclipse.jface.action.MenuManager;
- import org.eclipse.jface.viewers.IStructuredContentProvider;
- import org.eclipse.jface.viewers.ITableLabelProvider;
- import org.eclipse.jface.viewers.LabelProvider;
- import org.eclipse.jface.viewers.TableViewer;
- import org.eclipse.jface.viewers.Viewer;
- import org.eclipse.swt.SWT;
- import org.eclipse.swt.graphics.Image;
- import org.eclipse.swt.widgets.Composite;
- import org.eclipse.swt.widgets.Menu;
- import org.eclipse.ui.ISharedImages;
- import org.eclipse.ui.PlatformUI;
- import org.eclipse.ui.part.ViewPart;
-
- public class View extends ViewPart {
- public static final String ID = "solonote.example.popupMenu.view";
-
- private TableViewer viewer;
-
-
-
-
-
-
-
-
- class ViewContentProvider implements IStructuredContentProvider {
- public void inputChanged(Viewer v, Object oldInput, Object newInput) {
- }
-
- public void dispose() {
- }
-
- public Object[] getElements(Object parent) {
- return new SimpleDTO[] { new SimpleDTO("One"), new SimpleDTO("Two"), new SimpleDTO("Three") };
-
- }
- }
-
- class ViewLabelProvider extends LabelProvider implements
- ITableLabelProvider {
- public String getColumnText(Object obj, int index) {
- SimpleDTO dto = (SimpleDTO) obj;
- return dto.getName();
- }
-
- public Image getColumnImage(Object obj, int index) {
- return getImage(obj);
- }
-
- public Image getImage(Object obj) {
- return PlatformUI.getWorkbench().getSharedImages().getImage(
- ISharedImages.IMG_OBJ_ELEMENT);
- }
- }
-
-
-
-
-
- public void createPartControl(Composite parent) {
- viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
- | SWT.V_SCROLL);
- viewer.setContentProvider(new ViewContentProvider());
- viewer.setLabelProvider(new ViewLabelProvider());
- viewer.setInput(getViewSite());
-
-
- MenuManager popupMenuManager = new MenuManager("#PopupMenu");
- popupMenuManager.setRemoveAllWhenShown(true);
- Menu popupMenu = popupMenuManager.createContextMenu(viewer.getTable());
- viewer.getTable().setMenu(popupMenu);
-
- getSite().setSelectionProvider(viewer);
- getSite().registerContextMenu(popupMenuManager, viewer);
- }
-
-
-
-
- public void setFocus() {
- viewer.getControl().setFocus();
- }
- }
好的step2已经结束了,现在您可以运行一下程序,看看效果.
接下来将要进行的是,只有选中Three时菜单才弹出,选择其他两个则不弹出。 确切的说是只有选择Three时 <objectContribution id="objectContribution" objectClass="java.lang.Object"> 节点中的Action才显示.
接下来: step3_1修改扩展点 增加visibility项
- <!-- 弹出菜单的定义 -->
- <extension
- point="org.eclipse.ui.popupMenus">
- <objectContribution
- id="objectContribution"
- objectClass="java.lang.Object">
- <action
- class="solonote.example.popupmenu.Action1"
- id="solonote.example.popupMenu.action1"
- label="label">
- </action>
- <visibility>
- <objectState
- name="name"
- value="Three">
- </objectState>
- </visibility>
- </objectContribution>
- </extension>
修改被选中的DTO,让其实现IActionFilter接口
- package solonote.example.popupmenu;
-
- import org.eclipse.ui.IActionFilter;
-
-
-
-
-
-
- public class SimpleDTO implements IActionFilter{
-
-
-
- private String name;
-
-
-
-
-
- public String getName() {
- return name;
- }
-
-
-
-
-
- public void setName(String name) {
- this.name = name;
- }
-
- public SimpleDTO(String name) {
- super();
- this.name = name;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- @Override
- public boolean testAttribute(Object target, String name, String value) {
- System.out.println(name);
- System.out.println(value);
- System.out.println(target);
- SimpleDTO dto = (SimpleDTO) target;
- if(dto.getName().equals(value))
- return true;
- return false;
- }
-
-
- }
然后就完成了,当然实际运用中我运用了Adapter将DTO适配成IActionFilter接口,这样DTO就不用和IActionFilter接口耦合了,或许以后的文章会接受如何适配。
|