mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	after scripts [ruby-dev:25479]: NULL current namespce when deleting Tk interpreter [ruby-talk:126225] * ext/tcltklib/extconf.rb: bug fix; TCL_ENABLE_THREAD flag is inverted [ruby-talk:126360] * ext/tcltklib/extconf.rb: add yet another native-thread check * ext/tk/tkutil.c: fix SEGV bug; NULL string pointer when finalize Ruby interpreter * ext/tk/lib/multi-tk.rb: avoid warning for deleted safeTk ip frame * ext/tk/lib/tk/bindtag.rb: bug fix; new method of named bindtag doesn't return the created object [ruby-dev:25479] * ext/tk/lib/tk/menu.rb: bug on treating arguments [ruby-dev:25479] * ext/tk/lib/tk.rb: bug fix; cannot accept a callback ID string for a command argument [ruby-dev:25479] * ext/tk/lib/multi-tk.rb: ditto * ext/tk/lib/tk/*.rb: ditto * ext/tk/lib/tkextlib/*.rb: ditto * ext/tk/sample/demos-jp/anilabel.rb: new demo script * ext/tk/sample/demos-en/anilabel.rb: ditto * ext/tk/sample/tkHTML/ss.rb: local variable scope bug fix [ruby-dev:25479] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7821 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			854 lines
		
	
	
	
		
			31 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			854 lines
		
	
	
	
		
			31 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
#!/usr/bin/env ruby
 | 
						||
 | 
						||
# 漢字コード設定 ( tk.rb のロード時の encoding 推定/設定に使われる )
 | 
						||
$KCODE = 'euc'
 | 
						||
 | 
						||
# tk 関係ライブラリの読み込み
 | 
						||
require 'tk'
 | 
						||
# require 'tkafter'
 | 
						||
 | 
						||
# widget demo directory 位置の獲得
 | 
						||
$demo_dir = File.dirname($0)
 | 
						||
 | 
						||
# root の生成
 | 
						||
$root = TkRoot.new{title "Widget Demonstration"}
 | 
						||
 | 
						||
# tk バージョンの取得
 | 
						||
$tk_version = Tk::TK_VERSION
 | 
						||
$tk_major_ver, $tk_minor_ver = $tk_version.split('.').map{|n| n.to_i}
 | 
						||
$tk_patchlevel = Tk::TK_PATCHLEVEL
 | 
						||
 | 
						||
# tcl_platform 情報へのアクセスオブジェクト
 | 
						||
$tk_platform = TkVarAccess.new('tcl_platform')
 | 
						||
 | 
						||
# フォント設定
 | 
						||
#######
 | 
						||
case($tk_version)
 | 
						||
when /^4.*/
 | 
						||
  $font = TkFont.new('-*-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*', nil)
 | 
						||
  knjfont = '-*--16-*-jisx0208.1983-0'
 | 
						||
  $kanji_font = TkFont.new('-*-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*',
 | 
						||
                           knjfont)
 | 
						||
  TkOption.add('*kanjiFont', knjfont, 'startupFile')
 | 
						||
  $msg_kanji_font=TkFont.new('-*-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*',
 | 
						||
                             '-*--24-*-jisx0208.1983-0')
 | 
						||
 | 
						||
#when '8.0'
 | 
						||
#  $font = TkFont.new('Helvetica -12')
 | 
						||
#  $kanji_font = TkFont.new('Helvetica -12', 'Mincho -12')
 | 
						||
#  TkOption.add('*kanjiFont', knjfont, 'startupFile')
 | 
						||
#  $msg_kanji_font=TkFont.new('Helvetica 16', 'Gothic 16 bold')
 | 
						||
 | 
						||
when /^8.*/
 | 
						||
  $font = TkFont.new('Helvetica -12')
 | 
						||
  $kanji_font = TkFont.new('Helvetica -12', 'Mincho -12')
 | 
						||
  TkOption.add('*kanjiFont', knjfont, 'startupFile')
 | 
						||
  $msg_kanji_font=TkFont.new('Helvetica 16', 'Gothic 16 bold')
 | 
						||
 | 
						||
else
 | 
						||
  $font = TkFont.new('-*-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*', nil)
 | 
						||
  knjfont = '-*--16-*-jisx0208.1983-0'
 | 
						||
  $kanji_font = TkFont.new('-*-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*',
 | 
						||
                           knjfont)
 | 
						||
  TkOption.add('*kanjiFont', knjfont, 'startupFile')
 | 
						||
  $msg_kanji_font=TkFont.new('-*-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*',
 | 
						||
                             '-*--24-*-jisx0208.1983-0')
 | 
						||
end
 | 
						||
#######
 | 
						||
 | 
						||
# イメージ設定
 | 
						||
$image = {}
 | 
						||
 | 
						||
if $tk_major_ver >= 8
 | 
						||
$image['refresh'] = TkPhotoImage.new(:height=>16, :format=>'GIF', :data=><<EOD)
 | 
						||
    R0lGODlhEAAQAPMAAMz/zCpnKdb/1z9mPypbKBtLGy9NMPL/9Or+6+P+4j1Y
 | 
						||
    PwQKBP7//xMLFAYBCAEBASH5BAEAAAAALAAAAAAQABAAAwR0EAD3Gn0Vyw0e
 | 
						||
    ++CncU7IIAezMA/nhUqSLJizvSdCEEjy2ZIV46AwDAoDHwPYGSoEiUJAAGJ6
 | 
						||
    EDHBNCFINW5OqABKSFk/B9lUa94IDwIFgewFMwQDQwCZQCztTgM9Sl8SOEMG
 | 
						||
    KSAthiaOjBMPDhQONBiXABEAOw==
 | 
						||
EOD
 | 
						||
end
 | 
						||
 | 
						||
if $tk_major_ver >= 8
 | 
						||
$image['view'] = TkPhotoImage.new(:height=>16, :format=>'GIF', :data=><<EOD)
 | 
						||
    R0lGODlhEAAQAPMAAMz/zP///8DAwICAgH9/fwAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAwRIcMhJB7h3hM33
 | 
						||
    KFjWdQQYap1QrCaGBmrRrS4nj5b53jOgbwXBKGACoYLDIuAoHCmZyYvR1rT5
 | 
						||
    RMAq8LqcIYGsrjPsW1XOmFUEADs=
 | 
						||
