在插件中打包Explorer风格的包视图

时间:2014-01-24 18:59:46

标签: eclipse-plugin

我正在编写一个带有自定义编辑器,自定义属性,构建器等的插件。我有一个类似于Java包的程序文件层次结构,我希望以与JDT相同的方式查看目录Package Explorer显示它们 - 平坦。我似乎需要定义一个Navigator Content Extension来检测根文件夹,然后为所有包生成子项。我担心单个文件夹也会显示,除非有办法抑制默认的“子”方法。有没有一个好方法来完成这项任务?

2 个答案:

答案 0 :(得分:1)

查看源代码Package Explorer不使用通用导航器,因此我不确定您是否可以复制它。

使用通用导航器完成平面/分层视图的Project Explorer,因此您应该能够重现它的功能。它使用org.eclipse.ui.navigator.viewer viewContextBindingorg.eclipse.ui.navigator.navigatorContent/navigatorContext triggerPointspossibleChildren

答案 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,您的分机将被忽略。