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

文章转载自: http://solonote.javaeye.com/blog/150906   作者:solonote

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

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

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

setp1.创建一个rcp工程,模板使用有一个view的
step2.创建popupMenu
step2_1.新建类Action1:
Java代码
    1 package  solonote.example.popupmenu;  
   
2 .   
   
3 import  org.eclipse.jface.action.IAction;  
   
4 import  org.eclipse.jface.viewers.ISelection;  
   
5 import  org.eclipse.ui.IObjectActionDelegate;  
   
6 import  org.eclipse.ui.IWorkbenchPart;  
   
7 .   
   
8 public   class  Action1  implements  IObjectActionDelegate  {  
   
9.   
  
10.     @Override  
  
11.     public void setActivePart(IAction action, IWorkbenchPart targetPart) {  
  
12.         // TODO Auto-generated method stub  
  13.   
  
14.     }
  
  
15.   
  
16.     @Override  
  
17.     public void run(IAction action) {  
  
18.         // TODO Auto-generated method stub  
  19.   
  
20.     }
  
  
21.   
  
22.     @Override  
  
23.     public void selectionChanged(IAction action, ISelection selection) {  
  
24.         // TODO Auto-generated method stub  
  25.   
  
26.     }
  
  
27.   
  
28. }
  

step2_2.添加扩展点:
   1.  <? xml version="1.0" encoding="UTF-8" ?>   
   2. 
<? eclipse version="3.2" ?>   
   3. 
< plugin >   
   4.   
   5.    
< extension  
   
6.          id ="application"   
   7.          point
="org.eclipse.core.runtime.applications" >   
   8.       
< application >   
   9.          
< run  
  
10.                class ="solonote.example.popupmenu.Application" >   
  11.          
</ run >   
  12.       
</ application >   
  13.    
</ extension >   
  14.    
< extension  
  
15.          point ="org.eclipse.ui.perspectives" >   
  16.       
< perspective  
  
17.             name ="Perspective"   
  18.             class
="solonote.example.popupmenu.Perspective"   
  19.             id
="solonote.example.popupMenu.perspective" >   
  20.       
</ perspective >   
  21.    
</ extension >   
  22.    
< extension  
  
23.          point ="org.eclipse.ui.views" >   
  24.       
< view  
  
25.             name ="View"   
  26.             class
="solonote.example.popupmenu.View"   
  27.             id
="solonote.example.popupMenu.view" >   
  28.       
</ view >   
  29.    
</ extension >   
  30.    
<!--  弹出菜单的定义  -->   
  31.    
< extension  
  
32.          point ="org.eclipse.ui.popupMenus" >   
  33.       
< objectContribution  
  
34.             id ="objectContribution"   
  35.             objectClass
="java.lang.Object" >   
  36.          
< action  
  
37.                class ="solonote.example.popupmenu.Action1"   
  38.                id
="solonote.example.popupMenu.action1"   
  39.                label
="label" >   
  40.          
</ action >   
  41.       
</ objectContribution >   
  42.    
</ extension >   
  43.   
  44. 
</ plugin >  
<?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类
Java代码
    1 package  solonote.example.popupmenu;  
   
2 .   
   
3 import  org.eclipse.jface.action.MenuManager;  
   
4 import  org.eclipse.jface.viewers.IStructuredContentProvider;  
   
5 import  org.eclipse.jface.viewers.ITableLabelProvider;  
   
6 import  org.eclipse.jface.viewers.LabelProvider;  
   
7 import  org.eclipse.jface.viewers.TableViewer;  
   
8 import  org.eclipse.jface.viewers.Viewer;  
   
9 import  org.eclipse.swt.SWT;  
  
10 import  org.eclipse.swt.graphics.Image;  
  
11 import  org.eclipse.swt.widgets.Composite;  
  
12 import  org.eclipse.swt.widgets.Menu;  
  
13 import  org.eclipse.ui.ISharedImages;  
  
14 import  org.eclipse.ui.PlatformUI;  
  
15 import  org.eclipse.ui.part.ViewPart;  
  
16 .   
  
17 public   class  View  extends  ViewPart  {  
  
18.     public static final String ID = "solonote.example.popupMenu.view";  
  
19.   
  
20.     private TableViewer viewer;  
  
21.   
  
22.     /** 
  23.      * The content provider class is responsible for providing objects to the 
  24.      * view. It can wrap existing objects in adapters or simply return objects 
  25.      * as-is. These objects may be sensitive to the current input of the view, 
  26.      * or ignore it and always show the same content (like Task List, for 
  27.      * example). 
  28.      
*/
  
  
29.     class ViewContentProvider implements IStructuredContentProvider {  
  
30.         public void inputChanged(Viewer v, Object oldInput, Object newInput) {  
  
31.         }
  
  
32.   
  
33.         public void dispose() {  
  
34.         }
  
  
35.   
  
36.         public Object[] getElements(Object parent) {  
  
37.             return new SimpleDTO[] new SimpleDTO("One"), new SimpleDTO("Two"), 
                                                                       new SimpleDTO("Three") }
;  
  
38.               
  
39.         }
  
  
40.     }
  
  
41.   
  