EOD
 | 
						||
end
 | 
						||
 | 
						||
if $tk_major_ver >= 8
 | 
						||
$image['delete'] = TkPhotoImage.new(:height=>16, :format=>'GIF', :data=><<EOD)
 | 
						||
    R0lGODlhEAAOAKEAAIQAAO/n3v///////yH5BAEKAAIALAAAAAAQAA4AAAIm
 | 
						||
    lI9pAKHbIHNoVhYhTdjlJ2AWKG2g+CldmB6rxo2uybYhbS80eRQAOw==
 | 
						||
EOD
 | 
						||
end
 | 
						||
 | 
						||
if $tk_major_ver >= 8
 | 
						||
$image['print'] = TkPhotoImage.new(:height=>19, :format=>'GIF', :data=><<EOD)
 | 
						||
    R0lGODlhGgATAPcAACEQOTEpQjEpUkIpc0IxY0I5c0oxjEo5SlJCY1JCe1JK
 | 
						||
    UlpChFpCjFpGkFpSc1paa2NKc2NKnGNja2tapWtjc29KnHNanHNjc3NjrXNr
 | 
						||
    jHNrnHNzc3tjpXtrtXtzhICAgIRzvYSEjIZzqox7tYyEnIyMjJSEtZSEvZSM
 | 
						||
    lJyMtZyMvZyUlJyUrZyUvZycnKWctaWlpa2czq2lzrWtvbWtzrW1tb21xr21
 | 
						||
    1sa9zs693s7OztbO3tbO597W1t7W7+fe7+fn5////+/n7+/v7+/v9////wAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 | 
						||
    AAAAAAAAAAAAAAAAAAAAACH5BAEAAEEALAAAAAAaABMAQAj/AIMIHBhkg0GC
 | 
						||
    CBMGIQEiQgseQT4oeCBBAokgRYYQ0JBixg8hRIiUUEBBYYmTByBwiCBCRYwH
 | 
						||
    CxY8cKFw4AogRXLqLAJkQ80gCBBg3BkxZswTNGh4MGqgQQUMJRHCwMkTSE+D
 | 
						||
    Pn8eCKBhxIMhO3ei2OHDBw6sWSlMMMoWgwwfMDZI8GBjx44NARZwEGGi5MkS
 | 
						||
    PcIWKRGz5YgLbAco+KkQBQoJIRgjdGEVq+SaJajqtNrzMgsPCmoIzqmDgmWE
 | 
						||
    KOBuUKAAwYabYTfs4OHjY0giGyhk4MAWRI4eKyRQqPgggYUXPH4A+XBAgwoK
 | 
						||
    DiIsCFxjA9sFEVQQCRJCAYAFDJxiKhAxvMTonEFimrhhYinTBgWiCvxLNX3M
 | 
						||
    DkkpsKV5OYhjBxCMYAICAigUEAA7
 | 
						||
EOD
 | 
						||
end
 | 
						||
 | 
						||
# メニュー設定
 | 
						||
TkMenubar.new($root, 
 | 
						||
              [[['File', 0], 
 | 
						||
                  ['About ... ', proc{aboutBox}, 0, '<F1>'],
 | 
						||
                  '---', 
 | 
						||
                  ['Quit', proc{exit}, 0, 'Meta-Q']
 | 
						||
                ]]).pack('side'=>'top', 'fill'=>'x')
 | 
						||
$root.bind('F1', proc{aboutBox})
 | 
						||
$root.bind('Meta-q', proc{exit})
 | 
						||
 | 
						||
=begin
 | 
						||
TkFrame.new($root){|frame|
 | 
						||
  TkMenubutton.new(frame){|button|
 | 
						||
    m = TkMenu.new(button) {
 | 
						||
      add 'command', 'label'=>'Quit', 'command'=>proc{exit}, 'underline'=>0
 | 
						||
    }
 | 
						||
    menu m
 | 
						||
    text 'File'
 | 
						||
    underline 0
 | 
						||
  }.pack('side'=>'left')
 | 
						||
}.pack('side'=>'top', 'fill'=>'x')
 | 
						||
=end
 | 
						||
 | 
						||
# テキストボックスの生成
 | 
						||
if $tk_version =~ /^4\.[01]/
 | 
						||
  scr = TkScrollbar.new($root, 'orient'=>'vertical')
 | 
						||
  txt = TkText.new($root) {
 | 
						||
    #wrap 'word'
 | 
						||
    wrap 'char'
 | 
						||
    width 70
 | 
						||
    height 30
 | 
						||
    font $font
 | 
						||
    setgrid 'yes'
 | 
						||
    yscrollcommand proc{|first,last| scr.set first,last}
 | 
						||
  }
 | 
						||
  scr.command(proc{|*args| txt.yview(*args)})
 | 
						||
  scr.pack('side'=>'right', 'fill'=>'y')
 | 
						||
  txt.pack('expand'=>'yes', 'fill'=>'both')
 | 
						||
else
 | 
						||
  textFrame = TkFrame.new($root)
 | 
						||
  scr = TkScrollbar.new($root, 'orient'=>'vertical', 
 | 
						||
                        'highlightthickness'=>0, 'takefocus'=>1) {
 | 
						||
    pack('in'=>textFrame, 'side'=>'right', 'fill'=>'y', 'padx'=>1)
 | 
						||
  }
 | 
						||
  txt = TkText.new($root) {
 | 
						||
    #wrap 'word'
 | 
						||
    wrap 'char'
 | 
						||
    width 70
 | 
						||
    height 30
 | 
						||
    font $font
 | 
						||
    setgrid 'yes'
 | 
						||
    highlightthickness 0
 | 
						||
    padx 4
 | 
						||
    pady 2
 | 
						||
    takefocus 0
 | 
						||
    bd 1
 | 
						||
    yscrollcommand proc{|first,last| scr.set first,last}
 | 
						||
  }
 | 
						||
  scr.command(proc{|*args| txt.yview(*args)})
 | 
						||
