Chapter 10. テキストビュー

Table of Contents

TextViewウィジットは大量のフォーマットされたテキストを表示、編集する時に使えます。TreeViewと同様に、こちらもモデル/ビューの設計を使っています。この場合、TextBufferがモデルとなります。

バッファ

Gtk::TextBufferGtk::TextViewのデータを保持するモデルです。これはGtk::TreeModelを使うGtk::TreeViewの関係と同じものです。 ですから、ふたつ、あるいはそれ以上のGtk::TextViewが同じひとつのTextBufferを共有したり、異なった表示をさせることができます。あるいは、Gtk::TextBufferを複数管理して、様々なタイミングでひとつのGtk::TextViewウィジットに表示させることもできます。

TextViewは自分自身でデフォルトのTextBufferを生成します。これはget_buffer()メソッドからアクセスできます。

Reference

イテレータ

タグとフォーマット

タグ

バッファの中のあるテキストが特定のフォーマットを持つように指定するには、そのフォーマット情報を持ったタグを定義してください。そして、そのタグをテキストの部位に適用します。例えば、タグとその属性を定義するには:

Glib::RefPtr<Gtk::TextBuffer::Tag> refTagMatch = Gtk::TextBuffer::Tag::create();
refTagMatch->property_background() = "orange";

create()メソッドで生成したTagオブジェクトには名前をつけることができます。しかしこれは必要というわけではありません。

Tagクラスは他にも多くの属性を持っています。

Reference

タグテーブル

Gtk::TextBufferはそれぞれのGtk::TextBuffer:TagTableを持ち、ここにバッファのTagを保持します。ふたつ以上のTextBufferがひとつのTagTableを共有することもできます。Tagを生成したときに、それをTagTableに追加してください。例えば:

Glib::RefPtr<Gtk::TextBuffer::TagTable> 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.
Glib::RefPtr<Gtk::TextBuffer> refBuffer =
    Gtk::TextBuffer::create(refTagTable);

あるいはget_tag_table()を使えば、明示的に新しいTagTableを生成するかわりに、TextBufferのデフォルトのものを取得、変更することができます。

Reference

タグを適用する

Tagを生成してそれをTagTableに追加したら、TextBufferの一部に適用することであるテキストをそのフォーマットで表示させることができます。テキストの始まりと終わりはGtk::TextBuffer::iteratorを指定することで定義します。例えば:

refBuffer->apply_tag(refTagMatch, iterRangeStart, iterRangeStop);

あるいは、最初にテキストを挿入するときにタグを指定することもできます:

refBuffer->insert_with_tag(iter, "Some text", refTagMatch);

同じテキストにひとつ以上のTagを適用することができます。apply_tag()を一回以上使うか、insert_with_tags()を使ってください。これらのTagには同じ属性で異なった値を持つものがある場合がありますが、衝突はTag::set_priority()を使うことで解決できます。

マーク

TextBufferイテレータはふつう、テキストが変更されると無効になりますが、このような状況で位置を覚えておくにはGtk::TextBuffer::Markが使えます。例えば:

Glib::RefPtr<Gtk::TextBuffer::Mark> refMark = refBuffer->create_mark(iter);

こうしておいて、その後でMarkの新しい位置におけるイテレータをget_iter()メソッドを使って生成してください。

組込みのMarkオブジェクトが二種類あります。insertselect_boundです。これらはTextBufferget_insert()get_selelection_bound()メソッドからアクセスすることができます。

Reference

ビュー

先ほど述べたとおり、TextViewにはそれぞれTextBufferがあり、ひとつ以上のTextViewがひとつのTextBufferを共有することができます。

TreeViewと同様、TextViewScrolledWindowの中に配置してユーザーがテキスト領域全体をスクロールバーで動かして見られるようにしたいと思うことでしょう。

Reference

デフォルトフォーマット

TextViewには様々なメソッドがあり、これらを使ってバッファの見せ方をそのビューごとに変更することができます。そのうちいくつかは機能が同じであればバッファ内のGtk::TextTagでオーバーライドすることができます。例えば、set_left_margin(), set_right_margin(), set_indent() などです。

スクロール

Gtk::TextViewには様々なscroll_to_*()メソッドがあります。これらを使えばテキストの特定の部分を見せることができます。例えば、アプリケーションの検索機能では結果のテキストを表示するのにGtk::TextView::scroll_to_iter()が使えるでしょう。