eclipse RAP:为什么我的动态Handled Menu Items能够调用@CanExecute但不能调用@Execute

时间:2017-03-06 14:11:22

标签: command handler rcp e4 eclipse-rap

我正在为RAP e4应用程序中的弹出菜单创建动态子菜单。菜单包含一个或多个处理的菜单项,所有菜单项都使用相同的命令但命令参数不同。我还为这个命令编写了一个处理程序,到目前为止除了记录参数值之外什么都不做。

这是创建子菜单的代码:

@AboutToShow
public void aboutToShow(List<MMenuElement> items, MPart part, MApplication app) {
    AnnotationEditorPart aEPart = (AnnotationEditorPart) part.getObject();
    List<IAnnotationElement> elements = aEPart.getGrid().getElementsOfCurrentlySelectedCategory();
    String catName = "";
    if (aEPart.getGrid().getCurrentlySelectedCategory() != null) {
        catName = aEPart.getGrid().getCurrentlySelectedCategory().getName();
    }

    MMenu subMenu = MMenuFactory.INSTANCE.createMenu();
    subMenu.setLabel("Add Element...");
    items.add(subMenu);

    if (catName.equals("")) {
        //Not a category
        return;
    }

    for (IAnnotationElement element: elements) {
        if (element.isToBeDisplayed()) {
            continue;
        }

        MHandledMenuItem dynamicItem = MMenuFactory.INSTANCE.createHandledMenuItem();
        dynamicItem.setLabel(element.getName());
        dynamicItem.setContributorURI("platform:/plugin/org.bgbm.annosys.ui");

        MCommand command = app.getCommand(COMMAND_ID);

        dynamicItem.setCommand(command);

        MParameter parameter = MCommandsFactory.INSTANCE.createParameter();
        parameter.setName("org.bgbm.annosys.ui.commandparameter.annotationElementToAddToCategory");
        parameter.setValue(element.getName());
        dynamicItem.getParameters().add(parameter);

        MParameter parameter2 = MCommandsFactory.INSTANCE.createParameter();
        parameter2.setName("org.bgbm.annosys.ui.commandparameter.annotationCategoryToAddElementTo");
        parameter2.setValue(catName);
        dynamicItem.getParameters().add(parameter2);

        subMenu.getChildren().add(dynamicItem);

        dynamicItem.setEnabled(true);
        dynamicItem.setCommand(command);
    }
}

基本上,我得到一个元素列表,并为每个元素创建一个menut项,以将该元素添加到所选类别。我需要的只是类别的名称和元素的名称,所以我将它们放入命令参数中。

这种作品。这是处理程序:

package org.bgbm.annosys.ui.application.parts.handlers;

import javax.inject.Named;

import org.bgbm.annosys.logging.Logger;
import org.eclipse.e4.core.di.annotations.CanExecute;
import org.eclipse.e4.core.di.annotations.Execute;

public class AddAnnotationElementToCategoryCommandHandler {

    /** Default {@link Logger} instance of this class */
    final static Logger logger = Logger.getLogger();

    @Execute
    public void execute(@Named("org.bgbm.annosys.ui.commandparameter.annotationElementToAddToCategory") String elementName,
            @Named("org.bgbm.annosys.ui.commandparameter.annotationCategoryToAddElementTo") String categoryName) {
        logger.debug("#### clicked: " + elementName + ", " + categoryName);
    }

    @CanExecute
    public boolean canExecute(@Named("org.bgbm.annosys.ui.commandparameter.annotationElementToAddToCategory") String elementName,
            @Named("org.bgbm.annosys.ui.commandparameter.annotationCategoryToAddElementTo") String categoryName) {
        logger.debug(elementName + ", " + categoryName);
        return true;
    }

}

有趣的是canExecute清楚地触发了。我在控制台中得到了预期的结果,并且根据我是返回true还是false,这些项目照常启用或禁用。

但是,点击该项会导致绝对没有反应。日志中没有任何内容,我放入execute函数的任何其他代码同样被忽略。似乎从未调用过这种方法。

这可能是什么原因?

编辑:
我现在尝试了几种将命令绑定到动态菜单项的方法,但结果保持不变。 我想在选择菜单项时使用断点调试它,但我不知道该断点应该去哪里,因为框架处理整个菜单函数并且永远不会调用execute方法

也许有人可以帮助我,至少?

1 个答案:

答案 0 :(得分:0)

就调试而言,您可以在invoke(...)的各种org.eclipse.e4.core.contexts.ContextInjectionFactory方法中设置条件断点(条件类似于qualifier == org.eclipse.e4.core.di.annotations.Execute.class)。

如果您想进一步深入框架内部,可以检查引用org.eclipse.e4.core.di.annotations.Execute的位置并遵循该引用路径,这可能会引导您进入菜单项渲染器。