我正在编写一个带有自定义编辑器,自定义属性,构建器等的插件。我有一个类似于Java包的程序文件层次结构,我希望以与JDT相同的方式查看目录Package Explorer显示它们 - 平坦。我似乎需要定义一个Navigator Content Extension来检测根文件夹,然后为所有包生成子项。我担心单个文件夹也会显示,除非有办法抑制默认的“子”方法。有没有一个好方法来完成这项任务?
答案 0 :(得分:1)
查看源代码Package Explorer
不使用通用导航器,因此我不确定您是否可以复制它。
使用通用导航器完成平面/分层视图的Project Explorer
,因此您应该能够重现它的功能。它使用org.eclipse.ui.navigator.viewer
viewContextBinding
和org.eclipse.ui.navigator.navigatorContent/navigatorContext
triggerPoints
和possibleChildren
答案 1 :(得分:1)
@ greg-449有基本的基础知识,但这里有更多细节。
你基本上必须重新实现一切。 Project Explorer(公共资源管理器)定义了Flat / Hierarchical首选项,但没有实现它。它仅在内部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);
}
然后,为了获得漂亮的图标和包名称,您还需要编写一个自定义LabelProvider
来处理文件夹和IPackageFragment
对象,并生成正确的文本和图标。如果要在包图标上显示问题图标,则必须手动请求包图标上的ProblemsMarkerDecorator
,否则标准导航器将无法识别您的“包片段”对象。
result = problemDecorator.decorateImage(result, pack.getBaseObject());
此处getBaseObject
返回包片pack
下的基础容器。
幸运的是,只要您的IPackageFragment对象可以适应IContainer
个对象,其他装饰器(例如GIT图标)就会显示而无需您执行任何操作。
如果您忘记延长org.eclipse.ui.navigator.viewer
,您的分机将被忽略。