13.7. Un ejemplo de Vista de Texto

El programa de ejemplo testtext.py (que se deriva del programa testtext.c incluido en la distribución GTK+ 2.0.x) demuestra el uso del control TextView y sus objetos asociados: TextBuffers, TextIters, TextMarks, TextTags, TextTagTables. La figura Figura 13.2, “Ejemplo de Vista de Texto” ilustra su funcionamiento:

Figura 13.2. Ejemplo de Vista de Texto

Ejemplo de Vista de Texto

El programa testtext.py define unas cuantas clases además de la clase principal TestText:

La ventana de ciclo de color se implementa usando etiquetas de texto que se aplican a una sección del texto en un buffer. Las líneas 109-115 (en el método __init__() ) crean estas etiquetas y las líneas 763-784 (en el método do_apply_colors() ) aplican las etiquetas de colores a una sección del texto de dos en dos caracteres. Las lienas 202-239 proporcionan los métodos (color_cycle_timeout(), set_colors() y cycle_colors()) que producen el ciclo de color cuando está activado. El ciclo de color se activa estableciendo (línea 220) la propiedad foreground_gdk de las etiquetas individuales color_tags (que también establecen la propiedad foreground_set ). El ciclo de color se desactiva poniendo la propiedad foreground_set a FALSE (línea 222). Los colores se cambian periodicamente al desplazar el tono del color ( start_hue (line 237))

Un nuevo Buffer se rellena con un contenido de ejemplo cuando se selecciona el menú TestExample (el método fill_example_buffer() en las líneas 302-372). El buffer de ejemplo contiene texto de varios colores, estilos, idiomas y pixbuffers. El método init_tags() (líneas 260-300) establece una variedad de TextTags para usarlas con el texto de ejemplo. La señal de evento de estas etiquetas se conecta al método tag_event_handler() (líneas 241-256) para ilustrar la captura de los eventos de botón y movimiento.

El modo de ajuste del control TextView está puesto a WRAP_WORD (línea 580) y las ventanas de borde del TextView se visualizan al establecer su tamaño en las líneas 587-588 y las líneas 596-597. Las ventanas del borde derecho e izquierdo se usan para mostrar los números de línea y las ventanas de borde superior e inferior muestran las posiciones de tabulación cuando se utilizan tabulaciones personalizadas. Las ventanas de borde se actualizan cuando se recibe la señal "expose-event" en el TextView (líneas 590 y 599) El método line_numbers_expose() (líneas 1079-1116) determina si las ventanas de borde izquierdo o derecho tienen un evento de exposición y, si es así, calculan el tamaño del área de exposición. Entonces, la localización del principio de la línea y el número de línea para cada línea en el área de exposición se calcula en el método get_lines() (líneas 1057-1077). Los números de línea se dibujan en la ventana de borde en la posición (transformada por la línea 1109).

Las posiciones personalizadas de tabulación se visualizan en las ventanas de borde superior e inferior de una forma similar (líneas 1013-1055). Sólo se visualizan cuando el cursor se mueve dentro de un rango de texto que tiene el atributo de tabulaciones propias. Esto se detecta manejando la señal "mark-set" en el método cursor_set_handler() (líneas 999-1011) e invalidando las ventanas de borde superior e inferior si la marca a activar es la marca insert.

Los controles móviles se añaden al objeto View con el método do_add_children() (líneas 892-899) el cual llama al método add_movable_children() (líneas 874-890). Los hijos son gtk.Labels (Etiquetas) que pueden arrastrarse por las ventanas que forman parte de un control TextView .

De la misma forma, los controles se añaden a las ventanas del TextView de una View y el Buffer usando el método do_add_focus_children() (líneas 901-949).