Контекстное меню для TreeViewer на основе выбранного узла - SWT - PullRequest
9 голосов
/ 02 июня 2011

Мне нужно создать контекстное меню для TreeViewer в проекте плагина Eclipse. Но меню не должно содержать постоянных пунктов, они должны различаться в зависимости от типа выбранного узла. Например, мой treeViewer имеет следующую иерархию:

Node A
 |
 --Node B
  |
   --Node C

Для узла A - я хочу показать меню с действием, но для узлов B и C я не хочу ничего показывать (без меню). Мне удалось создать меню для узла A, но потом я не могу избавиться от него, когда выбран какой-то другой тип узла. Мой код выглядит так:

treeViewer.addSelectionChangedListener(
            new ISelectionChangedListener(){
                public void selectionChanged(SelectionChangedEvent event) {
                    if(event.getSelection() instanceof IStructuredSelection) {
                        IStructuredSelection selection = (IStructuredSelection)event.getSelection();            
                        Object o = selection.getFirstElement();     

                        MenuManager menuMgr = new MenuManager();

                        if (o instanceof NodeA){

                            Menu menu = menuMgr.createContextMenu(treeViewer.getControl());
                            treeViewer.getControl().setMenu(menu);
                            getSite().registerContextMenu(menuMgr, treeViewer);

                            menuMgr.add(new SomeAction());

                        }else {
                            //what ?
                        }
                    }

                }
            }   
    );

В другой ветке я пытался вызвать dispose(), removeAll() в MenuManager ... ничего не работает!

Любая помощь приветствуется, спасибо.

Ответы [ 4 ]

11 голосов
/ 02 июня 2011

Как уже упоминалось @jeeeyul, вы должны создать только один MenuManager для использования в вашем представлении.

Вы можете использовать New> Plug-in Project и шаблон представления, чтобы получить пример контекстного меню в представлении с использованием средства просмотра, но в основном в вашем методе createPartControl(Composite) вы бы подключили свой менеджер контекста.

    MenuManager menuMgr = new MenuManager();
    menuMgr.setRemoveAllWhenShown(true);
    menuMgr.addMenuListener(new IMenuListener() {
        public void menuAboutToShow(IMenuManager manager) {
            SampleView.this.fillContextMenu(manager);
        }
    });
    Menu menu = menuMgr.createContextMenu(viewer.getControl());
    viewer.getControl().setMenu(menu);
    getSite().registerContextMenu(menuMgr, viewer);

Ваш метод fillContextMenu(MenuManager) будет иметь доступ к вашему средству просмотра, так что вы можете получить текущий выбор из этого. Вы можете добавить любые действия, которые вы хотите, даже повторно добавить действия после обновления их с текущим выбором.

Вызов registerContextMenu(*) позволяет точкам расширения, таким как org.eclipse.ui.popupMenus и org.eclipse.ui.menus, добавлять элементы в ваше контекстное меню.

8 голосов
/ 02 июня 2011

Просто используйте один менеджер меню.Не создавайте Менеджер меню динамически.

в теории. Возможно, вы пробовали, но это неэффективно и не является общим способом.

Просто создайте Менеджер меню и добавьте все необходимые действия.

когда выбор был изменен, вызовите Action # setVisible (true | false), чтобы скрыть или показать пункты меню.Вы также можете использовать Action # setEnable для включения / выключения пункта меню.

пс.Менеджер меню не является графическим интерфейсом меню (например, TreeViewer - это не дерево)

Он добавляет Действия (бизнес-логику) в Меню (SWT).И это также управляет видимостью и активацией.Мы называем это менеджер вкладов.Мы можем создать меню SWT очень легко с этим.(даже если мы не знаем о SWT, нам нужно знать только нашу бизнес-логику: Действие) Это фундаментальная идея в JFace.

Когда вы добавляете действие в менеджер manu, оно будет заключено в ActionContributionItem.Он перехватывает состояние действия для обновления пользовательского интерфейса (видимость, включение меню, кнопки, панели инструментов и т. Д.).Он также перехватывает пользовательский интерфейс для запуска действия при его нажатии.

Если вы новичок в затмении, легко спутать роль SWT и JFace.

7 голосов
/ 30 января 2012

Вот как я это делаю:

MenuManager menuMgr = new MenuManager();

        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        menuMgr.addMenuListener(new IMenuListener() {
            @Override
            public void menuAboutToShow(IMenuManager manager) {
                // IWorkbench wb = PlatformUI.getWorkbench();
                // IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
                if (viewer.getSelection().isEmpty()) {
                    return;
                }

                if (viewer.getSelection() instanceof IStructuredSelection) {
                    IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
                    Node object = (Node)selection.getFirstElement();

                    if (object.getModel() instanceof NodeA) {
                        manager.add(new Action();
                    } else if (object.getModel() instanceof NodeB) {

                        manager.add(new OtherAction());

                    }
                }
            }
        });
        menuMgr.setRemoveAllWhenShown(true);
        viewer.getControl().setMenu(menu);

Надеюсь, это поможет;)

Важно установить для свойства removeAllWhenShown менеджера меню значение false, чтобы скрыть все действия других узлов;)

0 голосов
/ 29 мая 2017

Предположим, что вы знаете, как создать Action, и вас интересует только контекстное меню, следующий пример сработал для меня, надеюсь, этот набор кода поможет вам

 private void hookContextMenu() {
    MenuManager contextMenu = new MenuManager();
    contextMenu.setRemoveAllWhenShown(true);
    contextMenu.addMenuListener(new IMenuListener() {

        @Override
        public void menuAboutToShow(IMenuManager manager) {



            IStructuredSelection sSelection = (IStructuredSelection) treeViewer.getSelection();

            }
            if(selectedObject instanceof A){
            manager.add(action);
            }

        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...