Asystent treści na żądanie użytkownika udostępnia uzależnioną od kontekstu pomoc w uzupełnianiu aktualnie wprowadzanej treści. Funkcja ta jest implementowana przez środowisko tekstowe platformy w pakiecie org.eclipse.jface.text.contentassist. Okna wywoływane (okna pomocy kontekstowej) służą do proponowania możliwych zakończeń frazy. Użytkownik może wybrać pozycję, która zostanie wstawiona do tekstu. Asystent treści obsługuje również okna pomocy kontekstowej dostarczające użytkownikowi informacje dotyczące bieżącej pozycji w dokumencie.
Implementacja asystenta treści jest opcjonalna. Domyślnie klasa SourceViewerConfiguration nie instaluje asystenta treści, ponieważ nie zna modelu dokumentu używanego w konkretnym edytorze, a ogólne zachowanie dla asystenta treści nie istnieje.
Aby zaimplementować asystenta treści, należy skonfigurować przeglądarkę kodu źródłowego edytora tak, aby definiowała asystenta treści. Takie działanie wykonuje przykładowy edytor Java wewnątrz klasy JavaSourceViewerConfiguration.
public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) { ContentAssistant assistant= new ContentAssistant(); assistant.setContentAssistProcessor(new JavaCompletionProcessor(), IDocument.DEFAULT_CONTENT_TYPE); assistant.setContentAssistProcessor(new JavaDocCompletionProcessor(), JavaPartitionScanner.JAVA_DOC); ... return assistant; }
Zachowanie asystenta treści jest zdefiniowane w interfejsie IContentAssistant. Konfigurowanie asystenta treści przypomina nieco konfigurowanie wyróżniania składni. Asystent powinien mieć skonfigurowane różne strategie uzupełniania fraz dla różnych typów treści dokumentów. Strategie uzupełniania są implementowane przy użyciu interfejsu IContentAssistProcessor. Procesor proponuje uzupełnienia i przelicza informację o kontekście dla danej pozycji w obrębie konkretnego typu treści.
Nie wszystkie typy treści wymagają asystenta treści. W przykładowym edytorze Java są już udostępnione procesory asystenta treści dla domyślnego typu treści oraz dla treści typu javadoc, ale nie ma asystenta treści dla komentarzy wielowierszowych. Każdy z tych procesorów zostanie teraz krótko omówiony.
Procesor JavaCompletionProcessor jest dość prosty. Jako
uzupełnienia może proponować jedynie słowa kluczowe. Słowa
kluczowe są definiowane w polu fgProposals
i tylko one są
przedstawiane jako propozycje:
public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) { ICompletionProposal[] result= new ICompletionProposal[fgProposals.length]; for (int i= 0; i < fgProposals.length; i++) { IContextInformation info= new ContextInformation(fgProposals[i], MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.Proposal.ContextInfo.pattern"), new Object[] { fgProposals[i] })); //$NON-NLS-1$ result[i]= new CompletionProposal(fgProposals[i], documentOffset, 0, fgProposals[i].length(), null, fgProposals[i], info, MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.Proposal.hoverinfo.pattern"), new Object[] { fgProposals[i]})); //$NON-NLS-1$ } return result; }
Uzupełnienie może być wyzwalane na żądanie użytkownika lub automatycznie - po wpisaniu znaku "(" lub ".":
public char[] getCompletionProposalAutoActivationCharacters() { return new char[] { '.', '(' }; }
Procesor JavaCompletionProcessor nie tylko sugeruje uzupełnienia, ale i definiuje informacje kontekstowe, których może zażądać użytkownik. Informacje kontekstowe obejmują opis informacji dostępnych w danym kontekście oraz szczegółowy komunikat informacyjny.
W przykładowym edytorze Java informacje tak naprawdę nie są kontekstowe. Gdy użytkownik żąda informacji kontekstowych, dla danej pozycji jest obliczana tablica zawierająca pięć obiektów o zbliżonych informacjach kontekstowych. Każda informacja kontekstowa obiektu definiuje kontekst obejmujący pięć znaków przed i pięć znaków za bieżącą pozycją. Jeśli zostanie wybrana którakolwiek z tych pięciu propozycji, w pobliżu kursora zostaną wyświetlone szczegółowe informacje i będą widoczne dopóty, dopóki kursor będzie pozostawał w kontekście pięciu znaków wokół bieżącej pozycji.
public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) { IContextInformation[] result= new IContextInformation[5]; for (int i= 0; i < result.length; i++) result[i]= new ContextInformation( MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.ContextInfo.display.pattern"), new Object[] { new Integer(i), new Integer(documentOffset) }), MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.ContextInfo.value.pattern"), new Object[] { new Integer(i), new Integer(documentOffset - 5), new Integer(documentOffset + 5)})); return result; }
Te informacje kontekstowe są wyświetlane automatycznie po wpisaniu znaku "#":
public char[] getContextInformationAutoActivationCharacters() { return new char[] { '#' }; }
Wygląd i zachowanie asystenta treści można skonfigurować przy użyciu interfejsu IContentAssistant. Skonfigurować można na przykład limit czasu automatycznej aktywacji oraz orientację i kolor informacyjnych elementów wywoływanych.
public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) { ContentAssistant assistant= new ContentAssistant(); ... assistant.enableAutoActivation(true); assistant.setAutoActivationDelay(500); assistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY); assistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_ABOVE); assistant.setContextInformationPopupBackground(JavaEditorEnvironment.getJavaColorProvider().getColor(new RGB(150, 150, 0))); return assistant; }