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:
El programa testtext.py define unas
cuantas clases además de la clase principal TestText:
La clase Buffer , en las líneas 99-496,
es una subclase de la clase gtk.TextBuffer. Proporciona
las capacidades de edición del buffer que usan los objetos
View.
La clase View , líneas 498-1126, es una
subclase de la clase gtk.Window y contiene un objeto
gtk.TextView que usa un objeto
Buffer en lugar de un objeto
gtk.TextBuffer. Proporciona una ventana y visualiza
los contenidos de un objeto Buffer además de una barra
de menú.
La clase FileSel , líneas 73-97, es una
subclase de la clase gtk.FileSelection que proporciona
una selección de ficheros para los contenidos de la clase
Buffer .
La clase Stack proporciona objetos de
pilas simples.
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ú
→
(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).