Assistente ai contenuti

L'assistente ai contenuti consente di fornire il completamento del contenuto sensibile al contesto su richiesta dell'utente.  Questa funzionalità è implementata dal framework del testo della piattaforma in org.eclipse.jface.text.contentassist.  Per proporre scelte di testo possibili per il completamento di una frase, vengono utilizzate finestre a comparsa (aiuti a comparsa).  L'utente può selezionare una di queste proposte da inserire nel testo.  L'assistente ai contenuti supporta anche gli aiuti a comparsa contestuali per fornire agli utenti informazioni relative alla posizione corrente nel documento. 

L'implementazione dell'assistente ai contenuti è facoltativa.  Per impostazione predefinita, SourceViewerConfiguration non installa un assistente ai contenuti in quanto non conosce il modello di documento utilizzato per un determinato editor e non è dotato di funzionalità generiche per l'assistente ai contenuti. 

Per implementare l'assistente ai contenuti, è necessario che il visualizzatore di origine dell'editor sia configurato per la definizione di un assistente ai contenuti. Q Questa operazione viene eseguita nell'esempio dell'editor Java all'interno di 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;
}

La funzionalità dell'assistente ai contenuti è definita nell'interfaccia IContentAssistant.  La configurazione di un assistente ai contenuti è abbastanza simile a quella dell'evidenziazione della sintassi.  L'assistente dovrebbe essere configurato con strategie di completamento delle frasi diverse per i diversi tipi di contenuti dei documenti.  Le strategie di completamento vengono implementate mediante   IContentAssistProcessor.  Un processore propone i completamenti ed elabora le informazioni contestuali per un offset all'interno di un particolare tipo di contenuto.

Processori dell'assistente ai contenuti

Non tutti i tipi di contenuti necessitano dell'assistenza ai contenuti.  Nell'editor di esempio Java, i processori dell'assistente ai contenuti vengono forniti per il tipo di contenuto predefinito e per la javadoc, ma non per i commenti su più righe.  Verranno illustrati i singoli processori.

JavaCompletionProcessor è abbastanza semplice.  È in grado di proporre solo parole chiave come candidati per il completamento.  Le parole chiave vengono definite in un campo, fgProposals, e vengono sempre proposte come candidati:

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

Assistente ai contenuti per le parole chiave

Il completamente può essere attivato su richiesta dell'utente oppure automaticamente quando viene digitato il carattere "(" o ".":

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

Oltre a proporre il completamento, JavaCompletionProcessor definisce anche informazioni contestuali che possono essere richieste dall'utente.  Tali informazioni contestuali comprendono una descrizione delle informazioni disponibili in un determinato contesto e i messaggi di informazioni dettagliati.  

Nell'esempio dell'editor Java, le informazioni non sono veramente contestuali.  Una matrice contenente cinque oggetti simili a informazioni contestuali viene elaborata per l'offset corrente quando l'utente richiede le informazioni contestuali.  Tutti questi oggetti definiscono un contesto contenente i cinque caratteri prima dell'offset e i cinque dopo l'offset. Se si seleziona una di queste cinque proposte, verranno visualizzate le informazioni dettagliate accanto al cursore e rimarranno visibili finché il cursore rimane all'interno del contesto dei cinque caratteri che circondano l'offset.

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

Assistente ai contenuti Java

 

Queste informazioni contestuali vengono visualizzate automaticamente quando viene digitato il carattere "#":

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

Configurazione dell'assistente ai contenuti

È possibile configurare l'aspetto e le funzionalità dell'assistente ai contenuti medianteIContentAssistant.  Ad esempio, è possibile configurare il timeout di attivazione automatica e l'orientamento e il colore degli aiuti a comparsa.

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