Скриване на елементи от менюто в TreeViewer

Опитвам се да скрия/покажа елемент от подменю (menumanager) от контекста (изскачащо меню), когато определен възел е избран/не е избран в дървото.

Въпреки че методите setVisible се задействат според очакванията, това не оказва влияние.

Кодът:

TreeViewer tViewer;

tViewer = new TreeViewer(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);

tViewer.setLabelProvider(new WorkbenchLabelProvider());
tViewer.setContentProvider(new BaseWorkbenchContentProvider());
tViewer.setInput(viewFactory.getInstance().getRoot());      


final MenuManager menuMain = new MenuManager("Main",null);
menuMain.add(mActionClose);


MenuManager menuManager = new MenuManager("#PopupMenu", "contextMenu");
menuManager.add(menuMain);


menuManager.addMenuListener(new IMenuListener() {           
    public void menuAboutToShow(IMenuManager manager) {             

        //Get the selected node in tree
        IStructuredSelection selection = (IStructuredSelection) tViewer.getSelection();

        if (!selection.isEmpty()) { //If something selected
            NNodeBase ob = (NNodeBase) selection.getFirstElement(); //Get the base class of node                                    

            if (!(ob instanceof NTMModel)) {                        
                menuMain.setVisible(false);                     
            }
            else
                menuMain.setVisible(true);                      
        }
    }
});


Menu menu = menuManager.createContextMenu(tViewer.getControl());
tViewer.getControl().setMenu(menu);

person kenny    schedule 08.11.2011    source източник


Отговори (1)


Трябва да настроите мениджъра да пресъздаде менюто, преди да се покаже:

menuManager.setRemoveAllWhenShown(true);

След това в menuAboutToShow() добавяте елементите, като тествате състоянието, от което се нуждаете:

if ((ob instanceof NTMModel)) {
    menuManager.add(mActionClose);
} else {
    // don't show the menu item
}

Вече нямате нужда от menuMain.

person True Soft    schedule 08.11.2011
comment
1)какво имаш предвид, че нямам нужда от главно меню? този мениджър действа като подменю, има няколко елемента от менюто вътре! 2) в истинската ми структура на менюто имам други елементи до менюто Main, RemoveAllWhenShown ще изисква от мен да възстановявам всяко нещо всеки път - person kenny; 09.11.2011
comment
Да, менюто ще се създава отново при всяко показване. Ако menuMain е подменю, тогава е добре. - person True Soft; 09.11.2011
comment
но защо не мога просто да задам видимостта? - person kenny; 09.11.2011
comment
Мисля, че трябва да се обадите на menuManager.update(true); (вижте този отговор: stackoverflow.com/questions/7825162/) Не го тествах. - person True Soft; 09.11.2011
comment
Опитах и ​​това... възможно ли е да деактивирате MenuManager, така че това подменю да се показва в сиво? Мога да задам setEnabled(false) само за действие, но не и за menumanager - person kenny; 09.11.2011