Posted on 2008-07-13 09:55
Li Ya Qiang 阅读(2128)
评论(0) 编辑 收藏 所属分类:
Eclipse RCP
(本人原创,转载请注明出处)
上周五在项目中遇到一个棘手的问题,需要在自己定义的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管理有了更深的理解,如果中间有什么问题,请达人们指出来,大家一起学习,谢谢!