Editor de texto multilínea

Tabla de contenidos

Manipulación de texto
Mini editor de texto

GTK+ provee un estructura para el trabajo de edición multilínea bastante poderoso y es muy diferente con la forma de trabajar en Gtk+ 1.2. La forma básica de trabajo consiste en GTkTextBuffer y GtkTextView. GtkTextBuffer representa el texto editado, mientras que GtkTextView es el widget encargado de mostrar un GtkTextBuffer, representando una vista.

Cada GtkTextBuffer puede tener múltiples vistas. El manejo de texto de GTK+ emplea UTF-8 como juego de caracteres, lo cual permite disponer de las mismas aplicaciones para idiomas tan disímiles como japonés, árabe y castellano; inclusive dentro del mismo texto. Sin embargo, esta característica cambia algunos conceptos tradicionalmente empleados en el manejo de texto, y esto es por que en UTF-8 los acaracteres no se codifican en un sólo byte, por lo tanto, un caracter deja de ser un byte.

De esta forma, para referirnos al número de caracteres lo haremos llamándolos «offsets», mientras que a la cantidad de bytes le llamaremos «índices». Es muy importante mantener clara la idea de su funcionamiento de lo contrario lograremos un buen desempeño con ASCII, pero obténdremos errores cuando aparezcan carateres multibyte. Si ejecutamos nuestra aplicación desde un terminal, veremos mensajes [invalid UTF-8] o similar, además de un posible comportamiento errático.

El manejo de texto multilínea de GTK+ 1.2 se limita sólo a texto de 8 bits; en cambio, en GTK+ 2.x es posible definir atributos para trozos de texto a través de la definición de marquillas, así es posible crear texto coloreado, emplear distinas tipografías, utilizar negrita, cursiva e incluso controlar atributos no visibles tal como reaccionar en forma distinta si el cursor se encuentra sobre el texto. Las marquillas se representan a través del objeto GtkTextTag el cual puede aplicarse desde un rango de texto hasta cualquier número del búfer. Las marcas se alcamenan dentro de un GtkTextTagTable y es posible utilizar varias marcas en un mismo trozo de texto. Existe como restricción, que un GtkTextBuffer sólo puede disponer de un sólo GtkTextTagTable; pero un GtkTextTagTable puede ser compartido entre varios GtkTextBuffer.

Manipulación de texto

La manipulación del texto se hace a través de los iteradores, usando un GtkTextIter. Un iterador representa la posición entre dos caracteres en el búfer de texto y no son válidos indefinidamente. Cuando se modifica el búfer de tal forma que el número de caracteres disminuye, todos los iteradores que apuntan a posiciones mayores al tamaño dejan de ser válidos. En realidad, dejan de ser válidos, toda vez que el texto alrededor del iterador se modifique. Por ejemplo, el proceso de borrar 5 caracteres e insertar otros 5 caracteres, inválida a un iterador, independientemente que sigan con el mismo número de caracteres. Es por esta razón que los iteradores no se pueden emplear para preservar las posiciones entre modificaciones del búfer.

Si se desea preservar una posición, se debe emplear el objeto GtkTextMark el cual puede ser visto como un cursor invisible que flota en el búfer, guardando su posición. Si se borra el texto alrededor de la marca, ésta mantiene su posición una vez que la posición se vuelve a ocupar.

En resumen, tenemos GtkTextView que es el widget que representará visualmente el texto, GtkTextBuffer que es el texto en sí, GtkTextIter que nos ayuda a desplazarnos a través del texto, GtkTextMark para colocar marcadores o referencias en el texto, GtkTextTag que permite manejar las marquillas a través de una tabla GtkTextTagTable; todo esta división de roles a la hora de manipular texto es por que se sigue el patrón de diseño MVC (Model View Controller).