作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我想我必须澄清与我的问题相关的一些要点:我想重写 RCP 项目上按钮的行为以添加特定处理。所以我做了一些步骤:
我在这个现有插件上创建了一个新片段,但我无权访问该片段。
我覆盖新片段上的现有处理程序。
我添加了一个 fragement.xml,在其中定义了一个新的上下文,覆盖处理程序如下面的代码所示:
<?xml version="1.0" encoding="UTF-8"?><?xml version="1.0" encoding="UTF-8"?><?eclipse version="3.4"?>
<fragment>
<extension point="org.eclipse.ui.contexts">
<context id="myContext" name="myContext">
</context>
</extension>
<extension point="org.eclipse.ui.handlers">
<handler class="myHandler" commandId="myCommand">
<enabledWhen>
<and>
<reference definitionId="object_selected">
</reference>
<reference definitionId="operation_allowed">
</reference>
</and>
</enabledWhen>
<activeWhen>
<with variable="activeContexts">
</with>
<iterate ifEmpty="false" operator="or">
<equals value="myContext">
</equals>
</iterate>
</activeWhen>
</handler>
</extension>
</fragment>
但我的上下文始终未定义(我不知道为什么??),因此我以编程方式定义了上下文、覆盖处理程序,并将其链接到 myCommand,如以下代码所示:
//Define myContext
IContextService contextService = (IContextService) PlatformUI.getWorkbench().getService(IContextService.class);
Context myContext = contextService.getContext("myContext");
if (!myContext.isDefined()) {
myContext.define("myContext", "To allow the consumption of my overrided Handler", "org.eclipse.ui.contexts.window");
}
contextService.activateContext(myContext.getId());
//link handler to myContext
//Command
ICommandService iCommandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
Command myCommand = iCommandService.getCommand("myCommand");
//Handler
IHandlerService iHandlerService = (IHandlerService) PlatformUI.getWorkbench().getService(IHandlerService.class);
MyHandler myHandler = new MyHandler();
myCommand.setHandler(handler);
//set activation conditions
if(myContext!= null && contextService.getActiveContextIds().contains(myContext.getId())) {
iHandlerService.activateHandler("myCommand", myHandler);
// I'm stuck on this step, i need to know how to declare an enableWhen //condition like: myHandler.setEnabled(evaluationContext);
}
现在,我陷入了这一步:我不知道如何以编程方式为我的覆盖处理程序添加启用条件(例如 myHandler.setEnabled(evaluationContext))。
最佳答案
您可以使用org.eclipse.core.expressions.ExpressionConverter
将XML DOM或IConfigurationElement
(来自插件xml)转换为可以已评估。
ExpressionConverter converter = ExpressionConverter.getDefault();
Expression expression = converter.perform(element);
其中 element
是 IConfigurationElement
或 org.w3c.dom.Element
。
一旦你有了表达式,你就可以评估它:
EvaluationResult result = expression.evaluate(context);
boolean isEnabled = result == EvaluationResult.TRUE;
其中context
是一个IEvaluationContext
对于上下文,您可以使用org.eclipse.e4.core.commands.ExpressionContext
IEclipseContext eclipseContext = ... current Eclipse context
IEvaluationContext context = new ExpressionContext(eclipseContext);
关于java - 如何以编程方式在我的 java 类 -Eclipse RCP 中添加enableWhen条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57207492/
我是一名优秀的程序员,十分优秀!