Table of Contents
TextViewウィジットは大量のフォーマットされたテキストを表示、編集する時に使えます。TreeViewと同様に、こちらもモデル/ビューの設計を使っています。この場合、TextBufferがモデルとなります。
Gtk::TextBufferはGtk::TextViewのデータを保持するモデルです。これはGtk::TreeModelを使うGtk::TreeViewの関係と同じものです。
ですから、ふたつ、あるいはそれ以上のGtk::TextViewが同じひとつのTextBufferを共有したり、異なった表示をさせることができます。あるいは、Gtk::TextBufferを複数管理して、様々なタイミングでひとつのGtk::TextViewウィジットに表示させることもできます。
TextViewは自分自身でデフォルトのTextBufferを生成します。これはget_buffer()メソッドからアクセスできます。
バッファの中のあるテキストが特定のフォーマットを持つように指定するには、そのフォーマット情報を持ったタグを定義してください。そして、そのタグをテキストの部位に適用します。例えば、タグとその属性を定義するには:
Glib::RefPtr<Gtk::TextBuffer::Tag> refTagMatch = Gtk::TextBuffer::Tag::create(); refTagMatch->property_background() = "orange";
create()メソッドで生成したTagオブジェクトには名前をつけることができます。しかしこれは必要というわけではありません。
Tagクラスは他にも多くの属性を持っています。
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のデフォルトのものを取得、変更することができます。
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オブジェクトが二種類あります。insertとselect_boundです。これらはTextBufferのget_insert()とget_selelection_bound()メソッドからアクセスすることができます。
先ほど述べたとおり、TextViewにはそれぞれTextBufferがあり、ひとつ以上のTextViewがひとつのTextBufferを共有することができます。
TreeViewと同様、TextViewをScrolledWindowの中に配置してユーザーがテキスト領域全体をスクロールバーで動かして見られるようにしたいと思うことでしょう。
TextViewには様々なメソッドがあり、これらを使ってバッファの見せ方をそのビューごとに変更することができます。そのうちいくつかは機能が同じであればバッファ内のGtk::TextTagでオーバーライドすることができます。例えば、set_left_margin(),
set_right_margin(), set_indent() などです。