A menudo, los editores tienen sus correspondientes esquematizadores del contenido que proporcionan una vista estructurada del contenido del editor y ayudan al usuario a navegar por él.
El entorno de trabajo proporciona una vista Esquema estándar con esta finalidad. El usuario del entorno de trabajo controla cuándo está visible esta vista mediante las opciones Ventana > Mostrasr vista.
Puesto que la clase TextEditor genérica no tiene información alguna sobre la estructura de su texto, no puede proporcionar un comportamiento para una vista de esquema que sea interesante. Por lo tanto, la vista Esquema por omisión que se muestra a continuación no resulta muy útil.
Los conectores pueden ampliar la clase TextEditor con la única finalidad de añadir una página de esquematizador del contenido personalizada a la vista Esquema. Este enfoque es el que se utiliza en el ejemplo de la herramienta readme del entorno de trabajo. La clase ReadmeEditor altera temporalmente algunos métodos de la clase TextEditor para suministrar un esquematizador propio.
El esquematizador de un editor se especifica cuando el entorno de trabajo solicita un adaptador de tipo IContentOutlinePage.
public Object getAdapter(Class key) { if (key.equals(IContentOutlinePage.class)) { IEditorInput input = getEditorInput(); if (input instanceof IFileEditorInput) { page = new ReadmeContentOutlinePage( ((IFileEditorInput)input).getFile()); return page; } } return super.getAdapter(key); }
Cuando se abre ReadmeEditor (en un archivo .readme), se visualiza el correspondiente esquematizador del readme (si el usuario del entorno de trabajo está visaulizando la vista Esquema).
Una página de esquematizador del contenido debe implementar la interfaz IContentOutlinePage. Esta interfaz combina la capacidad de notificar a los escuchadores de cambio de selección (ISelectionProvider) que su comportamiento es el de ser una página de una vista (IPage). Por lo general, los esquematizadoras del contenido se implementan utilizando visores de JFace. La implementación por omisión de un esquematizador del contenido (ContentOutlinePage) utiliza un visor de árbol de JFace para visualizar una representación jerárquica del esquema. Esta representación es adecuada para muchos esquematizadores estructurados, incluido el del readme (ReadmeContentOutlinePage).
El aspecto de ReadmeContentOutlinePage es similar al de la vista de secciones del readme, que figura a continuación y que vimos cuando implementamos la extensión de vistas del readme.
De hecho, la única diferencia real es que el esquematizador visualiza una vista jerárquica de las secciones, mientras que la vista de secciones del readme visualiza una lista plana de las secciones. No es de extrañar que la implementación del esquematizador sea muy similar a la de la vista. La única diferencia es que el esquematizador utiliza un visor de árbol en lugar de un visor de lista.
Cuando el editor creó la página de esquema, a esta se le pasó el elemento de entrada del editor en el constructor. Esta entrada se puede pasar a menudo directamente al visor de la página de esquema, tal como se muestra a continuación.
public void createControl(Composite parent) { ... TreeViewer viewer = getTreeViewer(); viewer.setContentProvider(new WorkbenchContentProvider()); viewer.setLabelProvider(new WorkbenchLabelProvider()); viewer.setInput(getContentOutline(input)); ... }
La creación del visor de árbol se hereda de la clase ContentOutlinePage. Aquí se utilizan los mismos proveedores de contenido y etiqueta que los que se utilizaron en la vista de las secciones del readme, y el esquema del contenido se construye utilizando la misma clase ReadmeModelFactory que la que construyó las secciones para la vista.
private IAdaptable getContentOutline(IAdaptable input) { return ReadmeModelFactory.getInstance().getContentOutline(input); }
Eso es todo.
Por supuesto, el esquematizador en sí no proporciona ningún comportamiento interesante. Al seleccionar las secciones, no se navega por el texto del editor. Por lo tanto, ¿qué ventajas tiene este esquematizador del contenido? Podría argumentarse que el esquematizador del contenido no proporciona ningún comportamiento (aparte de la representación jerárquica) que no tenga la vista de secciones. ¿No podríamos haber utilizado sencillamente un visor de árbol en la vista de secciones, en lugar de proporcionar un esquematizador que no hace nada?
Solo se trata de un ejemplo. En realidad, la clase ReadmeContentOutlinePage se proporciona para demostrar cómo puede personalizarse un esquematizador del contenido para un editor de texto. No es un buen ejemplo de esquematizador del contenido. Los usuarios esperan que los esquematizadores del contenido les ayuden a navegar por el contenido del editor, por lo que sería más acertado utilizar la vista de secciones si lo único que se pretende es visualizar la estructura del contenido.
¿Dónde podríamos encontrar esquematizadores del contenido más interesantes? Vea las subclases de ContentOutlinePage y sus correspondientes editores. El patrón más típico es que un editor suministre una página de esquema y registre eventos de selección en él. A medida que se seleccionan elementos en el esquematizador del contenido, el editor se actualiza adecuadamente.
El editor del código fuente Java (que se suministra en las JDT) hace una demostración de un esquematizador de contenido interesante. El esquematizador Java presenta una vista estructurada del código fuente Java y permite al usuario navegar por las declaraciones, los métodos y los campos del editor correspondiente. A medida que el esquematizador informa de los eventos de selección, el editor Java actualiza su regla vertical para mostrar en qué lugar del código fuente se encuentran los elementos del esquematizador.