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().
- 12.1.1. Iterátory
- 12.1.2. Formátovací značky a formátování
- 12.1.3. Poziční značky (Mark)
- 12.1.4. Zobrazení (View)
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.
12.1.2. Formátovací značky a formátování
- 12.1.2.1. Formátovací značky (Tag)
- 12.1.2.2. Tabulka formátovacích značek (TagTable)
- 12.1.2.3. Použití formátovacích značek
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í.
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.
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 Mark – insert a selection_bound, ke kterým se můžete dostat přes metody get_insert() a get_selection_bound() třídy TextBuffer.
12.1.4. Zobrazení (View)
Jak bylo zmíněno výše, každý TextView má TextBuffer 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ů.
- 12.1.4.1. Výchozí formátování
- 12.1.4.2. Posouvání
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.