在编辑器中选择文本时,使用core-expression启用处理程序

时间:2014-02-16 00:41:36

标签: eclipse eclipse-plugin

我有一个只在当前活动编辑器中选择了某些文本时才能启用的处理程序。

我尝试用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>

它不起作用,我无法找出原因。有人能告诉我如何正确编写核心表达式吗?

2 个答案:

答案 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;
  }
}