#  txt.pack('in'=>textFrame, 'expand'=>'yes', 'fill'=>'both', 'padx'=>1)
 | 
						||
  txt.pack('in'=>textFrame, 'expand'=>'yes', 'fill'=>'both')
 | 
						||
#  textFrame.pack('expand'=>'yes', 'fill'=>'both', 'padx'=>1, 'pady'=>2)
 | 
						||
  textFrame.pack('expand'=>'yes', 'fill'=>'both')
 | 
						||
 | 
						||
  statusBar = TkFrame.new($root) {|f|
 | 
						||
    $statusBarLabel = \
 | 
						||
    TkLabel.new(f, 'text'=>"   ", 'relief'=>'sunken', 'bd'=>1, 'anchor'=>'w', 
 | 
						||
                'font'=>'-*-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*') \
 | 
						||
    .pack('side'=>'left', 'padx'=>2, 'expand'=>'yes', 'fill'=>'both')
 | 
						||
    TkLabel.new(f, 'width'=>8, 'relief'=>'sunken', 'bd'=>1, 'anchor'=>'w', 
 | 
						||
                'font'=>'-*-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*') \
 | 
						||
    .pack('side'=>'left', 'padx'=>2)
 | 
						||
  }.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>2)
 | 
						||
end
 | 
						||
 | 
						||
# テキストタグ設定
 | 
						||
tag_title = TkTextTag.new(txt, 'font'=>'-*-Helvetica-Bold-R-Normal--*-180-*-*-*-*-*-*')
 | 
						||
#tag_kanji_title = TkTextTag.new(txt, 'kanjifont'=>$msg_kanji_font)
 | 
						||
#tag_middle = TkTextTag.new(txt, 'kanjifont'=>$kanji_font)
 | 
						||
tag_kanji_title = TkTextTag.new(txt, 'font'=>$msg_kanji_font)
 | 
						||
tag_middle = TkTextTag.new(txt, 'font'=>$kanji_font)
 | 
						||
tag_demospace = TkTextTag.new(txt, 'lmargin1'=>'1c', 'lmargin2'=>'1c')
 | 
						||
 | 
						||
if TkWinfo.depth($root) == 1
 | 
						||
  tag_demo = TkTextTag.new(txt, 'lmargin1'=>'1c', 'lmargin2'=>'1c', 
 | 
						||
                           'underline'=>1)
 | 
						||
  $tag_visited = TkTextTag.new(txt, 'lmargin1'=>'1c', 'lmargin2'=>'1c', 
 | 
						||
                              'underline'=>1)
 | 
						||
  tag_hot = TkTextTag.new(txt, 'background'=>'black', 'foreground'=>'white')
 | 
						||
else
 | 
						||
  tag_demo = TkTextTag.new(txt, 'lmargin1'=>'1c', 'lmargin2'=>'1c', 
 | 
						||
                           'foreground'=>'blue', 'underline'=>1)
 | 
						||
  $tag_visited = TkTextTag.new(txt, 'lmargin1'=>'1c', 'lmargin2'=>'1c', 
 | 
						||
                              'foreground'=>'#303080', 'underline'=>1)
 | 
						||
#  tag_hot = TkTextTag.new(txt, 'relief'=>'raised', 'borderwidth'=>1, 
 | 
						||
#                         'background'=>'SeaGreen3')
 | 
						||
  tag_hot = TkTextTag.new(txt, 'borderwidth'=>1, 'foreground'=>'red')
 | 
						||
end
 | 
						||
 | 
						||
#tag_demo.bind('Button-1', proc{invoke txt, txt.index('current')})
 | 
						||
tag_demo.bind('ButtonRelease-1', 
 | 
						||
              proc{|x,y|invoke txt, txt.index("@#{x},#{y}")}, '%x %y')
 | 
						||
 | 
						||
lastLine = TkVariable.new("")
 | 
						||
newLine  = TkVariable.new("")
 | 
						||
tag_demo.bind('Enter', proc{|x,y|
 | 
						||
                lastLine.value = txt.index("@#{x},#{y} linestart")
 | 
						||
                tag_hot.add(lastLine.value, "#{lastLine.value} lineend")
 | 
						||
                showStatus txt, txt.index("@#{x},#{y}")
 | 
						||
              },
 | 
						||
              '%x %y')
 | 
						||
tag_demo.bind('Leave', 
 | 
						||
              proc{
 | 
						||
                tag_hot.remove('1.0','end')
 | 
						||
                txt.configure('cursor','xterm')
 | 
						||
                $statusBarLabel.configure('text'=>"")
 | 
						||
              })
 | 
						||
tag_demo.bind('Motion', proc{|x, y|
 | 
						||
                newLine.value = txt.index("@#{x},#{y} linestart")
 | 
						||
                if newLine.value != lastLine.value
 | 
						||
                  tag_hot.remove('1.0','end')
 | 
						||
                  lastLine.value = newLine.value
 | 
						||
                  if ( txt.tag_names("@#{x},#{y}").find{|t| 
 | 
						||
                        t.kind_of?(String) && t =~ /^demo-/
 | 
						||
                      } )
 | 
						||
                    tag_hot.add(lastLine.value, 
 | 
						||
                                "#{lastLine.value} lineend -1 chars")
 | 
						||
                  end
 | 
						||
                end
 | 
						||
                showStatus txt, txt.index("@#{x},#{y}")
 | 
						||
              },
 | 
						||
              '%x %y')
 | 
						||
 | 
						||
# テキスト生成
 | 
						||
txt.insert('end', 'Ruby/Tk : Widget', tag_title)
 | 
						||
#txt.insert('end', "  デモンストレーション\n", tag_middle)
 | 
						||
txt.insert('end', "  デモンストレーション\n", tag_kanji_title)
 | 
						||
txt.insert('end', <<"EOT")
 | 
						||
 | 
						||
このアプリケーションは、Tk Widget を用いてどのようなことができるか\
 | 
						||
を示すための、いくつかの小さなスクリプトに対するフロントエンドを提\
 | 
						||
供しています。以下に順番に挙げられているデモンストレーションを実行\
 | 
						||
するにはマウスでクリックしてください。デモンストレーションのウィン\
 | 
						||
