在eclipse rcp中使用带有popupMenus的IAdapterFactory

时间:2015-05-08 06:20:21

标签: eclipse-plugin eclipse-rcp

我的要求是在其中一个第三方视图中添加一个新的菜单条目到“Compare with”。 因为这是使用“org.eclipse.ui.popupMenus”将菜单条目添加到上面的贡献中。即使我被弃用,我甚至被迫使用相同的扩展点。 我能够使用以下代码

为贡献添加菜单条目
<extension point="org.eclipse.ui.popupMenus">
         <objectContribution
               adaptable="true"
               id="test.id"
               objectClass="local.change">
        <action
              class="compare.commparetool"
              enablesFor="1"
              id="id"
              label="Compare "
              menubarPath="compareWith/group1">
         </action>
        <visibility>
           <objectState
                 name="local.change"
                 value=".txt">
           </objectState>
        </visibility>
</extension>

以上配置工作正常。 下一个要求是添加属性测试器以在选择的文件不是.txt文件时隐藏菜单项。 由于我们无法将属性测试器添加到对象贡献中,因此我使用了IAdapterfactory。下面的代码不起作用。

观察: 我在“比较”中的不同视图中添加了许多菜单条目(“org.eclipse.ui.menus”),这与此无关。 但是,如果用户单击这些命令中的任何一个,然后尝试相关视图,它就会按预期正常工作。

以下是代码。我错过了什么。我是否还需要在其他地方注册适配器?

<extension point="org.eclipse.core.runtime.adapters">
      <factory
            adaptableType="local.change"
            class="LocalChangeAdapterFactory">
         <adapter
               type="org.eclipse.ui.IActionFilter">
         </adapter>
      </factory>
</extension>
public class LocalChangeAdapterFactory implements IAdapterFactory
{
  @SuppressWarnings("unchecked")
  @Override
  public Object getAdapter(final Object adaptableObject, final Class adapterType)
  {
    if (adapterType == IActionFilter.class)
    {
      return LocalChangeActionFilter.getInstance();
    }
    return null;
  }

  @SuppressWarnings("unchecked")
  @Override
  public Class[] getAdapterList()
  {    
    return new Class[] { LocalChangeActionFilter.class };
  }
}

public class LocalChangeActionFilter implements IActionFilter
{

  private static LocalChangeActionFilter INSTANCE = new LocalChangeActionFilter();

  private LocalChangeActionFilter()
  {
  }

  @Override
  public boolean testAttribute(final Object target, final String name, final String value)
  {
    String fileName = "";
    if(target.getId==1){  
        return true;
    }else{
    return false;

  }

  public static LocalChangeActionFilter getInstance()
  {
    return INSTANCE;
  }
}

1 个答案:

答案 0 :(得分:1)

适配器工厂的adaptableType属性应指定要适应IActionFilter的现有对象的类型。所以这可能是文件资源:

   adaptableType="org.eclipse.core.resources.IResource">

getAdapter的{​​{1}}方法应返回与IActionFactory属性匹配的类,而不是您的实现类:

adapter

如果操作过滤器必须测试public Class[] getAdapterList() { return new Class[] { IActionFilter.class }; } 参数与testAttribute中的值匹配,那么您的name方法:

objectState