W środowisku tekstowym platformy jest udostępniona obsługa podpowiedzi pozwalająca na implementowanie podpowiedzi informacyjnych (pomocy kontekstowej) wyświetlanych w edytorze nad tekstem i linijkami.
Obsługa podpowiedzi jest opcjonalna. Domyślnie klasa SourceViewerConfiguration nie instaluje zachowań podpowiedzi, ponieważ nie ma przydatnych ogólnych podpowiedzi, które mogłyby być pokazywane. Aby udostępnić podpowiedzi dla tekstu i linijek, należy skonfigurować przeglądarkę kodu źródłowego edytora tak, aby definiowała dołączane obiekty podpowiedzi.
Ponownie pokazana zostanie klasa JavaSourceViewerConfiguration, ma której przykładzie można zobaczyć, które metody definiują zachowanie podpowiedzi:
public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) { return new JavaTextHover(); } public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) { return new JavaAnnotationHover(); }
Klasy pomocnicze podpowiedzi mogą być również instalowane dynamicznie przy użyciu protokołu SourceViewer (metody setTextHover i setAnnotationHover). Wybranie jednej z tych metod nie polepsza szczególnie środowiska wykonawczego, ale umieszczenie wszystkich dołączanych przesłonięć zachowań w podklasie klasy SourceViewerConfiguration pozwala korzystać z zalet konsolidacji wszystkich definicji w jednym miejscu.
Teraz przedstawiona zostanie specyfika obu rodzajów podpowiedzi.
Podpowiedzi dla tekstu pozwalają udostępnić informacje pokazywane nad tekstem w edytorze. Służy do tego interfejs ITextHover. Podpowiedź dla tekstu odpowiada za obliczanie regionu, który powinien stanowić źródło informacji podpowiedzi dotyczących danej pozycji w dokumencie. Odpowiada również za udostępnianie informacji dotyczących konkretnego regionu. Procesor JavaTextHover jest dość prosty. Sprawdza on, czy podana pozycja dla podpowiedzi znajduje się w obrębie zaznaczonego tekstu. Jeśli tak, to udostępnia zakres wyboru jako region podpowiedzi.
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); } }
Po obliczeniu regionu podpowiedzi procesor pobiera z dokumentu zaznaczony tekst i zwraca go jako informacje podpowiedzi.
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"); } ... }
Jak można się było spodziewać, po wywołaniu podpowiedzi dla zaznaczonego w edytorze tekstu w podpowiedzi dla tekstu zobaczymy właśnie zaznaczony fragment.
Bardziej złożone informacje kontekstowe mogą służyć do obliczania przydatnych informacji wywoływanych. Przykłady tego można znaleźć w procesorze JavaTextHover zaimplementowanym w edytorze JDT.
Podpowiedzi na linijce pionowej są pomocne przy pokazywaniu informacji dotyczących konkretnych wierszy. Klasa podpowiedzi jest skonfigurowana zgodnie z powyższym opisem. IAnnotationHover jest interfejsem obiektów podpowiedzi dla linijki. Choć nazwa mogłaby wskazywać, że podpowiedź została zaprojektowana do wstawiania adnotacji na linijce, tak naprawdę zależy to od konkretnego edytora. Podpowiedzi dla linijki zwracają łańcuch informacji przypisany do konkretnego numeru wiersza bez względu na znajdujące się w nim znaczniki.
Procesor przykładowego edytora Java JavaAnnotationHover implementuje podpowiedzi dla wszystkich wierszy. Procesor ten używa numeru wiersza w celu uzyskania całego tekstu z danego wiersza podpowiedzi i zwróceniu go jako łańcucha informacyjnego.
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; }
Ponieważ podpowiedź ma dostęp do dokumentu oraz do przeglądarki kodu źródłowego, ma dzięki temu cały kontekst niezbędny do podejmowania bardziej złożonych decyzji kontekstowych dotyczących wyświetlanych informacji. Na przykład aby udostępnić informacje podpowiadane dla danej adnotacji na linijce pionowej, model adnotacji może zostać pobrany z przeglądarki kodu źródłowego. Procesor JavaAnnotationHover edytora JDT daje taką możliwość.