La asistencia de contenido permite proporcionar una finalización de contenido sensible a contexto bajo petición del usuario. La infraestructura de texto de la plataforma implementa esta función en org.eclipse.jface.text.contentassist. Se utilizan ventanas emergentes (cuadros informativos emergentes) para proponer posibles opciones de texto para completar una frase. El usuario puede seleccionar estas opciones para insertarlas en el texto. La asistencia de contenido también da soporte a cuadros informativos emergentes destinados a suministrar al usuario información relacionada con la posición actual en el documento.
La implementación de la asistencia de contenido es opcional. Por omisión, SourceViewerConfiguration no instala asistencia de contenido, ya que no conoce el modelo de documento utilizado para un editor de texto determinado y no tiene comportamiento genérico para la asistencia de contenido.
Para poder implementar la asistencia de contenido, la configuración del visor de código fuente del editor debe configurarse para definir una asistencia de contenido. Esta operación se realiza en el ejemplo de editor Java dentro de 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; }
El comportamiento de la asistencia de contenido se define en la interfaz IContentAssistant. La acción de configurar la asistencia de contenido es parecida a la de configurar el resaltado de sintaxis. El asistente debe configurarse con estrategias de finalización de frases diferentes para tipos de contenido de documento diferentes. Las estrategias de finalización se implementan mediante IContentAssistProcessor. Un procesador propone finalizaciones y calcula la información de contexto para un desplazamiento dentro de un tipo de contenido determinado.
No todos los tipos de contenido necesitan tener asistencia de contenido. En el editor de ejemplo Java, se suministran procesadores de asistencia de contenido para el tipo de contenido por omisión y para javadoc, pero no para comentarios multilínea. Examinemos cada uno de estos procesadores.
JavaCompletionProcessor es bastante sencillo. Sólo puede proponer palabras clave como candidatas de finalización. Las palabras clave se definen en un campo,
fgProposals
, y estas palabras clave siempre se proponen como candidatas:
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; }
La finalización puede activarse a petición del usuario o hacerlo automáticamente cuando se teclea el carácter "(" o ".":
public char[] getCompletionProposalAutoActivationCharacters() { return new char[] { '.', '(' }; }
Además de proponer finalizaciones, JavaCompletionProcessor define información de contexto que el usuario puede solicitar. La información de contexto incluye una descripción de las partes de información disponibles en un contexto determinado y el mensaje de información detallado.
En el editor Java de ejemplo, la información no es en realidad contextual. Cuando el usuario solicita información de contexto, se calcula una matriz que contiene cinco objetos de información de contexto similares con respecto al desplazamiento actual. Todos estos objetos de información de contexto definen un contexto que contiene los cinco caracteres anteriores al desplazamiento y los cinco posteriores al mismo. Si se selecciona una de estas cinco propuestas, la información detallada aparecerá cerca del cursor y permanecerá allí mientras el cursor se encuentre dentro del contexto de los cinco caracteres que rodean al desplazamiento.
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; }
Este información de contexto se muestra automáticamente cuando se teclea el carácter "#":
public char[] getContextInformationAutoActivationCharacters() { return new char[] { '#' }; }
El aspecto y comportamiento de la asistencia de contenido puede configurarse mediante IContentAssistant. Por ejemplo, puede configurar el tiempo de espera de la activación automática y la orientación y color de las ventanas emergentes de información.
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; }