這幾天一直在研究popupMenu的Action,想要達(dá)到的目是選中不同的東西彈出不同的菜單。網(wǎng)上有很多介紹的文章,不過很多文章都是一些翻譯過來并且作者沒有自己實(shí)踐過的東西,浪費(fèi)了我很多時(shí)間,最后自己通過摸索,終于找出了這個(gè)問題的解決辦法。
1.文章類型: 這是一篇解決問題的教程,不討論技術(shù)的背景知識(shí),比如運(yùn)用到何種設(shè)計(jì)模式,以及實(shí)現(xiàn)背后的原理等問題。
2.此文對(duì)您的幫助: 看完此文后您將能夠創(chuàng)建一個(gè)由選擇內(nèi)容指定彈出項(xiàng)的動(dòng)態(tài)菜單。
setp1.創(chuàng)建一個(gè)rcp工程,模板使用有一個(gè)view的
step2.創(chuàng)建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.添加擴(kuò)展點(diǎn):
- <?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設(shè)置彈出菜單的彈出位置 修改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已經(jīng)結(jié)束了,現(xiàn)在您可以運(yùn)行一下程序,看看效果.
接下來將要進(jìn)行的是,只有選中Three時(shí)菜單才彈出,選擇其他兩個(gè)則不彈出。 確切的說是只有選擇Three時(shí) <objectContribution id="objectContribution" objectClass="java.lang.Object"> 節(jié)點(diǎn)中的Action才顯示.
接下來: step3_1修改擴(kuò)展點(diǎn) 增加visibility項(xiàng)
- <!-- 彈出菜單的定義 -->
- <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,讓其實(shí)現(xiàn)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;
- }
-
-
- }
然后就完成了,當(dāng)然實(shí)際運(yùn)用中我運(yùn)用了Adapter將DTO適配成IActionFilter接口,這樣DTO就不用和IActionFilter接口耦合了,或許以后的文章會(huì)接受如何適配。
|