Eclipse e4。我如何获得选定的菜单项参考?

时间:2013-12-07 19:16:32

标签: eclipse menu menuitem selected e4

我会排队获取菜单中所选菜单项的参考。我怎么能这样做?

这是一个类的示例,它负责执行标记为 @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;
                }
            }
        }

    }
}

我希望有人帮助我了解正确的方法。

1 个答案:

答案 0 :(得分:1)

您应该只能在方法上注入MMenuItem

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

如果未从菜单调用处理程序,@Optional将表示调用仍然有效,菜单项将为null