我有一个只在当前活动编辑器中选择了某些文本时才能启用的处理程序。
我尝试用core-expression实现这个逻辑:
<enabledWhen>
<with
variable="selection">
<iterate
operator="or">
<and>
<instanceof
value="org.eclipse.jface.text.ITextSelection">
</instanceof>
<not>
<test
property="length"
value="0">
</test>
</not>
</and>
</iterate>
</with>
</enabledWhen>
它不起作用,我无法找出原因。有人能告诉我如何正确编写核心表达式吗?
答案 0 :(得分:1)
我无法在任何地方看到为org.eclipse.jface.text.ITextSelection
定义的任何属性测试人员,因此test
将失败。
我认为您必须使用org.eclipse.core.expressions.propertyTesters
扩展点编写自己的属性测试器来添加长度测试。
答案 1 :(得分:1)
我让它与我自己的propertyTester合作。
pom.xml
,属性测试器的定义:
<extension point="org.eclipse.core.expressions.propertyTesters">
<propertyTester
class="x.TextSelectionTester"
id="x.TextSelectionTester"
namespace="x"
properties="nonEmpty"
type="org.eclipse.jface.text.ITextSelection">
</propertyTester>
</extension>
pom.xml
,这次使用了属性测试器:
<enabledWhen>
<with
variable="selection">
<test
property="x.nonEmpty"
value="true">
</test>
</with>
</enabledWhen>
Java代码:
import org.eclipse.core.expressions.PropertyTester;
import org.eclipse.jface.text.ITextSelection;
class TextSelectionTester extends PropertyTester {
private static final String NonEmptyProperty = "nonEmpty";
public boolean nonEmpty(ITextSelection selection) {
return selection.getLength() != 0;
}
public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
if (receiver instanceof ITextSelection && NonEmptyProperty.equals(property))
return nonEmpty((ITextSelection) receiver);
return false;
}
}