Diseñadores de contenido

A menudo, los editores tienen diseñadores de contenido que proporcionan una vista estructurada de su contenido y ayudan al usuario a navegar por él.

A tal efecto, el entorno de trabajo proporciona una vista de esquema estándar.  El usuario de entorno de trabajo controla cuándo se visualiza esta vista mediante el menú Perspectiva->Mostrar vista.

Puesto que el TextEditor genérico no tiene información sobre la estructura de su texto, no puede proporcionar una vista de esquema interesante.  Por lo tanto, la vista de esquema por omisión que se muestra a continuación no resulta muy sugestiva.

Los conectores pueden ampliar TextEditor con la única finalidad de añadir un página de diseñador de contenido personalizada en la vista de esquema.   Este planteamiento se utiliza en el ejemplo de la herramienta readme de entorno de trabajo.  ReadmeEditor altera temporalmente unos cuantos métodos en TextEditor para suministrar su propio diseñador.  

El diseñador de un editor se especifica cuando el entorno de trabajo solicita un adaptador 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 diseñador readme correspondiente (si el usuario de entorno de trabajo muestra la vista de esquema.)

Una página de diseñador de contenido debe implementar IContentOutlinePage.  Esta interfaz combina la posibilidad de notificar a los escuchadores de cambio de selección (ISelectionProvider) que su función es la de una página de una vista (IPage).  Generalmente, los diseñadores de contenido se implementan utilizando visores de JFace.  La implementación por omisión de un diseñador de contenido (ContentOutlinePage) utiliza un visor de árbol de JFace para visualizar una representación jerárquica del esquema.  Esta representación es adecuada para la mayoría de diseñadores estructurados, incluidoReadmeContentOutlinePage.

El aspecto de ReadmeContentOutlinePage es similar a la vista de secciones de readme, la cual se muestra a continuación,  que se mostró cuando se implementó la extensión de vistas readme.

De hecho, la única diferencia real es que el diseñador visualiza una vista jerárquica de las secciones, mientras que la vista de secciones readme visualiza una lista plana de las secciones.  No es de extrañar que la implementación del diseñador sea muy similar a la de la vista.  La única diferencia es que el diseñador utiliza un visor de árbol en lugar de un visor de lista.

Cuando el editor creó la página de esquema, a ésta se le pasó el elemento de entrada de editor del constructor.  Esta entrada puede pasarse 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 ContentOutlinePage.  Aquí se utilizan los mimos proveedores de contenido y etiqueta que se utilizaron en la vista de las secciones readme, y el esquema del contenido se construye utilizando la misma ReadmeModelFactory que construyó las secciones para la vista.

private IAdaptable getContentOutline(IAdaptable input) {
    return ReadmeModelFactory.getInstance().getContentOutline(input);
}

Eso es todo.

Por su puesto, el diseñador en sí no proporciona ninguna función interesante.  Al seleccionar las secciones no se navega por el texto del editor.  Por lo tanto, ¿qué ventajas tiene este diseñador de contenido?  Podría argumentarse que el diseñador de contenido no proporciona ninguna función (aparte de la representación jerárquica) que no tenga la vista de secciones.  ¿No se acaba de utilizar un visor de árbol en la vista de secciones en lugar de proporcionar un diseñador que no permite hacer nada? 

Sólo se trata de un ejemplo.  En realidad, ReadmeContentOutlinePage se proporciona para demostrar cómo puede personalizarse un diseñador de contenido para un editor de texto.  No es un buen ejemplo de un diseñador de contenido.  Los usuarios esperan que los diseñadores de 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 se pueden encontrar diseñadores de contenido más interesantes?  Vea las subclases deContentOutlinePage 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 diseñador de contenido, el editor se actualiza adecuadamente.

El editor del código fuente Java (que se suministra en las JDT) muestra un diseñador de contenido interesante.  El diseñador Java presenta una vista estructurada de código fuente Java y permite al usuario navegar por declaraciones, métodos y campos en el editor correspondiente.  A medida que el diseñador informa de 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 diseñador.