Vyrovnávací paměť

Gtk::TextBuffer je model obsahující data pro Gtk::TextView, podobně jako je Gtk::TreeModel používán Gtk::TreeView. To umožňuje dvěma a více Gtk::TextView sdílet stejný TextBuffer a při tom to umožňuje zobrazit textový obsah vyrovnávací paměti trochu odlišně. Nebo byste mohli spravovat několik objektů Gtk::TextBuffer a v různou dobu volit vždy jeden z nich pro zobrazení ve widgetu Gtk::TextView.

TextView vytváří svůj vlastní výchozí TextBuffer, ke kterému se můžete dostat přes metodu get_buffer().

Reference

12.1.1. Iterátory

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

12.1.2. Formátovací značky a formátování

12.1.2.1. Formátovací značky (Tag)

K určení, že nějaký text ve vyrovnávací paměti by měl být nějak naformátován, musíte definovat formátovací značku, která si drží informaci o formátování, a pak ji použít na část textu. Příklad definice formátovací značky a jejích vlastností:

auto refTagMatch = Gtk::TextBuffer::Tag::create();
refTagMatch->property_background() = "orange";

Při použití metody create() můžete určit pro objekt Tag název, ale není to nutné.

Třída Tag má mnoho dalších vlastností.

Reference

12.1.2.2. Tabulka formátovacích značek (TagTable)

Každý Gtk::TextBuffer používá Gtk::TextBuffer::TagTable, který obsahuje objekty Tag pro vyrovnávací paměť. Dva nebo více objektů TextBuffer může sdílet stejnou instanci TagTable. Když vytvoříte objekty Tag, měli byste je přidat do TagTable. Například:

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

Můžete také použít get_tag_table() pro získání, a případné změny, výchozího objektu TagTable z objektu TextBuffer, místo abyste jej přímo vytvářeli.

Reference

12.1.2.3. Použití formátovacích značek

Když vytvoříte objekt Tag a přidáte jej do TagTable, můžete použít tuto formátovací značku na část textu v TextBuffer, takže tento text se zobrazí s formátováním. Začátek a konec rozsahu definujete pomocí Gtk::TextBuffer::iterator. Například:

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

Na ten samý text můžete použít i více formátovacích značek použitím metody apply_tag() vícekrát, nebo pomocí insert_with_tags(). Více objektů Tag může určit pro tu samou vlastnost různé hodnoty, ale tyto konflikty se dají řešit pomocí Tag::set_priority().

12.1.3. Poziční značky (Mark)

Iterátory třídy TextBuffer jsou obecně zneplatněny, když dojde ke změně textu, ale v těchto situacích můžete použít Gtk::TextBuffer::Mark k zapamatování pozice. Například:

auto refMark = refBuffer->create_mark(iter);

Později můžete použít metodu get_iter() k vytvoření iterátoru pro novou pozici v objektu Mark.

Existují dvě vestavěné poziční značky Markinsert a selection_bound, ke kterým se můžete dostat přes metody get_insert() a get_selection_bound() třídy TextBuffer.

Reference

12.1.4. Zobrazení (View)

Jak bylo zmíněno výše, každý TextViewTextBuffer a jeden nebo více TextView může sdílet stejný TextBuffer.

Obdobně jako u TreeView, byste měli svůj TextView nejspíše vložit do ScrolledWindow, aby uživatelé mohli vidět i přesahující text a mohli se po celém textu pohybovat pomocí posuvníků.

Reference

12.1.4.1. Výchozí formátování

TextView má různé metody, které umožňují měnit prezentovanou podobu vyrovnávací paměti pro konkrétní zobrazení. Některé jde přepsat pomocí objektů Gtk::TextTag ve vyrovnávací paměti, pokud určují ty stejné věci. Například pomocí set_left_margin(), set_right_margin(), set_indent() atd.

12.1.4.2. Posouvání

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.