20.4 给视图加下拉菜单和按钮
本例将给视图加入下拉菜单和按钮,如图20.4所示。同时再为列表添加一个右键菜单,这样读者可以用来和视图的下拉菜单进行比较阅读。

图20.4 给视图加下拉菜单和按钮
20.4.1 创建ActionGroup类
加入菜单和按钮的方法与SWT/JFace组件的一样。先创建一个ActionGroup代码如下:
public class MyActionGroup extends ActionGroup {
// 加入按钮
public void fillActionBars(IActionBars actionBars) {
if (actionBars == null) return;
IToolBarManager toolBar = actionBars.getToolBarManager();
toolBar.add(new Action1());
toolBar.add(new Action2());
}
// 加入下拉菜单、右键弹出菜单
public void fillContextMenu(IMenuManager menu) {
if (menu == null) return;
menu.add(new Action1());
menu.add(new Action2());
}
private class Action1 extends Action {
public Action1() {
ImageDescriptor
imageDesc = WorkbenchImages.getImageDescriptor(IWorkbenc
hGraphicConstants.IMG_ETOOL_HOME_NAV);
setHoverImageDescriptor(imageDesc);
setText("Action1");
}
public void run() {}
}
private class Action2 extends Action {
public Action2() {
ImageDescriptor
imageDesc = WorkbenchImages.getImageDescriptor(IWorkbenc
hGraphicConstants.IMG_ETOOL_IMPORT_WIZ);
setHoverImageDescriptor(imageDesc);
setText("Action2");
}
public void run() {}
}
}
程序说明:
● 本程序中含有两个Action类:Action1、Action2,和以往的Action不同之处在于它的图像描述符是直接从Eclipse环境中取得。既然插件在Eclipse环境内运行,那么Eclipse环境本身的图标就可以直接拿来使用。不过Eclipse会给出一个警告:“建议不要访问:由于对必需的库….jar具有一定的限制,因此不能访问类型WorkbenchImages”,这是因为该类在internal包中,也就是说它仅限于内部使用。
● fillContextMenu方法比起以前单纯的SWT编程少了几句。在20.4.2小节,可以看到它移到View1类中去了,主要原因是为了此方法兼顾添加视图的下拉菜单。
20.4.2 修改View1类
在View1中增加了3种方法,分别用来加入视图的导航栏按钮、下拉菜单,以及加入列表List的右键菜单。代码如下:
public class View1 extends ViewPart {
private
List list; // 将列表写成类的实例变量,以扩大它的可访问范围
public void createPartControl(Composite parent) {
……
// 加入导航栏按钮、下拉菜单、右键菜单
MyActionGroup actionGroup = new MyActionGroup();
fillViewAction(actionGroup);// 加入视图的导航栏按钮
fillViewMenu(actionGroup);// 加入视图的下拉菜单
fillListMenu(actionGroup);// 加入视图的下拉菜单
}
// 加入视图的导航栏按钮
private void fillViewAction(MyActionGroup actionGroup) {
IActionBars bars = getViewSite().getActionBars();
actionGroup.fillActionBars(bars);
}
// 加入视图的下拉菜单
private void fillViewMenu(MyActionGroup actionGroup) {
IMenuManager manager = getViewSite().getActionBars().getMenuManager();
actionGroup.fillContextMenu(manager);
}
// 加入列表List的右键菜单
private void fillListMenu(MyActionGroup actionGroup) {
MenuManager manger = new MenuManager();
Menu menu = manger.createContextMenu(list);
list.setMenu(menu);
actionGroup.fillContextMenu(manger);
}
public void setFocus() {}
}
程序说明:视图加按钮、菜单的方式和以前SWT的方式是一样的。只不过以前自己生成MenuManager等对象,而现在只需使用插件平台提供的MenuManager对象。