ドウが現れると、デモンストレーションを生成した Ruby/Tk のコードを見\
 | 
						||
るために、"コード参照"ボタンをクリックすることができます。あなたが\
 | 
						||
望むなら、そのコードを修正することができます。修正したコードでデモ\
 | 
						||
ンストレーションを再実行するためには、コードが書かれたウィンドウに\
 | 
						||
ある"デモ再実行" ボタンをクリックしてください。
 | 
						||
 | 
						||
一部のデモでは,比較的最近のバージョンの Tk でなければサポートして\
 | 
						||
いない機能を使って実装しています(例えば Tk8.4 以上など).そのため,\
 | 
						||
そうした機能を持たない Tk ライブラリを使っている場合には,そうした\
 | 
						||
デモは正しく動きません.そのような機能が必要であれば,それをサポート\
 | 
						||
している Tk ライブラリを使うように,tcltklib をコンパイルしなおして\
 | 
						||
ください.
 | 
						||
 | 
						||
 | 
						||
EOT
 | 
						||
 | 
						||
#txt.insert('end',"ラベル, ボタン, チェックボタン, ラジオボタン\n",tag_middle)
 | 
						||
txt.insert('end', "ラベル, ボタン, チェックボタン, ラジオボタン\n", 
 | 
						||
           tag_kanji_title)
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "1. ラベル (テキスト, ビットマップ)\n", 
 | 
						||
           tag_demo, "demo-label")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "2. ラベルとUNICODEテキスト (機能に対応したバージョンのTkが必要)\n", tag_demo, "demo-unicodeout")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "3. ボタン \n", tag_demo, "demo-button")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "4. チェックボタン (複数を選択可能)\n", 
 | 
						||
           tag_demo, "demo-check")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "5. 3状態チェックボタン (機能に対応したバージョンのTkが必要)\n", 
 | 
						||
           tag_demo, "demo-check2")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "6. ラジオボタン (任意の一つを選択可能)\n", 
 | 
						||
           tag_demo, "demo-radio")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "7. ラジオボタン (機能に対応したバージョンのTkが必要)\n", 
 | 
						||
           tag_demo, "demo-radio2")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "8. 3状態ラジオボタン (機能に対応したバージョンのTkが必要)\n", 
 | 
						||
           tag_demo, "demo-radio3")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "9. ボタンで作られた15-パズルゲーム\n", 
 | 
						||
           tag_demo, "demo-puzzle")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "10. ビットマップを使用したアイコンボタン\n", 
 | 
						||
           tag_demo, "demo-icon")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "11. 画像を表示する二つのラベル\n", 
 | 
						||
           tag_demo, "demo-image1")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "12. 画像を見るための簡単なユーザインターフェース\n", 
 | 
						||
           tag_demo, "demo-image2")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "13. 画像を見るための簡単なユーザインターフェース (機能に対応したバージョンのTkが必要)\n", 
 | 
						||
           tag_demo, "demo-image3")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "14. ラベル付きフレーム (機能に対応したバージョンのTkが必要)\n", 
 | 
						||
           tag_demo, "demo-labelframe")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
 | 
						||
txt.insert('end', "\n")
 | 
						||
#txt.insert('end', "リストボックス\n", tag_middle)
 | 
						||
txt.insert('end', "リストボックス\n", tag_kanji_title)
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "1. 都道府県.\n", tag_demo, "demo-states")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "2. 色: アプリケーションのための配色を変える\n", 
 | 
						||
           "#{tag_demo.id} demo-colors")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "3. 格言集\n", tag_demo, "demo-sayings")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
 | 
						||
txt.insert('end', "\n")
 | 
						||
#txt.insert('end', "エントリとスピンボックス\n", tag_middle)
 | 
						||
txt.insert('end', "エントリ\n", tag_kanji_title)
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "1. スクロールバーなし\n", tag_demo, "demo-entry1")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "2. スクロールバーあり\n", tag_demo, "demo-entry2")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "3. 認証処理付きのエントリボックスとパスワードフィールド (機能に対応したバージョンのTkが必要)\n", 
 | 
						||
           tag_demo, "demo-entry3")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "4. スピンボックス (機能に対応したバージョンのTkが必要)\n", 
 | 
						||
           tag_demo, "demo-spin")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "5. 簡単なフォーム\n", tag_demo, "demo-form")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
 | 
						||
txt.insert('end', "\n")
 | 
						||
#txt.insert('end', "テキスト\n", tag_middle)
 | 
						||
txt.insert('end', "テキスト\n", tag_kanji_title)
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "1. 基本的なテキスト\n", tag_demo, "demo-text")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "2. 表示スタイル.\n", tag_demo, "demo-style")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "3. ハイパーテキスト(タグバインド).\n", 
 | 
						||
           tag_demo, "demo-bind")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "4. ウィンドウを埋め込んだテキスト\n", 
 | 
						||
           tag_demo, "demo-twind")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "5. ウィンドウを埋め込んだテキスト (機能に対応したバージョンのTkが必要)\n", 
 | 
						||
           tag_demo, "demo-twind2")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "6. 検索\n", tag_demo, "demo-search")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
 | 
						||
txt.insert('end', "\n")
 | 
						||
#txt.insert('end', "キャンバス\n", tag_middle)
 | 
						||
txt.insert('end', "キャンバス\n", tag_kanji_title)
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "1. アイテムの型\n", tag_demo, "demo-items")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "2. 2 次元のプロット\n", tag_demo, "demo-plot")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "3. テキスト\n", tag_demo, "demo-ctext")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "4. 矢印の形\n", tag_demo, "demo-arrow")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "5. ルーラー\n", tag_demo, "demo-ruler")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "6. フロアプラン\n", tag_demo, "demo-floor")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "7. フロアプラン (異なるキャンバスアイテム作成方法を使用)\n", tag_demo, "demo-floor2")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "8. スクロール可能なキャンバス\n", 
 | 
						||
           tag_demo, "demo-cscroll")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
 | 
						||
txt.insert('end', "\n")
 | 
						||
#txt.insert('end', "スケール\n", tag_middle)
 | 
						||
