4

在我的 Eclipse RCP 3.3 应用程序中,我想根据当前编辑器脏标志启用或禁用“保存”工具栏按钮。

我正在尝试使用 < enabledWhen > 标签,但我无法使其工作。

这是 plugin.xml 中的代码部分:

<command
 commandId="org.acme.command.save"
 icon="icons/save.png"
 id="org.acme.command.save"
 style="push">
 <enabledWhen>
    <instanceof value="activeEditor"/>
     <test property="dirty" value="true"/>
 </enabledWhen>
</command>

你知道这应该如何工作吗?

4

5 回答 5

5

工作台提供了对“保存”和“全部保存”操作的支持,因此您无需像尝试做的那样自己实现它。

推荐的方法是在扩展 ActionBarAdvisor 的类中添加支持。确切的代码将取决于类的结构,但您需要的代码如下。

在您的字段声明中:

private IWorkbenchAction saveAction;
private IWorkbenchAction saveAllAction;

在您的 makeActions 方法中:

    saveAction = ActionFactory.SAVE.create(window);
    register(saveAction);

    saveAllAction = ActionFactory.SAVE_ALL.create(window);
    register(saveAllAction);

在您的 fillActionBars 方法中:

    IToolBarManager saveToolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
    saveToolbar.add(saveAction);
    saveToolbar.add(saveAllAction);
    coolBar.add(new ToolBarContributionItem(saveToolbar, "save"));   

工作台将为您处理启用和禁用。

如果您出于某种原因确实想实现自己的代码来执行此操作,那么您采用的方法将起作用。您将需要更正 XML(例如,instanceof 元素正在检查所选对象是否是名为“activeEditor”的类的实例,这可能不是预期的)。

于 2009-03-31T18:14:44.343 回答
4

我的一位才华横溢的同事刚刚找到了 eclipse >= 3.3 的答案:

以下是如何在 plugin.xml 中定义命令:

  <command
        commandId="com.acme.bo.command.done"
        id="com.acme.bo.menu.done"
        label="Command to do">
     <visibleWhen>
        <with variable="activeMenuSelection">
           <iterate>
              <adapt type="com.acme.bo.model.Pojo"></adapt>
              <test
                    args="valueThatYouWantToPassTest"
                    property="com.acme.namespace.testedProperty"
                    value="something">
              </test>
           </iterate>
        </with>
     </visibleWhen>
  </command>

然后,您必须再次在 plugin.xml 中定义 propertyTester:

 <extension
       point="org.eclipse.core.expressions.propertyTesters">
    <propertyTester
          class="com.acme.namespace.tester.YourPropertyTester"
          id="com.acme.namespace.tester.testedPropertyTester"
          namespace="com.acme.namespace"
          properties="testedProperty"
          type="com.acme.bo.model.Pojo">
    </propertyTester>
 </extension>

这是进行测试的YourPropertyTester类:

package com.acme.namespace.tester;

import org.eclipse.core.expressions.PropertyTester;

import com.acme.bo.model.Pojo;

public class YourPropertyTester extends PropertyTester {

   @Override
   public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
      if (receiver == null || !(receiver instanceof Pojo))
         return false;

      Pojo pojo = (Pojo) receiver;
      if (args != null) {
         for (Object object : args) {
            if (pojo.getYourProperty().contains((String)object))
               return true;
         }
      }
      return false;
   }
}
于 2009-05-12T11:15:27.667 回答
0

我不确定它是否可以完全是声明性的。

saveAction = ActionFactory.SAVE.create(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
configurer.registerGlobalAction(saveAction);

你检查以下线程是否可以帮助你
在 Save Action 的情况下,它可能是Retargetable action

于 2009-03-16T15:49:34.893 回答
0

尝试这个:

org.eclipse.core.variables.dynamicVariables
-(variable) [here you should implement resolver class to return active editor]

org.eclipse.core.expressions.definitions
-(definition)
--(with) [reference here your variable]
---(test) [test if dirty]

org.eclipse.ui.commands !mistake: not commands, but handlers
-(handler)
--(enabledWhen)
---(reference) [reference your definition here]

**(updated)**
org.eclipse.core.properties.propertyTesters
-(propertyTester)

我不确定它是否会起作用,但有机会......

于 2009-03-23T20:05:21.740 回答
0

如果您在激活属性测试器时遇到问题,请注意您的属性测试器实现必须位于与org.eclipse.core.expressions.propertyTesters扩展点相同的插件中。

于 2010-05-30T08:39:07.107 回答