eclipse popupMene高级教程:使用Visibility定制弹出菜单

这几天一直在研究popupMenu的Action,想要达到的目是选中不同的东西弹出不同的菜单。网上有很多介绍的文章,不过很多文章都是一些翻译过来并且作者没有自己实践过的东西,浪费了我很多时间,最后自己通过摸索,终于找出了这个问题的解决办法。

1.文章类型:
这是一篇解决问题的教程,不讨论技术的背景知识,比如运用到何种设计模式,以及实现背后的原理等问题。

2.此文对您的帮助:
看完此文后您将能够创建一个由选择内容指定弹出项的动态菜单。

setp1.创建一个rcp工程,模板使用有一个view的

step2.创建popupMenu
step2_1.新建类Action1:
[code]
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) {
// TODO Auto-generated method stub

}

@Override
public void run(IAction action) {
// TODO Auto-generated method stub

}

@Override
public void selectionChanged(IAction action, ISelection selection) {
// TODO Auto-generated method stub

}

}
[/code]

step2_2.添加扩展点:

[code]
<?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>
[/code]

step2_3设置弹出菜单的弹出位置
修改View类
[code]
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;

/**
* The content provider class is responsible for providing objects to the
* view. It can wrap existing objects in adapters or simply return objects
* as-is. These objects may be sensitive to the current input of the view,
* or ignore it and always show the same content (like Task List, for
* example).
*/
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);
}
}

/**
* This is a callback that will allow us to create the viewer and initialize
* it.
*/
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);
}

/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
viewer.getControl().setFocus();
}
}
[/code]

好的step2已经结束了,现在您可以运行一下程序,看看效果.

接下来将要进行的是,只有选中Three时菜单才弹出,选择其他两个则不弹出。
确切的说是只有选择Three时
<objectContribution
id="objectContribution"
objectClass="java.lang.Object">
节点中的Action才显示.

接下来:
step3_1修改扩展点 增加visibility项
[code]
<!-- 弹出菜单的定义 -->
<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>
[/code]

修改被选中的DTO,让其实现IActionFilter接口
[code]
package solonote.example.popupmenu;

import org.eclipse.ui.IActionFilter;

/**
* Viewer显示的项
* @author solonote
* @version 0.1.0 2007-12-26 上午11:49:41
*/
public class SimpleDTO implements IActionFilter{
/**
* 显示的名字
*/
private String name;

/**
* 返回显示的名字
* @return 显示的名字
*/
public String getName() {
return name;
}

/**
* 设置显示的名字
* @param name 显示的名字
*/
public void setName(String name) {
this.name = name;
}

public SimpleDTO(String name) {
super();
this.name = name;
}

/**
* 选择时候是否显示Action的判断
* <visibility>
<objectState
name="name"
value="Three">
</objectState>
</visibility>
* @param target 选择的东西
* @param name plugin.xml里配置的name
* @param value plugin.xml里配置的value
*/
@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;
}


}
[/code]

然后就完成了,当然实际运用中我运用了Adapter将DTO适配成IActionFilter接口,这样DTO就不用和IActionFilter接口耦合了,或许以后的文章会接受如何适配。这里已经解决了问题,好的如果有任何疑问请联系我
solonote@163.com
这篇文章欢迎转载和分享,转载时请写明作者和出处,感谢.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值