La infraestructura de texto de la plataforma define un modelo de documento para texto y suministra un visor que visualiza el texto mediante este modelo. Empezaremos por examinar el ejemplo de editor Java y como éste utiliza este modelo. No nos centraremos en los mecanismos básicos de la operación de registrar una extensión del editor, puesto que ya los hemos visto en la sección que describe org.eclipse.ui.editors. En lugar de ello, observaremos los detalles específicos de la implementación de la clase editor en el ejemplo.
En el entorno de trabajo, un editor se abre generalmente cuando el usuario selecciona un elemento de dominio (como por ejemplo un archivo o un elemento almacenado dentro de un archivador) y lo abre. Cuando se crea el editor, se asocia con una entrada de editor (IEditorInput) que describe el objeto editado.
El editor Java de ejemplo se abre cuando el usuario abre un archivo con la extensión "*.jav". En este caso, la entrada del editor es IFileEditorInput. La infraestructura de texto de la plataforma efectúa pocas presunciones acerca de la entrada del editor en sí. Trabaja con un modelo de presentación, denominado IDocument, correspondiente a la entrada, para poder visualizar y manipular el texto de forma efectiva.
Esto significa que debe existir una forma de correlación entre el modelo de dominio esperado (la entrada del editor) y el modelo de presentación. Esta correlación se define en un IDocumentProvider. Dada una entrada del editor, el proveedor de documentos devuelve un IDocument adecuado.
El ejemplo del editor Java hereda el TextFileDocumentProvider definido por el conector org.eclipse.ui.editors. La extensión org.eclipse.ui.editors.documentProviders se utiliza para definir las correlaciones entre los tipos de entrada del editor (o extensiones de archivo) y los proveedores de documentos. El conector de editores define su proveedor de documentos de la forma siguiente:
<extension point="org.eclipse.ui.editors.documentProviders"> <provider class="org.eclipse.ui.editors.text.TextFileDocumentProvider" inputTypes="org.eclipse.ui.IStorageEditorInput" id="org.eclipse.ui.editors.text.StorageDocumentProvider"> </provider> </extension>
Este punto de extensión permite a los conectores registrar proveedores de documentos y asociarlos con una extensión de archivo o con una clase de entrada de editor. Dado que el ejemplo de editor Java no define su propia extensión de proveedor de documentos, hereda el proveedor de documentos genérico especificado para todos los tipos de entrada que son IStorageEditorInput. Cuando el usuario abre un archivo para editarlo, la plataforma gestiona los detalles de la creación de la instancia del proveedor de documentos adecuado. Si un proveedor de documentos específico está registrado para la extensión de archivo, es que que se utilizará. Si no hay ningún proveedor de documentos específico para la extensión de archivo, se utilizar el tipo de entrada del editor para buscar el proveedor adecuado.
Mediante el proveedor de documentos genérico de la plataforma, el ejemplo de editor Java puede aprovechar todas las características del proveedor de documentos, como por ejemplo el almacenamiento intermedio de archivos y otras optimizaciones.
Dado que el editor Java utiliza el proveedor de documentos de texto de la plataforma, ¿cómo puede suministrar comportamiento especializado para el manejo de archivos Java?
La extensión org.eclipse.core.filebuffers.documentSetup se utiliza para definir correlaciones entre extensiones de archivo y un IDocumentSetupParticipant. El participante de configuración configurará el documento con las características especiales una vez que se haya suministrado al editor.
<extension id="ExampleJavaDocumentSetupParticipant" name="%documentSetupParticipantName" point="org.eclipse.core.filebuffers.documentSetup"> <participant extensions="jav" class="org.eclipse.ui.examples.javaeditor.JavaDocumentSetupParticipant"> </participant> </extension>
La definición de la extensión es la que ofrece al ejemplo la oportunidad de configurar el documento para tareas específicas Java. Por tanto, ¿qué acción realiza JavaDocumentSetupParticipant? Observaremos una versión simplificada del método setup.
public void setup(IDocument document) { ... IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES); partitioner.connect(document); ... }
El código de configuración configura un objeto denominado partitioner.
El particionador (IDocumentPartitioner) es responsable de dividir el documento en regiones no solapadas, denominadas particiones. Las particiones (representadas por ITypedRegion) son de utilidad para tratar de forma distinta diferentes secciones del documento con respecto a funciones tales como el resaltado de sintaxis o el formato.
En el caso del editor Java de ejemplo, el documento está dividido en particiones que representan los comentarios javadoc, los comentarios multilínea y todo lo demás. A cada región se le asigna un tipo de contenido y su posición en el documento. Las posiciones se actualizan a medida que el usuario edita el texto.
La determinación de la implementación adecuada para un particionador de documentos corre a cargo de cada editor. En org.eclipse.jface.text.rules se suministra soporte para la exploración de documentos basada en reglas. La utilización de un escáner basado en reglas permite a los editores emplear el FastPartitioner suministrado por la infraestructura.
IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);
RuleBasedPartitionScanner es la superclase de los exploradores basados en reglas. Las subclases son responsables de nombrar e implementar las reglas que deben utilizarse para distinguir símbolos tales como delimitadores de línea, espacio en blanco y patrones genéricos al explorar un documento. En el ejemplo, JavaPartitionScanner define las reglas para distinguir comentarios de línea simples, constantes de tipo carácter, javadoc, comentarios multilínea y palabras. Esto se realiza en el constructor del explorador:
public JavaPartitionScanner() { super(); IToken javaDoc= new Token(JAVA_DOC); IToken comment= new Token(JAVA_MULTILINE_COMMENT); List rules= new ArrayList(); // Añadir regla para comentarios de línea simples. rules.add(new EndOfLineRule("//", Token.UNDEFINED)); // Añadir regla para series y constantes de tipo carácter. rules.add(new SingleLineRule("\"", "\"", Token.UNDEFINED, '\\')); rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '\\')); // Añadir regla para palabras con mayúsculas y minúsculas especiales. rules.add(new WordPredicateRule(comment)); // Añadir reglas para comentarios multilínea y javadoc. rules.add(new MultiLineRule("/**", "*/", javaDoc, (char) 0, true)); rules.add(new MultiLineRule("/*", "*/", comment, (char) 0, true)); IPredicateRule[] result= new IPredicateRule[rules.size()]; rules.toArray(result); setPredicateRules(result); }
Consulte las clases de org.eclipse.jface.text.rules para obtener más detalles acerca de la definición de reglas y los tipos de reglas disponibles. Examinaremos de nuevo los exploradores al tratar el coloreado de sintaxis.