在我的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>
你知道这应该如何运作吗?
答案 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>