Enable/disable 如果工作区中存在项目 do/not,则为菜单项

Enable/disable a menu item if projects do/not exist in workspace

我想enable/disable一个菜单项,它使用下面的处理程序,具体取决于工作区中是否有任何项目。

但是下面的代码不能正常工作。如果在 Project Explorer 视图中选择了一个项目,它 enables/disables。我对选择不感兴趣,只对工作区中是否存在项目感兴趣。

<extension
  point="org.eclipse.ui.handlers">
    <handler
      commandId="sampleplugin.commands.sampleCommand"
        class="com.xxx">
          <enabledWhen>
            <iterate ifEmpty="true">
                  <adapt type="org.eclipse.core.resources.IResource">
                    <test property="org.eclipse.core.resources.projectNature" value="org.eclipse.cdt.core.cnature"/>
              </adapt> 
                </iterate>
          </enabledWhen>
    </handler>
</extension>

我认为您将不得不使用自己的 属性 测试仪使用 org.eclipse.core.expressions.propertyTesters 扩展点来定义自己的 <test>。定义类似于:

<extension
     point="org.eclipse.core.expressions.propertyTesters">
  <propertyTester
        class="package.MyPropertyTester"
        id="id.myPropertyTester"
        namespace="namespace"
        properties="test"
        type="java.lang.Object">
  </propertyTester>
</extension>

和测试人员代码:

public class MyPropertyTester extends PropertyTester
{
  @Override
  public boolean test(final Object receiver, final String property, final Object [] args, final Object expectedValue)
  {
    IProject [] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();

    // Look for project nature

    for (IProject project : projects)
     { 
       if (project.hasNature("org.eclipse.cdt.core.cnature"))
         return true;
     }

    return false;
  }
}

... 并像这样在处理程序中使用 属性 测试器:

<extension
  point="org.eclipse.ui.handlers">
    <handler
      commandId="sampleplugin.commands.sampleCommand"
        class="com.xxx">
                <enabledWhen>
                    <test
           forcePluginActivation="true"
           property="namespace.test"/>
                </enabledWhen>
    </handler>
</extension>