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().
- XI.I.I. Itérateurs
- XI.I.II. Balisages et formats
- XI.I.III. Marquages
- XI.I.IV. La vue
XI.I.II. Balisages et formats
- XI.I.II.I. Balisages
- XI.I.II.II. Tableau des balises
- XI.I.II.III. Application des balises
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.
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.
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.
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.
- XI.I.IV.I. Format par défaut
- XI.I.IV.II. Défilement
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é.