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().

Reference

XII.I.I. Itérateurs

A Gtk::TextBuffer::iterator and a Gtk::TextBuffer::const_iterator represent a position between two characters in the text buffer. Whenever the buffer is modified in a way that affects the number of characters in the buffer, all outstanding iterators become invalid. Because of this, iterators can't be used to preserve positions across buffer modifications. To preserve a position, use Gtk::TextBuffer::Mark.

Reference

XII.I.II. Balisages et formats

XII.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 :

auto 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.

Reference

XII.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 :

auto refTagTable = Gtk::TextBuffer::TagTable::create();
refTagTable->add(refTagMatch);
//Hopefully a future version of gtkmm will have a set_tag_table() method,
//for use after creation of the buffer.
auto 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.

Reference

XII.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);

Or you could specify the tag when first inserting the text:

refBuffer->insert_with_tag(iter, "Some text", 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().

XII.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 :

auto 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.

There are two built-in Marks - insert and selection_bound, which you can access with TextBuffer's get_insert() and get_selection_bound() methods.

Reference

XII.I.IV. La vue

As mentioned above, each TextView has a TextBuffer, and one or more TextViews can share the same 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.

Reference

XII.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.

XII.I.IV.II. Défilement

Gtk::TextView has various scroll_to() methods. These allow you to ensure that a particular part of the text buffer is visible. For instance, your application's Find feature might use Gtk::TextView::scroll_to() to show the found text.