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