Поддержка всплывающих подсказок (отображение контекстной справки при наведении указателя мыши на фрагмент текста или элемент линейки) обеспечивается текстовой средой платформы.
Реализация всплывающих подсказок не обязательна. По умолчанию SourceViewerConfiguration не устанавливает поддержку всплывающих подсказок, поскольку нужная информация отсутствует. Реализация всплывающих подсказок по тексту и линейке предусматривает настройку соответствующего определения в конфигурации программы просмотра исходного кода редактора.
Снова обратимся к JavaSourceViewerConfiguration и рассмотрим методы, определяющие свойства всплывающих подсказок:
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) { return new JavaTextHover(); } public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return new JavaAnnotationHover(); }
При необходимости классы всплывающих подсказок можно установить динамически с помощью протокола SourceViewer (setTextHover и setAnnotationHover). С практической точки зрения такой подход не приносит дополнительных преимуществ за исключением консолидации всех определений в отдельном производном классе 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"); } ... }
Таким образом, если навести указатель мыши на фрагмент, выделенный в редакторе, он будет показан в качестве текста всплывающей подсказки.
При необходимости для вычисления текста всплывающей подсказки можно применять более сложную контекстную информацию. Соответствующие примеры можно найти в реализации метода JavaTextHover в редакторе JDT.
Всплывающие подсказки, предусмотренные для вертикальной линейки, позволяют отображать сведения, связанные со строками. Процедура настройки класса всплывающей подсказки была рассмотрена выше. 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; }
Поскольку всплывающая подсказка обладает доступом к документу и программе просмотра исходного кода, она располагает всем необходимым контекстом, позволяющим принимать сложные решения относительно отображаемой информации. Например, для отображения всплывающей подсказки для аннотаций, показанных на вертикальной линейке, из программы исходного кода может извлекаться модель аннотаций. Такая возможность обеспечивается методом JavaAnnotationHover, предусмотренным в редакторе JDT.