Le tampon

Gtk::TextBuffer est un modèle contenant les données pour Gtk::TextView, tout comme Gtk::TreeModel utilisé par Gtk::TreeView. Cela permet à deux Gtk::TextView ou plus de partager le même TextBuffer tout en étant affichés de façon légèrement différente. Ou bien encore, vous pouvez disposer de plusieurs Gtk::TextBuffer et choisir d'afficher dans le même élément graphique Gtk::TextView le contenu de l'un ou l'autre d'entre eux selon les circonstances.

L'objet TextView crée par défaut son propre TextBuffer. Vous y accédez avec la fonction membre get_buffer().

Référence

XI.I.I. Itérateurs

XI.I.II. Balisages et formats

XI.I.II.I. Balisages

Pour indiquer que du texte dans le tampon doit bénéficier de tel ou tel format, vous devez définir une balise précisant cette information de format, puis appliquer ce balisage à une zone de texte. Ainsi, pour définir le balisage et ses propriétés :

Glib::RefPtr<Gtk::TextBuffer::Tag> refTagMatch =
    Gtk::TextBuffer::Tag::create();
refTagMatch->property_background() = "orange";

Vous pouvez définir un nom pour l'objet Tag quand vous appelez la fonction membre create(), mais ce n'est pas obligatoire.

La classe Tag dispose de nombreuses autres propriétés.

Référence

XI.I.II.II. Tableau des balises

Chaque Gtk::TextBuffer utilise un objet Gtk::TextBuffer::TagTable contenant les balises pour ce tampon. Deux objets TextBuffer ou plus peuvent partager le même objet TagTable. Quand vous créez un objet Tag vous devez l'incorporer dans l'objet TagTable. Par exemple :

Glib::RefPtr<Gtk::TextBuffer::TagTable> refTagTable =
    Gtk::TextBuffer::TagTable::create();
refTagTable->add(refTagMatch);
// Avec un peu de chance une future version de gtkmm 
// disposera d'une fonction membre set_tag_table(),
// à utiliser après la création du tampon.
Glib::RefPtr<Gtk::TextBuffer> refBuffer =
    Gtk::TextBuffer::create(refTagTable);

Vous pouvez aussi utiliser get_tag_table() pour obtenir, et peut-être modifier, l'objet TagTable par défaut du TextBuffer au lieu d'en créer un explicitement.

Référence

XI.I.II.III. Application des balises

Si vous avez créé un Tag et l'avez ajouté à l'objet TagTable, vous pouvez appliquer cette balise sur une partie du texte du TextBuffer et faire ainsi en sorte que ce texte soit affiché avec ce format. Vous définissez le début et la fin de la plage de texte en définissant des marqueurs du type Gtk::TextBuffer::iterator. Par exemple :

refBuffer->apply_tag(refTagMatch, iterRangeStart, iterRangeStop);

Vous pouvez également définir le balisage dès l'insertion du texte : refBuffer->insert_with_tag(iter, "Un peu de texte", refTagMatch);

Vous pouvez appliquer plus d'un objet Tag au même texte en utilisant plusieurs fois la fonction membre apply_tag() ou en utilisant insert_with_tags(). L'objet Tag peut définir des valeurs différentes pour les mêmes propriétés : dans ce cas là, il faut résoudre les conflits avec la fonction membre Tag::set_priority().

XI.I.III. Marquages

Les itérateurs du TextBuffer sont généralement invalidés si le texte est modifié ; mais, vous pouvez utiliser un objet Gtk::TextBuffer::Mark pour mémoriser une position dans ces cas-là. Par exemple :

Glib::RefPtr<Gtk::TextBuffer::Mark> refMark =
    refBuffer->create_mark(iter);

Puis vous utiliserez ultérieurement la fonction membre get_iter() pour créer un itérateur pour la nouvelle position de l'objet Mark.

Il y a deux objets Mark prédéfinis — insert et select_bound, objets auxquels vous aurez accès grâce aux fonctions membres get_insert() et get_selection_bound() de la classe TextBuffer.

Référence

XI.I.IV. La vue

Comme mentionné plus haut, chaque TextView possède un TextBuffer et un ou plusieurs TextView peuvent partager le même TextBuffer.

Comme pour un TreeView, vous pouvez placer l'objet TextView dans un objet ScrolledWindow pour permettre à l'utilisateur d'explorer la totalité du texte à l'aide de barres de défilement.

Référence

XI.I.IV.I. Format par défaut

TextView dispose de diverses fonctions membres vous permettant de changer la présentation du contenu du tampon dans cette vue. Certaines peuvent être surdéfinies par les objets Gtk::TextTag dans le tampon, si elles définissent les mêmes choses. Par exemple, set_left_margin(), set_right_margin(), set_indent(), etc.

XI.I.IV.II. Défilement

Gtk::TextView dispose de diverses fonctions membres scroll_to_*(). Elles vous permettent de vous assurer qu'une zone donnée du texte du tampon est visible. Ainsi, la fonctionnalité Rechercher de votre application pourra utiliser la fonction membre Gtk::TextView::scroll_to_iter() pour afficher le texte trouvé.