Затмение е4. Как я могу получить ссылку на выбранный пункт меню?

Я хотел бы получить ссылку на выбранный пункт меню меню. Как я могу это сделать?

Это пример класса, который отвечает за выполнение отмеченного методом аннотации @Execute.

Это неправильный способ:

import java.util.Iterator;
import java.util.List;

import javax.inject.Inject;

import org.eclipse.e4.core.di.annotations.CanExecute;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;

import com.lwm.app.parts.GuiContainer;

public final class MenuItemSelectionExecution {


    @SuppressWarnings("rawtypes")
    private MElementContainer menu = null;

    @Inject
    private MWindow window;

    @CanExecute
    public boolean canExecute() {

        if (null == menu) {
            setMenu();
        }

        if (null == menu) {
            return false;
        }
        return true;
    }



    @Execute
    public void execute(MApplication app) {


        MWindow selectedElement = app.getSelectedElement();
        System.out.println(selectedElement);

        MUIElement selectedElement2 = menu.getSelectedElement();
        //selectedElement2 = null


    }

    @SuppressWarnings("rawtypes")
    private void setMenu() {
        final MMenu mainMenu = window.getMainMenu();
        final List<MMenuElement> mainMenuItems = mainMenu.getChildren();
        final Iterator<MMenuElement> iterator = mainMenuItems.iterator();

        MMenuElement currentMainMenuItem = null;
        String label = null;
        MElementContainer menu = null;

        while (iterator.hasNext()) {
            currentMainMenuItem = iterator.next();
            label = currentMainMenuItem.getLabel();
            if (currentMainMenuItem instanceof MElementContainer) {
                menu = (MElementContainer) currentMainMenuItem;
                if (GuiContainer.PROGRAMS.equals(label)) {
                    this.menu = menu;
                    break;
                }
            }
        }

    }
}

Я надеюсь, что кто-то поможет мне узнать правильный путь.


person Anatolii Kosorukov    schedule 07.12.2013    source источник
comment
Почему вы хотите получить доступ к пункту меню? Что это за обработчик (обработчик команды может даже не вызываться из меню)?   -  person greg-449    schedule 07.12.2013
comment
Я хотел бы знать, какой пункт меню был выбран. Обработчик не предоставляет такой информации - он только выполняет код метода.   -  person Anatolii Kosorukov    schedule 08.12.2013


Ответы (1)


Вы должны просто ввести MMenuItem в метод:

@CanExecute
public boolean canExecute(@Optional MMenuItem menuItem);

Если обработчик вызывается не из меню, @Optional будет означать, что вызов все еще будет работать, а пункт меню будет null.

person greg-449    schedule 07.12.2013
comment
@Execute public void execute(@Optional MMenuItem menuItem) { - правильное место для получения ссылки. - person Anatolii Kosorukov; 08.12.2013