txt.insert('end', "スケール\n", tag_kanji_title)
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "1. 垂直\n", tag_demo.id, "demo-vscale")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "2. 水平\n", tag_demo.id, "demo-hscale")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
 | 
						||
txt.insert('end', "\n")
 | 
						||
txt.insert('end', "ペインドウィンドウ\n", tag_kanji_title)
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "1. 水平方向 (機能に対応したバージョンのTkが必要)\n", 
 | 
						||
           tag_demo.id, "demo-paned1")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "2. 垂直方向 (機能に対応したバージョンのTkが必要)\n", 
 | 
						||
           tag_demo.id, "demo-paned2")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
 | 
						||
txt.insert('end', "\n")
 | 
						||
#txt.insert('end', "メニュー\n", tag_middle)
 | 
						||
txt.insert('end', "メニュー\n", tag_kanji_title)
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "1. メニューとカスケードを含んだウィンドウ\n", 
 | 
						||
           tag_demo, "demo-menu")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "2. メニューとカスケードを含んだウィンドウ (Tk8.x 専用)\n", 
 | 
						||
           tag_demo, "demo-menu8x")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "3.                 〃                (機能に対応したバージョンのTkが必要)\n", 
 | 
						||
           tag_demo, "demo-menu84")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "4. メニューボタン (Tk8.x 専用)\n", 
 | 
						||
           tag_demo, "demo-menubu")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
 | 
						||
txt.insert('end', "\n")
 | 
						||
#txt.insert('end', "ダイアログウィンドウ\n", tag_middle)
 | 
						||
txt.insert('end', "ダイアログウィンドウ\n", tag_kanji_title)
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "1. メッセージボックス\n", tag_demo, "demo-msgbox")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "2. ファイル選択ダイアログ\n", tag_demo, "demo-filebox")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "3. 色選択ダイアログ\n", tag_demo, "demo-clrpick")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
 | 
						||
txt.insert('end', "\n")
 | 
						||
#txt.insert('end', "アニメーション\n", tag_middle)
 | 
						||
txt.insert('end', "アニメーション\n", tag_kanji_title)
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "1. アニメーションラベル (機能に対応したバージョンのTkが必要)\n", tag_demo, "demo-anilabel")
 | 
						||
 | 
						||
txt.insert('end', "\n")
 | 
						||
#txt.insert('end', "その他\n", tag_middle)
 | 
						||
txt.insert('end', "その他\n", tag_kanji_title)
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "1. 組み込みのビットマップ\n", tag_demo, "demo-bitmap")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "2. モーダルダイアログ(ローカルグラブ)\n", 
 | 
						||
           tag_demo, "demo-dialog1")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
txt.insert('end', "3. モーダルダイアログ(グローバルグラブ)\n", 
 | 
						||
           tag_demo, "demo-dialog2")
 | 
						||
txt.insert('end', " \n ", tag_demospace)
 | 
						||
 | 
						||
txt.state('disabled')
 | 
						||
scr.focus
 | 
						||
 | 
						||
################################
 | 
						||
# method 定義
 | 
						||
################################
 | 
						||
def positionWindow(w)
 | 
						||
  w.geometry('+300+300')
 | 
						||
end
 | 
						||
 | 
						||
# 親ウィジェットと,変数名と TkVariable との組(配列)の並びを渡す
 | 
						||
$showVarsWin = {}
 | 
						||
def showVars1(parent, *args)
 | 
						||
  if $showVarsWin[parent.path]
 | 
						||
    begin
 | 
						||
      $showVarsWin[parent.path].destroy 
 | 
						||
    rescue
 | 
						||
    end
 | 
						||
  end
 | 
						||
  top = TkToplevel.new(parent) {|w|
 | 
						||
    title "Variable values"
 | 
						||
    TkLabel.new(w) {
 | 
						||
      text "変数値:"
 | 
						||
      width 20
 | 
						||
      anchor 'center'
 | 
						||
      font '-Adobe-helvetica-medium-r-normal--*-180-*-*-*-*-*-*'
 | 
						||
    }.pack('side'=>'top', 'fill'=>'x')
 | 
						||
    len = 1
 | 
						||
    args.each{|vnam,vbody|
 | 
						||
      len = vnam.to_s.length if vnam.to_s.length > len
 | 
						||
    }
 | 
						||
    args.each{|vnam,vbody|
 | 
						||
      TkFrame.new(w){|f|
 | 
						||
        #TkLabel.new(f, 'text'=>"#{vnam}: ").pack('side'=>'left')
 | 
						||
        TkLabel.new(f, 'text'=>"#{vnam}: ",'width'=>len+2).pack('side'=>'left')
 | 
						||
        TkLabel.new(f, 'textvariable'=>vbody, 'anchor'=>'w')\
 | 
						||
                   .pack('side'=>'left', 'expand'=>'yes', 'fill'=>'x')
 | 
						||
      }.pack('side'=>'top', 'anchor'=>'w', 'fill'=>'x')
 | 
						||
    }
 | 
						||
    TkButton.new(w) {
 | 
						||
      text "了解"
 | 
						||
      command proc{w.destroy}
 | 
						||
    }.pack('side'=>'bottom', 'pady'=>2)
 | 
						||
  }
 | 
						||
  $showVarsWin[parent.path] = top
 | 
						||
end
 | 
						||
 | 
						||
