如何覆盖/停止平台SDK提供的问题装饰器

时间:2011-04-09 02:02:14

标签: eclipse-plugin overlay decorator

我已经提到了http://www.eclipse.org/articles/Article-Decorators/decorators.html并且明白让自定义装饰器与SDK装饰器冲突是一种不好的做法。

虽然,我有一个例外。在项目工作中,我们将有关各种模型元素的信息存储在一个物理资源文件下。模型元素在项目资源管理器中表示为单独的节点。当我们编译这些节点时,我想在资源上标记错误,行号表示具有错误的确切元素,因此项目反映它有错误。但同时在Project explorer中我不希望存储在该资源中的所有节点都有问题标记。只有有错误的节点才应该有问题标记。

我尝试在BOTTOM_LEFT位置设置自定义装饰器(使用轻量级和非轻量级),但我总是得到SDK问题叠加显示。

还有其他方法可以使这项工作吗?

这是一个例子。

我们有一个名为nodes.xml的文件,我们保存了我们的emf模型。 nodel.xml看起来像

<xml>
<rootnode name="root">
   <childnode name="child1"/>
   <childnode name="child2"/>
   <rootnode name="subroot">
     <childnode name="subchild1"/>
     <childnode name="subchild2"/>
   </rootnode>
</rootnode>
</xml>

所有上述节点都在项目资源管理器中表示为项目下树结构的不同节点。作为验证的一部分,我们分别验证每个节点root,child1,child2等。如果child1的验证失败,我想添加一个问题标记,以便在第3行的文件nodes.xml上的问题视图中标记错误,但是在项目浏览器中,希望错误bottom_left overlay仅显示在child1,root和project节点上,而不是在其他节点上,如child2,subroot等。

希望这能解释我想要实现的目标。

1 个答案:

答案 0 :(得分:1)

我认为你所采取的方法是正确的。看起来你想要从一些Java文件中删除问题,因为在你的世界中,即使vanilla Java Compiler认为它们存在问题,它们也不是真正的问题。

相反,您应该在工作区中注册org.eclipse.core.resources.IResourceChangeListener。将其设置为通过org.eclipse.core.resources.IResourceChangeEvent.POST_BUILD标志进行通知。像这样:

ResourcesPlugin.getWorkspace.addResourceChangeListener(myListener, POST_BUILD);

您应该在启动插件时执行此操作。这将在工作区中的任何项目的所有构建之后为您提供通知。当您感兴趣的项目弹出时,您可以删除所有Java问题标记:

interestingProject.deleteMarkers(
    IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, 
    true, IResource.DEPTH_INFINITE);

这将删除Java编译器添加的所有Java标记。然后,您可以四处寻找并添加您需要的那些。

警告:上面的操作不是很快,可能需要几秒钟来扫描甚至中型项目的所有文件。您可以更准确地了解您删除的文件,但这需要更多的代码和更深入的API知识。上面的片段应该足以让你开始。