Obsahová asistence

Obsahová asistence vám umožňuje na základě požadavku uživatele poskytovat kontextově citlivé doplňování obsahu.   Tyto funkce jsou v textovém rámci platformy implementovány v org.eclipse.jface.text.contentassist.  Rozevírací informační okna se používají k navržení možných textů pro dokončení fráze.  Uživatel může z těchto možností vybrat, která se vloží do textu.  Obsahová asistence také podporuje kontextová rozevírací informační okna, která uživateli poskytují informace, jenž se vztahují k aktuální pozici v dokumentu. 

Implementace obsahové asistence je volitelná.   Standardně třída SourceViewerConfiguration neinstaluje obsahovou asistenci, protože nezná model dokumentu použitý pro konkrétní editor a nemá pro obsahovou asistenci obecné chování. 

Pro implementaci obsahové asistence musí být konfigurace prohlížeče zdroje vašeho editoru nakonfigurována tak, aby definovala obsahovou asistenci.   Ukázkový editor jazyka Java to dělá uvnitř 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;
}

Chování obsahové asistence je definováno v rozhraní IContentAssistant.  Nastavení obsahové asistence je částečně podobné nastavení zvýraznění syntaxe.   Asistent by se měl konfigurovat s různými strategiemi dokončování frází pro různé typy obsahu dokumentu.   Strategie dokončení jsou implementovány pomocí  IContentAssistProcessor.  Procesor navrhuje dokončení a počítá kontextové informace pro offset v rámci konkrétního typu obsahu.

Procesory obsahové asistence

Všechny typy obsahu nemusí mít obsahovou asistenci.  V ukázkovém editoru jazyka Java jsou poskytnuty procesory obsahové asistence pro výchozí typ obsahu a dokumentaci Javadoc, ale pro víceřádkové komentáře nikoliv.  Podívejme se na každý z těchto procesorů.

JavaCompletionProcessor je celkem jednoduchý.  Jako kandidáty dokončení může navrhovat pouze klíčová slova.  Klíčová slova jsou definována v poli fgProposals a jsou vždy navrhována jako kandidáti:

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;
}

Obsahová asistence klíčového slova

Dokončení lze spouštět požadavkem uživatele nebo automaticky po napsání znaku "(" nebo ".":

public char[] getCompletionProposalAutoActivationCharacters() {
	return new char[] { '.', '(' };
}

Kromě návrhů dokončení JavaCompletionProcessor definuje kontextové informace, které může uživatel požadovat.  Kontextové informace zahrnují popis informací dostupných v daném kontextu a podrobnou informační zprávu.  

V ukázkovém editoru jazyka Java není informace skutečně kontextová.  Když uživatel požádá o kontextové informace, vypočítá se pro aktuální offset pole obsahující pět podobných objektů kontextových informací.  Všechny tyto objekty kontextových informací definují kontext, který obsahuje pět znaků před offsetem a pět za offsetem. Je-li vybrán kterýkoliv z těchto pěti návrhů, zobrazí se podrobné informace poblíž kurzoru a zůstanou zobrazeny tak dlouho, dokud je kurzor v kontextu těchto pěti znaků okolo offsetu.

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;
}

Obsahová asistence Java

 

Tyto kontextové informace se automaticky zobrazí při napsání znaku "#":

public char[] getContextInformationAutoActivationCharacters() {
	return new char[] { '#' };
}

Konfigurace obsahové asistence

Vzhled a chování obsahové asistence lze konfigurovat pomocí rozhraní IContentAssistant.  Můžete například konfigurovat časový limit automatické aktivace nebo orientaci a barvu rozevíracích informačních oken.

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;
}