def showVars2(parent, *args)
 | 
						||
  if $showVarsWin[parent.path]
 | 
						||
    begin
 | 
						||
      $showVarsWin[parent.path].destroy 
 | 
						||
    rescue
 | 
						||
    end
 | 
						||
  end
 | 
						||
  $showVarsWin[parent.path] = TkToplevel.new(parent) {|w|
 | 
						||
    title "Variable values"
 | 
						||
 | 
						||
    TkLabelFrame.new(w, :text=>"変数値:", 
 | 
						||
                     :font=>{:family=>'Helvetica', :size=>14}){|f|
 | 
						||
      args.each{|vnam,vbody|
 | 
						||
        TkGrid(TkLabel.new(f, :text=>"#{vnam}: ", :anchor=>'w'), 
 | 
						||
               TkLabel.new(f, :textvariable=>vbody, :anchor=>'w'), 
 | 
						||
               :padx=>2, :pady=>2, :sticky=>'w')
 | 
						||
      }
 | 
						||
 | 
						||
      f.grid(:sticky=>'news', :padx=>4)
 | 
						||
      f.grid_columnconfig(1, :weight=>1)
 | 
						||
      f.grid_rowconfig(100, :weight=>1)
 | 
						||
    }
 | 
						||
    TkButton.new(w, :text=>"了解", :width=>8, :default=>:active, 
 | 
						||
                 :command=>proc{w.destroy}){|b|
 | 
						||
      w.bind('Return', proc{b.invoke})
 | 
						||
      w.bind('Escape', proc{b.invoke})
 | 
						||
 | 
						||
      b.grid(:sticky=>'e', :padx=>4, :pady=>[6, 4])
 | 
						||
    }
 | 
						||
    w.grid_columnconfig(0, :weight=>1)
 | 
						||
    w.grid_rowconfig(0, :weight=>1)
 | 
						||
  }
 | 
						||
end
 | 
						||
 | 
						||
if $tk_major_ver < 8
 | 
						||
  alias showVars showVars1
 | 
						||
elsif $tk_major_ver == 8 && $tk_minor_ver < 4
 | 
						||
  alias showVars showVars1
 | 
						||
else # ver >= 8.4
 | 
						||
  alias showVars showVars2
 | 
						||
end
 | 
						||
 | 
						||
# テキスト上での click に対する動作
 | 
						||
def invoke (txt, index)
 | 
						||
  tag = txt.tag_names(index).find{|t| t.kind_of?(String) && t =~ /^demo-/}
 | 
						||
  return unless tag
 | 
						||
  cursor = txt.cget('cursor')
 | 
						||
  txt.cursor('watch')
 | 
						||
  Tk.update
 | 
						||
#  eval `cat #{tag[5..-1]}.rb`
 | 
						||
#  eval `cat #{[$demo_dir, tag[5..-1]].join(File::Separator)}.rb`
 | 
						||
  eval IO.readlines("#{[$demo_dir, tag[5..-1]].join(File::Separator)}.rb").join
 | 
						||
  Tk.update
 | 
						||
#  txt.cursor('xterm')
 | 
						||
  txt.cursor(cursor)
 | 
						||
 | 
						||
  $tag_visited.add("#{index} linestart +1 chars", "#{index} lineend +1 chars")
 | 
						||
end
 | 
						||
 | 
						||
# 状態表示
 | 
						||
def showStatus (txt, index)
 | 
						||
  tag = txt.tag_names(index).find{|t| t.kind_of?(String) && t =~ /^demo-/}
 | 
						||
  cursor = txt.cget('cursor')
 | 
						||
  unless tag
 | 
						||
    $statusBarLabel.configure('text', " ")
 | 
						||
    newcursor = 'xterm'
 | 
						||
  else
 | 
						||
    demoname = tag[5..-1]
 | 
						||
    $statusBarLabel.configure('text', 
 | 
						||
                             "サンプルプログラム \"#{demoname}\" の実行 ")
 | 
						||
    newcursor = 'hand2'
 | 
						||
  end
 | 
						||
  txt.configure('cursor'=>newcursor) if cursor != newcursor
 | 
						||
end
 | 
						||
 | 
						||
# ソースコードの表示
 | 
						||
def showCode1(demo)
 | 
						||
  file = "#{demo}.rb"
 | 
						||
  $code_window = nil unless defined? $code_window
 | 
						||
  if $code_window == nil || TkWinfo.exist?($code_window) == false
 | 
						||
    $code_window = TkToplevel.new(nil)
 | 
						||
    f = TkFrame.new($code_window)
 | 
						||
    TkButton.new(f) {
 | 
						||
      #text "了解"
 | 
						||
      text "閉じる"
 | 
						||
      command proc{
 | 
						||
        $code_window.destroy
 | 
						||
        $code_window = nil
 | 
						||
      }
 | 
						||
    }.pack('side'=>'left', 'expand'=>'yes', 'pady'=>2)
 | 
						||
    TkButton.new(f) {
 | 
						||
      text "再実行"
 | 
						||
      command proc{eval($code_text.get('1.0','end'))}
 | 
						||
    }.pack('side'=>'left', 'expand'=>'yes', 'pady'=>2)
 | 
						||
#    f.pack('side'=>'bottom', 'expand'=>'yes', 'fill'=>'x')
 | 
						||
    f.pack('side'=>'bottom', 'fill'=>'x')
 | 
						||
 | 
						||
    if $tk_version =~ /^4\.[01]/
 | 
						||
      s = TkScrollbar.new($code_window, 'orient'=>'vertical')
 | 
						||
      $code_text = TkText.new($code_window) {
 | 
						||
        height 40
 | 
						||
        setgrid 'yes'
 | 
						||
        yscrollcommand proc{|first,last| s.set first,last}
 | 
						||
      }
 | 
						||
      s.command(proc{|*args| $code_text.yview(*args)})
 | 
						||
      s.pack('side'=>'right', 'fill'=>'y')
 | 
						||
      $code_text.pack('side'=>'left', 'expand'=>'yes', 'fill'=>'both')
 | 
						||
    else
 | 
						||
      TkFrame.new($code_window) {|f|
 | 
						||
        pack('expand'=>'yes', 'fill'=>'both', 'padx'=>1, 'pady'=>1)
 | 
						||
 | 
						||
        hs = TkScrollbar.new($code_window, 'highlightthickness'=>0, 
 | 
						||
                             'orient'=>'horizontal')
 | 
						||
        vs = TkScrollbar.new($code_window, 'highlightthickness'=>0, 
 | 
						||
                             'orient'=>'vertical')
 | 
						||
        $code_text = TkText.new($code_window) {|t|
 | 
						||
          height 40
 | 
						||
          #wrap 'word'
 | 
						||
          wrap 'char'
 | 
						||
          xscrollcommand proc{|first,last| hs.set first,last}
 | 
						||
          yscrollcommand proc{|first,last| vs.set first,last}
 | 
						||
          setgrid 'yes'
 | 
						||
          highlightthickness 0
 | 
						||
          pady 2
 | 
						||
          padx 3
 | 
						||
          hs.command(proc{|*args| $code_text.xview(*args)})
 | 
						||
          vs.command(proc{|*args| $code_text.yview(*args)})
 | 
						||
        }
 | 
						||
 | 
						||
        $code_text.grid('in'=>f, 'padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>0, 
 | 
						||
                        'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news')
 | 
						||
        vs.grid('in'=>f, 'padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>1, 
 | 
						||
                'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news')
 | 
						||
#       xs.grid('in'=>f, 'padx'=>1, 'pady'=>1, 'row'=>1, 'column'=>0, 
 | 
						||
#               'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news')
 | 
						||
        TkGrid.rowconfigure(f, 0, 'weight'=>1, 'minsize'=>0)
 | 
						||
        TkGrid.columnconfigure(f, 0, 'weight'=>1, 'minsize'=>0)
 | 
						||
      }
 | 
						||
    end
 | 
						||
  else
 | 
						||
    $code_window.deiconify
 | 
						||
    $code_window.raise
 | 
						||
  end
 | 
						||
  $code_window.title("Demo code: #{file}")
 | 
						||
  $code_window.iconname(file)
 | 
						||
