L'assistente ai contenuti consente di fornire il completamento del contenuto sensibile al contesto su richiesta dell'utente. Questa funzionalità è implementata dalla struttura 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.
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; }
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; }
Queste informazioni contestuali vengono visualizzate automaticamente quando viene digitato il carattere "#":
public char[] getContextInformationAutoActivationCharacters() { return new char[] { '#' }; }
È 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; }