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

Eclipse plugin 如何覆盖/停止平台SDK提供的问题装饰器,eclipse-plugin,overlay,decorator,Eclipse Plugin,Overlay,Decorator,我已经提到并理解,使用与SDK decorators冲突的自定义decorator是一种不好的做法 不过,我有一个例外。在project I work中,我们将有关各种模型元素的信息存储在一个物理资源文件下。模型元素在project explorer中表示为单独的节点。当我们编译这些节点时,我想在资源上标记error,用行号表示有错误的确切元素,从而反映出它有错误。但同时在ProjectExplorer中,我不希望存储在该资源中的所有节点都有问题标记。只有发生错误的节点才应该有问题标记 我曾尝试

我已经提到并理解,使用与SDK decorators冲突的自定义decorator是一种不好的做法

不过,我有一个例外。在project I work中,我们将有关各种模型元素的信息存储在一个物理资源文件下。模型元素在project explorer中表示为单独的节点。当我们编译这些节点时,我想在资源上标记error,用行号表示有错误的确切元素,从而反映出它有错误。但同时在ProjectExplorer中,我不希望存储在该资源中的所有节点都有问题标记。只有发生错误的节点才应该有问题标记

我曾尝试在左下角设置自定义装饰器(使用轻量级和非轻量级),但我总是看到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>

上述所有节点在project explorer中表示为project下树结构的不同节点。作为验证的一部分,我们分别验证每个节点根、child1、child2等。如果对child1的验证失败,我希望添加一个问题标记,以便在文件nodes.xml的第3行的问题视图中标记错误,但在project explorer中,希望错误左下角覆盖仅显示在child1、根和项目节点上,而不显示在其他节点上,如child2、subroot等


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

我不认为你采取的方法是正确的。看起来您希望从一些Java文件中删除问题,因为在您的世界中,这些问题并不是真正的问题,即使普通Java编译器认为它们是问题

相反,您应该向工作区注册一个
org.eclipse.core.resources.IResourceChangeListener
。将其设置为使用
org.eclipse.core.resources.iresourcechangevent.POST_BUILD
标志通知。像这样:

ResourcesPlugin.getWorkspace.addResourceChangeListener(myListener, POST_BUILD);
您应该在插件启动时执行此操作。这将在工作区中任何项目的所有生成之后通知您。当您感兴趣的项目弹出时,您可以删除所有Java问题标记:

interestingProject.deleteMarkers(
    IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, 
    true, IResource.DEPTH_INFINITE);
这将删除Java编译器添加的所有Java标记。然后,您可以四处添加您需要的内容


不过,有一个警告:上面的操作速度不快,可能需要几秒钟才能扫描所有中等规模项目的文件。您可以更准确地了解删除哪些文件,但这需要更多的代码和对API更深入的了解。上面的片段应该足以让您开始学习。

我认为您采取的方法并不正确。看起来您希望从一些Java文件中删除问题,因为在您的世界中,这些问题并不是真正的问题,即使普通Java编译器认为它们是问题

相反,您应该向工作区注册一个
org.eclipse.core.resources.IResourceChangeListener
。将其设置为使用
org.eclipse.core.resources.iresourcechangevent.POST_BUILD
标志通知。像这样:

ResourcesPlugin.getWorkspace.addResourceChangeListener(myListener, POST_BUILD);
您应该在插件启动时执行此操作。这将在工作区中任何项目的所有生成之后通知您。当您感兴趣的项目弹出时,您可以删除所有Java问题标记:

interestingProject.deleteMarkers(
    IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, 
    true, IResource.DEPTH_INFINITE);
这将删除Java编译器添加的所有Java标记。然后,您可以四处添加您需要的内容


不过,有一个警告:上面的操作速度不快,可能需要几秒钟才能扫描所有中等规模项目的文件。您可以更准确地了解删除哪些文件,但这需要更多的代码和对API更深入的了解。上面的片段应该足以让您开始。

Andrew,这不是我想要的。让我给你一个样本,安德鲁,这不是我想要的。让我在这里举个例子。