我正在为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方法
也许有人可以帮助我,至少?
答案 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
的位置并遵循该引用路径,这可能会引导您进入菜单项渲染器。