Главное меню Eclipse (верхний уровень) Показать действие: MainMenuEvent - PullRequest
0 голосов
/ 12 марта 2011

Я искал в Google и спрашивал в форуме Eclipse, но все еще не понимал, как это сделать: У меня есть пример для SWT:

public class MenuActionListenerShow {

public static void main (аргументы String []) { Дисплей дисплей = новый дисплей (); Shell 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();

}

}

Я хочу сделать то же самое, но в главном меню (например, Файл / Поиск / Редактировать). У меня есть плагин с тем, что моя цель, когда File / Edit / Search .... (Menus) нажата / показана / каскадно, текст с названием меню отображается в моем представлении. Возможно ли или не разрешено получать ссылки на API из Главного меню Eclipse? Это будет здорово для некоторых советов.

БЛАГОДАРЯ

1 Ответ

1 голос
/ 12 марта 2011

Вы можете сделать это, хотя это не так просто, как может показаться.Главное меню в 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() {
    }
}
...