悬浮式帮助支持是在平台文本框架中提供的,它允许您实现文本上的信息性悬浮式帮助(或弹出信息)以及显示在编辑器中的标尺。
悬浮式帮助支持是可选的。缺省情况下,SourceViewerConfiguration 不会安装悬浮式帮助行为,原因是没有有用的一般信息需要显示。为了提供文本或标尺悬浮式帮助,必须配置编辑器的源代码查看器配置以定义可插入的悬浮式帮助对象。
让我们再看一下 JavaSourceViewerConfiguration 以了解哪些方法定义悬浮式帮助行为:
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) { return new JavaTextHover(); } public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return new JavaAnnotationHover(); }
还可以使用 SourceViewer 协议(setTextHover 和 setAnnotationHover)来动态安装悬浮式帮助 helper 类。使用任何一种方法安装都没有特定的运行时好处,但是,将所有可插入行为覆盖放置在 SourceViewerConfiguration 的子类中具有将所有定义合并到同一个位置的优点。
让我们了解一下提供两种悬浮式帮助的详细说明。
文本悬浮式帮助允许您提供有关显示在编辑器中的文本的信息性文本。这是使用 ITextHover 接口完成的。文本悬浮式帮助负责计算应当用作悬浮式帮助信息的源的区域,并将偏移量放置到文档中。它还负责提供有关特定区域的信息性文本。JavaTextHover 相当简单。它进行检查以了解为悬浮式帮助提供的偏移量是否包含在文本选择中。如果是包含在文本选择中,则它会提供选择范围来作为悬浮式帮助区域。
public class JavaTextHover implements ITextHover { ... public IRegion getHoverRegion(ITextViewer textViewer, int offset) { Point selection= textViewer.getSelectedRange(); if (selection.x <= offset && offset < selection.x + selection.y) return new Region(selection.x, selection.y); return new Region(offset, 0); } }
给定了它自己的已计算的悬浮式帮助区域,它就会从它的文档中获取所选择的文本,并将该文本作为悬浮式帮助信息来返回。
public class JavaTextHover implements ITextHover { public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { if (hoverRegion != null) { try { if (hoverRegion.getLength() > -1) return textViewer.getDocument().get(hoverRegion.getOffset(), hoverRegion.getLength()); } catch (BadLocationException x) { } } return JavaEditorMessages.getString("JavaTextHover.emptySelection"); } ... }
确实,我们可以看到,如果将光标悬浮在编辑器中的选择上,悬浮式帮助文本就会显示该选择。
更复杂的上下文信息可以用来计算有用的悬浮式帮助信息。这些信息的示例可以在使用 JDT 编辑器实现的 JavaTextHover 中找到。
垂直标尺上的悬浮式帮助对于显示面向行的信息很有用。已按如上所述配置了悬浮式帮助类。IAnnotationHover 是用于标尺悬浮式帮助对象的接口。尽管该名称意味着悬浮式帮助用于标尺中的注释,但是,实际上最多只能有一个编辑器来确定哪些内容适用。标尺悬浮式帮助负责返回与特定行号相关联的信息字符串,而不管该行上是否存在标记。
Java 示例编辑器的 JavaAnnotationHover 实现所有行的悬浮式帮助。它使用行号来获取有关悬浮行上的所有文本,并将这些文本作为信息字符串返回。
public String getHoverInfo(ISourceViewer sourceViewer, int lineNumber) { IDocument document= sourceViewer.getDocument(); try { IRegion info= document.getLineInformation(lineNumber); return document.get(info.getOffset(), info.getLength()); } catch (BadLocationException x) { } return null; }
由于悬浮式帮助对文档和源代码查看器具有访问权,所以它具有作出有关应当显示的信息的更复杂上下文判断所需要的所有上下文。例如,可从源代码查看器中检索注释模型,以便为显示在垂直标尺中的任何注释提供悬浮式帮助信息。JDT 编辑器提供的 JavaAnnotationHover 提供了此功能。