Eclipse plugin 插件中的PackageExplorer样式包视图

Eclipse plugin 插件中的PackageExplorer样式包视图,eclipse-plugin,Eclipse Plugin,我正在编写一个带有自定义编辑器、自定义性质、生成器等的插件。我有一个类似于Java包的程序文件层次结构,我希望目录的查看方式与JDT的包资源管理器显示的方式相同——平面。似乎我需要定义一个导航器内容扩展,它将检测根文件夹,然后为所有包生成子项。恐怕也会显示各个文件夹,除非有办法抑制默认的“children”方法。有什么好方法可以完成此任务吗?查看源代码,包资源管理器不使用公共导航器,因此我不确定您是否可以复制它 projectexplorer也具有平面/层次视图,它是使用公共导航器完成的,因此您

我正在编写一个带有自定义编辑器、自定义性质、生成器等的插件。我有一个类似于Java包的程序文件层次结构,我希望目录的查看方式与JDT的包资源管理器显示的方式相同——平面。似乎我需要定义一个导航器内容扩展,它将检测根文件夹,然后为所有包生成子项。恐怕也会显示各个文件夹,除非有办法抑制默认的“children”方法。有什么好方法可以完成此任务吗?

查看源代码,
包资源管理器不使用公共导航器,因此我不确定您是否可以复制它


projectexplorer
也具有平面/层次视图,它是使用公共导航器完成的,因此您应该能够重现它的功能。它使用了
org.eclipse.ui.navigator.viewer
viewContextBinding
org.eclipse.ui.navigator.navigatorContent/navigatorContext
触发点
possibleChildren
@greg-449有一些简单的基础,但这里有一些更多的细节。 基本上,您必须重新实现所有内容。项目资源管理器(公共资源管理器)定义了平面/层次首选项,但没有实现它。它仅在内部JDT UI类中实现,例如
org.eclipse.jdt.internal.ui.navigator.JavaNavigatorContentProvider
org.eclipse.jdt.internal.ui.navigator.JavaNavigatorLabelProvider

navigatorContent
扩展应该通过覆盖
org.eclipse.ui.navigator.resourceContent
来定义。上下文提供程序类应该实现
IPipelinedTreeContentProvider2
,然后如果它检测到一个根文件夹(下面是一个平面视图),它需要将“建议的”子级改为一个新创建的对象数组,每个包对应一个。JDT使用
IPackageFragment
。我的解决方案使用具有相同名称的不同接口。自定义内容提供程序类也需要处理此新接口/类

@Override
public Object[] getChildren(Object parentElement) {
  if (parentElement instanceof IPackageFragment) {
    Collection<IResource> files = new ArrayList<IResource>();
    ((IPackageFragment)parentElement).getElements(files);
    return files.toArray();
  } else if (isRootFolder(parentElement)) {
    Collection<IPackageFragment> packs = new ArrayList<IPackageFragment>();
    new FolderPackageFragment(EMPTY_NAME,(IFolder)parentElement).getSubpackages(packs);
    return packs.toArray();
  }
  return EMPTY_ARRAY;
}

@Override
public void getPipelinedChildren(Object aParent, Set theCurrentChildren) {
  Object[] children = getChildren(aParent);  
  // we only return EMPTY_ARRAY when we can't compute anything -- defer to current
  if (children == EMPTY_ARRAY) return;

  // now go to some effort to not get rid of everything and start from scratch.
  HashSet<Object> newSet = new HashSet<Object>();
  for (Object o : children) {
    newSet.add(o);
  }
  theCurrentChildren.retainAll(newSet);
  theCurrentChildren.addAll(newSet);
}
这里
getBaseObject
返回包片段
pack
下的底层容器。 幸运的是,只要您的IPackageFragment对象能够适应
IContainer
对象,其他装饰器(如GIT图标)将在您不必做任何事情的情况下显示出来


如果您忘记扩展org.eclipse.ui.navigator.viewer,您的扩展将被忽略。

您能告诉我更多详细信息吗?我查看了org.eclipse.ui.navigator.resources的插件注册表,发现了您提到的扩展点,但它们似乎与平面/层次视图(而是工作集)无关。我发现ProjectExplorer有一个平面/层次化的首选项设置,这似乎没有任何效果。是否有可能此首选项是作为扩展选项存在的,但ProjectExplorer实际上没有使用它?对于哪种类型的项目,此选项起作用?Java还是纯Java?如果它与普通项目(没有Java项目性质)一起工作,那么这就是我需要的!该选项是
Package Presentation>Flat/Hierarchical
。它只适用于Java包。什么是Java包?你是说它只适用于Java项目中的“src”文件夹?如果项目具有Java特性,那么我是否可以假设该选项只对您有效?
  result = problemDecorator.decorateImage(result, pack.getBaseObject());