Über die Unterstützung für Inhalt kann auf Anforderung durch den Benutzer kontextbezogene Inhaltsvervollständigung angeboten werden. Diese Funktionalität ist im Textgerüst der Plattform in org.eclipse.jface.text.contentassist implementiert. Dialogfenster (Kurzhilfen) werden verwendet, um mögliche Textauswahlmöglichkeiten zur Vervollständigung eines Ausdrucks anzubieten. Der Benutzer kann diese Auswahlmöglichkeiten in den Text einsetzen lassen. Die Unterstützung für Inhalt unterstützt auch kontextbezogene Kurzhilfen, über die dem Benutzer Informationen vermittelt werden, die sich auf die aktuelle Position im Dokument beziehen.
Die Implementierung der Unterstützung für Inhalt ist optional. In der Standardeinstellung installiert SourceViewerConfiguration keine Unterstützung für Inhalt, da das für einen bestimmten Editor verwendete Dokumentmodell nicht bekannt ist und kein generisches Verhalten für die Unterstützung für Inhalt vorhanden ist.
Um die Unterstützung für Inhalt zu implementieren muss die Konfiguration für die Quellenanzeigefunktion des Editors so konfiguriert werden, dass eine Unterstützung für Inhalt definiert ist. Im Beispiel des Java-Editors erfolgt dies innerhalb von 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; }
Das Verhalten der Unterstützung für Inhalt wird in der Schnittstelle IContentAssistant definiert. Die Einrichtung eines Inhaltsassistenten ist der Einrichtung der Hervorhebung von Syntax recht ähnlich. Der Assistent sollte für verschiedene Dokumenteninhaltstypen mit verschiedenen Strategien zur Phrasenvervollständigung konfiguriert werden. Die Vervollständigungsstrategien werden über IContentAssistProcessor implementiert. Ein Prozessor schlägt Fertigstellungen vor und berechnet Kontextinformationen für eine relative Position innerhalb eines bestimmten Kontexttyps.
Nicht alle Inhaltstypen müssen mit einer Unterstützung für Inhalt ausgestattet sein. Im Java-Beispieleditor werden Prozessoren der Unterstützung für Inhalt für den Standardinhaltstyp und für Javadoc, nicht jedoch für mehrzeilige Kommentare bereitgestellt. Die einzelnen Prozessoren werden im Folgenden vorgestellt.
Der Prozessor JavaCompletionProcessor ist sehr einfach strukturiert. Er kann lediglich Schlüsselwörter als Fertigstellungen vorschlagen. Die Schlüsselwörter sind in einem Feld definiert
(fgProposals
) und werden immer als Vorschläge verwendet:
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; }
Die Fertigstellung kann auf Benutzeranforderung hin oder automatisch (bei Eingabe des Zeichens "(" oder ".") ausgelöst werden:
public char[] getCompletionProposalAutoActivationCharacters() { return new char[] { '.', '(' }; }
Der Prozessor JavaCompletionProcessor schlägt nicht nur Fertigstellungen vor, sondern definiert außerdem Kontextinformationen, die vom Benutzer angefordert werden können. Zu den Kontextinformationen gehören eine Beschreibung der Informationsteile, die in einem bestimmten Kontext verfügbar sind, und die ausführliche Informationsnachricht.
Im Beispiel des Java-Editors sind die Informationen eigentlich nicht kontextbezogen. Für die aktuelle relative Position wire ein Bereich berechnet, der fünf ähnliche Kontextinformationsobjekte enthält, sobald der Benutzer die Kontextinformationen anfordert. Alle diese Kontextinformationsobjekte definieren einen Kontext, der fünf Zeichen vor der relativen Position und fünf Zeichen nach der relativen Position enthält. Falls einer dieser fünf Vorschläge ausgewählt wird, werden neben dem Cursor ausführliche Informationen angezeigt, und zwar so lange, wie sich der Cursor im Kontext von fünf Zeichen um die relative Position herum befindet.
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; }
Diese Kontextinformationen werden automatisch angezeigt, wenn das Zeichen "#" eingegeben wird:
public char[] getContextInformationAutoActivationCharacters() { return new char[] { '#' }; }
Die Darstellung und das Verhalten der Unterstützung für Inhalt können unter Verwendung von IContentAssistant konfiguriert werden. Beispielsweise können Sie das Zeitlimit für die automatische Aktivierung sowie die Ausrichtung und die Farben der Informationsfenster konfigurieren.
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; }