Eclipse主菜单(顶级)显示操作:MainMenuEvent

时间:2011-03-12 13:19:11

标签: eclipse events view menu eclipse-plugin

我在eclipse论坛上搜索了Google And Asked,但仍然混淆了如何做到这一点: 我得到了SWT的例子:

public class MenuActionListenerShow {

public static void main(String [] args){     显示display = new Display();     Shell shell = new Shell(显示);

Listener showListener = new Listener() {
  public void handleEvent(Event event) {
    Menu menu = (Menu) event.widget;
    MenuItem item = menu.getParentItem();
    if (item != null) {
      System.out.println(item.getText());

    }
  }
};

Menu menuBar = new Menu(shell, SWT.BAR);
shell.setMenuBar(menuBar);
MenuItem fileItem = new MenuItem(menuBar, SWT.CASCADE);
fileItem.setText("File");
MenuItem editItem = new MenuItem(menuBar, SWT.CASCADE);
editItem.setText("Edit");
Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
fileMenu.addListener(SWT.Show, showListener);
fileItem.setMenu(fileMenu);

shell.open();
while (!shell.isDisposed()) {
  if (!display.readAndDispatch())
    display.sleep();
}
display.dispose();

}

}

我希望对主菜单做同样的事情(例如文件/搜索/编辑)。 我有插件,我的目的是在文件/编辑/搜索....(菜单)按下/显示/级联时,我的视图中显示菜单名称的文本。 是否可以或不允许获取Eclipse主菜单的API引用? 一些提示会很棒。

感谢

1 个答案:

答案 0 :(得分:1)

你可以这么做,但它并不像看起来那么容易。 eclipse中的主菜单非常动态。例如,子菜单是懒惰的,或者编辑器的切换可能会在顶部显示新菜单。您必须确保始终注册/取消注册您的听众。

如果创建视图,则可以使用给定的父组合来获取主菜单并注册监听器。但正如我所说,你必须确保一直注册/取消注册听众,否则你会得到内存泄漏,多个注册听众......

以下是注册的示例视图。它不会跟踪新项目/消失的项目(做这项作业;)。)。

public class ViewPart1 extends ViewPart {
    @Override
    public void createPartControl(Composite parent) {
        Shell shell = parent.getParent().getShell();
        Menu menu = shell.getMenuBar();
        addListeners(menu);
    }

    private void addListeners(Menu menu) {
        menu.addListener(SWT.Show, showListener);
        for (MenuItem item : menu.getItems()) {
            Menu subMenu = item.getMenu();
            if (subMenu != null) {
                addListeners(subMenu);
            }
        }
    }

    Listener showListener = new Listener() {
        public void handleEvent(Event event) {
            Menu menu = (Menu) event.widget;
            MenuItem item = menu.getParentItem();
            if (item != null) {
                System.out.println(item.getText());
            }
        }
    };

    @Override
    public void setFocus() {
    }
}