RCP权限与菜单

from:http://blog.csdn.net/meteors1113/archive/2009/06/06/4245475.aspx  

1. package com.newautovideo.impclient.app;  

   2. import java.util.ArrayList;  

   3. import java.util.HashMap;  

   4. import java.util.List;  

   5. import java.util.Map;  

   6. import org.eclipse.core.runtime.IConfigurationElement;  

   7. import org.eclipse.swt.graphics.Point;  

   8. import org.eclipse.swt.widgets.Menu;  

   9. import org.eclipse.swt.widgets.MenuItem;  

  10. import org.eclipse.ui.PlatformUI;  

  11. import org.eclipse.ui.application.ActionBarAdvisor;  

  12. import org.eclipse.ui.application.IActionBarConfigurer;  

  13. import org.eclipse.ui.application.IWorkbenchWindowConfigurer;  

  14. import org.eclipse.ui.application.WorkbenchWindowAdvisor;  

  15. import org.eclipse.ui.internal.WorkbenchPlugin;  

  16. import org.eclipse.ui.internal.registry.ActionSetRegistry;  

  17. import org.eclipse.ui.internal.registry.IActionSetDescriptor;  

  18. /** 

  19.  * @author zhanggang 

  20.  *  

  21.  */  

  22. public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {  

  23.     private Map<String, IConfigurationElement> elements = new HashMap<String, IConfigurationElement>();// 存放着action的配置信息,以action中的label作为key  

  24.     private List<String> alist = new ArrayList<String>();// 禁用的ActionId,仿服务端返回  

  25.     public ApplicationWorkbenchWindowAdvisor(  

  26.             IWorkbenchWindowConfigurer configurer) {  

  27.         super(configurer);  

  28.     }  

  29.     public ActionBarAdvisor createActionBarAdvisor(  

  30.             IActionBarConfigurer configurer) {  

  31.         return new ApplicationActionBarAdvisor(configurer);  

  32.     }  

  33.     @SuppressWarnings("restriction")  

  34.     public void preWindowOpen() {  

  35.         IWorkbenchWindowConfigurer configurer = getWindowConfigurer();  

  36.         configurer.setInitialSize(new Point(400, 300));  

  37.         configurer.setShowCoolBar(false);  

  38.         configurer.setShowStatusLine(false);  

  39.         configurer.setTitle("Hello RCP");  

  40.         // 好象只能通过actionset来设置action是否可不可见了,暂时对action无法作呀,真哭  

  41.         ActionSetRegistry reg = WorkbenchPlugin.getDefault()  

  42.                 .getActionSetRegistry();  

  43.         IActionSetDescriptor[] sets = reg.getActionSets();  

  44.         for (IActionSetDescriptor a : sets) {// 这里取到actionSet,并取到actionSet中的所有action配置,这里还取不到action对象的,需要在postwindow后才能取到  

  45.             IConfigurationElement element = a.getConfigurationElement();  

  46.             IConfigurationElement[] es = element.getChildren();  

  47.             // a.setInitiallyVisible(false);//设置actionSet的属性  

  48.             for (IConfigurationElement e : es) {  

  49.                 if (!e.getName().equals("action"))// 记住一定是要action  

  50.                     continue;  

  51.                 elements.put(e.getAttribute("label"), e);// 存放所有action的配置  

  52.             }  

  53.         }  

  54.     }  

  55.     @SuppressWarnings( { "restriction", "unchecked" })  

  56.     public void postWindowOpen() {// 这里可以设置action为不可用,但不能隐藏  

  57.         super.postWindowOpen();  

  58.         MenuItem[] items = PlatformUI.getWorkbench().getActiveWorkbenchWindow()  

  59.                 .getShell().getMenuBar().getItems();  

  60.         alist.add("com.gzhnag.SampleActionTest3");// 有一个禁用权限  

  61.         initMenu(items);  

  62.         PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell()  

  63.                 .layout();  

  64.     }  

  65.     /** 

  66.      * 菜单项 

  67.      *  

  68.      * @param items 

  69.      * @return 

  70.      */  

  71.     private boolean initMenu(MenuItem[] items) {  

  72.         String menuId;  

  73.         boolean flag = false;// 此项菜单的父菜单是否显视标志,默认为不可显视,即要dispose(),但若有一个菜单,则为true  

  74.         for (MenuItem item : items) {  

  75.             Menu menu = item.getMenu();  

  76.             if (menu == null)  

  77.                 continue;  

  78.             MenuItem[] ims = menu.getItems();  

  79.             int y = 0;  

  80.             for (MenuItem mi : ims) {  

  81.                 boolean tmpFlag = false;  

  82.                 if (mi.getText().equals("")) {  

  83.                     continue;  

  84.                 }  

  85.                 if (mi.getMenu() != null && mi.getMenu().getItemCount() > 0) {  

  86.                     tmpFlag = initMenu(new MenuItem[] { mi });// 递归处理菜单,mi本身就是一个MenuItem  

  87.                     if (!tmpFlag) {  

  88.                         ims[y--].dispose();// 让分隔线也禁用  

  89.                         mi.dispose();  

  90.                         continue;  

  91.                     }  

  92.                 }  

  93.                 menuId = getMenuId(mi.getText());// 有下级菜单时是不会取不到id的  

  94.                 if (menuId == null)  

  95.                     continue;  

  96.                 if (alist.contains(menuId)) {// 若禁用权限里包括了些ID则禁用  

  97.                     mi.dispose();  

  98.                 } else {  

  99.                     flag = !flag;// 设为true即显神曲菜单  

100.                 }  

101.                 y++;  

102.             }  

103.         }  

104.         return flag;  

105.     }  

106.     /** 

107.      * @param name 

108.      *            action中的label,注意有快捷方式,有快捷方式会以/t分隔 

109.      * @return 

110.      */  

111.     private String getMenuId(String name) {  

112.         String lable = name.split(" ")[0];  

113.         if (elements.get(lable) == null)  

114.             return null;  

115.         return elements.get(lable).getAttribute("id");// 快捷方式与label是以/t相隔的  

116.     }  

117. }   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值