缓冲区

Gtk::TextBuffer是一个包含Gtk::TextView数据的模型,和Gtk::TreeView所使用的Gtk::TreeModel类似。这允许复数个Gtk::TextView共享同一个TextBuffer,并允许以不同方式显示文本缓冲区。你也可以维护多个Gtk::TextBuffer并让同一个Gtk::TextView部件于不同时候分别显示它们。

TextView会创建一个由它拥有的默认TextBuffer,你可以通过get_buffer()方法访问这个缓冲区。

参考

12.1.1. 迭代器

Gtk::TextBuffer::iteratorGtk::TextBuffer::const_iterator表示文本缓冲区中两个字符之间的位置。只要以影响缓冲区中字符数量的方式修改了缓冲区,所有越过修改范围的迭代器都将失效。因此,迭代器不能用于保存越过缓冲区被修改部分的位置。如果想保存位置,请使用Gtk::TextBuffer::Mark

参考

12.1.2. 标签和格式

12.1.2.1. 标签(Tags)

要指定缓冲区中的一些文本具有特定的格式,你需要定义一个标签来保存格式信息,并将该标签应用于文本区域。例如,定义标签及其属性:

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

你可以在使用Tagcreate()方法时为其指定一个名称,但这不是必须的。

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 - insertselection_bound,你可以使用TextBufferget_insert()get_selection_bound()方法访问它们。

参考

12.1.4. 视图

如上所述,每个TextView都有一个TextBuffer,并且多个TextView可以共享同一个TextBuffer

TreeView一样,你可以将TextView放入ScrolledWindow中以允许用户使用滚动条查看并在整个文本区域中移动。

参考

12.1.4.1. 默认格式

TextView具有多种可以让你修改特定视图中缓冲区的显示方式的方法。如果它们指定同一区域,则其中一些可能会覆写缓冲区中的Gtk::TextTag。例如:set_left_margin()set_right_margin()set_indent()等。

12.1.4.2. 滚动

Gtk::TextView有多种scroll_to()方法。这些可以确保你能看到缓冲区中的特定部分。例如你的应用程序可能会使用Gtk::TextView::scroll_to()方法显示找到的文本。