#  fid = open(file, 'r')
 | 
						||
  fid = open([$demo_dir, file].join(File::Separator), 'r')
 | 
						||
  $code_text.delete('1.0', 'end')
 | 
						||
  #$code_text.insert('1.0', `cat #{file}`)
 | 
						||
  $code_text.insert('1.0', fid.read)
 | 
						||
  #$code_mark = TkTextMark.new($code_text, '1.0')
 | 
						||
  #$code_text.set_insert('1.0')
 | 
						||
  TkTextMarkInsert.new($code_text,'1.0')
 | 
						||
  fid.close
 | 
						||
end
 | 
						||
 | 
						||
def showCode2(demo)
 | 
						||
  file = "#{demo}.rb"
 | 
						||
  $code_window = nil unless defined? $code_window
 | 
						||
  if $code_window == nil || TkWinfo.exist?($code_window) == false
 | 
						||
    $code_window = TkToplevel.new(nil)
 | 
						||
    tf = TkFrame.new($code_window)
 | 
						||
    $code_text = TkText.new(tf, :font=>'Courier 10', :height=>30, 
 | 
						||
                           :wrap=>'word', :bd=>1, :setgrid=>true, 
 | 
						||
                           :highlightthickness=>0, :pady=>2, :padx=>3)
 | 
						||
    xscr = TkScrollbar.new(tf, :bd=>1){assign($code_text)}
 | 
						||
    yscr = TkScrollbar.new(tf, :bd=>1){assign($code_text)}
 | 
						||
    TkGrid($code_text, yscr, :sticky=>'news')
 | 
						||
    #TkGrid(xscr)
 | 
						||
    tf.grid_rowconfigure(0, :weight=>1)
 | 
						||
    tf.grid_columnconfigure(0, :weight=>1)
 | 
						||
 | 
						||
    bf = TkFrame.new($code_window)
 | 
						||
    
 | 
						||
    #b_dis = TkButton.new(bf, :text=>'了解', :default=>:active, 
 | 
						||
    b_dis = TkButton.new(bf, :text=>'閉じる', :default=>:active, 
 | 
						||
                         :command=>proc{
 | 
						||
                           $code_window.destroy
 | 
						||
                           $code_window = nil
 | 
						||
                         }, 
 | 
						||
                         :image=>$image['delete'], :compound=>:left)
 | 
						||
    b_prn = TkButton.new(bf, :text=>'印刷', 
 | 
						||
                         :command=>proc{printCode($code_text, file)}, 
 | 
						||
                         :image=>$image['print'], :compound=>:left)
 | 
						||
    b_run = TkButton.new(bf, :text=>'再実行', 
 | 
						||
                         :command=>proc{eval($code_text.get('1.0','end'))}, 
 | 
						||
                         :image=>$image['refresh'], :compound=>:left)
 | 
						||
 | 
						||
    TkGrid('x', b_run, b_prn, b_dis, :padx=>4, :pady=>[6,4])
 | 
						||
    bf.grid_columnconfigure(0, :weight=>1)
 | 
						||
 | 
						||
    TkGrid(tf, :sticky=>'news')
 | 
						||
    TkGrid(bf, :sticky=>'ew')
 | 
						||
    $code_window.grid_columnconfigure(0, :weight=>1)
 | 
						||
    $code_window.grid_rowconfigure(0, :weight=>1)
 | 
						||
 | 
						||
    $code_window.bind('Return', proc{|win|
 | 
						||
                        b_dis.invoke unless win.kind_of?(TkText)
 | 
						||
                      }, '%W')
 | 
						||
    $code_window.bindinfo('Return').each{|cmd, arg|
 | 
						||
      $code_window.bind_append('Escape', cmd, arg)
 | 
						||
    }
 | 
						||
  else
 | 
						||
    $code_window.deiconify
 | 
						||
    $code_window.raise
 | 
						||
  end
 | 
						||
 | 
						||
  $code_window.title("Demo code: #{file}")
 | 
						||
  $code_window.iconname(file)
 | 
						||
  fid = open([$demo_dir, file].join(File::Separator), 'r')
 | 
						||
  $code_text.delete('1.0', 'end')
 | 
						||
  $code_text.insert('1.0', fid.read)
 | 
						||
  TkTextMarkInsert.new($code_text,'1.0')
 | 
						||
  fid.close
 | 
						||
end
 | 
						||
 | 
						||
if $tk_major_ver < 8
 | 
						||
  alias showCode showCode1
 | 
						||
elsif $tk_major_ver == 8 && $tk_minor_ver < 4
 | 
						||
  alias showCode showCode1
 | 
						||
else # ver >= 8.4
 | 
						||
  alias showCode showCode2
 | 
						||
end
 | 
						||
 | 
						||
 | 
						||
# printCode --
 | 
						||
# Prints the source code currently displayed in the See Code dialog.
 | 
						||
# Much thanks to Arjen Markus for this.
 | 
						||
#
 | 
						||
# Arguments:
 | 
						||
