在Eclipse RCP中,如何根据编辑器中的“脏”属性禁用保存工具栏按钮

时间:2009-03-16 14:57:59

标签: java eclipse-rcp

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

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

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

5 个答案:

答案 0 :(得分: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'的类的实例,这可能不是预期的。)

答案 1 :(得分:4)

我的一位出色的同事刚刚找到了eclipse的答案&gt; = 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;
   }
}

答案 2 :(得分:0)

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

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

您可以查看following thread can help you吗? 对于“保存操作”,它可能是Retargetable action

答案 3 :(得分: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)

我不确定它是否有用,但有可能......

答案 4 :(得分:0)

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