Я занимаюсь разработкой 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>
Свойство Tester
<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. Это означает, что команда не должна быть видимой, но это не происходит. Первый раз, когда я открываю всплывающее меню, команда видна, а второй раз, когда я открываю всплывающее меню, команда не видна.