缓冲区
Gtk::TextBuffer是一个包含Gtk::TextView数据的模型,和Gtk::TreeView所使用的Gtk::TreeModel类似。这允许复数个Gtk::TextView共享同一个TextBuffer,并允许以不同方式显示文本缓冲区。你也可以维护多个Gtk::TextBuffer并让同一个Gtk::TextView部件于不同时候分别显示它们。
TextView会创建一个由它拥有的默认TextBuffer,你可以通过get_buffer()方法访问这个缓冲区。
12.1.1. 迭代器
Gtk::TextBuffer::iterator和Gtk::TextBuffer::const_iterator表示文本缓冲区中两个字符之间的位置。只要以影响缓冲区中字符数量的方式修改了缓冲区,所有越过修改范围的迭代器都将失效。因此,迭代器不能用于保存越过缓冲区被修改部分的位置。如果想保存位置,请使用Gtk::TextBuffer::Mark。
12.1.2. 标签和格式
- 12.1.2.1. 标签(Tags)
- 12.1.2.2. 标签表(TagTable)
- 12.1.2.3. 应用标签
12.1.2.1. 标签(Tags)
要指定缓冲区中的一些文本具有特定的格式,你需要定义一个标签来保存格式信息,并将该标签应用于文本区域。例如,定义标签及其属性:
auto refTagMatch = Gtk::TextBuffer::Tag::create(); refTagMatch->property_background() = "orange";
你可以在使用Tag的create()方法时为其指定一个名称,但这不是必须的。
Tag类还有许多其他的特性。
12.1.2.2. 标签表(TagTable)
每个Gtk::TextBuffer使用一个Gtk::TextBuffer::TagTable,其中包含了该缓冲区的Tag。复数个TextBuffer可以共享一个TagTable。当你创建Tag的时候,你应该将其加入TagTable。例如:
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);
你也可以使用get_tag_table()获取并修改TextBuffer的默认TagTable,而不是显示创建一个。
12.1.2.3. 应用标签
如果你创建了一个Tag并将其加入到TagTable,则可以将其应用于TextBuffer的一部分,以便使用该格式显示某些文本。你可以通过使用Gtk::TextBuffer::iterator指示文本的开始和结束范围。例如:
refBuffer->apply_tag(refTagMatch, iterRangeStart, iterRangeStop);
或者你可以在首次插入文本的时候指定标签:
refBuffer->insert_with_tag(iter, "Some text", refTagMatch);
你可以多次使用apply_tag()或insert_with_tags()将不同的Tag应用于同一文本。Tag可能会为同一属性指定不同的值,但你可以使用Tag::set_priority()解决这些冲突。
12.1.3. 标记(Marks)
当文本发生更改的时候TextBuffer迭代器通常会失效,但是你可以使用Gtk::TextBuffer::Mark记住位置,例如:
auto refMark = refBuffer->create_mark(iter);
你可以在之后使用get_iter()方法为Mark的新位置创建迭代器。
有两个内置的Mark - insert和selection_bound,你可以使用TextBuffer的get_insert()和get_selection_bound()方法访问它们。