(2017.9.18 追加記事;
gtk2,gtk3 でテキストを表示します。(Gtk::TextView,Gtk::ScrolledWindow)
→・The Text View Widget - Ruby/GTK2 Tutorial
→・Text Views - Ruby/GTK2 Tutorial
→・Ruby/Gnome2でテキストに色をつける - ままならない日記
→・複数行テキスト表示ウィジェットの概要 - Gtk/TextView、Gtk/TextBuffer、およびその関連クラスについて - Ruby/GTK2, Ruby-GNOME2 - プログラミング工房


1.テキスト表示部品(Gtk::TextView)を作る
○TextView を作る
Gtk::TextView.new(buffer = nil) 
  buffer;テキストは Gtk::TextBufferクラスで作ります
     nilの場合、自動的に Gtk::TextBuffer が作られます

○TextView のサイズを設定する
 幅(width)、高さ(height)をピクセル単位で設定します
 -1;サイズ指定なし


2.TextViewの持つテキストの内容(TextBuffer)を取得する
 戻り値: Gtk::TextBuffer

 テキストの内容は Gtk::TextBufferクラスを使います

※TextBuffer は他のウィジェット(部品)でも呼び出したり共有できます


3.Gtk::TextBuffer にテキスト文字列を設定する
Gtk::TextBuffer#text=(text)
Gtk::TextBuffer#set_text(text)
 text;テキスト文字列(エンコーディングは UTF-8)

※以上をまとめると、テキスト表示部品を作ってテキスト文字列を設定するのは;
 text_area = Gtk::TextView.new
 text_area.buffer.text = 'Hello World!'
のようにできます


(license; public domain)
・gtk_text_1.rb
require 'gtk3'
#require 'gtk2'              # gtk2ライブラリでも実行可能

window = Gtk::Window.new
window.set_size_request(400, 300)


text_area = Gtk::TextView.new
text_area.set_size_request(150, 200)
text_area.buffer.text = 'Hello World!'

fixed = Gtk::Fixed.new
fixed.put(text_area,  10, 10)
window.add(fixed)

window.show_all
window.signal_connect("destroy") { Gtk.main_quit }
Gtk.main

gtk_text_1



4.TextView の設定をする
○テキストを編集不可にする
 Gtk::TextView#set_editable(false)
  false;編集不可
  treu;編集可能(デフォルト)


○カーソルを消す
Gtk::TextView#set_cursor_visible(false)


○ワードラップの設定をする
Gtk::TextView#set_wrap_mode(wrap_mode)
  wrap_mode:Gtk::TextTag::GtkWrapMode
  ・:none(または Gtk::TextTag::WRAP_NONE);ワードラップなし(デフォルト)
  ・:char(または Gtk::TextTag::WRAP_CHAR);ワードラップ文字単位
  ・:word(または Gtk::TextTag::WRAP_WORD);ワードラップ単語単位
                        (日本語だと文字単位と同じ)


○フォーカスを設定する
  ウィンドウが前面になった時、TextView にフォーカス(カーソルが来ている状態)
  ※ Fixed#put や Box#pack_start などで Entry を登録した後でないと有効になりません


○文字サイズ,フォント等を設定する
・Gtk::Widget#override_font(font_desc)  ;gtk3
       str;"[FAMILY-LIST] [STYLE-OPTIONS] [SIZE]"
         [FAMILY-LIST]:serif(明朝体)、sans(ゴシック体)など
         [STYLE-OPTIONS]:bold(太字)など
         [SIZE]:文字サイズ(ポイント数)
         各要素は省略可、それぞれは空白で区切る(文字列で指定)
 

○背景の色を設定する
Gtk::Widget#modify_base(state, color);gtk2  ※ modify_bg ではないことに注意!
  state(状態);Gtk::STATE_NORMAL(または :normal);通常状態(これ以外は無効?)
  color(色) ;・Gdk::Color.new(red, green, blue)
           red, green, blue はそれぞれ 0 - 65535 の値
         ・Gdk::Color.parse(spec)
            spec は'green'など代表的色名、
          または '#FF0000' のようにRGBそれぞれ 00 - FF の値

  state(状態);Gtk::StateFlags::NORMAL(または :normal);通常状態(これ以外は無効?)
  color(色) ;Gdk::RGBA::new(red, green, bule, alpha)
         red, green, blue, alpha はそれぞれ 0 - 1.0 の値


○テキストの文字の色(全体)を設定する
Gtk::Widget#modify_text(state, color);gtk2  ※ modify_fg ではないことに注意!
 state(状態);Gtk::STATE_NORMAL(または :normal) ;通常状態(これ以外は無効?)
 color(色) ;・Gdk::Color.new(red, green, blue)
          red, green, blue はそれぞれ 0 - 65535 の値
        ・Gdk::Color.parse(spec)
           spec は'green'など代表的色名、
         または '#FF0000' のようにRGBそれぞれ 00 - FF の値

 state(状態);Gtk::StateFlags::NORMAL(または :normal);通常状態(これ以外は無効?)
        red, green, blue, alpha はそれぞれ 0 - 1.0 の値


・gtk_text_2_gtk3.rb
require 'gtk2'

window = Gtk::Window.new
window.set_size_request(400, 300)

# フォントの準備
font = Pango::FontDescription.new('18') # フォントサイズ 18

# 色の準備
yellow = Gdk::Color.new(65535, 65535, 0)   # RGB; 0-65535
red    = Gdk::Color.parse('#FF0000')   # RGB; 00-FF (parseを使った作り方)


text_area = Gtk::TextView.new
text_area.set_editable(false)
text_area.set_cursor_visible(false)
text_area.set_wrap_mode(Gtk::TextTag::WRAP_CHAR)
text_area.modify_font(font)
text_area.modify_base(Gtk::STATE_NORMAL, yellow)
text_area.modify_text(Gtk::STATE_NORMAL, red)

text_area.set_size_request(150, 200)
text_area.buffer.text = 'こんにちは、今日は暑いね。'

fixed = Gtk::Fixed.new
fixed.put(text_area,  10, 10)
window.add(fixed)

window.show_all
window.signal_connect("destroy") { Gtk.main_quit }
Gtk.main

・gtk_text_2_gtk3.rb
require 'gtk3'

window = Gtk::Window.new
window.set_size_request(400, 300)

# フォントの準備
font = Pango::FontDescription.new('13') # フォントサイズ 13

# 色の準備
yellow  = Gdk::RGBA::new(1.0, 1.0,   0, 1.0)  # RGBA; 0-1.0
red     = Gdk::RGBA::new(1.0,   0,   0, 1.0)


text_area = Gtk::TextView.new
text_area.set_editable(false)
text_area.set_cursor_visible(false)
text_area.set_wrap_mode(:char)
text_area.override_font(font)
text_area.override_background_color(:normal, yellow)
text_area.override_color(:normal, red)

text_area.set_size_request(150, 200)
text_area.buffer.text = 'こんにちは、今日は暑いね。'

fixed = Gtk::Fixed.new
fixed.put(text_area,  10, 10)
window.add(fixed)

window.show_all
window.signal_connect("destroy") { Gtk.main_quit }
Gtk.main
 
gtk_text_2_gtk3



5.テキストの文字(TextBuffer)を部分的に変更する
→・複数行テキスト表示ウィジェットの概要 - Gtk/TextView、Gtk/TextBuffer、およびその関連クラスについて - Ruby/GTK2, Ruby-GNOME2 - プログラミング工房
→・Text Tags - The Text View WidgetRuby/GTK2 Tutorial

5-1.タグを作る
Gtk::TextBuffer#create_tag(tag_name, properties)
 tag_name;タグの名前を自分で付ける、または nil(無名)に設定
 properties;Gtk::TextTag の 'property' => 値 (または :property => 値)

Gtk::TextTag の property
・フォント
 :family => 'Sans'( 'Helvetica'  'Times'  'Monospace' など)
 :font => 'Sans Italic 12' 
 'font-desc';Pango::FontDescription

・文字サイズ
 'size-points' => 15(ポイント単位で);gtk2
 'size_points' => 15(ポイント単位で);gtk3
 :size => 15(Pango unitで)

・太字
 :weight => Pango::Weight::BOLD

・斜体(イタリック)
 :style => :italic

・文字の色
 :foreground => 'red'('blue' など)
 'foreground-gdk' => Gdk::Color.new(65535, 0, 0) など

・文字の背景色
 :background => 'yellow'('green' など)
 'background-gdk' => Gdk::Color.parse('#FFFF00') など


5-2.テキスト(TextBuffer)の文字の位置を設定する
Gtk::TextBuffer#get_iter_at_offset(char_offset)   ;gtk2
 Gtk::TextBuffer#get_iter_at( :offset => char_offset ) ;gtk3
  char_offset;先頭からの文字数(先頭は0)
 テキストの先頭から何文字目という位置を設定します

Gtk::TextBuffer#get_mark(name)
  Gtk::TextMark の位置を設定します
 (あらかじめ、Gtk::TextBuffer#create_mark でマークを作っておきます)


5-3.タグを使う
Gtk::TextBuffer#apply_tag(tag, start, end)
 tag;タグ名
 start;開始位置
 end;終了位置


以上を組み合わせて使います

・gtk_text_3_gtk2.rb
require 'gtk2'

window = Gtk::Window.new
window.set_size_request(400, 300)

text_area = Gtk::TextView.new
text_area.set_size_request(170, 200)
text_area.buffer.text = 'こんにちは、今日は暑いね。'


tag = text_area.buffer.create_tag(nil, :foreground => 'red', 'size-points' => 16)
start_char = text_area.buffer.get_iter_at_offset(6)
end_char   = text_area.buffer.get_iter_at_offset(9)    # 日本語の文字位置だとずれる
text_area.buffer.apply_tag(tag, start_char, end_char)

fixed = Gtk::Fixed.new
fixed.put(text_area, 10, 10)
window.add(fixed)

window.show_all
window.signal_connect("destroy") { Gtk.main_quit }
Gtk.main

・gtk_text_3_gtk3.rb
require 'gtk3'

window = Gtk::Window.new
window.set_size_request(400, 300)

text_area = Gtk::TextView.new
text_area.set_size_request(170, 200)
text_area.buffer.text = 'こんにちは、今日は暑いね。'


tag = text_area.buffer.create_tag(nil, :foreground => 'red', 'size_points' => 16)
start_char = text_area.buffer.get_iter_at(:offset => 6)
end_char   = text_area.buffer.get_iter_at(:offset => 9)   # 日本語だと文字位置がずれる
text_area.buffer.apply_tag(tag, start_char, end_char)

fixed = Gtk::Fixed.new
fixed.put(text_area, 10, 10)
window.add(fixed)

window.show_all
window.signal_connect("destroy") { Gtk.main_quit }
Gtk.main

gtk_text 3_gtk3
(日本語だと文字位置がずれる)



6.スクロールバーをつける(Gtk::ScrolledWindow
6-1.ScrolledWindow を作る
Gtk::ScrolledWindow.new(hadjustment = nil, vadjustment = nil)
 スクロールバーの付いた ScrolledWindow を作ります

Gtk::ScrolledWindow#set_policy(hscrollbar_policy, vscrollbar_policy)
 横スクロールバー(hscrollbar_policy)を付けるかどうか、
 縦スクロールバー(vscrollbar_policy)を付けるかどうか設定します
  :always(Gtk::POLICY_ALWAYS または Gtk::PolicyType::ALWAYS);常に表示
  :never(Gtk::POLICY_NEVER または Gtk::PolicyType::NEVER);常に表示しない
  :always(Gtk::POLICY_AUTOMATIC または Gtk::PolicyType::AUTOMATIC);自動で表示

○ScrolledWindow のサイズを設定する
 幅(width)、高さ(height)をピクセル単位で設定します
 -1;サイズ指定なし

 
6-2.ScrolledWindow に TextView を登録する
Gtk::Container#add
 ScrolledWindow#add(TextView) のようにします



7.テキストの最後までスクロールする
○Gtk::TextView#scroll_to_iter(Gtk::TextView.buffer#end_iter, 0.0, true, 0.0, 0.0)

Gtk::TextView#scroll_to_iter(iter, within_margin, use_align, xalign, yalign)
  iter;Gtk::TextIter の位置までスクロール  最後の位置の Gtk::TextIte


※ これだと、スクロールの位置がずれる場合がある
 その場合は、以下のように最終行をマークしてそこまでスクロールさせる

○ end_mark = Gtk::TextView#buffer.create_mark(nil, Gtk::TextView.buffer.end_iter, true)
 Gtk::TextView#scroll_to_mark(end_mark, 0.0, false, 0.0, 0.0)

・Gtk::TextBuffer#create_mark(mark_name, iter, left_gravity)
 マーク(Gtk::TextMark)を作る
Gtk::TextBuffer#end_iter
  最後の位置の Gtk::TextIter
Gtk::TextView#scroll_to_mark(mark, within_margin, use_align, xalign, yalign)


・gtk_text_4.rb
require 'gtk3'
#require 'gtk2'              # gtk2ライブラリでも実行可能

window = Gtk::Window.new
window.set_size_request(400, 300)


text_area = Gtk::TextView.new
text_area.set_wrap_mode(:char)    # ワードラップ;文字単位

text_area.buffer.text =
'Ruby/GTK2,Ruby/GTK3 はクロスプラットフォームの GUIツールキットである GTK+ を Rubyから使うライブラリです。
GTK+ バージョン2.x に対応するのが、Ruby/GTK2 で gem名は gtk2、
GTK+ バージョン3.x に対応するのが、Ruby/GTK3 で gem名は gtk3です。'

# テキストの最後にスクロールする
# text_area.scroll_to_iter(text_area.buffer.end_iter, 0.0, true, 0.0, 0.0) # これだとうまくいかない 
end_mark = text_area.buffer.create_mark(nil, text_area.buffer.end_iter, true)
text_area.scroll_to_mark(end_mark, 0.0, false, 0.0, 0.0)

# スクロールバーを付ける
scrolled_area = Gtk::ScrolledWindow.new
scrolled_area.set_size_request(150, 100)
scrolled_area.set_policy(:never, :always)  # スクロールバー;横は無し、縦は常に表示
scrolled_area.add(text_area)               # ScrolledWindowにTextViewを登録する


fixed = Gtk::Fixed.new
fixed.put(scrolled_area, 10, 10)
window.add(fixed)

window.show_all
window.signal_connect("destroy") { Gtk.main_quit }
Gtk.main

gtk_text_4