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

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

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

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

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

setp1.创建一个rcp工程,模板使用有一个view的
step2.创建popupMenu
step2_1.新建类Action1:
Java代码
   1package solonote.example.popupmenu;  
   
2.   
   
3import org.eclipse.jface.action.IAction;  
   
4import org.eclipse.jface.viewers.ISelection;  
   
5import org.eclipse.ui.IObjectActionDelegate;  
   
6import org.eclipse.ui.IWorkbenchPart;  
   
7.   
   
8public 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代码
   1package solonote.example.popupmenu;  
   
2.   
   
3import org.eclipse.jface.action.MenuManager;  
   
4import org.eclipse.jface.viewers.IStructuredContentProvider;  
   
5import org.eclipse.jface.viewers.ITableLabelProvider;  
   
6import org.eclipse.jface.viewers.LabelProvider;  
   
7import org.eclipse.jface.viewers.TableViewer;  
   
8import org.eclipse.jface.viewers.Viewer;  
   
9import org.eclipse.swt.SWT;  
  
10import org.eclipse.swt.graphics.Image;  
  
11import org.eclipse.swt.widgets.Composite;  
  
12import org.eclipse.swt.widgets.Menu;  
  
13import org.eclipse.ui.ISharedImages;  
  
14import org.eclipse.ui.PlatformUI;  
  
15import org.eclipse.ui.part.ViewPart;  
  
16.   
  
17public 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; 	} 	 	 } 
   1package solonote.example.popupmenu;  
   
2.   
   
3import org.eclipse.ui.IActionFilter;  
   
4.   
   
5/** 
   6.  * Viewer显示的项 
   7.  * 
@author solonote 
   8.  * 
@version 0.1.0 2007-12-26 上午11:49:41 
   9.  
*/
  
  
10public 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
这篇文章欢迎转载和分享,转载时请写明作者和出处,感谢.
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