42.     class ViewLabelProvider extends LabelProvider implements  
  
43.             ITableLabelProvider {  
  
44.         public String getColumnText(Object obj, int index) {  
  
45.             SimpleDTO dto = (SimpleDTO) obj;  
  
46.             return dto.getName();  
  
47.         }
  
  
48.   
  
49.         public Image getColumnImage(Object obj, int index) {  
  
50.             return getImage(obj);  
  
51.         }
  
  
52.   
  
53.         public Image getImage(Object obj) {  
  
54.             return PlatformUI.getWorkbench().getSharedImages().getImage(  
  
55.                     ISharedImages.IMG_OBJ_ELEMENT);  
  
56.         }
  
  
57.     }
  
  
58.   
  
59.     /** 
  60.      * This is a callback that will allow us to create the viewer and initialize 
  61.      * it. 
  62.      
*/
  
  
63.     public void createPartControl(Composite parent) {  
  
64.         viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL  
  
65.                 | SWT.V_SCROLL);  
  
66.         viewer.setContentProvider(new ViewContentProvider());  
  
67.         viewer.setLabelProvider(new ViewLabelProvider());  
  
68.         viewer.setInput(getViewSite());  
  
69.           
  
70.         //初始化弹出菜单  
  71.         MenuManager popupMenuManager = new MenuManager("#PopupMenu");  
  
72.         popupMenuManager.setRemoveAllWhenShown(true);  
  
73.         Menu popupMenu = popupMenuManager.createContextMenu(viewer.getTable());  
  
74.         viewer.getTable().setMenu(popupMenu);  
  
75.         //设置选择提供者和弹出菜单  
  76.         getSite().setSelectionProvider(viewer);  
  
77.         getSite().registerContextMenu(popupMenuManager, viewer);  
  
78.     }
  
  
79.   
  
80.     /** 
  81.      * Passing the focus request to the viewer's control. 
  82.      
*/
  
  
83.     public void setFocus() {  
  
84.         viewer.getControl().setFocus();  
  
85.     }
  
  
86. }
  


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

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

接下来:
step3_1修改扩展点 增加visibility项
Java代码 
  <!-- 弹出菜单的定义 -->    <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> 
   1.  <!--  弹出菜单的定义  -->   
   2.  
< extension  
   
3.        point ="org.eclipse.ui.popupMenus" >   
   4.     
< objectContribution  
   
5.           id ="objectContribution"   
   6.           objectClass
="java.lang.Object" >   
   7.        
< action  
   
8.              class ="solonote.example.popupmenu.Action1"   
   9.              id
="solonote.example.popupMenu.action1"   
  10.              label
="label" >   
  11.        
</ action >   
  12.        
< visibility >   
  13.           
< objectState  
  
14.                 name ="name"   
  15.                 value
="Three" >   
  16.           
</ objectState >   
  17.        
</ visibility >   
  18.     
</ objectContribution >   
  19.  
</ extension >   

修改被选中的DTO,让其实现IActionFilter接口
Java代码 
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; 	} 	 	 } 
    1 package  solonote.example.popupmenu;  
   
2 .   
   
3 import  org.eclipse.ui.IActionFilter;  
   
4 .   
   
5 /** 
   6.  * Viewer显示的项 
   7.  * 
@author solonote 
   8.  * 
@version 0.1.0 2007-12-26 上午11:49:41 
   9.  
*/
  
  
10 public   class  SimpleDTO  implements  IActionFilter {  
  
11.     /** 
  12.      * 显示的名字 
  13.      
*/
  
  
14.     private String name;  
  
15.   
  
16.     /** 
  17.      * 返回显示的名字 
  18.      * 
@return 显示的名字 
  19.      
*/
  
  
20.     public String getName() {  
  
21.         return name;  
  
22.     }
  
  
23.   
  
24.     /** 
  25.      * 设置显示的名字 
  26.      * 
@param name 显示的名字 
  27.      
*/
  
  
28.     public void setName(String name) {  
  
29.         this.name = name;  
  
30.     }
  
  
31.   
  
32.     public SimpleDTO(String name) {  
  
33.         super();  
  
34.         this.name = name;  
  
35.     }
  
  
36.   
  
37.     /** 
  38.      * 选择时候是否显示Action的判断 
  39.      * <visibility> 
  40.             <objectState 
  41.                   name="name" 
  42.                   value="Three"> 
  43.             </objectState> 
  44.          </visibility> 
  45.      * 
@param target 选择的东西 
  46.      * 
@param name plugin.xml里配置的name 
  47.      * 
@param value plugin.xml里配置的value 
  48.      
*/
  
  
49.     @Override  
  
50.     public boolean testAttribute(Object target, String name, String value) {  
  
51.         System.out.println(name);  
  
52.         System.out.println(value);  
  
53.         System.out.println(target);  
  
54.         SimpleDTO dto = (SimpleDTO) target;  
  
55.         if(dto.getName().equals(value))  
  
56.             return true;      
  
57.         return false;  
  
58.     }
  
  
59.       
  
60.       
  
61. }
  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值