根据首选项变量的值禁用菜单

时间:2013-07-21 17:03:49

标签: eclipse-plugin rcp

我有一个菜单项XYZ。我有一个偏好页面MyPref,它有一个复选框和几个文本字段。检查MyPref中的复选框时,我希望启用菜单XYZ,否则应禁用它。有没有办法实现这一目标。

1 个答案:

答案 0 :(得分:2)

是的,方式确实存在。

1)。在IPreferenceStore中创建一个条目 - 只需获取扩展AbstractUIPlugin的类并执行以下操作:

IPreferenceStore store = IExtendAbstractUIPlugin.getDefault()
      .getPreferenceStore();

然后存储一些反映您的复选框状态的值:

preferenceStore.setValue("XYZMenuPreference", false); // if disabled

preferenceStore.setValue("XYZMenuPreference", true); // if enabled

2)。为plugin.xml创建Property Tester扩展名:

<extension point="org.eclipse.core.expressions.propertyTesters">
  <propertyTester
     class="org.xyz.PropertyTester"
     id="org.xyz.PropertyTester"
     type="java.lang.Object"
     namespace="org.xyz"
     properties="XYZmenu">
  </propertyTester>
</extension> 

3)。在plugin.xml中声明菜单处理程序时,您应添加以下内容:

<handler
 class="your-menu-handler-class"
 commandId="your-command-id">
     <enabledWhen>
     <with variable="selection">                    
     <test property="org.xyz.XYZmenu" value="true" forcePluginActivation="true"/> 
     </with> 
     </enabledWhen>           
</handler>

4)。现在你需要一个类“org.xyz.PropertyTester”(如plugin.xml中所定义),它将扩展org.eclipse.core.expressions.PropertyTester并覆盖方法test(<some args>),他必须检查property值:< / p>

if (property.equals("XYZmenu"){
   IPreferenceStore store = IExtendAbstractUIPlugin.getDefault()
                    .getPreferenceStore();
   return store.getBoolean("XYZMenuPreference");
}

5)。之后,在您的复选框中添加一个更改侦听器,并使用它来重新评估菜单项的可见性:

IEvaluationService service = (IEvaluationService) PlatformUI
   .getWorkbench().getService(IEvaluationService.class);
service.requestEvaluation("org.xyz.XYZmenu");

它将强制调用test()类中的方法org.xyz.PropertyTester并启用菜单项(如果首选项) “XYZMenuPreference”设置为true

UPD。

namespace - a unique id determining the name space the properties are added to
properties - a comma separated list of properties provided by this property tester

这来自official eclipse tutorial所以您可以随意定义任何名称空间和属性名称,但您应该像第5点那样使用它。