分享

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

 江江385 2013-03-22
这几天一直在研究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.添加扩展点: 

Java代码  收藏代码
  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>  


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代码  收藏代码
  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代码  收藏代码
  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接口耦合了,或许以后的文章会接受如何适配。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多