# txt -         Name of text widget containing code to print
 | 
						||
# file -        Name of the original file (implicitly for title)
 | 
						||
 | 
						||
def printCode(txt, file)
 | 
						||
  code = txt.get('1.0', 'end - 1c')
 | 
						||
  dir = '.'
 | 
						||
  dir = ENV['HOME'] if ENV['HOME']
 | 
						||
  dir = ENV['TMP'] if ENV['TMP']
 | 
						||
  dir = ENV['TEMP'] if ENV['TEMP']
 | 
						||
 | 
						||
  fname = [dir, 'tkdemo-' + file].join(File::Separator)
 | 
						||
  open(fname, 'w'){|fid| fid.print(code)}
 | 
						||
  begin
 | 
						||
    case Tk::TCL_PLATFORM('platform')
 | 
						||
    when 'unix'
 | 
						||
      msg = `lp -c #{fname}`
 | 
						||
      unless $?.exitstatus == 0
 | 
						||
        Tk.messageBox(:title=>'Print spooling failure', 
 | 
						||
                      :message=>'エラーが発生しました.' + 
 | 
						||
                                '印刷に失敗したものと思われます : ' + msg)
 | 
						||
      end
 | 
						||
    when 'windows'
 | 
						||
      begin
 | 
						||
        printTextWin32(fname)
 | 
						||
      rescue => e
 | 
						||
        Tk.messageBox(:title=>'Print spooling failure', 
 | 
						||
                      :message=>'エラーが発生しました.' + 
 | 
						||
                                '印刷に失敗したものと思われます : ' + 
 | 
						||
                                e.message)
 | 
						||
      end      
 | 
						||
    when 'macintosh'
 | 
						||
      Tk.messageBox(:title=>'Operation not Implemented', 
 | 
						||
                    :message=>'印刷機能はまだ実装されていません')
 | 
						||
    else
 | 
						||
      Tk.messageBox(:title=>'Operation not Implemented', 
 | 
						||
                    :message=>'検出された環境 ' + 
 | 
						||
                              Tk::TCL_PLATFORM('platform') + 
 | 
						||
                              ' は未知の環境であるため,' + 
 | 
						||
                              '印刷機能は実装されていません: ')
 | 
						||
    end
 | 
						||
  ensure
 | 
						||
    File.delete(fname)
 | 
						||
  end
 | 
						||
end
 | 
						||
 | 
						||
# printTextWin32 --
 | 
						||
#    Print a file under Windows
 | 
						||
#
 | 
						||
# Arguments:
 | 
						||
# filename -            Name of the file
 | 
						||
#
 | 
						||
def printTextWin32(fname)
 | 
						||
  require 'win32/registry'
 | 
						||
  begin
 | 
						||
    app = Win32::Registry::HKEY_CLASSES_ROOT['.txt']
 | 
						||
    pcmd = nil
 | 
						||
    Win32::Registry::HKEY_CLASSES_ROOT.open("#{app}\\shell\\print"){|reg|
 | 
						||
      pcmd = reg['command']
 | 
						||
    }
 | 
						||
  rescue
 | 
						||
    app = Tk.tk_call('auto_execok', 'notepad.exe')
 | 
						||
    pcmd = "#{app} /p %1"
 | 
						||
  end
 | 
						||
 | 
						||
  pcmd.gsub!('%1', fname)
 | 
						||
  puts pcmd
 | 
						||
  cmd = Tk.tk_call('auto_execok', 'start') + ' /min ' + pcmd
 | 
						||
  
 | 
						||
  msg = `#{cmd}`
 | 
						||
  unless $?.exitstatus == 0
 | 
						||
    fail RuntimeError, msg
 | 
						||
  end
 | 
						||
end
 | 
						||
 | 
						||
# aboutBox
 | 
						||
#
 | 
						||
#      Pops up a message box with an "about" message
 | 
						||
#
 | 
						||
def aboutBox
 | 
						||
  Tk.messageBox('icon'=>'info', 'type'=>'ok', 'title'=>'About Widget Demo', 
 | 
						||
                'message'=>"Ruby/Tk ウィジェットデモ Ver.1.5.0-jp\n\n" + 
 | 
						||
                           "based on demos of Tk8.1 -- 8.5  " + 
 | 
						||
                           "( Copyright:: " + 
 | 
						||
                           "(c) 1996-1997 Sun Microsystems, Inc. / " + 
 | 
						||
                           "(c) 1997-2000 Ajuba Solutions, Inc. / " + 
 | 
						||
                           "(c) 2001-2003 Donal K. Fellows )\n\n" +
 | 
						||
                           "Your Ruby & Tk Version ::\n" + 
 | 
						||
                           "Ruby#{RUBY_VERSION}(#{RUBY_RELEASE_DATE})[#{RUBY_PLATFORM}] / Tk#{$tk_patchlevel}#{(Tk::JAPANIZED_TK)? '-jp': ''}")
 | 
						||
end
 | 
						||
 | 
						||
####################################
 | 
						||
# 引数で指定されたデモを起動する
 | 
						||
no_launcher = false
 | 
						||
if ARGV[0] == '-n'
 | 
						||
  ARGV.shift
 | 
						||
  no_launcher = true if ARGV.size > 0
 | 
						||
end
 | 
						||
ARGV.each{|cmd| 
 | 
						||
  if cmd =~ /(.*).rb/
 | 
						||
    cmd = $1
 | 
						||
  end
 | 
						||
  eval IO.readlines("#{[$demo_dir, cmd].join(File::Separator)}.rb").join
 | 
						||
}
 | 
						||
if no_launcher
 | 
						||
  $root.withdraw  # hide root window
 | 
						||
  Thread.start{
 | 
						||
    loop do
 | 
						||
      count = 0
 | 
						||
      $root.winfo_children.each{|w|
 | 
						||
        count += 1 if w.kind_of?(TkToplevel)
 | 
						||
      }
 | 
						||
      $root.destroy if count == 0
 | 
						||
    end
 | 
						||
  }
 | 
						||
end
 | 
						||
 | 
						||
################################
 | 
						||
# イベント待ちに入る
 | 
						||
Tk.mainloop
 |