Sommaire
Le widget TextView (zone de texte) ainsi que les objets qui lui sont asociés (TextBuffer, TextMark, TextIter, TextTag et TextTagTable) offrent une structure puissante d'édition de texte multiligne.
Un TextBuffer (buffer de texte) contient le texte qui est affiché par un ou plusieurs widgets TextView. Avec GTK+ 2.0 le texte est encodé en UTF-8, ce qui signifie qu'un caractère peut être encodé avec plusieurs octets. Dans un TextBuffer on doit bien faire la distinction entre le décompte des caractères (appelé offset) et le décompte des octets (appelé index).
Les TextIter (itérateurs de texte) permettent une représentation volatile d'une position dans un TextBuffer, située entre deux caractères. Les TextIter ne sont valables que tant que le nombre de caractères dans le TextBuffer est inchangé. Chaque fois que l'on insère ou efface des caractères dans un TextBuffer tous les TextIter sont invalidés. Les TextIter sont le moyen le plus utilisé de spécifier des positions dans un TextBuffer afin d'y manipuler du texte.
Les TextMark (marques de texte) permettent de marquer des positions qui ne seront pas affectées par les modifications du TextBuffer. Une marque est comme un TextIter (elle représente une position entre deux caractères d'un TextBuffer) à la différence que si l'on efface le texte qui l'entoure elle reste à l'endroit où était le texte effacé. Si l'on insère du texte à la position indiquée par cette marque, celle-ci se retrouvera soit à gauche, soit à droite du texte inséré, en fonction de la gravité de la marque — la marque restera à droite du texte inséré dans le cas d'une gravité à droite, et à gauche dans le cas d'une gravité à gauche. On peut choisir de donner un nom à une TextMark, ou bien la laisser anonyme. Chaque TextBuffer comporte deux TextMark prédéfinies, nommées insert et selection_bound, faisant référence aux positions respectives du point d'insertion et de la fin de la sélection (la sélection est comprise entre les marques insert et selection_bound).
Les objets TextTag (balises de texte) spécifient un ensemble d'attributs pouvant être appliqués à une portion de texte d'un TextBuffer. Chaque TextBuffer a une TextTagTable (table des balises de texte) qui recense les balises disponibles dans ce buffer. Plusieurs TextBuffer peuvent se partager la même TextTagTable pour offrir une meilleure cohérence. On utilise souvent les TextTag pour modifier l'apparence d'une portion de texte mais elles peuvent tout aussi bien servir à empêcher l'édition de cette même portion de texte.