使用文件的ActionProvider - Eclipse CNF

时间:2014-04-19 10:33:21

标签: java eclipse eclipse-plugin

我正在编写一个插件,该插件创建一个自定义Package Explorer,表示不同层次结构(某种虚拟文件夹)中的基础文件系统层次结构。

我设法通过实现ITreeContentProvider来创建层次结构。最终节点应该代表一个包含其所有操作(打开,复制,重命名......)的文件,当我返回一个文件时它很有效org.eclipse.core.internal.resources.File的实例但如果我创建一个实现delegate/proxy接口的IFile类,我会看到该动作,但当我点击其中一个时,Eclipse会冻结。

无论如何,我想我需要实现自己的CommonActionProvider。我的问题是: 如何向节点添加相同的操作,代表文件中的操作,是否有一些FileActionProvider?

enter image description here

我遵循以下教程:tutorial

更新

我已经尝试过使用@ greg-449来修改适配器。但是他们都没有给我完整的菜单,我得到的最大菜单是实现IAdaptable接口并委托{ {1}}到我的IFile的实例。但这样做双击打开文件是行不通的,最重要的是重命名,删除,移动都不在这里

menu I got by delegating the getAdapter

通过委派getAdapter()

获得的

菜单

1 个答案:

答案 0 :(得分:1)

您应该使用IFile来提供从UI类到基础IAdapterFactory的适配器,而不是尝试实现IFile

使用org.eclipse.core.runtime.adapters扩展点声明适配器工厂:

 <extension point="org.eclipse.core.runtime.adapters">
     <factory 
        class="com.xyz.MyFileAdapterFactory" 
        adaptableType="com.xyz.MyFile">
        <adapter type="org.eclipse.core.resources.IFile"/>
     </factory>
  </extension>

适配器工厂类方法看起来像:

@Override
public Object getAdapter(Object adaptableObject, Class adapterType)
{
  if (adaptableObject instanceof MyFile)
   {
     // TODO get the IFile from MyFile
     return ifile;
   }

  return null;
}

@Override
public Class<?> [] getAdapterList()
{
  return new  Class<?> [] {IFile.class};
}

您可能还需要注册IResource以使所有菜单项都有效。

您也可以使用IAdapterManager界面注册工厂。