我正在开发Eclipse RCP。我定义了一个弹出菜单项命令。为了控制命令的可见性,我使用属性测试器设置了测试条件。除了第一次打开菜单外,此属性测试器使命令不可见。意味着如果我是第一次打开弹出菜单,则无论属性测试器如何,该特定命令都是可见的。当我第二次打开该菜单时,它将根据属性测试器确定可见性。谁能解释我为什么会发生?
以下是我正在尝试的完整代码。
命令
<extension point="org.eclipse.ui.commands">
<command
id="com.eclipse-tips.commandState.alignCommand"
name="Align Command">
<state id="org.eclipse.ui.commands.toggleState">
<class class="org.eclipse.ui.handlers.RegistryToggleState">
<parameter
name="default"
value="false">
</parameter>
<parameter
name="persisted"
value="false">
</parameter>
</class>
</state>
</command>
</extension>
处理程序
<extension point="org.eclipse.ui.handlers">
<handler
class="com.gnr.handlers.AlignCommand"
commandId="com.eclipse-tips.commandState.alignCommand">
</handler>
</extension>
菜单贡献
<extension point="org.eclipse.ui.menus">
<menuContribution locationURI="popup:org.eclipse.ui.popup.any?after=additions">
<command
commandId="com.eclipse-tips.commandState.alignCommand"
label="Align Command"
style="toggle">
<visibleWhen
checkEnabled="true">
<with
variable="selection">
<iterate>
<adapt
type="org.eclipse.core.resources.IFile">
<test
property="com.gnr.testgen.checkInputFile_Align"
value="true">
</test>
</adapt>
</iterate>
</with>
</visibleWhen>
</command>
</menuContribution>
</extension>
属性测试器
<extension point="org.eclipse.core.expressions.propertyTesters">
<propertyTester
class="com.gnr.testgen.UserPropertyTester_Align"
id="com.gnr.testgen.user.propertyTester_Align"
namespace="com.gnr.testgen"
properties="checkInputFile_Align"
type="org.eclipse.core.resources.IFile">
</propertyTester>
</extension>
以下是处理程序代码
public class AlignCommand extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
Command command = event.getCommand();
State state = command.getState(RegistryToggleState.STATE_ID);
boolean oldValue = ((Boolean) state.getValue()).booleanValue();
state.setValue(new Boolean(!oldValue));
return null;
}
}
最后的PropertyTester
public class UserPropertyTester_Align extends PropertyTester {
public UserPropertyTester_Align() { }
@Override
public boolean test(Object receiver, String property, Object[] args,
Object expectedValue) {
return false;
}
}
在这里,您可以看到,属性测试器正在返回“ false”。这意味着命令不应该可见,但是不会发生。第一次打开弹出菜单时,该命令可见;第二次打开弹出菜单时,该命令不可见。