(本人原创,转载请注明出处)  

       上周五在项目中遇到一个棘手的问题,需要在自己定义的view中得到在workbechwindow里注册到menu的action。这个action不是通过扩展扩展点actionset定义的,就是通过继承Action对象来定义的。经过一番思索后,感觉有两条路可走:

     1.  让这个action继承IPartListener接口,并注册到那个view中,这样在view中可以通过getListeners方法得到注册到这个view中的所有Listener列表,再通过id找到这个action,并改变这个action的状态。但是在后来遇到一个问题,这个action由于是在perspective的ApplicatonActionBarAdvisor的方法中实例化的,比view先初始化,故在aciton中无法得到这个view的实例,因此无法把action注册到view中。不知道是不是我的理解有误,如果这条路可以走通,请达人帮忙。

    2. 然后是在view中调用相应的方法来取得这个action。刚开始时,通过this.getSite().getWorkbenchWindow()方法始终无法得到actionbars,只有强制类型转换到WorkbenchWindow才能得到actionbars,主要是通过以下代码:

WWinActionBars winBars =  ((WorkbenchWindow) this.getSite().
                        getWorkbenchWindow()).getActionBars();
IAction action 
= winBars .getGlobalActionHandler("actionID");
action.setEnable(
true);
      
       但是WWinActionBars类并没有实现通过action的ID得到这个action对象的getGlobalActionHandler方法,该method只返回null,因此此方法也无法达成目标。

       就在我无计可施的时候,只能想到用最笨的办法来实现了,就是在view中得到管理这个aciton的MenuManager,并通过MenuManager来得到和action相关联的MenuItem,最后改变MenuItem的状态来改变action。主要代码如下:

      

        WWinActionBars winBars = ((WorkbenchWindow) this.getSite().
                                                  getWorkbenchWindow()).getActionBars();
        IContributionItem[] contributionItems 
= winBars .
                                                  getMenuManager().getItems();
        
for(int i = 0; i < contributionItems .length; i++) {
            
if (contributionItems[i] instanceof MenuManager) {
                MenuManager menuM
= (MenuManager)contributionItems [i];
                
if (menuM .getId().equals("menumanagerID")) {
                    MenuItem[] menuItems = menuM.getMenu().getItems();
                    
for (int j = 0; j < menuItems.length; j++) {
                        
if (menuItems [j].getText().equals("actionText")) {
                           
menuItems [j].setEnable(true);                   
                        }                            
                    }       

                }
            }
        }
   
      
       经过这次研究,对SWT和JFace的menu管理有了更深的理解,如果中间有什么问题,请达人们指出来,大家一起学习,谢谢!


只有注册用户登录后才能发表评论。


网站导航:
 

posts - 10, comments - 0, trackbacks - 0, articles - 2

Copyright © Li Ya Qiang