2012-01-20 72 views
2

我已经扩展org.eclipse.ui.editors.text.TextEditor来实现自定义编辑器。 对于这个编辑器,我定义了一个标记类型(org.eclipse.core.resources.markers扩展点)和一个注释类型(org.eclipse.ui.editors.annotationTypes扩展点),以在我的编辑器中标记特定部分的代码。我使用协调器来更新我的注释模型。如何为自定义eclipse编辑器实现Quick Fix/Quick Assist?

现在我想添加一个快速修复/快速辅助功能。当我点击一个提案时,我将鼠标悬停在代码的带注释部分上,并用给定的字符串替换该部分,我只是想要eclipse来显示一个包含提案的框。就像Java编辑器的快速修复功能一样。

那么,实现这种行为的最好方法是什么?

我读到标记分辨率发生器和快速辅助处理器,但我仍然感到困惑这一切是如何一起工作......

我会很高兴,如果有人可以点我到正确的方向。

编辑:从我了解到目前为止,MarkerResolutionGenerator负责显示问题视图中的快速修复。要在源代码查看器中快速修复,我必须为我的SourceViewer设置一个QuickAssistAssistant,并实现一个返回CompletionProposalsQuickAssistProcessor。 这是正确的做法吗?

EDIT2:我想知道如果我需要Markers可言,或仅Annotations,我很困惑...

回答

3

我终于找到了如何让Quick Fix为我的编辑工作。

我使用annotationTypes扩展点注册我自己的注释类型和markerAnnotationSpecification扩展点以指定外观。在我的自定义SourceViewerConfiguration类中,I类覆盖getAnnotationHover(...)以返回DefaultAnnotationHover对象,getTextHover(...)返回DefaultTextHover对象,因此注释显示在我的源查看器中。

然后我重写getReconciler(...)用我自己的实现的IReconcilingStrategy创造,在其reconcile(...)方法注释返回MonoReconciler。最后,我重写getQuickAssistAssistant(...)返回QuickAssistAssistant与我自己的执行IQuickAssistProcessor。当我按CTRL + 1时,处理器类中的computeQuickAssistProposals(...)方法会计算出现的快速解决方案。

我不会创建任何Marker对象,也不会使用MarkerResolutionGenerator,因为标记概念比仅使用注释和注释提供的功能更符合我的需要。

2

您必须先注册的扩展,扩展点org.eclipse.ui。 ide.markerResolution。此扩展名引用了markerType(使用markerId)以及分辨率生成器。

后一个组件负责计算可能的修复:它读取标记,它可以检查相关文件等,并创建标记解析实例。这些解决方案实例基本上处理错误的文件,并希望解决原始问题。

在标记解析期间,您不应该担心删除标记,因为在修复执行后,有时候验证会再次运行(例如,在构建期间,或者如果没有自动验证可用,然后手动 - 但它是而不是标记分辨率更新标记列表的任务)。

+0

我这样做了,但是我的标记解析生成器的方法从不被调用。我认为这是正确的方法,如果您有一个Builder来管理保存和构建标记,但是我将Annotations添加到我的AnnotationModel,因为我只需要在输入时进行错误标记。 或者我必须在我的SourceViewerConfiguration中设置某些内容才能使分辨率生成器起作用? –

+0

AFAIK快速修复未注册到注释但注册到标记。您可以使用markerannotationspecification扩展点自动使用标记创建注释。 –

+0

好的,我会尝试创建标记而不是注释,然后... –