diff options
Diffstat (limited to 'ext')
141 files changed, 19495 insertions, 25 deletions
diff --git a/ext/tk/lib/multi-tk.rb b/ext/tk/lib/multi-tk.rb index 99c25f2595..af94204252 100644 --- a/ext/tk/lib/multi-tk.rb +++ b/ext/tk/lib/multi-tk.rb @@ -174,6 +174,8 @@ class MultiTkIp @@DEFAULT_MASTER = self.allocate @@DEFAULT_MASTER.instance_eval{ + @encoding = [] + @tk_windows = {} @tk_table_list = [] @@ -433,6 +435,8 @@ class MultiTkIp fail ArgumentError, "expecting a Hash object for the 2nd argument" end + @encoding = [] + @tk_windows = {} @tk_table_list = [] @@ -792,6 +796,10 @@ end # class methods to delegate to TclTkIp class << MultiTkIp + def method_missing(id, *args) + __getip.send(id, *args) + end + def make_safe __getip.make_safe end @@ -1141,6 +1149,41 @@ class MultiTkIp end end + +# encoding convert +class MultiTkIp + # from tkencoding.rb by ttate@jaist.ac.jp + alias __eval _eval + alias __invoke _invoke + private :__eval + private :__invoke + + def encoding + @encoding[0] + end + def encoding=(enc) + @encoding[0] = enc + end + + def _eval(cmd) + if @encoding[0] != nil + _fromUTF8(__eval(_toUTF8(cmd, @encoding[0])), @encoding[0]) + else + __eval(cmd) + end + end + + def _invoke(*cmds) + if defined?(@encoding[0]) && @encoding[0] != nil + cmds = cmds.collect{|cmd| _toUTF8(cmd, @encoding[0])} + _fromUTF8(__invoke(*cmds), @encoding[0]) + else + __invoke(*cmds) + end + end +end + + # end of MultiTkIp definition MultiTkIp.freeze # defend against modification diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index b25c5f3a1c..0a9aacaaa5 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -407,7 +407,13 @@ module TkComm if num = EV_KEY.index($1) case EV_TYPE[num] when ?n - arg_cnv << TkComm::number(arg_val[idx]) + begin + val = TkComm::number(arg_val[idx]) + rescue ArgumentError + # ignore --> no convert + val = TkComm::string(arg_val[idx]) + end + arg_cnv << val when ?s arg_cnv << TkComm::string(arg_val[idx]) when ?b @@ -3748,24 +3754,28 @@ class TkWindow<TkObject self end - def _destroy_children + def destroy + super children = [] rexp = /^#{self.path}\.[^.]+$/ TkCore::INTERP.tk_windows.each{|path, obj| - children << obj if path =~ rexp + children << [path, obj] if path =~ rexp } - children.each{|obj| obj.destroy} - end - private :_destroy_children - - def destroy - super - _destroy_children if defined?(@cmdtbl) for id in @cmdtbl uninstall_cmd id end end + + children.each{|path, obj| + if defined?(@cmdtbl) + for id in @cmdtbl + uninstall_cmd id + end + end + TkCore::INTERP.tk_windows.delete(path) + } + tk_call 'destroy', epath uninstall_win end @@ -5020,6 +5030,9 @@ module TkComposite extend Tk def initialize(parent=nil, *args) + @delegates = {} + @delegates['DEFAULT'] = @frame + if parent.kind_of? Hash keys = _symbolkey2str(parent) parent = keys['parent'] @@ -5031,10 +5044,6 @@ module TkComposite @path = @epath = @frame.path initialize_composite(*args) end - unless defined? @delegates - @delegates = {} - @delegates['DEFAULT'] = @frame - end end def epath @@ -5148,21 +5157,17 @@ end # widget_destroy_hook require 'tkvirtevent' -TkBindTag::ALL.bind(TkVirtualEvent.new('Destroy'), proc{|widget| - if widget.respond_to?(:path) - w = widget.path - else - w = widget.to_s - end - if widget.respond_to?(:__destroy_hook__) - begin - if TkCore::INTERP._invoke('winfo','exist',w) == '1' +TkBindTag::ALL.bind(TkVirtualEvent.new('Destroy'), proc{|xpath| + path = xpath[1..-1] + if (widget = TkCore::INTERP.tk_windows[path]) + if widget.respond_to?(:__destroy_hook__) + begin widget.__destroy_hook__ + rescue Exception end - rescue Exception end end - }, '%W') + }, 'x%W') # autoload autoload :TkCanvas, 'tkcanvas' diff --git a/ext/tk/sample/demos-en/ChangeLog b/ext/tk/sample/demos-en/ChangeLog new file mode 100644 index 0000000000..c3f66cf409 --- /dev/null +++ b/ext/tk/sample/demos-en/ChangeLog @@ -0,0 +1,64 @@ +2002-08-29 16:30 matt + + * ChangeLog: ChangeLog is auto-generated *from* CVS log. + +2002-08-29 16:27 matt + + * ChangeLog.prev: [no log message] + +2002-08-28 18:07 matt + + * browse1, browse2, hello, ixset, rmt, rolodex, rolodex-j, square, + tcolor, timer, widget: Changed #! lines to the slightly more + portable '#!/usr/bin/env ruby'. + +2002-08-28 17:56 matt + + * icon.rb, items.rb, label.rb, menu.rb, ruler.rb: Changed bitmap + file extensions from .bmp to .xbm. + +2002-08-28 17:55 matt + + * images/: face.bmp, face.xbm, flagdown.bmp, flagdown.xbm, + flagup.bmp, flagup.xbm, gray25.bmp, gray25.xbm, letters.bmp, + letters.xbm, noletter.bmp, noletter.xbm, pattern.bmp, pattern.xbm: + Changed X bitmap file extensions from .bmp to the more intuitive + .xbm. + +2002-08-28 17:35 matt + + * bitmap.rb, colors.rb, cscroll.rb, ctext.rb, hello, ixset, + menubu.rb, patch_1.1c1, rmt, style.rb, timer, ChangeLog, README, + README.tkencoding, arrow.rb, bind.rb, browse1, browse2, button.rb, + check.rb, clrpick.rb, dialog1.rb, dialog2.rb, entry1.rb, entry2.rb, + filebox.rb, floor.rb, form.rb, hscale.rb, icon.rb, image1.rb, + image2.rb, items.rb, label.rb, menu.rb, msgbox.rb, plot.rb, + puzzle.rb, radio.rb, rolodex, rolodex-j, ruler.rb, sayings.rb, + search.rb, square, states.rb, tcolor, text.rb, tkencoding.rb, + twind.rb, vscale.rb, widget, doc.org/README, doc.org/README.JP, + doc.org/README.tk80, doc.org/license.terms, + doc.org/license.terms.tk80, images/earth.gif, images/earthris.gif, + images/face.bmp, images/flagdown.bmp, images/flagup.bmp, + images/gray25.bmp, images/grey.25, images/grey.5, + images/letters.bmp, images/noletter.bmp, images/pattern.bmp, + images/tcllogo.gif, images/teapot.ppm: Initial revision + +2002-08-28 17:35 matt + + * bitmap.rb, colors.rb, cscroll.rb, ctext.rb, hello, ixset, + menubu.rb, patch_1.1c1, rmt, style.rb, timer, ChangeLog, README, + README.tkencoding, arrow.rb, bind.rb, browse1, browse2, button.rb, + check.rb, clrpick.rb, dialog1.rb, dialog2.rb, entry1.rb, entry2.rb, + filebox.rb, floor.rb, form.rb, hscale.rb, icon.rb, image1.rb, + image2.rb, items.rb, label.rb, menu.rb, msgbox.rb, plot.rb, + puzzle.rb, radio.rb, rolodex, rolodex-j, ruler.rb, sayings.rb, + search.rb, square, states.rb, tcolor, text.rb, tkencoding.rb, + twind.rb, vscale.rb, widget, doc.org/README, doc.org/README.JP, + doc.org/README.tk80, doc.org/license.terms, + doc.org/license.terms.tk80, images/earth.gif, images/earthris.gif, + images/face.bmp, images/flagdown.bmp, images/flagup.bmp, + images/gray25.bmp, images/grey.25, images/grey.5, + images/letters.bmp, images/noletter.bmp, images/pattern.bmp, + images/tcllogo.gif, images/teapot.ppm: Taking over demo package + from Jonathan Conway. + diff --git a/ext/tk/sample/demos-en/ChangeLog.prev b/ext/tk/sample/demos-en/ChangeLog.prev new file mode 100644 index 0000000000..536ce30abe --- /dev/null +++ b/ext/tk/sample/demos-en/ChangeLog.prev @@ -0,0 +1,9 @@ +2001-07-26 <rise@leannan.knavery.net> + + * Moved files to directory ruby-tk81-demos-english in tarball. + +2001-07-26 <rise@knavery.net> + + * Added test to widget and hello versus Tk::TCL_VERSION & Tk::JAPANIZED_TK (per Guy Decoux in [ruby-talk:18559]) before requiring tkencoding.rb. + +
\ No newline at end of file diff --git a/ext/tk/sample/demos-en/README b/ext/tk/sample/demos-en/README new file mode 100644 index 0000000000..2908aa38e4 --- /dev/null +++ b/ext/tk/sample/demos-en/README @@ -0,0 +1,138 @@ +Current Maintainer: + Jonathan Conway + rise@knavery.net + + Please direct all bug reports/requests/suggestions to the above + address. + + +Notes: + +* The files hello and widget have been changed to test Tk::TCL_VERSION + and Tk::JAPANIZED_TK before requiring tkencoding.rb to prevent an + infinite loop. This test was taken from a message in + [ruby-talk:18559] by Guy Decoux. + +* The .bmp files in the images directory are X bitmaps (i.e. XBM to many + graphics packages), not Windows bitmaps (.bmp). You will not be + able to use images exported by a graphics program as Windows + bitmaps with this demo collection nor will you be able to edit the + included images without setting the file type correctly. + +-- Jonathan Conway, 2001-07-26 + + +#------------------------------------------------------------------------------ +# ==== Introduction. ==== +# +# To create this version of the Ruby/Tk widget demo, I took the +# ruby-tk81-demos and removed all the Kanji strings and comments. I +# have tried to restore the original English strings and comments +# using the Tcl/Tk8.2.2 version of the widget demo. +# +# When I tried running the Kanji version, all I got was a mostly blank +# panel with a non-functional "File" button. I disovered that if all +# non-ASCII characters were replaced with blanks, then I could get the +# gutted stuff running. +# +# Since English Ruby/Tk documentation is lacking and I needed this +# code to see how it worked and to use as the basis of my try-it +# prototype (The Ruby Yielding Interactive Toolkit), plus the fact +# that no help was forthcoming for making the Kanji version work (plus +# the fact that I can't read Kanji anyway), I decided to embark on +# this English restoration project. +# +# Thanks to everyone who worked on the original Ruby/Tk widget demo +# (and the preceding Tcl/Tk version for that matter). The +# comparatively simple task of changing text strings and comments has +# made me appreciate the great amount of original work that went into +# this. +# +# -- Conrad Schneiker, 2000-07-23. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# ==== Known bugs. ==== +# +# ^C-ing the demo gives Ruby interrupt and stack message; clean exit needed. +# Font settings don't work correctly. +# Dismissing the embedded windows demo (tkwind.rb) kills the widget demo. +# Rerunning the canvas item demo from the code widow get errors. +# The "press me" button in the canvas item demo doesn't time out. +# The simple 2 d plot starts up extremely slow compared to the Tcl version. +# The first item message on the icon menu on the menu and cascades demo doesn't work. +#------------------------------------------------------------------------------ + + +###################### Original README ######################################## + + Ruby/Tk81 widget-demo 1999/08/13 + + 北陸先端大情報科学研究科 + 立石 <ttate@jaist.ac.jp> + +Tcl/Tk8.1ではunicode(UTF8)が採用され、unicodeに変換された日本語であれば +Widgetに表示させることが可能です。本アーカイブには以前に永井さんが中心と +なられて作成されたRuby/Tkのサンプルに修正を加え、以下の環境においてで動作 +を確認したものです。 + +* ruby-1.3.7,ruby-1.4.0 +* tcl8.1, tk8.1 +* linux-2.2 + +Windows(Cygwin)において、サンプルを動かすにはrubyを-Keというオプションを付 +けて起動させると良いそうです。 + 情報提供:渡辺さん + <eban@os.rim.or.jp> + +---------------------------------------------------------------------------- + Ruby/Tk widget-demo + version 1.1 ( 1998/07/24 ) + 永井@知能.九工大 (nagai@ai.kyutech.ac.jp) + +標準配布の Tcl/Tk 拡張パッケージを取り込んだ Ruby (以下 Ruby/Tk と呼びます) +では,Tk widget を用いた GUI の作成を行うことができます.実際に GUI を作成 +していく場合には様々な実例がサンプルとして存在すると便利なのですが,Ruby/Tk +にはそのような適当なサンプルスクリプト集合は存在しませんでした.それに対し, +拡張パッケージの元である Tcl/Tk には,Tk widget を用いてどのようなことがで +きるかを示すものとして widget-demo が存在しおり,Tcl/Tk を用いた GUI の作成 +を習得する際の代表的サンプルとなっています.本アーカイブは,Ruby/Tk の習得の +ための代表的なサンプルスクリプトとすべく,Tcl/Tk の widget-demo を移植したも +のです. + +本アーカイブに含まれるスクリプトを実行するためには,ruby-1.1c2 以上であるこ +とが必要です.1.1c1 の場合は,本アーカイブに含まれる patck_1.1c1 を Ruby の +ライブラリにあててください.組み込む Tk のバージョンは,4.2 でも 8.0 でも修 +正なく動かせるはずです.ただし,日本語版での移植となっているため,日本語化さ +れた Tk をご利用ください.スクリプトのテストは,Tk4.2jp と Tk8.0jp の上で行 +いました (完璧にではないですが). + +本アーカイブに含まれるスクリプトの多くは,元となっている Tcl/Tk 版に比較的近 +いスクリプト記述となるようにしています.そのため,Ruby/Tk のサンプルと言うに +は,あまり Ruby らしくないとも言えるでしょう.にもかかわらず,そのような記述 +を取っている理由は,Ruby/Tk のドキュメント不足にあります. + +Tcl/Tk には適当な参考書が何冊か存在していますから,Ruby/Tk スクリプトを作成 +する際は,そのような Tcl/Tk の参考書で情報を補いながら作成することになると思 +います.各 widget の使用例として,Tcl/Tk の widget-demo を参照することもある +でしょう.Ruby/Tk 版の記述を widget-demo を Tcl/Tk 版の記述に近いものにして +おけば,その対比によって,Ruby/Tk の理解を早めることができると考えられます. +一旦 Ruby/Tk での 各 widget の使用方法を習得してしまえば,Ruby らしいスクリ +プトを作成することは難しくないでしょう.本アーカイブのスクリプトは,Ruby/Tk +を最初に習得するまでの踏台として利用していただければ幸いです. + +widget-demo の移植にあたっては,次の方にも移植したスクリプトを提供していただ +きました.ここに感謝の意を表します. + + 立石@JAIST (ttate@jaist.ac.jp) さん + 平松祥史 (hiramatu@cdrom.co.jp) さん + +平松さんによる Ruby/Tk 入門の Web page (http://www.cdrom.co.jp/~hiramatu/) +も Ruby/Tk の習得に有用と思えますので,ぜひご参照ください. + +また,前橋 (maebashi@iij.ad.jp) さんをはじめとして,widget-demo の移植に際し +て必要となった Ruby の Tk 関連ライブラリ修正について,問題点,バグの指摘をし +ていただいた方々にも感謝致します. + +そして最後に最大の感謝を Ruby 設計者の まつもと ゆきひろ (matz@netlab.co.jp) +さんに捧げたいと思います. diff --git a/ext/tk/sample/demos-en/README.tkencoding b/ext/tk/sample/demos-en/README.tkencoding new file mode 100644 index 0000000000..8fcb494c03 --- /dev/null +++ b/ext/tk/sample/demos-en/README.tkencoding @@ -0,0 +1,24 @@ +tkencoding.rbを用いた日本語の表示について + +Copyright (C) 1999/07, Takaaki Tateishi <ttate@jaist.ac.jp> + + +1. tkencoding.rbとは? + +tkencoding.rbはTcl/Tk8.1を利用したRuby/Tkのためのライブラリ +です。tkencoding.rbをrequireすることによってWedgetに表示さ +れるテキストは全てunicode(UTF8)へ変換されます。 + + +2. 使い方 + +tkencoding.rbをrequireしてTk.encodingで使用している文字コード +を指定して下さい。例えば以下のような感じになります。 + +---- +require 'tk' +require 'tkencoding' + +Tk.encoding = "euc-jp" +# Tk.encoding = "shiftjis" +--- diff --git a/ext/tk/sample/demos-en/arrow.rb b/ext/tk/sample/demos-en/arrow.rb new file mode 100644 index 0000000000..8ee13254ea --- /dev/null +++ b/ext/tk/sample/demos-en/arrow.rb @@ -0,0 +1,239 @@ +# arrow.rb +# +# This demonstration script creates a canvas widget that displays a +# large line with an arrowhead whose shape can be edited interactively. +# +# arrowhead widget demo (called by 'widget') +# + +# arrowSetup -- +# This method regenerates all the text and graphics in the canvas +# window. It's called when the canvas is initially created, and also +# whenever any of the parameters of the arrow head are changed +# interactively. +# +# Arguments: +# c - Name of the canvas widget. + +def arrowSetup(c) + v = $demo_arrowInfo + + # Remember the current box, if there is one. + tags = c.gettags('current') + if tags != [] + cur = tags.find{|t| t.kind_of?(String) && t =~ /^box[1-3]$/ } + else + cur = nil + end + + # Create the arrow and outline. + c.delete('all') + TkcLine.new(c, v.x1, v.y, v.x2, v.y, + { 'width'=>10 * v.width, + 'arrowshape'=>[10*v.a, 10*v.b, 10*v.c], + 'arrow'=>'last' + }.update(v.bigLineStyle) ) + xtip = v.x2 - 10*v.b + deltaY = 10*v.c + 5*v.width + TkcLine.new(c, v.x2, v.y, xtip, v.y + deltaY, + v.x2 - 10*v.a, v.y, xtip, v.y - deltaY, v.x2, v.y, + 'width'=>2, 'capstyle'=>'round', 'joinstyle'=>'round') + + # Create the boxes for reshaping the line and arrowhead. + TkcRectangle.new(c, v.x2-10*v.a-5, v.y-5, v.x2-10*v.a+5, v.y+5, + {'tags'=>['box1', $arrowTag_box]}.update(v.boxStyle) ) + TkcRectangle.new(c, xtip-5, v.y-deltaY-5, xtip+5, v.y-deltaY+5, + {'tags'=>['box2', $arrowTag_box]}.update(v.boxStyle) ) + TkcRectangle.new(c, v.x1-5, v.y-5*v.width-5, v.x1+5, v.y-5*v.width+5, + {'tags'=>['box3', $arrowTag_box]}.update(v.boxStyle) ) + c.itemconfigure cur, v.activeStyle if cur + + # Create three arrows in actual size with the same parameters + TkcLine.new(c, v.x2+50, 0, v.x2+50, 1000, 'width'=>2) + tmp = v.x2+100 + TkcLine.new(c, tmp, v.y-125, tmp, v.y-75, 'width'=>v.width, + 'arrow'=>'both', 'arrowshape'=>[v.a, v.b, v.c]) + TkcLine.new(c, tmp-25, v.y, tmp+25, v.y, 'width'=>v.width, + 'arrow'=>'both', 'arrowshape'=>[v.a, v.b, v.c]) + TkcLine.new(c, tmp-25, v.y+75, tmp+25, v.y+125, 'width'=>v.width, + 'arrow'=>'both', 'arrowshape'=>[v.a, v.b, v.c]) + + # Create a bunch of other arrows and text items showing the + # current dimensions. + tmp = v.x2+10 + TkcLine.new(c, tmp, v.y-5*v.width, tmp, v.y-deltaY, + 'arrow'=>'both', 'arrowshape'=>v.smallTips) + TkcText.new(c, v.x2+15, v.y-deltaY+5*v.c, 'text'=>v.c, 'anchor'=>'w') + tmp = v.x1-10 + TkcLine.new(c, tmp, v.y-5*v.width, tmp, v.y+5*v.width, + 'arrow'=>'both', 'arrowshape'=>v.smallTips) + TkcText.new(c, v.x1-15, v.y, 'text'=>v.width, 'anchor'=>'e') + tmp = v.y+5*v.width+10*v.c+10 + TkcLine.new(c, v.x2-10*v.a, tmp, v.x2, tmp, + 'arrow'=>'both', 'arrowshape'=>v.smallTips) + TkcText.new(c, v.x2-5*v.a, tmp+5, 'text'=>v.a, 'anchor'=>'n') + tmp = tmp+25 + TkcLine.new(c, v.x2-10*v.b, tmp, v.x2, tmp, + 'arrow'=>'both', 'arrowshape'=>v.smallTips) + TkcText.new(c, v.x2-5*v.b, tmp+5, 'text'=>v.b, 'anchor'=>'n') + + TkcText.new(c, v.x1, 310, 'text'=>"'width'=>#{v.width}", 'anchor'=>'w', + 'font'=>'-*-Helvetica-Medium-R-Normal--*-180-*-*-*-*-*-*') + TkcText.new(c, v.x1, 330, + 'text'=>"'arrowshape'=>[#{v.a}, #{v.b}, #{v.c}]", 'anchor'=>'w', + 'font'=>'-*-Helvetica-Medium-R-Normal--*-180-*-*-*-*-*-*') + + v.count += 1 +end + +# toplevel widget +if defined?($arrow_demo) && $arrow_demo + $arrow_demo.destroy + $arrow_demo = nil +end + +# demo toplevel widget +$arrow_demo = TkToplevel.new {|w| + title("Arrowhead Editor Demonstration") + iconname("arrow") + positionWindow(w) +} + +# label +TkLabel.new($arrow_demo, 'font'=>$font, 'wraplength'=>'5i', 'justify'=>'left', + 'text'=>"This widget allows you to experiment with different widths and arrowhead shapes for lines in canvases. To change the line width or the shape of the arrowhead, drag any of the three boxes attached to the oversized arrow. The arrows on the right give examples at normal scale. The text at the bottom shows the configuration options as you'd enter them for a canvas line item."){ + pack('side'=>'top') +} + +# frame +$arrow_buttons = TkFrame.new($arrow_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $arrow_demo + $arrow_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'arrow'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$arrow_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# canvas +$arrow_canvas = TkCanvas.new($arrow_demo, 'width'=>500, 'height'=>350, + 'relief'=>'sunken', 'borderwidth'=>2) +$arrow_canvas.pack('expand'=>'yes', 'fill'=>'both') + +# +unless Struct.const_defined?("ArrowInfo") + $demo_arrowInfo = Struct.new("ArrowInfo", :a, :b, :c, :width, :motionProc, + :x1, :x2, :y, :smallTips, :count, + :bigLineStyle, :boxStyle, :activeStyle).new +end +$demo_arrowInfo.a = 8 +$demo_arrowInfo.b = 10 +$demo_arrowInfo.c = 3 +$demo_arrowInfo.width = 2 +$demo_arrowInfo.motionProc = proc{} +$demo_arrowInfo.x1 = 40 +$demo_arrowInfo.x2 = 350 +$demo_arrowInfo.y = 150 +$demo_arrowInfo.smallTips = [5, 5, 2] +$demo_arrowInfo.count = 0 +if TkWinfo.depth($arrow_canvas) > 1 + $demo_arrowInfo.bigLineStyle = {'fill'=>'SkyBlue1'} + $demo_arrowInfo.boxStyle = {'fill'=>'', 'outline'=>'black', 'width'=>1} + $demo_arrowInfo.activeStyle = {'fill'=>'red', 'outline'=>'black', 'width'=>1} +else + $demo_arrowInfo.bigLineStyle = {'fill'=>'black', + 'stipple'=>'@'+[$demo_dir, 'images', 'grey.25'].join(File::Separator)} + $demo_arrowInfo.boxStyle = {'fill'=>'', 'outline'=>'black', 'width'=>1} + $demo_arrowInfo.activeStyle = {'fill'=>'black','outline'=>'black','width'=>1} +end +$arrowTag_box = TkcTag.new($arrow_canvas) +arrowSetup $arrow_canvas +$arrowTag_box.bind('Enter', proc{$arrow_canvas.itemconfigure('current', $demo_arrowInfo.activeStyle)}) +$arrowTag_box.bind('Leave', proc{$arrow_canvas.itemconfigure('current', $demo_arrowInfo.boxStyle)}) +$arrowTag_box.bind('B1-Enter', proc{}) +$arrowTag_box.bind('B1-Leave', proc{}) +$arrow_canvas.itembind('box1', '1', + proc{$demo_arrowInfo.motionProc \ + = proc{|x,y| arrowMove1 $arrow_canvas, x, y}}) +$arrow_canvas.itembind('box2', '1', + proc{$demo_arrowInfo.motionProc \ + = proc{|x,y| arrowMove2 $arrow_canvas, x, y}}) +$arrow_canvas.itembind('box3', '1', + proc{$demo_arrowInfo.motionProc \ + = proc{|x,y| arrowMove3 $arrow_canvas, x, y}}) +$arrowTag_box.bind('B1-Motion', + proc{|x,y| $demo_arrowInfo.motionProc.call(x,y)}, "%x %y") +$arrow_canvas.bind('Any-ButtonRelease-1', proc{arrowSetup $arrow_canvas}) + +# arrowMove1 -- +# This method is called for each mouse motion event on box1 (the +# one at the vertex of the arrow). It updates the controlling parameters +# for the line and arrowhead. +# +# Arguments: +# c - The name of the canvas window. +# x, y - The coordinates of the mouse. + +def arrowMove1(c,x,y) + v = $demo_arrowInfo + newA = (v.x2+5-c.canvasx(x).round)/10 + newA = 0 if newA < 0 + newA = 25 if newA > 25 + if newA != v.a + c.move('box1', 10*(v.a-newA), 0) + v.a = newA + end +end + +# arrowMove2 -- +# This method is called for each mouse motion event on box2 (the +# one at the trailing tip of the arrowhead). It updates the controlling +# parameters for the line and arrowhead. +# +# Arguments: +# c - The name of the canvas window. +# x, y - The coordinates of the mouse. + +def arrowMove2(c,x,y) + v = $demo_arrowInfo + newB = (v.x2+5-c.canvasx(x).round)/10 + newB = 0 if newB < 0 + newB = 25 if newB > 25 + newC = (v.y+5-c.canvasy(y).round-5*v.width)/10 + newC = 0 if newC < 0 + newC = 20 if newC > 20 + if newB != v.b || newC != v.c + c.move('box2', 10*(v.b-newB), 10*(v.c-newC)) + v.b = newB + v.c = newC + end +end + +# arrowMove3 -- +# This method is called for each mouse motion event on box3 (the +# one that controls the thickness of the line). It updates the +# controlling parameters for the line and arrowhead. +# +# Arguments: +# c - The name of the canvas window. +# x, y - The coordinates of the mouse. + +def arrowMove3(c,x,y) + v = $demo_arrowInfo + newWidth = (v.y+2-c.canvasy(y).round)/5 + newWidth = 0 if newWidth < 0 + newWidth = 20 if newWidth > 20 + if newWidth != v.width + c.move('box3', 0, 5*(v.width-newWidth)) + v.width = newWidth + end +end + diff --git a/ext/tk/sample/demos-en/bind.rb b/ext/tk/sample/demos-en/bind.rb new file mode 100644 index 0000000000..5d30d228f0 --- /dev/null +++ b/ext/tk/sample/demos-en/bind.rb @@ -0,0 +1,110 @@ +# bind.rb +# +# This demonstration script creates a text widget with bindings set +# up for hypertext-like effects. +# +# text (tag bindings) widget demo (called by 'widget') +# + +# toplevel widget +if defined?($bind_demo) && $bind_demo + $bind_demo.destroy + $bind_demo = nil +end + +# demo toplevel widget +$bind_demo = TkToplevel.new {|w| + title("Text Demonstration - Tag Bindings") + iconname("bind") + positionWindow(w) +} + +# frame +TkFrame.new($bind_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $bind_demo + $bind_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'bind'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# bind +def tag_binding_for_bind_demo(tag, enter_style, leave_style) + tag.bind('Any-Enter', proc{tag.configure enter_style}) + tag.bind('Any-Leave', proc{tag.configure leave_style}) +end + +# text +TkText.new($bind_demo){|t| + # + setgrid 'true' + width 60 + height 24 + font $font + wrap 'word' + TkScrollbar.new($bind_demo) {|s| + pack('side'=>'right', 'fill'=>'y') + command proc{|*args| t.yview(*args)} + t.yscrollcommand proc{|first,last| s.set first,last} + } + pack('expand'=>'yes', 'fill'=>'both') + + # + if TkWinfo.depth($root).to_i > 1 + tagstyle_bold = {'background'=>'#43ce80', 'relief'=>'raised', + 'borderwidth'=>1} + tagstyle_normal = {'background'=>'', 'relief'=>'flat'} + else + tagstyle_bold = {'foreground'=>'white', 'background'=>'black'} + tagstyle_normal = {'foreground'=>'', 'background'=>''} + end + + # テキスト挿入 + insert 'insert', "The same tag mechanism that controls display styles in text widgets can also be used to associate Tcl commands with regions of text, so that mouse or keyboard actions on the text cause particular Tcl commands to be invoked. For example, in the text below the descriptions of the canvas demonstrations have been tagged. When you move the mouse over a demo description the description lights up, and when you press button 1 over a description then that particular demonstration is invoked. + +" + insert('end', '1. Samples of all the different types of items that can be created in canvas widgets.', (d1 = TkTextTag.new(t)) ) + insert('end', "\n\n") + insert('end', '2. A simple two-dimensional plot that allows you to adjust the positions of the data points.', (d2 = TkTextTag.new(t)) ) + insert('end', "\n\n") + insert('end', '3. Anchoring and justification modes for text items.', + (d3 = TkTextTag.new(t)) ) + insert('end', "\n\n") + insert('end', '4. An editor for arrow-head shapes for line items.', + (d4 = TkTextTag.new(t)) ) + insert('end', "\n\n") + insert('end', '5. A ruler with facilities for editing tab stops.', + (d5 = TkTextTag.new(t)) ) + insert('end', "\n\n") + insert('end', + '6. A grid that demonstrates how canvases can be scrolled.', + (d6 = TkTextTag.new(t)) ) + + # binding + [d1, d2, d3, d4, d5, d6].each{|tag| + tag_binding_for_bind_demo(tag, tagstyle_bold, tagstyle_normal) + } + d1.bind('1', + proc{eval `cat #{[$demo_dir,'items.rb'].join(File::Separator)}`}) + d2.bind('1', + proc{eval `cat #{[$demo_dir,'plot.rb'].join(File::Separator)}`}) + d3.bind('1', + proc{eval `cat #{[$demo_dir,'ctext.rb'].join(File::Separator)}`}) + d4.bind('1', + proc{eval `cat #{[$demo_dir,'arrow.rb'].join(File::Separator)}`}) + d5.bind('1', + proc{eval `cat #{[$demo_dir,'ruler.rb'].join(File::Separator)}`}) + d6.bind('1', + proc{eval `cat #{[$demo_dir,'cscroll.rb'].join(File::Separator)}`}) + + TkTextMarkInsert.new(t, '0.0') + configure('state','disabled') +} diff --git a/ext/tk/sample/demos-en/bitmap.rb b/ext/tk/sample/demos-en/bitmap.rb new file mode 100644 index 0000000000..c81e4ac595 --- /dev/null +++ b/ext/tk/sample/demos-en/bitmap.rb @@ -0,0 +1,73 @@ +# bitmap.rb +# +# This demonstration script creates a toplevel window that displays +# all of Tk's built-in bitmaps.# +# bitmap widget demo (called by 'widget') +# + +# bitmapRow -- +# Create a row of bitmap items in a window. +# +# Arguments: +# w - The parent window that is to contain the row. +# args - The names of one or more bitmaps, which will be displayed +# in a new row across the bottom of w along with their +# names. + +def bitmapRow(w,*args) + TkFrame.new(w){|row| + pack('side'=>'top', 'fill'=>'both') + for bitmap in args + TkFrame.new(row){|base| + pack('side'=>'left', 'fill'=>'both', 'pady'=>'.25c', 'padx'=>'.25c') + TkLabel.new(base, 'text'=>bitmap, 'width'=>9).pack('side'=>'bottom') + TkLabel.new(base, 'bitmap'=>bitmap).pack('side'=>'bottom') + } + end + } +end + +# toplevel widget +if defined?($bitmap_demo) && $bitmap_demo + $bitmap_demo.destroy + $bitmap_demo = nil +end + +# demo toplevel widget +$bitmap_demo = TkToplevel.new {|w| + title("Bitmap Demonstration") + iconname("bitmap") + positionWindow(w) +} + +# label +TkLabel.new($bitmap_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left', + 'text'=>"This window displays all of Tk's built-in bitmaps, along with the names you can use for them in Tcl scripts."){ + pack('side'=>'top') +} + +# frame +$bitmap_buttons = TkFrame.new($bitmap_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $bitmap_demo + $bitmap_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'bitmap'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$bitmap_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame +TkFrame.new($bitmap_demo){|f| + bitmapRow(f,'error','gray25','gray50','hourglass') + bitmapRow(f,'info','question','questhead','warning') + pack('side'=>'top', 'expand'=>'yes', 'fill'=>'both') +} + diff --git a/ext/tk/sample/demos-en/browse1 b/ext/tk/sample/demos-en/browse1 new file mode 100644 index 0000000000..03e251035a --- /dev/null +++ b/ext/tk/sample/demos-en/browse1 @@ -0,0 +1,63 @@ +#!/usr/bin/env ruby + +# browse -- +# This script generates a directory browser, which lists the working +# directory and allow you to open files or subdirectories by +# double-clicking. + +require 'tk' + +# Create a scrollbar on the right side of the main window and a listbox +# on the left side. + +listbox = TkListbox.new(nil, 'relief'=>'sunken', + 'width'=>20, 'height'=>20, 'setgrid'=>'yes') {|l| + TkScrollbar.new(nil, 'command'=>proc{|*args| l.yview *args}) {|s| + pack('side'=>'right', 'fill'=>'y') + l.yscrollcommand(proc{|first,last| s.set(first,last)}) + } + + pack('side'=>'left', 'fill'=>'both', 'expand'=>'yes') +} + +root = TkRoot.new +root.minsize(1,1) + +# The procedure below is invoked to open a browser on a given file; if the +# file is a directory then another instance of this program is invoked; if +# the file is a regular file then the Mx editor is invoked to display +# the file. + +def browse (dir, file) + file = dir + File::Separator + file if dir != '.' + type = File.ftype(file) + if type == 'directory' + system($0 + ' ' + file + ' &') + else + if type == 'file' + if ENV['EDITOR'] + system(ENV['EDITOR'] + ' ' + file + ' &') + else + system('xedit ' + file + ' &') + end + else + STDOUT.print "\"#{file}\" isn't a directory or regular file" + end + end +end + +# Fill the listbox with a list of all the files in the directory (run +# the "ls" command to get that information). + +dir = ARGV[0] ? ARGV[0] : '.' +open("|ls -a #{dir}", 'r'){|fid| fid.readlines}.each{|fname| + listbox.insert('end', fname.chomp) +} + +# Set up bindings for the browser. + +Tk.bind_all('Control-c', proc{root.destroy}) +listbox.bind('Double-Button-1', + proc{TkSelection.get.each{|f| browse dir, f}}) + +Tk.mainloop diff --git a/ext/tk/sample/demos-en/browse2 b/ext/tk/sample/demos-en/browse2 new file mode 100644 index 0000000000..304a5f547e --- /dev/null +++ b/ext/tk/sample/demos-en/browse2 @@ -0,0 +1,82 @@ +#!/usr/bin/env ruby + +# browse -- +# This script generates a directory browser, which lists the working +# directory and allow you to open files or subdirectories by +# double-clicking. + +require 'tk' + +class Browse + BROWSE_WIN_COUNTER = TkVariable.new(0) + + def initialize(dir) + BROWSE_WIN_COUNTER.value = BROWSE_WIN_COUNTER.to_i + 1 + + # create base frame + base = TkToplevel.new { + minsize(1,1) + title('Browse : ' + dir) + } + + # Create a scrollbar on the right side of the main window and a listbox + # on the left side. + list = TkListbox.new(base, 'relief'=>'sunken', + 'width'=>20, 'height'=>20, 'setgrid'=>'yes') {|l| + TkScrollbar.new(base, 'command'=>proc{|*args| l.yview *args}) {|s| + pack('side'=>'right', 'fill'=>'y') + l.yscrollcommand(proc{|first,last| s.set(first,last)}) + } + + pack('side'=>'left', 'fill'=>'both', 'expand'=>'yes') + + # Fill the listbox with a list of all the files in the directory (run + # the "ls" command to get that information). + open("|ls -a #{dir}", 'r'){|fid| fid.readlines}.each{|fname| + l.insert('end', fname.chomp) + } + + } + + # Set up bindings for the browser. + base.bind('Control-c', + proc{ + base.destroy + Browse::BROWSE_WIN_COUNTER.value = \ + Browse::BROWSE_WIN_COUNTER.to_i - 1}) + list.bind('Double-Button-1', + proc{TkSelection.get.each{|f| self.browse dir, f}}) + end + + # The method below is invoked to open a browser on a given file; if the + # file is a directory then another instance of this program is invoked; if + # the file is a regular file then the Mx editor is invoked to display + # the file. + def browse (dir, file) + file = dir + File::Separator + file if dir != '.' + type = File.ftype(file) + if type == 'directory' + Browse.new(file) + else + if type == 'file' + if ENV['EDITOR'] + system(ENV['EDITOR'] + ' ' + file + ' &') + else + system('xedit ' + file + ' &') + end + else + STDOUT.print "\"#{file}\" isn't a directory or regular file" + end + end + end + +end + +Browse.new(ARGV[0] ? ARGV[0] : '.') + +TkRoot.new { + withdraw + Browse::BROWSE_WIN_COUNTER.trace('w', proc{exit if Browse::BROWSE_WIN_COUNTER.to_i == 0}) +} + +Tk.mainloop diff --git a/ext/tk/sample/demos-en/button.rb b/ext/tk/sample/demos-en/button.rb new file mode 100644 index 0000000000..6614d99c92 --- /dev/null +++ b/ext/tk/sample/demos-en/button.rb @@ -0,0 +1,84 @@ +# button.rb +# +# This demonstration script creates a toplevel window containing +# several button widgets. +# +# button widget demo (called by 'widget') +# + +# toplevel widget +if defined?($button_demo) && $button_demo + $button_demo.destroy + $button_demo = nil +end + +# demo toplevel widget +$button_demo = TkToplevel.new {|w| + title("Button Demonstration") + iconname("button") + positionWindow(w) +} + +# label +msg = TkLabel.new($button_demo) { + font $kanji_font + wraplength '4i' + justify 'left' + text "If you click on any of the four buttons below, the background of the button area will change to the color indicated in the button. You can press Tab to move among the buttons, then press Space to invoke the current button." +} +msg.pack('side'=>'top') + +# frame +$button_buttons = TkFrame.new($button_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $button_demo + $button_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'See Code' + command proc{showCode 'button'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# button +TkButton.new($button_demo){ + text "Peach Puff" + width 10 + command proc{ + $button_demo.configure('bg','PeachPuff1') + $button_buttons.configure('bg','PeachPuff1') + } +}.pack('side'=>'top', 'expand'=>'yes', 'pady'=>2) + +TkButton.new($button_demo){ + text "Light Blue" + width 10 + command proc{ + $button_demo.configure('bg','LightBlue1') + $button_buttons.configure('bg','LightBlue1') + } +}.pack('side'=>'top', 'expand'=>'yes', 'pady'=>2) + +TkButton.new($button_demo){ + text "Sea Green" + width 10 + command proc{ + $button_demo.configure('bg','SeaGreen2') + $button_buttons.configure('bg','SeaGreen2') + } +}.pack('side'=>'top', 'expand'=>'yes', 'pady'=>2) + +TkButton.new($button_demo){ + text "Yellow" + width 10 + command proc{ + $button_demo.configure('bg','Yellow1') + $button_buttons.configure('bg','Yellow1') + } +}.pack('side'=>'top', 'expand'=>'yes', 'pady'=>2) diff --git a/ext/tk/sample/demos-en/check.rb b/ext/tk/sample/demos-en/check.rb new file mode 100644 index 0000000000..b5def6a89b --- /dev/null +++ b/ext/tk/sample/demos-en/check.rb @@ -0,0 +1,70 @@ +# check.rb +# +# This demonstration script creates a toplevel window containing +# several checkbuttons. +# +# checkbutton widget demo (called by 'widget') +# + +# toplevel widget +if defined?($check_demo) && $check_demo + $check_demo.destroy + $check_demo = nil +end + +# demo toplevel widget +$check_demo = TkToplevel.new {|w| + title("Checkbutton Demonstration") + iconname("check") + positionWindow(w) +} + +# label +msg = TkLabel.new($check_demo) { + font $font + wraplength '4i' + justify 'left' + text "Three checkbuttons are displayed below. If you click on a button, it will toggle the button's selection state and set a Tcl variable to a value indicating the state of the checkbutton. Click the \"See Variables\" button to see the current values of the variables." +} +msg.pack('side'=>'top') + +# +wipers = TkVariable.new(0) +brakes = TkVariable.new(0) +sober = TkVariable.new(0) + +# frame +TkFrame.new($check_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $check_demo + $check_demo = nil + $showVarsWin[tmppath.path] = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'check'} + }.pack('side'=>'left', 'expand'=>'yes') + + + TkButton.new(frame) { + text 'See Variables' + command proc{ + showVars($check_demo, + ['wipers', wipers], ['brakes', brakes], ['sober', sober]) + } + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + + +# checkbutton +[ TkCheckButton.new($check_demo, 'text'=>'Wipers OK', 'variable'=>wipers), + TkCheckButton.new($check_demo, 'text'=>'Brakes OK', 'variable'=>brakes), + TkCheckButton.new($check_demo, 'text'=>'Driver Sober', 'variable'=>sober) +].each{|w| w.relief('flat'); w.pack('side'=>'top', 'pady'=>2, 'anchor'=>'w')} + diff --git a/ext/tk/sample/demos-en/clrpick.rb b/ext/tk/sample/demos-en/clrpick.rb new file mode 100644 index 0000000000..72c52a4394 --- /dev/null +++ b/ext/tk/sample/demos-en/clrpick.rb @@ -0,0 +1,77 @@ +# clrpick.rb +# +# This demonstration script prompts the user to select a color. +# +# widget demo prompts the user to select a color (called by 'widget') +# + +# toplevel widget +if defined?($clrpick_demo) && $clrpick_demo + $clrpick_demo.destroy + $clrpick_demo = nil +end + +# demo toplevel widget +$clrpick_demo = TkToplevel.new {|w| + title("Color Selection Dialogs") + iconname("colors") + positionWindow(w) +} + +# label +TkLabel.new($clrpick_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left', + 'text'=>"Press the buttons below to choose the foreground and background colors for the widgets in this window.").pack('side'=>'top') + +# frame +TkFrame.new($clrpick_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $clrpick_demo + $clrpick_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'clrpick'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# button +TkButton.new($clrpick_demo, 'text'=>'Set background color ...') {|b| + command(proc{setColor $clrpick_demo, b, 'background', + ['background', 'highlightbackground']}) + pack('side'=>'top', 'anchor'=>'c', 'pady'=>'2m') +} + +TkButton.new($clrpick_demo, 'text'=>'Set foreground color ...') {|b| + command(proc{setColor $clrpick_demo, b, 'foreground', ['foreground']}) + pack('side'=>'top', 'anchor'=>'c', 'pady'=>'2m') +} + +def setColor(w,button,name,options) + w.grab + initialColor = button[name] + color = Tk.chooseColor('title'=>"Choose a #{name} color", 'parent'=>w, + 'initialcolor'=>initialColor) + if color != "" + setColor_helper(w,options,color) + end + + w.grab('release') +end + +def setColor_helper(w, options, color) + options.each{|opt| + begin + w[opt] = color + rescue + end + } + TkWinfo.children(w).each{|child| + setColor_helper child, options, color + } +end + diff --git a/ext/tk/sample/demos-en/colors.rb b/ext/tk/sample/demos-en/colors.rb new file mode 100644 index 0000000000..66fb0afa36 --- /dev/null +++ b/ext/tk/sample/demos-en/colors.rb @@ -0,0 +1,148 @@ +# colors.rb +# +# This demonstration script creates a listbox widget that displays +# many of the colors from the X color database. You can click on +# a color to change the application's palette. +# +# listbox widget demo 'colors' (called by 'widget') +# + +# toplevel widget +if defined?($colors_demo) && $colors_demo + $colors_demo.destroy + $colors_demo = nil +end + +# demo toplevel widget +$colors_demo = TkToplevel.new {|w| + title("Listbox Demonstration (colors)") + iconname("colors") + positionWindow(w) +} + +# label +msg = TkLabel.new($colors_demo) { + font $font + wraplength '4i' + justify 'left' + text "A listbox containing several color names is displayed below, along with a scrollbar. You can scan the list either using the scrollbar or by dragging in the listbox window with button 2 pressed. If you double-click button 1 on a color, then the application's color palette will be set to match that color" +} +msg.pack('side'=>'top') + +# frame +TkFrame.new($colors_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $colors_demo + $colors_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'colors'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame +colors_lbox = nil +TkFrame.new($colors_demo, 'borderwidth'=>10) {|w| + s = TkScrollbar.new(w) + colors_lbox = TkListbox.new(w) { + setgrid 1 + width 10 + height 12 + yscrollcommand proc{|first,last| s.set first,last} + } + s.command(proc{|*args| colors_lbox.yview(*args)}) + s.pack('side'=>'right', 'fill'=>'y') + colors_lbox.pack('side'=>'left', 'expand'=>1, 'fill'=>'both') +}.pack('side'=>'top', 'expand'=>'yes', 'fill'=>'y') + +colors_lbox.bind('Double-1', proc{TkPalette.setPalette TkSelection.get}) + +ins_data = [ + 'gray60','gray70','gray80','gray85','gray90','gray95', + 'snow1','snow2','snow3','snow4','seashell1','seashell2', + 'seashell3','seashell4','AntiqueWhite1','AntiqueWhite2', + 'AntiqueWhite3','AntiqueWhite4','bisque1','bisque2', + 'bisque3','bisque4','PeachPuff1','PeachPuff2', + 'PeachPuff3','PeachPuff4','NavajoWhite1','NavajoWhite2', + 'NavajoWhite3','NavajoWhite4','LemonChiffon1', + 'LemonChiffon2','LemonChiffon3','LemonChiffon4', + 'cornsilk1','cornsilk2','cornsilk3','cornsilk4', + 'ivory1','ivory2','ivory3','ivory4','honeydew1', + 'honeydew2','honeydew3','honeydew4','LavenderBlush1', + 'LavenderBlush2','LavenderBlush3','LavenderBlush4', + 'MistyRose1','MistyRose2','MistyRose3','MistyRose4', + 'azure1','azure2','azure3','azure4','SlateBlue1', + 'SlateBlue2','SlateBlue3','SlateBlue4','RoyalBlue1', + 'RoyalBlue2','RoyalBlue3','RoyalBlue4','blue1','blue2', + 'blue3','blue4','DodgerBlue1','DodgerBlue2', + 'DodgerBlue3','DodgerBlue4','SteelBlue1','SteelBlue2', + 'SteelBlue3','SteelBlue4','DeepSkyBlue1','DeepSkyBlue2', + 'DeepSkyBlue3','DeepSkyBlue4','SkyBlue1','SkyBlue2', + 'SkyBlue3','SkyBlue4','LightSkyBlue1','LightSkyBlue2', + 'LightSkyBlue3','LightSkyBlue4','SlateGray1', + 'SlateGray2','SlateGray3','SlateGray4', + 'LightSteelBlue1','LightSteelBlue2','LightSteelBlue3', + 'LightSteelBlue4','LightBlue1','LightBlue2', + 'LightBlue3','LightBlue4','LightCyan1','LightCyan2', + 'LightCyan3','LightCyan4','PaleTurquoise1', + 'PaleTurquoise2','PaleTurquoise3','PaleTurquoise4', + 'CadetBlue1','CadetBlue2','CadetBlue3','CadetBlue4', + 'turquoise1','turquoise2','turquoise3','turquoise4', + 'cyan1','cyan2','cyan3','cyan4','DarkSlateGray1', + 'DarkSlateGray2','DarkSlateGray3','DarkSlateGray4', + 'aquamarine1','aquamarine2','aquamarine3','aquamarine4', + 'DarkSeaGreen1','DarkSeaGreen2','DarkSeaGreen3', + 'DarkSeaGreen4','SeaGreen1','SeaGreen2','SeaGreen3', + 'SeaGreen4','PaleGreen1','PaleGreen2','PaleGreen3', + 'PaleGreen4','SpringGreen1','SpringGreen2', + 'SpringGreen3','SpringGreen4','green1','green2', + 'green3','green4','chartreuse1','chartreuse2', + 'chartreuse3','chartreuse4','OliveDrab1','OliveDrab2', + 'OliveDrab3','OliveDrab4','DarkOliveGreen1', + 'DarkOliveGreen2','DarkOliveGreen3','DarkOliveGreen4', + 'khaki1','khaki2','khaki3','khaki4','LightGoldenrod1', + 'LightGoldenrod2','LightGoldenrod3','LightGoldenrod4', + 'LightYellow1','LightYellow2','LightYellow3', + 'LightYellow4','yellow1','yellow2','yellow3','yellow4', + 'gold1','gold2','gold3','gold4','goldenrod1', + 'goldenrod2','goldenrod3','goldenrod4','DarkGoldenrod1', + 'DarkGoldenrod2','DarkGoldenrod3','DarkGoldenrod4', + 'RosyBrown1','RosyBrown2','RosyBrown3','RosyBrown4', + 'IndianRed1','IndianRed2','IndianRed3','IndianRed4', + 'sienna1','sienna2','sienna3','sienna4','burlywood1', + 'burlywood2','burlywood3','burlywood4','wheat1', + 'wheat2','wheat3','wheat4','tan1','tan2','tan3','tan4', + 'chocolate1','chocolate2','chocolate3','chocolate4', + 'firebrick1','firebrick2','firebrick3','firebrick4', + 'brown1','brown2','brown3','brown4','salmon1','salmon2', + 'salmon3','salmon4','LightSalmon1','LightSalmon2', + 'LightSalmon3','LightSalmon4','orange1','orange2', + 'orange3','orange4','DarkOrange1','DarkOrange2', + 'DarkOrange3','DarkOrange4','coral1','coral2','coral3', + 'coral4','tomato1','tomato2','tomato3','tomato4', + 'OrangeRed1','OrangeRed2','OrangeRed3','OrangeRed4', + 'red1','red2','red3','red4','DeepPink1','DeepPink2', + 'DeepPink3','DeepPink4','HotPink1','HotPink2', + 'HotPink3','HotPink4','pink1','pink2','pink3','pink4', + 'LightPink1','LightPink2','LightPink3','LightPink4', + 'PaleVioletRed1','PaleVioletRed2','PaleVioletRed3', + 'PaleVioletRed4','maroon1','maroon2','maroon3', + 'maroon4','VioletRed1','VioletRed2','VioletRed3', + 'VioletRed4','magenta1','magenta2','magenta3', + 'magenta4','orchid1','orchid2','orchid3','orchid4', + 'plum1','plum2','plum3','plum4','MediumOrchid1', + 'MediumOrchid2','MediumOrchid3','MediumOrchid4', + 'DarkOrchid1','DarkOrchid2','DarkOrchid3', + 'DarkOrchid4','purple1','purple2','purple3','purple4', + 'MediumPurple1','MediumPurple2','MediumPurple3', + 'MediumPurple4','thistle1','thistle2','thistle3', 'thistle4' +] + +colors_lbox.insert(0, *ins_data) diff --git a/ext/tk/sample/demos-en/cscroll.rb b/ext/tk/sample/demos-en/cscroll.rb new file mode 100644 index 0000000000..2f2be60da2 --- /dev/null +++ b/ext/tk/sample/demos-en/cscroll.rb @@ -0,0 +1,134 @@ +# cscroll.rb +# +# This demonstration script creates a simple canvas that can be +# scrolled in two dimensions. +# +# simple scrollable canvas widget demo (called by 'widget') +# + +# toplevel widget +if defined?($cscroll_demo) && $cscroll_demo + $cscroll_demo.destroy + $cscroll_demo = nil +end + +# demo toplevel widget +$cscroll_demo = TkToplevel.new {|w| + title("Scrollable Canvas Demonstration") + iconname("cscroll") + positionWindow(w) +} + +# label +TkLabel.new($cscroll_demo, 'font'=>$font, 'wraplength'=>'4i', + 'justify'=>'left', 'text'=>"This window displays a canvas widget that can be scrolled either using the scrollbars or by dragging with button 2 in the canvas. If you click button 1 on one of the rectangles, its indices will be printed on stdout."){ + pack('side'=>'top') +} + +# frame +$cscroll_buttons = TkFrame.new($cscroll_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $cscroll_demo + $cscroll_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'cscroll'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$cscroll_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame +unless $tk_version =~ /^4\.[01]/ + $cscroll_grid = TkFrame.new($cscroll_demo) { + pack('expand'=>'yes', 'fill'=>'both', 'padx'=>1, 'pady'=>1) + } + TkGrid.rowconfigure($cscroll_grid, 0, 'weight'=>1, 'minsize'=>0) + TkGrid.columnconfigure($cscroll_grid, 0, 'weight'=>1, 'minsize'=>0) +end + +# canvas 設定 +$cscroll_canvas = TkCanvas.new($cscroll_demo, + 'relief'=>'sunken', 'borderwidth'=>2, + 'scrollregion'=>['-11c', '-11c', '50c', '20c'] + ) {|c| + if $tk_version =~ /^4\.[01]/ + pack('expand'=>'yes', 'fill'=>'both') + else + grid('in'=>$cscroll_grid, 'padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + end + + TkScrollbar.new($cscroll_demo, 'command'=>proc{|*args| c.yview(*args)}) {|vs| + c.yscrollcommand(proc{|first,last| vs.set first,last}) + if $tk_version =~ /^4\.[01]/ + pack('side'=>'right', 'fill'=>'y') + else + grid('in'=>$cscroll_grid, 'padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>1, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + end + } + + TkScrollbar.new($cscroll_demo, 'orient'=>'horiz', + 'command'=>proc{|*args| c.xview(*args)}) {|hs| + c.xscrollcommand(proc{|first,last| hs.set first,last}) + if $tk_version =~ /^4\.[01]/ + pack('side'=>'bottom', 'fill'=>'x') + else + grid('in'=>$cscroll_grid, 'padx'=>1, 'pady'=>1, 'row'=>1, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + end + } +} + +bg = $cscroll_canvas.configinfo('bg')[4] +(0..19).each{|i| + x = -10+3*i + y = -10 + (0..9).each{|j| + TkcRectangle.new($cscroll_canvas, "#{x}c", "#{y}c", "#{x+2}c", "#{y+2}c", + 'outline'=>'black', 'fill'=>bg, 'tags'=>'rect') + TkcText.new($cscroll_canvas, "#{x+1}c", "#{y+1}c", + 'text'=>"#{i},#{j}", 'anchor'=>'center', 'tags'=>'text') + y += 3 + } +} + +$cscroll_canvas.itembind('all', 'Any-Enter', proc{scrollEnter $cscroll_canvas}) +$cscroll_canvas.itembind('all', 'Any-Leave', proc{scrollLeave $cscroll_canvas}) +$cscroll_canvas.itembind('all', '1', proc{scrollButton $cscroll_canvas}) +$cscroll_canvas.itembind('all', 'Any-Enter', proc{scrollEnter $cscroll_canvas}) +$cscroll_canvas.bind('2', proc{|x,y| $cscroll_canvas.scan_mark(x,y)}, '%x %y') +$cscroll_canvas.bind('B2-Motion', + proc{|x,y| $cscroll_canvas.scan_dragto(x,y)}, '%x %y') + +def scrollEnter(c) + id = c.find_withtag('current')[0].id + id -= 1 if c.gettags('current').include?('text') + $oldFill = c.itemconfiginfo(id, 'fill')[4] + if TkWinfo.depth(c) > 1 + c.itemconfigure(id, 'fill'=>'SeaGreen1') + else + c.itemconfigure(id, 'fill'=>'black') + c.itemconfigure(id+1, 'fill'=>'white') + end +end + +def scrollLeave(c) + id = c.find_withtag('current')[0].id + id -= 1 if c.gettags('current').include?('text') + c.itemconfigure(id, 'fill'=>$oldFill) + c.itemconfigure(id+1, 'fill'=>'black') +end + +def scrollButton(c) + id = c.find_withtag('current')[0].id + id += 1 unless c.gettags('current').include?('text') + print "You buttoned at #{c.itemconfiginfo(id,'text')[4]}\n" +end + diff --git a/ext/tk/sample/demos-en/ctext.rb b/ext/tk/sample/demos-en/ctext.rb new file mode 100644 index 0000000000..13f8de7218 --- /dev/null +++ b/ext/tk/sample/demos-en/ctext.rb @@ -0,0 +1,186 @@ +# ctext.rb +# +# This demonstration script creates a canvas widget with a text +# item that can be edited and reconfigured in various ways. +# +# Canvas Text widget demo (called by 'widget') +# + +# toplevel widget +if defined?($ctext_demo) && $ctext_demo + $ctext_demo.destroy + $ctext_demo = nil +end + +# demo toplevel widget +$ctext_demo = TkToplevel.new {|w| + title("Canvas Text Demonstration") + iconname("Text") + positionWindow(w) +} + +# label +TkLabel.new($ctext_demo, 'font'=>$font, 'wraplength'=>'5i', 'justify'=>'left', + 'text'=>"This window displays a string of text to demonstrate the text facilities of canvas widgets. You can click in the boxes to adjust the position of the text relative to its positioning point or change its justification. The text also supports the following simple bindings for editing: + 1. You can point, click, and type. + 2. You can also select with button 1. + 3. You can copy the selection to the mouse position with button 2. + 4. Backspace and Control+h delete the selection if there is one; + otherwise they delete the character just before the insertion cursor. + 5. Delete deletes the selection if there is one; otherwise it deletes + the character just after the insertion cursor."){ + pack('side'=>'top') +} + +# frame +$ctext_buttons = TkFrame.new($ctext_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $ctext_demo + $ctext_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'ctext'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$ctext_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# canvas +$ctext_canvas = TkCanvas.new($ctext_demo, 'relief'=>'flat', + 'borderwidth'=>0, 'width'=>500, 'height'=>350) +$ctext_canvas.pack('side'=>'top', 'expand'=>'yes', 'fill'=>'both') + +# font +textFont = '-*-Helvetica-Medium-R-Normal--*-240-*-*-*-*-*-*' + +# canvas +TkcRectangle.new($ctext_canvas, 245, 195, 255, 205, + 'outline'=>'black', 'fill'=>'red') + +$ctag_text = TkcTag.new($ctext_canvas) +$ctag_text.withtag(TkcText.new($ctext_canvas, 250, 200, + 'text'=>"This is just a string of text to demonstrate the text facilities of canvas widgets. Bindings have been been defined to support editing (see above).", + 'width'=>440, 'anchor'=>'n', + 'font'=>'-*-Helvetica-Medium-R-Normal--*-240-*-*-*-*-*-*', + 'kanjifont'=>'-*--24-*-jisx0208.1983-0', + 'justify'=>'left') ) + +$ctag_text.bind('1', proc{|x,y| textB1Press $ctext_canvas,x,y}, "%x %y") +$ctag_text.bind('B1-Motion', proc{|x,y| textB1Move $ctext_canvas,x,y}, "%x %y") +$ctag_text.bind('Shift-1', + proc{|x,y| $ctext_canvas.seleect_adjust 'current', "@#{x},#{y}"}, + "%x %y") +$ctag_text.bind('Shift-B1-Motion', + proc{|x,y| textB1Move $ctext_canvas,x,y}, "%x %y") +$ctag_text.bind('KeyPress', proc{|a| textInsert $ctext_canvas,a}, "%A") +$ctag_text.bind('Return', proc{textInsert $ctext_canvas,"\n"}) +$ctag_text.bind('Control-h', proc{textBs $ctext_canvas}) +$ctag_text.bind('BackSpace', proc{textBs $ctext_canvas}) +$ctag_text.bind('Delete', proc{textDel $ctext_canvas}) +$ctag_text.bind('2', proc{|x,y| textPaste $ctext_canvas, "@#{x},#{y}"}, + "%x %y") + +# Next, create some items that allow the text's anchor position +# to be edited. + +def mkTextConfig(w,x,y,option,value,color) + item = TkcRectangle.new(w, x, y, x+30, y+30, + 'outline'=>'black', 'fill'=>color, 'width'=>1) + item.bind('1', proc{$ctag_text.configure option, value}) + w.addtag_withtag('config', item) +end + +x = 50 +y = 50 +color = 'LightSkyBlue1' +mkTextConfig $ctext_canvas, x, y, 'anchor', 'se', color +mkTextConfig $ctext_canvas, x+30, y, 'anchor', 's', color +mkTextConfig $ctext_canvas, x+60, y, 'anchor', 'sw', color +mkTextConfig $ctext_canvas, x, y+30, 'anchor', 'e', color +mkTextConfig $ctext_canvas, x+30, y+30, 'anchor', 'center', color +mkTextConfig $ctext_canvas, x+60, y+30, 'anchor', 'w', color +mkTextConfig $ctext_canvas, x, y+60, 'anchor', 'ne', color +mkTextConfig $ctext_canvas, x+30, y+60, 'anchor', 'n', color +mkTextConfig $ctext_canvas, x+60, y+60, 'anchor', 'nw', color +item = TkcRectangle.new($ctext_canvas, x+40, y+40, x+50, y+50, + 'outline'=>'black', 'fill'=>'red') +item.bind('1', proc{$ctag_text.configure 'anchor', 'center'}) +TkcText.new($ctext_canvas, x+45, y-5, 'text'=>'Text Position', 'anchor'=>'s', + 'font'=>'-*-times-medium-r-normal--*-240-*-*-*-*-*-*', + 'fill'=>'brown') + +# Lastly, create some items that allow the text's justification to be +# changed. + +x = 350 +y = 50 +color = 'SeaGreen2' +mkTextConfig $ctext_canvas, x, y, 'justify', 'left', color +mkTextConfig $ctext_canvas, x+30, y, 'justify', 'center', color +mkTextConfig $ctext_canvas, x+60, y, 'justify', 'right', color +TkcText.new($ctext_canvas, x+45, y-5, 'text'=>'Justification', 'anchor'=>'s', + 'font'=>'-*-times-medium-r-normal--*-240-*-*-*-*-*-*', + 'fill'=>'brown') + +$ctext_canvas.itembind('config', 'Enter', proc{textEnter $ctext_canvas}) +$ctext_canvas.itembind('config', 'Leave', + proc{$ctext_canvas\ + .itemconfigure('current', + 'fill'=>$textConfigFill)}) + +$textConfigFill = '' + +def textEnter(w) + $textConfigFill = (w.itemconfiginfo 'current', 'fill')[4] + w.itemconfigure 'current', 'fill', 'black' +end + +def textInsert(w, string) + return if string == "" + begin + $ctag_text.dchars 'sel.first', 'sel.last' + rescue + end + $ctag_text.insert 'insert', string +end + +def textPaste(w, pos) + begin + $ctag_text.insert pos, TkSelection.get + rescue + end +end + +def textB1Press(w,x,y) + w.icursor 'current', "@#{x},#{y}" + w.itemfocus 'current' + w.focus + w.select_from 'current', "@#{x},#{y}" +end + +def textB1Move(w,x,y) + w.select_to 'current', "@#{x},#{y}" +end + +def textBs(w) + begin + $ctag_text.dchars 'sel.first', 'sel.last' + rescue + char = $ctag_text.index('insert').to_i - 1 + $ctag_text.dchars(char) if char >= 0 + end +end + +def textDel(w) + begin + $ctag_text.dchars 'sel.first', 'sel.last' + rescue + $ctag_text.dchars 'insert' + end +end + diff --git a/ext/tk/sample/demos-en/dialog1.rb b/ext/tk/sample/demos-en/dialog1.rb new file mode 100644 index 0000000000..d2b34e6b46 --- /dev/null +++ b/ext/tk/sample/demos-en/dialog1.rb @@ -0,0 +1,35 @@ +# +# a dialog box with a local grab (called by 'widget') +# +class TkDialog_Demo1 < TkDialog + def title + "Dialog with local grab" + end + + def message + 'This is a modal dialog box. It uses Tk\'s "grab" command to create a "local grab" on the dialog box. The grab prevents any pointer-related events from getting to any other windows in the application until you have answered the dialog by invoking one of the buttons below. However, you can still interact with other applications.' + end + + def bitmap + 'info' + end + + def default_button + 0 + end + + def buttons + ["Dismiss", "", "Show Code"] + ["OK", "Cancel", "Show Code"] + end +end + +ret = TkDialog_Demo1.new('message_config'=>{'wraplength'=>'4i'}).value +case ret +when 0 + print "You pressed OK\n" +when 1 + print "You pressed Cancel\n" +when 2 + showCode 'dialog1' +end diff --git a/ext/tk/sample/demos-en/dialog2.rb b/ext/tk/sample/demos-en/dialog2.rb new file mode 100644 index 0000000000..c441dda62f --- /dev/null +++ b/ext/tk/sample/demos-en/dialog2.rb @@ -0,0 +1,38 @@ +# +# a dialog box with a global grab (called by 'widget') +# +class TkDialog_Demo2 < TkDialog + def title + "Dialog with global grab" + end + + def message + "This dialog box uses a global grab, so it prevents you from interacting with anything on your display until you invoke one of the buttons below. Global grabs are almost always a bad idea; don't use them unless you're truly desperate." + end + + def bitmap + 'info' + end + + def default_button + 0 + end + + def buttons + ["OK", "Cancel", "Show Code"] + end +end + +ret = TkDialog_Demo2.new('message_config'=>{'wraplength'=>'4i'}, + 'prev_command'=>proc{|dialog| + Tk.after 100, proc{dialog.grab('global')} + }).value +case ret +when 0 + print "\You pressed OK\n" +when 1 + print "You pressed Cancel\n" +when 2 + showCode 'dialog2' +end + diff --git a/ext/tk/sample/demos-en/doc.org/README b/ext/tk/sample/demos-en/doc.org/README new file mode 100644 index 0000000000..90677d3316 --- /dev/null +++ b/ext/tk/sample/demos-en/doc.org/README @@ -0,0 +1,7 @@ +This directory contains a collection of demonstration programs that +are translated into Japanese. You need to use a Japanized "wish" to +see these Japanese-translated demonstration programs. You also need +to put this directory ("demos.jp") at the next to "demos" since some +of the programs refer to the image files at "demos". + +Please refer to the README file at "demos" for more detail. diff --git a/ext/tk/sample/demos-en/doc.org/README.JP b/ext/tk/sample/demos-en/doc.org/README.JP new file mode 100644 index 0000000000..42b4929378 --- /dev/null +++ b/ext/tk/sample/demos-en/doc.org/README.JP @@ -0,0 +1,14 @@ +This directory contains "widget" demo for the Japanized Tcl7.6/Tk4.2. +Most of the messages in the original are translated to Japanese. +But other tools in this directory are not translated. + +Following 2 kanji fonts are defined at the beginning of the file "widget." + + -*--24-*-jisx0208.1983-0 + -*--16-*-jisx0208.1983-0 + +These fonts are all part of the core distribution of X11R5, so +if you are running X11R5, you don't have to modify the file. + +But if you don't have these fonts, replace them with appropriate ones. +"-*--14-*-jisx0208.1983-0" will be a good choice. diff --git a/ext/tk/sample/demos-en/doc.org/README.tk80 b/ext/tk/sample/demos-en/doc.org/README.tk80 new file mode 100644 index 0000000000..c71f977d74 --- /dev/null +++ b/ext/tk/sample/demos-en/doc.org/README.tk80 @@ -0,0 +1,46 @@ +This directory contains a collection of programs to demonstrate +the features of the Tk toolkit. The programs are all scripts for +"wish", a windowing shell. If wish has been installed in /usr/local +then you can invoke any of the programs in this directory just +by typing its file name to your command shell. Otherwise invoke +wish with the file as its first argument, e.g., "wish hello". +The rest of this file contains a brief description of each program. +Files with names ending in ".tcl" are procedure packages used by one +or more of the demo programs; they can't be used as programs by +themselves so they aren't described below. + +hello - Creates a single button; if you click on it, a message + is typed and the application terminates. + +widget - Contains a collection of demonstrations of the widgets + currently available in the Tk library. Most of the .tcl + files are scripts for individual demos available through + the "widget" program. + +ixset - A simple Tk-based wrapper for the "xset" program, which + allows you to interactively query and set various X options + such as mouse acceleration and bell volume. Thanks to + Pierre David for contributing this example. + +rolodex - A mock-up of a simple rolodex application. It has much of + the user interface for such an application but no back-end + database. This program was written in response to Tom + LaStrange's toolkit benchmark challenge. + +tcolor - A color editor. Allows you to edit colors in several + different ways, and will also perform automatic updates + using "send". + +rmt - Allows you to "hook-up" remotely to any Tk application + on the display. Select an application with the menu, + then just type commands: they'll go to that application. + +timer - Displays a seconds timer with start and stop buttons. + Control-c and control-q cause it to exit. + +browse - A simple directory browser. Invoke it with and argument + giving the name of the directory you'd like to browse. + Double-click on files or subdirectories to browse them. + Control-c and control-q cause the program to exit. + +sccs id = SCCS: @(#) README 1.3 96/02/16 10:49:14 diff --git a/ext/tk/sample/demos-en/doc.org/license.terms b/ext/tk/sample/demos-en/doc.org/license.terms new file mode 100644 index 0000000000..03ca6fcb31 --- /dev/null +++ b/ext/tk/sample/demos-en/doc.org/license.terms @@ -0,0 +1,39 @@ +This software is copyrighted by the Regents of the University of +California, Sun Microsystems, Inc., and other parties. The following +terms apply to all files associated with the software unless explicitly +disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the +U.S. government, the Government shall have only "Restricted Rights" +in the software and related documentation as defined in the Federal +Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you +are acquiring the software on behalf of the Department of Defense, the +software shall be classified as "Commercial Computer Software" and the +Government shall have only "Restricted Rights" as defined in Clause +252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the +authors grant the U.S. Government and others acting in its behalf +permission to use and distribute the software in accordance with the +terms specified in this license. diff --git a/ext/tk/sample/demos-en/doc.org/license.terms.tk80 b/ext/tk/sample/demos-en/doc.org/license.terms.tk80 new file mode 100644 index 0000000000..03ca6fcb31 --- /dev/null +++ b/ext/tk/sample/demos-en/doc.org/license.terms.tk80 @@ -0,0 +1,39 @@ +This software is copyrighted by the Regents of the University of +California, Sun Microsystems, Inc., and other parties. The following +terms apply to all files associated with the software unless explicitly +disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the +U.S. government, the Government shall have only "Restricted Rights" +in the software and related documentation as defined in the Federal +Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you +are acquiring the software on behalf of the Department of Defense, the +software shall be classified as "Commercial Computer Software" and the +Government shall have only "Restricted Rights" as defined in Clause +252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the +authors grant the U.S. Government and others acting in its behalf +permission to use and distribute the software in accordance with the +terms specified in this license. diff --git a/ext/tk/sample/demos-en/entry1.rb b/ext/tk/sample/demos-en/entry1.rb new file mode 100644 index 0000000000..29bc693395 --- /dev/null +++ b/ext/tk/sample/demos-en/entry1.rb @@ -0,0 +1,56 @@ +# +# entry (no scrollbars) widget demo (called by 'widget') +# + +# toplevel widget +if defined?($entry1_demo) && $entry1_demo + $entry1_demo.destroy + $entry1_demo = nil +end + +# demo toplevel widget +$entry1_demo = TkToplevel.new {|w| + title("Entry Demonstration (no scrollbars)") + iconname("entry1") + positionWindow(w) +} + +# label +msg = TkLabel.new($entry1_demo) { + font $font + wraplength '5i' + justify 'left' + text "Three different entries are displayed below. You can add characters by pointing, clicking and typing. The normal Motif editing characters are supported, along with many Emacs bindings. For example, Backspace and Control-h delete the character to the left of the insertion cursor and Delete and Control-d delete the chararacter to the right of the insertion cursor. For entries that are too large to fit in the window all at once, you can scan through the entries by dragging with mouse button2 pressed." +} +msg.pack('side'=>'top') + +# frame +TkFrame.new($entry1_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $entry1_demo + $entry1_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'entry1'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# +e1 = TkEntry.new($entry1_demo, 'relief'=>'sunken') +e2 = TkEntry.new($entry1_demo, 'relief'=>'sunken') +e3 = TkEntry.new($entry1_demo, 'relief'=>'sunken') +[e1,e2,e3].each{|w| w.pack('side'=>'top', 'padx'=>10, 'pady'=>5, 'fill'=>'x')} + +# +e1.insert(0, 'Initial value') +e2.insert('end', "This entry contains a long value, much too long ") +e2.insert('end', "to fit in the window at one time, so long in fact ") +e2.insert('end', "that you'll have to scan or scroll to see the end.") +e2.insert('end', "") + diff --git a/ext/tk/sample/demos-en/entry2.rb b/ext/tk/sample/demos-en/entry2.rb new file mode 100644 index 0000000000..d4e58d7dd5 --- /dev/null +++ b/ext/tk/sample/demos-en/entry2.rb @@ -0,0 +1,91 @@ +# entry2.rb +# +# This demonstration script is the same as the entry1.tcl script +# except that it creates scrollbars for the entries. +# +# entry (with scrollbars) widget demo (called by 'widget') +# + +# toplevel widget +if defined?($entry2_demo) && $entry2_demo + $entry2_demo.destroy + $entry2_demo = nil +end + +# demo toplevel widget +$entry2_demo = TkToplevel.new {|w| + title("Entry Demonstration (with scrollbars)") + iconname("entry2") + positionWindow(w) +} + +# label +msg = TkLabel.new($entry2_demo) { + font $font + wraplength '5i' + justify 'left' + text "Three different entries are displayed below, with a scrollbar for each entry. You can add characters by pointing, clicking and typing. The normal Motif editing characters are supported, along with many Emacs bindings. For example, Backspace and Control-h delete the character to the left of the insertion cursor and Delete and Control-d delete the chararacter to the right of the insertion cursor. For entries that are too large to fit in the window all at once, you can scan through the entries with the scrollbars, or by dragging with mouse button2 pressed." +} +msg.pack('side'=>'top') + +# frame +TkFrame.new($entry2_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $entry2_demo + $entry2_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'entry2'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame +TkFrame.new($entry2_demo, 'borderwidth'=>10) {|w| + # entry 1 + s1 = TkScrollbar.new(w, 'relief'=>'sunken', 'orient'=>'horiz') + e1 = TkEntry.new(w, 'relief'=>'sunken') { + xscrollcommand proc{|first,last| s1.set first,last} + } + s1.command(proc{|*args| e1.xview(*args)}) + e1.pack('side'=>'top', 'fill'=>'x') + s1.pack('side'=>'top', 'fill'=>'x') + + # spacer + TkFrame.new(w, 'width'=>20, 'height'=>10).pack('side'=>'top', 'fill'=>'x') + + # entry 2 + s2 = TkScrollbar.new(w, 'relief'=>'sunken', 'orient'=>'horiz') + e2 = TkEntry.new(w, 'relief'=>'sunken') { + xscrollcommand proc{|first,last| s2.set first,last} + } + s2.command(proc{|*args| e2.xview(*args)}) + e2.pack('side'=>'top', 'fill'=>'x') + s2.pack('side'=>'top', 'fill'=>'x') + + # spacer + TkFrame.new(w, 'width'=>20, 'height'=>10).pack('side'=>'top', 'fill'=>'x') + + # entry 3 + s3 = TkScrollbar.new(w, 'relief'=>'sunken', 'orient'=>'horiz') + e3 = TkEntry.new(w, 'relief'=>'sunken') { + xscrollcommand proc{|first,last| s3.set first,last} + } + s3.command(proc{|*args| e3.xview(*args)}) + e3.pack('side'=>'top', 'fill'=>'x') + s3.pack('side'=>'top', 'fill'=>'x') + + # + e1.insert(0, 'Initial value') + e2.insert('end', "This entry contains a long value, much too long ") + e2.insert('end', "to fit in the window at one time, so long in fact ") + e2.insert('end', "that you'll have to scan or scroll to see the end.") + e2.insert('end', "") + +}.pack('side'=>'top', 'fill'=>'x', 'expand'=>'yes') + diff --git a/ext/tk/sample/demos-en/filebox.rb b/ext/tk/sample/demos-en/filebox.rb new file mode 100644 index 0000000000..7caaaf0ede --- /dev/null +++ b/ext/tk/sample/demos-en/filebox.rb @@ -0,0 +1,97 @@ +# filebox.rb +# +# This demonstration script prompts the user to select a file.# +# widget demo prompts the user to select a file (called by 'widget') +# + +# toplevel widget +if defined?($filebox_demo) && $filebox_demo + $filebox_demo.destroy + $filebox_demo = nil +end + +# demo toplevel widget +$filebox_demo = TkToplevel.new {|w| + title("File Selection Dialogs") + iconname("filebox") + positionWindow(w) +} + +# label +TkLabel.new($filebox_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left', + 'text'=>"Enter a file name in the entry box or click on the \"Browse\" buttons to select a file name using the file selection dialog.").pack('side'=>'top') + +# frame +TkFrame.new($filebox_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $filebox_demo + $filebox_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'filebox'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame +['open', 'save'].each{|type| + TkFrame.new($filebox_demo) {|f| + TkLabel.new(f, 'text'=>"Select a file to #{type}: ", 'anchor'=>'e')\ + .pack('side'=>'left') + + TkEntry.new(f, 'width'=>20) {|e| + pack('side'=>'left', 'expand'=>'yes', 'fill'=>'x') + + TkButton.new(f, 'text'=>'Browse ...', + 'command'=>proc{fileDialog $filebox_demo,e,type})\ + .pack('side'=>'left') + } + + pack('fill'=>'x', 'padx'=>'1c', 'pady'=>3) + } +} + +$tk_strictMotif = TkVarAccess.new('tk_strictMotif') +if ($tk_platform['platform'] == 'unix') + TkCheckButton.new($filebox_demo, + 'text'=>'Use Motif Style Dialog', + 'variable'=>$tk_strictMotif, + 'onvalue'=>1, 'offvalue'=>0 ).pack('anchor'=>'c') +end + +def fileDialog(w,ent,operation) + # Type names Extension(s) Mac File Type(s) + # + #-------------------------------------------------------- + types = [ + ['Text files', ['.txt','.doc'] ], + ['Text files', [], 'TEXT' ], + ['Ruby Scripts', ['.rb'], 'TEXT' ], + ['Tcl Scripts', ['.tcl'], 'TEXT' ], + ['C Source Files', ['.c','.h'] ], + ['All Source Files', ['.rb','.tcl','.c','.h'] ], + ['Image Files', ['.gif'] ], + ['Image Files', ['.jpeg','.jpg'] ], + ['Image Files', [], ['GIFF','JPEG']], + ['All files', '*' ] + ] + + if operation == 'open' + file = Tk.getOpenFile('filetypes'=>types, 'parent'=>w) + else + file = Tk.getSaveFile('filetypes'=>types, 'parent'=>w, + 'initialfile'=>'Untitled', + 'defaultextension'=>'.txt') + end + if file != "" + ent.delete 0, 'end' + ent.insert 0, file + ent.xview 'end' + end +end + diff --git a/ext/tk/sample/demos-en/floor.rb b/ext/tk/sample/demos-en/floor.rb new file mode 100644 index 0000000000..db4d59fe73 --- /dev/null +++ b/ext/tk/sample/demos-en/floor.rb @@ -0,0 +1,1721 @@ +# floor.rb +# +# This demonstration script creates a canvas widet that displays the +# floorplan for DEC's Western Research Laboratory. +# +# floorDisplay widget demo (called by 'widget') +# + +# floorDisplay -- +# Recreate the floorplan display in the canvas given by "w". The +# floor given by "active" is displayed on top with its office structure +# visible. +# +# Arguments: +# w - Name of the canvas window. +# active - Number of active floor (1, 2, or 3). + +def floorDisplay(w,active) + return if $activeFloor == active + + w.delete('all') + $activeFloor = active + + # First go through the three floors, displaying the backgrounds for + # each floor. + + floor_bg1(w,$floor_colors['bg1'],$floor_colors['outline1']) + floor_bg2(w,$floor_colors['bg2'],$floor_colors['outline2']) + floor_bg3(w,$floor_colors['bg3'],$floor_colors['outline3']) + + # Raise the background for the active floor so that it's on top. + + w.raise("floor#{active}") + + # Create a dummy item just to mark this point in the display list, + # so we can insert highlights here. + + TkcRectangle.new(w,0,100,1,101, 'fill'=>'', 'outline'=>'', 'tags'=>'marker') + + # Add the walls and labels for the active floor, along with + # transparent polygons that define the rooms on the floor. + # Make sure that the room polygons are on top. + + $floorLabels.clear + $floorItems.clear + send("floor_fg#{active}", w, $floor_colors['offices']) + w.raise('room') + + # Offset the floors diagonally from each other. + + w.move('floor1', '2c', '2c') + w.move('floor2', '1c', '1c') + + # Create items for the room entry and its label. + TkcWindow.new(w, 600, 100, 'anchor'=>'w', 'window'=>$floor_entry) + TkcText.new(w, 600, 100, 'anchor'=>'e', 'text'=>"Room: ") + w['scrollregion'] = w.bbox('all') +end + +# newRoom -- +# This method is invoked whenever the mouse enters a room +# in the floorplan. It changes tags so that the current room is +# highlighted. +# +# Arguments: +# w - The name of the canvas window. + +def newRoom(w) + id = w.find_withtag('current')[0] + $currentRoom.value = $floorLabels[id.id] if id != "" + Tk.update(true) +end + +# roomChanged -- +# This method is invoked whenever the currentRoom variable changes. +# It highlights the current room and unhighlights any previous room. +# +# Arguments: +# w - The canvas window displaying the floorplan. +# args - Not used. + +def roomChanged(w,*args) + w.delete('highlight') + item = $floorItems[$currentRoom.value] + return if item == nil + new = TkcPolygon.new(w, *(w.coords(item))) + new.configure('fill'=>$floor_colors['active'], 'tags'=>'highlight') + w.raise(new, 'marker') +end + +# floor_bg1 -- +# This method represents part of the floorplan database. When +# invoked, it instantiates the background information for the first +# floor. +# +# Arguments: +# w - The canvas window. +# fill - Fill color to use for the floor's background. +# outline - Color to use for the floor's outline. + +def floor_bg1(w,fill,outline) + TkcPolygon.new(w,347,80,349,82,351,84,353,85,363,92,375,99,386,104, + 386,129,398,129,398,162,484,162,484,129,559,129,559,133,725, + 133,725,129,802,129,802,389,644,389,644,391,559,391,559,327, + 508,327,508,311,484,311,484,278,395,278,395,288,400,288,404, + 288,409,290,413,292,418,297,421,302,422,309,421,318,417,325, + 411,330,405,332,397,333,344,333,340,334,336,336,335,338,332, + 342,331,347,332,351,334,354,336,357,341,359,340,360,335,363, + 331,365,326,366,304,366,304,355,258,355,258,387,60,387,60,391, + 0,391,0,337,3,337,3,114,8,114,8,25,30,25,30,5,93,5,98,5,104,7, + 110,10,116,16,119,20,122,28,123,32,123,68,220,68,220,34,221, + 22,223,17,227,13,231,8,236,4,242,2,246,0,260,0,283,1,300,5, + 321,14,335,22,348,25,365,29,363,39,358,48,352,56,337,70, + 344,76,347,80, 'tags'=>['floor1','bg'], 'fill'=>fill) + TkcLine.new(w,386,129,398,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,258,355,258,387, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,60,387,60,391, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,0,337,0,391, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,60,391,0,391, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,3,114,3,337, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,258,387,60,387, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,484,162,398,162, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,398,162,398,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,484,278,484,311, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,484,311,508,311, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,508,327,508,311, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,559,327,508,327, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,644,391,559,391, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,644,389,644,391, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,559,129,484,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,484,162,484,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,725,133,559,133, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,559,129,559,133, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,725,129,802,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,802,389,802,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,3,337,0,337, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,559,391,559,327, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,802,389,644,389, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,725,133,725,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,8,25,8,114, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,8,114,3,114, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,30,25,8,25, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,484,278,395,278, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,30,25,30,5, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,93,5,30,5, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,98,5,93,5, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,104,7,98,5, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,110,10,104,7, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,116,16,110,10, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,119,20,116,16, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,122,28,119,20, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,123,32,122,28, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,123,68,123,32, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,220,68,123,68, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,386,129,386,104, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,386,104,375,99, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,375,99,363,92, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,353,85,363,92, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,220,68,220,34, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,337,70,352,56, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,352,56,358,48, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,358,48,363,39, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,363,39,365,29, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,365,29,348,25, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,348,25,335,22, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,335,22,321,14, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,321,14,300,5, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,300,5,283,1, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,283,1,260,0, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,260,0,246,0, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,246,0,242,2, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,242,2,236,4, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,236,4,231,8, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,231,8,227,13, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,223,17,227,13, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,221,22,223,17, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,220,34,221,22, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,340,360,335,363, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,335,363,331,365, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,331,365,326,366, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,326,366,304,366, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,304,355,304,366, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,395,288,400,288, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,404,288,400,288, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,409,290,404,288, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,413,292,409,290, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,418,297,413,292, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,421,302,418,297, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,422,309,421,302, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,421,318,422,309, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,421,318,417,325, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,417,325,411,330, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,411,330,405,332, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,405,332,397,333, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,397,333,344,333, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,344,333,340,334, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,340,334,336,336, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,336,336,335,338, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,335,338,332,342, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,331,347,332,342, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,332,351,331,347, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,334,354,332,351, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,336,357,334,354, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,341,359,336,357, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,341,359,340,360, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,395,288,395,278, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,304,355,258,355, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,347,80,344,76, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,344,76,337,70, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,349,82,347,80, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,351,84,349,82, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,353,85,351,84, 'fill'=>outline, 'tags'=>['floor1','bg']) +end + +# floor_bg2 -- +# This method represents part of the floorplan database. When +# invoked, it instantiates the background information for the first +# floor. +# +# Arguments: +# w - The canvas window. +# fill - Fill color to use for the floor's background. +# outline - Color to use for the floor's outline. + +def floor_bg2(w,fill,outline) + TkcPolygon.new(w,559,129,484,129,484,162,398,162,398,129,315,129, + 315,133,176,133,176,129,96,129,96,133,3,133,3,339,0,339,0,391, + 60,391,60,387,258,387,258,329,350,329,350,311,395,311,395,280, + 484,280,484,311,508,311,508,327,558,327,558,391,644,391,644, + 367,802,367,802,129,725,129,725,133,559,133,559,129, + 'tags'=>['floor2','bg'], 'fill'=>fill) + TkcLine.new(w,350,311,350,329, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,398,129,398,162, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,802,367,802,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,802,129,725,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,725,133,725,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,559,129,559,133, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,559,133,725,133, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,484,162,484,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,559,129,484,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,802,367,644,367, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,644,367,644,391, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,644,391,558,391, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,558,327,558,391, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,558,327,508,327, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,508,327,508,311, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,484,311,508,311, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,484,280,484,311, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,398,162,484,162, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,484,280,395,280, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,395,280,395,311, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,258,387,60,387, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,3,133,3,339, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,3,339,0,339, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,60,391,0,391, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,0,339,0,391, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,60,387,60,391, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,258,329,258,387, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,350,329,258,329, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,395,311,350,311, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,398,129,315,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,176,133,315,133, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,176,129,96,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,3,133,96,133, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,315,133,315,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,176,133,176,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,96,133,96,129, 'fill'=>outline, 'tags'=>['floor2','bg']) +end + +# floor_bg3 -- +# This method represents part of the floorplan database. When +# invoked, it instantiates the background information for the first +# floor. +# +# Arguments: +# w - The canvas window. +# fill - Fill color to use for the floor's background. +# outline - Color to use for the floor's outline. + +def floor_bg3(w,fill,outline) + TkcPolygon.new(w,159,300,107,300,107,248,159,248,159,129,96,129,96, + 133,21,133,21,331,0,331,0,391,60,391,60,370,159,370,159,300, + 'tags'=>['floor3','bg'], 'fill'=>fill) + TkcPolygon.new(w,258,370,258,329,350,329,350,311,399,311,399,129, + 315,129,315,133,176,133,176,129,159,129,159,370,258,370, + 'tags'=>['floor3','bg'], 'fill'=>fill) + TkcLine.new(w,96,133,96,129, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,176,129,96,129, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,176,129,176,133, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,315,133,176,133, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,315,133,315,129, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,399,129,315,129, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,399,311,399,129, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,399,311,350,311, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,350,329,350,311, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,350,329,258,329, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,258,370,258,329, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,60,370,258,370, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,60,370,60,391, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,60,391,0,391, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,0,391,0,331, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,21,331,0,331, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,21,331,21,133, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,96,133,21,133, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,107,300,159,300,159,248,107,248,107,300, + 'fill'=>outline, 'tags'=>['floor3','bg']) +end + +# floor_fg1 -- +# This method represents part of the floorplan database. When +# invoked, it instantiates the foreground information for the first +# floor (office outlines and numbers). +# +# Arguments: +# w - The canvas window. +# color - Color to use for drawing foreground information. + +def floor_fg1(w,color) + i = TkcPolygon.new(w,375,246,375,172,341,172,341,246, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '101' + $floorItems['101'] = i + TkcText.new(w,358,209, 'text'=>'101', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,307,240,339,240,339,206,307,206, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Pub Lift1' + $floorItems['Pub Lift1'] = i + TkcText.new(w,323,223, 'text'=>'Pub Lift1', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,339,205,307,205,307,171,339,171, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Priv Lift1' + $floorItems['Priv Lift1'] = i + TkcText.new(w,323,188, 'text'=>'Priv Lift1', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,42,389,42,337,1,337,1,389, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '110' + $floorItems['110'] = i + TkcText.new(w,21.5,363, 'text'=>'110', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,59,389,59,385,90,385,90,337,44,337,44,389, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '109' + $floorItems['109'] = i + TkcText.new(w,67,363, 'text'=>'109', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,51,300,51,253,6,253,6,300, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '111' + $floorItems['111'] = i + TkcText.new(w,28.5,276.5, 'text'=>'111', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,98,248,98,309,79,309,79,248, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '117B' + $floorItems['117B'] = i + TkcText.new(w,88.5,278.5, 'text'=>'117B', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,51,251,51,204,6,204,6,251, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '112' + $floorItems['112'] = i + TkcText.new(w,28.5,227.5, 'text'=>'112', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,6,156,51,156,51,203,6,203, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '113' + $floorItems['113'] = i + TkcText.new(w,28.5,179.5, 'text'=>'113', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,85,169,79,169,79,192,85,192, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '117A' + $floorItems['117A'] = i + TkcText.new(w,82,180.5, 'text'=>'117A', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,77,302,77,168,53,168,53,302, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '117' + $floorItems['117'] = i + TkcText.new(w,65,235, 'text'=>'117', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,51,155,51,115,6,115,6,155, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '114' + $floorItems['114'] = i + TkcText.new(w,28.5,135, 'text'=>'114', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,95,115,53,115,53,168,95,168, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '115' + $floorItems['115'] = i + TkcText.new(w,74,141.5, 'text'=>'115', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,87,113,87,27,10,27,10,113, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '116' + $floorItems['116'] = i + TkcText.new(w,48.5,70, 'text'=>'116', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,89,91,128,91,128,113,89,131, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '118' + $floorItems['118'] = i + TkcText.new(w,108.5,102, 'text'=>'118', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,178,128,178,132,216,132,216,91, + 163,91,163,112,149,112,149,128, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '120' + $floorItems['120'] = i + TkcText.new(w,189.5,111.5, 'text'=>'120', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,79,193,87,193,87,169,136,169,136,192, + 156,192,156,169,175,169,175,246,79,246, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '122' + $floorItems['122'] = i + TkcText.new(w,131,207.5, 'text'=>'122', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,138,169,154,169,154,191,138,191, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '121' + $floorItems['121'] = i + TkcText.new(w,146,180, 'text'=>'121', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,99,300,126,300,126,309,99,309, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '106A' + $floorItems['106A'] = i + TkcText.new(w,112.5,304.5, 'text'=>'106A', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,128,299,128,309,150,309,150,248,99,248,99,299, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '105' + $floorItems['105'] = i + TkcText.new(w,124.5,278.5, 'text'=>'105', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,174,309,174,300,152,300,152,309, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '106B' + $floorItems['106B'] = i + TkcText.new(w,163,304.5, 'text'=>'106B', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,176,299,176,309,216,309,216,248,152,248,152,299, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '104' + $floorItems['104'] = i + TkcText.new(w,184,278.5, 'text'=>'104', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,138,385,138,337,91,337,91,385, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '108' + $floorItems['108'] = i + TkcText.new(w,114.5,361, 'text'=>'108', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,256,337,140,337,140,385,256,385, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '107' + $floorItems['107'] = i + TkcText.new(w,198,361, 'text'=>'107', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,300,353,300,329,260,329,260,353, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Smoking' + $floorItems['Smoking'] = i + TkcText.new(w,280,341, 'text'=>'Smoking', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,314,135,314,170,306,170,306,246,177,246,177,135, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '123' + $floorItems['123'] = i + TkcText.new(w,245.5,190.5, 'text'=>'123', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,217,248,301,248,301,326,257,326,257,310,217,310, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '103' + $floorItems['103'] = i + TkcText.new(w,259,287, 'text'=>'103', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,396,188,377,188,377,169,316,169,316,131,396,131, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '124' + $floorItems['124'] = i + TkcText.new(w,356,150, 'text'=>'124', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,397,226,407,226,407,189,377,189,377,246,397,246, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '125' + $floorItems['125'] = i + TkcText.new(w,392,217.5, 'text'=>'125', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,399,187,409,187,409,207,474,207,474,164,399,164, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '126' + $floorItems['126'] = i + TkcText.new(w,436.5,185.5, 'text'=>'126', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,409,209,409,229,399,229,399,253, + 486,253,486,239,474,239,474,209, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '127' + $floorItems['127'] = i + TkcText.new(w,436.5,'231', 'text'=>'127', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,501,164,501,174,495,174,495,188, + 490,188,490,204,476,204,476,164, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'MShower' + $floorItems['MShower'] = i + TkcText.new(w,488.5,'184', 'text'=>'MShower', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,497,176,513,176,513,204,492,204,492,190,497,190, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Closet' + $floorItems['Closet'] = i + TkcText.new(w,502.5,190, 'text'=>'Closet', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,476,237,476,206,513,206,513,254,488,254,488,237, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'WShower' + $floorItems['WShower'] = i + TkcText.new(w,494.5,230, 'text'=>'WShower', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,486,131,558,131,558,135,724,135,724,166, + 697,166,697,275,553,275,531,254,515,254, + 515,174,503,174,503,161,486,161, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '130' + $floorItems['130'] = i + TkcText.new(w,638.5,205, 'text'=>'130', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,308,242,339,242,339,248,342,248, + 342,246,397,246,397,276,393,276, + 393,309,300,309,300,248,308,248, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '102' + $floorItems['102'] = i + TkcText.new(w,367.5,278.5, 'text'=>'102', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,397,255,486,255,486,276,397,276, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '128' + $floorItems['128'] = i + TkcText.new(w,441.5,265.5, 'text'=>'128', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,510,309,486,309,486,255,530,255, + 552,277,561,277,561,325,510,325, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '129' + $floorItems['129'] = i + TkcText.new(w,535.5,293, 'text'=>'129', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,696,281,740,281,740,387,642,387, + 642,389,561,389,561,277,696,277, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '133' + $floorItems['133'] = i + TkcText.new(w,628.5,335, 'text'=>'133', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,742,387,742,281,800,281,800,387, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '132' + $floorItems['132'] = i + TkcText.new(w,771,334, 'text'=>'132', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,800,168,800,280,699,280,699,168, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '134' + $floorItems['134'] = i + TkcText.new(w,749.5,224, 'text'=>'134', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,726,131,726,166,800,166,800,131, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '135' + $floorItems['135'] = i + TkcText.new(w,763,148.5, 'text'=>'135', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,340,360,335,363,331,365,326,366,304,366, + 304,312,396,312,396,288,400,288,404,288, + 409,290,413,292,418,297,421,302,422,309, + 421,318,417,325,411,330,405,332,397,333, + 344,333,340,334,336,336,335,338,332,342, + 331,347,332,351,334,354,336,357,341,359, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Ramona Stair' + $floorItems['Ramona Stair'] = i + TkcText.new(w,368,323, 'text'=>'Ramona Stair', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,30,23,30,5,93,5,98,5,104,7,110,10,116,16,119,20, + 122,28,123,32,123,68,220,68,220,87,90,87,90,23, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'University Stair' + $floorItems['University Stair'] = i + TkcText.new(w,155,77.5, 'text'=>'University Stair', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,282,37,295,40,312,49,323,56,337,70,352,56, + 358,48,363,39,365,29,348,25,335,22,321,14, + 300,5,283,1,260,0,246,0,242,2,236,4,231,8, + 227,13,223,17,221,22,220,34,260,34, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Plaza Stair' + $floorItems['Plaza Stair'] = i + TkcText.new(w,317.5,28.5, 'text'=>'Plaza Stair', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,220,34,260,34,282,37,295,40,312,49, + 323,56,337,70,350,83,365,94,377,100, + 386,104,386,128,220,128, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Plaza Deck' + $floorItems['Plaza Deck'] = i + TkcText.new(w,303,81, 'text'=>'Plaza Deck', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,257,336,77,336,6,336,6,301,77,301,77,310,257,310, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '106' + $floorItems['106'] = i + TkcText.new(w,131.5,318.5, 'text'=>'106', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,146,110,162,110,162,91,130,91,130,115,95,115, + 95,128,114,128,114,151,157,151,157,153,112,153, + 112,130,97,130,97,168,175,168,175,131,146,131, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '119' + $floorItems['119'] = i + TkcText.new(w,143.5,133, 'text'=>'119', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + TkcLine.new(w,155,191,155,189, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,155,177,155,169, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,96,129,96,169, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,78,169,176,169, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,176,247,176,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,340,206,307,206, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,340,187,340,170, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,340,210,340,201, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,340,247,340,224, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,340,241,307,241, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,376,246,376,170, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,307,247,307,170, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,376,170,307,170, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,315,129,315,170, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,147,129,176,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,202,133,176,133, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,398,129,315,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,258,352,258,387, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,60,387,60,391, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,0,337,0,391, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,60,391,0,391, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,3,114,3,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,258,387,60,387, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,237,52,273, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,189,52,225, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,140,52,177, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,395,306,395,311, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,531,254,398,254, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,475,178,475,238, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,502,162,398,162, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,398,129,398,188, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,383,188,376,188, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,408,188,408,194, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,398,227,398,254, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,408,227,398,227, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,408,222,408,227, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,408,206,408,210, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,408,208,475,208, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,484,278,484,311, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,484,311,508,311, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,508,327,508,311, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,559,327,508,327, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,644,391,559,391, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,644,389,644,391, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,514,205,475,205, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,496,189,496,187, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,559,129,484,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,484,162,484,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,725,133,559,133, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,559,129,559,133, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,725,149,725,167, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,725,129,802,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,802,389,802,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,739,167,802,167, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,396,188,408,188, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,0,337,9,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,58,337,21,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,43,391,43,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,105,337,75,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,91,387,91,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,154,337,117,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,139,387,139,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,227,337,166,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,258,337,251,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,258,328,302,328, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,302,355,302,311, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,395,311,302,311, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,484,278,395,278, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,395,294,395,278, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,473,278,473,275, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,473,256,473,254, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,533,257,531,254, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,553,276,551,274, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,698,276,553,276, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,559,391,559,327, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,802,389,644,389, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,741,314,741,389, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,698,280,698,167, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,707,280,698,280, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,802,280,731,280, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,741,280,741,302, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,698,167,727,167, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,725,137,725,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,514,254,514,175, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,496,175,514,175, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,502,175,502,162, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,475,166,475,162, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,496,176,496,175, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,491,189,496,189, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,491,205,491,189, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,487,238,475,238, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,487,240,487,238, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,487,252,487,254, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,315,133,304,133, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,256,133,280,133, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,78,247,270,247, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,307,247,294,247, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,214,133,232,133, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,217,247,217,266, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,217,309,217,291, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,217,309,172,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,154,309,148,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,175,300,175,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,151,300,175,300, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,151,247,151,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,78,237,78,265, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,78,286,78,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,106,309,78,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,130,309,125,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,99,309,99,247, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,127,299,99,299, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,127,309,127,299, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,155,191,137,191, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,137,169,137,191, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,78,171,78,169, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,78,190,78,218, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,86,192,86,169, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,86,192,78,192, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,301,3,301, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,286,52,301, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,252,3,252, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,203,3,203, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,3,156,52,156, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,8,25,8,114, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,63,114,3,114, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,75,114,97,114, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,108,114,129,114, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,129,114,129,89, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,114,52,128, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,132,89,88,89, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,88,25,88,89, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,88,114,88,89, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,218,89,144,89, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,147,111,147,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,162,111,147,111, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,162,109,162,111, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,162,96,162,89, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,218,89,218,94, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,218,89,218,119, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,8,25,88,25, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,258,337,258,328, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,113,129,96,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,302,355,258,355, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,386,104,386,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,377,100,386,104, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,365,94,377,100, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,350,83,365,94, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,337,70,350,83, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,337,70,323,56, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,312,49,323,56, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,295,40,312,49, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,282,37,295,40, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,260,34,282,37, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,253,34,260,34, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,386,128,386,104, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,113,152,156,152, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,113,152,156,152, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,113,152,113,129, 'fill'=>color, 'tags'=>['floor1','wall']) +end + +# floor_fg2 -- +# This method represents part of the floorplan database. When +# invoked, it instantiates the foreground information for the second +# floor (office outlines and numbers). +# +# Arguments: +# w - The canvas window. +# color - Color to use for drawing foreground information. + +def floor_fg2(w,color) + i = TkcPolygon.new(w,748,188,755,188,755,205,758,205,758,222, + 800,222,800,168,748,168, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '238' + $floorItems['238'] = i + TkcText.new(w,774,195, 'text'=>'238', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,726,188,746,188,746,166,800,166,800,131,726,131, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '237' + $floorItems['237'] = i + TkcText.new(w,763,148.5, 'text'=>'237', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,497,187,497,204,559,204,559,324,641,324, + 643,324,643,291,641,291,641,205,696,205, + 696,291,694,291,694,314,715,314,715,291, + 715,205,755,205,755,190,724,190,724,187, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '246' + $floorItems['246'] = i + TkcText.new(w,600,264, 'text'=>'246', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,694,279,643,279,643,314,694,314, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '247' + $floorItems['247'] = i + TkcText.new(w,668.5,296.5, 'text'=>'247', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,232,250,308,250,308,242,339,242,339,246, + 397,246,397,255,476,255,476,250,482,250,559,250, + 559,274,482,274,482,278,396,278,396,274,232,274, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '202' + $floorItems['202'] = i + TkcText.new(w,285.5,260, 'text'=>'202', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,53,228,53,338,176,338,233,338,233,196, + 306,196,306,180,175,180,175,169,156,169, + 156,196,176,196,176,228, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '206' + $floorItems['206'] = i + TkcText.new(w,143,267, 'text'=>'206', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,51,277,6,277,6,338,51,338, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '212' + $floorItems['212'] = i + TkcText.new(w,28.5,307.5, 'text'=>'212', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,557,276,486,276,486,309,510,309,510,325,557,325, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '245' + $floorItems['245'] = i + TkcText.new(w,521.5,300.5, 'text'=>'245', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,560,389,599,389,599,326,560,326, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '244' + $floorItems['244'] = i + TkcText.new(w,579.5,357.5, 'text'=>'244', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,601,389,601,326,643,326,643,389, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '243' + $floorItems['243'] = i + TkcText.new(w,622,357.5, 'text'=>'243', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,688,316,645,316,645,365,688,365, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '242' + $floorItems['242'] = i + TkcText.new(w,666.5,340.5, 'text'=>'242', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,802,367,759,367,759,226,802,226, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = 'Barbecue Deck' + $floorItems['Barbecue Deck'] = i + TkcText.new(w,780.5,296.5, 'text'=>'Barbecue Deck', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,755,262,755,314,717,314,717,262, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '240' + $floorItems['240'] = i + TkcText.new(w,736,288, 'text'=>'240', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,755,316,689,316,689,365,755,365, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '241' + $floorItems['241'] = i + TkcText.new(w,722,340.5, 'text'=>'241', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,755,206,717,206,717,261,755,261, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '239' + $floorItems['239'] = i + TkcText.new(w,736,233.5, 'text'=>'239', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,695,277,643,277,643,206,695,206, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '248' + $floorItems['248'] = i + TkcText.new(w,669,241.5, 'text'=>'248', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,676,135,676,185,724,185,724,135, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '236' + $floorItems['236'] = i + TkcText.new(w,700,160, 'text'=>'236', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,675,135,635,135,635,145,628,145,628,185,675,185, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '235' + $floorItems['235'] = i + TkcText.new(w,651.5,160, 'text'=>'235', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,626,143,633,143,633,135,572,135, + 572,143,579,143,579,185,626,185, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '234' + $floorItems['234'] = i + TkcText.new(w,606,160, 'text'=>'234', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,557,135,571,135,571,145,578,145, + 578,185,527,185,527,131,557,131, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '233' + $floorItems['233'] = i + TkcText.new(w,552.5,158, 'text'=>'233', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,476,249,557,249,557,205,476,205, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '230' + $floorItems['230'] = i + TkcText.new(w,516.5,227, 'text'=>'230', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,476,164,486,164,486,131,525,131,525,185,476,185, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '232' + $floorItems['232'] = i + TkcText.new(w,500.5,158, 'text'=>'232', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,476,186,495,186,495,204,476,204, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '229' + $floorItems['229'] = i + TkcText.new(w,485.5,195, 'text'=>'229', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,474,207,409,207,409,187,399,187,399,164,474,164, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '227' + $floorItems['227'] = i + TkcText.new(w,436.5,185.5, 'text'=>'227', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,399,228,399,253,474,253,474,209,409,209,409,228, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '228' + $floorItems['228'] = i + TkcText.new(w,436.5,231, 'text'=>'228', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,397,246,397,226,407,226,407,189,377,189,377,246, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '226' + $floorItems['226'] = i + TkcText.new(w,392,217.5, 'text'=>'226', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,377,169,316,169,316,131,397,131,397,188,377,188, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '225' + $floorItems['225'] = i + TkcText.new(w,356.5,150, 'text'=>'225', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,234,198,306,198,306,249,234,249, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '224' + $floorItems['224'] = i + TkcText.new(w,270,223.5, 'text'=>'224', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,270,179,306,179,306,170,314,170,314,135,270,135, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '223' + $floorItems['223'] = i + TkcText.new(w,292,157, 'text'=>'223', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,268,179,221,179,221,135,268,135, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '222' + $floorItems['222'] = i + TkcText.new(w,244.5,157, 'text'=>'222', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,177,179,219,179,219,135,177,135, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '221' + $floorItems['221'] = i + TkcText.new(w,198,157, 'text'=>'221', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,299,327,349,327,349,284,341,284,341,276,299,276, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '204' + $floorItems['204'] = i + TkcText.new(w,324,301.5, 'text'=>'204', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,234,276,297,276,297,327,257,327,257,338,234,338, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '205' + $floorItems['205'] = i + TkcText.new(w,265.5,307, 'text'=>'205', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,256,385,256,340,212,340,212,385, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '207' + $floorItems['207'] = i + TkcText.new(w,234,362.5, 'text'=>'207', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,210,340,164,340,164,385,210,385, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '208' + $floorItems['208'] = i + TkcText.new(w,187,362.5, 'text'=>'208', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,115,340,162,340,162,385,115,385, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '209' + $floorItems['209'] = i + TkcText.new(w,138.5,362.5, 'text'=>'209', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,89,228,89,156,53,156,53,228, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '217' + $floorItems['217'] = i + TkcText.new(w,71,192, 'text'=>'217', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,89,169,97,169,97,190,89,190, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '217A' + $floorItems['217A'] = i + TkcText.new(w,93,179.5, 'text'=>'217A', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,89,156,89,168,95,168,95,135,53,135,53,156, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '216' + $floorItems['216'] = i + TkcText.new(w,71,145.5, 'text'=>'216', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,51,179,51,135,6,135,6,179, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '215' + $floorItems['215'] = i + TkcText.new(w,28.5,157, 'text'=>'215', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,51,227,6,227,6,180,51,180, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '214' + $floorItems['214'] = i + TkcText.new(w,28.5,203.5, 'text'=>'214', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,51,275,6,275,6,229,51,229, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '213' + $floorItems['213'] = i + TkcText.new(w,28.5,252, 'text'=>'213', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,114,340,67,340,67,385,114,385, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '210' + $floorItems['210'] = i + TkcText.new(w,90.5,362.5, 'text'=>'210', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,59,389,59,385,65,385,65,340,1,340,1,389, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '211' + $floorItems['211'] = i + TkcText.new(w,33,364.5, 'text'=>'211', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,393,309,350,309,350,282,342,282,342,276,393,276, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '203' + $floorItems['203'] = i + TkcText.new(w,367.5,292.5, 'text'=>'203', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,99,191,91,191,91,226,174,226,174,198, + 154,198,154,192,109,192,109,169,99,169, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '220' + $floorItems['220'] = i + TkcText.new(w,132.5,208.5, 'text'=>'220', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,339,205,307,205,307,171,339,171, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = 'Priv Lift2' + $floorItems['Priv Lift2'] = i + TkcText.new(w,323,188, 'text'=>'Priv Lift2', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,307,240,339,240,339,206,307,206, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = 'Pub Lift 2' + $floorItems['Pub Lift 2'] = i + TkcText.new(w,323,223, 'text'=>'Pub Lift 2', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,175,168,97,168,97,131,175,131, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '218' + $floorItems['218'] = i + TkcText.new(w,136,149.5, 'text'=>'218', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,154,191,111,191,111,169,154,169, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '219' + $floorItems['219'] = i + TkcText.new(w,132.5,180, 'text'=>'219', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,375,246,375,172,341,172,341,246, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '201' + $floorItems['201'] = i + TkcText.new(w,358,209, 'text'=>'201', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + TkcLine.new(w,641,186,678,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,350,757,367, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,634,133,634,144, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,634,144,627,144, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,572,133,572,144, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,572,144,579,144, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,398,129,398,162, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,174,197,175,197, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,175,197,175,227, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,206,757,221, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,396,188,408,188, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,727,189,725,189, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,747,167,802,167, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,747,167,747,189, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,755,189,739,189, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,769,224,757,224, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,802,224,802,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,802,129,725,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,725,189,725,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,725,186,690,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,676,133,676,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,627,144,627,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,629,186,593,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,579,144,579,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,559,129,559,133, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,725,133,559,133, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,484,162,484,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,559,129,484,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,526,129,526,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,540,186,581,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,528,186,523,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,511,186,475,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,496,190,496,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,496,205,496,202, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,475,205,527,205, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,205,539,205, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,205,558,249, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,249,475,249, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,662,206,642,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,695,206,675,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,695,278,642,278, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,642,291,642,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,695,291,695,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,716,208,716,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,206,716,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,221,757,224, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,793,224,802,224, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,262,716,262, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,716,220,716,264, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,716,315,716,276, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,315,703,315, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,325,757,224, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,367,644,367, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,689,367,689,315, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,647,315,644,315, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,659,315,691,315, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,600,325,600,391, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,627,325,644,325, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,644,391,644,315, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,615,325,575,325, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,644,391,558,391, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,563,325,558,325, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,391,558,314, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,327,508,327, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,275,484,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,302,558,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,508,327,508,311, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,484,311,508,311, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,484,275,484,311, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,475,208,408,208, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,408,206,408,210, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,408,222,408,227, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,408,227,398,227, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,398,227,398,254, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,408,188,408,194, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,383,188,376,188, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,398,188,398,162, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,398,162,484,162, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,475,162,475,254, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,398,254,475,254, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,484,280,395,280, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,395,311,395,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,307,197,293,197, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,278,197,233,197, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,233,197,233,249, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,307,179,284,179, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,233,249,278,249, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,269,179,269,133, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,220,179,220,133, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,155,191,110,191, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,90,190,98,190, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,98,169,98,190, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,133,52,165, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,214,52,177, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,226,52,262, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,274,52,276, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,234,275,234,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,226,339,258,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,211,387,211,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,214,339,177,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,258,387,60,387, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,3,133,3,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,165,339,129,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,117,339,80,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,68,339,59,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,0,339,46,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,60,391,0,391, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,0,339,0,391, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,60,387,60,391, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,258,329,258,387, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,350,329,258,329, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,395,311,350,311, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,398,129,315,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,176,133,315,133, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,176,129,96,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,3,133,96,133, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,66,387,66,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,115,387,115,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,163,387,163,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,234,275,276,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,288,275,309,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,298,275,298,329, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,341,283,350,283, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,321,275,341,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,375,275,395,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,315,129,315,170, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,376,170,307,170, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,307,250,307,170, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,376,245,376,170, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,340,241,307,241, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,340,245,340,224, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,340,210,340,201, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,340,187,340,170, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,340,206,307,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,293,250,307,250, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,271,179,238,179, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,226,179,195,179, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,176,129,176,179, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,182,179,176,179, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,174,169,176,169, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,162,169,90,169, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,96,169,96,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,175,227,90,227, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,90,190,90,227, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,179,3,179, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,228,3,228, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,276,3,276, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,155,177,155,169, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,110,191,110,169, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,155,189,155,197, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,350,283,350,329, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,162,197,155,197, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,341,275,341,283, 'fill'=>color, 'tags'=>['floor2','wall']) +end + +# floor_fg3 -- +# This method represents part of the floorplan database. When +# invoked, it instantiates the foreground information for the third +# floor (office outlines and numbers). +# +# Arguments: +# w - The canvas window. +# color - Color to use for drawing foreground information. + +def floor_fg3(w,color) + i = TkcPolygon.new(w,89,228,89,180,70,180,70,228, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '316' + $floorItems['316'] = i + TkcText.new(w,79.5,204, 'text'=>'316', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,115,368,162,368,162,323,115,323, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '309' + $floorItems['309'] = i + TkcText.new(w,138.5,345.5, 'text'=>'309', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,164,323,164,368,211,368,211,323, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '308' + $floorItems['308'] = i + TkcText.new(w,187.5,345.5, 'text'=>'308', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,256,368,212,368,212,323,256,323, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '307' + $floorItems['307'] = i + TkcText.new(w,234,345.5, 'text'=>'307', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,244,276,297,276,297,327,260,327,260,321,244,321, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '305' + $floorItems['305'] = i + TkcText.new(w,270.5,301.5, 'text'=>'305', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,251,219,251,203,244,203,244,219, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '324B' + $floorItems['324B'] = i + TkcText.new(w,247.5,211, 'text'=>'324B', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,251,249,244,249,244,232,251,232, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '324A' + $floorItems['324A'] = i + TkcText.new(w,247.5,240.5, 'text'=>'324A', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,223,135,223,179,177,179,177,135, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '320' + $floorItems['320'] = i + TkcText.new(w,200,157, 'text'=>'320', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,114,368,114,323,67,323,67,368, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '310' + $floorItems['310'] = i + TkcText.new(w,90.5,345.5, 'text'=>'310', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,23,277,23,321,68,321,68,277, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '312' + $floorItems['312'] = i + TkcText.new(w,45.5,299, 'text'=>'312', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,23,229,68,229,68,275,23,275, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '313' + $floorItems['313'] = i + TkcText.new(w,45.5,252, 'text'=>'313', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,68,227,23,227,23,180,68,180, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '314' + $floorItems['314'] = i + TkcText.new(w,40.5,203.5, 'text'=>'314', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,95,179,95,135,23,135,23,179, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '315' + $floorItems['315'] = i + TkcText.new(w,59,157, 'text'=>'315', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,99,226,99,204,91,204,91,226, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '316B' + $floorItems['316B'] = i + TkcText.new(w,95,215, 'text'=>'316B', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,91,202,99,202,99,180,91,180, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '316A' + $floorItems['316A'] = i + TkcText.new(w,95,191, 'text'=>'316A', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,97,169,109,169,109,192,154,192,154,198, + 174,198,174,226,101,226,101,179,97,179, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '319' + $floorItems['319'] = i + TkcText.new(w,141.5,209, 'text'=>'319', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,65,368,58,368,58,389,1,389,1,333,23,333,23,323,65,323, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '311' + $floorItems['311'] = i + TkcText.new(w,29.5,361, 'text'=>'311', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,154,191,111,191,111,169,154,169, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '318' + $floorItems['318'] = i + TkcText.new(w,132.5,180, 'text'=>'318', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,175,168,97,168,97,131,175,131, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '317' + $floorItems['317'] = i + TkcText.new(w,136,149.5, 'text'=>'317', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,274,194,274,221,306,221,306,194, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '323' + $floorItems['323'] = i + TkcText.new(w,290,207.5, 'text'=>'323', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,306,222,274,222,274,249,306,249, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '325' + $floorItems['325'] = i + TkcText.new(w,290,235.5, 'text'=>'325', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,263,179,224,179,224,135,263,135, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '321' + $floorItems['321'] = i + TkcText.new(w,243.5,157, 'text'=>'321', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,314,169,306,169,306,192,273,192, + 264,181,264,135,314,135, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '322' + $floorItems['322'] = i + TkcText.new(w,293.5,163.5, 'text'=>'322', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,307,240,339,240,339,206,307,206, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = 'Pub Lift3' + $floorItems['Pub Lift3'] = i + TkcText.new(w,323,223, 'text'=>'Pub Lift3', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,339,205,307,205,307,171,339,171, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = 'Priv Lift3' + $floorItems['Priv Lift3'] = i + TkcText.new(w,323,188, 'text'=>'Priv Lift3', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,350,284,376,284,376,276,397,276,397,309,350,309, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '303' + $floorItems['303'] = i + TkcText.new(w,373.5,292.5, 'text'=>'303', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,272,203,272,249,252,249,252,230, + 244,230,244,221,252,221,252,203, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '324' + $floorItems['324'] = i + TkcText.new(w,262,226, 'text'=>'324', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,299,276,299,327,349,327,349,284,341,284,341,276, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '304' + $floorItems['304'] = i + TkcText.new(w,324,301.5, 'text'=>'304', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,375,246,375,172,341,172,341,246, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '301' + $floorItems['301'] = i + TkcText.new(w,358,209, 'text'=>'301', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,397,246,377,246,377,185,397,185, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '327' + $floorItems['327'] = i + TkcText.new(w,387,215.5, 'text'=>'327', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,316,131,316,169,377,169,377,185,397,185,397,131, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '326' + $floorItems['326'] = i + TkcText.new(w,365.5,150, 'text'=>'326', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,308,251,242,251,242,274,342,274,342,282,375, 282, + 375,274,397,274,397,248,339,248,339,242,308,242, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '302' + $floorItems['302'] = i + TkcText.new(w,319.5,261, 'text'=>'302', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,70,321,242,321,242,200,259,200,259,203,272,203, + 272,193,263,180,242,180,175,180,175,169,156,169, + 156,196,177,196,177,228,107,228,70,228,70,275,107,275, + 107,248,160,248,160,301,107,301,107,275,70,275, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '306' + $floorItems['306'] = i + TkcText.new(w,200.5,284.5, 'text'=>'306', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + TkcLine.new(w,341,275,341,283, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,162,197,155,197, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,396,247,399,247, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,399,129,399,311, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,258,202,243,202, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,350,283,350,329, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,251,231,243,231, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,243,220,251,220, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,243,250,243,202, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,155,197,155,190, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,110,192,110,169, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,155,192,110,192, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,155,177,155,169, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,176,197,176,227, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,69,280,69,274, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,21,276,69,276, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,69,262,69,226, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,21,228,69,228, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,21,179,75,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,69,179,69,214, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,90,220,90,227, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,90,204,90,202, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,90,203,100,203, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,90,187,90,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,90,227,176,227, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,100,179,100,227, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,100,179,87,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,96,179,96,129, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,162,169,96,169, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,173,169,176,169, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,182,179,176,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,176,129,176,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,195,179,226,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,224,133,224,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,264,179,264,133, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,238,179,264,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,207,273,193, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,235,273,250, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,224,273,219, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,193,307,193, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,222,307,222, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,250,307,250, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,384,247,376,247, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,340,206,307,206, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,340,187,340,170, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,340,210,340,201, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,340,247,340,224, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,340,241,307,241, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,376,247,376,170, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,307,250,307,170, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,376,170,307,170, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,315,129,315,170, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,376,283,366,283, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,376,283,376,275, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,399,275,376,275, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,341,275,320,275, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,341,283,350,283, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,298,275,298,329, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,308,275,298,275, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,243,322,243,275, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,243,275,284,275, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,258,322,226,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,212,370,212,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,214,322,177,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,163,370,163,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,165,322,129,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,84,322,117,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,71,322,64,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,115,322,115,370, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,66,322,66,370, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,52,322,21,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,21,331,0,331, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,21,331,21,133, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,96,133,21,133, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,176,129,96,129, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,315,133,176,133, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,315,129,399,129, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,399,311,350,311, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,350,329,258,329, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,258,322,258,370, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,60,370,258,370, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,60,370,60,391, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,0,391,0,331, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,60,391,0,391, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,307,250,307,242, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,250,307,250, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,258,250,243,250, 'fill'=>color, 'tags'=>['floor3','wall']) +end + +# Below is the "main program" that creates the floorplan demonstration. + +# toplevel widget +if defined?($floor_demo) && $floor_demo + $floor_demo.destroy + $floor_demo = nil +end + +# demo toplevel widget +$floor_demo = TkToplevel.new {|w| + title("Floorplan Canvas Demonstration") + iconname("Floorplan") + positionWindow(w) + geometry('+20+20') + minsize(100,100) +} + +# label +TkLabel.new($floor_demo, 'font'=>$font, 'wraplength'=>'8i', 'justify'=>'left', + 'text'=>"This window contains a canvas widget showing the floorplan of Digital Equipment Corporation's Western Research Laboratory. It has three levels. At any given time one of the levels is active, meaning that you can see its room structure. To activate a level, click the left mouse button anywhere on it. As the mouse moves over the active level, the room under the mouse lights up and its room number appears in the \"Room:\" entry. You can also type a room number in the entry and the room will light up."){ + pack('side'=>'top') +} + +# frame +$floor_buttons = TkFrame.new($floor_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $floor_demo + $floor_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'floor'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$floor_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# +$floorLabels = {} +$floorItems = {} + +# canvas +if $tk_version =~ /^4\.[01]/ + $floor_canvas_frame = TkFrame.new($floor_demo,'bd'=>2,'relief'=>'sunken', + 'highlightthickness'=>2) + $floor_canvas = TkCanvas.new($floor_canvas_frame, + 'width'=>900, 'height'=>500, 'borderwidth'=>0, + 'highlightthickness'=>0) {|c| + TkScrollbar.new($floor_demo, 'orient'=>'horiz', + 'command'=>proc{|*args| c.xview(*args)}){|hs| + c.xscrollcommand(proc{|first,last| hs.set first,last}) + pack('side'=>'bottom', 'fill'=>'x') + } + TkScrollbar.new($floor_demo, 'command'=>proc{|*args| c.yview(*args)}){|vs| + c.yscrollcommand(proc{|first,last| vs.set first,last}) + pack('side'=>'right', 'fill'=>'y') + } + } + $floor_canvas_frame.pack('side'=>'top','fill'=>'both', 'expand'=>'yes') + $floor_canvas.pack('expand'=>'yes', 'fill'=>'both') + +else + TkFrame.new($floor_demo) {|f| + pack('side'=>'top', 'fill'=>'both', 'expand'=>'yes') + + h = TkScrollbar.new(f, 'highlightthickness'=>0, 'orient'=>'horizontal') + v = TkScrollbar.new(f, 'highlightthickness'=>0, 'orient'=>'vertical') + + TkFrame.new(f, 'bd'=>2, 'relief'=>'sunken') {|f1| + $floor_canvas = TkCanvas.new(f1, 'width'=>900, 'height'=>500, + 'borderwidth'=>0, + 'highlightthickness'=>0) { + xscrollcommand(proc{|first,last| h.set first,last}) + yscrollcommand(proc{|first,last| v.set first,last}) + pack('expand'=>'yes', 'fill'=>'both') + } + grid('padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + } + + v.grid('padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>1, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + h.grid('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) + + pack('expand'=>'yes', 'fill'=>'both', 'padx'=>1, 'pady'=>1) + + v.command(proc{|*args| c.yview(*args)}) + h.command(proc{|*args| c.xview(*args)}) + } +end + + +# Create an entry for displaying and typing in current room. + +$currentRoom = TkVariable.new +$floor_entry = TkEntry.new($floor_canvas, 'width'=>10, 'relief'=>'sunken', + 'bd'=>2, 'textvariable'=>$currentRoom) + +# Choose colors, then fill in the floorplan. + +$floor_colors = {} +if TkWinfo.depth($floor_canvas) > 1 + $floor_colors['bg1'] = '#a9c1da' + $floor_colors['outline1'] = '#77889a' + $floor_colors['bg2'] = '#9ab0c6' + $floor_colors['outline2'] = '#687786' + $floor_colors['bg3'] = '#8ba0b3' + $floor_colors['outline3'] = '#596673' + $floor_colors['offices'] = 'Black' + $floor_colors['active'] = '#c4d1df' +else + $floor_colors['bg1'] = 'white' + $floor_colors['outline1'] = 'black' + $floor_colors['bg2'] = 'white' + $floor_colors['outline2'] = 'black' + $floor_colors['bg3'] = 'white' + $floor_colors['outline3'] = 'black' + $floor_colors['offices'] = 'Black' + $floor_colors['active'] = 'black' +end + +$activeFloor = '' +floorDisplay $floor_canvas,3 + +# Set up event bindings for canvas: + +$floor_canvas.itembind('floor1', '1', proc{floorDisplay $floor_canvas,1}) +$floor_canvas.itembind('floor2', '1', proc{floorDisplay $floor_canvas,2}) +$floor_canvas.itembind('floor3', '1', proc{floorDisplay $floor_canvas,3}) +$floor_canvas.itembind('room', 'Enter', proc{newRoom $floor_canvas}) +$floor_canvas.itembind('room', 'Leave', proc{$currentRoom.value = ''}) +$floor_canvas.bind('2', proc{|x,y| $floor_canvas.scan_mark x,y}, '%x %y') +$floor_canvas.bind('B2-Motion', + proc{|x,y| $floor_canvas.scan_dragto x,y}, '%x %y') +$floor_canvas.bind('Destroy', proc{$currentRoom.unset}) +$currentRoom.value = '' +$currentRoom.trace('w',proc{roomChanged $floor_canvas}) + diff --git a/ext/tk/sample/demos-en/form.rb b/ext/tk/sample/demos-en/form.rb new file mode 100644 index 0000000000..dbb14302dc --- /dev/null +++ b/ext/tk/sample/demos-en/form.rb @@ -0,0 +1,62 @@ +# +# form widget demo (called by 'widget') +# + +# toplevel widget +if defined?($form_demo) && $form_demo + $form_demo.destroy + $form_demo = nil +end + +# demo toplevel widget +$form_demo = TkToplevel.new {|w| + title("Form Demonstration") + iconname("form") + positionWindow(w) +} + +# label +msg = TkLabel.new($form_demo) { + font $font + wraplength '4i' + justify 'left' + text "This window contains a simple form where you can type in the various entries and use tabs to move circularly between the entries." +} +msg.pack('side'=>'top', 'fill'=>'x') + +# frame +TkFrame.new($form_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $form_demo + $form_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'form'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# entry +form_data = [] +(1..5).each{|i| + f = TkFrame.new($form_demo, 'bd'=>2) + e = TkEntry.new(f, 'relief'=>'sunken', 'width'=>40) + l = TkLabel.new(f) + e.pack('side'=>'right') + l.pack('side'=>'left') + form_data[i] = {'frame'=>f, 'entry'=>e, 'label'=>l} +} + +# +form_data[1]['label'].text('Name:') +form_data[2]['label'].text('Address:') +form_data[5]['label'].text('Phone:') + +# pack +(1..5).each{|i| form_data[i]['frame'].pack('side'=>'top', 'fill'=>'x')} + diff --git a/ext/tk/sample/demos-en/hello b/ext/tk/sample/demos-en/hello new file mode 100644 index 0000000000..f06eabe518 --- /dev/null +++ b/ext/tk/sample/demos-en/hello @@ -0,0 +1,14 @@ +#!/usr/bin/env ruby +require 'tk' + +unless /^8\.[1-9]/ =~ Tk::TCL_VERSION && !Tk::JAPANIZED_TK + require 'tkencoding' +end + +TkButton.new(nil, + 'text'=>"Hello Ruby world!", + 'font'=>TkFont.new('k14'), + 'command'=>proc{print "Hello Ruby world!\n"; exit} +).pack + +Tk.mainloop diff --git a/ext/tk/sample/demos-en/hscale.rb b/ext/tk/sample/demos-en/hscale.rb new file mode 100644 index 0000000000..14e395b61a --- /dev/null +++ b/ext/tk/sample/demos-en/hscale.rb @@ -0,0 +1,74 @@ +require "tkcanvas" + +if defined?($hscale_demo) && $hscale_demo + $hscale_demo.destroy + $hscale_demo = nil +end + +$hscale_demo = TkToplevel.new {|w| + title("Horizontal Scale Demonstration") + iconname("hscale") +} +positionWindow($hscale_demo) + + +msg = TkLabel.new($hscale_demo) { + font $font + wraplength '3.5i' + justify 'left' + text "An arrow and a horizontal scale are displayed below. If you click or drag mouse button 1 in the scale, you can change the length of the arrow." +} +msg.pack('side'=>'top') + +TkFrame.new($hscale_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc { + tmppath = $hscale_demo + $hscale_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc { showCode 'hscale' } + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +TkFrame.new($hscale_demo) {|frame| + canvas = TkCanvas.new(frame) {|c| + width 50 + height 50 + bd 0 + highlightthickness 0 + TkcPolygon.new(c, '0', '0', '1', '1', '2', '2') { + fill 'DeepSkyBlue' + tags 'poly' + } + TkcLine.new(c, '0', '0', '1', '1', '2', '2', '0', '0') { + fill 'black' + tags 'line' + } + }.pack('side'=>'top', 'expand'=>'yes', 'anchor'=>'s', 'fill'=>'x', 'padx'=>'15') + scale = TkScale.new(frame) { + orient 'horizontal' + length 284 + from 0 + to 250 + command proc{|value| setWidth(canvas, value)} + tickinterval 50 + }.pack('side'=>'bottom', 'expand'=>'yes', 'anchor'=>'n') + scale.set 75 +}.pack('side'=>'top', 'fill'=>'x') + + +def setWidth(w, width) + width = width + 21 + x2 = width - 30 + if x2 < 21 + x2 = 21 + end + w.coords 'poly',20,15,20,35,x2,35,x2,45,width,25,x2,5,x2,15,20,15 + w.coords 'line',20,15,20,35,x2,35,x2,45,width,25,x2,5,x2,15,20,15 +end diff --git a/ext/tk/sample/demos-en/icon.rb b/ext/tk/sample/demos-en/icon.rb new file mode 100644 index 0000000000..7557257ef4 --- /dev/null +++ b/ext/tk/sample/demos-en/icon.rb @@ -0,0 +1,95 @@ +# icon.rb +# +# This demonstration script creates a toplevel window containing +# buttons that display bitmaps instead of text. +# +# iconic button widget demo (called by 'widget') +# + +# toplevel widget +if defined?($icon_demo) && $icon_demo + $icon_demo.destroy + $icon_demo = nil +end + +# demo toplevel widget +$icon_demo = TkToplevel.new {|w| + title("Iconic Button Demonstration") + iconname("icon") + positionWindow(w) +} + +# label +msg = TkLabel.new($icon_demo) { + font $font + wraplength '5i' + justify 'left' + text "This window shows three ways of using bitmaps or images in radiobuttons and checkbuttons. On the left are two radiobuttons, each of which displays a bitmap and an indicator. In the middle is a checkbutton that displays a different image depending on whether it is selected or not. On the right is a checkbutton that displays a single bitmap but changes its background color to indicate whether or not it is selected. (This change is visible when the mouse pointer is not directy over the button.)" +} +msg.pack('side'=>'top') + +# frame +TkFrame.new($icon_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $icon_demo + $icon_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'icon'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# image +flagup = \ +TkBitmapImage.new('file'=>[$demo_dir, + 'images','flagup.xbm'].join(File::Separator), + 'maskfile'=>\ + [$demo_dir,'images','flagup.xbm'].join(File::Separator)) +flagdown = \ +TkBitmapImage.new('file'=>[$demo_dir, + 'images','flagdown.xbm'].join(File::Separator), + 'maskfile'=>\ + [$demo_dir,'images','flagdown.xbm'].join(File::Separator)) + +# 変数生成 +letters = TkVariable.new + +# frame +TkFrame.new($icon_demo, 'borderwidth'=>10){|w| + TkFrame.new(w) {|f| + TkRadioButton.new(f){ + bitmap '@' + [$demo_dir,'images','letters.xbm'].join(File::Separator) + variable letters + value 'full' + }.pack('side'=>'top', 'expand'=>'yes') + + TkRadioButton.new(f){ + bitmap '@' + [$demo_dir,'images','noletter.xbm'].join(File::Separator) + variable letters + value 'empty' + }.pack('side'=>'top', 'expand'=>'yes') + + }.pack('side'=>'left', 'expand'=>'yes', 'padx'=>'5m') + + TkCheckButton.new(w) { + image flagdown + selectimage flagup + indicatoron 0 + selectcolor self['background'] + }.pack('side'=>'left', 'expand'=>'yes', 'padx'=>'5m') + + TkCheckButton.new(w) { + bitmap '@' + [$demo_dir,'images','letters.xbm'].join(File::Separator) + indicatoron 0 + selectcolor 'SeaGreen1' + }.pack('side'=>'left', 'expand'=>'yes', 'padx'=>'5m') + +}.pack('side'=>'top') + diff --git a/ext/tk/sample/demos-en/image1.rb b/ext/tk/sample/demos-en/image1.rb new file mode 100644 index 0000000000..8d39b20049 --- /dev/null +++ b/ext/tk/sample/demos-en/image1.rb @@ -0,0 +1,60 @@ +## image1.rb +# +# This demonstration script displays two image widgets. +# +# two image widgets demo (called by 'widget') +# + +# toplevel widget +if defined?($image1_demo) && $image1_demo + $image1_demo.destroy + $image1_demo = nil +end + +# demo toplevel widget +$image1_demo = TkToplevel.new {|w| + title('Image Demonstration #1') + iconname("Image1") + positionWindow(w) +} + +# label +msg = TkLabel.new($image1_demo) { + font $font + wraplength '4i' + justify 'left' + text "This demonstration displays two images, each in a separate label widget." +} +msg.pack('side'=>'top') + +# frame +TkFrame.new($image1_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $image1_demo + $image1_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'image1'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# image +image1a = \ +TkPhotoImage.new('file'=>[$demo_dir, + 'images','earth.gif'].join(File::Separator)) +image1b = \ +TkPhotoImage.new('file'=>[$demo_dir, + 'images','earthris.gif'].join(File::Separator)) + +# label +[ TkLabel.new($image1_demo, 'image'=>image1a, 'bd'=>1, 'relief'=>'sunken'), + TkLabel.new($image1_demo, 'image'=>image1b, 'bd'=>1, 'relief'=>'sunken') +].each{|w| w.pack('side'=>'top', 'padx'=>'.5m', 'pady'=>'.5m')} + diff --git a/ext/tk/sample/demos-en/image2.rb b/ext/tk/sample/demos-en/image2.rb new file mode 100644 index 0000000000..9924195675 --- /dev/null +++ b/ext/tk/sample/demos-en/image2.rb @@ -0,0 +1,105 @@ +# image2.rb +# +# This demonstration script creates a simple collection of widgets +# that allow you to select and view images in a Tk label. +# +# widget demo 'load image' (called by 'widget') +# + +# toplevel widget +if defined?($image2_demo) && $image2_demo + $image2_demo.destroy + $image2_demo = nil +end + +# demo toplevel widget +$image2_demo = TkToplevel.new {|w| + title('Image Demonstration #2') + iconname("Image2") + positionWindow(w) +} + +# label +msg = TkLabel.new($image2_demo) { + font $font + wraplength '4i' + justify 'left' + text "This demonstration allows you to view images using a Tk \"photo\" image. First type a directory name in the listbox, then press Enter to load the directory into the listbox. Then double-click on a file name in the listbox to see that image." +} +msg.pack('side'=>'top') + +# frame +TkFrame.new($image2_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $image2_demo + $image2_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'image2'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# 変数生成 +$dirName = TkVariable.new([$demo_dir,'images'].join(File::Separator)) + +# image +$image2a = TkPhotoImage.new + +# +TkLabel.new($image2_demo, 'text'=>'Directory:')\ +.pack('side'=>'top', 'anchor'=>'w') + +image2_e = TkEntry.new($image2_demo) { + width 30 + textvariable $dirName +}.pack('side'=>'top', 'anchor'=>'w') + +TkFrame.new($image2_demo, 'height'=>'3m', 'width'=>20)\ +.pack('side'=>'top', 'anchor'=>'w') + +TkLabel.new($image2_demo, 'text'=>'File:')\ +.pack('side'=>'top', 'anchor'=>'w') + +TkFrame.new($image2_demo){|w| + s = TkScrollbar.new(w) + l = TkListbox.new(w) { + width 20 + height 10 + yscrollcommand proc{|first,last| s.set first,last} + } + s.command(proc{|*args| l.yview(*args)}) + l.pack('side'=>'left', 'expand'=>'yes', 'fill'=>'y') + s.pack('side'=>'left', 'expand'=>'yes', 'fill'=>'y') + #l.insert(0,'earth.gif', 'earthris.gif', 'mickey.gif', 'teapot.ppm') + l.insert(0,'earth.gif', 'earthris.gif', 'teapot.ppm') + l.bind('Double-1', proc{|x,y| loadImage $image2a,l,x,y}, '%x %y') + + image2_e.bind 'Return', proc{loadDir l} + +}.pack('side'=>'top', 'anchor'=>'w') + +# image +[ TkFrame.new($image2_demo, 'height'=>'3m', 'width'=>20), + TkLabel.new($image2_demo, 'text'=>'Image:'), + TkLabel.new($image2_demo, 'image'=>$image2a) +].each{|w| w.pack('side'=>'top', 'anchor'=>'w')} + +# +def loadDir(w) + w.delete(0,'end') + Dir.glob([$dirName,'*'].join(File::Separator)).sort.each{|f| + w.insert('end',File.basename(f)) + } +end + +def loadImage(img,w,x,y) + img.file([$dirName, w.get("@#{x},#{y}")].join(File::Separator)) +end + diff --git a/ext/tk/sample/demos-en/images/earth.gif b/ext/tk/sample/demos-en/images/earth.gif Binary files differnew file mode 100644 index 0000000000..3ae4a9ce01 --- /dev/null +++ b/ext/tk/sample/demos-en/images/earth.gif diff --git a/ext/tk/sample/demos-en/images/earthris.gif b/ext/tk/sample/demos-en/images/earthris.gif Binary files differnew file mode 100644 index 0000000000..48f08c4421 --- /dev/null +++ b/ext/tk/sample/demos-en/images/earthris.gif diff --git a/ext/tk/sample/demos-en/images/face.xbm b/ext/tk/sample/demos-en/images/face.xbm new file mode 100644 index 0000000000..03d829f4d1 --- /dev/null +++ b/ext/tk/sample/demos-en/images/face.xbm @@ -0,0 +1,173 @@ +#define face_width 108 +#define face_height 144 +#define face_x_hot 48 +#define face_y_hot 80 +static char face_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, + 0x20, 0x80, 0x24, 0x05, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x88, + 0x24, 0x20, 0x80, 0x24, 0x00, 0x00, 0x00, 0x10, 0x80, 0x04, 0x00, 0x01, + 0x00, 0x01, 0x40, 0x0a, 0x09, 0x00, 0x92, 0x04, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x40, 0x12, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x84, + 0x24, 0x40, 0x22, 0xa8, 0x02, 0x14, 0x84, 0x92, 0x40, 0x42, 0x12, 0x04, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x11, 0x00, 0x12, 0x00, + 0x40, 0x02, 0x00, 0x20, 0x00, 0x08, 0x00, 0xaa, 0x02, 0x54, 0x85, 0x24, + 0x00, 0x10, 0x12, 0x00, 0x00, 0x81, 0x44, 0x00, 0x90, 0x5a, 0x00, 0xea, + 0x1b, 0x00, 0x80, 0x40, 0x40, 0x02, 0x00, 0x08, 0x00, 0x20, 0xa2, 0x05, + 0x8a, 0xb4, 0x6e, 0x45, 0x12, 0x04, 0x08, 0x00, 0x00, 0x00, 0x10, 0x02, + 0xa8, 0x92, 0x00, 0xda, 0x5f, 0x10, 0x00, 0x10, 0xa1, 0x04, 0x20, 0x41, + 0x02, 0x00, 0x5a, 0x25, 0xa0, 0xff, 0xfb, 0x05, 0x41, 0x02, 0x04, 0x00, + 0x00, 0x08, 0x40, 0x80, 0xec, 0x9b, 0xec, 0xfe, 0x7f, 0x01, 0x04, 0x20, + 0x90, 0x02, 0x04, 0x00, 0x08, 0x20, 0xfb, 0x2e, 0xf5, 0xff, 0xff, 0x57, + 0x00, 0x04, 0x02, 0x00, 0x00, 0x20, 0x01, 0xc1, 0x6e, 0xab, 0xfa, 0xff, + 0xff, 0x05, 0x90, 0x20, 0x48, 0x02, 0x00, 0x04, 0x20, 0xa8, 0xdf, 0xb5, + 0xfe, 0xff, 0xff, 0x0b, 0x01, 0x00, 0x01, 0x00, 0x80, 0x80, 0x04, 0xe0, + 0xbb, 0xef, 0xff, 0xff, 0x7f, 0x01, 0x00, 0x04, 0x48, 0x02, 0x00, 0x20, + 0x80, 0xf4, 0x6f, 0xfb, 0xff, 0xff, 0xff, 0x20, 0x90, 0x40, 0x02, 0x00, + 0x00, 0x04, 0x08, 0xb8, 0xf6, 0xff, 0xff, 0xdf, 0xbe, 0x12, 0x45, 0x10, + 0x90, 0x04, 0x90, 0x00, 0x22, 0xfa, 0xff, 0xff, 0xff, 0xbb, 0xd7, 0xe9, + 0x3a, 0x02, 0x02, 0x00, 0x04, 0x90, 0x80, 0xfe, 0xdf, 0xf6, 0xb7, 0xef, + 0xbe, 0x56, 0x57, 0x40, 0x48, 0x09, 0x00, 0x04, 0x00, 0xfa, 0xf5, 0xdf, + 0xed, 0x5a, 0xd5, 0xea, 0xbd, 0x09, 0x00, 0x00, 0x40, 0x00, 0x92, 0xfe, + 0xbf, 0x7d, 0xb7, 0x6a, 0x55, 0xbf, 0xf7, 0x02, 0x11, 0x01, 0x00, 0x91, + 0x00, 0xff, 0xff, 0xaf, 0x55, 0x55, 0x5b, 0xeb, 0xef, 0x22, 0x04, 0x04, + 0x04, 0x00, 0xa4, 0xff, 0xf7, 0xad, 0xaa, 0xaa, 0xaa, 0xbe, 0xfe, 0x03, + 0x20, 0x00, 0x10, 0x44, 0x80, 0xff, 0x7f, 0x55, 0x12, 0x91, 0x2a, 0xeb, + 0xbf, 0x0b, 0x82, 0x02, 0x00, 0x00, 0xd1, 0x7f, 0xdf, 0xa2, 0xa4, 0x54, + 0x55, 0xfd, 0xfd, 0x47, 0x08, 0x08, 0x00, 0x21, 0xe4, 0xff, 0x37, 0x11, + 0x09, 0xa5, 0xaa, 0xb6, 0xff, 0x0d, 0x80, 0x00, 0x00, 0x04, 0xd0, 0xff, + 0x4f, 0x44, 0x20, 0x48, 0x55, 0xfb, 0xff, 0x27, 0x11, 0x02, 0x40, 0x40, + 0xe2, 0xfb, 0x15, 0x11, 0x4a, 0x55, 0x4a, 0x7d, 0xf7, 0x0f, 0x00, 0x00, + 0x04, 0x08, 0xf8, 0xdf, 0x52, 0x44, 0x01, 0x52, 0xb5, 0xfa, 0xff, 0x0f, + 0x49, 0x02, 0x00, 0x02, 0xe9, 0xf6, 0x0a, 0x11, 0xa4, 0x88, 0x4a, 0x6d, + 0xff, 0x5f, 0x00, 0x00, 0x10, 0x20, 0xf0, 0x2f, 0x21, 0x44, 0x10, 0x52, + 0xb5, 0xfa, 0xff, 0x0f, 0x44, 0x04, 0x80, 0x08, 0xf8, 0xab, 0x8a, 0x00, + 0x81, 0xa4, 0xd4, 0xd6, 0xfe, 0x2f, 0x00, 0x00, 0x04, 0x40, 0xb5, 0x2d, + 0x21, 0x08, 0x04, 0x90, 0xaa, 0xfa, 0xff, 0x1f, 0x11, 0x01, 0x00, 0x04, + 0xf0, 0x57, 0x0a, 0x22, 0x40, 0x4a, 0xda, 0x5e, 0xfb, 0x1f, 0x40, 0x00, + 0x40, 0x20, 0xba, 0x95, 0x90, 0x00, 0x01, 0xa0, 0xaa, 0xea, 0xff, 0x5f, + 0x02, 0x02, 0x00, 0x01, 0xe8, 0x57, 0x05, 0x00, 0x00, 0x12, 0xd5, 0xfe, + 0xfd, 0x1f, 0x48, 0x00, 0x04, 0x48, 0x7a, 0x95, 0x08, 0x02, 0x10, 0x40, + 0xaa, 0x55, 0xf7, 0x1f, 0x00, 0x09, 0x20, 0x00, 0xf8, 0x57, 0x22, 0x10, + 0x00, 0x28, 0xa9, 0xfa, 0xff, 0x5f, 0x02, 0x00, 0x00, 0x49, 0xdd, 0x29, + 0x01, 0x00, 0x80, 0x80, 0xaa, 0xd7, 0xff, 0x0f, 0x10, 0x00, 0x08, 0x00, + 0xf8, 0x96, 0x08, 0x00, 0x00, 0x20, 0x54, 0xfa, 0xee, 0x3f, 0x81, 0x04, + 0x40, 0x24, 0xfe, 0x55, 0x82, 0x00, 0x00, 0x82, 0xd2, 0xad, 0xff, 0x0f, + 0x08, 0x00, 0x04, 0x80, 0x6c, 0x97, 0x00, 0x00, 0x02, 0x20, 0xa9, 0xf6, + 0xdf, 0x5f, 0x00, 0x02, 0x20, 0x09, 0xfa, 0x49, 0x12, 0x00, 0x20, 0x84, + 0x54, 0xdb, 0xfe, 0x1f, 0x91, 0x00, 0x00, 0x00, 0xf8, 0x2b, 0x00, 0x20, + 0x00, 0x40, 0xa4, 0xf6, 0xbb, 0x1f, 0x04, 0x00, 0x44, 0x92, 0x7e, 0x95, + 0x02, 0x00, 0x00, 0x89, 0xaa, 0xdd, 0xff, 0x1f, 0x20, 0x09, 0x10, 0x00, + 0xf4, 0x57, 0x20, 0x01, 0x08, 0x20, 0xa9, 0x76, 0xff, 0x5f, 0x02, 0x00, + 0x00, 0x21, 0xfc, 0x4a, 0x05, 0x00, 0x01, 0x80, 0x54, 0xdb, 0xff, 0x1e, + 0x08, 0x02, 0x04, 0x08, 0xf9, 0x2b, 0x00, 0x00, 0x40, 0x28, 0xd2, 0xf6, + 0xff, 0xbf, 0x80, 0x00, 0x90, 0x00, 0xbc, 0x92, 0x08, 0x10, 0x00, 0x82, + 0x54, 0xdb, 0xff, 0x1f, 0x20, 0x00, 0x00, 0x44, 0xf9, 0x55, 0x02, 0x01, + 0x00, 0x20, 0xaa, 0xbd, 0xfd, 0x3f, 0x08, 0x04, 0x04, 0x10, 0xf4, 0x2a, + 0x01, 0x00, 0x22, 0x80, 0xd4, 0xf6, 0xff, 0x5f, 0x82, 0x00, 0x40, 0x02, + 0xf8, 0x55, 0x20, 0x00, 0x00, 0x50, 0x6a, 0xdf, 0xfe, 0x3f, 0x00, 0x00, + 0x00, 0x48, 0xe9, 0x4a, 0x05, 0x08, 0x00, 0xa5, 0xd5, 0xf5, 0xff, 0x3f, + 0x10, 0x01, 0x10, 0x01, 0xb0, 0xab, 0x92, 0x02, 0x40, 0xf8, 0xbf, 0xde, + 0xfe, 0x5f, 0x02, 0x04, 0x04, 0x48, 0xfa, 0xd4, 0x6f, 0x20, 0x84, 0xef, + 0xff, 0xfb, 0xff, 0x1f, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xed, 0xbf, 0x0b, + 0xa1, 0x7e, 0xff, 0xbf, 0xfd, 0x5f, 0x04, 0x01, 0x20, 0x49, 0xd2, 0xfb, + 0xfe, 0x55, 0xd4, 0xff, 0xff, 0xf6, 0xff, 0x07, 0x00, 0x04, 0x00, 0x00, + 0xc0, 0xaa, 0xfb, 0x2b, 0xa2, 0xfe, 0xff, 0xdf, 0xee, 0x1f, 0x91, 0x00, + 0x82, 0xa4, 0xa4, 0xf5, 0xff, 0x57, 0xd5, 0xff, 0xbf, 0xfd, 0xff, 0x4d, + 0x00, 0x00, 0x20, 0x00, 0x88, 0x5b, 0xff, 0x2f, 0x69, 0xff, 0xff, 0xdb, + 0xfe, 0x1f, 0x24, 0x02, 0x00, 0x49, 0xa2, 0xd6, 0xff, 0x5f, 0xea, 0xff, + 0x7f, 0x7f, 0x7f, 0x0d, 0x00, 0x00, 0x10, 0x00, 0x40, 0xab, 0xf7, 0xbb, + 0xf0, 0xdf, 0xff, 0xd5, 0xff, 0xbf, 0x82, 0x04, 0x42, 0x24, 0x91, 0xd5, + 0xaa, 0xae, 0xd4, 0xaa, 0x52, 0x7b, 0xff, 0x15, 0x08, 0x00, 0x00, 0x01, + 0x04, 0x55, 0xd5, 0x55, 0x70, 0x5b, 0x75, 0xdd, 0xdf, 0x1f, 0x40, 0x00, + 0x08, 0x48, 0xa0, 0x4a, 0xa9, 0x56, 0xea, 0x56, 0xad, 0x6a, 0x7d, 0x9b, + 0x04, 0x01, 0x00, 0x02, 0x42, 0x2a, 0xd5, 0xaa, 0xa8, 0xaa, 0xaa, 0xfa, + 0xdf, 0x2f, 0x10, 0x04, 0x22, 0x48, 0x08, 0x45, 0x2a, 0x15, 0x68, 0x55, + 0x55, 0xd7, 0x76, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x40, 0x2a, 0x80, 0xa0, + 0xb2, 0x09, 0x48, 0xb9, 0xdf, 0x17, 0x22, 0x01, 0x00, 0x24, 0x45, 0x8a, + 0x24, 0x4a, 0x54, 0x51, 0x91, 0xf6, 0x6e, 0x4b, 0x00, 0x04, 0x90, 0x00, + 0x80, 0x52, 0x00, 0x20, 0x69, 0x05, 0xa4, 0xaa, 0xff, 0x1e, 0x48, 0x00, + 0x02, 0x92, 0x08, 0x05, 0x81, 0x94, 0xd4, 0x92, 0x40, 0xfd, 0xb6, 0x8b, + 0x00, 0x01, 0x40, 0x00, 0x82, 0x54, 0x00, 0x48, 0x68, 0x05, 0x90, 0xa4, + 0xef, 0x06, 0x24, 0x00, 0x08, 0x12, 0x10, 0x05, 0x00, 0x10, 0xb5, 0x01, + 0x42, 0xfb, 0xbf, 0x43, 0x00, 0x09, 0x00, 0x40, 0x81, 0xa8, 0x08, 0x4a, + 0xaa, 0x96, 0x90, 0xac, 0x6d, 0x15, 0x22, 0x00, 0x20, 0x09, 0x04, 0x15, + 0x80, 0x28, 0xdc, 0x01, 0x24, 0xfb, 0xbf, 0x01, 0x80, 0x04, 0x09, 0x00, + 0x40, 0x48, 0x02, 0x45, 0xb2, 0x2e, 0x41, 0x6d, 0xef, 0x05, 0x11, 0x00, + 0x40, 0x52, 0x02, 0x15, 0x29, 0x2a, 0xac, 0x42, 0x54, 0xfb, 0x3b, 0x51, + 0x84, 0x00, 0x08, 0x00, 0x20, 0x54, 0x80, 0x05, 0xb5, 0x3d, 0xa2, 0xb6, + 0xdf, 0x00, 0x20, 0x04, 0x20, 0x49, 0x89, 0xa8, 0x6a, 0x29, 0xac, 0xd6, + 0x54, 0xff, 0x3f, 0x84, 0x00, 0x01, 0x04, 0x10, 0x00, 0x94, 0xa8, 0x56, + 0xda, 0x5f, 0xab, 0xd5, 0x1e, 0x10, 0x48, 0x00, 0x90, 0x82, 0x48, 0xa8, + 0xb2, 0xac, 0xfd, 0x55, 0xd5, 0xfe, 0x9f, 0x80, 0x00, 0x0a, 0x02, 0x08, + 0x02, 0x55, 0x5a, 0x75, 0xff, 0xaf, 0xb6, 0xf7, 0x2d, 0x12, 0x92, 0x00, + 0x10, 0x20, 0x10, 0xa8, 0x54, 0xd5, 0xbf, 0x5d, 0xad, 0xdd, 0x0f, 0x00, + 0x00, 0x04, 0x40, 0x09, 0x84, 0xa8, 0xaa, 0x5a, 0xed, 0xeb, 0x6a, 0xff, + 0x9f, 0xa4, 0x24, 0x01, 0x02, 0xa0, 0x20, 0x50, 0x55, 0xd5, 0xbe, 0xae, + 0xad, 0xfd, 0x16, 0x00, 0x10, 0x04, 0x20, 0x0a, 0x08, 0xb4, 0xaa, 0x95, + 0xaa, 0x7b, 0xb7, 0xdb, 0x5f, 0x92, 0x04, 0x01, 0x84, 0x20, 0x21, 0x51, + 0xd5, 0x2a, 0xa9, 0xee, 0xd5, 0xfe, 0x0d, 0x00, 0x20, 0x04, 0x10, 0x00, + 0x08, 0x50, 0xe9, 0xd7, 0xd4, 0xfb, 0xb5, 0xff, 0x9f, 0x24, 0x09, 0x01, + 0x42, 0x4a, 0xa2, 0x64, 0xd5, 0x55, 0x7b, 0x7f, 0xda, 0x7d, 0x4f, 0x00, + 0x20, 0x04, 0x00, 0x80, 0x00, 0xa0, 0x2a, 0x13, 0x84, 0x6a, 0x55, 0xff, + 0x1d, 0x48, 0x8a, 0x00, 0x94, 0x24, 0x8a, 0xc8, 0xaa, 0x42, 0x20, 0x5d, + 0xf5, 0xff, 0x5f, 0x01, 0x00, 0x02, 0x01, 0x00, 0x20, 0xa2, 0x4a, 0x1a, + 0x82, 0x56, 0xda, 0xbd, 0x3f, 0x92, 0x92, 0x00, 0x90, 0x92, 0x00, 0x40, + 0x95, 0x6a, 0xf4, 0x55, 0x6d, 0xff, 0xd6, 0x00, 0x00, 0x0a, 0x04, 0x20, + 0x14, 0x49, 0x4b, 0xaa, 0xaa, 0x56, 0xf5, 0xff, 0xbf, 0xab, 0xa4, 0x00, + 0x20, 0x89, 0x40, 0x80, 0xaa, 0xaa, 0xaa, 0xaa, 0xde, 0xbf, 0xeb, 0x03, + 0x00, 0x02, 0x04, 0x02, 0x0a, 0x10, 0x2b, 0x2a, 0x55, 0x5b, 0xf5, 0xff, + 0xd7, 0x2f, 0x92, 0x00, 0x10, 0x28, 0x21, 0x01, 0x56, 0x95, 0xa0, 0x56, + 0xdf, 0xef, 0xea, 0x87, 0x40, 0x0a, 0x42, 0x41, 0x00, 0x90, 0xaa, 0x52, + 0xb6, 0xad, 0xfa, 0xff, 0xd5, 0x2f, 0x14, 0x00, 0x00, 0x04, 0x95, 0x04, + 0xaa, 0xac, 0x55, 0x6b, 0xff, 0xb7, 0xea, 0x9f, 0x40, 0x02, 0x28, 0x51, + 0x00, 0x40, 0x58, 0xd5, 0xda, 0xd6, 0x6e, 0x7f, 0xf9, 0x3f, 0x12, 0x04, + 0x02, 0x04, 0x49, 0x25, 0x55, 0xaa, 0x77, 0xab, 0xff, 0x2b, 0xfd, 0x3f, + 0x48, 0x01, 0x20, 0x41, 0x00, 0x00, 0x58, 0xa9, 0xda, 0xea, 0xfd, 0xaf, + 0xfa, 0xff, 0x02, 0x04, 0x08, 0x14, 0x29, 0x49, 0x52, 0x55, 0x55, 0x55, + 0xff, 0x8d, 0xfe, 0x3f, 0xa8, 0x00, 0x02, 0x41, 0x00, 0x02, 0xa0, 0xa2, + 0xaa, 0xea, 0xff, 0x53, 0xfd, 0xff, 0x02, 0x04, 0x50, 0x04, 0x25, 0xa8, + 0x54, 0x49, 0x52, 0xb5, 0xbf, 0x8a, 0xfe, 0xff, 0xa9, 0x08, 0x04, 0x50, + 0x80, 0x02, 0xa1, 0x2a, 0x95, 0xea, 0xff, 0xa1, 0xff, 0xff, 0x03, 0x02, + 0x90, 0x02, 0x09, 0x08, 0x44, 0x49, 0x52, 0xbd, 0x7f, 0xca, 0xff, 0xff, + 0x2b, 0x09, 0x04, 0x48, 0x40, 0x82, 0x90, 0x56, 0xa9, 0xf6, 0xbf, 0xd0, + 0xff, 0xff, 0x47, 0x00, 0x50, 0x02, 0x15, 0x11, 0x40, 0x95, 0xaa, 0xfd, + 0x2f, 0xe9, 0xff, 0xff, 0x8f, 0x0a, 0x84, 0x50, 0x40, 0x84, 0x14, 0xaa, + 0x6a, 0xff, 0x5f, 0xf2, 0xff, 0xff, 0x7f, 0x00, 0x10, 0x02, 0x09, 0x10, + 0x40, 0x7d, 0xf7, 0xff, 0x0b, 0xfc, 0xff, 0xff, 0xaf, 0x02, 0x84, 0x50, + 0x42, 0x85, 0x12, 0xd0, 0xdd, 0xff, 0xa7, 0xf2, 0xff, 0xff, 0xff, 0x04, + 0x00, 0x0a, 0x08, 0x10, 0x48, 0xf8, 0xff, 0xff, 0x0a, 0xfe, 0xff, 0xff, + 0x7f, 0x03, 0xa4, 0x80, 0xa2, 0x8a, 0x02, 0x68, 0xff, 0xff, 0x52, 0xfd, + 0xff, 0xff, 0xff, 0x07, 0x00, 0x2a, 0x08, 0x20, 0x28, 0xdc, 0xff, 0x5f, + 0x05, 0xff, 0xff, 0xff, 0xff, 0x0d, 0x92, 0x40, 0x22, 0x09, 0x02, 0xea, + 0xfb, 0xaf, 0x48, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x12, 0x81, 0xa0, + 0x48, 0x9c, 0x6e, 0x93, 0xa2, 0xff, 0xff, 0xff, 0xff, 0x07, 0xa8, 0x40, + 0x28, 0x0a, 0x02, 0x74, 0xb5, 0x45, 0x81, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x02, 0x0a, 0x81, 0x20, 0x08, 0xae, 0xaa, 0x90, 0xe8, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x90, 0x40, 0x28, 0x88, 0x12, 0x58, 0x15, 0x50, 0xd0, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x44, 0x0a, 0x41, 0x21, 0x08, 0xae, 0x04, 0x14, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x10, 0x40, 0x14, 0x88, 0x04, 0xba, + 0x02, 0x28, 0xe8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x42, 0x15, 0x41, 0x21, + 0x05, 0xad, 0x00, 0x05, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x10, 0x40, + 0x24, 0x8a, 0x0e, 0x36, 0x00, 0x0a, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x42, 0x25, 0x90, 0xd0, 0x8b, 0xc2, 0x41, 0x05, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x10, 0x08, 0x05, 0xe8, 0x8e, 0x58, 0x80, 0x02, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x4a, 0x20, 0xa8, 0xba, 0x0b, 0x2b, 0x51, 0x01, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x8a, 0x02, 0xe8, 0xaf, 0x84, + 0x90, 0x04, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x52, 0x21, 0x54, 0xbf, + 0x1f, 0x15, 0xa5, 0x02, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x08, + 0x01, 0xfa, 0xb6, 0xa4, 0x52, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x4a, 0xa2, 0x54, 0xef, 0x5f, 0x4b, 0xa4, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x80, 0x10, 0x82, 0xfe, 0xbf, 0x92, 0x52, 0x42, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x12, 0x42, 0xa8, 0xbf, 0x1f, 0x24, 0x80, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x84, 0x28, 0x8a, 0xf7, 0x37, 0x80, + 0x52, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x10, 0x82, 0xe0, 0xff, + 0x1f, 0x00, 0x20, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x84, 0x28, + 0xca, 0xff, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x10, 0x42, 0xf0, 0xfd, 0x1b, 0x00, 0x50, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0xa4, 0x10, 0xc5, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0x22, 0xf8, 0xff, 0x0e, 0x00, 0x00, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xaa, 0x88, 0xe2, 0xff, 0x0f, 0x10, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x25, 0xfa, 0xff, + 0x0f, 0x01, 0x11, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xfb, + 0xfb, 0xff, 0x7f, 0x5d, 0xd5, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f}; diff --git a/ext/tk/sample/demos-en/images/flagdown.xbm b/ext/tk/sample/demos-en/images/flagdown.xbm new file mode 100644 index 0000000000..55abc51825 --- /dev/null +++ b/ext/tk/sample/demos-en/images/flagdown.xbm @@ -0,0 +1,27 @@ +#define flagdown_width 48 +#define flagdown_height 48 +static char flagdown_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe1, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x80, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x04, + 0x00, 0x00, 0x03, 0x00, 0x06, 0x06, 0x00, 0x80, 0x01, 0x00, 0x06, 0x07, + 0x00, 0xc0, 0x1f, 0x00, 0x87, 0x07, 0x00, 0xe0, 0x7f, 0x80, 0xc7, 0x07, + 0x00, 0x70, 0xe0, 0xc0, 0xe5, 0x07, 0x00, 0x38, 0x80, 0xe1, 0x74, 0x07, + 0x00, 0x18, 0x80, 0x71, 0x3c, 0x07, 0x00, 0x0c, 0x00, 0x3b, 0x1e, 0x03, + 0x00, 0x0c, 0x00, 0x1f, 0x0f, 0x00, 0x00, 0x86, 0x1f, 0x8e, 0x07, 0x00, + 0x00, 0x06, 0x06, 0xc6, 0x05, 0x00, 0x00, 0x06, 0x00, 0xc6, 0x05, 0x00, + 0x00, 0x06, 0x00, 0xc6, 0x04, 0x00, 0x00, 0x06, 0x00, 0x06, 0x04, 0x00, + 0x7f, 0x06, 0x00, 0x06, 0xe4, 0xff, 0x00, 0x06, 0x00, 0x06, 0x04, 0x00, + 0x00, 0x06, 0x00, 0x06, 0x04, 0x00, 0x00, 0x06, 0x00, 0x06, 0x06, 0x00, + 0x00, 0x06, 0x00, 0x06, 0x03, 0x00, 0x00, 0x06, 0x00, 0x86, 0x01, 0x00, + 0x00, 0x06, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x06, 0x00, 0x66, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3e, 0x00, 0x00, + 0x00, 0xfe, 0xff, 0x2f, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x27, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, + 0xf7, 0xbf, 0x8e, 0xfc, 0xdf, 0xf8, 0x9d, 0xeb, 0x9b, 0x76, 0xd2, 0x7a, + 0x46, 0x30, 0xe2, 0x0f, 0xe1, 0x47, 0x55, 0x84, 0x48, 0x11, 0x84, 0x19}; diff --git a/ext/tk/sample/demos-en/images/flagup.xbm b/ext/tk/sample/demos-en/images/flagup.xbm new file mode 100644 index 0000000000..6eb0d846a3 --- /dev/null +++ b/ext/tk/sample/demos-en/images/flagup.xbm @@ -0,0 +1,27 @@ +#define flagup_width 48 +#define flagup_height 48 +static char flagup_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xef, 0x6a, 0x00, + 0x00, 0x00, 0xc0, 0x7b, 0x75, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x6a, 0x00, + 0x00, 0x00, 0x30, 0x60, 0x75, 0x00, 0x00, 0x00, 0x18, 0xe0, 0x7f, 0x00, + 0x00, 0x00, 0x0c, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x06, 0xe0, 0x04, 0x00, + 0x00, 0x00, 0x03, 0xe0, 0x04, 0x00, 0x00, 0x80, 0x01, 0xe0, 0x06, 0x00, + 0x00, 0xc0, 0x1f, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x7f, 0xe0, 0x07, 0x00, + 0x00, 0x70, 0xe0, 0xe0, 0x05, 0x00, 0x00, 0x38, 0x80, 0xe1, 0x04, 0x00, + 0x00, 0x18, 0x80, 0xf1, 0x04, 0x00, 0x00, 0x0c, 0x00, 0xfb, 0x04, 0x00, + 0x00, 0x0c, 0x00, 0xff, 0x04, 0x00, 0x00, 0x86, 0x1f, 0xee, 0x04, 0x00, + 0x00, 0x06, 0x06, 0xe6, 0x04, 0x00, 0x00, 0x06, 0x00, 0xe6, 0x04, 0x00, + 0x00, 0x06, 0x00, 0xe6, 0x04, 0x00, 0x00, 0x06, 0x00, 0x66, 0x04, 0x00, + 0x7f, 0x56, 0x52, 0x06, 0xe4, 0xff, 0x00, 0x76, 0x55, 0x06, 0x04, 0x00, + 0x00, 0x56, 0x57, 0x06, 0x04, 0x00, 0x00, 0x56, 0x55, 0x06, 0x06, 0x00, + 0x00, 0x56, 0xd5, 0x06, 0x03, 0x00, 0x00, 0x06, 0x00, 0x86, 0x01, 0x00, + 0x54, 0x06, 0x00, 0xc6, 0x54, 0x55, 0xaa, 0x06, 0x00, 0x66, 0xaa, 0x2a, + 0x54, 0x06, 0x00, 0x36, 0x55, 0x55, 0xaa, 0x06, 0x00, 0xbe, 0xaa, 0x2a, + 0x54, 0xfe, 0xff, 0x6f, 0x55, 0x55, 0xaa, 0xfc, 0xff, 0xa7, 0xaa, 0x2a, + 0x54, 0x01, 0x88, 0x60, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa0, 0xaa, 0x2a, + 0x54, 0x55, 0x8d, 0x60, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa0, 0xaa, 0x2a, + 0x54, 0x55, 0x8d, 0x60, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa0, 0xaa, 0x2a, + 0x54, 0x55, 0x8d, 0x50, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa8, 0xaa, 0x2a, + 0x54, 0x55, 0x95, 0x54, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a, + 0x54, 0x55, 0x55, 0x55, 0x55, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/ext/tk/sample/demos-en/images/gray25.xbm b/ext/tk/sample/demos-en/images/gray25.xbm new file mode 100644 index 0000000000..b234b3cb0b --- /dev/null +++ b/ext/tk/sample/demos-en/images/gray25.xbm @@ -0,0 +1,6 @@ +#define grey_width 16 +#define grey_height 16 +static char grey_bits[] = { + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44}; diff --git a/ext/tk/sample/demos-en/images/grey.25 b/ext/tk/sample/demos-en/images/grey.25 new file mode 100644 index 0000000000..b234b3cb0b --- /dev/null +++ b/ext/tk/sample/demos-en/images/grey.25 @@ -0,0 +1,6 @@ +#define grey_width 16 +#define grey_height 16 +static char grey_bits[] = { + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44}; diff --git a/ext/tk/sample/demos-en/images/grey.5 b/ext/tk/sample/demos-en/images/grey.5 new file mode 100644 index 0000000000..37688893f0 --- /dev/null +++ b/ext/tk/sample/demos-en/images/grey.5 @@ -0,0 +1,6 @@ +#define grey_width 16 +#define grey_height 16 +static char grey_bits[] = { + 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, + 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, + 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa}; diff --git a/ext/tk/sample/demos-en/images/letters.xbm b/ext/tk/sample/demos-en/images/letters.xbm new file mode 100644 index 0000000000..0f12568d1a --- /dev/null +++ b/ext/tk/sample/demos-en/images/letters.xbm @@ -0,0 +1,27 @@ +#define letters_width 48 +#define letters_height 48 +static char letters_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, + 0x00, 0xfa, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2a, + 0x00, 0x3a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2e, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x21, + 0xa0, 0x03, 0x00, 0x00, 0x70, 0x21, 0x20, 0x00, 0x00, 0x00, 0x50, 0x21, + 0xa0, 0x1f, 0x00, 0x00, 0x50, 0x21, 0x20, 0x00, 0x00, 0x00, 0x70, 0x21, + 0xfe, 0xff, 0xff, 0xff, 0x0f, 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x21, + 0xfa, 0x01, 0x00, 0x80, 0x0b, 0x21, 0x02, 0x00, 0x00, 0x80, 0x0a, 0x21, + 0xba, 0x01, 0x00, 0x80, 0x0a, 0x21, 0x02, 0x00, 0x00, 0x80, 0x0b, 0x21, + 0x3a, 0x00, 0x00, 0x00, 0x08, 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x21, + 0x02, 0xc0, 0xfb, 0x03, 0x08, 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x3f, + 0x02, 0xc0, 0xbd, 0x0f, 0x08, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, + 0x02, 0xc0, 0x7f, 0x7b, 0x08, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, + 0x02, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, + 0xfe, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/ext/tk/sample/demos-en/images/noletter.xbm b/ext/tk/sample/demos-en/images/noletter.xbm new file mode 100644 index 0000000000..5774124efe --- /dev/null +++ b/ext/tk/sample/demos-en/images/noletter.xbm @@ -0,0 +1,27 @@ +#define noletters_width 48 +#define noletters_height 48 +static char noletters_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00, + 0x00, 0xf0, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x7f, 0x00, + 0x00, 0x3e, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x01, + 0x80, 0x07, 0x00, 0x00, 0xc0, 0x03, 0xc0, 0x03, 0x00, 0x00, 0xe0, 0x07, + 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x78, 0x0e, + 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x1e, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x1c, + 0x38, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x38, 0x00, 0x00, 0x80, 0x07, 0x38, + 0x3c, 0xfc, 0xff, 0xff, 0x7f, 0x78, 0x1c, 0x04, 0x00, 0xe0, 0x41, 0x70, + 0x1c, 0x04, 0x00, 0xf0, 0x40, 0x70, 0x1c, 0x74, 0x00, 0x78, 0x4e, 0x70, + 0x0e, 0x04, 0x00, 0x3c, 0x4a, 0xe0, 0x0e, 0x74, 0x03, 0x1e, 0x4a, 0xe0, + 0x0e, 0x04, 0x00, 0x0f, 0x4e, 0xe0, 0x0e, 0x04, 0x80, 0x07, 0x40, 0xe0, + 0x0e, 0x04, 0xf8, 0x0f, 0x40, 0xe0, 0x0e, 0x04, 0xe0, 0x01, 0x40, 0xe0, + 0x0e, 0x04, 0xf8, 0x00, 0x40, 0xe0, 0x0e, 0x04, 0x78, 0x00, 0x40, 0xe0, + 0x0e, 0x04, 0xfc, 0xf3, 0x40, 0xe0, 0x1c, 0x04, 0x1e, 0x00, 0x40, 0x70, + 0x1c, 0x04, 0x0f, 0x00, 0x40, 0x70, 0x1c, 0x84, 0x07, 0x00, 0x40, 0x70, + 0x3c, 0xfc, 0xff, 0xff, 0x7f, 0x78, 0x38, 0xe0, 0x01, 0x00, 0x00, 0x38, + 0x38, 0xf0, 0x00, 0x00, 0x00, 0x38, 0x70, 0x78, 0x00, 0x00, 0x00, 0x1c, + 0xf0, 0x3c, 0x00, 0x00, 0x00, 0x1e, 0xe0, 0x1e, 0x00, 0x00, 0x00, 0x0e, + 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x07, 0x00, 0x00, 0x80, 0x07, + 0x80, 0x07, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x01, + 0x00, 0x3e, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x7f, 0x00, + 0x00, 0xf0, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00}; diff --git a/ext/tk/sample/demos-en/images/pattern.xbm b/ext/tk/sample/demos-en/images/pattern.xbm new file mode 100644 index 0000000000..df31baf789 --- /dev/null +++ b/ext/tk/sample/demos-en/images/pattern.xbm @@ -0,0 +1,6 @@ +#define foo_width 16 +#define foo_height 16 +static char foo_bits[] = { + 0x60, 0x06, 0x90, 0x09, 0x90, 0x09, 0xb0, 0x0d, 0x4e, 0x72, 0x49, 0x92, + 0x71, 0x8e, 0x8e, 0x71, 0x8e, 0x71, 0x71, 0x8e, 0x49, 0x92, 0x4e, 0x72, + 0xb0, 0x0d, 0x90, 0x09, 0x90, 0x09, 0x60, 0x06}; diff --git a/ext/tk/sample/demos-en/images/tcllogo.gif b/ext/tk/sample/demos-en/images/tcllogo.gif Binary files differnew file mode 100644 index 0000000000..3fc7720b17 --- /dev/null +++ b/ext/tk/sample/demos-en/images/tcllogo.gif diff --git a/ext/tk/sample/demos-en/images/teapot.ppm b/ext/tk/sample/demos-en/images/teapot.ppm new file mode 100644 index 0000000000..78afefbf82 --- /dev/null +++ b/ext/tk/sample/demos-en/images/teapot.ppm @@ -0,0 +1,56 @@ +P6 +256 256 +255 +\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[7 eOLjQLmSMoTMnSMlRMhPL_9 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\nSMtVMzYN~[N~[N\N\O\O]O]O]O]O\O\O}[NyYNtVM\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\G-wXN}[N]O^O_O`O`O`O`OaOaOaOaOaOaOaOaO`O_O^O\N\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\aMLyYN_OaPbPcPcPdPdPdPdPdPdPdPdPdPePePePePePdPcP_OpUM\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\wXN_OdPfPgQhQhQiQiQiQiQiQjQjQjQjQjQjQjQjQjQjQiQfP`O\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\NCJiQLbPhQkQmRnRoRoRoRoRoRoRoRoRpRpSqSqSrSrSrSqSoRjQ]O\KK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\fOLrUMcPlRqStSuTwTxTxTyTyTzTzUzUzUzUzUyTxTwTtSmRaOhPL\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\a0 cNLqUM\OfQpSwVzV|V}VVVVW[ew螽gqTfQ{ZNYIK9\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\O1{G#JkRMqUMtVNiSv\dbzZvUuTsSqSnRjQeP^OrUMHh>!T4\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\G-V5wE"~I#M%U+e7l:g2b*a(`(^(])^-]1S,qC$`9 R3G-\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\@)J/i>!pA"tD"wF$yH&xH&tE$wE#yG%}M+T4S5mE*Z7!K/B*;'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\aOoR{UVX<(F-a: e<!h>!j@#k@$h>"d<!c=$hD-fF2[<)K0@);'5$VV|U_LKYIK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_OxTW鵯k|X>f-^(Z'W&T&N>)F-J/b; g>#nD(jB&c<!b=%jH2_A/I0!<(8&5$JYS%8&;'?)E,<:HA=HE?IJAISFJYIKXIK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\寸nR}UqevUe,V&VC +@|>y<u:r9o7l6 +j5 +h4 +g3 +5$D,K/b; h>"wM1tK.e="a<#cA,U8&E-<(9&.!a0 b1 c1 + ++3#@)46G<:HMCIXHK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\U*vT~X{Yk+W&N$|>u:p8k5 +f3 +a0 _/ ]. [- I\*_(LkRMmSMmSMnSMnSMD,R3W5mA"|O0|P1j?"c<!a=%Y7"N1F,;'NCJNCJNDJODJODJODJh>!a: X/K% +g3 +a0 Z- \/T*Q(Hm8kRMmSMnTMoTMpTMpUM15G15G05G04G04GpUMpTM5^9 d<!yF#O+N,rC#qB"pB#k?"a: Z7 6ODJPDJPEJQEJQEJREJREJREJRFJSFJSFJSFJSFJe<!X/ +^/ V+Q(L&I$r9TlRMnSM46G47G47G46G46G46G46G46G36G36G25G25G15G04G/4F.3F +`O~[NqUM[- HUGJUGJVGJVGJVHJWHJWHJWHKWHKXHKXHKXHKXHKXHKXIKXIKXIKXIKXIKh>!Y0 + +L&C!:4 +X&pUMuWMwXNxXN<:H<:H<:H<:H<;H<;H<;H<;H=;H=;H=;H=;H>;H>;H?<H@<HA=HC>HG@ILBIREJ[JKcNLjQLpRuTzU~VWXcse{VvTpSkRgQbP_O^O]O\O\O\O\O]O]O]O]O]O]O]O]O]O]O]O\O\O~\N}[N|ZNxXNT%H$ +W&rVMvWNyYNzYN|ZN}[N}[N><H?<H?<H?<H?<H?<H@<H@<H@<HA=HA=HB=HC>HE?IG@IIAIKBIODJSFJWHKhQlRpRb(i*n+|7|6r,q+p-l+g)b(sSpSlRiQgQePcPaPaO`O`O_O_O_O_O_O_O_O_O_O_O^O^O^O^O]O]O\O~[N{ZNT% + + + + +@%<-$G?@pfdNLuWM\NdNL\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\TFJvWNaP./01E}[N]O_O`OaPbPbPcPcPcPdPdPdPePePePePfPfQfQgQgQgQhQhQhQiQiQjQjQkQkRlRlRY&\'^'^bcei gcba`^]X['Z'Y&mRmRmRlRlRlRkRkQkQjQjQjQiQiQiQiQhQhQhQhQgQgQgQgQgQfQfQfQfPePePdPcPaPO + B\\\\\\\\\\%7!!C*F#P){dYzep\OgPL\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\SFJ`LKvWNaPm6 + +\\\\\\\\\ B B +$5 `(e)nRjQ^OJAI\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\XIK^KKdNLhPLuWM]ObPfQeP +m6 +`OcPfQhQhQiQiQjQjQjQjQjQjQjQkQkQkQkRkRkRkRlRlRlRlRlRlRlRmRmRmRmRg)c(c(b(Vcei!i!db``__^Q]'_(`(f)nRnRnRnRnRnRnRnRnRnRnRnRnRmRmRmRmRmRmRmRmRmRnRmRmRnRmRmRmRmRkRhQGa0 bPmRjQfQaP}[NrUMmSML$\\\\\\\\ B B +#C, 8&H.Z7 pRjQ{ZN\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\QEJ[JK`LKdNLhQLqUM{ZN_OcPgQhQ +bPePhQiQjQjQkQkQkRkRkRlRlRlRlRlRlRlRlRlRlRmRmRmRmRmRmRmRmRmRnRnRj*g)e)d)dXghecbbbU`(a(a(c(i*oRoRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRoRoRoRoRoRoRoRoRoRoRoRoRnRmRjQQ%Z- jQnRlRhQdP_OuWMpTMnSMkRLa: \\\\\\\ B B&D2 +@*S6#G@IPDJhQmSM\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\VGJ]KKbMLeOLiQLlRMvWN\OaOePhQjQgQ +\\\\\ B'D+E$(1J/jH1NCJUGJYIKUGJ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\XHK]KKbNLfOLiQLkRMmSMoTMqUMxXN\N_ObPfPhQkQmRoRpSpRhQmRoRpSqSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSsSsSsSsSsSsSsSsSsSsSsSsStStStSuSuSuTuTuTuTuTvTwTvTvTuTtSmRtSuTuStSrSpRmRkQhQePaP^O\N{ZNvXNqUMpTMnSMlRMP%\\\\ B#C*E$.E- .!G$Y:%d<"SFJYIKZIKNCJ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\PDJZIK_LKdNLgPLjQLlRMnSMpTMqUMuWMyYN\O`OcPfPhQjQmRoRqSrSrSrSmR +!C+E'0F.4F7%8%U/lG.SFJZIK]KKZIKB=H\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\REJZJK`LKdNLgPLjQLlRMnSMpTMqUMtWMxXN{ZN~[N]O^O`OaObPdPgQiQkQlRnRpSrSsStTuTvTwTxTyTyTyTyTyTxTvTrSnRhQ|U|U|U|U|U|U|U|U|U|U|U|U|U|U}U}U}U}U}U}U}U~U~U~V~VVWXa(lRrSvTyTzU|U~VX[_djmnlhd_{[vWsUpSnRkRiQhQgQfQePdPbPaO_O^O\O|ZNxXNsVMpTMnTMmSMjQLC B)D&/F-3F47G6%>"Y7 kA$YIK]KK^KKSFJ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\VGJ\KKbMLeOLhPLkRLmSMnTMpTMrUMuWNyYN|ZN\N]O_O`OaPbPcPePfPhQjQlRnRoSqTsTuUvUwVxVyVyUzUzU{U{U{U|U|U|U|U|U{U{U{UzUzTyTyTxTwTvTvTvTvTwTwTwTxTyTzTzU{U{U|U|U}UVWY\_dlu脾|讒鍖遶覈网{sld^yZuWqUoSlRkRjQiQhQgQfQePdPcPaP`O^O]O}[NyYNuWMpTMoTMmSMkRLgPL&D#.E,3F46G;'<(D"iB(VGJ]KK`LK[JKB>H\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\NCJYIK^LKcNLfOLiQLkRMmSMoTMqUMsVMvXNzYN}[N\O^O_O`OaPcPdPePfQgQhQiQkRmSoTrUtWwYzZ}\]^^^^\ZYX~W~W~V~V~V~V~U~U~U~UUUVVVVVVVWWXZ[^adint茖z遘鶩餘薊燹~vmf`z[vXrUpToSnSlRkRkRjQiQhQfQePdPcPbP`O_O]O~[NzYNvWNpTMoTMnSMkRMhQLo7,2F36G99HC+@ ]8 nA"\JK`ML_LKSFJ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\SFJ[JK`LKdNLgPLjQLlRMnSMpTMqUMtVMwXNzZN}[N]O^O_OaObPcPdPePfQgQhQiQjRlRmSoUrWvZ{]afjnqssrqomjgca^\[YXWWWVVWWWXY[\_aehmqv筺z腓}螂覃覈薑絅|wrmhc~^yZvXtWsVqUpToSnSmRlRkRjQiQhQgQfPePcPbPaO_O^O\N{ZNwXNsVMoTMnSMlRMiQL~I#26G99G?<HA*E$ i@$ZIKaMLbML[JK;:H\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\WHJ]KKbMLeOLhPLjRLlSMnTMpTMrUMuWMxXN{ZN~\N]O^O`OaObPcPdPePfQgQhQiQkRlSmToUrWuZy]~aflsz棔礑茫覡躁蹼覓荐磽~ytojfb_\ZYXW~W~W~WXXYZ\^`bdfgijjjigda^}]|\{[yZxYvXtWsVqUpToSnSmRlRkRjQiQhQgQfPePdPbPaO_O^O\O|ZNxXNtVMpTMnSMmSMjQLgPL99G?<HG-E&b;!YIK`MLdOM`LKNCJ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\lRyT~UXYX{WtUW'[(hQlRcP\OhQL\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\NCJYIK^LKcNLfOLiQLkRLmSMoTMqUMrVMvWNyYN|ZN\N]O_O`OaPbPcPdPfPgQhQiQjRkRlSnTpUsWvZz]bglsy泙礬茘豈鏗鏗遽覘腥癸ztnid`][~Y}X|W|V{V{V{V{V{V|W|W}X}Y~Z~Z~Z}[}[}[~\~\~]~]~]~]}]|\z[yZwYvXtWsVrUpToSnSmRlRkRjQiQhQgQfQePdPcPaP`O^O]O}[NyYNuWNpTMnTMmSMkRLhPL|H$D>IQ2P+XHK_LLfQOcNLXIK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\制qSyT~V`鍮v]qSLG|>g3 +S)?*%.hQhQeP`OuWM\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\SFJ[JK`LKdNLgPLjQLlRMnSMoTMqUMsVMwXNzYN}[N\O^O_O`OaPbPdPePfPgQhQiQjRkRlSnTpVsXvZz^bgmsz泙礬茘蟄鰢鬠茗紲爐|wqlgb_\}Z{XzWyVyUxUxUxTxTxUxUxUyVyVyWzW{X{Y|Z}[}[}\~\~]~]}]|\{\z[yZwYvXtWsVrUpToSnSmRlRkRjQiQhQgQfQePdPcPbP`O_O]O~[NzZNvWNrUMoTMmSMlRMiQLeOLJAIJ(h>!]KKfQOgQN_LKD>I\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\iQtSyT{UYe鎰u|\Z'LD +|> + ++,!.! "`E6iYlZo\q]s^^Jvawbyczd{e}foTMqUMsVMuWNwXNyYN{ZN|ZN~[N\O]O]O^O_O_O`O`OaOaPbPbPcPcPcPdPdPdPdPePePePePePePePePfPfPfPfPfPfPfPePePePePePePePdPdPdPdPcPcPcPbPbPaPaO`O`O_O_O^O]O]O\O~[N|[N{ZNyYNwXNiiiihhRfQdQbPwfx]Opdkbtd_m`]OEDG?A;:@.S.S.S.S.S/S/S/S/S/S/S/S/STxTxTxTxTxTxTxTxTy/SGlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlVVVVぶぶぶぶぶEiぶぶぶぶぶぶぶぶぶぶぶぶぷぷぷぷプププBgBgBgBgBg&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|BfBfBfBfBfBfBfBfBfAfAf%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%I|%I|%I|%I|%I|%I| ++,YA5jPBpSDl[o]q^t`_Kwbycze{f}ghilSrVMtWMvWNxXNyYN{ZN|[N~[N\O]O]O^O_O_O`O`O`OaPaPbPbPbPcPcPcPcPdPdPdPdPdPdPdPdPePePePePePdPdPdPdPdPdPdPcPcPcPcPbPbPbPaPaO`O`O`O_O^O^O]O]O\O~[N|[N{ZNyYNxXNjjjjjjhSgSeRcR|`Qsfoe}jcrd`k_]LCDC=@,,3(4F(4F.S.S/S/S/S/S/S/S/STxTxTxTxTxTxTxTxTxTyTyTyHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlChChぶぶぶぶぶEiEiEiぶぶぶぶぶぶぷぷぷぷCgCgCgCgCgCgCgCgCgCgCgCgBgBg&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|BfBfBfBfBfBfBfBfBfBfBfBfBfBfBf&J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%I|%I|%I|%I|%I|#5H71O;3V?4iOBoSDsVFo]{[I^K`LbNdO{f}g~hjkTmUoVqWrWwXNxXNzYN{ZN}[N~[N\O]O]O^O^O_O_O`O`O`OaOaPaPbPbPbPbPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPbPbPbPbPaPaPaO`O`O_O_O_O^O^O]O\O\N~[N|ZN{ZNyYNoToToTnTllljUiThTfTcSvirgnfyidqdah^^HBD?<@)+3OZkMYk(5F(5F(5F/S/S/S/S/STxTxTxTxTxTxTxTxTyTyTyTyUyHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlDhDhDhCh&K}&K}&K}&K}&K}&K}ChChCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCg&J|&J|&J|&J|&J|&J|BgBgBgBfBfBfBfBfBfBfBfBfBfBfBfBfBfBfBf&J|&J|&J|&J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%I|%I|A99N?;L:2T>4gNBlRDk\n^z[J~^LaNcOdPfQgRhTjUlVnWpXrXsYqqrrrsz[z[z[{[{[{ZrqqppoyVxVxUwTwTaPbPbPbPbPbPbPbPbPbPbPbPbPbPaPaPaPaPaOaO`O`O`O_O_O^O^O^O]O]O\O~\N}[N|ZNzYNpTpUpUpUoVoVnVmVlVkVjVhVfU~cUujqh~mfugdkaad\^E@D98?$(2minffm^blV^lMYk(5F(5F/STxTxTxTxTxTxTxTxTxTyTyTyUyUyHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHl'K}'K}'K}'K}'K}'K}'K}'K}'K}&K}&K}ChChChChChChChCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCg&J|CgCgCgCgCgBgBgBgBgBgBgBfBfBfBfBfBfBfBfBfBfBfBfBf&J|&J|&J|&J|&J|&J|&J|%J|%J|%J|%J|%J|%J|%J|AeAe;GY<68I=:I82Q=4XA6~fZj\m^p`|]L`NcPeQgSjlmnoXqYrZt[rsstttz]{]{]{\{\{\{[srrqppyWonmllkkaOaOaOaOaOaOaO`O`O`O`O`O`O_O_O_O_O^O^O]O]O]O\O~\N}[N|ZNllmqVqVqVpWpWoWnnnnn~neWxltkpiykfodcf_`JDG@>C*,5$1MYktr~tstmolinadmX_lNZkMZkTxTxTxTxTxTxTxTyTyTyUyUyUyHlHlHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHm'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}DhDhDhDhChChChChChChChCgCgCgCgCgCgCgCgCgCgCg&J}&J}&J}CgCgCgCgCgCgCgCgCgCgBgBgBgBgBgBgBfBfBfBfBfBfBfBfBf&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|AfAfAfAf;GY;GY;GY1'!D:9N?;N;3]I?zdYh[l^oascuebQdRfTlmnopqrsv]w]uuuuv{^{^|^|]|]{\{\{[{[zZzZyYyXxXonnmmuTuStStStRsRsQ_O_O_O^O^O^O^O^O]O]O]OrSrSrSkllmmmnnqWqXqXooppppp}o{cXv`Vp]U}nishfhaba\_DAF::B$)4 +., 7(8'A1&F4(L8*oXIw]Jpdasfcvhexkg{mi~ojqll\Xn^Yp`Zpa[qa\rb]rc^sc^sd_ue`wf`xgayhayhayhbxyyyyyy~ywgbvfateasd`qd`pc`nb_la_ut|ssxqrunpZUXVRWROUMMSHIRIC@967-/3'+0(*-ACF?AD;=@#%( +.+>1(B3)B2&F4'E4)gTGlXJs^OzcTzaPqfethgvjhbVTcWUdXVeYWfZXg[Yh\Zi]Zi][j^\usususts~tt~tt}tt|st{stut~tt|sszrsyqrwpquoqsmpqloXTXTQWPOULLSSJEA<:=99757335./2113)+.'),)+.8:="( +"6*#5*">2)>0&A2'C3(I8-^OFbRHfUJjXMq^RwcVzfYfRDfQCdN@zdTqijrjksklrklrklrklqjmpjmpjmojmojmnimmimkhliflscYm`Xg\VbYT^VRE>;A<:>98:77645:873220/0,-/)+.*,/#%( & + +&3#.$-% .% .& /&!,#,#@70A71XNHXNHWNHWNHZRLYQLYQLXQLWQLWPLUOLSNLQMKOLJMJJ0//.-.,,-&(+"(!' + +%' %$#" ! !$ + + + + + +* + ;?E7CU;HY=I[ diff --git a/ext/tk/sample/demos-en/items.rb b/ext/tk/sample/demos-en/items.rb new file mode 100644 index 0000000000..e6bf57ee82 --- /dev/null +++ b/ext/tk/sample/demos-en/items.rb @@ -0,0 +1,374 @@ +# items.rb +# +# This demonstration script creates a canvas that displays the +# canvas item types. +# +# canvas item types widget demo (called by 'widget') +# + +# toplevel widget +if defined?($items_demo) && $items_demo + $items_demo.destroy + $items_demo = nil +end + +# demo toplevel widget +$items_demo = TkToplevel.new {|w| + title("Canvas Item Demonstration") + iconname("Items") + positionWindow(w) +} + +# label +TkLabel.new($items_demo) { + font $font + wraplength '5i' + justify 'left' + text "This window contains a canvas widget with examples of the various kinds of items supported by canvases. The following operations are supported:\n Button-1 drag:\tmoves item under pointer.\n Button-2 drag:\trepositions view.\n Button-3 drag:\tstrokes out area.\n Ctrl+f:\t\tprints items under area." +}.pack('side'=>'top') + +# frame +TkFrame.new($items_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $items_demo + $items_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'items'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame +cvs = nil +TkFrame.new($items_demo) {|cf| + # canvas + cvs = TkCanvas.new(cf) {|c| + focus + scrollregion '0c 0c 30c 24c' + width '15c' + height '10c' + relief 'sunken' + borderwidth 2 + + hs = TkScrollbar.new(cf) {|s| + orient 'horizontal' + command proc{|*args| c.xview(*args)} + c.xscrollcommand proc{|first,last| s.set first,last} + } + + vs = TkScrollbar.new(cf) {|s| + command proc{|*args| c.yview(*args)} + c.yscrollcommand proc{|first,last| s.set first,last} + } + + if $tk_version =~ /^4\.[01]/ + hs.pack('side'=>'bottom', 'fill'=>'x') + vs.pack('side'=>'right', 'fill'=>'y') + c.pack('in'=>cf, 'expand'=>'yes', 'fill'=>'both') + + else + c.grid('in'=>cf, 'row'=>0, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + vs.grid('row'=>0, 'column'=>1, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + hs.grid('row'=>1, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + TkGrid.rowconfigure(cf, 0, 'weight'=>1, 'minsize'=>0) + TkGrid.columnconfigure(cf, 0, 'weight'=>1, 'minsize'=>0) + + end + + } +}.pack('side'=>'top', 'fill'=>'both', 'expand'=>'yes') + +# Display a 3x3 rectangular grid +TkcRectangle.new(cvs, '0c', '0c', '30c', '24c', 'width'=>2) +TkcLine.new(cvs, '0c', '8c', '30c', '8c', 'width'=>2) +TkcLine.new(cvs, '0c', '16c', '30c', '16c', 'width'=>2) +TkcLine.new(cvs, '10c', '0c', '10c', '24c', 'width'=>2) +TkcLine.new(cvs, '20c', '0c', '20c', '24c', 'width'=>2) + +font1 = '-Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*' +font2 = '-Adobe-Helvetica-Bold-R-Normal--*-240-*-*-*-*-*-*' +if TkWinfo.depth($root).to_i > 1 + blue = 'DeepSkyBlue3' + red = 'red' + bisque = 'bisque3' + green = 'SeaGreen3' +else + blue = 'black' + red = 'black' + bisque = 'black' + green = 'black' +end + +# tag +$tag_item = TkcGroup.new(cvs) + +# Set up demos within each of the areas of the grid. +TkcText.new(cvs, '5c', '.2c', 'text'=>'Lines', 'anchor'=>'n') +TkcLine.new(cvs, '1c', '1c', '3c', '1c', '1c', '4c', '3c', '4c', + 'width'=>2, 'fill'=>blue, 'capstyle'=>'butt', + 'join'=>'miter', 'tags'=>$tag_item ) +TkcLine.new(cvs, '4.67c','1c','4.67c','4c', 'arrow'=>'last', 'tags'=>$tag_item) +TkcLine.new(cvs, '6.33c','1c','6.33c','4c', 'arrow'=>'both', 'tags'=>$tag_item) +TkcLine.new(cvs, '5c','6c','9c','6c','9c','1c','8c','1c','8c','4.8c','8.8c', + '4.8c','8.8c','1.2c','8.2c','1.2c','8.2c','4.6c','8.6c','4.6c', + '8.6c','1.4c','8.4c','1.4c','8.4c','4.4c', + 'width'=>3, 'fill'=>red, 'tags'=>$tag_item ) +TkcLine.new(cvs, '1c','5c','7c','5c','7c','7c','9c','7c', 'width'=>'.5c', + 'stipple'=>'@'+[$demo_dir, + 'images','gray25.xbm'].join(File::Separator), + 'arrow'=>'both', 'arrowshape'=>'15 15 7', 'tags'=>$tag_item ) +TkcLine.new(cvs, '1c','7c','1.75c','5.8c','2.5c','7c','3.25c','5.8c','4c','7c', + 'width'=>'.5c', 'capstyle'=>'round', 'join'=>'round', + 'tags'=>$tag_item ) + +TkcText.new(cvs, '15c', '.2c', + 'text'=>'Curves (smoothed lines)', 'anchor'=>'n') +TkcLine.new(cvs, '11c','4c','11.5c','1c','13.5c','1c','14c','4c', + 'smooth'=>'on', 'fill'=>blue, 'tags'=>$tag_item ) +TkcLine.new(cvs, '15.5c','1c','19.5c','1.5c','15.5c','4.5c','19.5c','4c', + 'smooth'=>'on', 'arrow'=>'both', 'width'=>3, 'tags'=>$tag_item ) +TkcLine.new(cvs, '12c','6c','13.5c','4.5c','16.5c','7.5c','18c','6c', + '16.5c','4.5c','13.5c','7.5c','12c','6c', + 'smooth'=>'on', 'width'=>'3m', 'capstyle'=>'round', + 'stipple'=>'@'+[$demo_dir, + 'images', 'gray25.xbm'].join(File::Separator), + 'fill'=>red, 'tags'=>$tag_item ) + +TkcText.new(cvs, '25c', '.2c', 'text'=>'Polygons', 'anchor'=>'n') +TkcPolygon.new(cvs, '21c','1.0c','22.5c','1.75c','24c','1.0c','23.25c','2.5c', + '24c','4.0c','22.5c','3.25c','21c','4.0c','21.75c','2.5c', + 'fill'=>'green', 'outline'=>'black', 'width'=>4, + 'tags'=>$tag_item ) +TkcPolygon.new(cvs, '25c','4c','25c','4c','25c','1c','26c','1c','27c','4c', + '28c','1c','29c','1c','29c','4c','29c','4c', + 'fill'=>red, 'smooth'=>'on', 'tags'=> $tag_item) +TkcPolygon.new(cvs, '22c','4.5c','25c','4.5c','25c','6.75c','28c','6.75c', + '28c','5.25c','24c','5.25c','24c','6.0c','26c','6c','26c', + '7.5c','22c','7.5c', + 'stipple'=>'@' + [$demo_dir, + 'images', 'gray25.xbm'].join(File::Separator), + 'outline'=>'black', 'tags'=>$tag_item ) + +TkcText.new(cvs, '5c', '8.2c', 'text'=>'Rectangles', 'anchor'=>'n') +TkcRectangle.new(cvs, '1c','9.5c','4c','12.5c', + 'outline'=>red, 'width'=>'3m', 'tags'=>$tag_item) +TkcRectangle.new(cvs, '0.5c','13.5c','4.5c','15.5c', + 'fill'=>green, 'tags'=>$tag_item ) +TkcRectangle.new(cvs, '6c','10c','9c','15c', 'outline'=>'', + 'stipple'=>'@'+[$demo_dir, + 'images','gray25.xbm'].join(File::Separator), + 'fill'=>blue, 'tags'=>$tag_item ) + +TkcText.new(cvs, '15c', '8.2c', 'text'=>'Ovals', 'anchor'=>'n') +TkcOval.new(cvs, '11c','9.5c','14c','12.5c', + 'outline'=>red, 'width'=>'3m', 'tags'=>$tag_item) +TkcOval.new(cvs, '10.5c','13.5c','14.5c','15.5c', + 'fill'=>green, 'tags'=>$tag_item ) +TkcOval.new(cvs, '16c','10c','19c','15c', 'outline'=>'', + 'stipple'=>'@'+[$demo_dir, + 'images','gray25.xbm'].join(File::Separator), + 'fill'=>blue, 'tags'=>$tag_item ) + +TkcText.new(cvs, '25c', '8.2c', 'text'=>'Text', 'anchor'=>'n') +TkcRectangle.new(cvs, '22.4c','8.9c','22.6c','9.1c') +TkcText.new(cvs, '22.5c', '9c', 'anchor'=>'n', 'font'=>font1, 'width'=>'4c', + 'text'=>'A short string of text, word-wrapped, justified left, and anchored north (at the top). The rectangles show the anchor points for each piece of text.', 'tags'=>$tag_item ) +TkcRectangle.new(cvs, '25.4c','10.9c','25.6c','11.1c') +TkcText.new(cvs, '25.5c', '11c', 'anchor'=>'w', 'font'=>font1, 'fill'=>blue, + 'text'=>'Several lines,\n each centered\nindividually,\nand all anchored\nat the left edge.', 'justify'=>'center', 'tags'=>$tag_item ) +TkcRectangle.new(cvs, '24.9c','13.9c','25.1c','14.1c') +if $tk_version =~ /^4\.[01]/ + TkcText.new(cvs, '25c', '14c', 'anchor'=>'c', 'font'=>font2, 'fill'=>red, + 'stipple'=>'@' + [$demo_dir, + 'images', 'grey.5'].join(File::Separator), + 'text'=>'Stippled characters', 'tags'=>$tag_item ) +else + TkcText.new(cvs, '25c', '14c', 'anchor'=>'c', 'font'=>font2, 'fill'=>red, + 'stipple'=>'gray50', 'text'=>'Stippled characters', + 'tags'=>$tag_item ) +end + +TkcText.new(cvs, '5c', '16.2c', 'text'=>'Arcs', 'anchor'=>'n') +TkcArc.new(cvs, '0.5c','17c','7c','20c', 'fill'=>green, 'outline'=>'black', + 'start'=>45, 'extent'=>270, 'style'=>'pieslice', 'tags'=>$tag_item) +#TkcArc.new(cvs, '6.5c','17c','9.5c','20c', 'width'=>'4m', 'style'=>'arc', +# 'outline'=>blue, 'start'=>135, 'extent'=>270, +# 'outlinestipple'=>'@' + ['images', 'grey.25'].join(File::Separator), +# 'tags'=>$tag_item) +TkcArc.new(cvs, '6.5c','17c','9.5c','20c', 'width'=>'4m', 'style'=>'arc', + 'outline'=>blue, 'start'=>135, 'extent'=>270, + 'outlinestipple'=>'@'+[$demo_dir, + 'images','gray25.xbm'].join(File::Separator), + 'tags'=>$tag_item) +TkcArc.new(cvs, '0.5c','20c','9.5c','24c', 'width'=>'4m', 'style'=>'pieslice', + 'fill'=>'', 'outline'=>red, 'start'=>225, 'extent'=>90, + 'tags'=>$tag_item) +TkcArc.new(cvs, '5.5c','20.5c','9.5c','23.5c', 'width'=>'4m', 'style'=>'chord', + 'fill'=>blue, 'outline'=>'', 'start'=>45, 'extent'=>270, + 'tags'=>$tag_item) + +TkcText.new(cvs, '15c', '16.2c', 'text'=>'Bitmaps', 'anchor'=>'n') +#TkcBitmap.new(cvs, '13c','20c', +# 'bitmap'=>'@' + ['images', 'face'].join(File::Separator), +# 'tags'=>$tag_item) +TkcBitmap.new(cvs, '13c','20c', + 'bitmap'=>'@' + [$demo_dir, + 'images', 'face.xbm'].join(File::Separator), + 'tags'=>$tag_item) +#TkcBitmap.new(cvs, '17c','18.5c', +# 'bitmap'=>'@' + ['images', 'noletters'].join(File::Separator), +# 'tags'=>$tag_item) +TkcBitmap.new(cvs, '17c','18.5c', + 'bitmap'=>'@' + [$demo_dir, + 'images', 'noletter.xbm'].join(File::Separator), + 'tags'=>$tag_item) +#TkcBitmap.new(cvs, '17c','21.5c', +# 'bitmap'=>'@' + ['images', 'letters'].join(File::Separator), +# 'tags'=>$tag_item) +# +TkcBitmap.new(cvs, '17c','21.5c') { + bitmap '@' + [$demo_dir, 'images', 'letters.xbm'].join(File::Separator) + tags $tag_item +} +#TkcBitmap.new(cvs, '17c','21.5c') { +# bitmap '@' + ['images', 'letters'].join(File::Separator) +# tags $tag_item +#} + +TkcText.new(cvs, '25c', '16.2c', 'text'=>'Windows', 'anchor'=>'n') +TkButton.new(cvs) {|b| + text 'Press Me' + command proc{butPress cvs, red} + TkcWindow.new(cvs, '21c','18c', + 'window'=>b, 'anchor'=>'nw', 'tags'=>$tag_item) +} +TkEntry.new(cvs, 'width'=>20, 'relief'=>'sunken') {|e| + insert 'end', 'Edit this text' + TkcWindow.new(cvs, '21c','21c', + 'window'=>e, 'anchor'=>'nw', 'tags'=>$tag_item) +} +TkScale.new(cvs, 'from'=>0, 'to'=>100, 'length'=>'6c', 'sliderlength'=>'.4c', + 'width'=>'.5c', 'tickinterval'=>0 ) {|s| + TkcWindow.new(cvs, '28.5c','17.5c', + 'window'=>s, 'anchor'=>'n', 'tags'=>$tag_item) +} +TkcText.new(cvs, '21c', '17.9c', 'text'=>'Button:', 'anchor'=>'sw') +TkcText.new(cvs, '21c', '20.9c', 'text'=>'Entry:', 'anchor'=>'sw') +TkcText.new(cvs, '28.5c', '17.4c', 'text'=>'Scale:', 'anchor'=>'s') + +# Set up event bindings for canvas: +cvs.itembind($tag_item, 'Any-Enter', proc{itemEnter cvs}) +cvs.itembind($tag_item, 'Any-Leave', proc{itemLeave cvs}) +cvs.bind('2', proc{|x,y| cvs.scan_mark x,y}, '%x %y') +cvs.bind('B2-Motion', proc{|x,y| cvs.scan_dragto x,y}, '%x %y') +cvs.bind('3', proc{|x,y| itemMark cvs,x,y}, '%x %y') +cvs.bind('B3-Motion', proc{|x,y| itemStroke cvs,x,y}, '%x %y') +cvs.bind('Control-f', proc{itemsUnderArea cvs}) +cvs.bind('1', proc{|x,y| itemStartDrag cvs,x,y}, '%x %y') +cvs.bind('B1-Motion', proc{|x,y| itemDrag cvs,x,y}, '%x %y') +# Utility methods for highlighting the item under the pointer + +$restoreCmd = nil +def itemEnter (c) + if TkWinfo.depth(c).to_i == 1 + $restoreCmd = nil + return + end + type = c.itemtype('current') + if type == TkcWindow + $restoreCmd = nil + return + end + if type == TkcBitmap + bg = (c.itemconfiginfo('current', 'background'))[4] + $restoreCmd = proc{c.itemconfigure 'current', 'background', bg} + c.itemconfigure 'current', 'background', 'SteelBlue2' + return + end + fill = (c.itemconfiginfo('current', 'fill'))[4] + if (type == TkcRectangle || type == TkcOval || type == TkcArc) && fill == [] + outline = (c.itemconfiginfo('current', 'outline'))[4] + $restoreCmd = proc{c.itemconfigure 'current', 'outline', outline} + c.itemconfigure 'current', 'outline', 'SteelBlue2' + else + $restoreCmd = proc{c.itemconfigure 'current', 'fill', fill} + c.itemconfigure 'current', 'fill', 'SteelBlue2' + end +end + +def itemLeave(c) + $restoreCmd.call if $restoreCmd +end + +# Utility methods for stroking out a rectangle and printing what's +# underneath the rectangle's area. + +def itemMark(c,x,y) + $areaX1 = c.canvasx(x) + $areaY1 = c.canvasy(y) + c.delete 'area' +end + +def itemStroke(c,x,y) + x = c.canvasx(x) + y = c.canvasy(y) + if $areaX1 != x && $areaY1 != y + c.delete 'area' + c.addtag_withtag 'area', TkcRectangle.new(c, $areaX1, $areaY1, x, y, + '-outline', 'black') + $areaX2 = x + $areaY2 = y + end +end + +def itemsUnderArea(c) + area = c.find_withtag('area') + items = [] + c.find_enclosed($areaX1,$areaY1,$areaX2,$areaY2).each{|i| + items.push(i) if i.gettags.include?($tag_item) + } + print "Items enclosed by area: #{items.inspect}\n"; STDOUT.flush + items.clear + c.find_overlapping($areaX1,$areaY1,$areaX2,$areaY2).each{|i| + items.push(i) if i.gettags.include?($tag_item) + } + print "Items overlapping area: #{items.inspect}\n"; STDOUT.flush +end + +$areaX1 = 0 +$areaY1 = 0 +$areaX2 = 0 +$areaY2 = 0 + +# Utility methods to support dragging of items. + +def itemStartDrag(c,x,y) + $lastX = c.canvasx(x) + $lastY = c.canvasy(y) +end + +def itemDrag(c,x,y) + x = c.canvasx(x) + y = c.canvasy(y) + c.move 'current', x - $lastX, y - $lastY + $lastX = x + $lastY = y +end + +# Method that's invoked when the button embedded in the canvas +# is invoked. + +def butPress(w,color) + i = TkcText.new(w, '25c', '18.1c', + 'text'=>'Ouch!!', 'fill'=>color, 'anchor'=>'n') + Tk.after(500, proc{w.delete i}) +end diff --git a/ext/tk/sample/demos-en/ixset b/ext/tk/sample/demos-en/ixset new file mode 100644 index 0000000000..979894fcb8 --- /dev/null +++ b/ext/tk/sample/demos-en/ixset @@ -0,0 +1,333 @@ +#!/usr/bin/env ruby + +# ixset -- +# A nice interface to "xset" to change X server settings +# + +require 'tk' + +class Xsettings + # + # Button actions + # + def quit + @root.destroy + end + + def ok + writesettings + quit + end + + def cancel + readsettings + dispsettings + end + + # apply is just "writesettings" + + + # + # Read current settings + # + def readsettings + xfd = open("|xset q", 'r') + xfd.readlines.each{|line| + fields = line.chomp.strip.split(/\s+/) + case fields[0] + when "auto" + if fields[1] == 'repeat:' + @kbdrep = fields[2] + @w_kbdrep.set(@kbdrep) + @kbdcli = fields[6] + end + + when "bell" + @bellvol = fields[2] + @bellpit = fields[5] + @belldur = fields[8] + + when "acceleration:" + @mouseacc = fields[1] + @mousethr = fields[3] + + when "prefer" + if fields[2] == 'yes' + @screenbla = 'blank' + else + @screenbla = 'noblank' + end + @w_screenbla.set(@screenbla) + + when "timeout:" + @screentim = fields[1] + @screencyc = fields[3] + + end + } + + xfd.close + end + + # + # Write settings into the X server + # + def writesettings + @bellvol = @w_bellvol.get + @bellpit = @w_bellpit.get + @belldur = @w_belldur.get + + @kbdrep = @w_kbdrep.get + if @kbdrep == 'on' + @kbdcli = @w_kbdcli.get + else + @kbdcli = 'off' + end + + @mouseacc = @w_mouseacc.get + @mousethr = @w_mousethr.get + + @screentim = @w_screentim.get + @screencyc = @w_screencyc.get + @screenbla = @w_screenbla.get + + system("xset \ + b #{@bellvol} #{@bellpit} #{@belldur} \ + c #{@kbdcli} \ + r #{@kbdrep} \ + m #{@mouseacc} #{@mousethr} \ + s #{@screentim} #{@screencyc} \ + s #{@screenbla}") + end + + # + # Sends all settings to the window + # + def dispsettings + @w_bellvol.set(@bellvol) + @w_bellpit.set(@bellpit) + @w_belldur.set(@belldur) + + @w_kbdonoff.set(@w_kbdrep.get) + @w_kbdcli.set(@kbdcli) + + @w_mouseacc.set(@mouseacc) + @w_mousethr.set(@mousethr) + + @w_screenblank.set(@w_screenbla.get) + @w_screenpat.set(@w_screenbla.get) + + @w_screentim.set(@screentim) + @w_screencyc.set(@screencyc) + end + + # + # Create all windows, and pack them + # + class LabelEntry + def initialize(parent, text, length) + @frame = TkFrame.new(parent) + TkLabel.new(@frame, 'text'=>text).pack('side'=>'left','expand'=>'y') + @entry = TkEntry.new(@frame, 'width'=>length, 'relief'=>'sunken') { + pack('side'=>'left','expand'=>'y') + } + end + def pack(keys) + @frame.pack(keys) + end + def get + @entry.value + end + def set(value) + @entry.delete(0,'end') + @entry.insert(0, value) + end + end + + def createwindows + win = self + + # + # Buttons + # + buttons = TkFrame.new(@root) {|f| + [ TkButton.new(f, 'command'=>proc{win.ok}, 'text'=>'Ok'), + TkButton.new(f, 'command'=>proc{win.writesettings}, 'text'=>'Apply'), + TkButton.new(f, 'command'=>proc{win.cancel}, 'text'=>'Cancel'), + TkButton.new(f, 'command'=>proc{win.quit}, 'text'=>'Quit') ].each{|b| + b.pack('side'=>'left', 'expand'=>'yes', 'pady'=>5) + } + } + + # + # Bell settings + # + bell = TkFrame.new(@root, 'relief'=>'raised', 'borderwidth'=>2) + l = TkLabel.new(bell, 'text'=>'Bell Settings') + @w_bellvol = TkScale.new(bell, 'from'=>0, 'to'=>100, 'length'=>200, + 'tickinterval'=>20, 'orient'=>'horizontal', + 'label'=>"Volume (%)") + + f = TkFrame.new(bell) + @w_bellpit = LabelEntry.new(f, "Pitch (Hz)", 6) + @w_bellpit.pack('side'=>'left', 'padx'=>5) + @w_belldur = LabelEntry.new(f, "Duration (ms)", 6) + @w_belldur.pack('side'=>'right', 'padx'=>5) + + l.pack('side'=>'top', 'expand'=>'yes') + @w_bellvol.pack('side'=>'top', 'expand'=>'yes') + f.pack('side'=>'top', 'expand'=>'yes') + + # + # Keyboard settings + # + kbdonoff = nil + kbdcli = nil + kbd = TkFrame.new(@root, 'relief'=>'raised', 'borderwidth'=>2) + l = TkLabel.new(kbd, 'text'=>'Keyboard Repeat Settings') + f = TkFrame.new(kbd) + @w_kbdonoff = TkCheckButton.new(f, 'text'=>'On', 'relief'=>'flat', + 'onvalue'=>'on', 'offvalue'=>'off', + 'variable'=>@w_kbdrep ) { + def self.set(value) + if value == 'on' + self.select + else + self.deselect + end + end + pack('side'=>'left', 'expand'=>'yes', 'fill'=>'both') + } + @w_kbdcli = TkScale.new(f, 'from'=>0, 'to'=>100, 'length'=>200, + 'tickinterval'=>20, 'orient'=>'horizontal', + 'label'=>'Click Volume (%)') + @w_kbdcli.pack('side'=>'left', 'expand'=>'yes') + l.pack('side'=>'top', 'expand'=>'yes') + f.pack('side'=>'top', 'expand'=>'yes', 'pady'=>2, 'fill'=>'x') + + # + # Mouse settings + # + mouse = TkFrame.new(@root, 'relief'=>'raised', 'borderwidth'=>2) + l = TkLabel.new(mouse, 'text'=>'Mouse Settings') + f = TkFrame.new(mouse) + @w_mouseacc = LabelEntry.new(f, 'Acceleration', 3) + @w_mouseacc.pack('side'=>'left') + @w_mousethr = LabelEntry.new(f, 'Threshold (pixels)', 3) + @w_mousethr.pack('side'=>'right') + l.pack('side'=>'top') + f.pack('side'=>'top', 'expand'=>'yes') + + # + # Screen Saver settings + # + screen = TkFrame.new(@root, 'relief'=>'raised', 'borderwidth'=>2) + l = TkLabel.new(screen, 'text'=>'Screen-saver Settings') + f = TkFrame.new(screen) + ff1 = TkFrame.new(f) + [ @w_screenblank = TkRadioButton.new(ff1, 'text'=>'Blank', + 'relief'=>'flat', + 'variable'=>@w_screenbla, + 'value'=>'blank') { + def self.set(value) + if value == 'blank' + self.select + else + self.deselect + end + end + }, + @w_screenpat = TkRadioButton.new(ff1, 'text'=>'Pattern', + 'relief'=>'flat', + 'variable'=>@w_screenbla, + 'value'=>'noblank') { + def self.set(value) + if value != 'blank' + self.select + else + self.deselect + end + end + } + ].each {|w| w.pack('side'=>'top', 'pady'=>2, 'anchor'=>'w') } + + ff2 = TkFrame.new(f) + [ @w_screentim = LabelEntry.new(ff2, 'Timeout (s)', 5), + @w_screencyc = LabelEntry.new(ff2, 'Cycle (s)', 5) ].each{|w| + w.pack('side'=>'top', 'pady'=>2, 'anchor'=>'e') + } + + ff1.pack('side'=>'left') + ff2.pack('side'=>'left') + + l.pack('side'=>'top') + f.pack('side'=>'top', 'expand'=>'yes') + + # + # Main window + # + buttons.pack('side'=>'top', 'fill'=>'both') + bell.pack('side'=>'top', 'fill'=>'both', 'ipady'=>5, 'expand'=>'yes') + kbd.pack('side'=>'top', 'fill'=>'both', 'ipady'=>5, 'expand'=>'yes') + mouse.pack('side'=>'top', 'fill'=>'both', 'ipady'=>5, 'expand'=>'yes') + screen.pack('side'=>'top', 'fill'=>'both', 'ipady'=>5, 'expand'=>'yes') + + # + # Let the user resize our window + # + @root.minsize(10,10) + end + + def initialize + @root = TkRoot.new + + @kbdrep = 'on' + @w_kbdrep = TkVariable.new(@kbdrep) + def @w_kbdrep.get + self.value + end + def @w_kbdrep.set(val) + self.value=val + end + + @kbdcli = 0 + + @bellvol = 100 + @bellpit = 440 + @belldur = 100 + + @mouseacc = "3/1" + @mousethr = 4 + + @screenbla = "blank" + @w_screenbla = TkVariable.new(@screenbla) + def @w_screenbla.get + self.value + end + def @w_screenbla.set(val) + self.value=val + end + + @screentim = 600 + @screencyc = 600 + + # + # Listen what "xset" tells us... + # + readsettings + + # + # Create all windows + # + createwindows + + # + # Write xset parameters + # + dispsettings + end +end + +Xsettings.new + +Tk.mainloop diff --git a/ext/tk/sample/demos-en/label.rb b/ext/tk/sample/demos-en/label.rb new file mode 100644 index 0000000000..ef1bfa6f8a --- /dev/null +++ b/ext/tk/sample/demos-en/label.rb @@ -0,0 +1,69 @@ +# label.rb +# +# This demonstration script creates a toplevel window containing +# several label widgets. +# +# label widget demo (called by 'widget') +# + +# toplevel widget +if defined?($label_demo) && $label_demo + $label_demo.destroy + $label_demo = nil +end + +# demo toplevel widget +$label_demo = TkToplevel.new {|w| + title("Label Demonstration") + iconname("label") + positionWindow(w) +} + +# label +msg = TkLabel.new($label_demo) { + font $font + wraplength '4i' + justify 'left' + text "Five labels are displayed below: three textual ones on the left, and a bitmap label and a text label on the right. Labels are pretty boring because you can't do anything with them." +} +msg.pack('side'=>'top') + +# frame +TkFrame.new($label_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $label_demo + $label_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'See Code' + command proc{showCode 'label'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# label demo +f_left = TkFrame.new($label_demo) +f_right = TkFrame.new($label_demo) +[f_left, f_right].each{|w| w.pack('side'=>'left', 'expand'=>'yes', + 'padx'=>10, 'pady'=>10, 'fill'=>'both')} + +# label +[ TkLabel.new(f_left, 'text'=>'First label'), + TkLabel.new(f_left, 'text'=>'Second label, raised', + 'relief'=>'raised'), + TkLabel.new(f_left, 'text'=>'Third label, sunken', 'relief'=>'sunken') +].each{|w| w.pack('side'=>'top', 'expand'=>'yes', 'pady'=>2, 'anchor'=>'w')} + +TkLabel.new(f_right) { + bitmap('@' + [$demo_dir,'images','face.xbm'].join(File::Separator)) + borderwidth 2 + relief 'sunken' +}.pack('side'=>'top') + +TkLabel.new(f_right) { text 'Tcl/Tk Proprietor' }.pack('side'=>'top') + diff --git a/ext/tk/sample/demos-en/menu.rb b/ext/tk/sample/demos-en/menu.rb new file mode 100644 index 0000000000..7ea3fd2ebb --- /dev/null +++ b/ext/tk/sample/demos-en/menu.rb @@ -0,0 +1,185 @@ +# +# menus widget demo (called by 'widget') +# + +# toplevel widget +if defined?($menu_demo) && $menu_demo + $menu_demo.destroy + $menu_demo = nil +end + +# demo toplevel widget +$menu_demo = TkToplevel.new {|w| + title("File Selection Dialogs") + iconname("menu") + positionWindow(w) +} + +# menu frame 生成 +$menu_frame = TkFrame.new($menu_demo, 'relief'=>'raised', 'bd'=>2) +$menu_frame.pack('side'=>'top', 'fill'=>'x') + +# label +TkLabel.new($menu_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left') { + if $tk_platform['platform'] == 'macintosh' + text("This window contains a menubar with cascaded menus. You can invoke entries with an accelerator by typing Command+x, where \"x\" is the character next to the command key symbol. The rightmost menu can be torn off into a palette by dragging outside of its bounds and releasing the mouse.") + else + text("This window contains a menubar with cascaded menus. You can post a menu from the keyboard by typing Alt+x, where \"x\" is the character underlined on the menu. You can then traverse among the menus using the arrow keys. When a menu is posted, you can invoke the current entry by typing space, or you can invoke any entry by typing its underlined character. If a menu entry has an accelerator, you can invoke the entry without posting the menu just by typing the accelerator. The rightmost menu can be torn off into a palette by selecting the first item in the menu.") + end +}.pack('side'=>'top') + +# frame +TkFrame.new($menu_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $menu_demo + $menu_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'menu'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# menu +TkMenubutton.new($menu_frame, 'text'=>'File', 'underline'=>0) {|m| + pack('side'=>'left') + TkMenu.new(m, 'tearoff'=>false) {|file_menu| + m.configure('menu'=>file_menu) + add('command', 'label'=>'Open...', 'command'=>proc{fail 'this is just a demo: no action has been defined for the "Open..." entry'}) + add('command', 'label'=>'New', 'command'=>proc{fail 'this is just a demo: no action has been defined for the "New" entry'}) + add('command', 'label'=>'Save', 'command'=>proc{fail 'this is just a demo: no action has been defined for the "Save" entry'}) + add('command', 'label'=>'Save As...', 'command'=>proc{fail 'this is just a demo: no action has been defined for the "Save As..." entry'}) + add('separator') + add('command', 'label'=>'Print Setup...', 'command'=>proc{fail 'this is just a demo: no action has been defined for the "Print Setup..." entry'}) + add('command', 'label'=>'Print...', 'command'=>proc{fail 'this is just a demo: no action has been defined for the "Print..." entry'}) + add('separator') + add('command', 'label'=>'Dismiss Menus Demo', 'command'=>proc{$menu_demo.destroy}) + } +} + +if $tk_platform['platform'] == 'macintosh' + modifier = 'Command' +elsif $tk_platform['platform'] == 'windows' + modifier = 'Control' +else + modifier = 'Meta' +end + +TkMenubutton.new($menu_frame, 'text'=>'Basic', 'underline'=>0) {|m| + pack('side'=>'left') + TkMenu.new(m, 'tearoff'=>false) {|basic_menu| + m.configure('menu'=>basic_menu) + add('command', 'label'=>'Long entry that does nothing') + ['A','B','C','D','E','F','G'].each{|c| + add('command', 'label'=>"Print letter \"#{c}\"", + 'underline'=>14, 'accelerator'=>"Meta+#{c}", + 'command'=>proc{print c,"\n"}, 'accelerator'=>"#{modifier}+#{c}") + $menu_demo.bind("#{modifier}-#{c.downcase}", proc{print c,"\n"}) + } + } +} + +TkMenubutton.new($menu_frame, 'text'=>'Cascades', 'underline'=>0) {|m| + pack('side'=>'left') + TkMenu.new(m, 'tearoff'=>false) {|cascade_menu| + m.configure('menu'=>cascade_menu) + add('command', 'label'=>'Print hello', + 'command'=>proc{print "Hello\n"}, + 'accelerator'=>"#{modifier}+H", 'underline'=>6) + $menu_demo.bind("#{modifier}-h", proc{print "Hello\n"}) + add('command', 'label'=>'Print goodbye', + 'command'=>proc{print "Goodbye\n"}, + 'accelerator'=>"#{modifier}+G", 'underline'=>6) + $menu_demo.bind("#{modifier}-g", proc{print "Goodbye\n"}) + + TkMenu.new(m, 'tearoff'=>false) {|cascade_check| + cascade_menu.add('cascade', 'label'=>'Check buttons', + 'menu'=>cascade_check, 'underline'=>0) + oil = TkVariable.new(0) + add('check', 'label'=>'Oil checked', 'variable'=>oil) + trans = TkVariable.new(0) + add('check', 'label'=>'Transmission checked', 'variable'=>trans) + brakes = TkVariable.new(0) + add('check', 'label'=>'Brakes checked', 'variable'=>brakes) + lights = TkVariable.new(0) + add('check', 'label'=>'Lights checked', 'variable'=>lights) + add('separator') + add('command', 'label'=>'Show current values', + 'command'=>proc{showVars($menu_demo, + ['oil', oil], + ['trans', trans], + ['brakes', brakes], + ['lights', lights])} ) + invoke 1 + invoke 3 + } + + TkMenu.new(m, 'tearoff'=>false) {|cascade_radio| + cascade_menu.add('cascade', 'label'=>'Radio buttons', + 'menu'=>cascade_radio, 'underline'=>0) + pointSize = TkVariable.new + add('radio', 'label'=>'10 point', 'variable'=>pointSize, 'value'=>10) + add('radio', 'label'=>'14 point', 'variable'=>pointSize, 'value'=>14) + add('radio', 'label'=>'18 point', 'variable'=>pointSize, 'value'=>18) + add('radio', 'label'=>'24 point', 'variable'=>pointSize, 'value'=>24) + add('radio', 'label'=>'32 point', 'variable'=>pointSize, 'value'=>32) + add('separator') + style = TkVariable.new + add('radio', 'label'=>'Roman', 'variable'=>style, 'value'=>'roman') + add('radio', 'label'=>'Bold', 'variable'=>style, 'value'=>'bold') + add('radio', 'label'=>'Italic', 'variable'=>style, 'value'=>'italic') + add('separator') + add('command', 'label'=>'Show current values', + 'command'=>proc{showVars($menu_demo, + ['pointSize', pointSize], + ['style', style])} ) + invoke 1 + invoke 7 + } + } +} + +TkMenubutton.new($menu_frame, 'text'=>'Icons', 'underline'=>0) {|m| + pack('side'=>'left') + TkMenu.new(m, 'tearoff'=>false) {|icon_menu| + m.configure('menu'=>icon_menu) + add('command', + 'bitmap'=>'@'+[$demo_dir,'images','pattern.xbm'].join(File::Separator), + 'command'=>proc{TkDialog.new('title'=>'Bitmap Menu Entry', + 'text'=>'The menu entry you invoked displays a bitmap rather than a text string. Other than this, it is just like any other menu entry.', + 'bitmap'=>'', 'default'=>0, + 'buttons'=>'Dismiss')} ) + ['info', 'questhead', 'error'].each{|icon| + add('command', 'bitmap'=>icon, + 'command'=>proc{print "You invoked the #{icon} bitmap\n"}) + } + } +} + +TkMenubutton.new($menu_frame, 'text'=>'More', 'underline'=>0) {|m| + pack('side'=>'left') + TkMenu.new(m, 'tearoff'=>false) {|more_menu| + m.configure('menu'=>more_menu) + [ 'An entry','Another entry','Does nothing','Does almost nothing', + 'Make life meaningful' ].each{|i| + add('command', 'label'=>i, + 'command'=>proc{print "You invoked \"#{i}\"\n"}) + } + } +} + +TkMenubutton.new($menu_frame, 'text'=>'Colors', 'underline'=>0) {|m| + pack('side'=>'left') + TkMenu.new(m) {|colors_menu| + m.configure('menu'=>colors_menu) + ['red', 'orange', 'yellow', 'green', 'blue'].each{|c| + add('command', 'label'=>c, 'background'=>c, + 'command'=>proc{print "You invoked \"#{c}\"\n"}) + } + } +} diff --git a/ext/tk/sample/demos-en/menubu.rb b/ext/tk/sample/demos-en/menubu.rb new file mode 100644 index 0000000000..4c19aa12a8 --- /dev/null +++ b/ext/tk/sample/demos-en/menubu.rb @@ -0,0 +1,225 @@ +# menubutton.rb +# +# This demonstration script creates a window with a bunch of menus +# and cascaded menus using menubuttons. + +require "tkcanvas" + +def optionMenu(menubutton, varName, firstValue, *rest) + varName.value = firstValue + configoptions = {'textvariable'=>varName,'indicatoron'=>'on', + 'relief'=>'raised','borderwidth'=>2,'highlightthickness'=>2, + 'anchor'=>'c','direction'=>'flush'} + configoptions.each {|key, value| + menubutton.configure(key, value) + } + menu = TkMenu.new(menubutton) { + tearoff 'off' + add 'radio', 'label'=>firstValue, 'variable'=>varName + } + menubutton.menu(menu) + for i in rest + menu.add 'radio', 'label'=>i, 'variable'=>varName + end + + return menu +end + +if defined?($menubu_demo) && $menubu_demo + $menubu_demo.destroy + $menubu_demo = nil +end + +$menubu_demo = TkToplevel.new {|w| + title("Menu Button Demonstration") + iconname("menubutton") +} + +positionWindow($menubu_demo) + +# version check +if $tk_version.to_f < 8.0 + +# label +TkLabel.new($menubu_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left') { + text("This is a demonstration of menubuttons. The \"Below\" menubutton pops its menu below the button; the \"Right\" button pops to the right, etc. There are two option menus directly below this text; one is just a standard menu and the other is a 16-color palette.") +}.pack('side'=>'top') + +# frame +TkFrame.new($menubu_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $menubu_demo + $menubu_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'menu'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +else ; # Tk8.x + +body = TkFrame.new($menubu_demo) +body.pack('expand'=>'yes', 'fill'=>'both') + +below = TkMenubutton.new(body) { + text "Below" + underline 0 + direction 'below' + relief 'raised' +} +belowMenu = TkMenu.new(below) { + tearoff 0 + add 'command', 'label'=>"Below menu: first item", 'command'=>proc {puts "\"You have selected the first item from the Below menu.\""} + add 'command', 'label'=>"Below menu: second item", 'command'=>proc {puts "\"You have selected the second item from the Below menu.\""} +} +below.menu(belowMenu) +below.grid('row'=>0, 'column'=>1, 'sticky'=>'n') + +below = TkMenubutton.new(body) { + text "Below" + underline 0 + direction 'below' + relief 'raised' +} +belowMenu = TkMenu.new(below) { + tearoff 0 + add 'command', 'label'=>"Below menu: first item", 'command'=>proc {puts "\"You have selected the first item from the Below menu.\""} + add 'command', 'label'=>"Below menu: second item", 'command'=>proc {puts "\"You have selected the second item from the Below menu.\""} +} +below.menu(belowMenu) +below.grid('row'=>0, 'column'=>1, 'sticky'=>'n') + +below = TkMenubutton.new(body) { + text "Below" + underline 0 + direction 'below' + relief 'raised' +} +belowMenu = TkMenu.new(below) { + tearoff 0 + add 'command', 'label'=>"Below menu: first item", 'command'=>proc {puts "\"You have selected the first item from the Below menu.\""} + add 'command', 'label'=>"Below menu: second item", 'command'=>proc {puts "\"You have selected the second item from the Below menu.\""} +} +below.menu(belowMenu) +below.grid('row'=>0, 'column'=>1, 'sticky'=>'n') + +right = TkMenubutton.new(body) { + text "Right" + underline 0 + direction 'right' + relief 'raised' +} +rightMenu = TkMenu.new(right) { + tearoff 0 + add 'command', 'label'=>"Right menu: first item", 'command'=>proc {puts "\"You have selected the first item from the Left menu.\""} + add 'command', 'label'=>"Right menu: second item", 'command'=>proc {puts "\"You have selected the second item from the Right menu.\""} +} +right.menu(rightMenu) +right.grid('row'=>1, 'column'=>0, 'sticky'=>'w') + +left = TkMenubutton.new(body) { + text "Left" + underline 0 + direction 'left' + relief 'raised' +} +leftMenu = TkMenu.new(left) { + tearoff 0 + add 'command', 'label'=>"Left menu: first item", 'command'=>proc {puts "\"You have selected the first item from the Left menu.\""} + add 'command', 'label'=>"Left menu: second item", 'command'=>proc {puts "\"You have selected the second item from the Left menu.\""} +} +left.menu(leftMenu) +left.grid('row'=>1, 'column'=>2, 'sticky'=>'e') + +center = TkFrame.new(body) { + grid('row'=>1, 'column'=>1, 'sticky'=>'news') +} + +above = TkMenubutton.new(body) { + text "Above" + underline 0 + direction 'above' + relief 'raised' +} +aboveMenu = TkMenu.new(above) { + tearoff 0 + add 'command', 'label'=>"Above menu: first item", 'command'=>proc {puts "\"You have selected the first item from the Above menu.\""} + add 'command', 'label'=>"Above menu: second item", 'command'=>proc {puts "\"You have selected the second item from the Above menu.\""} +} +above.menu(aboveMenu) +above.grid('row'=>2, 'column'=>1, 'sticky'=>'s') + +center = TkFrame.new(body) { + grid('row'=>1, 'column'=>1, 'sticky'=>'news') +} + +TkFrame.new($menubu_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc { + tmppath = $menubu_demo + $menubu_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc { showCode 'menubu' } + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'expand'=>'yes', 'fill'=>'x', 'pady'=>'2m') + +msg = TkLabel.new(center) { +# font $font + wraplength '4i' + justify 'left' + text "This is a demonstration of menubuttons. The \"Below\" menubutton pops its menu below the button; the \"Right\" button pops to the right, etc. There are two option menus directly below this text; one is just a standard menu and the other is a 16-color palette." +} +msg.pack('side'=>'top', 'padx'=>25, 'pady'=>25) + +TkFrame.new(center) {|f| + menubuttonoptions = TkVariable.new + mbutton = TkMenubutton.new(f) + options = optionMenu(mbutton, menubuttonoptions, + 'one', 'two', 'three') + mbutton.pack('side'=>'left', 'padx'=>25, 'pady'=>25) + paletteColor = TkVariable.new + colors = ['Black','red4','DarkGreen','NavyBlue', 'gray75', + 'Red','Green','Blue','gray50','Yellow','Cyan','Magenta', + 'White','Brown','DarkSeaGreen','DarkViolet'] + colorMenuButton = TkMenubutton.new(f) + m = optionMenu(colorMenuButton, paletteColor, *colors) + topBorderColor = 'gray50' + bottomBorderColor = 'gray75' + for i in 0..15 + image = TkPhotoImage.new('height'=>16, 'width'=>16) + image.put(topBorderColor, 0, 0, 16, 1) + image.put(topBorderColor, 0, 1, 1, 16) + image.put(bottomBorderColor, 0, 15, 16, 16) + image.put(bottomBorderColor, 15, 1, 16, 16) + image.put(colors[i], 1, 1, 15, 15) + + selectimage = TkPhotoImage.new('height'=>16, 'width'=>16) + selectimage.put('Black', 0, 0, 16, 2) + selectimage.put('Black', 0, 2, 2, 16) + selectimage.put('Black', 2, 14, 16, 16) + selectimage.put('Black', 14, 2, 16, 14) + selectimage.put(colors[i], 2, 2, 14, 14) + + m.entryconfigure(i, 'image'=>image, 'selectimage'=>selectimage, 'hidemargin'=>'on') + end + m.configure('tearoff', 'on') + for c in ['Black', 'gray75', 'gray50', 'White'] + m.entryconfigure(c, 'columnbreak'=>1) + end + colorMenuButton.pack('side'=>'left', 'padx'=>25, 'pady'=>25) + pack 'padx'=>25, 'pady'=>25 +} + +end ; # Tk8.x diff --git a/ext/tk/sample/demos-en/msgbox.rb b/ext/tk/sample/demos-en/msgbox.rb new file mode 100644 index 0000000000..4152477e67 --- /dev/null +++ b/ext/tk/sample/demos-en/msgbox.rb @@ -0,0 +1,88 @@ +# msgbox.rb +# +# This demonstration script creates message boxes of various type +# +# message boxes widget demo (called by 'widget') +# + +# toplevel widget +if defined?($msgbox_demo) && $msgbox_demo + $msgbox_demo.destroy + $msgbox_demo = nil +end + +# demo toplevel widget +$msgbox_demo = TkToplevel.new {|w| + title("Message Box Demonstration") + iconname("messagebox") + positionWindow(w) +} + +# label +TkLabel.new($msgbox_demo, 'font'=>$font, 'wraplength'=>'4i', 'justify'=>'left', + 'text'=>"Choose the icon and type option of the message box. Then press the \"Message Box\" button to see the message box.").pack('side'=>'top') + +# frame +TkFrame.new($msgbox_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $msgbox_demo + $msgbox_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'msgbox'} + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Message Box' + command proc{showMessageBox $msgbox_demo} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame +$msgbox_leftframe = TkFrame.new($msgbox_demo) +$msgbox_rightframe = TkFrame.new($msgbox_demo) +$msgbox_leftframe .pack('side'=>'left', 'expand'=>'yes', 'fill'=>'y', + 'pady'=>'.5c', 'padx'=>'.5c') +$msgbox_rightframe.pack('side'=>'left', 'expand'=>'yes', 'fill'=>'y', + 'pady'=>'.5c', 'padx'=>'.5c') + +TkLabel.new($msgbox_leftframe, 'text'=>'Icon').pack('side'=>'top') +TkFrame.new($msgbox_leftframe, 'relief'=>'ridge', 'bd'=>1, 'height'=>2)\ +.pack('side'=>'top', 'fill'=>'x', 'expand'=>'no') + +$msgboxIcon = TkVariable.new('info') +['error', 'info', 'question', 'warning'].each {|icon| + TkRadioButton.new($msgbox_leftframe, 'text'=>icon, 'variable'=>$msgboxIcon, + 'relief'=>'flat', 'value'=>icon, 'width'=>16, + 'anchor'=>'w').pack('side'=>'top', 'pady'=>2, + 'anchor'=>'w', 'fill'=>'x') +} + +TkLabel.new($msgbox_rightframe, 'text'=>'Type').pack('side'=>'top') +TkFrame.new($msgbox_rightframe, 'relief'=>'ridge', 'bd'=>1, 'height'=>2)\ +.pack('side'=>'top', 'fill'=>'x', 'expand'=>'no') + +$msgboxType = TkVariable.new('ok') +['abortretryignore', 'ok', 'okcancel', + 'retrycancel', 'yesno', 'yesnocancel'].each {|type| + TkRadioButton.new($msgbox_rightframe, 'text'=>type, 'variable'=>$msgboxType, + 'relief'=>'flat', 'value'=>type, 'width'=>16, + 'anchor'=>'w').pack('side'=>'top', 'pady'=>2, + 'anchor'=>'w', 'fill'=>'x') +} + +def showMessageBox(w) + button = Tk.messageBox('icon'=>$msgboxIcon.value, 'type'=>$msgboxType.value, + 'title'=>'Message', 'parent'=>w, + 'message'=>"This is a \"#{$msgboxType.value}\" type messagebox with the \"#{$msgboxIcon.value}\" icon") + + Tk.messageBox('icon'=>'info', 'type'=>'ok', 'parent'=>w, + 'message'=>"You have selected \"#{button}\"") +end + diff --git a/ext/tk/sample/demos-en/patch_1.1c1 b/ext/tk/sample/demos-en/patch_1.1c1 new file mode 100644 index 0000000000..d3952e71eb --- /dev/null +++ b/ext/tk/sample/demos-en/patch_1.1c1 @@ -0,0 +1,93 @@ +--- /usr/src/ruby-1.1c1/lib/tkcanvas.rb Tue Jul 21 18:18:02 1998 ++++ tkcanvas.rb Fri Jul 24 20:38:24 1998 +@@ -310,7 +310,7 @@ + || key == 'latinfont' || key == 'asciifont' ) + tagfont_configure(tagid(tagOrId), {key=>value}) + else +- tk_call 'itemconfigure', tagid(tagOrId), "-#{key}", value ++ tk_send 'itemconfigure', tagid(tagOrId), "-#{key}", value + end + end + end +--- /usr/src/ruby-1.1c1/lib/tkfont.rb Fri Jul 17 23:43:28 1998 ++++ tkfont.rb Fri Jul 24 17:46:22 1998 +@@ -42,7 +42,7 @@ + r | [] + + when /^8\.*/ +- list(tk_call('font', 'names')) ++ tk_split_simplelist(tk_call('font', 'names')) + + end + end +@@ -89,10 +89,14 @@ + if fnt == [] + TkFont.new(nil, nil).call_font_configure(path, *(args + [{}])) + else +- compound = Hash[*list(tk_call('font', 'configure', +- fnt))].collect{|key,value| +- [key[1..-1], value] +- }.assoc('compound')[1] ++ begin ++ compound = Hash[*list(tk_call('font', 'configure', ++ fnt))].collect{|key,value| ++ [key[1..-1], value] ++ }.assoc('compound')[1] ++ rescue ++ compound = [] ++ end + if compound == [] + TkFont.new(fnt, DEFAULT_KANJI_FONT_NAME) \ + .call_font_configure(path, *(args + [{}])) +@@ -156,14 +160,19 @@ + elsif font.kind_of? Array + finfo = {} + finfo['family'] = font[0].to_s +- if font[1] && font[1] != '0' && font[1] =~ /^(|\+|-)([0-9]+)$/ +- if $1 == '-' +- finfo['pixels'] = font[1].to_s ++ if font[1] ++ fsize = font[1].to_s ++ if fsize != '0' && fsize =~ /^(|\+|-)([0-9]+)$/ ++ if $1 == '-' ++ finfo['pixels'] = $2 ++ else ++ finfo['points'] = $2 ++ end + else +- finfo['points'] = font[1].to_s ++ finfo['points'] = '13' + end + end +- finfo[2..-1].each{|style| ++ font[2..-1].each{|style| + case (style) + when 'normal' + finfo['weight'] = style +@@ -199,16 +208,19 @@ + elsif font.kind_of? Array + finfo = {} + finfo['family'] = font[0].to_s +- if font[1] && font[1] != '0' && font[1] =~ /^(|\+|-)([0-9]+)$/ +- if $1 == '-' +- finfo['pixels'] = $2 ++ if font[1] ++ fsize = font[1].to_s ++ if fsize != '0' && fsize =~ /^(|\+|-)([0-9]+)$/ ++ if $1 == '-' ++ finfo['pixels'] = $2 ++ else ++ finfo['points'] = $2 ++ end + else +- finfo['points'] = $2 ++ finfo['points'] = '13' + end +- else +- finfo['points'] = '13' + end +- finfo[2..-1].each{|style| ++ font[2..-1].each{|style| + case (style) + when 'normal' + finfo['weight'] = style diff --git a/ext/tk/sample/demos-en/plot.rb b/ext/tk/sample/demos-en/plot.rb new file mode 100644 index 0000000000..fb887011a7 --- /dev/null +++ b/ext/tk/sample/demos-en/plot.rb @@ -0,0 +1,122 @@ +# plot.rb +# +# This demonstration script creates a canvas widget showing a 2-D +# plot with data points that can be dragged with the mouse. +# +# 2-D plot widget demo (called by 'widget') +# + +# toplevel widget +if defined?($plot_demo) && $plot_demo + $plot_demo.destroy + $plot_demo = nil +end + +# demo toplevel widget +$plot_demo = TkToplevel.new {|w| + title("Plot Demonstration") + iconname("Plot") + positionWindow(w) +} + +# label +TkLabel.new($plot_demo, 'font'=>$font, 'wraplength'=>'4i', 'justify'=>'left', + 'text'=>"This window displays a canvas widget containing a simple 2-dimensional plot. You can doctor the data by dragging any of the points with mouse button 1."){ + pack('side'=>'top') +} + +# frame +$plot_buttons = TkFrame.new($plot_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $plot_demo + $plot_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'plot'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$plot_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# font +plotFont = '-*-Helvetica-Medium-R-Normal--*-180-*-*-*-*-*-*' + +# canvas +$plot_canvas = TkCanvas.new($plot_demo,'relief'=>'raised','width'=>450,'height'=>300) +$plot_canvas.pack('side'=>'top', 'fill'=>'x') + +# plot +TkcLine.new($plot_canvas, 100, 250, 400, 250, 'width'=>2) +TkcLine.new($plot_canvas, 100, 250, 100, 50, 'width'=>2) +TkcText.new($plot_canvas, 225, 20, + 'text'=>"A Simple Plot", 'font'=>plotFont, 'fill'=>'brown') + +(0..10).each {|i| + x = 100 + (i * 30) + TkcLine.new($plot_canvas, x, 250, x, 245, 'width'=>2) + TkcText.new($plot_canvas, x, 254, + 'text'=>10*i, 'font'=>plotFont, 'anchor'=>'n') +} +(0..5).each {|i| + y = 250 - (i * 40) + TkcLine.new($plot_canvas, 100, y, 105, y, 'width'=>2) + TkcText.new($plot_canvas, 96, y, + 'text'=>"#{i*50}.0", 'font'=>plotFont, 'anchor'=>'e') +} + +for xx, yy in [[12,56],[20,94],[33,98],[32,120],[61,180],[75,160],[98,223]] + x = 100 + (3*xx) + y = 250 - (4*yy)/5 + item = TkcOval.new($plot_canvas, x-6, y-6, x+6, y+6, + 'width'=>1, 'outline'=>'black', 'fill'=>'SkyBlue2') + item.addtag 'point' +end + +$plot_canvas.itembind('point', 'Any-Enter', + proc{$plot_canvas.itemconfigure 'current','fill','red'}) +$plot_canvas.itembind('point', 'Any-Leave', + proc{$plot_canvas.itemconfigure 'current','fill','SkyBlue2'}) +$plot_canvas.itembind('point', '1', + proc{|x,y| plotDown $plot_canvas,x,y}, "%x %y") +$plot_canvas.itembind('point', 'ButtonRelease-1', + proc{$plot_canvas.dtag 'selected'}) +$plot_canvas.bind('B1-Motion', + proc{|x,y| plotMove $plot_canvas,x,y}, "%x %y") + +$plot = {'lastX'=>0, 'lastY'=>0} + +# plotDown -- +# This method is invoked when the mouse is pressed over one of the +# data points. It sets up state to allow the point to be dragged. +# +# Arguments: +# w - The canvas window. +# x, y - The coordinates of the mouse press. + +def plotDown (w, x, y) + w.dtag 'selected' + w.addtag_withtag 'selected', 'current' + w.raise 'current' + $plot['lastX'] = x + $plot['lastY'] = y +end + +# plotMove -- +# This method is invoked during mouse motion events. It drags the +# current item. +# +# Arguments: +# w - The canvas window. +# x, y - The coordinates of the mouse. + +def plotMove (w, x, y) + w.move 'selected', x - $plot['lastX'], y - $plot['lastY'] + $plot['lastX'] = x + $plot['lastY'] = y +end + diff --git a/ext/tk/sample/demos-en/puzzle.rb b/ext/tk/sample/demos-en/puzzle.rb new file mode 100644 index 0000000000..91e4c8c1fb --- /dev/null +++ b/ext/tk/sample/demos-en/puzzle.rb @@ -0,0 +1,111 @@ +# puzzle.rb +# +# This demonstration script creates a 15-puzzle game using a collection +# of buttons. +# +# widet demo 'puzzle' (called by 'widget') +# + +# toplevel widget +if defined?($puzzle_demo) && $puzzle_demo + $puzzle_demo.destroy + $puzzle_demo = nil +end + +# demo toplevel widget +$puzzle_demo = TkToplevel.new {|w| + title("15-Puzzle Demonstration") + iconname("15-Puzzle") + positionWindow(w) +} + +# label +msg = TkLabel.new($puzzle_demo) { + font $font + wraplength '4i' + justify 'left' + text "A 15-puzzle appears below as a collection of buttons. Click on any of the pieces next to the space, and that piece will slide over the space. Continue this until the pieces are arranged in numerical order from upper-left to lower-right." +} +msg.pack('side'=>'top') + +# frame +TkFrame.new($puzzle_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $puzzle_demo + $puzzle_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'puzzle'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame + +# Special trick: select a darker color for the space by creating a +# scrollbar widget and using its trough color. + +s = TkScrollbar.new($puzzle_demo) +base = TkFrame.new($puzzle_demo) { + width 120 + height 120 + borderwidth 2 + relief 'sunken' + bg s['troughcolor'] +} +s.destroy +base.pack('side'=>'top', 'padx'=>'1c', 'pady'=>'1c') + +def def_puzzleswitch_proc(w, num) + proc{puzzleSwitch w, num} +end + +$xpos = {} +$ypos = {} +order = [3,1,6,2,5,7,15,13,4,11,8,9,14,10,12] +(0..14).each{|i| + num = order[i] + $xpos[num] = (i % 4) * 0.25 + $ypos[num] = (i / 4) * 0.25 + TkButton.new(base) {|w| + relief 'raised' + text num + highlightthickness 0 + command def_puzzleswitch_proc(w, num) + }.place('relx'=>$xpos[num], 'rely'=>$ypos[num], + 'relwidth'=>0.25, 'relheight'=>0.25) +} +$xpos['space'] = 0.75 +$ypos['space'] = 0.75 + + +# puzzleSwitch -- +# This procedure is invoked when the user clicks on a particular button; +# if the button is next to the empty space, it moves the button into the +# empty space. + +def puzzleSwitch(w, num) + if ( ($ypos[num] >= ($ypos['space'] - 0.01)) \ + && ($ypos[num] <= ($ypos['space'] + 0.01)) \ + && ($xpos[num] >= ($xpos['space'] - 0.26)) \ + && ($xpos[num] <= ($xpos['space'] + 0.26))) \ + || (($xpos[num] >= ($xpos['space'] - 0.01)) \ + && ($xpos[num] <= ($xpos['space'] + 0.01)) \ + && ($ypos[num] >= ($ypos['space'] - 0.26)) \ + && ($ypos[num] <= ($ypos['space'] + 0.26))) + tmp = $xpos['space'] + $xpos['space'] = $xpos[num] + $xpos[num] = tmp + tmp = $ypos['space'] + $ypos['space'] = $ypos[num] + $ypos[num] = tmp + w.place('relx'=>$xpos[num], 'rely'=>$ypos[num]) + end +end + diff --git a/ext/tk/sample/demos-en/radio.rb b/ext/tk/sample/demos-en/radio.rb new file mode 100644 index 0000000000..96cdc4c54a --- /dev/null +++ b/ext/tk/sample/demos-en/radio.rb @@ -0,0 +1,84 @@ +# radio.rb +# +# This demonstration script creates a toplevel window containing +# several radiobutton widgets. +# +# radiobutton widget demo (called by 'widget') +# + +# toplevel widget +if defined?($radio_demo) && $radio_demo + $radio_demo.destroy + $radio_demo = nil +end + +# demo toplevel widget +$radio_demo = TkToplevel.new {|w| + title("Radiobutton Demonstration") + iconname("radio") + positionWindow(w) +} + +# label +msg = TkLabel.new($radio_demo) { + font $font + wraplength '4i' + justify 'left' + text "Two groups of radiobuttons are displayed below. If you click on a button then the button will become selected exclusively among all the buttons in its group. A Tcl variable is associated with each group to indicate which of the group's buttons is selected. Click the \"See Variables\" button to see the current values of the variables." +} +msg.pack('side'=>'top') + +# +size = TkVariable.new +color = TkVariable.new + +# frame +TkFrame.new($radio_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $radio_demo + $radio_demo = nil + $showVarsWin[tmppath.path] = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'radio'} + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'See Variables' + command proc{ + showVars($radio_demo, ['size', size], ['color', color]) + } + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame +f_left = TkFrame.new($radio_demo) +f_right = TkFrame.new($radio_demo) +f_left.pack('side'=>'left', 'expand'=>'yes', 'padx'=>'.5c', 'pady'=>'.5c') +f_right.pack('side'=>'left', 'expand'=>'yes', 'padx'=>'.5c', 'pady'=>'.5c') + +# radiobutton +[10, 12, 18, 24].each {|sz| + TkRadioButton.new(f_left) { + text "Point Size #{sz}" + variable size + relief 'flat' + value sz + }.pack('side'=>'top', 'pady'=>2, 'anchor'=>'w') +} + +['Red', 'Green', 'Blue', 'Yellow', 'Orange', 'Purple'].each {|col| + TkRadioButton.new(f_right) { + text col + variable color + relief 'flat' + value col.downcase + }.pack('side'=>'top', 'pady'=>2, 'anchor'=>'w') +} + diff --git a/ext/tk/sample/demos-en/rmt b/ext/tk/sample/demos-en/rmt new file mode 100644 index 0000000000..d4b1d93760 --- /dev/null +++ b/ext/tk/sample/demos-en/rmt @@ -0,0 +1,265 @@ +#!/usr/bin/env ruby + +# rmt -- +# This script implements a simple remote-control mechanism for +# Tk applications. It allows you to select an application and +# then type commands to that application. + +require 'tk' + +class Rmt + def initialize(parent=nil) + win = self + + unless parent + parent = TkRoot.new + end + root = TkWinfo.toplevel(parent) + root.minsize(1,1) + + # The instance variable below keeps track of the remote application + # that we're sending to. If it's an empty string then we execute + # the commands locally. + @app = 'local' + @mode = 'Ruby' + + # The instance variable below keeps track of whether we're in the + # middle of executing a command entered via the text. + @executing = 0 + + # The instance variable below keeps track of the last command executed, + # so it can be re-executed in response to !! commands. + @lastCommand = "" + + # Create menu bar. Arrange to recreate all the information in the + # applications sub-menu whenever it is cascaded to. + + TkFrame.new(root, 'relief'=>'raised', 'bd'=>2) {|f| + pack('side'=>'top', 'fill'=>'x') + TkMenubutton.new(f, 'text'=>'File', 'underline'=>0) {|mb| + TkMenu.new(mb) {|mf| + mb.menu(mf) + TkMenu.new(mf) {|ma| + postcommand proc{win.fillAppsMenu ma} + mf.add('cascade', 'label'=>'Select Application', + 'menu'=>ma, 'underline'=>0) + } + add('command', 'label'=>'Quit', + 'command'=>proc{root.destroy}, 'underline'=>0) + } + pack('side'=>'left') + } + } + + # Create text window and scrollbar. + + @txt = TkText.new(root, 'relief'=>'sunken', 'bd'=>2, 'setgrid'=>true) {|t| + TkScrollbar.new(root, 'command'=>proc{|*args| t.yview *args}) { + pack('side'=>'right', 'fill'=>'both') + } + pack('side'=>'left') + } + + @promptEnd = TkTextMark.new(@txt, 'insert') + + # Create a binding to forward commands to the target application, + # plus modify many of the built-in bindings so that only information + # in the current command can be deleted (can still set the cursor + # earlier in the text and select and insert; just can't delete). + + @txt.bindtags([@txt, TkText, root, 'all']) + @txt.bind('Return', proc{ + @txt.set_insert('end - 1c') + @txt.insert('insert', "\n") + win.invoke + Tk.callback_break + }) + @txt.bind('Delete', proc{ + begin + @txt.tag_remove('sel', 'sel.first', @promptEnd) + rescue + end + if @txt.tag_nextrange('sel', '1.0', 'end') == [] + if @txt.compare('insert', '<', @promptEnd) + Tk.callback_break + end + end + }) + @txt.bind('BackSpace', proc{ + begin + @txt.tag_remove('sel', 'sel.first', @promptEnd) + rescue + end + if @txt.tag_nextrange('sel', '1.0', 'end') == [] + if @txt.compare('insert', '<', @promptEnd) + Tk.callback_break + end + end + }) + @txt.bind('Control-d', proc{ + if @txt.compare('insert', '<', @promptEnd) + Tk.callback_break + end + }) + @txt.bind('Control-k', proc{ + if @txt.compare('insert', '<', @promptEnd) + @txt.set_insert(@promptEnd) + end + }) + @txt.bind('Control-t', proc{ + if @txt.compare('insert', '<', @promptEnd) + Tk.callback_break + end + }) + @txt.bind('Meta-d', proc{ + if @txt.compare('insert', '<', @promptEnd) + Tk.callback_break + end + }) + @txt.bind('Meta-BackSpace', proc{ + if @txt.compare('insert', '<=', @promptEnd) + Tk.callback_break + end + }) + @txt.bind('Control-h', proc{ + if @txt.compare('insert', '<=', @promptEnd) + Tk.callback_break + end + }) + + @txt.tag_configure('bold', 'font'=>['Courier', 12, 'bold']) + + @app = Tk.appname('rmt') + if (@app =~ /^rmt(.*)$/) + root.title("Tk Remote Controller#{$1}") + root.iconname("Tk Remote#{$1}") + end + prompt + @txt.focus + #@app = TkWinfo.appname(TkRoot.new) + end + + def tkTextInsert(w,s) + return if s == "" + begin + if w.compare('sel.first','<=','insert') \ + && w.compare('sel.last','>=','insert') + w.tag_remove('sel', 'sel.first', @promptEnd) + w.delete('sel.first', 'sel.last') + end + rescue + end + w.insert('insert', s) + w.see('insert') + end + + # The method below is used to print out a prompt at the + # insertion point (which should be at the beginning of a line + # right now). + + def prompt + @txt.insert('insert', "#{@app}: ") + @promptEnd.set('insert') + @promptEnd.gravity = 'left' + @txt.tag_add('bold', "#{@promptEnd.path} linestart", @promptEnd) + end + + # The method below executes a command (it takes everything on the + # current line after the prompt and either sends it to the remote + # application or executes it locally, depending on "app". + + def invoke + cmd = @txt.get(@promptEnd, 'insert') + @executing += 1 + case (@mode) + when 'Tcl' + if Tk.info('complete', cmd) + if (cmd == "!!\n") + cmd = @lastCommand + else + @lastCommand = cmd + end + begin + msg = Tk.appsend(@app, false, cmd) + rescue + msg = "Error: #{$!}" + end + @txt.insert('insert', msg + "\n") if msg != "" + prompt + @promptEnd.set('insert') + end + + when 'Ruby' + if (cmd == "!!\n") + cmd = @lastCommand + end + complete = true + begin + eval("proc{#{cmd}}") + rescue + complete = false + end + if complete + @lastCommand = cmd + begin +# msg = Tk.appsend(@app, false, +# 'ruby', +# '"(' + cmd.gsub(/[][$"]/, '\\\\\&') + ').to_s"') + msg = Tk.rb_appsend(@app, false, cmd) + rescue + msg = "Error: #{$!}" + end + @txt.insert('insert', msg + "\n") if msg != "" + prompt + @promptEnd.set('insert') + end + end + + @executing -= 1 + @txt.yview_pickplace('insert') + end + + # The following method is invoked to change the application that + # we're talking to. It also updates the prompt for the current + # command, unless we're in the middle of executing a command from + # the text item (in which case a new prompt is about to be output + # so there's no need to change the old one). + + def newApp(appName, mode) + @app = appName + @mode = mode + if @executing == 0 + @promptEnd.gravity = 'right' + @txt.delete("#{@promptEnd.path} linestart", @promptEnd) + @txt.insert(@promptEnd, "#{appName}: ") + @txt.tag_add('bold', "#{@promptEnd.path} linestart", @promptEnd) + @promptEnd.gravity = 'left' + end + end + + # The method below will fill in the applications sub-menu with a list + # of all the applications that currently exist. + + def fillAppsMenu(menu) + win = self + begin + menu.delete(0,'last') + rescue + end + TkWinfo.interps.sort.each{|ip| + if Tk.appsend(ip, false, 'info commands ruby') == "" + mode = 'Tcl' + else + mode = 'Ruby' + end + menu.add('command', 'label'=>format("%s (#{mode}/Tk)", ip), + 'command'=>proc{win.newApp ip, mode}) + } + menu.add('command', 'label'=>format("local (Ruby/Tk)"), + 'command'=>proc{win.newApp 'local', 'Ruby'}) + end +end + +Rmt.new + +Tk.mainloop diff --git a/ext/tk/sample/demos-en/rolodex b/ext/tk/sample/demos-en/rolodex new file mode 100644 index 0000000000..84254d93bf --- /dev/null +++ b/ext/tk/sample/demos-en/rolodex @@ -0,0 +1,320 @@ +#!/usr/bin/env ruby +# +# rolodex -- +# This script is a part of Tom LaStrange's rolodex +# +# Copyright (C) 1998 by Takaaki Tateishi <ttate@jaist.ac.jp> +# Time-stamp: "98/07/20 12:00:02 ttate" +# + +require "tk" + + +def show_help(topic,x=0,y=0) + if( topic.is_a?(TkWindow) ) + w = TkWinfo.containing(x,y) + if( TkWinfo.exist?(w) ) + topic = w + end + end + + if( $helpTopics.include?(topic) ) + msg = $helpTopics[topic] + else + msg = "Sorry, but no help is available for this topic" + end + TkDialog.new("title"=>"Rolodex Help", + "message"=>"Information on #{topic}:\n\n#{msg}", + "default_button"=>0, + "buttons"=>["OK"]) +end + +def fillCard + clearAction + $root.frame.entry[1].insert(0,"Takaaki Tateishi") + $root.frame.entry[2].insert(0,"Japan Advanced Institute of Science and Techonology") + $root.frame.entry[3].insert(0,"1-1 Asahidai, Tatsunokuchi") + $root.frame.entry[4].insert(0,"Ishikawa 923-1292, Japan") + $root.frame.entry[5].insert(0,"private") + $root.frame.entry[6].insert(0,"***-***-****") + $root.frame.entry[7].insert(0,"***-***-****") +end + +def addAction + for i in 1..7 + STDERR.print format("%-12s %s\n", + RolodexFrame::LABEL[i], + $root.frame.entry[i].value) + end +end + +def clearAction + for i in 1..7 + $root.frame.entry[i].delete(0,"end") + end +end + +def fileAction + TkDialog.new("title"=>"File Selection", + "message"=>"This is a dummy file selection dialog box.\n", + "default_button"=>0, + "buttons"=>["OK"]) + STDERR.print "dummy file name\n" +end + +def deleteAction + result = TkDialog.new("title"=>"Confirm Action", + "message"=>"Are you sure?", + "default_button"=>0, + "buttons"=>["Cancel"]) + if( result.value == 0 ) + clearAction + end +end + + +class RolodexFrame < TkFrame + attr_reader :entry, :label + + LABEL = ["","Name:","Address:","","","Home Phone:","Work Phone:","Fax:"] + + def initialize(parent=nil,keys=nil) + super(parent,keys) + self["relief"] = "flat" + + @i = [] + @label = [] + @entry = [] + for i in 1..7 + @i[i] = TkFrame.new(self) + @i[i].pack("side"=>"top", + "pady"=>2, + "anchor"=>"e") + @label[i] = TkLabel.new(@i[i], + "text"=>LABEL[i], + "anchor"=>"e") + @entry[i] = TkEntry.new(@i[i], + "width"=>30, + "relief"=>"sunken") + @entry[i].pack("side"=>"right") + @label[i].pack("side"=>"right") + end + end +end + +class RolodexButtons < TkFrame + attr_reader :clear, :add, :search, :delete + + def initialize(parent,keys=nil) + super(parent,keys) + @clear = TkButton.new(self, + "text" => "Clear") + @add = TkButton.new(self, + "text" => "Add") + @search = TkButton.new(self, + "text" => "Search") + @delete = TkButton.new(self, + "text" => "Delete") + for w in [@clear,@add,@search,@delete] + w.pack("side"=>"left", "padx"=>2) + end + end +end + +class RolodexMenuFrame < TkFrame + attr_reader :file_menu, :help_menu, :file, :help + + def initialize(parent,keys=nil) + super(parent,keys) + configure("relief"=>"raised", + "borderwidth"=>1) + + @file = TkMenubutton.new(self, + "text"=>"File", + "underline"=>0) + @file_menu = TkMenu.new(@file) + @file_menu.add("command", + "label" => "Load ...", + "command" => proc{fileAction}, + "underline" => 0) + @file_menu.add("command", + "label" => "Exit", + "command" => proc{$root.destroy}, + "underline" => 0) + @file.menu(@file_menu) + @file.pack("side"=>"left") + + @help = TkMenubutton.new(self, + "text"=>"Help", + "underline"=>0) + @help_menu = TkMenu.new(@help) + @help_menu.add("command", + "label"=>"On Context...", + "command"=>proc{show_help("context")}, + "underline"=>3) + @help_menu.add("command", + "label"=>"On Help...", + "command"=>proc{show_help("help")}, + "underline"=>3) + @help_menu.add("command", + "label"=>"On Window...", + "command"=>proc{show_help("window")}, + "underline"=>3) + @help_menu.add("command", + "label"=>"On Keys...", + "command"=>proc{show_help("keys")}, + "underline"=>3) + @help_menu.add("command", + "label"=>"On version...", + "command"=>proc{show_help("version")}, + "underline"=>3) + @help.menu(@help_menu) + @help.pack("side"=>"right") + end +end + +class Rolodex < TkRoot + attr_reader :frame, :buttons, :menu + + def initialize + super + @frame = RolodexFrame.new(self) + @frame.pack("side"=>"top", + "fill"=>"y", + "anchor"=>"center") + @buttons = RolodexButtons.new(self) + @buttons.pack("side"=>"bottom", + "pady"=>2, + "anchor"=>"center") + @menu = RolodexMenuFrame.new(self) + @menu.pack("before"=>@frame, + "side"=>"top", + "fill"=>"x") + end +end + +$root = Rolodex.new + +$root.buttons.delete.configure("command"=>proc{deleteAction}) +$root.buttons.add.configure("command"=>proc{addAction}) +$root.buttons.clear.configure("command"=>proc{clearAction}) +$root.buttons.search.configure("command"=>proc{addAction; fillCard}) + +$root.buttons.clear.configure("text"=>"Clear Ctrl+C") +$root.bind("Control-c",proc{clearAction}) + +$root.buttons.add.configure("text"=>"Add Ctrl+A") +$root.bind("Control-a",proc{addAction}) + +$root.buttons.search.configure("text"=>"Search Ctrl+S") +$root.bind("Control-s",proc{addAction; fillCard}) + +$root.buttons.delete.configure("text"=>"Delete... Ctrl+D") +$root.bind("Control-d",proc{deleteAction}) + +$root.menu.file_menu.entryconfigure(1, "accel"=>"Ctrl+F") +$root.bind("Control-f",proc{fileAction}) + +$root.menu.file_menu.entryconfigure(2, "accel"=>"Ctrl+Q") +$root.bind("Control-q",proc{$root.destroy}) + +$root.frame.entry[1].focus + +$root.bind("Any-F1", + proc{|event| show_help(event.widget, event.x_root, event.y_root)}) +$root.bind("Any-Help", + proc{|event| show_help(event.widget, event.x_root, event.y_root)}) + + +$helpTopics = {} + +$helpTopics[$root.menu.file] = <<EOF +This is the "file" menu. It can be used to invoke\ +some overall operations on the rolodex applications,\ +such as loading a file or exiting. +EOF + +$helpTopics[$root.menu.file_menu.index(0)] = <<EOF +The "Load" entry in the "File" menu posts a dialog box\ +that you can use to select a rolodex file +EOF + +$helpTopics[$root.menu.file_menu.index(1)] = <<EOF +The "Exit" entry in the "File" menu causes the rolodex\ +application to terminate +EOF + +$helpTopics[$root.frame.entry[1]] = <<EOF +In this field of the rolodex entry you should\ +type the person's name +EOF + +$helpTopics[$root.frame.entry[2]] = <<EOF +In this field of the rolodex entry you should\ +type the first line of the person's address +EOF + +$helpTopics[$root.frame.entry[3]] = <<EOF +In this field of the rolodex entry you should\ +type the second line of the person's address +EOF + +$helpTopics[$root.frame.entry[4]] = <<EOF +In this field of the rolodex entry you should\ +type the third line of the person's address +EOF + +$helpTopics[$root.frame.entry[5]] = <<EOF +In this field of the rolodex entry you should\ +type the person's home phone number, or "private"\ +if the person doesn't want his or he number publicized +EOF + +$helpTopics[$root.frame.entry[6]] = <<EOF +In this field of the rolodex entry you should\ +type the person's work phone number +EOF + +$helpTopics[$root.frame.entry[7]] = <<EOF +In this field of the rolodex entry you should\ +type the phone number for the person's FAX machine +EOF + +$helpTopics["context"] = <<EOF +Unfortunately, this application doesn't support context-sensitive\ +help in the usual way, because when this demo was written Ruby/Tk\ +didn't have a grab mechanism and this is needed for context-sensitive\ +help. Instead, you can achive much the same effect by simply moving\ +the mouse over the window you're curious about and pressing the\ +Help or F1 keys. You can do this anytime. +EOF + +$helpTopics["help"] = <<EOF +This application provides only very crude help. Besides the\ +entries in this menu, you can get help on individual windows\ +by moving the mouse cursor over the window and pressing the\ +Help or F1 keys. +EOF + +$helpTopics["window"] = <<EOF +This window is a dummy rolodex application created as part of\ +Tom LaStrange's toolkit benchmark. It doesn't really do anything\ +useful except to demonstrate a few features of the Ruby/Tk. +EOF + +$helpTopics["keys"] = <<EOF +The following accelerator keys are defined for this application\ +(in addition to those already available for the entry windows): +Ctrl+A: Add +Ctrl+C: Clear +Ctrl+D: Delete +Ctrl+F: Enter file name +Ctrl+Q: Exit application (quit) +Ctrl+S: Search (dummy operation) +EOF + +$helpTopics["version"] = <<EOF +This is version 1.0. +EOF + +Tk.mainloop diff --git a/ext/tk/sample/demos-en/rolodex-j b/ext/tk/sample/demos-en/rolodex-j new file mode 100644 index 0000000000..b0fc1d2c76 --- /dev/null +++ b/ext/tk/sample/demos-en/rolodex-j @@ -0,0 +1,324 @@ +#!/usr/bin/env ruby +# +# rolodex -- +# このスクリプトは Tom LaStrange の rolodex の一部です。 +# +# Copyright (C) 1998 by Takaaki Tateishi <ttate@jaist.ac.jp> +# Time-stamp: "98/07/20 12:00:36 ttate" +# + +require "tk" +require 'tkencoding' + +Tk.encoding = "euc-jp" +$font = TkFont.new('k14') + +def show_help(topic,x=0,y=0) + if( topic.is_a?(TkWindow) ) + w = TkWinfo.containing(x,y) + if( w.is_a?(TkWindow) ) + if( TkWinfo.exist?(w) ) + topic = w + end + end + end + + if( $helpTopics.include?(topic) ) + msg = $helpTopics[topic] + else + msg = "このトピックについてのヘルプはまだ使用できません" + end + TkDialog.new("title"=>"Rolodex Help", + "message"=>"「#{topic}」\n\n#{msg}", + "font"=>$font, + "default_button"=>0, + "buttons"=>["OK"]) +end + +def fillCard + clearAction + $root.frame.entry[1].insert(0, "立石 孝彰") + $root.frame.entry[2].insert(0, "923-1292 石川県") + $root.frame.entry[3].insert(0, "辰口町 旭台 1-1") + $root.frame.entry[4].insert(0, "北陸先端科学技術大学院大学") + $root.frame.entry[5].insert(0,"private") + $root.frame.entry[6].insert(0,"***-***-****") + $root.frame.entry[7].insert(0,"***-***-****") +end + +def addAction + for i in 1..7 + STDERR.print format("%-12s %s\n", + RolodexFrame::LABEL[i], + $root.frame.entry[i].value) + end +end + +def clearAction + for i in 1..7 + $root.frame.entry[i].delete(0,"end") + end +end + +def fileAction + TkDialog.new("title"=>"File Selection", + "message"=>"これはファイル選択ダイアログのダミーです。\n", + "font"=>$font, + "default_button"=>0, + "buttons"=>["OK"]) + STDERR.print "dummy file name\n" +end + +def deleteAction + result = TkDialog.new("title"=>"Confirm Action", + "message"=>"よろしいですか?", + "font"=>$font, + "default_button"=>0, + "buttons"=>["キャンセル"]) + if( result.value == 0 ) + clearAction + end +end + + +class RolodexFrame < TkFrame + attr_reader :entry, :label + + LABEL = ["","名前:","住所","","","電話(自宅):","電話(会社):","Fax:"] + + def initialize(parent=nil,keys=nil) + super(parent,keys) + self["relief"] = "flat" + @i = [] + @label = [] + @entry = [] + for i in 1..7 + @i[i] = TkFrame.new(self) + @i[i].pack("side"=>"top", + "pady"=>2, + "anchor"=>"e") + @label[i] = TkLabel.new(@i[i], + "text"=>LABEL[i], + "anchor"=>"e", + "font" => $font) + @entry[i] = TkEntry.new(@i[i], + "width"=>30, + "relief"=>"sunken", + "font" => $font) + @entry[i].pack("side"=>"right") + @label[i].pack("side"=>"right") + end + end +end + +class RolodexButtons < TkFrame + attr_reader :clear, :add, :search, :delete + + def initialize(parent,keys=nil) + super(parent,keys) + @clear = TkButton.new(self, + "text" => "クリアー", + "font" => $font) + @add = TkButton.new(self, + "text" => "追加", + "font" => $font) + @search = TkButton.new(self, + "text" => "検索", + "font" => $font) + @delete = TkButton.new(self, + "text" => "消去", + "font" => $font) + for w in [@clear,@add,@search,@delete] + w.pack("side"=>"left", "padx"=>2) + end + end +end + +class RolodexMenuFrame < TkFrame + attr_reader :file_menu, :help_menu, :file, :help + + def initialize(parent,keys=nil) + super(parent,keys) + configure("relief"=>"raised", + "borderwidth"=>1) + + @file = TkMenubutton.new(self, + "text"=> "ファイル", + "font"=> $font, + "underline"=>0) + @file_menu = TkMenu.new(@file) + @file_menu.add("command", + "label" => "読み込み ...", + "font" => $font, + "command" => proc{fileAction}, + "underline" => 0) + @file_menu.add("command", + "label" => "終了", + "font" => $font, + "command" => proc{$root.destroy}, + "underline" => 0) + @file.menu(@file_menu) + @file.pack("side"=>"left") + + @help = TkMenubutton.new(self, + "text"=> "ヘルプ", + "font"=> $font, + "underline"=>0) + @help_menu = TkMenu.new(@help) + @help_menu.add("command", + "label"=> "コンテキストについて", + "font" => $font, + "command"=>proc{show_help("コンテキスト")}, + "underline"=>3) + @help_menu.add("command", + "label"=> "ヘルプについて", + "font" => $font, + "command"=>proc{show_help("ヘルプ")}, + "underline"=>3) + @help_menu.add("command", + "label"=> "ウィンドウについて", + "font" => $font, + "command"=>proc{show_help("ウィンドウ")}, + "underline"=>3) + @help_menu.add("command", + "label"=> "キー操作について", + "font" => $font, + "command"=>proc{show_help("キー操作")}, + "underline"=>3) + @help_menu.add("command", + "label"=> "バージョン情報", + "font" => $font, + "command"=>proc{show_help("バージョン情報")}, + "underline"=>3) + @help.menu(@help_menu) + @help.pack("side"=>"right") + end +end + +class Rolodex < TkRoot + attr_reader :frame, :buttons, :menu + + def initialize + super + @frame = RolodexFrame.new(self) + @frame.pack("side"=>"top", + "fill"=>"y", + "anchor"=>"center") + @buttons = RolodexButtons.new(self) + @buttons.pack("side"=>"bottom", + "pady"=>2, + "anchor"=>"center") + @menu = RolodexMenuFrame.new(self) + @menu.pack("before"=>@frame, + "side"=>"top", + "fill"=>"x") + end +end + +$root = Rolodex.new + +$root.buttons.delete.configure("command"=>proc{deleteAction}) +$root.buttons.add.configure("command"=>proc{addAction}) +$root.buttons.clear.configure("command"=>proc{clearAction}) +$root.buttons.search.configure("command"=>proc{addAction; fillCard}) + +$root.buttons.clear.configure("text"=> "クリアー Ctrl+C", "font" => $font) +$root.bind("Control-c",proc{clearAction}) + +$root.buttons.add.configure("text"=> "追加 Ctrl+A", "font" => $font) +$root.bind("Control-a",proc{addAction}) + +$root.buttons.search.configure("text"=> "検索 Ctrl+S", "font" => $font) +$root.bind("Control-s",proc{addAction; fillCard}) + +$root.buttons.delete.configure("text"=> "消去 Ctrl+D", "font" => $font) +$root.bind("Control-d",proc{deleteAction}) + +$root.menu.file_menu.entryconfigure(1, "accel"=>"Ctrl+F") +$root.bind("Control-f",proc{fileAction}) + +$root.menu.file_menu.entryconfigure(2, "accel"=>"Ctrl+Q") +$root.bind("Control-q",proc{$root.destroy}) + +$root.frame.entry[1].focus + +$root.bind("Any-F1", + proc{|event| show_help(event.widget, event.x_root, event.y_root)}) +$root.bind("Any-Help", + proc{|event| show_help(event.widget, event.x_root, event.y_root)}) + + +$helpTopics = {} + +$helpTopics[$root.menu.file] = <<EOF +これは「ファイル」メニューです。「読み込み」や「終了」などを +行なうことができます。 +EOF + +$helpTopics[$root.menu.file_menu.index(0)] = <<EOF +ファイルの読み込みを行なうときに使います。 +EOF + +$helpTopics[$root.menu.file_menu.index(1)] = <<EOF +アプリケーションを終了するときに使います。 +EOF + +$helpTopics[$root.frame.entry[1]] = <<EOF +名前を記入するエントリです。 +EOF + +$helpTopics[$root.frame.entry[2]] = <<EOF +住所を記入するエントリです。 +EOF + +$helpTopics[$root.frame.entry[3]] = <<EOF +住所を記入するエントリです。 +EOF + +$helpTopics[$root.frame.entry[4]] = <<EOF +住所を記入するエントリです。 +EOF + +$helpTopics[$root.frame.entry[5]] = <<EOF +自宅の電話番号を記入するエントリです。公開\ +したくないときは private と記入します。 +EOF + +$helpTopics[$root.frame.entry[6]] = <<EOF +会社の電話番号を記入するエントリです。 +EOF + +$helpTopics[$root.frame.entry[7]] = <<EOF +FAX番号を記入するエントリです。 +EOF + +$helpTopics["コンテキスト"] = <<EOF +Ruby/Tkではgrabの機構がないためこのアプリケーションでは\ +コンテキストヘルプはサポートされていません。 +しかし同じような効果をbindとマウスの位置のWedgetを知る\ +ことで得ることができます。 +EOF + +$helpTopics["ヘルプ"] = <<EOF +マウスをウィンドウにあわせてF1キーを押すことによって\ +そのヘルプを見ることができます。 +EOF + +$helpTopics["ウィンドウ"] = <<EOF +このウィンドウはダミーです。 +EOF + +$helpTopics["キー操作"] = <<EOF +Ctrl+A: 追加 +Ctrl+C: クリアー +Ctrl+D: 消去 +Ctrl+F: ファイル選択 +Ctrl+Q: 終了 +Ctrl+S: 検索 +EOF + +$helpTopics["バージョン情報"] = <<EOF +バージョンは 1.0 です。 +EOF + +Tk.mainloop diff --git a/ext/tk/sample/demos-en/ruler.rb b/ext/tk/sample/demos-en/ruler.rb new file mode 100644 index 0000000000..f5e7add516 --- /dev/null +++ b/ext/tk/sample/demos-en/ruler.rb @@ -0,0 +1,201 @@ +# ruler.rb +# +# This demonstration script creates a canvas widget that displays a ruler +# with tab stops that can be set, moved, and deleted. +# +# ruler widget demo (called by 'widget') +# + +# rulerMkTab -- +# This method creates a new triangular polygon in a canvas to +# represent a tab stop. +# +# Arguments: +# c - The canvas window. +# x, y - Coordinates at which to create the tab stop. + +def rulerMkTab(c,x,y) + v = $demo_rulerInfo + TkcPolygon.new(c, x, y, x+v.size, y+v.size, x-v.size, y+v.size) +end + +# toplevel widget +if defined?($ruler_demo) && $ruler_demo + $ruler_demo.destroy + $ruler_demo = nil +end + +# demo toplevel widget +$ruler_demo = TkToplevel.new {|w| + title("Ruler Demonstration") + iconname("ruler") + positionWindow(w) +} + +# label +TkLabel.new($ruler_demo, 'font'=>$font, 'wraplength'=>'5i', 'justify'=>'left', + 'text'=>"This canvas widget shows a mock-up of a ruler. You can create tab stops by dragging them out of the well to the right of the ruler. You can also drag existing tab stops. If you drag a tab stop far enough up or down so that it turns dim, it will be deleted when you release the mouse button."){ + pack('side'=>'top') +} + +# frame +$ruler_buttons = TkFrame.new($ruler_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $ruler_demo + $ruler_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'ruler'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$ruler_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# canvas +$ruler_canvas = TkCanvas.new($ruler_demo, 'width'=>'14.8c', 'height'=>'2.5c') +$ruler_canvas.pack('side'=>'top', 'fill'=>'x') + +# +unless Struct.const_defined?("RulerInfo") + $demo_rulerInfo = Struct.new("RulerInfo", :grid, :left, :right, :x, :y, + :top, :bottom, :size, :normalStyle, + :activeStyle, :deleteStyle).new +end +$demo_rulerInfo.grid = '.25c' +$demo_rulerInfo.left = TkWinfo.fpixels($ruler_canvas, '1c') +$demo_rulerInfo.right = TkWinfo.fpixels($ruler_canvas, '13c') +$demo_rulerInfo.top = TkWinfo.fpixels($ruler_canvas, '1c') +$demo_rulerInfo.bottom = TkWinfo.fpixels($ruler_canvas, '1.5c') +$demo_rulerInfo.size = TkWinfo.fpixels($ruler_canvas, '.2c') +$demo_rulerInfo.normalStyle = {'fill'=>'black'} +if TkWinfo.depth($ruler_canvas) > 1 + $demo_rulerInfo.activeStyle = {'fill'=>'red', 'stipple'=>''} + $demo_rulerInfo.deleteStyle = {'fill'=>'red', + 'stipple'=>'@'+[$demo_dir, 'images', 'gray25.xbm'].join(File::Separator)} +else + $demo_rulerInfo.activeStyle = {'fill'=>'black', 'stipple'=>''} + $demo_rulerInfo.deleteStyle = {'fill'=>'black', + 'stipple'=>'@'+[$demo_dir, 'images', 'gray25.xbm'].join(File::Separator)} +end + +TkcLine.new($ruler_canvas, + '1c', '0.5c', '1c', '1c', '13c', '1c', '13c', '0.5c', 'width'=>1) +(0..11).each{|i| + x = i+1 + TkcLine.new($ruler_canvas, "#{x}c", '1c', "#{x}c", '0.6c', 'width'=>1) + TkcLine.new($ruler_canvas, "#{x}.25c", '1c', "#{x}.25c", '0.8c', 'width'=>1) + TkcLine.new($ruler_canvas, "#{x}.5c", '1c', "#{x}.5c", '0.7c', 'width'=>1) + TkcLine.new($ruler_canvas, "#{x}.75c", '1c', "#{x}.75c", '0.8c', 'width'=>1) + TkcText.new($ruler_canvas, "#{x}.15c", '0.75c', 'text'=>i, 'anchor'=>'sw') +} + +$rulerTag_well = TkcTag.new($ruler_canvas) +$ruler_canvas\ +.addtag_withtag($rulerTag_well, + TkcRectangle.new($ruler_canvas, + '13.2c', '1c', '13.8c', '0.5c', + 'outline'=>'black', + 'fill'=>($ruler_canvas\ + .configinfo('background'))[4]) ) +$ruler_canvas\ +.addtag_withtag($rulerTag_well, + rulerMkTab($ruler_canvas, + TkWinfo.pixels($ruler_canvas, '13.5c'), + TkWinfo.pixels($ruler_canvas, '.65c') ) ) + +$rulerTag_well.bind('1', proc{|x,y| rulerNewTab($ruler_canvas,x,y)}, '%x %y') +$ruler_canvas.itembind('tab', '1', + proc{|x,y| rulerSelectTab($ruler_canvas,x,y)}, '%x %y') +$ruler_canvas.bind('B1-Motion', + proc{|x,y| rulerMoveTab($ruler_canvas,x,y)}, '%x %y') +$ruler_canvas.bind('Any-ButtonRelease-1', proc{rulerReleaseTab($ruler_canvas)}) + +# rulerNewTab -- +# Does all the work of creating a tab stop, including creating the +# triangle object and adding tags to it to give it tab behavior. +# +# Arguments: +# c - The canvas window. +# x, y - The coordinates of the tab stop. + +def rulerNewTab(c,x,y) + v = $demo_rulerInfo + c.addtag_withtag('active', rulerMkTab(c,x,y)) + c.addtag_withtag('tab', 'active') + v.x = x + v.y = y + rulerMoveTab(c,x,y) +end + +# rulerSelectTab -- +# This method is invoked when mouse button 1 is pressed over +# a tab. It remembers information about the tab so that it can +# be dragged interactively. +# +# Arguments: +# c - The canvas widget. +# x, y - The coordinates of the mouse (identifies the point by +# which the tab was picked up for dragging). + +def rulerSelectTab(c,x,y) + v = $demo_rulerInfo + v.x = c.canvasx(x, v.grid) + v.y = v.top+2 + c.addtag_withtag('active', 'current') + c.itemconfigure('active', v.activeStyle) + c.raise('active') +end + +# rulerMoveTab -- +# This method is invoked during mouse motion events to drag a tab. +# It adjusts the position of the tab, and changes its appearance if +# it is about to be dragged out of the ruler. +# +# Arguments: +# c - The canvas widget. +# x, y - The coordinates of the mouse. + +def rulerMoveTab(c,x,y) + v = $demo_rulerInfo + return if c.find_withtag('active') == [] + cx = c.canvasx(x,v.grid) + cy = c.canvasy(y) + cx = v.left if cx < v.left + cx = v.right if cx > v.right + if (cy >= v.top && cy <= v.bottom) + cy = v.top+2 + c.itemconfigure('active', v.activeStyle) + else + cy = cy-v.size-2 + c.itemconfigure('active', v.deleteStyle) + end + c.move('active', cx-v.x, cy-v.y) + v.x = cx + v.y = cy +end + +# rulerReleaseTab -- +# This method is invoked during button release events that end +# a tab drag operation. It deselects the tab and deletes the tab if +# it was dragged out of the ruler. +# +# Arguments: +# c - The canvas widget. +# x, y - The coordinates of the mouse. + +def rulerReleaseTab(c) + v = $demo_rulerInfo + return if c.find_withtag('active') == [] + if v.y != v.top+2 + c.delete('active') + else + c.itemconfigure('active', v.normalStyle) + c.dtag('active') + end +end + diff --git a/ext/tk/sample/demos-en/sayings.rb b/ext/tk/sample/demos-en/sayings.rb new file mode 100644 index 0000000000..4ba3097bed --- /dev/null +++ b/ext/tk/sample/demos-en/sayings.rb @@ -0,0 +1,104 @@ +# sayings.rb +# +# This demonstration script creates a listbox that can be scrolled +# both horizontally and vertically. It displays a collection of +# well-known sayings. +# +# listbox widget demo 'sayings' (called by 'widget') +# + +# toplevel widget +if defined?($sayings_demo) && $sayings_demo + $sayings_demo.destroy + $sayings_demo = nil +end + +# demo toplevel widget +$sayings_demo = TkToplevel.new {|w| + title("Listbox Demonstration (well-known sayings)") + iconname("sayings") + positionWindow(w) +} + +# label +msg = TkLabel.new($sayings_demo) { + font $font + wraplength '4i' + justify 'left' + text "The listbox below contains a collection of well-known sayings. You can scan the list using either of the scrollbars or by dragging in the listbox window with button 2 pressed." +} +msg.pack('side'=>'top') + +# frame +TkFrame.new($sayings_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $sayings_demo + $sayings_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'sayings'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame +sayings_lbox = nil +TkFrame.new($sayings_demo, 'borderwidth'=>10) {|w| + sv = TkScrollbar.new(w) + sh = TkScrollbar.new(w, 'orient'=>'horizontal') + sayings_lbox = TkListbox.new(w) { + setgrid 1 + width 20 + height 10 + yscrollcommand proc{|first,last| sv.set first,last} + xscrollcommand proc{|first,last| sh.set first,last} + } + sv.command(proc{|*args| sayings_lbox.yview(*args)}) + sh.command(proc{|*args| sayings_lbox.xview(*args)}) + + if $tk_version =~ /^4\.[01]/ + sv.pack('side'=>'right', 'fill'=>'y') + sh.pack('side'=>'bottom', 'fill'=>'x') + sayings_lbox.pack('expand'=>'yes', 'fill'=>'y') + + else + sayings_lbox.grid('row'=>0, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + sv.grid('row'=>0, 'column'=>1, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + sh.grid('row'=>1, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + TkGrid.rowconfigure(w, 0, 'weight'=>1, 'minsize'=>0) + TkGrid.columnconfigure(w, 0, 'weight'=>1, 'minsize'=>0) + end + +}.pack('side'=>'top', 'expand'=>'yes', 'fill'=>'y') + +sayings_lbox.insert(0, +"Waste not, want not", +"Early to bed and early to rise makes a man healthy, wealthy, and wise", +"Ask not what your country can do for you, ask what you can do for your country", +"I shall return", +"NOT", +"A picture is worth a thousand words", +"User interfaces are hard to build", +"Thou shalt not steal", +"A penny for your thoughts", +"Fool me once, shame on you; fool me twice, shame on me", +"Every cloud has a silver lining", +"Where there's smoke there's fire", +"It takes one to know one", +"Curiosity killed the cat; but satisfaction brought it back", +"Take this job and shove it", +"Up a creek without a paddle", +"I'm mad as hell and I'm not going to take it any more", +"An apple a day keeps the doctor away", +"Don't look a gift horse in the mouth" +) + diff --git a/ext/tk/sample/demos-en/search.rb b/ext/tk/sample/demos-en/search.rb new file mode 100644 index 0000000000..2b27cdbb42 --- /dev/null +++ b/ext/tk/sample/demos-en/search.rb @@ -0,0 +1,192 @@ +# search.rb +# +# This demonstration script creates a collection of widgets that +# allow you to load a file into a text widget, then perform searches +# on that file. +# +# Text Search widget demo (called by 'widget') +# + +# textLoadFile -- +# This method below loads a file into a text widget, discarding +# the previous contents of the widget. Tags for the old widget are +# not affected, however. +# +# Arguments: +# w - The window into which to load the file. Must be a +# text widget. +# file - The name of the file to load. Must be readable. + +def textLoadFile(w,file) + w.delete('1.0', 'end') + f = open(file, 'r') + while(!f.eof?) + w.insert('end', f.read(1000)) + end + f.close +end + +# textSearch -- +# Search for all instances of a given string in a text widget and +# apply a given tag to each instance found. +# +# Arguments: +# w - The window in which to search. Must be a text widget. +# string - The string to search for. The search is done using +# exact matching only; no special characters. +# tag - Tag to apply to each instance of a matching string. + +def textSearch(w, string, tag) + tag.remove('0.0', 'end') + return if string == "" + cur = '1.0' + loop { + cur, len = w.search_with_length(string, cur, 'end') + break if cur == "" + tag.add(cur, "#{cur} + #{len} char") + cur = w.index("#{cur} + #{len} char") + } +end + +# textToggle -- +# This method is invoked repeatedly to invoke two commands at +# periodic intervals. It normally reschedules itself after each +# execution but if an error occurs (e.g. because the window was +# deleted) then it doesn't reschedule itself. +# +# Arguments: +# cmd1 - Command to execute when method is called. +# sleep1 - Ms to sleep after executing cmd1 before executing cmd2. +# cmd2 - Command to execute in the *next* invocation of this method. +# sleep2 - Ms to sleep after executing cmd2 before executing cmd1 again. + +def textToggle(cmd1,sleep1,cmd2,sleep2) + sleep_list = [sleep2, sleep1] + TkAfter.new(proc{sleep = sleep_list.shift; sleep_list.push(sleep); sleep}, + -1, cmd1, cmd2).start(sleep1) +end + +# toplevel widget +if defined?($search_demo) && $search_demo + $search_demo.destroy + $search_demo = nil +end + +# demo toplevel widget +$search_demo = TkToplevel.new {|w| + title("Text Demonstration - Search and Highlight") + iconname("search") + positionWindow(w) +} + +# frame +$search_buttons = TkFrame.new($search_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $search_demo + $search_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'search'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$search_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame +TkFrame.new($search_demo) {|f| + TkLabel.new(f, 'text'=>'File name:', + 'width'=>13, 'anchor'=>'w').pack('side'=>'left') + $search_fileName = TkVariable.new + TkEntry.new(f, 'width'=>40, + 'textvariable'=>$search_fileName) { + pack('side'=>'left') + bind('Return', proc{textLoadFile($search_text, $search_fileName.value) + $search_string_entry.focus}) + focus + } + TkButton.new(f, 'text'=>'Load File', + 'command'=>proc{textLoadFile($search_text, + $search_fileName.value)})\ + .pack('side'=>'left', 'pady'=>5, 'padx'=>10) +}.pack('side'=>'top', 'fill'=>'x') + +TkFrame.new($search_demo) {|f| + TkLabel.new(f, 'text'=>'Search string:', + 'width'=>13, 'anchor'=>'w').pack('side'=>'left') + $search_searchString = TkVariable.new + $search_string_entry = TkEntry.new(f, 'width'=>40, + 'textvariable'=>$search_searchString) { + pack('side'=>'left') + bind('Return', proc{textSearch($search_text, $search_searchString.value, + $search_Tag)}) + } + TkButton.new(f, 'text'=>'Highlight', + 'command'=>proc{textSearch($search_text, + $search_searchString.value, + $search_Tag)}) { + pack('side'=>'left', 'pady'=>5, 'padx'=>10) + } +}.pack('side'=>'top', 'fill'=>'x') + +$search_text = TkText.new($search_demo, 'setgrid'=>true) {|t| + $search_Tag = TkTextTag.new(t) + TkScrollbar.new($search_demo, 'command'=>proc{|*args| t.yview(*args)}) {|sc| + t.yscrollcommand(proc{|first,last| sc.set first,last}) + pack('side'=>'right', 'fill'=>'y') + } + pack('expand'=>'yes', 'fill'=>'both') +} + +# Set up display styles for text highlighting. + +if TkWinfo.depth($search_demo) > 1 + textToggle(proc{ + begin + $search_Tag.configure('background'=>'#ce5555', + 'foreground'=>'white') + rescue + end + }, + 800, + proc{ + begin + $search_Tag.configure('background'=>'', 'foreground'=>'') + rescue + end + }, + 200 ) +else + textToggle(proc{ + begin + $search_Tag.configure('background'=>'black', + 'foreground'=>'white') + rescue + end + }, + 800, + proc{ + begin + $search_Tag.configure('background'=>'', 'foreground'=>'') + rescue + end + }, + 200 ) +end +$search_text.insert('1.0', '\ +This window demonstrates how to use the tagging facilities in text +widgets to implement a searching mechanism. First, type a file name +in the top entry, then type <Return> or click on "Load File". Then +type a string in the lower entry and type <Return> or click on +"Load File". This will cause all of the instances of the string to +be tagged with the tag "search", and it will arrange for the tag\'s +display attributes to change to make all of the strings blink.') +$search_text.set_insert '0.0' + +$search_fileName.value = '' +$search_searchString.value = '' + diff --git a/ext/tk/sample/demos-en/square b/ext/tk/sample/demos-en/square new file mode 100644 index 0000000000..821cd9927e --- /dev/null +++ b/ext/tk/sample/demos-en/square @@ -0,0 +1,74 @@ +#!/usr/bin/env ruby + +# square -- +# This script generates a demo application containing only +# a "square" widget. It's only usable if Tk has been compiled +# with tkSquare.c and with the -DSQUARE_DEMO compiler switch. +# This demo arranges the following bindings for the widget: +# +# Button-1 press/drag: moves square to mouse +# "a": toggle size animation on/off +# + +require 'tk' +require 'tkafter' + +class TkSquare<TkWindow + def create_self + tk_call 'square', path + end + def size(amount=nil) + if amount + tk_send 'size', amount + else + number(tk_send 'size') + end + end + def position(x,y) + tk_send 'position', x, y + end +end + +$s = TkSquare.new{ + pack('expand'=>'yes', 'fill'=>'both') + bind('1', proc{|x,y| center(x,y)}, '%s %y') + bind('B1-Motion', proc{|x,y| center(x,y)}, '%s %y') + bind('a', proc{animate}) + focus +} +TkRoot.new.minsize(1,1) + +# The procedure below centers the square on a given position. + +def center(x,y) + a = $s.size + $s.position(x-(a/2), y-(a/2)) +end + +# The procedures below provide a simple form of animation where +# the box changes size in a pulsing pattern: larger, smaller, larger, +# and so on. + +$inc = 0 + +def timer_proc + a = $s.size + return if $inc == 0 + $inc = -3 if a >= 40 + $inc = 3 if a <= 10 + $s.size(a+$inc) +end + +$timer = TkAfter.new(30, -1, proc{timer_proc}) + +def animate + if $inc == 0 + $inc = 3 + $timer.start + else + $inc = 0 + $timer.stop + end +end + +Tk.mainloop diff --git a/ext/tk/sample/demos-en/states.rb b/ext/tk/sample/demos-en/states.rb new file mode 100644 index 0000000000..d38c1245af --- /dev/null +++ b/ext/tk/sample/demos-en/states.rb @@ -0,0 +1,78 @@ +# states.rb +# +# This demonstration script creates a listbox widget that displays +# the names of the 50 states in the United States of America. +# +# listbox widget demo 'states' (called by 'widget') +# + +# toplevel widget +if defined?($states_demo) && $states_demo + $states_demo.destroy + $states_demo = nil +end + +# demo toplevel widget +$states_demo = TkToplevel.new {|w| + title("Listbox Demonstration (states)") + iconname("states") + positionWindow(w) +} + +# label +msg = TkLabel.new($states_demo) { + font $font + wraplength '4i' + justify 'left' + text "A listbox containing the 50 states is displayed below, along with a scrollbar. You can scan the list either using the scrollbar or by scanning. To scan, press button 2 in the widget and drag up or down." +} +msg.pack('side'=>'top') + +# frame +TkFrame.new($states_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $states_demo + $states_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'states'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame +states_lbox = nil +TkFrame.new($states_demo, 'borderwidth'=>'.5c') {|w| + s = TkScrollbar.new(w) + states_lbox = TkListbox.new(w) { + setgrid 1 + height 12 + yscrollcommand proc{|first,last| s.set first,last} + } + s.command(proc{|*args| states_lbox.yview(*args)}) + s.pack('side'=>'right', 'fill'=>'y') + states_lbox.pack('side'=>'left', 'expand'=>1, 'fill'=>'both') +}.pack('side'=>'top', 'expand'=>'yes', 'fill'=>'y') + +ins_data = [ + 'Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', + 'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', + 'Hawaii', 'Idaho', 'Illinois', + 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', + 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', + 'Montana', 'Nebraska', 'Nevada', 'New_Hampshire', 'New_Jersey', 'New_Mexico', + 'New_York', 'North_Carolina', 'North_Dakota', + 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode_Island', + 'South_Carolina', 'South_Dakota', + 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', + 'West_Virginia', 'Wisconsin', 'Wyoming' +] + +states_lbox.insert(0, *ins_data) + diff --git a/ext/tk/sample/demos-en/style.rb b/ext/tk/sample/demos-en/style.rb new file mode 100644 index 0000000000..8bf9c09662 --- /dev/null +++ b/ext/tk/sample/demos-en/style.rb @@ -0,0 +1,211 @@ +# style.rb +# +# This demonstration script creates a text widget that illustrates the +# various display styles that may be set for tags. +# +# text (display styles) widget demo (called by 'widget') +# + +# toplevel widget +if defined?($style_demo) && $style_demo + $style_demo.destroy + $style_demo = nil +end + +# demo toplevel widget +$style_demo = TkToplevel.new {|w| + title("Text Demonstration - Display Styles") + iconname("style") + positionWindow(w) +} + +# frame +TkFrame.new($style_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $style_demo + $style_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'style'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# text +TkText.new($style_demo){|t| + # + setgrid 'true' + width 70 + height 32 + wrap 'word' + TkScrollbar.new($style_demo) {|s| + pack('side'=>'right', 'fill'=>'y') + command proc{|*args| t.yview(*args)} + t.yscrollcommand proc{|first,last| s.set first,last} + } + pack('expand'=>'yes', 'fill'=>'both') + + # + style_tag_bold = TkTextTag.new(t, 'font'=>'-*-Courier-Bold-O-Normal--*-120-*-*-*-*-*-*') + style_tag_big = TkTextTag.new(t, 'font'=>'-*-Courier-Bold-R-Normal--*-140-*-*-*-*-*-*', 'kanjifont'=>$msg_kanji_font) + style_tag_verybig = TkTextTag.new(t, 'font'=>'-*-Helvetica-Bold-R-Normal--*-240-*-*-*-*-*-*') +# style_tag_small = TkTextTag.new(t, 'font'=>'-Adobe-Helvetica-Bold-R-Normal-*-100-*', 'kanjifont'=>$kanji_font) + style_tag_small = TkTextTag.new(t, 'font'=>'-Adobe-Helvetica-Bold-R-Normal-*-100-*') +### +# case($tk_version) +# when /^4.*/ +# style_tag_big = TkTextTag.new(t, 'font'=>'-*-Courier-Bold-R-Normal--*-140-*-*-*-*-*-*', 'kanjifont'=>$msg_kanji_font) +# style_tag_small = TkTextTag.new(t, 'font'=>'-Adobe-Helvetica-Bold-R-Normal-*-100-*', 'kanjifont'=>$kanji_font) +# when /^8.*/ +# unless $style_demo_do_first +# $style_demo_do_first = true +# Tk.tk_call('font', 'create', '@bigascii', +# '-copy', '-*-Courier-Bold-R-Normal--*-140-*-*-*-*-*-*') +# Tk.tk_call('font', 'create', '@smallascii', +# '-copy', '-Adobe-Helvetica-Bold-R-Normal-*-100-*') +# Tk.tk_call('font', 'create', '@cBigFont', +# '-compound', '@bigascii @msg_knj') +# Tk.tk_call('font', 'create', '@cSmallFont', +# '-compound', '@smallascii @kanji') +# end +# style_tag_big = TkTextTag.new(t, 'font'=>'@cBigFont') +# style_tag_small = TkTextTag.new(t, 'font'=>'@cSmallFont') +# end + + # + if TkWinfo.depth($root).to_i > 1 + style_tag_color1 = TkTextTag.new(t, 'background'=>'#a0b7ce') + style_tag_color2 = TkTextTag.new(t, 'foreground'=>'red') + style_tag_raised = TkTextTag.new(t, 'relief'=>'raised', 'borderwidth'=>1) + style_tag_sunken = TkTextTag.new(t, 'relief'=>'sunken', 'borderwidth'=>1) + else + style_tag_color1 = TkTextTag.new(t, 'background'=>'black', + 'foreground'=>'white') + style_tag_color2 = TkTextTag.new(t, 'background'=>'black', + 'foreground'=>'white') + style_tag_raised = TkTextTag.new(t, 'background'=>'white', + 'relief'=>'raised', 'borderwidth'=>1) + style_tag_sunken = TkTextTag.new(t, 'background'=>'white', + 'relief'=>'sunken', 'borderwidth'=>1) + end + + # テキストタグ設定 (その他) + if $tk_version =~ /^4\.[01]/ + style_tag_bgstipple = TkTextTag.new(t, 'background'=>'black', + 'borderwidth'=>0, + 'bgstipple'=>'gray25') + else + style_tag_bgstipple = TkTextTag.new(t, 'background'=>'black', + 'borderwidth'=>0, + 'bgstipple'=>'gray12') + end + style_tag_fgstipple = TkTextTag.new(t, 'fgstipple'=>'gray50') + style_tag_underline = TkTextTag.new(t, 'underline'=>'on') + style_tag_overstrike = TkTextTag.new(t, 'overstrike'=>'on') + style_tag_right = TkTextTag.new(t, 'justify'=>'right') + style_tag_center = TkTextTag.new(t, 'justify'=>'center') + style_tag_super = TkTextTag.new(t, 'offset'=>'4p', 'font'=>'-Adobe-Courier-Medium-R-Normal--*-100-*-*-*-*-*-*') + style_tag_sub = TkTextTag.new(t, 'offset'=>'-2p', 'font'=>'-Adobe-Courier-Medium-R-Normal--*-100-*-*-*-*-*-*') + style_tag_margins = TkTextTag.new(t, 'lmargin1'=>'12m', 'lmargin2'=>'6m', + 'rmargin'=>'10m') + style_tag_spacing = TkTextTag.new(t, 'spacing1'=>'10p', 'spacing2'=>'2p', + 'lmargin1'=>'12m', 'lmargin2'=>'6m', + 'rmargin'=>'10m') + + # + insert('end', 'Text widgets like this one allow you to display information in a +variety of styles. Display styles are controlled using a mechanism +called ') + insert('end', 'tags', style_tag_big) + insert('end', '. Tags are just textual names that you can apply to one +or more ranges of characters within a text widget. You can configure +tags with various display styles. If you do this, then the tagged +characters will be displayed with the styles you chose. The +available display styles are: +') + insert('end', "\n1. Font.", style_tag_big) + insert('end', " You can choose any X font, ") + insert('end', "large", style_tag_verybig) + insert('end', " or ") + insert('end', "small.\n") + insert('end', "\n2. Color.", style_tag_big) + insert('end', " You can change either the ") + insert('end', "background", style_tag_color1) + insert('end', " or ") + insert('end', "foreground", style_tag_color2) + insert('end', "\ncolor, or ") + insert('end', "both", style_tag_color1, style_tag_color2) + insert('end', ".\n") + insert('end', "\n3. Stippling.", style_tag_big) + insert('end', " You can cause either the ") + insert('end', "background", style_tag_bgstipple) + insert('end', " or ") + insert('end', "foreground", style_tag_fgstipple) + insert('end', "\ninformation to be drawn with a stipple fill instead of a solid fill.\n") + insert('end', "\n4. Underlining.", style_tag_big) + insert('end', " You can ") + insert('end', "underline", style_tag_underline) + insert('end', " ranges of text.\n") + insert('end', "\n5. Overstrikes.", style_tag_big) + insert('end', " You can ") + insert('end', "draw lines through", style_tag_overstrike) + insert('end', " ranges of text.\n") + insert('end', "\n6. 3-D effects.", style_tag_big) + insert('end', " You can arrange for the background to be drawn\nwith a border that makes characters appear either\n") + insert('end', "raised", style_tag_raised) + insert('end', " or ") + insert('end', "sunken", style_tag_sunken) + insert('end', ".\n") + insert('end', "\n7. Justification.", style_tag_big) + insert('end', " You can arrange for lines to be displayed\n") + insert('end', "left-justified,\n") + insert('end', "right-justified, or\n", style_tag_right) + insert('end', "centered.\n", style_tag_center) + insert('end', "\n8. Superscripts and subscripts.", style_tag_big) + insert('end', " You can control the vertical\n") + insert('end', "position of text to generate superscript effects like 10") + insert('end', "n", style_tag_super) + insert('end', " or\nsubscript effects like X") + insert('end', "i", style_tag_sub) + insert('end', ".\n") + insert('end', "\n9. Margins.", style_tag_big) + insert('end', " You can control the amount of extra space left") + insert('end', " on\neach side of the text:\n") + insert('end', "This paragraph is an example of the use of ", style_tag_margins) + insert('end', "margins. It consists of a single line of text ", style_tag_margins) + insert('end', "that wraps around on the screen. There are two ", style_tag_margins) + insert('end', "separate left margin values, one for the first ", style_tag_margins) + insert('end', "display line associated with the text line, ", style_tag_margins) + insert('end', "and one for the subsequent display lines, which ", style_tag_margins) + insert('end', "occur because of wrapping. There is also a ", style_tag_margins) + insert('end', "separate specification for the right margin, ", style_tag_margins) + insert('end', "which is used to choose wrap points for lines.\n", style_tag_margins) + insert('end', "\n10. Spacing.", style_tag_big) + insert('end', " You can control the spacing of lines with three\n") + insert('end', "separate parameters. \"Spacing1\" tells how much ") + insert('end', "extra space to leave\nabove a line, \"spacing3\" ") + insert('end', "tells how much space to leave below a line,\nand ") + insert('end', "if a text line wraps, \"spacing2\" tells how much ") + insert('end', "space to leave\nbetween the display lines that ") + insert('end', "make up the text line.\n") + insert('end', "These indented paragraphs illustrate how spacing ", style_tag_spacing) + insert('end', "can be used. Each paragraph is actually a ", style_tag_spacing) + insert('end', "single line in the text widget, which is ", style_tag_spacing) + insert('end', "word-wrapped by the widget.\n", style_tag_spacing) + insert('end', "Spacing1 is set to 10 points for this text, ", style_tag_spacing) + insert('end', "which results in relatively large gaps between ", style_tag_spacing) + insert('end', "the paragraphs. Spacing2 is set to 2 points, ", style_tag_spacing) + insert('end', "which results in just a bit of extra space ", style_tag_spacing) + insert('end', "within a pararaph. Spacing3 isn't used ", style_tag_spacing) + insert('end', "in this example.\n", style_tag_spacing) + insert('end', "To see where the space is, select ranges of ", style_tag_spacing) + insert('end', "text within these paragraphs. The selection ", style_tag_spacing) + insert('end', "highlight will cover the extra space.", style_tag_spacing) + +} + diff --git a/ext/tk/sample/demos-en/tcolor b/ext/tk/sample/demos-en/tcolor new file mode 100644 index 0000000000..8750d15c3e --- /dev/null +++ b/ext/tk/sample/demos-en/tcolor @@ -0,0 +1,513 @@ +#!/usr/bin/env ruby +# +# tcolor -- +# このスクリプトはRGB,HSB,CYM形式をサポートする +# 簡易カラーエディタです。 +# +# Copyright (C) 1998 Takaaki Tateishi(ttate@jaist.ac.jp) +# last update: Thu Jun 18 06:32:35 JST 1998 +# + +# まずはtk.rbを読み込む。 + +require "tk" + + +# Tkによって変更される変数はTkVariableのインスタンスを使う。 + +$colorSpace = TkVariable.new(:rgb) +$red = 65535 +$green = 0 +$blue = 0 +$color = "#ffff00000000" +$updating = TkVariable.new(0) +$autoUpdate = TkVariable.new(1) +$name = TkVariable.new("") +# $command = TkVariable.new("print(%%,\"\n\")") +$command = TkVariable.new("") +$label1 = TkVariable.new("label1") +$label2 = TkVariable.new("label2") +$label3 = TkVariable.new("label3") + + +# 各イベント用のメソッド + +def rgbToHsv(red,green,blue) + + if ( red > green ) + max = red + min = green + else + max = green + min = red + end + + if ( blue > max ) + max = blue + else + if ( blue < min ) + min = blue + end + end + + range = max - min + + if ( max == 0 ) + sat = 0.0 + else + sat = (max-min)/max + end + + if ( sat == 0 ) + hue = 0.0 + else + rc = (max-red)/range + gc = (max-green)/range + bc = (max-blue)/range + if ( red == max ) + hue = 0.166667 * (bc - gc) + else + if ( green == max ) + hue = 0.166667 * (2.0 + rc - bc) + else + hue = 0.166667 * (4.0 + gc - rc) + end + end + if ( hue < 0.0 ) + hue = hue + 1.0 + end + end + + [hue,sat,max/65535] +end + + +def hsbToRgb(hue,sat,value) + v = 65535.0 * value + if( sat == 0 ) + ans = [v,v,v] + else + hue = hue*6.0 + if ( hue >= 6 ) + hue = 0.0 + end + i = hue.to_i + f = hue - i + p = 65535.0 * value * (1.0 - sat) + q = 65535.0 * value * (1.0 - (sat * f)) + t = 65535.0 * value * (1.0 - (sat * (1.0 - f))) + case i + when 0 + ans = [v,t,p] + when 1 + ans = [q,v,p] + when 2 + ans = [p,v,t] + when 3 + ans = [p,q,v] + when 4 + ans = [t,p,v] + when 5 + ans = [v,p,q] + else + raise(eException,"i value #{i} is out of range") + end + end + return ans +end + + +def doUpdate + newCmd = $command.to_s.gsub("%%","\"#{$color}\"") + eval(newCmd) +end + + +def tc_scaleChanged + if( $updating.to_i == 1 ) + return + end + + scale1 = $root.middle.middle.scale1 + scale2 = $root.middle.middle.scale2 + scale3 = $root.middle.middle.scale3 + + case $colorSpace.to_i + when :rgb + $red = (scale1.get * 65.535).to_i + $green = (scale2.get * 65.535).to_i + $blue = (scale3.get * 65.535).to_i + when :cmy + $red = (65535 - scale1.get * 65.535).to_i + $green = (65535 - scale2.get * 65.535).to_i + $blue = (65535 - scale3.get * 65.535).to_i + when :hsb + list = hsbToRgb(scale1.get / 1000.0, + scale2.get / 1000.0, + scale3.get / 1000.0) + $red = list[0] + $green = list[1] + $blue = list[2] + else + raise(Exception,"unknown colorSpace") + end + $color = format("#%04x%04x%04x",$red.to_i,$green.to_i,$blue.to_i) + $root.middle.right.set_color($color) + if( $autoUpdate.to_i == 1 ) + doUpdate + end + Tk.update(TRUE) +end + + +def tc_setScales + $updating.value = 1 + + scale1 = $root.middle.middle.scale1 + scale2 = $root.middle.middle.scale2 + scale3 = $root.middle.middle.scale3 + + case $colorSpace.to_i + when :rgb + scale1.set($red / 65.535) + scale2.set($green / 65.535) + scale3.set($blue / 65.535) + when :cmy + scale1.set((65535 - $red) / 65.535) + scale2.set((65535 - $green) / 65.535) + scale3.set((65535 - $blue) / 65.535) + when :hsb + list = rgbToHsv($red,$green,$blue) + scale1.set( list[0] * 1000.0 ) + scale2.set( list[1] * 1000.0 ) + scale3.set( list[2] * 1000.0 ) + else + raise(Exception,"unknown colorSpace") + end + + $updating.value = 0 +end + + +def tc_loadNamedColor(name) + if name[0,1] != "#" + list = TkWinfo.rgb($root.middle.right.swatch,name) + $red = list[0] + $green = list[1] + $blue = list[2] + else + case name.length + when 4 + format = /#(.{1})(.{1})(.{1})/ + shift = 12 + when 7 + format = /#(.{2})(.{2})(.{2})/ + shift = 8 + when 10 + format = /#(.{3})(.{3})(.{3})/ + shift = 4 + when 13 + format = /#(.{4})(.{4})(.{4})/ + shift = 0 + else + raise(eException,"syntax error in color name \"#{name}\"") + end + name.scan(format){|strlist| + if strlist.length != 3 + raise(eException,"syntax error in color name \"#{name}\"") + end + $red = strlist[0].to_i + $green = strlist[1].to_i + $blue = strlist[2].to_i + } + $red = $red << shift + $green = $green << shift + $blue = $blue << shift + end + + tc_setScales + $color = format("#%04x%04x%04x",$red,$green,$blue) + $root.middle.right.set_color($color) + if $autoUpdate.to_i == 1 + doUpdate + end +end + + +def changeColorSpace(space) + case space + when :rgb + $label1.value = "Red" + $label2.value = "Green" + $label3.value = "Blue" + when :cmy + $label1.value = "Cyan" + $label2.value = "Magenta" + $label3.value = "Yellow" + when :hsb + $label1.value = "Hue" + $label2.value = "Saturation" + $label3.value = "Brightness" + end + tc_setScales +end + + + + + +# tcolor用のメニュー + +class TkColorMenuFrame<TkFrame + def initialize(parent) + super(parent, + "relief"=>"raised", + "borderwidth"=>"2") + + # Fileメニューボタンの生成 + @file = TkMenubutton.new(self){|button| + + # Fileメニューの作成 + @file_menu = TkMenu.new(button){ + add "radio", + "label" => "RGB color space", + "variable" => $colorSpace, + "value" => :rgb, + "underline" => "0", + "command" => proc{changeColorSpace(:rgb)} + add "radio", + "label" => "CMY color space", + "variable" => $colorSpace, + "value" => :cmy, + "underline" => "0", + "command" => proc{changeColorSpace(:cmy)} + add "radio", + "label" => "HSB color space", + "variable" => $colorSpace, + "value" => :hsb, + "underline" => "0", + "command" => proc{changeColorSpace(:hsb)} + add "separator" + add "radio", + "label" => "Qutomatic updates", + "variable" => $autoUpdate, + "value" => "1", + "underline" => "0" + add "radio", + "label" => "Manual updates", + "variable" => $autoUpdate, + "value" => "0", + "underline" => "0" + add "separator" + add "command", + "label" => "Exit program", + "underline" => "0", + "command" => proc{exit} + } + + # FileメニューとFileボタンを関連付ける + menu @file_menu + + text "File" + underline "0" + }.pack("side"=>"left") + + self + end +end + + +# 下部のフレームのためのクラス +class TkColorBotFrame<TkFrame + def initialize(parent) + super(parent, + "relief"=> "raised", + "borderwidth"=> 2) + + @commandLabel = TkLabel.new(self, + "text"=> "Command:") + @command = TkEntry.new(self, + "relief"=> "sunken", + "borderwidth"=> "2", + "textvariable"=> $command, + "font"=> "-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*") + @update = TkButton.new(self, + "text"=> "Update", + "command"=> proc{doUpdate}) + @commandLabel.pack("side"=>"left") + @update.pack("side"=>"right","pady"=>".1c","padx"=>".25c") + @command.pack("expand"=>"yes","fill"=>"x","ipadx"=>".25c") + + self + end +end + + +# 中段左のフレーム +class TkColorMiddleLeftFrame<TkFrame + def initialize(parent) + super(parent) + + for i in ["/usr/local/lib/X11rgb.txt","/usr/lib/X11/rgb.txt", + "/X11/R5/lib/X11/rgb.txt","/X11/R4/lib/rgb/rgb.txt", + "/usr/openwin/lib/X11/rgb.txt"] + if !File.readable?(i) + next + end + f = File.open(i) + @scroll = TkScrollbar.new(self, + "orient"=>"vertical", + "relief"=>"sunken", + "borderwidth"=>"2") + @scroll.pack("side"=>"right","fill"=>"y") + @names = TkListbox.new(self, + "width"=>"20", + "height"=>"12", + "yscrollcommand"=> proc{|first,last| @scroll.set first,last}, + "relief"=>"sunken", + "borderwidth"=>"2", + "exportselection"=>"false") + @scroll.command(proc{|*args| @names.yview *args}) + @names.bind("Double-1",proc{ + tc_loadNamedColor(@names.get(@names.curselection))}) + @names.pack("side"=>"left") + while (line = f.gets) + line.chop! + linelist = line.split(/[ \t]+/) + if linelist.length == 4 + @names.insert("end",linelist[3]) + end + end + f.close + break + end + + self + end +end + + +# 中段中央のフレーム +class TkColorMiddleMiddleFrame<TkFrame + # @scale1,@scale2,@scale3を外部から参照のみ許可する。(変更不可) + attr_reader :scale1, :scale2, :scale3 + + def initialize(parent) + super(parent) + + @f1 = TkFrame.new(self) + @f2 = TkFrame.new(self) + @f3 = TkFrame.new(self) + @f4 = TkFrame.new(self) + + for f in [@f1,@f2,@f3] + f.pack("side"=>"top","expand"=>"yes") + end + @f4.pack("side"=>"top","expand"=>"yes","fill"=>"x") + + @label1 = TkLabel.new(self,"textvariable"=>$label1) + @scale1 = TkScale.new(self,"from"=>"0","to"=>"1000","length"=>"6c", + "orient"=>"horizontal", + "command"=>proc{tc_scaleChanged}) + @scale1.pack("side"=>"top","anchor"=>"w") + @label1.pack("side"=>"top","anchor"=>"w") + + @label2 = TkLabel.new(self,"textvariable"=>$label2) + @scale2 = TkScale.new(self,"from"=>"0","to"=>"1000","length"=>"6c", + "orient"=>"horizontal", + "command"=>proc{tc_scaleChanged}) + @scale2.pack("side"=>"top","anchor"=>"w") + @label2.pack("side"=>"top","anchor"=>"w") + + @label3 = TkLabel.new(self,"textvariable"=>$label3) + @scale3 = TkScale.new(self,"from"=>"0","to"=>"1000","length"=>"6c", + "orient"=>"horizontal", + "command"=>proc{tc_scaleChanged}) + @scale3.pack("side"=>"top","anchor"=>"w") + @label3.pack("side"=>"top","anchor"=>"w") + + @nameLabel = TkLabel.new(self,"text"=>"Name:") + @name = TkEntry.new(self,"relief"=>"sunken","borderwidth"=>"2", + "textvariable"=>$name,"width"=>"10", + "font"=>"-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*") + @nameLabel.pack("side"=>"left") + @name.pack("side"=>"right", "expand"=>"1", "fill"=>"x") + @name.bind("Return",proc{tc_loadNamedColor $name.to_s}) + + self + end +end + + +class TkColorMiddleRightFrame<TkFrame + attr_reader :swatch + + def initialize(parent) + super(parent) + @swatch = TkFrame.new(self, "width"=>"2c", "height"=>"5c", + "background"=>$color) + @value = TkLabel.new(self, + "text"=>$color, + "width"=>"13", + "font"=>"-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*") + @swatch.pack("side"=>"top","expand"=>"yes","fill"=>"both") + @value.pack("side"=>"bottom","pady"=>".25c") + + self + end + + def set_color(color) + @swatch["background"] = color + @value["text"] = color + end +end + + + +# 中段のフレーム +class TkColorMiddleFrame<TkFrame + attr_reader :left, :middle, :right + + def initialize(parent) + super(parent, + "relief"=> "raised", + "borderwidth"=> "2") + + @left = TkColorMiddleLeftFrame.new(self) + @left.pack("side"=>"left","padx"=>".25c","pady"=>".25c") + + @middle = TkColorMiddleMiddleFrame.new(self) + @middle.pack("side"=>"left","expand"=>"yes","fill"=>"y") + + @right = TkColorMiddleRightFrame.new(self) + @right.pack("side"=>"left","padx"=>".25c","pady"=>".25c","anchor"=>"s") + + self + end +end + + +class TkColor<TkRoot + attr_reader :menu, :bottom, :middle + + def initialize + super + @menu = TkColorMenuFrame.new(self) + @menu.pack("side"=>"top", "fill"=>"x") + + @bottom = TkColorBotFrame.new(self) + @bottom.pack("side"=>"bottom","fill"=>"x") + + @middle = TkColorMiddleFrame.new(self) + @middle.pack("side"=>"top","fill"=>"both") + + self + end +end + + +$root = TkColor.new + +# イベントを待つ為にループに入る。 +changeColorSpace :rgb +Tk.mainloop diff --git a/ext/tk/sample/demos-en/tcolor.bak b/ext/tk/sample/demos-en/tcolor.bak new file mode 100644 index 0000000000..5464aebae2 --- /dev/null +++ b/ext/tk/sample/demos-en/tcolor.bak @@ -0,0 +1,513 @@ +#!/usr/local/bin/ruby +# +# tcolor -- +# このスクリプトはRGB,HSB,CYM形式をサポートする +# 簡易カラーエディタです。 +# +# Copyright (C) 1998 Takaaki Tateishi(ttate@jaist.ac.jp) +# last update: Thu Jun 18 06:32:35 JST 1998 +# + +# まずはtk.rbを読み込む。 + +require "tk" + + +# Tkによって変更される変数はTkVariableのインスタンスを使う。 + +$colorSpace = TkVariable.new(:rgb) +$red = 65535 +$green = 0 +$blue = 0 +$color = "#ffff00000000" +$updating = TkVariable.new(0) +$autoUpdate = TkVariable.new(1) +$name = TkVariable.new("") +# $command = TkVariable.new("print(%%,\"\n\")") +$command = TkVariable.new("") +$label1 = TkVariable.new("label1") +$label2 = TkVariable.new("label2") +$label3 = TkVariable.new("label3") + + +# 各イベント用のメソッド + +def rgbToHsv(red,green,blue) + + if ( red > green ) + max = red + min = green + else + max = green + min = red + end + + if ( blue > max ) + max = blue + else + if ( blue < min ) + min = blue + end + end + + range = max - min + + if ( max == 0 ) + sat = 0.0 + else + sat = (max-min)/max + end + + if ( sat == 0 ) + hue = 0.0 + else + rc = (max-red)/range + gc = (max-green)/range + bc = (max-blue)/range + if ( red == max ) + hue = 0.166667 * (bc - gc) + else + if ( green == max ) + hue = 0.166667 * (2.0 + rc - bc) + else + hue = 0.166667 * (4.0 + gc - rc) + end + end + if ( hue < 0.0 ) + hue = hue + 1.0 + end + end + + [hue,sat,max/65535] +end + + +def hsbToRgb(hue,sat,value) + v = 65535.0 * value + if( sat == 0 ) + ans = [v,v,v] + else + hue = hue*6.0 + if ( hue >= 6 ) + hue = 0.0 + end + i = hue.to_i + f = hue - i + p = 65535.0 * value * (1.0 - sat) + q = 65535.0 * value * (1.0 - (sat * f)) + t = 65535.0 * value * (1.0 - (sat * (1.0 - f))) + case i + when 0 + ans = [v,t,p] + when 1 + ans = [q,v,p] + when 2 + ans = [p,v,t] + when 3 + ans = [p,q,v] + when 4 + ans = [t,p,v] + when 5 + ans = [v,p,q] + else + raise(eException,"i value #{i} is out of range") + end + end + return ans +end + + +def doUpdate + newCmd = $command.to_s.gsub("%%","\"#{$color}\"") + eval(newCmd) +end + + +def tc_scaleChanged + if( $updating.to_i == 1 ) + return + end + + scale1 = $root.middle.middle.scale1 + scale2 = $root.middle.middle.scale2 + scale3 = $root.middle.middle.scale3 + + case $colorSpace.to_i + when :rgb + $red = (scale1.get * 65.535).to_i + $green = (scale2.get * 65.535).to_i + $blue = (scale3.get * 65.535).to_i + when :cmy + $red = (65535 - scale1.get * 65.535).to_i + $green = (65535 - scale2.get * 65.535).to_i + $blue = (65535 - scale3.get * 65.535).to_i + when :hsb + list = hsbToRgb(scale1.get / 1000.0, + scale2.get / 1000.0, + scale3.get / 1000.0) + $red = list[0] + $green = list[1] + $blue = list[2] + else + raise(Exception,"unknown colorSpace") + end + $color = format("#%04x%04x%04x",$red.to_i,$green.to_i,$blue.to_i) + $root.middle.right.set_color($color) + if( $autoUpdate.to_i == 1 ) + doUpdate + end + Tk.update(TRUE) +end + + +def tc_setScales + $updating.value = 1 + + scale1 = $root.middle.middle.scale1 + scale2 = $root.middle.middle.scale2 + scale3 = $root.middle.middle.scale3 + + case $colorSpace.to_i + when :rgb + scale1.set($red / 65.535) + scale2.set($green / 65.535) + scale3.set($blue / 65.535) + when :cmy + scale1.set((65535 - $red) / 65.535) + scale2.set((65535 - $green) / 65.535) + scale3.set((65535 - $blue) / 65.535) + when :hsb + list = rgbToHsv($red,$green,$blue) + scale1.set( list[0] * 1000.0 ) + scale2.set( list[1] * 1000.0 ) + scale3.set( list[2] * 1000.0 ) + else + raise(Exception,"unknown colorSpace") + end + + $updating.value = 0 +end + + +def tc_loadNamedColor(name) + if name[0,1] != "#" + list = TkWinfo.rgb($root.middle.right.swatch,name) + $red = list[0] + $green = list[1] + $blue = list[2] + else + case name.length + when 4 + format = /#(.{1})(.{1})(.{1})/ + shift = 12 + when 7 + format = /#(.{2})(.{2})(.{2})/ + shift = 8 + when 10 + format = /#(.{3})(.{3})(.{3})/ + shift = 4 + when 13 + format = /#(.{4})(.{4})(.{4})/ + shift = 0 + else + raise(eException,"syntax error in color name \"#{name}\"") + end + name.scan(format){|strlist| + if strlist.length != 3 + raise(eException,"syntax error in color name \"#{name}\"") + end + $red = strlist[0].to_i + $green = strlist[1].to_i + $blue = strlist[2].to_i + } + $red = $red << shift + $green = $green << shift + $blue = $blue << shift + end + + tc_setScales + $color = format("#%04x%04x%04x",$red,$green,$blue) + $root.middle.right.set_color($color) + if $autoUpdate.to_i == 1 + doUpdate + end +end + + +def changeColorSpace(space) + case space + when :rgb + $label1.value = "Red" + $label2.value = "Green" + $label3.value = "Blue" + when :cmy + $label1.value = "Cyan" + $label2.value = "Magenta" + $label3.value = "Yellow" + when :hsb + $label1.value = "Hue" + $label2.value = "Saturation" + $label3.value = "Brightness" + end + tc_setScales +end + + + + + +# tcolor用のメニュー + +class TkColorMenuFrame<TkFrame + def initialize(parent) + super(parent, + "relief"=>"raised", + "borderwidth"=>"2") + + # Fileメニューボタンの生成 + @file = TkMenubutton.new(self){|button| + + # Fileメニューの作成 + @file_menu = TkMenu.new(button){ + add "radio", + "label" => "RGB color space", + "variable" => $colorSpace, + "value" => :rgb, + "underline" => "0", + "command" => proc{changeColorSpace(:rgb)} + add "radio", + "label" => "CMY color space", + "variable" => $colorSpace, + "value" => :cmy, + "underline" => "0", + "command" => proc{changeColorSpace(:cmy)} + add "radio", + "label" => "HSB color space", + "variable" => $colorSpace, + "value" => :hsb, + "underline" => "0", + "command" => proc{changeColorSpace(:hsb)} + add "separator" + add "radio", + "label" => "Qutomatic updates", + "variable" => $autoUpdate, + "value" => "1", + "underline" => "0" + add "radio", + "label" => "Manual updates", + "variable" => $autoUpdate, + "value" => "0", + "underline" => "0" + add "separator" + add "command", + "label" => "Exit program", + "underline" => "0", + "command" => proc{exit} + } + + # FileメニューとFileボタンを関連付ける + menu @file_menu + + text "File" + underline "0" + }.pack("side"=>"left") + + self + end +end + + +# 下部のフレームのためのクラス +class TkColorBotFrame<TkFrame + def initialize(parent) + super(parent, + "relief"=> "raised", + "borderwidth"=> 2) + + @commandLabel = TkLabel.new(self, + "text"=> "Command:") + @command = TkEntry.new(self, + "relief"=> "sunken", + "borderwidth"=> "2", + "textvariable"=> $command, + "font"=> "-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*") + @update = TkButton.new(self, + "text"=> "Update", + "command"=> proc{doUpdate}) + @commandLabel.pack("side"=>"left") + @update.pack("side"=>"right","pady"=>".1c","padx"=>".25c") + @command.pack("expand"=>"yes","fill"=>"x","ipadx"=>".25c") + + self + end +end + + +# 中段左のフレーム +class TkColorMiddleLeftFrame<TkFrame + def initialize(parent) + super(parent) + + for i in ["/usr/local/lib/X11rgb.txt","/usr/lib/X11/rgb.txt", + "/X11/R5/lib/X11/rgb.txt","/X11/R4/lib/rgb/rgb.txt", + "/usr/openwin/lib/X11/rgb.txt"] + if !File.readable?(i) + next + end + f = File.open(i) + @scroll = TkScrollbar.new(self, + "orient"=>"vertical", + "relief"=>"sunken", + "borderwidth"=>"2") + @scroll.pack("side"=>"right","fill"=>"y") + @names = TkListbox.new(self, + "width"=>"20", + "height"=>"12", + "yscrollcommand"=> proc{|first,last| @scroll.set first,last}, + "relief"=>"sunken", + "borderwidth"=>"2", + "exportselection"=>"false") + @scroll.command(proc{|*args| @names.yview *args}) + @names.bind("Double-1",proc{ + tc_loadNamedColor(@names.get(@names.curselection))}) + @names.pack("side"=>"left") + while (line = f.gets) + line.chop! + linelist = line.split(/[ \t]+/) + if linelist.length == 4 + @names.insert("end",linelist[3]) + end + end + f.close + break + end + + self + end +end + + +# 中段中央のフレーム +class TkColorMiddleMiddleFrame<TkFrame + # @scale1,@scale2,@scale3を外部から参照のみ許可する。(変更不可) + attr_reader :scale1, :scale2, :scale3 + + def initialize(parent) + super(parent) + + @f1 = TkFrame.new(self) + @f2 = TkFrame.new(self) + @f3 = TkFrame.new(self) + @f4 = TkFrame.new(self) + + for f in [@f1,@f2,@f3] + f.pack("side"=>"top","expand"=>"yes") + end + @f4.pack("side"=>"top","expand"=>"yes","fill"=>"x") + + @label1 = TkLabel.new(self,"textvariable"=>$label1) + @scale1 = TkScale.new(self,"from"=>"0","to"=>"1000","length"=>"6c", + "orient"=>"horizontal", + "command"=>proc{tc_scaleChanged}) + @scale1.pack("side"=>"top","anchor"=>"w") + @label1.pack("side"=>"top","anchor"=>"w") + + @label2 = TkLabel.new(self,"textvariable"=>$label2) + @scale2 = TkScale.new(self,"from"=>"0","to"=>"1000","length"=>"6c", + "orient"=>"horizontal", + "command"=>proc{tc_scaleChanged}) + @scale2.pack("side"=>"top","anchor"=>"w") + @label2.pack("side"=>"top","anchor"=>"w") + + @label3 = TkLabel.new(self,"textvariable"=>$label3) + @scale3 = TkScale.new(self,"from"=>"0","to"=>"1000","length"=>"6c", + "orient"=>"horizontal", + "command"=>proc{tc_scaleChanged}) + @scale3.pack("side"=>"top","anchor"=>"w") + @label3.pack("side"=>"top","anchor"=>"w") + + @nameLabel = TkLabel.new(self,"text"=>"Name:") + @name = TkEntry.new(self,"relief"=>"sunken","borderwidth"=>"2", + "textvariable"=>$name,"width"=>"10", + "font"=>"-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*") + @nameLabel.pack("side"=>"left") + @name.pack("side"=>"right", "expand"=>"1", "fill"=>"x") + @name.bind("Return",proc{tc_loadNamedColor $name.to_s}) + + self + end +end + + +class TkColorMiddleRightFrame<TkFrame + attr_reader :swatch + + def initialize(parent) + super(parent) + @swatch = TkFrame.new(self, "width"=>"2c", "height"=>"5c", + "background"=>$color) + @value = TkLabel.new(self, + "text"=>$color, + "width"=>"13", + "font"=>"-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*") + @swatch.pack("side"=>"top","expand"=>"yes","fill"=>"both") + @value.pack("side"=>"bottom","pady"=>".25c") + + self + end + + def set_color(color) + @swatch["background"] = color + @value["text"] = color + end +end + + + +# 中段のフレーム +class TkColorMiddleFrame<TkFrame + attr_reader :left, :middle, :right + + def initialize(parent) + super(parent, + "relief"=> "raised", + "borderwidth"=> "2") + + @left = TkColorMiddleLeftFrame.new(self) + @left.pack("side"=>"left","padx"=>".25c","pady"=>".25c") + + @middle = TkColorMiddleMiddleFrame.new(self) + @middle.pack("side"=>"left","expand"=>"yes","fill"=>"y") + + @right = TkColorMiddleRightFrame.new(self) + @right.pack("side"=>"left","padx"=>".25c","pady"=>".25c","anchor"=>"s") + + self + end +end + + +class TkColor<TkRoot + attr_reader :menu, :bottom, :middle + + def initialize + super + @menu = TkColorMenuFrame.new(self) + @menu.pack("side"=>"top", "fill"=>"x") + + @bottom = TkColorBotFrame.new(self) + @bottom.pack("side"=>"bottom","fill"=>"x") + + @middle = TkColorMiddleFrame.new(self) + @middle.pack("side"=>"top","fill"=>"both") + + self + end +end + + +$root = TkColor.new + +# イベントを待つ為にループに入る。 +changeColorSpace :rgb +Tk.mainloop diff --git a/ext/tk/sample/demos-en/text.rb b/ext/tk/sample/demos-en/text.rb new file mode 100644 index 0000000000..1dcaad1cf9 --- /dev/null +++ b/ext/tk/sample/demos-en/text.rb @@ -0,0 +1,102 @@ +# text.rb +# +# This demonstration script creates a text widget that describes +# the basic editing functions. +# +# text (basic facilities) widget demo (called by 'widget') +# + +# toplevel widget +if defined?($text_demo) && $text_demo + $text_demo.destroy + $text_demo = nil +end + +# demo toplevel widget +$text_demo = TkToplevel.new {|w| + title("Text Demonstration - Basic Facilities") + iconname("text") + positionWindow(w) +} + +# frame +TkFrame.new($text_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $text_demo + $text_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'text'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# text 生成 +TkText.new($text_demo){|t| + # 生成 + relief 'sunken' + bd 2 + setgrid 1 + height 30 + TkScrollbar.new($text_demo) {|s| + pack('side'=>'right', 'fill'=>'y') + command proc{|*args| t.yview(*args)} + t.yscrollcommand proc{|first,last| s.set first,last} + } + pack('expand'=>'yes', 'fill'=>'both') + + # + insert('0.0', %q|This window is a text widget. It displays one or more lines of text +and allows you to edit the text. Here is a summary of the things you +can do to a text widget: + +1. Scrolling. Use the scrollbar to adjust the view in the text window. + +2. Scanning. Press mouse button 2 in the text window and drag up or down. +This will drag the text at high speed to allow you to scan its contents. + +3. Insert text. Press mouse button 1 to set the insertion cursor, then +type text. What you type will be added to the widget. + +4. Select. Press mouse button 1 and drag to select a range of characters. +Once you've released the button, you can adjust the selection by pressing +button 1 with the shift key down. This will reset the end of the +selection nearest the mouse cursor and you can drag that end of the +selection by dragging the mouse before releasing the mouse button. +You can double-click to select whole words or triple-click to select +whole lines. + +5. Delete and replace. To delete text, select the characters you'd like +to delete and type Backspace or Delete. Alternatively, you can type new +text, in which case it will replace the selected text. + +6. Copy the selection. To copy the selection into this window, select +what you want to copy (either here or in another application), then +click button 2 to copy the selection to the point of the mouse cursor. + +7. Edit. Text widgets support the standard Motif editing characters +plus many Emacs editing characters. Backspace and Control-h erase the +character to the left of the insertion cursor. Delete and Control-d +erase the character to the right of the insertion cursor. Meta-backspace +deletes the word to the left of the insertion cursor, and Meta-d deletes +the word to the right of the insertion cursor. Control-k deletes from +the insertion cursor to the end of the line, or it deletes the newline +character if that is the only thing left on the line. Control-o opens +a new line by inserting a newline character to the right of the insertion +cursor. Control-t transposes the two characters on either side of the +insertion cursor. + +7. Resize the window. This widget has been configured with the "setGrid" +option on, so that if you resize the window it will always resize to an +even number of characters high and wide. Also, if you make the window +narrow you can see that long lines automatically wrap around onto +additional lines so that all the information is always visible.|) + + set_insert('0.0') +} + diff --git a/ext/tk/sample/demos-en/timer b/ext/tk/sample/demos-en/timer new file mode 100644 index 0000000000..896568c0bc --- /dev/null +++ b/ext/tk/sample/demos-en/timer @@ -0,0 +1,120 @@ +#!/usr/bin/env ruby +# +# timer -- +# This script generates a counter with start,stop and reset buttons. +# +# Copyright (C) 1998 Takaaki Tateishi (ttate@jaist.ac.jp) +# last update: Sat Jun 27 12:24:14 JST 1998 +# + +require "tk" +require "thread" +require "tkafter" + +$time = "0.00" +$m = Mutex.new +$loop = false + +def timer_stop + $loop = false + $m.lock +end + +def timer_start + $loop = true + $m.unlock +end + +def timer_reset + $time = "0.00" + $root.countframe.counter['text'] = $time +end + +def timer_loop + if $loop + $time = $time.succ + $root.countframe.counter['text'] = $time + end + Tk.after(10,proc{timer_loop}) +end + + +# +# thread version +# +def timer_loop2 + while true + $m.lock + $time = $time.succ + $root.countframe.counter['text'] = $time + sleep(0.01) + $m.unlock + end +end + +# +# TkAfter +# +def timer_loop3 + if $loop + $time = $time.succ + $root.countframe.counter['text'] = $time + end +end + + +class CountFrame < TkFrame + attr_reader :counter + + def initialize(parent=nil,keys=nil) + super(parent,keys) + @counter = TkLabel.new(self, + 'text'=>$time, + 'relief'=>'raised') + @counter.pack('fill'=>'both') + self + end +end + + +class ButtonFrame < TkFrame + def initialize(parent=nil,keys=nil) + super(parent,keys) + @stop = TkButton.new(self, + 'text'=>'Stop', + 'command'=>proc{timer_stop}) + @start = TkButton.new(self, + 'text'=>'Start', + 'command'=>proc{timer_start}) + @reset = TkButton.new(self, + 'text'=>'Reset', + 'command'=>proc{timer_reset}) + for b in [@stop,@start,@reset] + b.pack('side'=>'left', 'fill'=>'both', 'expand'=>'yes') + end + end +end + + +class Timer < TkRoot + attr_reader :countframe + + def initialize + super + @countframe = CountFrame.new(self) + @buttonframe = ButtonFrame.new(self) + for f in [@buttonframe,@countframe] + f.pack('side'=>'top', 'fill'=>'both') + end + self + end +end + + +$root = Timer.new + +#$thread = Thread.start{timer_loop2} +#timer_loop +TkAfter.new(10,-1,proc{timer_loop3}).start + +Tk.mainloop diff --git a/ext/tk/sample/demos-en/tkencoding.rb b/ext/tk/sample/demos-en/tkencoding.rb new file mode 100644 index 0000000000..727491a6ad --- /dev/null +++ b/ext/tk/sample/demos-en/tkencoding.rb @@ -0,0 +1,42 @@ +# -*- ruby -*- +# +# tkencoding.rb +# written by ttate@jaist.ac.jp + +class TclTkIp + alias __eval _eval + alias __invoke _invoke + private :__eval + private :__invoke + + attr_accessor :encoding + + def _eval(cmd) + if( @encoding ) + _fromUTF8(__eval(_toUTF8(cmd,@encoding)),@encoding) + else + __eval(cmd) + end + end + + def _invoke(*cmds) + if( @encoding ) + cmds = cmds.collect{|cmd| _toUTF8(cmd,@encoding)} + _fromUTF8(__invoke(*cmds),@encoding) + else + __invoke(*cmds) + end + end +end + +module Tk + INTERP = TkCore::INTERP + + def encoding=(name) + INTERP.encoding = name + end + + def encoding + INTERP.encoding + end +end diff --git a/ext/tk/sample/demos-en/twind.rb b/ext/tk/sample/demos-en/twind.rb new file mode 100644 index 0000000000..c841b7c317 --- /dev/null +++ b/ext/tk/sample/demos-en/twind.rb @@ -0,0 +1,285 @@ +# twind.rb +# +# This demonstration script creates a text widget with a bunch of +# embedded windows. +# +# text (embedded windows) widget demo (called by 'widget') +# + +# toplevel widget +if defined?($twind_demo) && $twind_demo + $twind_demo.destroy + $twind_demo = nil +end + +# demo toplevel widget +$twind_demo = TkToplevel.new {|w| + title("Text Demonstration - Embedded Windows") + iconname("Embedded Windows") + positionWindow(w) +} + +# frame +$twind_buttons = TkFrame.new($twind_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc{ + tmppath = $twind_demo + $twind_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc{showCode 'twind'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$twind_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame +$twind_text = nil +TkFrame.new($twind_demo, 'highlightthickness'=>2, 'borderwidth'=>2, + 'relief'=>'sunken') {|f| + $twind_text = TkText.new(f, 'setgrid'=>'true', 'font'=>$font, + 'width'=>'70', 'height'=>35, 'wrap'=>'word', + 'highlightthickness'=>0, 'borderwidth'=>0 ){|t| + TkScrollbar.new(f) {|s| + command proc{|*args| t.yview(args)} + t.yscrollcommand proc{|first,last| s.set first,last} + }.pack('side'=>'right', 'fill'=>'y') + }.pack('expand'=>'yes', 'fill'=>'both') +}.pack('expand'=>'yes', 'fill'=>'both') + +# +$tag_center = TkTextTag.new($twind_text, + 'justify' =>'center', + 'spacing1'=>'5m', + 'spacing3'=>'5m' ) +$tag_buttons = TkTextTag.new($twind_text, + 'lmargin1'=>'1c', + 'lmargin2'=>'1c', + 'rmargin' =>'1c', + 'spacing1'=>'3m', + 'spacing2'=>0, + 'spacing3'=>0 ) + +$twind_text.insert('end', "A text widget can contain other widgets embedded ") +$twind_text.insert('end', "it. These are called \"embedded windows\", ") +$twind_text.insert('end', "and they can consist of arbitrary widgets. ") +$twind_text.insert('end', "For example, here are two embedded button ") +$twind_text.insert('end', "widgets. You can click on the first button to ") +TkTextWindow.new($twind_text, 'end', + 'window'=>TkButton.new($twind_text) { + #text 'ON' + text 'Turn On' + command proc{textWindOn $twind_text,$twind_buttons} + cursor 'top_left_arrow' + }) +$twind_text.insert('end', " horizontal scrolling, which also turns off ") +$twind_text.insert('end', "word wrapping. Or, you can click on the second ") +$twind_text.insert('end', "button to\n") +TkTextWindow.new($twind_text, 'end', + 'window'=>TkButton.new($twind_text) { + #text 'OFF' + text 'Turn Off' + command proc{textWindOff $twind_text} + cursor 'top_left_arrow' + }) + +$twind_text.insert('end', " horizontal scrolling and turn back on word wrapping.\n\n") +$twind_text.insert('end', "Or, here is another example. If you ") +TkTextWindow.new($twind_text, 'end', + 'window'=>TkButton.new($twind_text) { + text 'Click Here' + command proc{textWindPlot $twind_text} + cursor 'top_left_arrow' + }) +$twind_text.insert('end', " a canvas displaying an x-y plot will appear right here.") +$mark_plot = TkTextMark.new($twind_text, 'insert') +$mark_plot.gravity='left' +$twind_text.insert('end', " You can drag the data points around with the mouse, ") +$twind_text.insert('end', "or you can click here to ") +TkTextWindow.new($twind_text, 'end', + 'window'=>TkButton.new($twind_text) { + text 'Delete' + command proc{textWindDel $twind_text} + cursor 'top_left_arrow' + }) + +$twind_text.insert('end', " the plot again.\n\n") +$twind_text.insert('end', "You may also find it useful to put embedded windows in ") +$twind_text.insert('end', "a text without any actual text. In this case the ") +$twind_text.insert('end', "text widget acts like a geometry manager. For ") +$twind_text.insert('end', "example, here is a collection of buttons laid out ") +$twind_text.insert('end', "neatly into rows by the text widget. These buttons ") +$twind_text.insert('end', "can be used to change the background color of the ") +$twind_text.insert('end', "text widget (\"Default\" restores the color to ") +$twind_text.insert('end', "its default). If you click on the button labeled ") +$twind_text.insert('end', "\"Short\", it changes to a longer string so that ") +$twind_text.insert('end', "you can see how the text widget automatically ") +$twind_text.insert('end', "changes the layout. Click on the button again ") +$twind_text.insert('end', "to restore the short string.\n") + + +TkTextWindow.new($twind_text, 'end', + 'window'=>TkButton.new($twind_text) {|b| + text 'Default' + command proc{embDefBg $twind_text} + cursor 'top_left_arrow' + $tag_buttons.add('end') + }, + 'padx'=>3 ) +embToggle = TkVariable.new('Short') +TkTextWindow.new($twind_text, 'end', + 'window'=>TkCheckButton.new($twind_text) { + textvariable embToggle + indicatoron 0 + variable embToggle + onvalue 'A much longer string' + offvalue 'Short' + cursor 'top_left_arrow' + pady 5 + padx 2 + }, + 'padx'=>3, + 'pady'=>2 ) + +[ 'AntiqueWhite3', 'Bisque1', 'Bisque2', 'Bisque3', 'Bisque4', + 'SlateBlue3', 'RoyalBlue1', 'SteelBlue2', 'DeepSkyBlue3', 'LightBlue1', + 'DarkSlateGray1', 'Aquamarine2', 'DarkSeaGreen2', 'SeaGreen1', + 'Yellow1', 'IndianRed1', 'IndianRed2', 'Tan1', 'Tan4' +].each{|twind_color| + TkTextWindow.new($twind_text, 'end', + 'window'=>TkButton.new($twind_text) { + text twind_color + cursor 'top_left_arrow' + command proc{$twind_text.bg twind_color} + }, + 'padx'=>3, + 'pady'=>2 ) +} + +# +def textWindOn (w,f) + if defined? $twind_scroll + begin + $twind_scroll.destroy + rescue + end + $twind_scroll = nil + end + + base = TkWinfo.parent( TkWinfo.parent(w) ) + $twind_scroll = TkScrollbar.new(base) {|s| + orient 'horizontal' + command proc{|*args| w.xview(*args)} + w.xscrollcommand proc{|first,last| s.set first,last} + w.wrap 'none' + pack('after'=>f, 'side'=>'bottom', 'fill'=>'x') + } + + return nil +end + +def textWindOff (w) + if defined? $twind_scroll + begin + $twind_scroll.destroy + rescue + end + $twind_scroll = nil + end + w.xscrollcommand '' + w.wrap 'word' +end + +def textWindPlot (t) + if (defined? $twind_plot) && TkWinfo.exist?($twind_plot) + return + end + + $twind_plot = TkCanvas.new(t) { + relief 'sunken' + width 450 + height 300 + cursor 'top_left_arrow' + } + + font = '-Adobe-Helvetica-Medium-R-Normal--*-180-*-*-*-*-*-*' + + TkcLine.new($twind_plot, 100, 250, 400, 250, 'width'=>2) + TkcLine.new($twind_plot, 100, 250, 100, 50, 'width'=>2) + TkcText.new($twind_plot, 225, 20, + 'text'=>"A Simple Plot", 'font'=>font, 'fill'=>'brown') + + (0..10).each {|i| + x = 100 + (i * 30) + TkcLine.new($twind_plot, x, 250, x, 245, 'width'=>2) + TkcText.new($twind_plot, x, 254, + 'text'=>10*i, 'font'=>font, 'anchor'=>'n') + } + (0..5).each {|i| + y = 250 - (i * 40) + TkcLine.new($twind_plot, 100, y, 105, y, 'width'=>2) + TkcText.new($twind_plot, 96, y, + 'text'=>"#{i*50}.0", 'font'=>font, 'anchor'=>'e') + } + + for xx, yy in [[12,56],[20,94],[33,98],[32,120],[61,180],[75,160],[98,223]] + x = 100 + (3*xx) + y = 250 - (4*yy)/5 + item = TkcOval.new($twind_plot, x-6, y-6, x+6, y+6, + 'width'=>1, 'outline'=>'black', 'fill'=>'SkyBlue2') + item.addtag 'point' + end + + $twind_plot.itembind('point', 'Any-Enter', + proc{$twind_plot.itemconfigure 'current', 'fill', 'red'}) + $twind_plot.itembind('point', 'Any-Leave', + proc{$twind_plot.itemconfigure 'current', 'fill', 'SkyBlue2'}) + $twind_plot.itembind('point', '1', + proc{|x,y| embPlotDown $twind_plot,x,y}, "%x %y") + $twind_plot.itembind('point', 'ButtonRelease-1', + proc{$twind_plot.dtag 'selected'}) + $twind_plot.bind('B1-Motion', + proc{|x,y| embPlotMove $twind_plot,x,y}, "%x %y") + while ($twind_text.get($mark_plot) =~ /[ \t\n]/) + $twind_text.delete $mark_plot + end + $twind_text.insert $mark_plot,"\n" + TkTextWindow.new($twind_text, $mark_plot, 'window'=>$twind_plot) + $tag_center.add $mark_plot + $twind_text.insert $mark_plot,"\n" +end + +$embPlot = {'lastX'=>0, 'lastY'=>0} + +def embPlotDown (w, x, y) + w.dtag 'selected' + w.addtag_withtag 'selected', 'current' + w.raise 'current' + $embPlot['lastX'] = x + $embPlot['lastY'] = y +end + +def embPlotMove (w, x, y) + w.move 'selected', x - $embPlot['lastX'], y - $embPlot['lastY'] + $embPlot['lastX'] = x + $embPlot['lastY'] = y +end + +def textWindDel (w) + if (defined? $twind_text) && TkWinfo.exist?($twind_plot) + $twind_text.delete $twind_plot + $twind_plot = nil + while ($twind_text.get($mark_plot) =~ /[ \t\n]/) + $twind_text.delete $mark_plot + end + $twind_text.insert $mark_plot," " + end +end + +def embDefBg (w) + w['background'] = w.configinfo('background')[3] +end diff --git a/ext/tk/sample/demos-en/vscale.rb b/ext/tk/sample/demos-en/vscale.rb new file mode 100644 index 0000000000..636b85813b --- /dev/null +++ b/ext/tk/sample/demos-en/vscale.rb @@ -0,0 +1,78 @@ +# vscale.rb +# +# This demonstration script shows an example with a vertical scale. + +require "tkcanvas" + +if defined?($vscale_demo) && $vscale_demo + $vscale_demo.destroy + $vscale_demo = nil +end + +$vscale_demo = TkToplevel.new {|w| + title("Vertical Scale Demonstration") + iconname("vscale") +} +positionWindow($vscale_demo) + +msg = TkLabel.new($vscale_demo) { + font $font + wraplength '3.5i' + justify 'left' + text "An arrow and a vertical scale are displayed below. If you click or drag mouse button 1 in the scale, you can change the size of the arrow." +} +msg.pack('side'=>'top', 'padx'=>'.5c') + +TkFrame.new($vscale_demo) {|frame| + TkButton.new(frame) { + text 'Dismiss' + command proc { + tmppath = $vscale_demo + $vscale_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'Show Code' + command proc { showCode 'vscale' } + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +TkFrame.new($vscale_demo) {|frame| + borderwidth 10 + canvas = TkCanvas.new(frame) {|c| + width 50 + height 50 + bd 0 + highlightthickness 0 + TkcPolygon.new(c, 0, 0, 1, 1, 2, 2) { + fill 'SeaGreen3' + tags 'poly' + } + TkcLine.new(c, 0, 0, 1, 1, 2, 2, 0, 0) { + fill 'black' + tags 'line' + } + }.pack('side'=>'left', 'anchor'=>'nw', 'fill'=>'y') + scale = TkScale.new(frame) { + orient 'vertical' + length 284 + from 0 + to 250 + command proc{|value| setHeight(canvas, value)} + tickinterval 50 + }.pack('side'=>'left', 'anchor'=>'ne') + scale.set 75 +}.pack + + +def setHeight(w, height) + height = height + 21 + y2 = height - 30 + if y2 < 21 + y2 = 21 + end + w.coords 'poly',15,20,35,20,35,y2,45,y2,25,height,5,y2,15,y2,15,20 + w.coords 'line',15,20,35,20,35,y2,45,y2,25,height,5,y2,15,y2,15,20 +end diff --git a/ext/tk/sample/demos-en/widget b/ext/tk/sample/demos-en/widget new file mode 100644 index 0000000000..96a24447e1 --- /dev/null +++ b/ext/tk/sample/demos-en/widget @@ -0,0 +1,499 @@ +#!/usr/bin/env ruby + +# widget -- +# This script demonstrates the various widgets provided by Tk, +# along with many of the features of the Tk toolkit. This file +# only contains code to generate the main window for the +# application, which invokes individual demonstrations. The +# code for the actual demonstrations is contained in separate +# ".rb" files is this directory, which are sourced by this script +# as needed. + +require 'tk' + +unless /^8\.[1-9]/ =~ Tk::TCL_VERSION && !Tk::JAPANIZED_TK + require 'tkencoding' +end + +require 'tkafter' + +### $DEBUG=1 ########## + +#---------------------------------------------------------------- +# The code below create the main window, consisting of a menu bar +# and a text widget that explains how to use the program, plus lists +# all of the demos as hypertext items. +#---------------------------------------------------------------- + +# widget demo directory +$demo_dir = File.dirname($0) + +# root +$root = TkRoot.new{title "Ruby/Tk Widget Demonstration"} + +# tk +$tk_version = Tk::TK_VERSION + +# tcl_platform +$tk_platform = TkVarAccess.new('tcl_platform') + +# +$font = TkFont.new('-*-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*', nil) + +# +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}) + +=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' + width 60 + 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' + width 60 + height 30 + font $font + setgrid 'yes' + highlightthickness 0 + padx 4 + pady 2 + takefocus 0 + 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 + +# Create a bunch of tags to use in the text widget, such as those for +# section titles and demo descriptions. Also define the bindings for +# tags. + +tag_title = TkTextTag.new(txt, 'font'=>'-*-Helvetica-Bold-R-Normal--*-180-*-*-*-*-*-*') + +# We put some "space" characters to the left and right of each demo description +# so that the descriptions are highlighted only when the mouse cursor +# is right over them (but not when the cursor is to their left or right) + +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') + +# Create the text for the text widget. + +txt.insert('end', "Ruby/Tk Widget Demonstrations\n\n", tag_title) +txt.insert('end', <<EOT) +This application provides a front end for several short scripts that \ +demonstrate what you can do with Tk widgets. Each of the numbered \ +lines below describes a demonstration; you can click on it to invoke \ +the demonstration. Once the demonstration window appears, you can \ +click the "See Code" button to see the Ruby/Tk code that created the \ +demonstration. If you wish, you can edit the code and click the \ +"Rerun Demo" button in the code window to reinvoke the demonstration \ +with the modified code. + +EOT + +txt.insert('end', "Labels, buttons, checkbuttons, and radiobuttons.\n", tag_title) +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "1. Labels (text and bitmaps).\n", tag_demo, "demo-label") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "2. Buttons.\n", tag_demo, "demo-button") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "3. Checkbuttons (select any of a group).\n", tag_demo, "demo-check") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "4. Radiobuttons (select one of a group).\n", tag_demo, "demo-radio") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "5. A 15-puzzle game made out of buttons.\n", tag_demo, "demo-puzzle") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "6. Iconic buttons that use bitmaps.\n", tag_demo, "demo-icon") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "7. Two labels displaying images.\n", tag_demo, "demo-image1") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "8. A simple user interface for viewing images.\n", tag_demo, "demo-image2") +txt.insert('end', " \n ", tag_demospace) + +txt.insert('end', "\n") +txt.insert('end', "Listboxes\n", tag_title) +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "1. 50 states.\n", tag_demo, "demo-states") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "2. Colors: change the color scheme for the application.\n", "#{tag_demo.id} demo-colors") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "3. A collection of famous sayings.\n", tag_demo, "demo-sayings") +txt.insert('end', " \n ", tag_demospace) + +txt.insert('end', "\n") +txt.insert('end', "Entries\n", tag_title) +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "1. Without scrollbars.\n", tag_demo, "demo-entry1") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "2. With scrollbars.\n", tag_demo, "demo-entry2") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "3. Simple Rolodex-like form.\n", tag_demo, "demo-form") +txt.insert('end', " \n ", tag_demospace) + +txt.insert('end', "\n") +txt.insert('end', "Text\n", tag_title) +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "1. Basic editable text.\n", tag_demo, "demo-text") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "2. Text display styles.\n", tag_demo, "demo-style") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "3. Hypertext (tag bindings).\n", tag_demo, "demo-bind") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "4. A text widget with embedded windows.\n", tag_demo, "demo-twind") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "5. A search tool built with a text widget.\n", tag_demo, "demo-search") +txt.insert('end', " \n ", tag_demospace) + +txt.insert('end', "\n") +txt.insert('end', "Canvases\n", tag_title) +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "1. The canvas item types.\n", tag_demo, "demo-items") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "2. A simple 2-D plot.\n", tag_demo, "demo-plot") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "3. Text items in canvases.\n", tag_demo, "demo-ctext") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "4. An editor for arrowheads on canvas lines.\n", tag_demo, "demo-arrow") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "5. A ruler with adjustable tab stops.\n", tag_demo, "demo-ruler") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "6. A building floor plan.\n", tag_demo, "demo-floor") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "7. A simple scrollable canvas.\n", tag_demo, "demo-cscroll") +txt.insert('end', " \n ", tag_demospace) + +txt.insert('end', "\n") +txt.insert('end', "Scales\n", tag_title) +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "1. Vertical scale.\n", tag_demo.id, "demo-vscale") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "2. Horizontal scale.\n", tag_demo.id, "demo-hscale") +txt.insert('end', " \n ", tag_demospace) + +txt.insert('end', "\n") +txt.insert('end', "Menus\n", tag_title) +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "1. Menus and cascades.\n", tag_demo, "demo-menu") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "2. Menubuttons\n", tag_demo, "demo-menubu") +txt.insert('end', " \n ", tag_demospace) + +txt.insert('end', "\n") +txt.insert('end', "Common Dialogs\n", tag_title) +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "1. Message boxes.\n", tag_demo, "demo-msgbox") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "2. File selection dialog.\n", tag_demo, "demo-filebox") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "3. Color picker.\n", tag_demo, "demo-clrpick") +txt.insert('end', " \n ", tag_demospace) + +txt.insert('end', "\n") +txt.insert('end', "Miscellaneous\n", tag_title) +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "1. The built-in bitmaps.\n", tag_demo, "demo-bitmap") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "2. A dialog box with a local grab.\n", tag_demo, "demo-dialog1") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "3. A dialog box with a global grab.\n", tag_demo, "demo-dialog2") +txt.insert('end', " \n ", tag_demospace) + +txt.state('disabled') +scr.focus + +# positionWindow -- +# This procedure is invoked by most of the demos to position a +# new demo window. +# +# Arguments: +# w - The name of the window to position. + +def positionWindow(w) + w.geometry('+300+300') +end + +# showVars -- +# Displays the values of one or more variables in a window, and +# updates the display whenever any of the variables changes. +# +# Arguments: +# w - Name of new window to create for display. +# args - Any number of names of variables. + +$showVarsWin = {} +def showVars (parent, *args) + if $showVarsWin[parent.path] + begin + $showVarsWin[parent.path].destroy + rescue + end + end + w = TkToplevel.new(parent) {|w| + title "Variable values" + TkLabel.new(w) { + text "Variable values:" + 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 "OK" + command proc{w.destroy} + }.pack('side'=>'bottom', 'pady'=>2) + } + $showVarsWin[parent.path] = w +end + +# invoke -- +# This procedure is called when the user clicks on a demo description. +# It is responsible for invoking the demonstration. +# +# Arguments: +# index - The index of the character that the user clicked on. + +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` + Tk.update +# txt.cursor('xterm') + txt.cursor(cursor) + + $tag_visited.add("#{index} linestart +1 chars", "#{index} lineend +1 chars") +end + +# showStatus -- +# +# Show the name of the demo program in the status bar. This procedure +# is called when the user moves the cursor over a demo description. +# + +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', + "Run the \"#{demoname}\" sample program") + newcursor = 'hand2' + end + txt.configure('cursor'=>newcursor) if cursor != newcursor +end + +# showCode -- +# This procedure creates a toplevel window that displays the code for +# a demonstration and allows it to be edited and reinvoked. +# +# Arguments: +# w - The name of the demonstration's window, which can be +# used to derive the name of the file containing its code. + +def showCode (demo) + file = "#{demo}.rb" + $code_window = nil unless defined? $code_window + if $code_window == nil || TkWinfo.exist?($code_window) == '0' + $code_window = TkToplevel.new(nil) + f = TkFrame.new($code_window) + TkButton.new(f) { + text "Dismiss" + command proc{ + $code_window.destroy + $code_window = nil + } + }.pack('side'=>'left', 'expand'=>'yes', 'pady'=>2) + TkButton.new(f) { + text "Rerun Demo" + 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' + 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') + +# JKC 2001-07-26: segfaults under 1.7.1 (2001-06-19) [i686-linux] + 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 + +# 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 widget demonstration Ver.1.0.2\n\n( based on Tk 8.1 Copyright (c) 1996-1997 Sun Microsystems, Inc. )\n\nRunning Version :: Ruby#{VERSION}/Tk#{$tk_version}") +end + +################################ + +Tk.mainloop + diff --git a/ext/tk/sample/demos-jp/README b/ext/tk/sample/demos-jp/README new file mode 100644 index 0000000000..42bec16c60 --- /dev/null +++ b/ext/tk/sample/demos-jp/README @@ -0,0 +1,54 @@ + + Ruby/Tk widget-demo + version 1.2 ( 2000/04/08 ) + 永井@知能.九工大 (nagai@ai.kyutech.ac.jp) + +標準配布の Tcl/Tk 拡張パッケージを取り込んだ Ruby (以下 Ruby/Tk と呼びます) +では,Tk widget を用いた GUI の作成を行うことができます.実際に GUI を作成 +していく場合には様々な実例がサンプルとして存在すると便利なのですが,Ruby/Tk +にはそのような適当なサンプルスクリプト集合は存在しませんでした.それに対し, +拡張パッケージの元である Tcl/Tk には,Tk widget を用いてどのようなことがで +きるかを示すものとして widget-demo が存在しおり,Tcl/Tk を用いた GUI の作成 +を習得する際の代表的サンプルとなっています.本アーカイブは,Ruby/Tk の習得の +ための代表的なサンプルスクリプトとすべく,Tcl/Tk の widget-demo を移植したも +のです. + +今回のバージョンは ruby-1.4.x に対応としておきますが,旧バージョンに比べて, +ほとんど変更はありません.ruby-1.1c2 以上なら動くと思います.ruby-1.5.x につ +いてはテストしていません.そのため,非互換の影響が出ることがあるかもしれませ +んが,その場合でも少しの修正で動かせると思います.組み込む Tk のバージョンは, +4.2 でも 8.0 でも修正なく動かせるはずです.ただし,日本語版での移植となって +いるため,日本語化された Tk をご利用ください.スクリプトのテストは,旧バージョ +ンの際に Tk4.2jp と Tk8.0jp の上で行っています (完璧にではないですが).今回 +のバージョンでは ruby-1.4.x + Tk8.0jp 上での簡単なテストしか行っていませんが, +修正というほどの修正はしていませんので問題はないと考えています. + +本アーカイブに含まれるスクリプトの多くは,元となっている Tcl/Tk 版に比較的近 +いスクリプト記述となるようにしています.そのため,Ruby/Tk のサンプルと言うに +は,あまり Ruby らしくないとも言えるでしょう.にもかかわらず,そのような記述 +を取っている理由は,Ruby/Tk のドキュメント不足にあります. + +Tcl/Tk には適当な参考書が何冊か存在していますから,Ruby/Tk スクリプトを作成 +する際は,そのような Tcl/Tk の参考書で情報を補いながら作成することになると思 +います.各 widget の使用例として,Tcl/Tk の widget-demo を参照することもある +でしょう.Ruby/Tk 版の記述を widget-demo を Tcl/Tk 版の記述に近いものにして +おけば,その対比によって,Ruby/Tk の理解を早めることができると考えられます. +一旦 Ruby/Tk での 各 widget の使用方法を習得してしまえば,Ruby らしいスクリ +プトを作成することは難しくないでしょう.本アーカイブのスクリプトは,Ruby/Tk +を最初に習得するまでの踏台として利用していただければ幸いです. + +widget-demo の移植にあたっては,次の方にも移植したスクリプトを提供していただ +きました.ここに感謝の意を表します. + + 立石@JAIST (ttate@jaist.ac.jp) さん + 平松祥史 (hiramatu@cdrom.co.jp) さん + +平松さんによる Ruby/Tk 入門の Web page (http://www.cdrom.co.jp/~hiramatu/) +も Ruby/Tk の習得に有用と思えますので,ぜひご参照ください. + +また,前橋 (maebashi@iij.ad.jp) さんをはじめとして,widget-demo の移植に際し +て必要となった Ruby の Tk 関連ライブラリ修正について,問題点,バグの指摘をし +ていただいた方々にも感謝致します. + +そして最後に最大の感謝を Ruby 設計者の まつもと ゆきひろ (matz@netlab.co.jp) +さんに捧げたいと思います. diff --git a/ext/tk/sample/demos-jp/arrow.rb b/ext/tk/sample/demos-jp/arrow.rb new file mode 100644 index 0000000000..3640798db1 --- /dev/null +++ b/ext/tk/sample/demos-jp/arrow.rb @@ -0,0 +1,235 @@ +# +# arrowhead widget demo (called by 'widget') +# + +# arrowSetup -- +# This method regenerates all the text and graphics in the canvas +# window. It's called when the canvas is initially created, and also +# whenever any of the parameters of the arrow head are changed +# interactively. +# +# Arguments: +# c - Name of the canvas widget. + +def arrowSetup(c) + v = $demo_arrowInfo + + # Remember the current box, if there is one. + tags = c.gettags('current') + if tags != [] + cur = tags.find{|t| t.kind_of?(String) && t =~ /^box[1-3]$/ } + else + cur = nil + end + + # Create the arrow and outline. + c.delete('all') + TkcLine.new(c, v.x1, v.y, v.x2, v.y, + { 'width'=>10 * v.width, + 'arrowshape'=>[10*v.a, 10*v.b, 10*v.c], + 'arrow'=>'last' + }.update(v.bigLineStyle) ) + xtip = v.x2 - 10*v.b + deltaY = 10*v.c + 5*v.width + TkcLine.new(c, v.x2, v.y, xtip, v.y + deltaY, + v.x2 - 10*v.a, v.y, xtip, v.y - deltaY, v.x2, v.y, + 'width'=>2, 'capstyle'=>'round', 'joinstyle'=>'round') + + # Create the boxes for reshaping the line and arrowhead. + TkcRectangle.new(c, v.x2-10*v.a-5, v.y-5, v.x2-10*v.a+5, v.y+5, + {'tags'=>['box1', $arrowTag_box]}.update(v.boxStyle) ) + TkcRectangle.new(c, xtip-5, v.y-deltaY-5, xtip+5, v.y-deltaY+5, + {'tags'=>['box2', $arrowTag_box]}.update(v.boxStyle) ) + TkcRectangle.new(c, v.x1-5, v.y-5*v.width-5, v.x1+5, v.y-5*v.width+5, + {'tags'=>['box3', $arrowTag_box]}.update(v.boxStyle) ) + c.itemconfigure cur, v.activeStyle if cur + + # Create three arrows in actual size with the same parameters + TkcLine.new(c, v.x2+50, 0, v.x2+50, 1000, 'width'=>2) + tmp = v.x2+100 + TkcLine.new(c, tmp, v.y-125, tmp, v.y-75, 'width'=>v.width, + 'arrow'=>'both', 'arrowshape'=>[v.a, v.b, v.c]) + TkcLine.new(c, tmp-25, v.y, tmp+25, v.y, 'width'=>v.width, + 'arrow'=>'both', 'arrowshape'=>[v.a, v.b, v.c]) + TkcLine.new(c, tmp-25, v.y+75, tmp+25, v.y+125, 'width'=>v.width, + 'arrow'=>'both', 'arrowshape'=>[v.a, v.b, v.c]) + + # Create a bunch of other arrows and text items showing the + # current dimensions. + tmp = v.x2+10 + TkcLine.new(c, tmp, v.y-5*v.width, tmp, v.y-deltaY, + 'arrow'=>'both', 'arrowshape'=>v.smallTips) + TkcText.new(c, v.x2+15, v.y-deltaY+5*v.c, 'text'=>v.c, 'anchor'=>'w') + tmp = v.x1-10 + TkcLine.new(c, tmp, v.y-5*v.width, tmp, v.y+5*v.width, + 'arrow'=>'both', 'arrowshape'=>v.smallTips) + TkcText.new(c, v.x1-15, v.y, 'text'=>v.width, 'anchor'=>'e') + tmp = v.y+5*v.width+10*v.c+10 + TkcLine.new(c, v.x2-10*v.a, tmp, v.x2, tmp, + 'arrow'=>'both', 'arrowshape'=>v.smallTips) + TkcText.new(c, v.x2-5*v.a, tmp+5, 'text'=>v.a, 'anchor'=>'n') + tmp = tmp+25 + TkcLine.new(c, v.x2-10*v.b, tmp, v.x2, tmp, + 'arrow'=>'both', 'arrowshape'=>v.smallTips) + TkcText.new(c, v.x2-5*v.b, tmp+5, 'text'=>v.b, 'anchor'=>'n') + + TkcText.new(c, v.x1, 310, 'text'=>"'width'=>#{v.width}", 'anchor'=>'w', + 'font'=>'-*-Helvetica-Medium-R-Normal--*-180-*-*-*-*-*-*') + TkcText.new(c, v.x1, 330, + 'text'=>"'arrowshape'=>[#{v.a}, #{v.b}, #{v.c}]", 'anchor'=>'w', + 'font'=>'-*-Helvetica-Medium-R-Normal--*-180-*-*-*-*-*-*') + + v.count += 1 +end + +# toplevel widget が存在すれば削除する +if defined?($arrow_demo) && $arrow_demo + $arrow_demo.destroy + $arrow_demo = nil +end + +# demo 用の toplevel widget を生成 +$arrow_demo = TkToplevel.new {|w| + title("Arrowhead Editor Demonstration") + iconname("arrow") + positionWindow(w) +} + +# label 生成 +TkLabel.new($arrow_demo, 'font'=>$font, 'wraplength'=>'5i', 'justify'=>'left', + 'text'=>"この widget で、キャンバスで使われるラインについて様々な幅や矢印の頭の形を試してみることができます。線の幅や矢印の形を変えるには、拡大された矢印についている 3つの四角をドラッグしてください。右側の矢印は普通の大きさでのサンプルを示しています。下のテキストはラインアイテムに対する設定オプションです。"){ + pack('side'=>'top') +} + +# frame 生成 +$arrow_buttons = TkFrame.new($arrow_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $arrow_demo + $arrow_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'arrow'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$arrow_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# canvas 設定 +$arrow_canvas = TkCanvas.new($arrow_demo, 'width'=>500, 'height'=>350, + 'relief'=>'sunken', 'borderwidth'=>2) +$arrow_canvas.pack('expand'=>'yes', 'fill'=>'both') + +# 値設定 +unless Struct.const_defined?("ArrowInfo") + $demo_arrowInfo = Struct.new("ArrowInfo", :a, :b, :c, :width, :motionProc, + :x1, :x2, :y, :smallTips, :count, + :bigLineStyle, :boxStyle, :activeStyle).new +end +$demo_arrowInfo.a = 8 +$demo_arrowInfo.b = 10 +$demo_arrowInfo.c = 3 +$demo_arrowInfo.width = 2 +$demo_arrowInfo.motionProc = proc{} +$demo_arrowInfo.x1 = 40 +$demo_arrowInfo.x2 = 350 +$demo_arrowInfo.y = 150 +$demo_arrowInfo.smallTips = [5, 5, 2] +$demo_arrowInfo.count = 0 +if TkWinfo.depth($arrow_canvas) > 1 + $demo_arrowInfo.bigLineStyle = {'fill'=>'SkyBlue1'} + $demo_arrowInfo.boxStyle = {'fill'=>'', 'outline'=>'black', 'width'=>1} + $demo_arrowInfo.activeStyle = {'fill'=>'red', 'outline'=>'black', 'width'=>1} +else + $demo_arrowInfo.bigLineStyle = {'fill'=>'black', + 'stipple'=>'@'+[$demo_dir, 'images', 'grey.25'].join(File::Separator)} + $demo_arrowInfo.boxStyle = {'fill'=>'', 'outline'=>'black', 'width'=>1} + $demo_arrowInfo.activeStyle = {'fill'=>'black','outline'=>'black','width'=>1} +end +$arrowTag_box = TkcTag.new($arrow_canvas) +arrowSetup $arrow_canvas +$arrowTag_box.bind('Enter', proc{$arrow_canvas.itemconfigure('current', $demo_arrowInfo.activeStyle)}) +$arrowTag_box.bind('Leave', proc{$arrow_canvas.itemconfigure('current', $demo_arrowInfo.boxStyle)}) +$arrowTag_box.bind('B1-Enter', proc{}) +$arrowTag_box.bind('B1-Leave', proc{}) +$arrow_canvas.itembind('box1', '1', + proc{$demo_arrowInfo.motionProc \ + = proc{|x,y| arrowMove1 $arrow_canvas, x, y}}) +$arrow_canvas.itembind('box2', '1', + proc{$demo_arrowInfo.motionProc \ + = proc{|x,y| arrowMove2 $arrow_canvas, x, y}}) +$arrow_canvas.itembind('box3', '1', + proc{$demo_arrowInfo.motionProc \ + = proc{|x,y| arrowMove3 $arrow_canvas, x, y}}) +$arrowTag_box.bind('B1-Motion', + proc{|x,y| $demo_arrowInfo.motionProc.call(x,y)}, "%x %y") +$arrow_canvas.bind('Any-ButtonRelease-1', proc{arrowSetup $arrow_canvas}) + +# arrowMove1 -- +# This method is called for each mouse motion event on box1 (the +# one at the vertex of the arrow). It updates the controlling parameters +# for the line and arrowhead. +# +# Arguments: +# c - The name of the canvas window. +# x, y - The coordinates of the mouse. + +def arrowMove1(c,x,y) + v = $demo_arrowInfo + newA = (v.x2+5-c.canvasx(x).round)/10 + newA = 0 if newA < 0 + newA = 25 if newA > 25 + if newA != v.a + c.move('box1', 10*(v.a-newA), 0) + v.a = newA + end +end + +# arrowMove2 -- +# This method is called for each mouse motion event on box2 (the +# one at the trailing tip of the arrowhead). It updates the controlling +# parameters for the line and arrowhead. +# +# Arguments: +# c - The name of the canvas window. +# x, y - The coordinates of the mouse. + +def arrowMove2(c,x,y) + v = $demo_arrowInfo + newB = (v.x2+5-c.canvasx(x).round)/10 + newB = 0 if newB < 0 + newB = 25 if newB > 25 + newC = (v.y+5-c.canvasy(y).round-5*v.width)/10 + newC = 0 if newC < 0 + newC = 20 if newC > 20 + if newB != v.b || newC != v.c + c.move('box2', 10*(v.b-newB), 10*(v.c-newC)) + v.b = newB + v.c = newC + end +end + +# arrowMove3 -- +# This method is called for each mouse motion event on box3 (the +# one that controls the thickness of the line). It updates the +# controlling parameters for the line and arrowhead. +# +# Arguments: +# c - The name of the canvas window. +# x, y - The coordinates of the mouse. + +def arrowMove3(c,x,y) + v = $demo_arrowInfo + newWidth = (v.y+2-c.canvasy(y).round)/5 + newWidth = 0 if newWidth < 0 + newWidth = 20 if newWidth > 20 + if newWidth != v.width + c.move('box3', 0, 5*(v.width-newWidth)) + v.width = newWidth + end +end + diff --git a/ext/tk/sample/demos-jp/bind.rb b/ext/tk/sample/demos-jp/bind.rb new file mode 100644 index 0000000000..1f221a6293 --- /dev/null +++ b/ext/tk/sample/demos-jp/bind.rb @@ -0,0 +1,106 @@ +# +# text (tag bindings) widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($bind_demo) && $bind_demo + $bind_demo.destroy + $bind_demo = nil +end + +# demo 用の toplevel widget を生成 +$bind_demo = TkToplevel.new {|w| + title("Text Demonstration - Tag Bindings") + iconname("bind") + positionWindow(w) +} + +# frame 生成 +TkFrame.new($bind_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $bind_demo + $bind_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'bind'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# bind 用メソッド +def tag_binding_for_bind_demo(tag, enter_style, leave_style) + tag.bind('Any-Enter', proc{tag.configure enter_style}) + tag.bind('Any-Leave', proc{tag.configure leave_style}) +end + +# text 生成 +TkText.new($bind_demo){|t| + # 生成 + setgrid 'true' + width 60 + height 24 + font $font + wrap 'word' + TkScrollbar.new($bind_demo) {|s| + pack('side'=>'right', 'fill'=>'y') + command proc{|*args| t.yview(*args)} + t.yscrollcommand proc{|first,last| s.set first,last} + } + pack('expand'=>'yes', 'fill'=>'both') + + # スタイル設定 + if TkWinfo.depth($root).to_i > 1 + tagstyle_bold = {'background'=>'#43ce80', 'relief'=>'raised', + 'borderwidth'=>1} + tagstyle_normal = {'background'=>'', 'relief'=>'flat'} + else + tagstyle_bold = {'foreground'=>'white', 'background'=>'black'} + tagstyle_normal = {'foreground'=>'', 'background'=>''} + end + + # テキスト挿入 + insert 'insert', "テキストwidgetの表示スタイルを制御するのと同じタグのメカニズムを使って、テキストにTclのコマンドを割り当てることができます。これにより、マウスやキーボードのアクションで特定のTclのコマンドが実行されるようになります。例えば、下のキャンバスのデモプログラムについての説明文にはそのようなタグがついています。マウスを説明文の上に持っていくと説明文が光り、ボタン1を押すとその説明のデモが始まります。 + +" + insert('end', '1. キャンバス widget に作ることのできるアイテムの種類全てに関するサンプル。', (d1 = TkTextTag.new(t)) ) + insert('end', "\n\n") + insert('end', '2. 簡単な 2次元のプロット。データを表す点を動かすことができる。', (d2 = TkTextTag.new(t)) ) + insert('end', "\n\n") + insert('end', '3. テキストアイテムのアンカーと行揃え。', + (d3 = TkTextTag.new(t)) ) + insert('end', "\n\n") + insert('end', '4. ラインアイテムのための矢印の頭の形のエディタ。', + (d4 = TkTextTag.new(t)) ) + insert('end', "\n\n") + insert('end', '5. タブストップを変更するための機能つきのルーラー。', + (d5 = TkTextTag.new(t)) ) + insert('end', "\n\n") + insert('end', + '6. キャンバスがどうやってスクロールするのかを示すグリッド。', + (d6 = TkTextTag.new(t)) ) + + # binding + [d1, d2, d3, d4, d5, d6].each{|tag| + tag_binding_for_bind_demo(tag, tagstyle_bold, tagstyle_normal) + } + d1.bind('1', + proc{eval `cat #{[$demo_dir,'items.rb'].join(File::Separator)}`}) + d2.bind('1', + proc{eval `cat #{[$demo_dir,'plot.rb'].join(File::Separator)}`}) + d3.bind('1', + proc{eval `cat #{[$demo_dir,'ctext.rb'].join(File::Separator)}`}) + d4.bind('1', + proc{eval `cat #{[$demo_dir,'arrow.rb'].join(File::Separator)}`}) + d5.bind('1', + proc{eval `cat #{[$demo_dir,'ruler.rb'].join(File::Separator)}`}) + d6.bind('1', + proc{eval `cat #{[$demo_dir,'cscroll.rb'].join(File::Separator)}`}) + + TkTextMarkInsert.new(t, '0.0') + configure('state','disabled') +} diff --git a/ext/tk/sample/demos-jp/bitmap.rb b/ext/tk/sample/demos-jp/bitmap.rb new file mode 100644 index 0000000000..a400862881 --- /dev/null +++ b/ext/tk/sample/demos-jp/bitmap.rb @@ -0,0 +1,70 @@ +# +# bitmap widget demo (called by 'widget') +# + +# bitmapRow -- +# Create a row of bitmap items in a window. +# +# Arguments: +# w - The parent window that is to contain the row. +# args - The names of one or more bitmaps, which will be displayed +# in a new row across the bottom of w along with their +# names. + +def bitmapRow(w,*args) + TkFrame.new(w){|row| + pack('side'=>'top', 'fill'=>'both') + for bitmap in args + TkFrame.new(row){|base| + pack('side'=>'left', 'fill'=>'both', 'pady'=>'.25c', 'padx'=>'.25c') + TkLabel.new(base, 'text'=>bitmap, 'width'=>9).pack('side'=>'bottom') + TkLabel.new(base, 'bitmap'=>bitmap).pack('side'=>'bottom') + } + end + } +end + +# toplevel widget が存在すれば削除する +if defined?($bitmap_demo) && $bitmap_demo + $bitmap_demo.destroy + $bitmap_demo = nil +end + +# demo 用の toplevel widget を生成 +$bitmap_demo = TkToplevel.new {|w| + title("Bitmap Demonstration") + iconname("bitmap") + positionWindow(w) +} + +# label 生成 +TkLabel.new($bitmap_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left', + 'text'=>"このウィンドウには、Tk に組み込まれたすべてのビットマップが、それらの名前と共に表示されています。Tcl のスクリプト中では、それぞれの名前を用いて参照します。"){ + pack('side'=>'top') +} + +# frame 生成 +$bitmap_buttons = TkFrame.new($bitmap_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $bitmap_demo + $bitmap_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'bitmap'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$bitmap_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 設定 +TkFrame.new($bitmap_demo){|f| + bitmapRow(f,'error','gray25','gray50','hourglass') + bitmapRow(f,'info','question','questhead','warning') + pack('side'=>'top', 'expand'=>'yes', 'fill'=>'both') +} + diff --git a/ext/tk/sample/demos-jp/browse1 b/ext/tk/sample/demos-jp/browse1 new file mode 100644 index 0000000000..6bb8fb35ca --- /dev/null +++ b/ext/tk/sample/demos-jp/browse1 @@ -0,0 +1,63 @@ +#!/usr/local/bin/ruby + +# browse -- +# This script generates a directory browser, which lists the working +# directory and allow you to open files or subdirectories by +# double-clicking. + +require 'tk' + +# Create a scrollbar on the right side of the main window and a listbox +# on the left side. + +listbox = TkListbox.new(nil, 'relief'=>'sunken', + 'width'=>20, 'height'=>20, 'setgrid'=>'yes') {|l| + TkScrollbar.new(nil, 'command'=>proc{|*args| l.yview *args}) {|s| + pack('side'=>'right', 'fill'=>'y') + l.yscrollcommand(proc{|first,last| s.set(first,last)}) + } + + pack('side'=>'left', 'fill'=>'both', 'expand'=>'yes') +} + +root = TkRoot.new +root.minsize(1,1) + +# The procedure below is invoked to open a browser on a given file; if the +# file is a directory then another instance of this program is invoked; if +# the file is a regular file then the Mx editor is invoked to display +# the file. + +def browse (dir, file) + file = dir + File::Separator + file if dir != '.' + type = File.ftype(file) + if type == 'directory' + system($0 + ' ' + file + ' &') + else + if type == 'file' + if ENV['EDITOR'] + system(ENV['EDITOR'] + ' ' + file + ' &') + else + system('xedit ' + file + ' &') + end + else + STDOUT.print "\"#{file}\" isn't a directory or regular file" + end + end +end + +# Fill the listbox with a list of all the files in the directory (run +# the "ls" command to get that information). + +dir = ARGV[0] ? ARGV[0] : '.' +open("|ls -a #{dir}", 'r'){|fid| fid.readlines}.each{|fname| + listbox.insert('end', fname.chomp) +} + +# Set up bindings for the browser. + +Tk.bind_all('Control-c', proc{root.destroy}) +listbox.bind('Double-Button-1', + proc{TkSelection.get.each{|f| browse dir, f}}) + +Tk.mainloop diff --git a/ext/tk/sample/demos-jp/browse2 b/ext/tk/sample/demos-jp/browse2 new file mode 100644 index 0000000000..755afa682c --- /dev/null +++ b/ext/tk/sample/demos-jp/browse2 @@ -0,0 +1,82 @@ +#!/usr/local/bin/ruby + +# browse -- +# This script generates a directory browser, which lists the working +# directory and allow you to open files or subdirectories by +# double-clicking. + +require 'tk' + +class Browse + BROWSE_WIN_COUNTER = TkVariable.new(0) + + def initialize(dir) + BROWSE_WIN_COUNTER.value = BROWSE_WIN_COUNTER.to_i + 1 + + # create base frame + base = TkToplevel.new { + minsize(1,1) + title('Browse : ' + dir) + } + + # Create a scrollbar on the right side of the main window and a listbox + # on the left side. + list = TkListbox.new(base, 'relief'=>'sunken', + 'width'=>20, 'height'=>20, 'setgrid'=>'yes') {|l| + TkScrollbar.new(base, 'command'=>proc{|*args| l.yview *args}) {|s| + pack('side'=>'right', 'fill'=>'y') + l.yscrollcommand(proc{|first,last| s.set(first,last)}) + } + + pack('side'=>'left', 'fill'=>'both', 'expand'=>'yes') + + # Fill the listbox with a list of all the files in the directory (run + # the "ls" command to get that information). + open("|ls -a #{dir}", 'r'){|fid| fid.readlines}.each{|fname| + l.insert('end', fname.chomp) + } + + } + + # Set up bindings for the browser. + base.bind('Control-c', + proc{ + base.destroy + Browse::BROWSE_WIN_COUNTER.value = \ + Browse::BROWSE_WIN_COUNTER.to_i - 1}) + list.bind('Double-Button-1', + proc{TkSelection.get.each{|f| self.browse dir, f}}) + end + + # The method below is invoked to open a browser on a given file; if the + # file is a directory then another instance of this program is invoked; if + # the file is a regular file then the Mx editor is invoked to display + # the file. + def browse (dir, file) + file = dir + File::Separator + file if dir != '.' + type = File.ftype(file) + if type == 'directory' + Browse.new(file) + else + if type == 'file' + if ENV['EDITOR'] + system(ENV['EDITOR'] + ' ' + file + ' &') + else + system('xedit ' + file + ' &') + end + else + STDOUT.print "\"#{file}\" isn't a directory or regular file" + end + end + end + +end + +Browse.new(ARGV[0] ? ARGV[0] : '.') + +TkRoot.new { + withdraw + Browse::BROWSE_WIN_COUNTER.trace('w', proc{exit if Browse::BROWSE_WIN_COUNTER.to_i == 0}) +} + +Tk.mainloop diff --git a/ext/tk/sample/demos-jp/button.rb b/ext/tk/sample/demos-jp/button.rb new file mode 100644 index 0000000000..33247261f2 --- /dev/null +++ b/ext/tk/sample/demos-jp/button.rb @@ -0,0 +1,80 @@ +# +# button widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($button_demo) && $button_demo + $button_demo.destroy + $button_demo = nil +end + +# demo 用の toplevel widget を生成 +$button_demo = TkToplevel.new {|w| + title("Button Demonstration") + iconname("button") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($button_demo) { + font $kanji_font + wraplength '4i' + justify 'left' + text "ボタンをクリックすると、ボタンの背景色がそのボタンに書かれている色になります。ボタンからボタンへの移動はタブを押すことでも可能です。またスペースで実行することができます。" +} +msg.pack('side'=>'top') + +# frame 生成 +$button_buttons = TkFrame.new($button_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $button_demo + $button_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'button'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# button 生成 +TkButton.new($button_demo){ + text "Peach Puff" + width 10 + command proc{ + $button_demo.configure('bg','PeachPuff1') + $button_buttons.configure('bg','PeachPuff1') + } +}.pack('side'=>'top', 'expand'=>'yes', 'pady'=>2) + +TkButton.new($button_demo){ + text "Light Blue" + width 10 + command proc{ + $button_demo.configure('bg','LightBlue1') + $button_buttons.configure('bg','LightBlue1') + } +}.pack('side'=>'top', 'expand'=>'yes', 'pady'=>2) + +TkButton.new($button_demo){ + text "Sea Green" + width 10 + command proc{ + $button_demo.configure('bg','SeaGreen2') + $button_buttons.configure('bg','SeaGreen2') + } +}.pack('side'=>'top', 'expand'=>'yes', 'pady'=>2) + +TkButton.new($button_demo){ + text "Yellow" + width 10 + command proc{ + $button_demo.configure('bg','Yellow1') + $button_buttons.configure('bg','Yellow1') + } +}.pack('side'=>'top', 'expand'=>'yes', 'pady'=>2) diff --git a/ext/tk/sample/demos-jp/check.rb b/ext/tk/sample/demos-jp/check.rb new file mode 100644 index 0000000000..50c21fac0e --- /dev/null +++ b/ext/tk/sample/demos-jp/check.rb @@ -0,0 +1,66 @@ +# +# checkbutton widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($check_demo) && $check_demo + $check_demo.destroy + $check_demo = nil +end + +# demo 用の toplevel widget を生成 +$check_demo = TkToplevel.new {|w| + title("Checkbutton Demonstration") + iconname("check") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($check_demo) { + font $font + wraplength '4i' + justify 'left' + text "下には 3 つのチェックボタンが表示されています。クリックするとボタンの選択状態が変わり、Tcl 変数にそのボタンの状態を示す値を設定します。現在の変数の値を見るには「変数参照」ボタンをクリックしてください。" +} +msg.pack('side'=>'top') + +# 変数生成 +wipers = TkVariable.new(0) +brakes = TkVariable.new(0) +sober = TkVariable.new(0) + +# frame 生成 +TkFrame.new($check_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $check_demo + $check_demo = nil + $showVarsWin[tmppath.path] = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'check'} + }.pack('side'=>'left', 'expand'=>'yes') + + + TkButton.new(frame) { + text '変数参照' + command proc{ + showVars($check_demo, + ['wipers', wipers], ['brakes', brakes], ['sober', sober]) + } + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + + +# checkbutton 生成 +[ TkCheckButton.new($check_demo, 'text'=>'ワイパー OK', 'variable'=>wipers), + TkCheckButton.new($check_demo, 'text'=>'ブレーキ OK', 'variable'=>brakes), + TkCheckButton.new($check_demo, 'text'=>'ドライバー素面', 'variable'=>sober) +].each{|w| w.relief('flat'); w.pack('side'=>'top', 'pady'=>2, 'anchor'=>'w')} + diff --git a/ext/tk/sample/demos-jp/clrpick.rb b/ext/tk/sample/demos-jp/clrpick.rb new file mode 100644 index 0000000000..55cfd9c7c6 --- /dev/null +++ b/ext/tk/sample/demos-jp/clrpick.rb @@ -0,0 +1,74 @@ +# +# widget demo prompts the user to select a color (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($clrpick_demo) && $clrpick_demo + $clrpick_demo.destroy + $clrpick_demo = nil +end + +# demo 用の toplevel widget を生成 +$clrpick_demo = TkToplevel.new {|w| + title("Color Selection Dialogs") + iconname("colors") + positionWindow(w) +} + +# label 生成 +TkLabel.new($clrpick_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left', + 'text'=>"以下のボタンを押して、このウィンドウ上にあるウィジェットの前景色と背景色を選択して下さい。").pack('side'=>'top') + +# frame 生成 +TkFrame.new($clrpick_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $clrpick_demo + $clrpick_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'clrpick'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# button 生成 +TkButton.new($clrpick_demo, 'text'=>'背景色を設定 ...') {|b| + command(proc{setColor $clrpick_demo, b, 'background', + ['background', 'highlightbackground']}) + pack('side'=>'top', 'anchor'=>'c', 'pady'=>'2m') +} + +TkButton.new($clrpick_demo, 'text'=>'前景色を設定 ...') {|b| + command(proc{setColor $clrpick_demo, b, 'foreground', ['foreground']}) + pack('side'=>'top', 'anchor'=>'c', 'pady'=>'2m') +} + +def setColor(w,button,name,options) + w.grab + initialColor = button[name] + color = Tk.chooseColor('title'=>"Choose a #{name} color", 'parent'=>w, + 'initialcolor'=>initialColor) + if color != "" + setColor_helper(w,options,color) + end + + w.grab('release') +end + +def setColor_helper(w, options, color) + options.each{|opt| + begin + w[opt] = color + rescue + end + } + TkWinfo.children(w).each{|child| + setColor_helper child, options, color + } +end + diff --git a/ext/tk/sample/demos-jp/colors.rb b/ext/tk/sample/demos-jp/colors.rb new file mode 100644 index 0000000000..f9a5983e75 --- /dev/null +++ b/ext/tk/sample/demos-jp/colors.rb @@ -0,0 +1,143 @@ +# +# listbox widget demo 'colors' (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($colors_demo) && $colors_demo + $colors_demo.destroy + $colors_demo = nil +end + +# demo 用の toplevel widget を生成 +$colors_demo = TkToplevel.new {|w| + title("Listbox Demonstration (colors)") + iconname("colors") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($colors_demo) { + font $font + wraplength '4i' + justify 'left' + text "下には色の名前が入ったスクロールバー付のリストボックスが表示されています。リストをスクロールさせるのはスクロールバーでもできますし、リストボックスの中でマウスのボタン2(中ボタン)を押したままドラッグしてもできます。ある色をボタン1(左ボタン)でダブルクリックするとアプリケーション全体がその色になります。" +} +msg.pack('side'=>'top') + +# frame 生成 +TkFrame.new($colors_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $colors_demo + $colors_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'colors'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 生成 +colors_lbox = nil +TkFrame.new($colors_demo, 'borderwidth'=>10) {|w| + s = TkScrollbar.new(w) + colors_lbox = TkListbox.new(w) { + setgrid 1 + width 10 + height 12 + yscrollcommand proc{|first,last| s.set first,last} + } + s.command(proc{|*args| colors_lbox.yview(*args)}) + s.pack('side'=>'right', 'fill'=>'y') + colors_lbox.pack('side'=>'left', 'expand'=>1, 'fill'=>'both') +}.pack('side'=>'top', 'expand'=>'yes', 'fill'=>'y') + +colors_lbox.bind('Double-1', proc{TkPalette.setPalette TkSelection.get}) + +ins_data = [ + 'gray60','gray70','gray80','gray85','gray90','gray95', + 'snow1','snow2','snow3','snow4','seashell1','seashell2', + 'seashell3','seashell4','AntiqueWhite1','AntiqueWhite2', + 'AntiqueWhite3','AntiqueWhite4','bisque1','bisque2', + 'bisque3','bisque4','PeachPuff1','PeachPuff2', + 'PeachPuff3','PeachPuff4','NavajoWhite1','NavajoWhite2', + 'NavajoWhite3','NavajoWhite4','LemonChiffon1', + 'LemonChiffon2','LemonChiffon3','LemonChiffon4', + 'cornsilk1','cornsilk2','cornsilk3','cornsilk4', + 'ivory1','ivory2','ivory3','ivory4','honeydew1', + 'honeydew2','honeydew3','honeydew4','LavenderBlush1', + 'LavenderBlush2','LavenderBlush3','LavenderBlush4', + 'MistyRose1','MistyRose2','MistyRose3','MistyRose4', + 'azure1','azure2','azure3','azure4','SlateBlue1', + 'SlateBlue2','SlateBlue3','SlateBlue4','RoyalBlue1', + 'RoyalBlue2','RoyalBlue3','RoyalBlue4','blue1','blue2', + 'blue3','blue4','DodgerBlue1','DodgerBlue2', + 'DodgerBlue3','DodgerBlue4','SteelBlue1','SteelBlue2', + 'SteelBlue3','SteelBlue4','DeepSkyBlue1','DeepSkyBlue2', + 'DeepSkyBlue3','DeepSkyBlue4','SkyBlue1','SkyBlue2', + 'SkyBlue3','SkyBlue4','LightSkyBlue1','LightSkyBlue2', + 'LightSkyBlue3','LightSkyBlue4','SlateGray1', + 'SlateGray2','SlateGray3','SlateGray4', + 'LightSteelBlue1','LightSteelBlue2','LightSteelBlue3', + 'LightSteelBlue4','LightBlue1','LightBlue2', + 'LightBlue3','LightBlue4','LightCyan1','LightCyan2', + 'LightCyan3','LightCyan4','PaleTurquoise1', + 'PaleTurquoise2','PaleTurquoise3','PaleTurquoise4', + 'CadetBlue1','CadetBlue2','CadetBlue3','CadetBlue4', + 'turquoise1','turquoise2','turquoise3','turquoise4', + 'cyan1','cyan2','cyan3','cyan4','DarkSlateGray1', + 'DarkSlateGray2','DarkSlateGray3','DarkSlateGray4', + 'aquamarine1','aquamarine2','aquamarine3','aquamarine4', + 'DarkSeaGreen1','DarkSeaGreen2','DarkSeaGreen3', + 'DarkSeaGreen4','SeaGreen1','SeaGreen2','SeaGreen3', + 'SeaGreen4','PaleGreen1','PaleGreen2','PaleGreen3', + 'PaleGreen4','SpringGreen1','SpringGreen2', + 'SpringGreen3','SpringGreen4','green1','green2', + 'green3','green4','chartreuse1','chartreuse2', + 'chartreuse3','chartreuse4','OliveDrab1','OliveDrab2', + 'OliveDrab3','OliveDrab4','DarkOliveGreen1', + 'DarkOliveGreen2','DarkOliveGreen3','DarkOliveGreen4', + 'khaki1','khaki2','khaki3','khaki4','LightGoldenrod1', + 'LightGoldenrod2','LightGoldenrod3','LightGoldenrod4', + 'LightYellow1','LightYellow2','LightYellow3', + 'LightYellow4','yellow1','yellow2','yellow3','yellow4', + 'gold1','gold2','gold3','gold4','goldenrod1', + 'goldenrod2','goldenrod3','goldenrod4','DarkGoldenrod1', + 'DarkGoldenrod2','DarkGoldenrod3','DarkGoldenrod4', + 'RosyBrown1','RosyBrown2','RosyBrown3','RosyBrown4', + 'IndianRed1','IndianRed2','IndianRed3','IndianRed4', + 'sienna1','sienna2','sienna3','sienna4','burlywood1', + 'burlywood2','burlywood3','burlywood4','wheat1', + 'wheat2','wheat3','wheat4','tan1','tan2','tan3','tan4', + 'chocolate1','chocolate2','chocolate3','chocolate4', + 'firebrick1','firebrick2','firebrick3','firebrick4', + 'brown1','brown2','brown3','brown4','salmon1','salmon2', + 'salmon3','salmon4','LightSalmon1','LightSalmon2', + 'LightSalmon3','LightSalmon4','orange1','orange2', + 'orange3','orange4','DarkOrange1','DarkOrange2', + 'DarkOrange3','DarkOrange4','coral1','coral2','coral3', + 'coral4','tomato1','tomato2','tomato3','tomato4', + 'OrangeRed1','OrangeRed2','OrangeRed3','OrangeRed4', + 'red1','red2','red3','red4','DeepPink1','DeepPink2', + 'DeepPink3','DeepPink4','HotPink1','HotPink2', + 'HotPink3','HotPink4','pink1','pink2','pink3','pink4', + 'LightPink1','LightPink2','LightPink3','LightPink4', + 'PaleVioletRed1','PaleVioletRed2','PaleVioletRed3', + 'PaleVioletRed4','maroon1','maroon2','maroon3', + 'maroon4','VioletRed1','VioletRed2','VioletRed3', + 'VioletRed4','magenta1','magenta2','magenta3', + 'magenta4','orchid1','orchid2','orchid3','orchid4', + 'plum1','plum2','plum3','plum4','MediumOrchid1', + 'MediumOrchid2','MediumOrchid3','MediumOrchid4', + 'DarkOrchid1','DarkOrchid2','DarkOrchid3', + 'DarkOrchid4','purple1','purple2','purple3','purple4', + 'MediumPurple1','MediumPurple2','MediumPurple3', + 'MediumPurple4','thistle1','thistle2','thistle3', 'thistle4' +] + +colors_lbox.insert(0, *ins_data) diff --git a/ext/tk/sample/demos-jp/cscroll.rb b/ext/tk/sample/demos-jp/cscroll.rb new file mode 100644 index 0000000000..7f5ffa2f02 --- /dev/null +++ b/ext/tk/sample/demos-jp/cscroll.rb @@ -0,0 +1,130 @@ +# +# simple scrollable canvas widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($cscroll_demo) && $cscroll_demo + $cscroll_demo.destroy + $cscroll_demo = nil +end + +# demo 用の toplevel widget を生成 +$cscroll_demo = TkToplevel.new {|w| + title("Scrollable Canvas Demonstration") + iconname("cscroll") + positionWindow(w) +} + +# label 生成 +TkLabel.new($cscroll_demo, 'font'=>$font, 'wraplength'=>'4i', + 'justify'=>'left', 'text'=>"このウィンドウにはスクロールバーやマウスのボタン2 でスクロールできるキャンバス widget が表示されています。四角の上でボタン1 をクリックすると、そのインデックスが標準出力に出力されます。"){ + pack('side'=>'top') +} + +# frame 生成 +$cscroll_buttons = TkFrame.new($cscroll_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $cscroll_demo + $cscroll_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'cscroll'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$cscroll_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 設定 +unless $tk_version =~ /^4\.[01]/ + $cscroll_grid = TkFrame.new($cscroll_demo) { + pack('expand'=>'yes', 'fill'=>'both', 'padx'=>1, 'pady'=>1) + } + TkGrid.rowconfigure($cscroll_grid, 0, 'weight'=>1, 'minsize'=>0) + TkGrid.columnconfigure($cscroll_grid, 0, 'weight'=>1, 'minsize'=>0) +end + +# canvas 設定 +$cscroll_canvas = TkCanvas.new($cscroll_demo, + 'relief'=>'sunken', 'borderwidth'=>2, + 'scrollregion'=>['-11c', '-11c', '50c', '20c'] + ) {|c| + if $tk_version =~ /^4\.[01]/ + pack('expand'=>'yes', 'fill'=>'both') + else + grid('in'=>$cscroll_grid, 'padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + end + + TkScrollbar.new($cscroll_demo, 'command'=>proc{|*args| c.yview(*args)}) {|vs| + c.yscrollcommand(proc{|first,last| vs.set first,last}) + if $tk_version =~ /^4\.[01]/ + pack('side'=>'right', 'fill'=>'y') + else + grid('in'=>$cscroll_grid, 'padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>1, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + end + } + + TkScrollbar.new($cscroll_demo, 'orient'=>'horiz', + 'command'=>proc{|*args| c.xview(*args)}) {|hs| + c.xscrollcommand(proc{|first,last| hs.set first,last}) + if $tk_version =~ /^4\.[01]/ + pack('side'=>'bottom', 'fill'=>'x') + else + grid('in'=>$cscroll_grid, 'padx'=>1, 'pady'=>1, 'row'=>1, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + end + } +} + +bg = $cscroll_canvas.configinfo('bg')[4] +(0..19).each{|i| + x = -10+3*i + y = -10 + (0..9).each{|j| + TkcRectangle.new($cscroll_canvas, "#{x}c", "#{y}c", "#{x+2}c", "#{y+2}c", + 'outline'=>'black', 'fill'=>bg, 'tags'=>'rect') + TkcText.new($cscroll_canvas, "#{x+1}c", "#{y+1}c", + 'text'=>"#{i},#{j}", 'anchor'=>'center', 'tags'=>'text') + y += 3 + } +} + +$cscroll_canvas.itembind('all', 'Any-Enter', proc{scrollEnter $cscroll_canvas}) +$cscroll_canvas.itembind('all', 'Any-Leave', proc{scrollLeave $cscroll_canvas}) +$cscroll_canvas.itembind('all', '1', proc{scrollButton $cscroll_canvas}) +$cscroll_canvas.itembind('all', 'Any-Enter', proc{scrollEnter $cscroll_canvas}) +$cscroll_canvas.bind('2', proc{|x,y| $cscroll_canvas.scan_mark(x,y)}, '%x %y') +$cscroll_canvas.bind('B2-Motion', + proc{|x,y| $cscroll_canvas.scan_dragto(x,y)}, '%x %y') + +def scrollEnter(c) + id = c.find_withtag('current')[0].id + id -= 1 if c.gettags('current').include?('text') + $oldFill = c.itemconfiginfo(id, 'fill')[4] + if TkWinfo.depth(c) > 1 + c.itemconfigure(id, 'fill'=>'SeaGreen1') + else + c.itemconfigure(id, 'fill'=>'black') + c.itemconfigure(id+1, 'fill'=>'white') + end +end + +def scrollLeave(c) + id = c.find_withtag('current')[0].id + id -= 1 if c.gettags('current').include?('text') + c.itemconfigure(id, 'fill'=>$oldFill) + c.itemconfigure(id+1, 'fill'=>'black') +end + +def scrollButton(c) + id = c.find_withtag('current')[0].id + id += 1 unless c.gettags('current').include?('text') + print "You buttoned at #{c.itemconfiginfo(id,'text')[4]}\n" +end + diff --git a/ext/tk/sample/demos-jp/ctext.rb b/ext/tk/sample/demos-jp/ctext.rb new file mode 100644 index 0000000000..62b02b3972 --- /dev/null +++ b/ext/tk/sample/demos-jp/ctext.rb @@ -0,0 +1,181 @@ +# +# Canvas Text widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($ctext_demo) && $ctext_demo + $ctext_demo.destroy + $ctext_demo = nil +end + +# demo 用の toplevel widget を生成 +$ctext_demo = TkToplevel.new {|w| + title("Canvas Text Demonstration") + iconname("Text") + positionWindow(w) +} + +# label 生成 +TkLabel.new($ctext_demo, 'font'=>$font, 'wraplength'=>'5i', 'justify'=>'left', + 'text'=>"このウィンドウにはキャンバスwidgetのテキスト機能をデモするためのテキスト文字列が表示されています。マウスを四角の中に持っていき、クリックすると位置ぎめ用の点からの相対位置を変えたり、行揃えを変えたりすることができます。また以下のような編集のための簡単なバインディングをサポートしています。 + + 1. マウスを持っていき、クリックし、入力できます。 + 2. ボタン1で選択できます。 + 3. マウスの位置にボタン2で選択したテキストをコピーできます。 + 4.バックスペースをコントロール-Hで挿入カーソルの直前の文字を削除します。 + 5. Deleteキーは挿入カーソルの直後の文字を削除します。"){ + pack('side'=>'top') +} + +# frame 生成 +$ctext_buttons = TkFrame.new($ctext_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $ctext_demo + $ctext_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'ctext'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$ctext_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# canvas 生成 +$ctext_canvas = TkCanvas.new($ctext_demo, 'relief'=>'flat', + 'borderwidth'=>0, 'width'=>500, 'height'=>350) +$ctext_canvas.pack('side'=>'top', 'expand'=>'yes', 'fill'=>'both') + +# font 設定 +textFont = '-*-Helvetica-Medium-R-Normal--*-240-*-*-*-*-*-*' + +# canvas 設定 +TkcRectangle.new($ctext_canvas, 245, 195, 255, 205, + 'outline'=>'black', 'fill'=>'red') + +$ctag_text = TkcTag.new($ctext_canvas) +$ctag_text.withtag(TkcText.new($ctext_canvas, 250, 200, + 'text'=>"これはキャンバスwidgetのテキスト機能をデモするための文字列です。マウスを持っていき、クリックして入力できます。選択してコントロール-Dで消去することもできます。", + 'width'=>440, 'anchor'=>'n', + 'font'=>'-*-Helvetica-Medium-R-Normal--*-240-*-*-*-*-*-*', + 'kanjifont'=>'-*--24-*-jisx0208.1983-0', + 'justify'=>'left') ) + +$ctag_text.bind('1', proc{|x,y| textB1Press $ctext_canvas,x,y}, "%x %y") +$ctag_text.bind('B1-Motion', proc{|x,y| textB1Move $ctext_canvas,x,y}, "%x %y") +$ctag_text.bind('Shift-1', + proc{|x,y| $ctext_canvas.seleect_adjust 'current', "@#{x},#{y}"}, + "%x %y") +$ctag_text.bind('Shift-B1-Motion', + proc{|x,y| textB1Move $ctext_canvas,x,y}, "%x %y") +$ctag_text.bind('KeyPress', proc{|a| textInsert $ctext_canvas,a}, "%A") +$ctag_text.bind('Return', proc{textInsert $ctext_canvas,"\n"}) +$ctag_text.bind('Control-h', proc{textBs $ctext_canvas}) +$ctag_text.bind('BackSpace', proc{textBs $ctext_canvas}) +$ctag_text.bind('Delete', proc{textDel $ctext_canvas}) +$ctag_text.bind('2', proc{|x,y| textPaste $ctext_canvas, "@#{x},#{y}"}, + "%x %y") + +# Next, create some items that allow the text's anchor position +# to be edited. + +def mkTextConfig(w,x,y,option,value,color) + item = TkcRectangle.new(w, x, y, x+30, y+30, + 'outline'=>'black', 'fill'=>color, 'width'=>1) + item.bind('1', proc{$ctag_text.configure option, value}) + w.addtag_withtag('config', item) +end + +x = 50 +y = 50 +color = 'LightSkyBlue1' +mkTextConfig $ctext_canvas, x, y, 'anchor', 'se', color +mkTextConfig $ctext_canvas, x+30, y, 'anchor', 's', color +mkTextConfig $ctext_canvas, x+60, y, 'anchor', 'sw', color +mkTextConfig $ctext_canvas, x, y+30, 'anchor', 'e', color +mkTextConfig $ctext_canvas, x+30, y+30, 'anchor', 'center', color +mkTextConfig $ctext_canvas, x+60, y+30, 'anchor', 'w', color +mkTextConfig $ctext_canvas, x, y+60, 'anchor', 'ne', color +mkTextConfig $ctext_canvas, x+30, y+60, 'anchor', 'n', color +mkTextConfig $ctext_canvas, x+60, y+60, 'anchor', 'nw', color +item = TkcRectangle.new($ctext_canvas, x+40, y+40, x+50, y+50, + 'outline'=>'black', 'fill'=>'red') +item.bind('1', proc{$ctag_text.configure 'anchor', 'center'}) +TkcText.new($ctext_canvas, x+45, y-5, 'text'=>'Text Position', 'anchor'=>'s', + 'font'=>'-*-times-medium-r-normal--*-240-*-*-*-*-*-*', + 'fill'=>'brown') + +# Lastly, create some items that allow the text's justification to be +# changed. + +x = 350 +y = 50 +color = 'SeaGreen2' +mkTextConfig $ctext_canvas, x, y, 'justify', 'left', color +mkTextConfig $ctext_canvas, x+30, y, 'justify', 'center', color +mkTextConfig $ctext_canvas, x+60, y, 'justify', 'right', color +TkcText.new($ctext_canvas, x+45, y-5, 'text'=>'Justification', 'anchor'=>'s', + 'font'=>'-*-times-medium-r-normal--*-240-*-*-*-*-*-*', + 'fill'=>'brown') + +$ctext_canvas.itembind('config', 'Enter', proc{textEnter $ctext_canvas}) +$ctext_canvas.itembind('config', 'Leave', + proc{$ctext_canvas\ + .itemconfigure('current', + 'fill'=>$textConfigFill)}) + +$textConfigFill = '' + +def textEnter(w) + $textConfigFill = (w.itemconfiginfo 'current', 'fill')[4] + w.itemconfigure 'current', 'fill', 'black' +end + +def textInsert(w, string) + return if string == "" + begin + $ctag_text.dchars 'sel.first', 'sel.last' + rescue + end + $ctag_text.insert 'insert', string +end + +def textPaste(w, pos) + begin + $ctag_text.insert pos, TkSelection.get + rescue + end +end + +def textB1Press(w,x,y) + w.icursor 'current', "@#{x},#{y}" + w.itemfocus 'current' + w.focus + w.select_from 'current', "@#{x},#{y}" +end + +def textB1Move(w,x,y) + w.select_to 'current', "@#{x},#{y}" +end + +def textBs(w) + begin + $ctag_text.dchars 'sel.first', 'sel.last' + rescue + char = $ctag_text.index('insert').to_i - 1 + $ctag_text.dchars(char) if char >= 0 + end +end + +def textDel(w) + begin + $ctag_text.dchars 'sel.first', 'sel.last' + rescue + $ctag_text.dchars 'insert' + end +end + diff --git a/ext/tk/sample/demos-jp/dialog1.rb b/ext/tk/sample/demos-jp/dialog1.rb new file mode 100644 index 0000000000..317b6d9eb3 --- /dev/null +++ b/ext/tk/sample/demos-jp/dialog1.rb @@ -0,0 +1,35 @@ +# +# a dialog box with a local grab (called by 'widget') +# +class TkDialog_Demo1 < TkDialog + def title + "Dialog with local grab" + end + + def message + 'モーダルダイアログボックスです。Tk の "grab" コマンドを使用してダイアログボックスで「ローカルグラブ」しています。下のいずれかのボタンを実行することによって、このダイアログに答えるまで、このグラブによってアプリケーションの他のウィンドウでは、ポインタ関係のイベントを受け取ることができなくなっています。' + end + + def bitmap + 'info' + end + + def default_button + 0 + end + + def buttons +# "了解 キャンセル コード参照" + ["了解", "キャンセル", "コード参照"] + end +end + +ret = TkDialog_Demo1.new('message_config'=>{'wraplength'=>'4i'}).value +case ret +when 0 + print "あなたは「了解」を押しましたね。\n" +when 1 + print "あなたは「キャンセル」を押しましたね。\n" +when 2 + showCode dialog1 +end diff --git a/ext/tk/sample/demos-jp/dialog2.rb b/ext/tk/sample/demos-jp/dialog2.rb new file mode 100644 index 0000000000..295522e562 --- /dev/null +++ b/ext/tk/sample/demos-jp/dialog2.rb @@ -0,0 +1,39 @@ +# +# a dialog box with a global grab (called by 'widget') +# +class TkDialog_Demo2 < TkDialog + def title + "Dialog with global grab" + end + + def message + 'このダイアログボックスはグローバルグラブを使用しています。下のボタンを実行するまで、ディスプレイ上のいかなるものとも対話できません。グローバルグラブを使用することは、まず良い考えではありません。どうしても必要になるまで使おうと思わないで下さい。' + end + + def bitmap + 'info' + end + + def default_button + 0 + end + + def buttons +# "了解 キャンセル コード参照" + ["了解", "キャンセル", "コード参照"] + end +end + +ret = TkDialog_Demo2.new('message_config'=>{'wraplength'=>'4i'}, + 'prev_command'=>proc{|dialog| + Tk.after 100, proc{dialog.grab('global')} + }).value +case ret +when 0 + print "あなたは「了解」を押しましたね。\n" +when 1 + print "あなたは「キャンセル」を押しましたね。\n" +when 2 + showCode dialog2 +end + diff --git a/ext/tk/sample/demos-jp/doc.org/README b/ext/tk/sample/demos-jp/doc.org/README new file mode 100644 index 0000000000..90677d3316 --- /dev/null +++ b/ext/tk/sample/demos-jp/doc.org/README @@ -0,0 +1,7 @@ +This directory contains a collection of demonstration programs that +are translated into Japanese. You need to use a Japanized "wish" to +see these Japanese-translated demonstration programs. You also need +to put this directory ("demos.jp") at the next to "demos" since some +of the programs refer to the image files at "demos". + +Please refer to the README file at "demos" for more detail. diff --git a/ext/tk/sample/demos-jp/doc.org/README.JP b/ext/tk/sample/demos-jp/doc.org/README.JP new file mode 100644 index 0000000000..42b4929378 --- /dev/null +++ b/ext/tk/sample/demos-jp/doc.org/README.JP @@ -0,0 +1,14 @@ +This directory contains "widget" demo for the Japanized Tcl7.6/Tk4.2. +Most of the messages in the original are translated to Japanese. +But other tools in this directory are not translated. + +Following 2 kanji fonts are defined at the beginning of the file "widget." + + -*--24-*-jisx0208.1983-0 + -*--16-*-jisx0208.1983-0 + +These fonts are all part of the core distribution of X11R5, so +if you are running X11R5, you don't have to modify the file. + +But if you don't have these fonts, replace them with appropriate ones. +"-*--14-*-jisx0208.1983-0" will be a good choice. diff --git a/ext/tk/sample/demos-jp/doc.org/README.tk80 b/ext/tk/sample/demos-jp/doc.org/README.tk80 new file mode 100644 index 0000000000..c71f977d74 --- /dev/null +++ b/ext/tk/sample/demos-jp/doc.org/README.tk80 @@ -0,0 +1,46 @@ +This directory contains a collection of programs to demonstrate +the features of the Tk toolkit. The programs are all scripts for +"wish", a windowing shell. If wish has been installed in /usr/local +then you can invoke any of the programs in this directory just +by typing its file name to your command shell. Otherwise invoke +wish with the file as its first argument, e.g., "wish hello". +The rest of this file contains a brief description of each program. +Files with names ending in ".tcl" are procedure packages used by one +or more of the demo programs; they can't be used as programs by +themselves so they aren't described below. + +hello - Creates a single button; if you click on it, a message + is typed and the application terminates. + +widget - Contains a collection of demonstrations of the widgets + currently available in the Tk library. Most of the .tcl + files are scripts for individual demos available through + the "widget" program. + +ixset - A simple Tk-based wrapper for the "xset" program, which + allows you to interactively query and set various X options + such as mouse acceleration and bell volume. Thanks to + Pierre David for contributing this example. + +rolodex - A mock-up of a simple rolodex application. It has much of + the user interface for such an application but no back-end + database. This program was written in response to Tom + LaStrange's toolkit benchmark challenge. + +tcolor - A color editor. Allows you to edit colors in several + different ways, and will also perform automatic updates + using "send". + +rmt - Allows you to "hook-up" remotely to any Tk application + on the display. Select an application with the menu, + then just type commands: they'll go to that application. + +timer - Displays a seconds timer with start and stop buttons. + Control-c and control-q cause it to exit. + +browse - A simple directory browser. Invoke it with and argument + giving the name of the directory you'd like to browse. + Double-click on files or subdirectories to browse them. + Control-c and control-q cause the program to exit. + +sccs id = SCCS: @(#) README 1.3 96/02/16 10:49:14 diff --git a/ext/tk/sample/demos-jp/doc.org/license.terms b/ext/tk/sample/demos-jp/doc.org/license.terms new file mode 100644 index 0000000000..03ca6fcb31 --- /dev/null +++ b/ext/tk/sample/demos-jp/doc.org/license.terms @@ -0,0 +1,39 @@ +This software is copyrighted by the Regents of the University of +California, Sun Microsystems, Inc., and other parties. The following +terms apply to all files associated with the software unless explicitly +disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the +U.S. government, the Government shall have only "Restricted Rights" +in the software and related documentation as defined in the Federal +Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you +are acquiring the software on behalf of the Department of Defense, the +software shall be classified as "Commercial Computer Software" and the +Government shall have only "Restricted Rights" as defined in Clause +252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the +authors grant the U.S. Government and others acting in its behalf +permission to use and distribute the software in accordance with the +terms specified in this license. diff --git a/ext/tk/sample/demos-jp/doc.org/license.terms.tk80 b/ext/tk/sample/demos-jp/doc.org/license.terms.tk80 new file mode 100644 index 0000000000..03ca6fcb31 --- /dev/null +++ b/ext/tk/sample/demos-jp/doc.org/license.terms.tk80 @@ -0,0 +1,39 @@ +This software is copyrighted by the Regents of the University of +California, Sun Microsystems, Inc., and other parties. The following +terms apply to all files associated with the software unless explicitly +disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, +and license this software and its documentation for any purpose, provided +that existing copyright notices are retained in all copies and that this +notice is included verbatim in any distributions. No written agreement, +license, or royalty fee is required for any of the authorized uses. +Modifications to this software may be copyrighted by their authors +and need not follow the licensing terms described here, provided that +the new terms are clearly indicated on the first page of each file where +they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY +FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY +DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE +IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE +NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR +MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the +U.S. government, the Government shall have only "Restricted Rights" +in the software and related documentation as defined in the Federal +Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you +are acquiring the software on behalf of the Department of Defense, the +software shall be classified as "Commercial Computer Software" and the +Government shall have only "Restricted Rights" as defined in Clause +252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the +authors grant the U.S. Government and others acting in its behalf +permission to use and distribute the software in accordance with the +terms specified in this license. diff --git a/ext/tk/sample/demos-jp/entry1.rb b/ext/tk/sample/demos-jp/entry1.rb new file mode 100644 index 0000000000..273b6728df --- /dev/null +++ b/ext/tk/sample/demos-jp/entry1.rb @@ -0,0 +1,56 @@ +# +# entry (no scrollbars) widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($entry1_demo) && $entry1_demo + $entry1_demo.destroy + $entry1_demo = nil +end + +# demo 用の toplevel widget を生成 +$entry1_demo = TkToplevel.new {|w| + title("Entry Demonstration (no scrollbars)") + iconname("entry1") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($entry1_demo) { + font $font + wraplength '5i' + justify 'left' + text "3種類の異なるエントリが表示されています。文字を入力するにはポインタを持って行き、クリックしてからタイプしてください。標準的なMotifの編集機能が、Emacsのキーバインドとともに、サポートされています。例えば、バックスペースとコントロール-Hはカーソルの左の文字を削除し、デリートキーとコントロール-Dはカーソルの右側の文字を削除します。長過ぎてウィンドウに入り切らないものは、マウスのボタン2を押したままドラッグすることでスクロールさせることができます。日本語を入力するのはコントロール-バックスラッシュです。kinput2が動いていれば入力することができます。" +} +msg.pack('side'=>'top') + +# frame 生成 +TkFrame.new($entry1_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $entry1_demo + $entry1_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'entry1'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# entry 生成 +e1 = TkEntry.new($entry1_demo, 'relief'=>'sunken') +e2 = TkEntry.new($entry1_demo, 'relief'=>'sunken') +e3 = TkEntry.new($entry1_demo, 'relief'=>'sunken') +[e1,e2,e3].each{|w| w.pack('side'=>'top', 'padx'=>10, 'pady'=>5, 'fill'=>'x')} + +# 初期値挿入 +e1.insert(0, '初期値') +e2.insert('end', "このエントリには長い文字列が入っていて、") +e2.insert('end', "長すぎてウィンドウには入り切らないので、") +e2.insert('end', "実際の所終りまで見るにはスクロールさせなければ") +e2.insert('end', "ならないでしょう。") + diff --git a/ext/tk/sample/demos-jp/entry2.rb b/ext/tk/sample/demos-jp/entry2.rb new file mode 100644 index 0000000000..7efac005f0 --- /dev/null +++ b/ext/tk/sample/demos-jp/entry2.rb @@ -0,0 +1,87 @@ +# +# entry (with scrollbars) widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($entry2_demo) && $entry2_demo + $entry2_demo.destroy + $entry2_demo = nil +end + +# demo 用の toplevel widget を生成 +$entry2_demo = TkToplevel.new {|w| + title("Entry Demonstration (with scrollbars)") + iconname("entry2") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($entry2_demo) { + font $font + wraplength '5i' + justify 'left' + text "3種類の異なるエントリが各々スクロールバー付で表示されています。文字を入力するにはポインタを持って行き、クリックしてからタイプしてください。標準的なMotifの編集機能が、Emacsのキーバインドとともに、サポートされています。例えば、バックスペースとコントロール-Hはカーソルの左の文字を削除し、デリートキーとコントロール-Dはカーソルの右側の文字を削除します。長過ぎてウィンドウに入り切らないものは、マウスのボタン2を押したままドラッグすることでスクロールさせることができます。日本語を入力するのはコントロール-バックスラッシュです。kinput2が動いていれば入力することができます。" +} +msg.pack('side'=>'top') + +# frame 生成 +TkFrame.new($entry2_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $entry2_demo + $entry2_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'entry2'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 生成 +TkFrame.new($entry2_demo, 'borderwidth'=>10) {|w| + # entry 1 + s1 = TkScrollbar.new(w, 'relief'=>'sunken', 'orient'=>'horiz') + e1 = TkEntry.new(w, 'relief'=>'sunken') { + xscrollcommand proc{|first,last| s1.set first,last} + } + s1.command(proc{|*args| e1.xview(*args)}) + e1.pack('side'=>'top', 'fill'=>'x') + s1.pack('side'=>'top', 'fill'=>'x') + + # spacer + TkFrame.new(w, 'width'=>20, 'height'=>10).pack('side'=>'top', 'fill'=>'x') + + # entry 2 + s2 = TkScrollbar.new(w, 'relief'=>'sunken', 'orient'=>'horiz') + e2 = TkEntry.new(w, 'relief'=>'sunken') { + xscrollcommand proc{|first,last| s2.set first,last} + } + s2.command(proc{|*args| e2.xview(*args)}) + e2.pack('side'=>'top', 'fill'=>'x') + s2.pack('side'=>'top', 'fill'=>'x') + + # spacer + TkFrame.new(w, 'width'=>20, 'height'=>10).pack('side'=>'top', 'fill'=>'x') + + # entry 3 + s3 = TkScrollbar.new(w, 'relief'=>'sunken', 'orient'=>'horiz') + e3 = TkEntry.new(w, 'relief'=>'sunken') { + xscrollcommand proc{|first,last| s3.set first,last} + } + s3.command(proc{|*args| e3.xview(*args)}) + e3.pack('side'=>'top', 'fill'=>'x') + s3.pack('side'=>'top', 'fill'=>'x') + + # 初期値挿入 + e1.insert(0, '初期値') + e2.insert('end', "このエントリには長い文字列が入っていて、") + e2.insert('end', "長すぎてウィンドウには入り切らないので、") + e2.insert('end', "実際の所終りまで見るにはスクロールさせなければ") + e2.insert('end', "ならないでしょう。") + +}.pack('side'=>'top', 'fill'=>'x', 'expand'=>'yes') + diff --git a/ext/tk/sample/demos-jp/filebox.rb b/ext/tk/sample/demos-jp/filebox.rb new file mode 100644 index 0000000000..1754596706 --- /dev/null +++ b/ext/tk/sample/demos-jp/filebox.rb @@ -0,0 +1,95 @@ +# +# widget demo prompts the user to select a file (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($filebox_demo) && $entry2_demo + $filebox_demo.destroy + $filebox_demo = nil +end + +# demo 用の toplevel widget を生成 +$filebox_demo = TkToplevel.new {|w| + title("File Selection Dialogs") + iconname("filebox") + positionWindow(w) +} + +# label 生成 +TkLabel.new($filebox_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left', + 'text'=>"エントリにファイル名を直接入力するか、\"Browse\" ボタンを押してファイル選択ダイアログからファイル名を選んで下さい。").pack('side'=>'top') + +# frame 生成 +TkFrame.new($filebox_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $filebox_demo + $filebox_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'filebox'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 生成 +['開く', '保存'].each{|type| + TkFrame.new($filebox_demo) {|f| + TkLabel.new(f, 'text'=>"ファイルを#{type}: ", 'anchor'=>'e')\ + .pack('side'=>'left') + + TkEntry.new(f, 'width'=>20) {|e| + pack('side'=>'left', 'expand'=>'yes', 'fill'=>'x') + + TkButton.new(f, 'text'=>'Browse ...', + 'command'=>proc{fileDialog $filebox_demo,e,type})\ + .pack('side'=>'left') + } + + pack('fill'=>'x', 'padx'=>'1c', 'pady'=>3) + } +} + +$tk_strictMotif = TkVarAccess.new('tk_strictMotif') +if ($tk_platform['platform'] == 'unix') + TkCheckButton.new($filebox_demo, + 'text'=>'Motifスタイルのダイアログを用いる', + 'variable'=>$tk_strictMotif, + 'onvalue'=>1, 'offvalue'=>0 ).pack('anchor'=>'c') +end + +def fileDialog(w,ent,operation) + # Type names Extension(s) Mac File Type(s) + # + #-------------------------------------------------------- + types = [ + ['Text files', ['.txt','.doc'] ], + ['Text files', [], 'TEXT' ], + ['Ruby Scripts', ['.rb'], 'TEXT' ], + ['Tcl Scripts', ['.tcl'], 'TEXT' ], + ['C Source Files', ['.c','.h'] ], + ['All Source Files', ['.rb','.tcl','.c','.h'] ], + ['Image Files', ['.gif'] ], + ['Image Files', ['.jpeg','.jpg'] ], + ['Image Files', [], ['GIFF','JPEG']], + ['All files', '*' ] + ] + + if operation == '開く' + file = Tk.getOpenFile('filetypes'=>types, 'parent'=>w) + else + file = Tk.getSaveFile('filetypes'=>types, 'parent'=>w, + 'initialfile'=>'Untitled', + 'defaultextension'=>'.txt') + end + if file != "" + ent.delete 0, 'end' + ent.insert 0, file + ent.xview 'end' + end +end + diff --git a/ext/tk/sample/demos-jp/floor.rb b/ext/tk/sample/demos-jp/floor.rb new file mode 100644 index 0000000000..bb655d5b55 --- /dev/null +++ b/ext/tk/sample/demos-jp/floor.rb @@ -0,0 +1,1717 @@ +# +# floorDisplay widget demo (called by 'widget') +# + +# floorDisplay -- +# Recreate the floorplan display in the canvas given by "w". The +# floor given by "active" is displayed on top with its office structure +# visible. +# +# Arguments: +# w - Name of the canvas window. +# active - Number of active floor (1, 2, or 3). + +def floorDisplay(w,active) + return if $activeFloor == active + + w.delete('all') + $activeFloor = active + + # First go through the three floors, displaying the backgrounds for + # each floor. + + floor_bg1(w,$floor_colors['bg1'],$floor_colors['outline1']) + floor_bg2(w,$floor_colors['bg2'],$floor_colors['outline2']) + floor_bg3(w,$floor_colors['bg3'],$floor_colors['outline3']) + + # Raise the background for the active floor so that it's on top. + + w.raise("floor#{active}") + + # Create a dummy item just to mark this point in the display list, + # so we can insert highlights here. + + TkcRectangle.new(w,0,100,1,101, 'fill'=>'', 'outline'=>'', 'tags'=>'marker') + + # Add the walls and labels for the active floor, along with + # transparent polygons that define the rooms on the floor. + # Make sure that the room polygons are on top. + + $floorLabels.clear + $floorItems.clear + send("floor_fg#{active}", w, $floor_colors['offices']) + w.raise('room') + + # Offset the floors diagonally from each other. + + w.move('floor1', '2c', '2c') + w.move('floor2', '1c', '1c') + + # Create items for the room entry and its label. + TkcWindow.new(w, 600, 100, 'anchor'=>'w', 'window'=>$floor_entry) + TkcText.new(w, 600, 100, 'anchor'=>'e', 'text'=>"部屋番号: ") + w['scrollregion'] = w.bbox('all') +end + +# newRoom -- +# This method is invoked whenever the mouse enters a room +# in the floorplan. It changes tags so that the current room is +# highlighted. +# +# Arguments: +# w - The name of the canvas window. + +def newRoom(w) + id = w.find_withtag('current')[0] + $currentRoom.value = $floorLabels[id.id] if id != "" + Tk.update(true) +end + +# roomChanged -- +# This method is invoked whenever the currentRoom variable changes. +# It highlights the current room and unhighlights any previous room. +# +# Arguments: +# w - The canvas window displaying the floorplan. +# args - Not used. + +def roomChanged(w,*args) + w.delete('highlight') + item = $floorItems[$currentRoom.value] + return if item == nil + new = TkcPolygon.new(w, *(w.coords(item))) + new.configure('fill'=>$floor_colors['active'], 'tags'=>'highlight') + w.raise(new, 'marker') +end + +# floor_bg1 -- +# This method represents part of the floorplan database. When +# invoked, it instantiates the background information for the first +# floor. +# +# Arguments: +# w - The canvas window. +# fill - Fill color to use for the floor's background. +# outline - Color to use for the floor's outline. + +def floor_bg1(w,fill,outline) + TkcPolygon.new(w,347,80,349,82,351,84,353,85,363,92,375,99,386,104, + 386,129,398,129,398,162,484,162,484,129,559,129,559,133,725, + 133,725,129,802,129,802,389,644,389,644,391,559,391,559,327, + 508,327,508,311,484,311,484,278,395,278,395,288,400,288,404, + 288,409,290,413,292,418,297,421,302,422,309,421,318,417,325, + 411,330,405,332,397,333,344,333,340,334,336,336,335,338,332, + 342,331,347,332,351,334,354,336,357,341,359,340,360,335,363, + 331,365,326,366,304,366,304,355,258,355,258,387,60,387,60,391, + 0,391,0,337,3,337,3,114,8,114,8,25,30,25,30,5,93,5,98,5,104,7, + 110,10,116,16,119,20,122,28,123,32,123,68,220,68,220,34,221, + 22,223,17,227,13,231,8,236,4,242,2,246,0,260,0,283,1,300,5, + 321,14,335,22,348,25,365,29,363,39,358,48,352,56,337,70, + 344,76,347,80, 'tags'=>['floor1','bg'], 'fill'=>fill) + TkcLine.new(w,386,129,398,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,258,355,258,387, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,60,387,60,391, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,0,337,0,391, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,60,391,0,391, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,3,114,3,337, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,258,387,60,387, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,484,162,398,162, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,398,162,398,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,484,278,484,311, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,484,311,508,311, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,508,327,508,311, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,559,327,508,327, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,644,391,559,391, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,644,389,644,391, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,559,129,484,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,484,162,484,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,725,133,559,133, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,559,129,559,133, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,725,129,802,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,802,389,802,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,3,337,0,337, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,559,391,559,327, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,802,389,644,389, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,725,133,725,129, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,8,25,8,114, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,8,114,3,114, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,30,25,8,25, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,484,278,395,278, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,30,25,30,5, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,93,5,30,5, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,98,5,93,5, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,104,7,98,5, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,110,10,104,7, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,116,16,110,10, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,119,20,116,16, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,122,28,119,20, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,123,32,122,28, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,123,68,123,32, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,220,68,123,68, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,386,129,386,104, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,386,104,375,99, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,375,99,363,92, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,353,85,363,92, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,220,68,220,34, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,337,70,352,56, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,352,56,358,48, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,358,48,363,39, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,363,39,365,29, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,365,29,348,25, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,348,25,335,22, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,335,22,321,14, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,321,14,300,5, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,300,5,283,1, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,283,1,260,0, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,260,0,246,0, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,246,0,242,2, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,242,2,236,4, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,236,4,231,8, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,231,8,227,13, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,223,17,227,13, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,221,22,223,17, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,220,34,221,22, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,340,360,335,363, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,335,363,331,365, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,331,365,326,366, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,326,366,304,366, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,304,355,304,366, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,395,288,400,288, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,404,288,400,288, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,409,290,404,288, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,413,292,409,290, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,418,297,413,292, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,421,302,418,297, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,422,309,421,302, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,421,318,422,309, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,421,318,417,325, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,417,325,411,330, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,411,330,405,332, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,405,332,397,333, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,397,333,344,333, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,344,333,340,334, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,340,334,336,336, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,336,336,335,338, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,335,338,332,342, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,331,347,332,342, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,332,351,331,347, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,334,354,332,351, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,336,357,334,354, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,341,359,336,357, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,341,359,340,360, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,395,288,395,278, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,304,355,258,355, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,347,80,344,76, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,344,76,337,70, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,349,82,347,80, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,351,84,349,82, 'fill'=>outline, 'tags'=>['floor1','bg']) + TkcLine.new(w,353,85,351,84, 'fill'=>outline, 'tags'=>['floor1','bg']) +end + +# floor_bg2 -- +# This method represents part of the floorplan database. When +# invoked, it instantiates the background information for the first +# floor. +# +# Arguments: +# w - The canvas window. +# fill - Fill color to use for the floor's background. +# outline - Color to use for the floor's outline. + +def floor_bg2(w,fill,outline) + TkcPolygon.new(w,559,129,484,129,484,162,398,162,398,129,315,129, + 315,133,176,133,176,129,96,129,96,133,3,133,3,339,0,339,0,391, + 60,391,60,387,258,387,258,329,350,329,350,311,395,311,395,280, + 484,280,484,311,508,311,508,327,558,327,558,391,644,391,644, + 367,802,367,802,129,725,129,725,133,559,133,559,129, + 'tags'=>['floor2','bg'], 'fill'=>fill) + TkcLine.new(w,350,311,350,329, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,398,129,398,162, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,802,367,802,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,802,129,725,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,725,133,725,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,559,129,559,133, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,559,133,725,133, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,484,162,484,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,559,129,484,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,802,367,644,367, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,644,367,644,391, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,644,391,558,391, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,558,327,558,391, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,558,327,508,327, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,508,327,508,311, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,484,311,508,311, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,484,280,484,311, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,398,162,484,162, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,484,280,395,280, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,395,280,395,311, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,258,387,60,387, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,3,133,3,339, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,3,339,0,339, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,60,391,0,391, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,0,339,0,391, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,60,387,60,391, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,258,329,258,387, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,350,329,258,329, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,395,311,350,311, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,398,129,315,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,176,133,315,133, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,176,129,96,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,3,133,96,133, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,315,133,315,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,176,133,176,129, 'fill'=>outline, 'tags'=>['floor2','bg']) + TkcLine.new(w,96,133,96,129, 'fill'=>outline, 'tags'=>['floor2','bg']) +end + +# floor_bg3 -- +# This method represents part of the floorplan database. When +# invoked, it instantiates the background information for the first +# floor. +# +# Arguments: +# w - The canvas window. +# fill - Fill color to use for the floor's background. +# outline - Color to use for the floor's outline. + +def floor_bg3(w,fill,outline) + TkcPolygon.new(w,159,300,107,300,107,248,159,248,159,129,96,129,96, + 133,21,133,21,331,0,331,0,391,60,391,60,370,159,370,159,300, + 'tags'=>['floor3','bg'], 'fill'=>fill) + TkcPolygon.new(w,258,370,258,329,350,329,350,311,399,311,399,129, + 315,129,315,133,176,133,176,129,159,129,159,370,258,370, + 'tags'=>['floor3','bg'], 'fill'=>fill) + TkcLine.new(w,96,133,96,129, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,176,129,96,129, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,176,129,176,133, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,315,133,176,133, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,315,133,315,129, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,399,129,315,129, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,399,311,399,129, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,399,311,350,311, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,350,329,350,311, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,350,329,258,329, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,258,370,258,329, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,60,370,258,370, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,60,370,60,391, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,60,391,0,391, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,0,391,0,331, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,21,331,0,331, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,21,331,21,133, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,96,133,21,133, 'fill'=>outline, 'tags'=>['floor3','bg']) + TkcLine.new(w,107,300,159,300,159,248,107,248,107,300, + 'fill'=>outline, 'tags'=>['floor3','bg']) +end + +# floor_fg1 -- +# This method represents part of the floorplan database. When +# invoked, it instantiates the foreground information for the first +# floor (office outlines and numbers). +# +# Arguments: +# w - The canvas window. +# color - Color to use for drawing foreground information. + +def floor_fg1(w,color) + i = TkcPolygon.new(w,375,246,375,172,341,172,341,246, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '101' + $floorItems['101'] = i + TkcText.new(w,358,209, 'text'=>'101', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,307,240,339,240,339,206,307,206, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Pub Lift1' + $floorItems['Pub Lift1'] = i + TkcText.new(w,323,223, 'text'=>'Pub Lift1', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,339,205,307,205,307,171,339,171, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Priv Lift1' + $floorItems['Priv Lift1'] = i + TkcText.new(w,323,188, 'text'=>'Priv Lift1', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,42,389,42,337,1,337,1,389, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '110' + $floorItems['110'] = i + TkcText.new(w,21.5,363, 'text'=>'110', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,59,389,59,385,90,385,90,337,44,337,44,389, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '109' + $floorItems['109'] = i + TkcText.new(w,67,363, 'text'=>'109', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,51,300,51,253,6,253,6,300, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '111' + $floorItems['111'] = i + TkcText.new(w,28.5,276.5, 'text'=>'111', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,98,248,98,309,79,309,79,248, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '117B' + $floorItems['117B'] = i + TkcText.new(w,88.5,278.5, 'text'=>'117B', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,51,251,51,204,6,204,6,251, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '112' + $floorItems['112'] = i + TkcText.new(w,28.5,227.5, 'text'=>'112', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,6,156,51,156,51,203,6,203, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '113' + $floorItems['113'] = i + TkcText.new(w,28.5,179.5, 'text'=>'113', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,85,169,79,169,79,192,85,192, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '117A' + $floorItems['117A'] = i + TkcText.new(w,82,180.5, 'text'=>'117A', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,77,302,77,168,53,168,53,302, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '117' + $floorItems['117'] = i + TkcText.new(w,65,235, 'text'=>'117', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,51,155,51,115,6,115,6,155, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '114' + $floorItems['114'] = i + TkcText.new(w,28.5,135, 'text'=>'114', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,95,115,53,115,53,168,95,168, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '115' + $floorItems['115'] = i + TkcText.new(w,74,141.5, 'text'=>'115', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,87,113,87,27,10,27,10,113, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '116' + $floorItems['116'] = i + TkcText.new(w,48.5,70, 'text'=>'116', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,89,91,128,91,128,113,89,131, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '118' + $floorItems['118'] = i + TkcText.new(w,108.5,102, 'text'=>'118', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,178,128,178,132,216,132,216,91, + 163,91,163,112,149,112,149,128, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '120' + $floorItems['120'] = i + TkcText.new(w,189.5,111.5, 'text'=>'120', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,79,193,87,193,87,169,136,169,136,192, + 156,192,156,169,175,169,175,246,79,246, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '122' + $floorItems['122'] = i + TkcText.new(w,131,207.5, 'text'=>'122', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,138,169,154,169,154,191,138,191, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '121' + $floorItems['121'] = i + TkcText.new(w,146,180, 'text'=>'121', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,99,300,126,300,126,309,99,309, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '106A' + $floorItems['106A'] = i + TkcText.new(w,112.5,304.5, 'text'=>'106A', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,128,299,128,309,150,309,150,248,99,248,99,299, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '105' + $floorItems['105'] = i + TkcText.new(w,124.5,278.5, 'text'=>'105', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,174,309,174,300,152,300,152,309, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '106B' + $floorItems['106B'] = i + TkcText.new(w,163,304.5, 'text'=>'106B', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,176,299,176,309,216,309,216,248,152,248,152,299, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '104' + $floorItems['104'] = i + TkcText.new(w,184,278.5, 'text'=>'104', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,138,385,138,337,91,337,91,385, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '108' + $floorItems['108'] = i + TkcText.new(w,114.5,361, 'text'=>'108', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,256,337,140,337,140,385,256,385, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '107' + $floorItems['107'] = i + TkcText.new(w,198,361, 'text'=>'107', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,300,353,300,329,260,329,260,353, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Smoking' + $floorItems['Smoking'] = i + TkcText.new(w,280,341, 'text'=>'Smoking', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,314,135,314,170,306,170,306,246,177,246,177,135, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '123' + $floorItems['123'] = i + TkcText.new(w,245.5,190.5, 'text'=>'123', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,217,248,301,248,301,326,257,326,257,310,217,310, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '103' + $floorItems['103'] = i + TkcText.new(w,259,287, 'text'=>'103', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,396,188,377,188,377,169,316,169,316,131,396,131, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '124' + $floorItems['124'] = i + TkcText.new(w,356,150, 'text'=>'124', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,397,226,407,226,407,189,377,189,377,246,397,246, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '125' + $floorItems['125'] = i + TkcText.new(w,392,217.5, 'text'=>'125', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,399,187,409,187,409,207,474,207,474,164,399,164, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '126' + $floorItems['126'] = i + TkcText.new(w,436.5,185.5, 'text'=>'126', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,409,209,409,229,399,229,399,253, + 486,253,486,239,474,239,474,209, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '127' + $floorItems['127'] = i + TkcText.new(w,436.5,'231', 'text'=>'127', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,501,164,501,174,495,174,495,188, + 490,188,490,204,476,204,476,164, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'MShower' + $floorItems['MShower'] = i + TkcText.new(w,488.5,'184', 'text'=>'MShower', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,497,176,513,176,513,204,492,204,492,190,497,190, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Closet' + $floorItems['Closet'] = i + TkcText.new(w,502.5,190, 'text'=>'Closet', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,476,237,476,206,513,206,513,254,488,254,488,237, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'WShower' + $floorItems['WShower'] = i + TkcText.new(w,494.5,230, 'text'=>'WShower', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,486,131,558,131,558,135,724,135,724,166, + 697,166,697,275,553,275,531,254,515,254, + 515,174,503,174,503,161,486,161, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '130' + $floorItems['130'] = i + TkcText.new(w,638.5,205, 'text'=>'130', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,308,242,339,242,339,248,342,248, + 342,246,397,246,397,276,393,276, + 393,309,300,309,300,248,308,248, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '102' + $floorItems['102'] = i + TkcText.new(w,367.5,278.5, 'text'=>'102', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,397,255,486,255,486,276,397,276, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '128' + $floorItems['128'] = i + TkcText.new(w,441.5,265.5, 'text'=>'128', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,510,309,486,309,486,255,530,255, + 552,277,561,277,561,325,510,325, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '129' + $floorItems['129'] = i + TkcText.new(w,535.5,293, 'text'=>'129', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,696,281,740,281,740,387,642,387, + 642,389,561,389,561,277,696,277, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '133' + $floorItems['133'] = i + TkcText.new(w,628.5,335, 'text'=>'133', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,742,387,742,281,800,281,800,387, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '132' + $floorItems['132'] = i + TkcText.new(w,771,334, 'text'=>'132', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,800,168,800,280,699,280,699,168, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '134' + $floorItems['134'] = i + TkcText.new(w,749.5,224, 'text'=>'134', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,726,131,726,166,800,166,800,131, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '135' + $floorItems['135'] = i + TkcText.new(w,763,148.5, 'text'=>'135', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,340,360,335,363,331,365,326,366,304,366, + 304,312,396,312,396,288,400,288,404,288, + 409,290,413,292,418,297,421,302,422,309, + 421,318,417,325,411,330,405,332,397,333, + 344,333,340,334,336,336,335,338,332,342, + 331,347,332,351,334,354,336,357,341,359, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Ramona Stair' + $floorItems['Ramona Stair'] = i + TkcText.new(w,368,323, 'text'=>'Ramona Stair', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,30,23,30,5,93,5,98,5,104,7,110,10,116,16,119,20, + 122,28,123,32,123,68,220,68,220,87,90,87,90,23, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'University Stair' + $floorItems['University Stair'] = i + TkcText.new(w,155,77.5, 'text'=>'University Stair', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,282,37,295,40,312,49,323,56,337,70,352,56, + 358,48,363,39,365,29,348,25,335,22,321,14, + 300,5,283,1,260,0,246,0,242,2,236,4,231,8, + 227,13,223,17,221,22,220,34,260,34, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Plaza Stair' + $floorItems['Plaza Stair'] = i + TkcText.new(w,317.5,28.5, 'text'=>'Plaza Stair', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,220,34,260,34,282,37,295,40,312,49, + 323,56,337,70,350,83,365,94,377,100, + 386,104,386,128,220,128, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = 'Plaza Deck' + $floorItems['Plaza Deck'] = i + TkcText.new(w,303,81, 'text'=>'Plaza Deck', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,257,336,77,336,6,336,6,301,77,301,77,310,257,310, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '106' + $floorItems['106'] = i + TkcText.new(w,131.5,318.5, 'text'=>'106', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + i = TkcPolygon.new(w,146,110,162,110,162,91,130,91,130,115,95,115, + 95,128,114,128,114,151,157,151,157,153,112,153, + 112,130,97,130,97,168,175,168,175,131,146,131, + 'fill'=>'', 'tags'=>['floor1','room']) + $floorLabels[i.id] = '119' + $floorItems['119'] = i + TkcText.new(w,143.5,133, 'text'=>'119', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor1','label']) + TkcLine.new(w,155,191,155,189, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,155,177,155,169, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,96,129,96,169, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,78,169,176,169, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,176,247,176,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,340,206,307,206, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,340,187,340,170, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,340,210,340,201, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,340,247,340,224, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,340,241,307,241, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,376,246,376,170, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,307,247,307,170, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,376,170,307,170, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,315,129,315,170, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,147,129,176,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,202,133,176,133, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,398,129,315,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,258,352,258,387, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,60,387,60,391, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,0,337,0,391, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,60,391,0,391, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,3,114,3,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,258,387,60,387, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,237,52,273, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,189,52,225, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,140,52,177, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,395,306,395,311, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,531,254,398,254, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,475,178,475,238, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,502,162,398,162, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,398,129,398,188, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,383,188,376,188, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,408,188,408,194, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,398,227,398,254, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,408,227,398,227, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,408,222,408,227, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,408,206,408,210, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,408,208,475,208, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,484,278,484,311, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,484,311,508,311, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,508,327,508,311, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,559,327,508,327, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,644,391,559,391, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,644,389,644,391, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,514,205,475,205, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,496,189,496,187, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,559,129,484,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,484,162,484,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,725,133,559,133, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,559,129,559,133, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,725,149,725,167, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,725,129,802,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,802,389,802,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,739,167,802,167, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,396,188,408,188, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,0,337,9,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,58,337,21,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,43,391,43,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,105,337,75,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,91,387,91,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,154,337,117,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,139,387,139,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,227,337,166,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,258,337,251,337, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,258,328,302,328, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,302,355,302,311, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,395,311,302,311, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,484,278,395,278, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,395,294,395,278, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,473,278,473,275, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,473,256,473,254, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,533,257,531,254, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,553,276,551,274, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,698,276,553,276, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,559,391,559,327, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,802,389,644,389, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,741,314,741,389, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,698,280,698,167, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,707,280,698,280, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,802,280,731,280, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,741,280,741,302, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,698,167,727,167, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,725,137,725,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,514,254,514,175, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,496,175,514,175, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,502,175,502,162, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,475,166,475,162, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,496,176,496,175, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,491,189,496,189, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,491,205,491,189, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,487,238,475,238, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,487,240,487,238, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,487,252,487,254, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,315,133,304,133, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,256,133,280,133, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,78,247,270,247, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,307,247,294,247, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,214,133,232,133, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,217,247,217,266, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,217,309,217,291, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,217,309,172,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,154,309,148,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,175,300,175,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,151,300,175,300, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,151,247,151,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,78,237,78,265, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,78,286,78,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,106,309,78,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,130,309,125,309, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,99,309,99,247, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,127,299,99,299, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,127,309,127,299, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,155,191,137,191, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,137,169,137,191, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,78,171,78,169, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,78,190,78,218, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,86,192,86,169, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,86,192,78,192, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,301,3,301, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,286,52,301, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,252,3,252, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,203,3,203, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,3,156,52,156, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,8,25,8,114, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,63,114,3,114, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,75,114,97,114, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,108,114,129,114, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,129,114,129,89, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,52,114,52,128, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,132,89,88,89, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,88,25,88,89, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,88,114,88,89, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,218,89,144,89, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,147,111,147,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,162,111,147,111, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,162,109,162,111, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,162,96,162,89, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,218,89,218,94, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,218,89,218,119, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,8,25,88,25, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,258,337,258,328, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,113,129,96,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,302,355,258,355, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,386,104,386,129, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,377,100,386,104, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,365,94,377,100, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,350,83,365,94, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,337,70,350,83, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,337,70,323,56, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,312,49,323,56, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,295,40,312,49, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,282,37,295,40, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,260,34,282,37, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,253,34,260,34, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,386,128,386,104, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,113,152,156,152, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,113,152,156,152, 'fill'=>color, 'tags'=>['floor1','wall']) + TkcLine.new(w,113,152,113,129, 'fill'=>color, 'tags'=>['floor1','wall']) +end + +# floor_fg2 -- +# This method represents part of the floorplan database. When +# invoked, it instantiates the foreground information for the second +# floor (office outlines and numbers). +# +# Arguments: +# w - The canvas window. +# color - Color to use for drawing foreground information. + +def floor_fg2(w,color) + i = TkcPolygon.new(w,748,188,755,188,755,205,758,205,758,222, + 800,222,800,168,748,168, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '238' + $floorItems['238'] = i + TkcText.new(w,774,195, 'text'=>'238', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,726,188,746,188,746,166,800,166,800,131,726,131, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '237' + $floorItems['237'] = i + TkcText.new(w,763,148.5, 'text'=>'237', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,497,187,497,204,559,204,559,324,641,324, + 643,324,643,291,641,291,641,205,696,205, + 696,291,694,291,694,314,715,314,715,291, + 715,205,755,205,755,190,724,190,724,187, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '246' + $floorItems['246'] = i + TkcText.new(w,600,264, 'text'=>'246', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,694,279,643,279,643,314,694,314, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '247' + $floorItems['247'] = i + TkcText.new(w,668.5,296.5, 'text'=>'247', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,232,250,308,250,308,242,339,242,339,246, + 397,246,397,255,476,255,476,250,482,250,559,250, + 559,274,482,274,482,278,396,278,396,274,232,274, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '202' + $floorItems['202'] = i + TkcText.new(w,285.5,260, 'text'=>'202', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,53,228,53,338,176,338,233,338,233,196, + 306,196,306,180,175,180,175,169,156,169, + 156,196,176,196,176,228, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '206' + $floorItems['206'] = i + TkcText.new(w,143,267, 'text'=>'206', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,51,277,6,277,6,338,51,338, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '212' + $floorItems['212'] = i + TkcText.new(w,28.5,307.5, 'text'=>'212', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,557,276,486,276,486,309,510,309,510,325,557,325, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '245' + $floorItems['245'] = i + TkcText.new(w,521.5,300.5, 'text'=>'245', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,560,389,599,389,599,326,560,326, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '244' + $floorItems['244'] = i + TkcText.new(w,579.5,357.5, 'text'=>'244', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,601,389,601,326,643,326,643,389, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '243' + $floorItems['243'] = i + TkcText.new(w,622,357.5, 'text'=>'243', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,688,316,645,316,645,365,688,365, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '242' + $floorItems['242'] = i + TkcText.new(w,666.5,340.5, 'text'=>'242', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,802,367,759,367,759,226,802,226, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = 'Barbecue Deck' + $floorItems['Barbecue Deck'] = i + TkcText.new(w,780.5,296.5, 'text'=>'Barbecue Deck', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,755,262,755,314,717,314,717,262, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '240' + $floorItems['240'] = i + TkcText.new(w,736,288, 'text'=>'240', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,755,316,689,316,689,365,755,365, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '241' + $floorItems['241'] = i + TkcText.new(w,722,340.5, 'text'=>'241', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,755,206,717,206,717,261,755,261, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '239' + $floorItems['239'] = i + TkcText.new(w,736,233.5, 'text'=>'239', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,695,277,643,277,643,206,695,206, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '248' + $floorItems['248'] = i + TkcText.new(w,669,241.5, 'text'=>'248', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,676,135,676,185,724,185,724,135, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '236' + $floorItems['236'] = i + TkcText.new(w,700,160, 'text'=>'236', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,675,135,635,135,635,145,628,145,628,185,675,185, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '235' + $floorItems['235'] = i + TkcText.new(w,651.5,160, 'text'=>'235', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,626,143,633,143,633,135,572,135, + 572,143,579,143,579,185,626,185, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '234' + $floorItems['234'] = i + TkcText.new(w,606,160, 'text'=>'234', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,557,135,571,135,571,145,578,145, + 578,185,527,185,527,131,557,131, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '233' + $floorItems['233'] = i + TkcText.new(w,552.5,158, 'text'=>'233', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,476,249,557,249,557,205,476,205, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '230' + $floorItems['230'] = i + TkcText.new(w,516.5,227, 'text'=>'230', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,476,164,486,164,486,131,525,131,525,185,476,185, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '232' + $floorItems['232'] = i + TkcText.new(w,500.5,158, 'text'=>'232', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,476,186,495,186,495,204,476,204, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '229' + $floorItems['229'] = i + TkcText.new(w,485.5,195, 'text'=>'229', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,474,207,409,207,409,187,399,187,399,164,474,164, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '227' + $floorItems['227'] = i + TkcText.new(w,436.5,185.5, 'text'=>'227', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,399,228,399,253,474,253,474,209,409,209,409,228, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '228' + $floorItems['228'] = i + TkcText.new(w,436.5,231, 'text'=>'228', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,397,246,397,226,407,226,407,189,377,189,377,246, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '226' + $floorItems['226'] = i + TkcText.new(w,392,217.5, 'text'=>'226', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,377,169,316,169,316,131,397,131,397,188,377,188, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '225' + $floorItems['225'] = i + TkcText.new(w,356.5,150, 'text'=>'225', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,234,198,306,198,306,249,234,249, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '224' + $floorItems['224'] = i + TkcText.new(w,270,223.5, 'text'=>'224', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,270,179,306,179,306,170,314,170,314,135,270,135, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '223' + $floorItems['223'] = i + TkcText.new(w,292,157, 'text'=>'223', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,268,179,221,179,221,135,268,135, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '222' + $floorItems['222'] = i + TkcText.new(w,244.5,157, 'text'=>'222', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,177,179,219,179,219,135,177,135, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '221' + $floorItems['221'] = i + TkcText.new(w,198,157, 'text'=>'221', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,299,327,349,327,349,284,341,284,341,276,299,276, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '204' + $floorItems['204'] = i + TkcText.new(w,324,301.5, 'text'=>'204', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,234,276,297,276,297,327,257,327,257,338,234,338, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '205' + $floorItems['205'] = i + TkcText.new(w,265.5,307, 'text'=>'205', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,256,385,256,340,212,340,212,385, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '207' + $floorItems['207'] = i + TkcText.new(w,234,362.5, 'text'=>'207', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,210,340,164,340,164,385,210,385, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '208' + $floorItems['208'] = i + TkcText.new(w,187,362.5, 'text'=>'208', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,115,340,162,340,162,385,115,385, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '209' + $floorItems['209'] = i + TkcText.new(w,138.5,362.5, 'text'=>'209', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,89,228,89,156,53,156,53,228, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '217' + $floorItems['217'] = i + TkcText.new(w,71,192, 'text'=>'217', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,89,169,97,169,97,190,89,190, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '217A' + $floorItems['217A'] = i + TkcText.new(w,93,179.5, 'text'=>'217A', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,89,156,89,168,95,168,95,135,53,135,53,156, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '216' + $floorItems['216'] = i + TkcText.new(w,71,145.5, 'text'=>'216', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,51,179,51,135,6,135,6,179, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '215' + $floorItems['215'] = i + TkcText.new(w,28.5,157, 'text'=>'215', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,51,227,6,227,6,180,51,180, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '214' + $floorItems['214'] = i + TkcText.new(w,28.5,203.5, 'text'=>'214', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,51,275,6,275,6,229,51,229, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '213' + $floorItems['213'] = i + TkcText.new(w,28.5,252, 'text'=>'213', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,114,340,67,340,67,385,114,385, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '210' + $floorItems['210'] = i + TkcText.new(w,90.5,362.5, 'text'=>'210', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,59,389,59,385,65,385,65,340,1,340,1,389, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '211' + $floorItems['211'] = i + TkcText.new(w,33,364.5, 'text'=>'211', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,393,309,350,309,350,282,342,282,342,276,393,276, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '203' + $floorItems['203'] = i + TkcText.new(w,367.5,292.5, 'text'=>'203', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,99,191,91,191,91,226,174,226,174,198, + 154,198,154,192,109,192,109,169,99,169, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '220' + $floorItems['220'] = i + TkcText.new(w,132.5,208.5, 'text'=>'220', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,339,205,307,205,307,171,339,171, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = 'Priv Lift2' + $floorItems['Priv Lift2'] = i + TkcText.new(w,323,188, 'text'=>'Priv Lift2', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,307,240,339,240,339,206,307,206, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = 'Pub Lift 2' + $floorItems['Pub Lift 2'] = i + TkcText.new(w,323,223, 'text'=>'Pub Lift 2', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,175,168,97,168,97,131,175,131, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '218' + $floorItems['218'] = i + TkcText.new(w,136,149.5, 'text'=>'218', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,154,191,111,191,111,169,154,169, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '219' + $floorItems['219'] = i + TkcText.new(w,132.5,180, 'text'=>'219', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + i = TkcPolygon.new(w,375,246,375,172,341,172,341,246, + 'fill'=>'', 'tags'=>['floor2','room']) + $floorLabels[i.id] = '201' + $floorItems['201'] = i + TkcText.new(w,358,209, 'text'=>'201', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor2','label']) + TkcLine.new(w,641,186,678,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,350,757,367, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,634,133,634,144, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,634,144,627,144, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,572,133,572,144, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,572,144,579,144, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,398,129,398,162, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,174,197,175,197, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,175,197,175,227, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,206,757,221, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,396,188,408,188, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,727,189,725,189, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,747,167,802,167, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,747,167,747,189, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,755,189,739,189, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,769,224,757,224, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,802,224,802,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,802,129,725,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,725,189,725,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,725,186,690,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,676,133,676,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,627,144,627,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,629,186,593,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,579,144,579,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,559,129,559,133, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,725,133,559,133, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,484,162,484,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,559,129,484,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,526,129,526,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,540,186,581,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,528,186,523,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,511,186,475,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,496,190,496,186, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,496,205,496,202, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,475,205,527,205, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,205,539,205, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,205,558,249, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,249,475,249, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,662,206,642,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,695,206,675,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,695,278,642,278, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,642,291,642,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,695,291,695,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,716,208,716,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,206,716,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,221,757,224, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,793,224,802,224, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,262,716,262, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,716,220,716,264, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,716,315,716,276, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,315,703,315, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,325,757,224, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,757,367,644,367, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,689,367,689,315, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,647,315,644,315, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,659,315,691,315, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,600,325,600,391, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,627,325,644,325, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,644,391,644,315, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,615,325,575,325, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,644,391,558,391, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,563,325,558,325, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,391,558,314, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,327,508,327, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,275,484,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,558,302,558,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,508,327,508,311, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,484,311,508,311, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,484,275,484,311, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,475,208,408,208, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,408,206,408,210, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,408,222,408,227, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,408,227,398,227, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,398,227,398,254, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,408,188,408,194, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,383,188,376,188, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,398,188,398,162, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,398,162,484,162, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,475,162,475,254, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,398,254,475,254, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,484,280,395,280, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,395,311,395,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,307,197,293,197, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,278,197,233,197, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,233,197,233,249, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,307,179,284,179, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,233,249,278,249, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,269,179,269,133, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,220,179,220,133, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,155,191,110,191, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,90,190,98,190, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,98,169,98,190, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,133,52,165, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,214,52,177, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,226,52,262, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,274,52,276, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,234,275,234,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,226,339,258,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,211,387,211,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,214,339,177,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,258,387,60,387, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,3,133,3,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,165,339,129,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,117,339,80,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,68,339,59,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,0,339,46,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,60,391,0,391, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,0,339,0,391, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,60,387,60,391, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,258,329,258,387, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,350,329,258,329, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,395,311,350,311, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,398,129,315,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,176,133,315,133, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,176,129,96,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,3,133,96,133, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,66,387,66,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,115,387,115,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,163,387,163,339, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,234,275,276,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,288,275,309,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,298,275,298,329, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,341,283,350,283, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,321,275,341,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,375,275,395,275, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,315,129,315,170, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,376,170,307,170, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,307,250,307,170, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,376,245,376,170, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,340,241,307,241, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,340,245,340,224, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,340,210,340,201, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,340,187,340,170, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,340,206,307,206, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,293,250,307,250, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,271,179,238,179, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,226,179,195,179, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,176,129,176,179, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,182,179,176,179, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,174,169,176,169, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,162,169,90,169, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,96,169,96,129, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,175,227,90,227, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,90,190,90,227, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,179,3,179, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,228,3,228, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,52,276,3,276, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,155,177,155,169, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,110,191,110,169, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,155,189,155,197, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,350,283,350,329, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,162,197,155,197, 'fill'=>color, 'tags'=>['floor2','wall']) + TkcLine.new(w,341,275,341,283, 'fill'=>color, 'tags'=>['floor2','wall']) +end + +# floor_fg3 -- +# This method represents part of the floorplan database. When +# invoked, it instantiates the foreground information for the third +# floor (office outlines and numbers). +# +# Arguments: +# w - The canvas window. +# color - Color to use for drawing foreground information. + +def floor_fg3(w,color) + i = TkcPolygon.new(w,89,228,89,180,70,180,70,228, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '316' + $floorItems['316'] = i + TkcText.new(w,79.5,204, 'text'=>'316', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,115,368,162,368,162,323,115,323, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '309' + $floorItems['309'] = i + TkcText.new(w,138.5,345.5, 'text'=>'309', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,164,323,164,368,211,368,211,323, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '308' + $floorItems['308'] = i + TkcText.new(w,187.5,345.5, 'text'=>'308', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,256,368,212,368,212,323,256,323, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '307' + $floorItems['307'] = i + TkcText.new(w,234,345.5, 'text'=>'307', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,244,276,297,276,297,327,260,327,260,321,244,321, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '305' + $floorItems['305'] = i + TkcText.new(w,270.5,301.5, 'text'=>'305', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,251,219,251,203,244,203,244,219, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '324B' + $floorItems['324B'] = i + TkcText.new(w,247.5,211, 'text'=>'324B', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,251,249,244,249,244,232,251,232, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '324A' + $floorItems['324A'] = i + TkcText.new(w,247.5,240.5, 'text'=>'324A', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,223,135,223,179,177,179,177,135, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '320' + $floorItems['320'] = i + TkcText.new(w,200,157, 'text'=>'320', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,114,368,114,323,67,323,67,368, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '310' + $floorItems['310'] = i + TkcText.new(w,90.5,345.5, 'text'=>'310', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,23,277,23,321,68,321,68,277, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '312' + $floorItems['312'] = i + TkcText.new(w,45.5,299, 'text'=>'312', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,23,229,68,229,68,275,23,275, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '313' + $floorItems['313'] = i + TkcText.new(w,45.5,252, 'text'=>'313', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,68,227,23,227,23,180,68,180, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '314' + $floorItems['314'] = i + TkcText.new(w,40.5,203.5, 'text'=>'314', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,95,179,95,135,23,135,23,179, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '315' + $floorItems['315'] = i + TkcText.new(w,59,157, 'text'=>'315', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,99,226,99,204,91,204,91,226, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '316B' + $floorItems['316B'] = i + TkcText.new(w,95,215, 'text'=>'316B', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,91,202,99,202,99,180,91,180, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '316A' + $floorItems['316A'] = i + TkcText.new(w,95,191, 'text'=>'316A', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,97,169,109,169,109,192,154,192,154,198, + 174,198,174,226,101,226,101,179,97,179, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '319' + $floorItems['319'] = i + TkcText.new(w,141.5,209, 'text'=>'319', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,65,368,58,368,58,389,1,389,1,333,23,333,23,323,65,323, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '311' + $floorItems['311'] = i + TkcText.new(w,29.5,361, 'text'=>'311', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,154,191,111,191,111,169,154,169, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '318' + $floorItems['318'] = i + TkcText.new(w,132.5,180, 'text'=>'318', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,175,168,97,168,97,131,175,131, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '317' + $floorItems['317'] = i + TkcText.new(w,136,149.5, 'text'=>'317', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,274,194,274,221,306,221,306,194, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '323' + $floorItems['323'] = i + TkcText.new(w,290,207.5, 'text'=>'323', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,306,222,274,222,274,249,306,249, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '325' + $floorItems['325'] = i + TkcText.new(w,290,235.5, 'text'=>'325', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,263,179,224,179,224,135,263,135, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '321' + $floorItems['321'] = i + TkcText.new(w,243.5,157, 'text'=>'321', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,314,169,306,169,306,192,273,192, + 264,181,264,135,314,135, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '322' + $floorItems['322'] = i + TkcText.new(w,293.5,163.5, 'text'=>'322', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,307,240,339,240,339,206,307,206, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = 'Pub Lift3' + $floorItems['Pub Lift3'] = i + TkcText.new(w,323,223, 'text'=>'Pub Lift3', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,339,205,307,205,307,171,339,171, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = 'Priv Lift3' + $floorItems['Priv Lift3'] = i + TkcText.new(w,323,188, 'text'=>'Priv Lift3', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,350,284,376,284,376,276,397,276,397,309,350,309, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '303' + $floorItems['303'] = i + TkcText.new(w,373.5,292.5, 'text'=>'303', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,272,203,272,249,252,249,252,230, + 244,230,244,221,252,221,252,203, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '324' + $floorItems['324'] = i + TkcText.new(w,262,226, 'text'=>'324', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,299,276,299,327,349,327,349,284,341,284,341,276, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '304' + $floorItems['304'] = i + TkcText.new(w,324,301.5, 'text'=>'304', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,375,246,375,172,341,172,341,246, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '301' + $floorItems['301'] = i + TkcText.new(w,358,209, 'text'=>'301', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,397,246,377,246,377,185,397,185, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '327' + $floorItems['327'] = i + TkcText.new(w,387,215.5, 'text'=>'327', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,316,131,316,169,377,169,377,185,397,185,397,131, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '326' + $floorItems['326'] = i + TkcText.new(w,365.5,150, 'text'=>'326', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,308,251,242,251,242,274,342,274,342,282,375, 282, + 375,274,397,274,397,248,339,248,339,242,308,242, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '302' + $floorItems['302'] = i + TkcText.new(w,319.5,261, 'text'=>'302', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + i = TkcPolygon.new(w,70,321,242,321,242,200,259,200,259,203,272,203, + 272,193,263,180,242,180,175,180,175,169,156,169, + 156,196,177,196,177,228,107,228,70,228,70,275,107,275, + 107,248,160,248,160,301,107,301,107,275,70,275, + 'fill'=>'', 'tags'=>['floor3','room']) + $floorLabels[i.id] = '306' + $floorItems['306'] = i + TkcText.new(w,200.5,284.5, 'text'=>'306', 'fill'=>color, + 'anchor'=>'c', 'tags'=>['floor3','label']) + TkcLine.new(w,341,275,341,283, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,162,197,155,197, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,396,247,399,247, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,399,129,399,311, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,258,202,243,202, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,350,283,350,329, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,251,231,243,231, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,243,220,251,220, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,243,250,243,202, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,155,197,155,190, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,110,192,110,169, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,155,192,110,192, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,155,177,155,169, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,176,197,176,227, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,69,280,69,274, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,21,276,69,276, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,69,262,69,226, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,21,228,69,228, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,21,179,75,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,69,179,69,214, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,90,220,90,227, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,90,204,90,202, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,90,203,100,203, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,90,187,90,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,90,227,176,227, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,100,179,100,227, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,100,179,87,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,96,179,96,129, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,162,169,96,169, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,173,169,176,169, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,182,179,176,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,176,129,176,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,195,179,226,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,224,133,224,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,264,179,264,133, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,238,179,264,179, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,207,273,193, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,235,273,250, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,224,273,219, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,193,307,193, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,222,307,222, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,250,307,250, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,384,247,376,247, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,340,206,307,206, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,340,187,340,170, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,340,210,340,201, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,340,247,340,224, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,340,241,307,241, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,376,247,376,170, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,307,250,307,170, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,376,170,307,170, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,315,129,315,170, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,376,283,366,283, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,376,283,376,275, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,399,275,376,275, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,341,275,320,275, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,341,283,350,283, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,298,275,298,329, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,308,275,298,275, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,243,322,243,275, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,243,275,284,275, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,258,322,226,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,212,370,212,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,214,322,177,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,163,370,163,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,165,322,129,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,84,322,117,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,71,322,64,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,115,322,115,370, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,66,322,66,370, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,52,322,21,322, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,21,331,0,331, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,21,331,21,133, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,96,133,21,133, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,176,129,96,129, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,315,133,176,133, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,315,129,399,129, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,399,311,350,311, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,350,329,258,329, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,258,322,258,370, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,60,370,258,370, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,60,370,60,391, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,0,391,0,331, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,60,391,0,391, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,307,250,307,242, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,273,250,307,250, 'fill'=>color, 'tags'=>['floor3','wall']) + TkcLine.new(w,258,250,243,250, 'fill'=>color, 'tags'=>['floor3','wall']) +end + +# Below is the "main program" that creates the floorplan demonstration. + +# toplevel widget が存在すれば削除する +if defined?($floor_demo) && $floor_demo + $floor_demo.destroy + $floor_demo = nil +end + +# demo 用の toplevel widget を生成 +$floor_demo = TkToplevel.new {|w| + title("Floorplan Canvas Demonstration") + iconname("Floorplan") + positionWindow(w) + geometry('+20+20') + minsize(100,100) +} + +# label 生成 +TkLabel.new($floor_demo, 'font'=>$font, 'wraplength'=>'8i', 'justify'=>'left', + 'text'=>"このウィンドウにはディジタルエクイップメント社のウェスタンリサーチラボラトリ (DECWRL) の間取りが書かれたキャンバス widget が入っています。これは 3階建てで、常にそのうちの1階分が選択、つまりその間取りが表示されるようになっています。ある階を選択するには、その上でマウスの左ボタンをクリックしてください。マウスが選択されている階の上を動くと、その下にある部屋の色が変わり、部屋番号が「部屋番号:」エントリに表示されます。また、エントリに部屋番号を書くとその部屋の色が変わります。"){ + pack('side'=>'top') +} + +# frame 生成 +$floor_buttons = TkFrame.new($floor_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $floor_demo + $floor_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'floor'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$floor_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# 変数設定 +$floorLabels = {} +$floorItems = {} + +# canvas 設定 +if $tk_version =~ /^4\.[01]/ + $floor_canvas_frame = TkFrame.new($floor_demo,'bd'=>2,'relief'=>'sunken', + 'highlightthickness'=>2) + $floor_canvas = TkCanvas.new($floor_canvas_frame, + 'width'=>900, 'height'=>500, 'borderwidth'=>0, + 'highlightthickness'=>0) {|c| + TkScrollbar.new($floor_demo, 'orient'=>'horiz', + 'command'=>proc{|*args| c.xview(*args)}){|hs| + c.xscrollcommand(proc{|first,last| hs.set first,last}) + pack('side'=>'bottom', 'fill'=>'x') + } + TkScrollbar.new($floor_demo, 'command'=>proc{|*args| c.yview(*args)}){|vs| + c.yscrollcommand(proc{|first,last| vs.set first,last}) + pack('side'=>'right', 'fill'=>'y') + } + } + $floor_canvas_frame.pack('side'=>'top','fill'=>'both', 'expand'=>'yes') + $floor_canvas.pack('expand'=>'yes', 'fill'=>'both') + +else + TkFrame.new($floor_demo) {|f| + pack('side'=>'top', 'fill'=>'both', 'expand'=>'yes') + + h = TkScrollbar.new(f, 'highlightthickness'=>0, 'orient'=>'horizontal') + v = TkScrollbar.new(f, 'highlightthickness'=>0, 'orient'=>'vertical') + + TkFrame.new(f, 'bd'=>2, 'relief'=>'sunken') {|f1| + $floor_canvas = TkCanvas.new(f1, 'width'=>900, 'height'=>500, + 'borderwidth'=>0, + 'highlightthickness'=>0) { + xscrollcommand(proc{|first,last| h.set first,last}) + yscrollcommand(proc{|first,last| v.set first,last}) + pack('expand'=>'yes', 'fill'=>'both') + } + grid('padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + } + + v.grid('padx'=>1, 'pady'=>1, 'row'=>0, 'column'=>1, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + h.grid('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) + + pack('expand'=>'yes', 'fill'=>'both', 'padx'=>1, 'pady'=>1) + + v.command(proc{|*args| c.yview(*args)}) + h.command(proc{|*args| c.xview(*args)}) + } +end + + +# Create an entry for displaying and typing in current room. + +$currentRoom = TkVariable.new +$floor_entry = TkEntry.new($floor_canvas, 'width'=>10, 'relief'=>'sunken', + 'bd'=>2, 'textvariable'=>$currentRoom) + +# Choose colors, then fill in the floorplan. + +$floor_colors = {} +if TkWinfo.depth($floor_canvas) > 1 + $floor_colors['bg1'] = '#a9c1da' + $floor_colors['outline1'] = '#77889a' + $floor_colors['bg2'] = '#9ab0c6' + $floor_colors['outline2'] = '#687786' + $floor_colors['bg3'] = '#8ba0b3' + $floor_colors['outline3'] = '#596673' + $floor_colors['offices'] = 'Black' + $floor_colors['active'] = '#c4d1df' +else + $floor_colors['bg1'] = 'white' + $floor_colors['outline1'] = 'black' + $floor_colors['bg2'] = 'white' + $floor_colors['outline2'] = 'black' + $floor_colors['bg3'] = 'white' + $floor_colors['outline3'] = 'black' + $floor_colors['offices'] = 'Black' + $floor_colors['active'] = 'black' +end + +$activeFloor = '' +floorDisplay $floor_canvas,3 + +# Set up event bindings for canvas: + +$floor_canvas.itembind('floor1', '1', proc{floorDisplay $floor_canvas,1}) +$floor_canvas.itembind('floor2', '1', proc{floorDisplay $floor_canvas,2}) +$floor_canvas.itembind('floor3', '1', proc{floorDisplay $floor_canvas,3}) +$floor_canvas.itembind('room', 'Enter', proc{newRoom $floor_canvas}) +$floor_canvas.itembind('room', 'Leave', proc{$currentRoom.value = ''}) +$floor_canvas.bind('2', proc{|x,y| $floor_canvas.scan_mark x,y}, '%x %y') +$floor_canvas.bind('B2-Motion', + proc{|x,y| $floor_canvas.scan_dragto x,y}, '%x %y') +$floor_canvas.bind('Destroy', proc{$currentRoom.unset}) +$currentRoom.value = '' +$currentRoom.trace('w',proc{roomChanged $floor_canvas}) + diff --git a/ext/tk/sample/demos-jp/form.rb b/ext/tk/sample/demos-jp/form.rb new file mode 100644 index 0000000000..35baeed46b --- /dev/null +++ b/ext/tk/sample/demos-jp/form.rb @@ -0,0 +1,62 @@ +# +# form widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($form_demo) && $form_demo + $form_demo.destroy + $form_demo = nil +end + +# demo 用の toplevel widget を生成 +$form_demo = TkToplevel.new {|w| + title("Form Demonstration") + iconname("form") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($form_demo) { + font $font + wraplength '4i' + justify 'left' + text "このウィンドウは簡単なフォーム入力用になっていて、さまざまなエントリに入力ができます。タブでエントリの切替えができます。" +} +msg.pack('side'=>'top', 'fill'=>'x') + +# frame 生成 +TkFrame.new($form_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $form_demo + $form_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'form'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# entry 生成 +form_data = [] +(1..5).each{|i| + f = TkFrame.new($form_demo, 'bd'=>2) + e = TkEntry.new(f, 'relief'=>'sunken', 'width'=>40) + l = TkLabel.new(f) + e.pack('side'=>'right') + l.pack('side'=>'left') + form_data[i] = {'frame'=>f, 'entry'=>e, 'label'=>l} +} + +# 文字列設定 +form_data[1]['label'].text('名前:') +form_data[2]['label'].text('住所:') +form_data[5]['label'].text('電話:') + +# pack +(1..5).each{|i| form_data[i]['frame'].pack('side'=>'top', 'fill'=>'x')} + diff --git a/ext/tk/sample/demos-jp/hello b/ext/tk/sample/demos-jp/hello new file mode 100644 index 0000000000..94e450899c --- /dev/null +++ b/ext/tk/sample/demos-jp/hello @@ -0,0 +1,9 @@ +#!/usr/local/bin/ruby +require 'tk' + +TkButton.new(nil, + 'text'=>"こんにちは、世界", + 'command'=>proc{print "こんにちは、世界\n"; exit} +).pack + +Tk.mainloop diff --git a/ext/tk/sample/demos-jp/hscale.rb b/ext/tk/sample/demos-jp/hscale.rb new file mode 100644 index 0000000000..4333239c73 --- /dev/null +++ b/ext/tk/sample/demos-jp/hscale.rb @@ -0,0 +1,76 @@ +require "tkcanvas" + +if defined?($hscale_demo) && $hscale_deom + $hscale_demo.destroy + $hscale_demo = nil +end + +$hscale_demo = TkToplevel.new {|w| + title("Horizontal Scale Demonstration") + iconname("hscale") +} +positionWindow($hscale_demo) + + +msg = TkLabel.new($hscale_demo) { + font $font + wraplength '3.5i' + justify 'left' + text "下には矢印が1つと水平なスケールが表示されています。\ +スケール上でマウスボタン1をクリック、またはドラッグすると\ +矢印の長さを変えることができます。" +} +msg.pack('side'=>'top') + +TkFrame.new($hscale_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc { + tmppath = $hscale_demo + $hscale_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc { showCode 'hscale' } + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +TkFrame.new($hscale_demo) {|frame| + canvas = TkCanvas.new(frame) {|c| + width 50 + height 50 + bd 0 + highlightthickness 0 + TkcPolygon.new(c, '0', '0', '1', '1', '2', '2') { + fill 'DeepSkyBlue' + tags 'poly' + } + TkcLine.new(c, '0', '0', '1', '1', '2', '2', '0', '0') { + fill 'black' + tags 'line' + } + }.pack('side'=>'top', 'expand'=>'yes', 'anchor'=>'s', 'fill'=>'x', 'padx'=>'15') + scale = TkScale.new(frame) { + orient 'horizontal' + length 284 + from 0 + to 250 + command proc{|value| setWidth(canvas, value)} + tickinterval 50 + }.pack('side'=>'bottom', 'expand'=>'yes', 'anchor'=>'n') + scale.set 75 +}.pack('side'=>'top', 'fill'=>'x') + + +def setWidth(w, width) + width = width + 21 + x2 = width - 30 + if x2 < 21 + x2 = 21 + end + w.coords 'poly',20,15,20,35,x2,35,x2,45,width,25,x2,5,x2,15,20,15 + w.coords 'line',20,15,20,35,x2,35,x2,45,width,25,x2,5,x2,15,20,15 +end diff --git a/ext/tk/sample/demos-jp/icon.rb b/ext/tk/sample/demos-jp/icon.rb new file mode 100644 index 0000000000..9b39d33847 --- /dev/null +++ b/ext/tk/sample/demos-jp/icon.rb @@ -0,0 +1,91 @@ +# +# iconic button widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($icon_demo) && $icon_demo + $icon_demo.destroy + $icon_demo = nil +end + +# demo 用の toplevel widget を生成 +$icon_demo = TkToplevel.new {|w| + title("Iconic Button Demonstration") + iconname("icon") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($icon_demo) { + font $font + wraplength '5i' + justify 'left' + text "このウィンドウにはラジオボタンとチェックボタン上にビットマップや画像を表示する 3 つの方法を示しています。左にあるのは2つのラジオボタンで、それぞれが、ビットマップと選択を示すインジケータでできています。中央にあるのは、選択済みかどうかによって異なる画像を表示するチェックボタンです。右側にあるのは選択済みかどうかによって背景色が変わるビットマップを表示するチェックボタンです。" +} +msg.pack('side'=>'top') + +# frame 生成 +TkFrame.new($icon_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $icon_demo + $icon_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'icon'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# image 生成 +flagup = \ +TkBitmapImage.new('file'=>[$demo_dir, + 'images','flagup.bmp'].join(File::Separator), + 'maskfile'=>\ + [$demo_dir,'images','flagup.bmp'].join(File::Separator)) +flagdown = \ +TkBitmapImage.new('file'=>[$demo_dir, + 'images','flagdown.bmp'].join(File::Separator), + 'maskfile'=>\ + [$demo_dir,'images','flagdown.bmp'].join(File::Separator)) + +# 変数生成 +letters = TkVariable.new + +# frame 生成 +TkFrame.new($icon_demo, 'borderwidth'=>10){|w| + TkFrame.new(w) {|f| + TkRadioButton.new(f){ + bitmap '@' + [$demo_dir,'images','letters.bmp'].join(File::Separator) + variable letters + value 'full' + }.pack('side'=>'top', 'expand'=>'yes') + + TkRadioButton.new(f){ + bitmap '@' + [$demo_dir,'images','noletter.bmp'].join(File::Separator) + variable letters + value 'empty' + }.pack('side'=>'top', 'expand'=>'yes') + + }.pack('side'=>'left', 'expand'=>'yes', 'padx'=>'5m') + + TkCheckButton.new(w) { + image flagdown + selectimage flagup + indicatoron 0 + selectcolor self['background'] + }.pack('side'=>'left', 'expand'=>'yes', 'padx'=>'5m') + + TkCheckButton.new(w) { + bitmap '@' + [$demo_dir,'images','letters.bmp'].join(File::Separator) + indicatoron 0 + selectcolor 'SeaGreen1' + }.pack('side'=>'left', 'expand'=>'yes', 'padx'=>'5m') + +}.pack('side'=>'top') + diff --git a/ext/tk/sample/demos-jp/image1.rb b/ext/tk/sample/demos-jp/image1.rb new file mode 100644 index 0000000000..bfe47c47af --- /dev/null +++ b/ext/tk/sample/demos-jp/image1.rb @@ -0,0 +1,57 @@ +# +# two image widgets demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($image1_demo) && $image1_demo + $image1_demo.destroy + $image1_demo = nil +end + +# demo 用の toplevel widget を生成 +$image1_demo = TkToplevel.new {|w| + title('Image Demonstration #1') + iconname("Image1") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($image1_demo) { + font $font + wraplength '4i' + justify 'left' + text "このデモでは2つのラベル上に画像をそれぞれ表示しています。" +} +msg.pack('side'=>'top') + +# frame 生成 +TkFrame.new($image1_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $image1_demo + $image1_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'image1'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# image 生成 +image1a = \ +TkPhotoImage.new('file'=>[$demo_dir, + 'images','earth.gif'].join(File::Separator)) +image1b = \ +TkPhotoImage.new('file'=>[$demo_dir, + 'images','earthris.gif'].join(File::Separator)) + +# label 生成 +[ TkLabel.new($image1_demo, 'image'=>image1a, 'bd'=>1, 'relief'=>'sunken'), + TkLabel.new($image1_demo, 'image'=>image1b, 'bd'=>1, 'relief'=>'sunken') +].each{|w| w.pack('side'=>'top', 'padx'=>'.5m', 'pady'=>'.5m')} + diff --git a/ext/tk/sample/demos-jp/image2.rb b/ext/tk/sample/demos-jp/image2.rb new file mode 100644 index 0000000000..07f9b17ebe --- /dev/null +++ b/ext/tk/sample/demos-jp/image2.rb @@ -0,0 +1,101 @@ +# +# widget demo 'load image' (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($image2_demo) && $image2_demo + $image2_demo.destroy + $image2_demo = nil +end + +# demo 用の toplevel widget を生成 +$image2_demo = TkToplevel.new {|w| + title('Image Demonstration #2') + iconname("Image2") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($image2_demo) { + font $font + wraplength '4i' + justify 'left' + text "このデモではTkの photo image を使用して画像を見ることができます。最初にエントリ内ににディレクトリ名を入れて下さい。次に下のリストボックスにこのディレクトリをロードするため、リターンを押してください。その後、画像を選択するためにリストボックスの中のファイル名をダブルクリックして下さい。" +} +msg.pack('side'=>'top') + +# frame 生成 +TkFrame.new($image2_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $image2_demo + $image2_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'image2'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# 変数生成 +$dirName = TkVariable.new([$demo_dir,'images'].join(File::Separator)) + +# image 生成 +$image2a = TkPhotoImage.new + +# ファイル名入力部 +TkLabel.new($image2_demo, 'text'=>'ディレクトリ:')\ +.pack('side'=>'top', 'anchor'=>'w') + +image2_e = TkEntry.new($image2_demo) { + width 30 + textvariable $dirName +}.pack('side'=>'top', 'anchor'=>'w') + +TkFrame.new($image2_demo, 'height'=>'3m', 'width'=>20)\ +.pack('side'=>'top', 'anchor'=>'w') + +TkLabel.new($image2_demo, 'text'=>'ファイル:')\ +.pack('side'=>'top', 'anchor'=>'w') + +TkFrame.new($image2_demo){|w| + s = TkScrollbar.new(w) + l = TkListbox.new(w) { + width 20 + height 10 + yscrollcommand proc{|first,last| s.set first,last} + } + s.command(proc{|*args| l.yview(*args)}) + l.pack('side'=>'left', 'expand'=>'yes', 'fill'=>'y') + s.pack('side'=>'left', 'expand'=>'yes', 'fill'=>'y') + #l.insert(0,'earth.gif', 'earthris.gif', 'mickey.gif', 'teapot.ppm') + l.insert(0,'earth.gif', 'earthris.gif', 'teapot.ppm') + l.bind('Double-1', proc{|x,y| loadImage $image2a,l,x,y}, '%x %y') + + image2_e.bind 'Return', proc{loadDir l} + +}.pack('side'=>'top', 'anchor'=>'w') + +# image 配置 +[ TkFrame.new($image2_demo, 'height'=>'3m', 'width'=>20), + TkLabel.new($image2_demo, 'text'=>'画像:'), + TkLabel.new($image2_demo, 'image'=>$image2a) +].each{|w| w.pack('side'=>'top', 'anchor'=>'w')} + +# メソッド定義 +def loadDir(w) + w.delete(0,'end') + Dir.glob([$dirName,'*'].join(File::Separator)).sort.each{|f| + w.insert('end',File.basename(f)) + } +end + +def loadImage(img,w,x,y) + img.file([$dirName, w.get("@#{x},#{y}")].join(File::Separator)) +end + diff --git a/ext/tk/sample/demos-jp/images/earth.gif b/ext/tk/sample/demos-jp/images/earth.gif Binary files differnew file mode 100644 index 0000000000..3ae4a9ce01 --- /dev/null +++ b/ext/tk/sample/demos-jp/images/earth.gif diff --git a/ext/tk/sample/demos-jp/images/earthris.gif b/ext/tk/sample/demos-jp/images/earthris.gif Binary files differnew file mode 100644 index 0000000000..48f08c4421 --- /dev/null +++ b/ext/tk/sample/demos-jp/images/earthris.gif diff --git a/ext/tk/sample/demos-jp/images/face.bmp b/ext/tk/sample/demos-jp/images/face.bmp new file mode 100644 index 0000000000..03d829f4d1 --- /dev/null +++ b/ext/tk/sample/demos-jp/images/face.bmp @@ -0,0 +1,173 @@ +#define face_width 108 +#define face_height 144 +#define face_x_hot 48 +#define face_y_hot 80 +static char face_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, + 0x20, 0x80, 0x24, 0x05, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x88, + 0x24, 0x20, 0x80, 0x24, 0x00, 0x00, 0x00, 0x10, 0x80, 0x04, 0x00, 0x01, + 0x00, 0x01, 0x40, 0x0a, 0x09, 0x00, 0x92, 0x04, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x40, 0x12, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x84, + 0x24, 0x40, 0x22, 0xa8, 0x02, 0x14, 0x84, 0x92, 0x40, 0x42, 0x12, 0x04, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x11, 0x00, 0x12, 0x00, + 0x40, 0x02, 0x00, 0x20, 0x00, 0x08, 0x00, 0xaa, 0x02, 0x54, 0x85, 0x24, + 0x00, 0x10, 0x12, 0x00, 0x00, 0x81, 0x44, 0x00, 0x90, 0x5a, 0x00, 0xea, + 0x1b, 0x00, 0x80, 0x40, 0x40, 0x02, 0x00, 0x08, 0x00, 0x20, 0xa2, 0x05, + 0x8a, 0xb4, 0x6e, 0x45, 0x12, 0x04, 0x08, 0x00, 0x00, 0x00, 0x10, 0x02, + 0xa8, 0x92, 0x00, 0xda, 0x5f, 0x10, 0x00, 0x10, 0xa1, 0x04, 0x20, 0x41, + 0x02, 0x00, 0x5a, 0x25, 0xa0, 0xff, 0xfb, 0x05, 0x41, 0x02, 0x04, 0x00, + 0x00, 0x08, 0x40, 0x80, 0xec, 0x9b, 0xec, 0xfe, 0x7f, 0x01, 0x04, 0x20, + 0x90, 0x02, 0x04, 0x00, 0x08, 0x20, 0xfb, 0x2e, 0xf5, 0xff, 0xff, 0x57, + 0x00, 0x04, 0x02, 0x00, 0x00, 0x20, 0x01, 0xc1, 0x6e, 0xab, 0xfa, 0xff, + 0xff, 0x05, 0x90, 0x20, 0x48, 0x02, 0x00, 0x04, 0x20, 0xa8, 0xdf, 0xb5, + 0xfe, 0xff, 0xff, 0x0b, 0x01, 0x00, 0x01, 0x00, 0x80, 0x80, 0x04, 0xe0, + 0xbb, 0xef, 0xff, 0xff, 0x7f, 0x01, 0x00, 0x04, 0x48, 0x02, 0x00, 0x20, + 0x80, 0xf4, 0x6f, 0xfb, 0xff, 0xff, 0xff, 0x20, 0x90, 0x40, 0x02, 0x00, + 0x00, 0x04, 0x08, 0xb8, 0xf6, 0xff, 0xff, 0xdf, 0xbe, 0x12, 0x45, 0x10, + 0x90, 0x04, 0x90, 0x00, 0x22, 0xfa, 0xff, 0xff, 0xff, 0xbb, 0xd7, 0xe9, + 0x3a, 0x02, 0x02, 0x00, 0x04, 0x90, 0x80, 0xfe, 0xdf, 0xf6, 0xb7, 0xef, + 0xbe, 0x56, 0x57, 0x40, 0x48, 0x09, 0x00, 0x04, 0x00, 0xfa, 0xf5, 0xdf, + 0xed, 0x5a, 0xd5, 0xea, 0xbd, 0x09, 0x00, 0x00, 0x40, 0x00, 0x92, 0xfe, + 0xbf, 0x7d, 0xb7, 0x6a, 0x55, 0xbf, 0xf7, 0x02, 0x11, 0x01, 0x00, 0x91, + 0x00, 0xff, 0xff, 0xaf, 0x55, 0x55, 0x5b, 0xeb, 0xef, 0x22, 0x04, 0x04, + 0x04, 0x00, 0xa4, 0xff, 0xf7, 0xad, 0xaa, 0xaa, 0xaa, 0xbe, 0xfe, 0x03, + 0x20, 0x00, 0x10, 0x44, 0x80, 0xff, 0x7f, 0x55, 0x12, 0x91, 0x2a, 0xeb, + 0xbf, 0x0b, 0x82, 0x02, 0x00, 0x00, 0xd1, 0x7f, 0xdf, 0xa2, 0xa4, 0x54, + 0x55, 0xfd, 0xfd, 0x47, 0x08, 0x08, 0x00, 0x21, 0xe4, 0xff, 0x37, 0x11, + 0x09, 0xa5, 0xaa, 0xb6, 0xff, 0x0d, 0x80, 0x00, 0x00, 0x04, 0xd0, 0xff, + 0x4f, 0x44, 0x20, 0x48, 0x55, 0xfb, 0xff, 0x27, 0x11, 0x02, 0x40, 0x40, + 0xe2, 0xfb, 0x15, 0x11, 0x4a, 0x55, 0x4a, 0x7d, 0xf7, 0x0f, 0x00, 0x00, + 0x04, 0x08, 0xf8, 0xdf, 0x52, 0x44, 0x01, 0x52, 0xb5, 0xfa, 0xff, 0x0f, + 0x49, 0x02, 0x00, 0x02, 0xe9, 0xf6, 0x0a, 0x11, 0xa4, 0x88, 0x4a, 0x6d, + 0xff, 0x5f, 0x00, 0x00, 0x10, 0x20, 0xf0, 0x2f, 0x21, 0x44, 0x10, 0x52, + 0xb5, 0xfa, 0xff, 0x0f, 0x44, 0x04, 0x80, 0x08, 0xf8, 0xab, 0x8a, 0x00, + 0x81, 0xa4, 0xd4, 0xd6, 0xfe, 0x2f, 0x00, 0x00, 0x04, 0x40, 0xb5, 0x2d, + 0x21, 0x08, 0x04, 0x90, 0xaa, 0xfa, 0xff, 0x1f, 0x11, 0x01, 0x00, 0x04, + 0xf0, 0x57, 0x0a, 0x22, 0x40, 0x4a, 0xda, 0x5e, 0xfb, 0x1f, 0x40, 0x00, + 0x40, 0x20, 0xba, 0x95, 0x90, 0x00, 0x01, 0xa0, 0xaa, 0xea, 0xff, 0x5f, + 0x02, 0x02, 0x00, 0x01, 0xe8, 0x57, 0x05, 0x00, 0x00, 0x12, 0xd5, 0xfe, + 0xfd, 0x1f, 0x48, 0x00, 0x04, 0x48, 0x7a, 0x95, 0x08, 0x02, 0x10, 0x40, + 0xaa, 0x55, 0xf7, 0x1f, 0x00, 0x09, 0x20, 0x00, 0xf8, 0x57, 0x22, 0x10, + 0x00, 0x28, 0xa9, 0xfa, 0xff, 0x5f, 0x02, 0x00, 0x00, 0x49, 0xdd, 0x29, + 0x01, 0x00, 0x80, 0x80, 0xaa, 0xd7, 0xff, 0x0f, 0x10, 0x00, 0x08, 0x00, + 0xf8, 0x96, 0x08, 0x00, 0x00, 0x20, 0x54, 0xfa, 0xee, 0x3f, 0x81, 0x04, + 0x40, 0x24, 0xfe, 0x55, 0x82, 0x00, 0x00, 0x82, 0xd2, 0xad, 0xff, 0x0f, + 0x08, 0x00, 0x04, 0x80, 0x6c, 0x97, 0x00, 0x00, 0x02, 0x20, 0xa9, 0xf6, + 0xdf, 0x5f, 0x00, 0x02, 0x20, 0x09, 0xfa, 0x49, 0x12, 0x00, 0x20, 0x84, + 0x54, 0xdb, 0xfe, 0x1f, 0x91, 0x00, 0x00, 0x00, 0xf8, 0x2b, 0x00, 0x20, + 0x00, 0x40, 0xa4, 0xf6, 0xbb, 0x1f, 0x04, 0x00, 0x44, 0x92, 0x7e, 0x95, + 0x02, 0x00, 0x00, 0x89, 0xaa, 0xdd, 0xff, 0x1f, 0x20, 0x09, 0x10, 0x00, + 0xf4, 0x57, 0x20, 0x01, 0x08, 0x20, 0xa9, 0x76, 0xff, 0x5f, 0x02, 0x00, + 0x00, 0x21, 0xfc, 0x4a, 0x05, 0x00, 0x01, 0x80, 0x54, 0xdb, 0xff, 0x1e, + 0x08, 0x02, 0x04, 0x08, 0xf9, 0x2b, 0x00, 0x00, 0x40, 0x28, 0xd2, 0xf6, + 0xff, 0xbf, 0x80, 0x00, 0x90, 0x00, 0xbc, 0x92, 0x08, 0x10, 0x00, 0x82, + 0x54, 0xdb, 0xff, 0x1f, 0x20, 0x00, 0x00, 0x44, 0xf9, 0x55, 0x02, 0x01, + 0x00, 0x20, 0xaa, 0xbd, 0xfd, 0x3f, 0x08, 0x04, 0x04, 0x10, 0xf4, 0x2a, + 0x01, 0x00, 0x22, 0x80, 0xd4, 0xf6, 0xff, 0x5f, 0x82, 0x00, 0x40, 0x02, + 0xf8, 0x55, 0x20, 0x00, 0x00, 0x50, 0x6a, 0xdf, 0xfe, 0x3f, 0x00, 0x00, + 0x00, 0x48, 0xe9, 0x4a, 0x05, 0x08, 0x00, 0xa5, 0xd5, 0xf5, 0xff, 0x3f, + 0x10, 0x01, 0x10, 0x01, 0xb0, 0xab, 0x92, 0x02, 0x40, 0xf8, 0xbf, 0xde, + 0xfe, 0x5f, 0x02, 0x04, 0x04, 0x48, 0xfa, 0xd4, 0x6f, 0x20, 0x84, 0xef, + 0xff, 0xfb, 0xff, 0x1f, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xed, 0xbf, 0x0b, + 0xa1, 0x7e, 0xff, 0xbf, 0xfd, 0x5f, 0x04, 0x01, 0x20, 0x49, 0xd2, 0xfb, + 0xfe, 0x55, 0xd4, 0xff, 0xff, 0xf6, 0xff, 0x07, 0x00, 0x04, 0x00, 0x00, + 0xc0, 0xaa, 0xfb, 0x2b, 0xa2, 0xfe, 0xff, 0xdf, 0xee, 0x1f, 0x91, 0x00, + 0x82, 0xa4, 0xa4, 0xf5, 0xff, 0x57, 0xd5, 0xff, 0xbf, 0xfd, 0xff, 0x4d, + 0x00, 0x00, 0x20, 0x00, 0x88, 0x5b, 0xff, 0x2f, 0x69, 0xff, 0xff, 0xdb, + 0xfe, 0x1f, 0x24, 0x02, 0x00, 0x49, 0xa2, 0xd6, 0xff, 0x5f, 0xea, 0xff, + 0x7f, 0x7f, 0x7f, 0x0d, 0x00, 0x00, 0x10, 0x00, 0x40, 0xab, 0xf7, 0xbb, + 0xf0, 0xdf, 0xff, 0xd5, 0xff, 0xbf, 0x82, 0x04, 0x42, 0x24, 0x91, 0xd5, + 0xaa, 0xae, 0xd4, 0xaa, 0x52, 0x7b, 0xff, 0x15, 0x08, 0x00, 0x00, 0x01, + 0x04, 0x55, 0xd5, 0x55, 0x70, 0x5b, 0x75, 0xdd, 0xdf, 0x1f, 0x40, 0x00, + 0x08, 0x48, 0xa0, 0x4a, 0xa9, 0x56, 0xea, 0x56, 0xad, 0x6a, 0x7d, 0x9b, + 0x04, 0x01, 0x00, 0x02, 0x42, 0x2a, 0xd5, 0xaa, 0xa8, 0xaa, 0xaa, 0xfa, + 0xdf, 0x2f, 0x10, 0x04, 0x22, 0x48, 0x08, 0x45, 0x2a, 0x15, 0x68, 0x55, + 0x55, 0xd7, 0x76, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x40, 0x2a, 0x80, 0xa0, + 0xb2, 0x09, 0x48, 0xb9, 0xdf, 0x17, 0x22, 0x01, 0x00, 0x24, 0x45, 0x8a, + 0x24, 0x4a, 0x54, 0x51, 0x91, 0xf6, 0x6e, 0x4b, 0x00, 0x04, 0x90, 0x00, + 0x80, 0x52, 0x00, 0x20, 0x69, 0x05, 0xa4, 0xaa, 0xff, 0x1e, 0x48, 0x00, + 0x02, 0x92, 0x08, 0x05, 0x81, 0x94, 0xd4, 0x92, 0x40, 0xfd, 0xb6, 0x8b, + 0x00, 0x01, 0x40, 0x00, 0x82, 0x54, 0x00, 0x48, 0x68, 0x05, 0x90, 0xa4, + 0xef, 0x06, 0x24, 0x00, 0x08, 0x12, 0x10, 0x05, 0x00, 0x10, 0xb5, 0x01, + 0x42, 0xfb, 0xbf, 0x43, 0x00, 0x09, 0x00, 0x40, 0x81, 0xa8, 0x08, 0x4a, + 0xaa, 0x96, 0x90, 0xac, 0x6d, 0x15, 0x22, 0x00, 0x20, 0x09, 0x04, 0x15, + 0x80, 0x28, 0xdc, 0x01, 0x24, 0xfb, 0xbf, 0x01, 0x80, 0x04, 0x09, 0x00, + 0x40, 0x48, 0x02, 0x45, 0xb2, 0x2e, 0x41, 0x6d, 0xef, 0x05, 0x11, 0x00, + 0x40, 0x52, 0x02, 0x15, 0x29, 0x2a, 0xac, 0x42, 0x54, 0xfb, 0x3b, 0x51, + 0x84, 0x00, 0x08, 0x00, 0x20, 0x54, 0x80, 0x05, 0xb5, 0x3d, 0xa2, 0xb6, + 0xdf, 0x00, 0x20, 0x04, 0x20, 0x49, 0x89, 0xa8, 0x6a, 0x29, 0xac, 0xd6, + 0x54, 0xff, 0x3f, 0x84, 0x00, 0x01, 0x04, 0x10, 0x00, 0x94, 0xa8, 0x56, + 0xda, 0x5f, 0xab, 0xd5, 0x1e, 0x10, 0x48, 0x00, 0x90, 0x82, 0x48, 0xa8, + 0xb2, 0xac, 0xfd, 0x55, 0xd5, 0xfe, 0x9f, 0x80, 0x00, 0x0a, 0x02, 0x08, + 0x02, 0x55, 0x5a, 0x75, 0xff, 0xaf, 0xb6, 0xf7, 0x2d, 0x12, 0x92, 0x00, + 0x10, 0x20, 0x10, 0xa8, 0x54, 0xd5, 0xbf, 0x5d, 0xad, 0xdd, 0x0f, 0x00, + 0x00, 0x04, 0x40, 0x09, 0x84, 0xa8, 0xaa, 0x5a, 0xed, 0xeb, 0x6a, 0xff, + 0x9f, 0xa4, 0x24, 0x01, 0x02, 0xa0, 0x20, 0x50, 0x55, 0xd5, 0xbe, 0xae, + 0xad, 0xfd, 0x16, 0x00, 0x10, 0x04, 0x20, 0x0a, 0x08, 0xb4, 0xaa, 0x95, + 0xaa, 0x7b, 0xb7, 0xdb, 0x5f, 0x92, 0x04, 0x01, 0x84, 0x20, 0x21, 0x51, + 0xd5, 0x2a, 0xa9, 0xee, 0xd5, 0xfe, 0x0d, 0x00, 0x20, 0x04, 0x10, 0x00, + 0x08, 0x50, 0xe9, 0xd7, 0xd4, 0xfb, 0xb5, 0xff, 0x9f, 0x24, 0x09, 0x01, + 0x42, 0x4a, 0xa2, 0x64, 0xd5, 0x55, 0x7b, 0x7f, 0xda, 0x7d, 0x4f, 0x00, + 0x20, 0x04, 0x00, 0x80, 0x00, 0xa0, 0x2a, 0x13, 0x84, 0x6a, 0x55, 0xff, + 0x1d, 0x48, 0x8a, 0x00, 0x94, 0x24, 0x8a, 0xc8, 0xaa, 0x42, 0x20, 0x5d, + 0xf5, 0xff, 0x5f, 0x01, 0x00, 0x02, 0x01, 0x00, 0x20, 0xa2, 0x4a, 0x1a, + 0x82, 0x56, 0xda, 0xbd, 0x3f, 0x92, 0x92, 0x00, 0x90, 0x92, 0x00, 0x40, + 0x95, 0x6a, 0xf4, 0x55, 0x6d, 0xff, 0xd6, 0x00, 0x00, 0x0a, 0x04, 0x20, + 0x14, 0x49, 0x4b, 0xaa, 0xaa, 0x56, 0xf5, 0xff, 0xbf, 0xab, 0xa4, 0x00, + 0x20, 0x89, 0x40, 0x80, 0xaa, 0xaa, 0xaa, 0xaa, 0xde, 0xbf, 0xeb, 0x03, + 0x00, 0x02, 0x04, 0x02, 0x0a, 0x10, 0x2b, 0x2a, 0x55, 0x5b, 0xf5, 0xff, + 0xd7, 0x2f, 0x92, 0x00, 0x10, 0x28, 0x21, 0x01, 0x56, 0x95, 0xa0, 0x56, + 0xdf, 0xef, 0xea, 0x87, 0x40, 0x0a, 0x42, 0x41, 0x00, 0x90, 0xaa, 0x52, + 0xb6, 0xad, 0xfa, 0xff, 0xd5, 0x2f, 0x14, 0x00, 0x00, 0x04, 0x95, 0x04, + 0xaa, 0xac, 0x55, 0x6b, 0xff, 0xb7, 0xea, 0x9f, 0x40, 0x02, 0x28, 0x51, + 0x00, 0x40, 0x58, 0xd5, 0xda, 0xd6, 0x6e, 0x7f, 0xf9, 0x3f, 0x12, 0x04, + 0x02, 0x04, 0x49, 0x25, 0x55, 0xaa, 0x77, 0xab, 0xff, 0x2b, 0xfd, 0x3f, + 0x48, 0x01, 0x20, 0x41, 0x00, 0x00, 0x58, 0xa9, 0xda, 0xea, 0xfd, 0xaf, + 0xfa, 0xff, 0x02, 0x04, 0x08, 0x14, 0x29, 0x49, 0x52, 0x55, 0x55, 0x55, + 0xff, 0x8d, 0xfe, 0x3f, 0xa8, 0x00, 0x02, 0x41, 0x00, 0x02, 0xa0, 0xa2, + 0xaa, 0xea, 0xff, 0x53, 0xfd, 0xff, 0x02, 0x04, 0x50, 0x04, 0x25, 0xa8, + 0x54, 0x49, 0x52, 0xb5, 0xbf, 0x8a, 0xfe, 0xff, 0xa9, 0x08, 0x04, 0x50, + 0x80, 0x02, 0xa1, 0x2a, 0x95, 0xea, 0xff, 0xa1, 0xff, 0xff, 0x03, 0x02, + 0x90, 0x02, 0x09, 0x08, 0x44, 0x49, 0x52, 0xbd, 0x7f, 0xca, 0xff, 0xff, + 0x2b, 0x09, 0x04, 0x48, 0x40, 0x82, 0x90, 0x56, 0xa9, 0xf6, 0xbf, 0xd0, + 0xff, 0xff, 0x47, 0x00, 0x50, 0x02, 0x15, 0x11, 0x40, 0x95, 0xaa, 0xfd, + 0x2f, 0xe9, 0xff, 0xff, 0x8f, 0x0a, 0x84, 0x50, 0x40, 0x84, 0x14, 0xaa, + 0x6a, 0xff, 0x5f, 0xf2, 0xff, 0xff, 0x7f, 0x00, 0x10, 0x02, 0x09, 0x10, + 0x40, 0x7d, 0xf7, 0xff, 0x0b, 0xfc, 0xff, 0xff, 0xaf, 0x02, 0x84, 0x50, + 0x42, 0x85, 0x12, 0xd0, 0xdd, 0xff, 0xa7, 0xf2, 0xff, 0xff, 0xff, 0x04, + 0x00, 0x0a, 0x08, 0x10, 0x48, 0xf8, 0xff, 0xff, 0x0a, 0xfe, 0xff, 0xff, + 0x7f, 0x03, 0xa4, 0x80, 0xa2, 0x8a, 0x02, 0x68, 0xff, 0xff, 0x52, 0xfd, + 0xff, 0xff, 0xff, 0x07, 0x00, 0x2a, 0x08, 0x20, 0x28, 0xdc, 0xff, 0x5f, + 0x05, 0xff, 0xff, 0xff, 0xff, 0x0d, 0x92, 0x40, 0x22, 0x09, 0x02, 0xea, + 0xfb, 0xaf, 0x48, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x12, 0x81, 0xa0, + 0x48, 0x9c, 0x6e, 0x93, 0xa2, 0xff, 0xff, 0xff, 0xff, 0x07, 0xa8, 0x40, + 0x28, 0x0a, 0x02, 0x74, 0xb5, 0x45, 0x81, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x02, 0x0a, 0x81, 0x20, 0x08, 0xae, 0xaa, 0x90, 0xe8, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x90, 0x40, 0x28, 0x88, 0x12, 0x58, 0x15, 0x50, 0xd0, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x44, 0x0a, 0x41, 0x21, 0x08, 0xae, 0x04, 0x14, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x10, 0x40, 0x14, 0x88, 0x04, 0xba, + 0x02, 0x28, 0xe8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x42, 0x15, 0x41, 0x21, + 0x05, 0xad, 0x00, 0x05, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x10, 0x40, + 0x24, 0x8a, 0x0e, 0x36, 0x00, 0x0a, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x42, 0x25, 0x90, 0xd0, 0x8b, 0xc2, 0x41, 0x05, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x10, 0x08, 0x05, 0xe8, 0x8e, 0x58, 0x80, 0x02, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x4a, 0x20, 0xa8, 0xba, 0x0b, 0x2b, 0x51, 0x01, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x8a, 0x02, 0xe8, 0xaf, 0x84, + 0x90, 0x04, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x52, 0x21, 0x54, 0xbf, + 0x1f, 0x15, 0xa5, 0x02, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x08, + 0x01, 0xfa, 0xb6, 0xa4, 0x52, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x4a, 0xa2, 0x54, 0xef, 0x5f, 0x4b, 0xa4, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x80, 0x10, 0x82, 0xfe, 0xbf, 0x92, 0x52, 0x42, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x12, 0x42, 0xa8, 0xbf, 0x1f, 0x24, 0x80, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x84, 0x28, 0x8a, 0xf7, 0x37, 0x80, + 0x52, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x10, 0x82, 0xe0, 0xff, + 0x1f, 0x00, 0x20, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x84, 0x28, + 0xca, 0xff, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, + 0x10, 0x42, 0xf0, 0xfd, 0x1b, 0x00, 0x50, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0xa4, 0x10, 0xc5, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0f, 0x00, 0x22, 0xf8, 0xff, 0x0e, 0x00, 0x00, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xaa, 0x88, 0xe2, 0xff, 0x0f, 0x10, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x25, 0xfa, 0xff, + 0x0f, 0x01, 0x11, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xfb, + 0xfb, 0xff, 0x7f, 0x5d, 0xd5, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f}; diff --git a/ext/tk/sample/demos-jp/images/flagdown.bmp b/ext/tk/sample/demos-jp/images/flagdown.bmp new file mode 100644 index 0000000000..55abc51825 --- /dev/null +++ b/ext/tk/sample/demos-jp/images/flagdown.bmp @@ -0,0 +1,27 @@ +#define flagdown_width 48 +#define flagdown_height 48 +static char flagdown_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe1, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x80, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x04, + 0x00, 0x00, 0x03, 0x00, 0x06, 0x06, 0x00, 0x80, 0x01, 0x00, 0x06, 0x07, + 0x00, 0xc0, 0x1f, 0x00, 0x87, 0x07, 0x00, 0xe0, 0x7f, 0x80, 0xc7, 0x07, + 0x00, 0x70, 0xe0, 0xc0, 0xe5, 0x07, 0x00, 0x38, 0x80, 0xe1, 0x74, 0x07, + 0x00, 0x18, 0x80, 0x71, 0x3c, 0x07, 0x00, 0x0c, 0x00, 0x3b, 0x1e, 0x03, + 0x00, 0x0c, 0x00, 0x1f, 0x0f, 0x00, 0x00, 0x86, 0x1f, 0x8e, 0x07, 0x00, + 0x00, 0x06, 0x06, 0xc6, 0x05, 0x00, 0x00, 0x06, 0x00, 0xc6, 0x05, 0x00, + 0x00, 0x06, 0x00, 0xc6, 0x04, 0x00, 0x00, 0x06, 0x00, 0x06, 0x04, 0x00, + 0x7f, 0x06, 0x00, 0x06, 0xe4, 0xff, 0x00, 0x06, 0x00, 0x06, 0x04, 0x00, + 0x00, 0x06, 0x00, 0x06, 0x04, 0x00, 0x00, 0x06, 0x00, 0x06, 0x06, 0x00, + 0x00, 0x06, 0x00, 0x06, 0x03, 0x00, 0x00, 0x06, 0x00, 0x86, 0x01, 0x00, + 0x00, 0x06, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x06, 0x00, 0x66, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3e, 0x00, 0x00, + 0x00, 0xfe, 0xff, 0x2f, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x27, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, 0x00, 0x00, 0x88, 0x20, 0x00, 0x00, + 0xf7, 0xbf, 0x8e, 0xfc, 0xdf, 0xf8, 0x9d, 0xeb, 0x9b, 0x76, 0xd2, 0x7a, + 0x46, 0x30, 0xe2, 0x0f, 0xe1, 0x47, 0x55, 0x84, 0x48, 0x11, 0x84, 0x19}; diff --git a/ext/tk/sample/demos-jp/images/flagup.bmp b/ext/tk/sample/demos-jp/images/flagup.bmp new file mode 100644 index 0000000000..6eb0d846a3 --- /dev/null +++ b/ext/tk/sample/demos-jp/images/flagup.bmp @@ -0,0 +1,27 @@ +#define flagup_width 48 +#define flagup_height 48 +static char flagup_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xef, 0x6a, 0x00, + 0x00, 0x00, 0xc0, 0x7b, 0x75, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x6a, 0x00, + 0x00, 0x00, 0x30, 0x60, 0x75, 0x00, 0x00, 0x00, 0x18, 0xe0, 0x7f, 0x00, + 0x00, 0x00, 0x0c, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x06, 0xe0, 0x04, 0x00, + 0x00, 0x00, 0x03, 0xe0, 0x04, 0x00, 0x00, 0x80, 0x01, 0xe0, 0x06, 0x00, + 0x00, 0xc0, 0x1f, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x7f, 0xe0, 0x07, 0x00, + 0x00, 0x70, 0xe0, 0xe0, 0x05, 0x00, 0x00, 0x38, 0x80, 0xe1, 0x04, 0x00, + 0x00, 0x18, 0x80, 0xf1, 0x04, 0x00, 0x00, 0x0c, 0x00, 0xfb, 0x04, 0x00, + 0x00, 0x0c, 0x00, 0xff, 0x04, 0x00, 0x00, 0x86, 0x1f, 0xee, 0x04, 0x00, + 0x00, 0x06, 0x06, 0xe6, 0x04, 0x00, 0x00, 0x06, 0x00, 0xe6, 0x04, 0x00, + 0x00, 0x06, 0x00, 0xe6, 0x04, 0x00, 0x00, 0x06, 0x00, 0x66, 0x04, 0x00, + 0x7f, 0x56, 0x52, 0x06, 0xe4, 0xff, 0x00, 0x76, 0x55, 0x06, 0x04, 0x00, + 0x00, 0x56, 0x57, 0x06, 0x04, 0x00, 0x00, 0x56, 0x55, 0x06, 0x06, 0x00, + 0x00, 0x56, 0xd5, 0x06, 0x03, 0x00, 0x00, 0x06, 0x00, 0x86, 0x01, 0x00, + 0x54, 0x06, 0x00, 0xc6, 0x54, 0x55, 0xaa, 0x06, 0x00, 0x66, 0xaa, 0x2a, + 0x54, 0x06, 0x00, 0x36, 0x55, 0x55, 0xaa, 0x06, 0x00, 0xbe, 0xaa, 0x2a, + 0x54, 0xfe, 0xff, 0x6f, 0x55, 0x55, 0xaa, 0xfc, 0xff, 0xa7, 0xaa, 0x2a, + 0x54, 0x01, 0x88, 0x60, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa0, 0xaa, 0x2a, + 0x54, 0x55, 0x8d, 0x60, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa0, 0xaa, 0x2a, + 0x54, 0x55, 0x8d, 0x60, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa0, 0xaa, 0x2a, + 0x54, 0x55, 0x8d, 0x50, 0x55, 0x55, 0xaa, 0xaa, 0x8a, 0xa8, 0xaa, 0x2a, + 0x54, 0x55, 0x95, 0x54, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x2a, + 0x54, 0x55, 0x55, 0x55, 0x55, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/ext/tk/sample/demos-jp/images/gray25.bmp b/ext/tk/sample/demos-jp/images/gray25.bmp new file mode 100644 index 0000000000..b234b3cb0b --- /dev/null +++ b/ext/tk/sample/demos-jp/images/gray25.bmp @@ -0,0 +1,6 @@ +#define grey_width 16 +#define grey_height 16 +static char grey_bits[] = { + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44}; diff --git a/ext/tk/sample/demos-jp/images/grey.25 b/ext/tk/sample/demos-jp/images/grey.25 new file mode 100644 index 0000000000..b234b3cb0b --- /dev/null +++ b/ext/tk/sample/demos-jp/images/grey.25 @@ -0,0 +1,6 @@ +#define grey_width 16 +#define grey_height 16 +static char grey_bits[] = { + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44, + 0x11, 0x11, 0x44, 0x44, 0x11, 0x11, 0x44, 0x44}; diff --git a/ext/tk/sample/demos-jp/images/grey.5 b/ext/tk/sample/demos-jp/images/grey.5 new file mode 100644 index 0000000000..37688893f0 --- /dev/null +++ b/ext/tk/sample/demos-jp/images/grey.5 @@ -0,0 +1,6 @@ +#define grey_width 16 +#define grey_height 16 +static char grey_bits[] = { + 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, + 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, + 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa}; diff --git a/ext/tk/sample/demos-jp/images/letters.bmp b/ext/tk/sample/demos-jp/images/letters.bmp new file mode 100644 index 0000000000..0f12568d1a --- /dev/null +++ b/ext/tk/sample/demos-jp/images/letters.bmp @@ -0,0 +1,27 @@ +#define letters_width 48 +#define letters_height 48 +static char letters_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, + 0x00, 0xfa, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2a, + 0x00, 0x3a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2e, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x21, + 0xa0, 0x03, 0x00, 0x00, 0x70, 0x21, 0x20, 0x00, 0x00, 0x00, 0x50, 0x21, + 0xa0, 0x1f, 0x00, 0x00, 0x50, 0x21, 0x20, 0x00, 0x00, 0x00, 0x70, 0x21, + 0xfe, 0xff, 0xff, 0xff, 0x0f, 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x21, + 0xfa, 0x01, 0x00, 0x80, 0x0b, 0x21, 0x02, 0x00, 0x00, 0x80, 0x0a, 0x21, + 0xba, 0x01, 0x00, 0x80, 0x0a, 0x21, 0x02, 0x00, 0x00, 0x80, 0x0b, 0x21, + 0x3a, 0x00, 0x00, 0x00, 0x08, 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x21, + 0x02, 0xc0, 0xfb, 0x03, 0x08, 0x21, 0x02, 0x00, 0x00, 0x00, 0x08, 0x3f, + 0x02, 0xc0, 0xbd, 0x0f, 0x08, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, + 0x02, 0xc0, 0x7f, 0x7b, 0x08, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, + 0x02, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, + 0xfe, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/ext/tk/sample/demos-jp/images/noletter.bmp b/ext/tk/sample/demos-jp/images/noletter.bmp new file mode 100644 index 0000000000..5774124efe --- /dev/null +++ b/ext/tk/sample/demos-jp/images/noletter.bmp @@ -0,0 +1,27 @@ +#define noletters_width 48 +#define noletters_height 48 +static char noletters_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00, + 0x00, 0xf0, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x7f, 0x00, + 0x00, 0x3e, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x01, + 0x80, 0x07, 0x00, 0x00, 0xc0, 0x03, 0xc0, 0x03, 0x00, 0x00, 0xe0, 0x07, + 0xe0, 0x01, 0x00, 0x00, 0xf0, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x78, 0x0e, + 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x1e, 0x70, 0x00, 0x00, 0x00, 0x1e, 0x1c, + 0x38, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x38, 0x00, 0x00, 0x80, 0x07, 0x38, + 0x3c, 0xfc, 0xff, 0xff, 0x7f, 0x78, 0x1c, 0x04, 0x00, 0xe0, 0x41, 0x70, + 0x1c, 0x04, 0x00, 0xf0, 0x40, 0x70, 0x1c, 0x74, 0x00, 0x78, 0x4e, 0x70, + 0x0e, 0x04, 0x00, 0x3c, 0x4a, 0xe0, 0x0e, 0x74, 0x03, 0x1e, 0x4a, 0xe0, + 0x0e, 0x04, 0x00, 0x0f, 0x4e, 0xe0, 0x0e, 0x04, 0x80, 0x07, 0x40, 0xe0, + 0x0e, 0x04, 0xf8, 0x0f, 0x40, 0xe0, 0x0e, 0x04, 0xe0, 0x01, 0x40, 0xe0, + 0x0e, 0x04, 0xf8, 0x00, 0x40, 0xe0, 0x0e, 0x04, 0x78, 0x00, 0x40, 0xe0, + 0x0e, 0x04, 0xfc, 0xf3, 0x40, 0xe0, 0x1c, 0x04, 0x1e, 0x00, 0x40, 0x70, + 0x1c, 0x04, 0x0f, 0x00, 0x40, 0x70, 0x1c, 0x84, 0x07, 0x00, 0x40, 0x70, + 0x3c, 0xfc, 0xff, 0xff, 0x7f, 0x78, 0x38, 0xe0, 0x01, 0x00, 0x00, 0x38, + 0x38, 0xf0, 0x00, 0x00, 0x00, 0x38, 0x70, 0x78, 0x00, 0x00, 0x00, 0x1c, + 0xf0, 0x3c, 0x00, 0x00, 0x00, 0x1e, 0xe0, 0x1e, 0x00, 0x00, 0x00, 0x0e, + 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x07, 0x00, 0x00, 0x80, 0x07, + 0x80, 0x07, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x1f, 0x00, 0x00, 0xf0, 0x01, + 0x00, 0x3e, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xfc, 0x01, 0x00, 0x7f, 0x00, + 0x00, 0xf0, 0x0f, 0xe0, 0x1f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00}; diff --git a/ext/tk/sample/demos-jp/images/pattern.bmp b/ext/tk/sample/demos-jp/images/pattern.bmp new file mode 100644 index 0000000000..df31baf789 --- /dev/null +++ b/ext/tk/sample/demos-jp/images/pattern.bmp @@ -0,0 +1,6 @@ +#define foo_width 16 +#define foo_height 16 +static char foo_bits[] = { + 0x60, 0x06, 0x90, 0x09, 0x90, 0x09, 0xb0, 0x0d, 0x4e, 0x72, 0x49, 0x92, + 0x71, 0x8e, 0x8e, 0x71, 0x8e, 0x71, 0x71, 0x8e, 0x49, 0x92, 0x4e, 0x72, + 0xb0, 0x0d, 0x90, 0x09, 0x90, 0x09, 0x60, 0x06}; diff --git a/ext/tk/sample/demos-jp/images/tcllogo.gif b/ext/tk/sample/demos-jp/images/tcllogo.gif Binary files differnew file mode 100644 index 0000000000..3fc7720b17 --- /dev/null +++ b/ext/tk/sample/demos-jp/images/tcllogo.gif diff --git a/ext/tk/sample/demos-jp/images/teapot.ppm b/ext/tk/sample/demos-jp/images/teapot.ppm new file mode 100644 index 0000000000..78afefbf82 --- /dev/null +++ b/ext/tk/sample/demos-jp/images/teapot.ppm @@ -0,0 +1,56 @@ +P6 +256 256 +255 +\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[7 eOLjQLmSMoTMnSMlRMhPL_9 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\nSMtVMzYN~[N~[N\N\O\O]O]O]O]O\O\O}[NyYNtVM\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\G-wXN}[N]O^O_O`O`O`O`OaOaOaOaOaOaOaOaO`O_O^O\N\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\aMLyYN_OaPbPcPcPdPdPdPdPdPdPdPdPdPePePePePePdPcP_OpUM\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\wXN_OdPfPgQhQhQiQiQiQiQiQjQjQjQjQjQjQjQjQjQjQiQfP`O\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\NCJiQLbPhQkQmRnRoRoRoRoRoRoRoRoRpRpSqSqSrSrSrSqSoRjQ]O\KK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\fOLrUMcPlRqStSuTwTxTxTyTyTzTzUzUzUzUzUyTxTwTtSmRaOhPL\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\a0 cNLqUM\OfQpSwVzV|V}VVVVW[ew螽gqTfQ{ZNYIK9\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\O1{G#JkRMqUMtVNiSv\dbzZvUuTsSqSnRjQeP^OrUMHh>!T4\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\G-V5wE"~I#M%U+e7l:g2b*a(`(^(])^-]1S,qC$`9 R3G-\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\@)J/i>!pA"tD"wF$yH&xH&tE$wE#yG%}M+T4S5mE*Z7!K/B*;'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\aOoR{UVX<(F-a: e<!h>!j@#k@$h>"d<!c=$hD-fF2[<)K0@);'5$VV|U_LKYIK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_OxTW鵯k|X>f-^(Z'W&T&N>)F-J/b; g>#nD(jB&c<!b=%jH2_A/I0!<(8&5$JYS%8&;'?)E,<:HA=HE?IJAISFJYIKXIK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\寸nR}UqevUe,V&VC +@|>y<u:r9o7l6 +j5 +h4 +g3 +5$D,K/b; h>"wM1tK.e="a<#cA,U8&E-<(9&.!a0 b1 c1 + ++3#@)46G<:HMCIXHK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\U*vT~X{Yk+W&N$|>u:p8k5 +f3 +a0 _/ ]. [- I\*_(LkRMmSMmSMnSMnSMD,R3W5mA"|O0|P1j?"c<!a=%Y7"N1F,;'NCJNCJNDJODJODJODJh>!a: X/K% +g3 +a0 Z- \/T*Q(Hm8kRMmSMnTMoTMpTMpUM15G15G05G04G04GpUMpTM5^9 d<!yF#O+N,rC#qB"pB#k?"a: Z7 6ODJPDJPEJQEJQEJREJREJREJRFJSFJSFJSFJSFJe<!X/ +^/ V+Q(L&I$r9TlRMnSM46G47G47G46G46G46G46G46G36G36G25G25G15G04G/4F.3F +`O~[NqUM[- HUGJUGJVGJVGJVHJWHJWHJWHKWHKXHKXHKXHKXHKXHKXIKXIKXIKXIKXIKh>!Y0 + +L&C!:4 +X&pUMuWMwXNxXN<:H<:H<:H<:H<;H<;H<;H<;H=;H=;H=;H=;H>;H>;H?<H@<HA=HC>HG@ILBIREJ[JKcNLjQLpRuTzU~VWXcse{VvTpSkRgQbP_O^O]O\O\O\O\O]O]O]O]O]O]O]O]O]O]O]O\O\O~\N}[N|ZNxXNT%H$ +W&rVMvWNyYNzYN|ZN}[N}[N><H?<H?<H?<H?<H?<H@<H@<H@<HA=HA=HB=HC>HE?IG@IIAIKBIODJSFJWHKhQlRpRb(i*n+|7|6r,q+p-l+g)b(sSpSlRiQgQePcPaPaO`O`O_O_O_O_O_O_O_O_O_O_O^O^O^O^O]O]O\O~[N{ZNT% + + + + +@%<-$G?@pfdNLuWM\NdNL\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\TFJvWNaP./01E}[N]O_O`OaPbPbPcPcPcPdPdPdPePePePePfPfQfQgQgQgQhQhQhQiQiQjQjQkQkRlRlRY&\'^'^bcei gcba`^]X['Z'Y&mRmRmRlRlRlRkRkQkQjQjQjQiQiQiQiQhQhQhQhQgQgQgQgQgQfQfQfQfPePePdPcPaPO + B\\\\\\\\\\%7!!C*F#P){dYzep\OgPL\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\SFJ`LKvWNaPm6 + +\\\\\\\\\ B B +$5 `(e)nRjQ^OJAI\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\XIK^KKdNLhPLuWM]ObPfQeP +m6 +`OcPfQhQhQiQiQjQjQjQjQjQjQjQkQkQkQkRkRkRkRlRlRlRlRlRlRlRmRmRmRmRg)c(c(b(Vcei!i!db``__^Q]'_(`(f)nRnRnRnRnRnRnRnRnRnRnRnRnRmRmRmRmRmRmRmRmRmRnRmRmRnRmRmRmRmRkRhQGa0 bPmRjQfQaP}[NrUMmSML$\\\\\\\\ B B +#C, 8&H.Z7 pRjQ{ZN\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\QEJ[JK`LKdNLhQLqUM{ZN_OcPgQhQ +bPePhQiQjQjQkQkQkRkRkRlRlRlRlRlRlRlRlRlRlRmRmRmRmRmRmRmRmRmRnRnRj*g)e)d)dXghecbbbU`(a(a(c(i*oRoRnRnRnRnRnRnRnRnRnRnRnRnRnRnRnRoRoRoRoRoRoRoRoRoRoRoRoRnRmRjQQ%Z- jQnRlRhQdP_OuWMpTMnSMkRLa: \\\\\\\ B B&D2 +@*S6#G@IPDJhQmSM\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\VGJ]KKbMLeOLiQLlRMvWN\OaOePhQjQgQ +\\\\\ B'D+E$(1J/jH1NCJUGJYIKUGJ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\XHK]KKbNLfOLiQLkRMmSMoTMqUMxXN\N_ObPfPhQkQmRoRpSpRhQmRoRpSqSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSsSsSsSsSsSsSsSsSsSsSsSsStStStSuSuSuTuTuTuTuTvTwTvTvTuTtSmRtSuTuStSrSpRmRkQhQePaP^O\N{ZNvXNqUMpTMnSMlRMP%\\\\ B#C*E$.E- .!G$Y:%d<"SFJYIKZIKNCJ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\PDJZIK_LKdNLgPLjQLlRMnSMpTMqUMuWMyYN\O`OcPfPhQjQmRoRqSrSrSrSmR +!C+E'0F.4F7%8%U/lG.SFJZIK]KKZIKB=H\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\REJZJK`LKdNLgPLjQLlRMnSMpTMqUMtWMxXN{ZN~[N]O^O`OaObPdPgQiQkQlRnRpSrSsStTuTvTwTxTyTyTyTyTyTxTvTrSnRhQ|U|U|U|U|U|U|U|U|U|U|U|U|U|U}U}U}U}U}U}U}U~U~U~V~VVWXa(lRrSvTyTzU|U~VX[_djmnlhd_{[vWsUpSnRkRiQhQgQfQePdPbPaO_O^O\O|ZNxXNsVMpTMnTMmSMjQLC B)D&/F-3F47G6%>"Y7 kA$YIK]KK^KKSFJ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\VGJ\KKbMLeOLhPLkRLmSMnTMpTMrUMuWNyYN|ZN\N]O_O`OaPbPcPePfPhQjQlRnRoSqTsTuUvUwVxVyVyUzUzU{U{U{U|U|U|U|U|U{U{U{UzUzTyTyTxTwTvTvTvTvTwTwTwTxTyTzTzU{U{U|U|U}UVWY\_dlu脾|讒鍖遶覈网{sld^yZuWqUoSlRkRjQiQhQgQfQePdPcPaP`O^O]O}[NyYNuWMpTMoTMmSMkRLgPL&D#.E,3F46G;'<(D"iB(VGJ]KK`LK[JKB>H\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\NCJYIK^LKcNLfOLiQLkRMmSMoTMqUMsVMvXNzYN}[N\O^O_O`OaPcPdPePfQgQhQiQkRmSoTrUtWwYzZ}\]^^^^\ZYX~W~W~V~V~V~V~U~U~U~UUUVVVVVVVWWXZ[^adint茖z遘鶩餘薊燹~vmf`z[vXrUpToSnSlRkRkRjQiQhQfQePdPcPbP`O_O]O~[NzYNvWNpTMoTMnSMkRMhQLo7,2F36G99HC+@ ]8 nA"\JK`ML_LKSFJ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\SFJ[JK`LKdNLgPLjQLlRMnSMpTMqUMtVMwXNzZN}[N]O^O_OaObPcPdPePfQgQhQiQjRlRmSoUrWvZ{]afjnqssrqomjgca^\[YXWWWVVWWWXY[\_aehmqv筺z腓}螂覃覈薑絅|wrmhc~^yZvXtWsVqUpToSnSmRlRkRjQiQhQgQfPePcPbPaO_O^O\N{ZNwXNsVMoTMnSMlRMiQL~I#26G99G?<HA*E$ i@$ZIKaMLbML[JK;:H\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\WHJ]KKbMLeOLhPLjRLlSMnTMpTMrUMuWMxXN{ZN~\N]O^O`OaObPcPdPePfQgQhQiQkRlSmToUrWuZy]~aflsz棔礑茫覡躁蹼覓荐磽~ytojfb_\ZYXW~W~W~WXXYZ\^`bdfgijjjigda^}]|\{[yZxYvXtWsVqUpToSnSmRlRkRjQiQhQgQfPePdPbPaO_O^O\O|ZNxXNtVMpTMnSMmSMjQLgPL99G?<HG-E&b;!YIK`MLdOM`LKNCJ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\lRyT~UXYX{WtUW'[(hQlRcP\OhQL\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\NCJYIK^LKcNLfOLiQLkRLmSMoTMqUMrVMvWNyYN|ZN\N]O_O`OaPbPcPdPfPgQhQiQjRkRlSnTpUsWvZz]bglsy泙礬茘豈鏗鏗遽覘腥癸ztnid`][~Y}X|W|V{V{V{V{V{V|W|W}X}Y~Z~Z~Z}[}[}[~\~\~]~]~]~]}]|\z[yZwYvXtWsVrUpToSnSmRlRkRjQiQhQgQfQePdPcPaP`O^O]O}[NyYNuWNpTMnTMmSMkRLhPL|H$D>IQ2P+XHK_LLfQOcNLXIK\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\制qSyT~V`鍮v]qSLG|>g3 +S)?*%.hQhQeP`OuWM\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\SFJ[JK`LKdNLgPLjQLlRMnSMoTMqUMsVMwXNzYN}[N\O^O_O`OaPbPdPePfPgQhQiQjRkRlSnTpVsXvZz^bgmsz泙礬茘蟄鰢鬠茗紲爐|wqlgb_\}Z{XzWyVyUxUxUxTxTxUxUxUyVyVyWzW{X{Y|Z}[}[}\~\~]~]}]|\{\z[yZwYvXtWsVrUpToSnSmRlRkRjQiQhQgQfQePdPcPbP`O_O]O~[NzZNvWNrUMoTMmSMlRMiQLeOLJAIJ(h>!]KKfQOgQN_LKD>I\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\iQtSyT{UYe鎰u|\Z'LD +|> + ++,!.! "`E6iYlZo\q]s^^Jvawbyczd{e}foTMqUMsVMuWNwXNyYN{ZN|ZN~[N\O]O]O^O_O_O`O`OaOaPbPbPcPcPcPdPdPdPdPePePePePePePePePfPfPfPfPfPfPfPePePePePePePePdPdPdPdPcPcPcPbPbPaPaO`O`O_O_O^O]O]O\O~[N|[N{ZNyYNwXNiiiihhRfQdQbPwfx]Opdkbtd_m`]OEDG?A;:@.S.S.S.S.S/S/S/S/S/S/S/S/STxTxTxTxTxTxTxTxTy/SGlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlVVVVぶぶぶぶぶEiぶぶぶぶぶぶぶぶぶぶぶぶぷぷぷぷプププBgBgBgBgBg&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|BfBfBfBfBfBfBfBfBfAfAf%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%I|%I|%I|%I|%I|%I| ++,YA5jPBpSDl[o]q^t`_Kwbycze{f}ghilSrVMtWMvWNxXNyYN{ZN|[N~[N\O]O]O^O_O_O`O`O`OaPaPbPbPbPcPcPcPcPdPdPdPdPdPdPdPdPePePePePePdPdPdPdPdPdPdPcPcPcPcPbPbPbPaPaO`O`O`O_O^O^O]O]O\O~[N|[N{ZNyYNxXNjjjjjjhSgSeRcR|`Qsfoe}jcrd`k_]LCDC=@,,3(4F(4F.S.S/S/S/S/S/S/S/STxTxTxTxTxTxTxTxTxTyTyTyHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlChChぶぶぶぶぶEiEiEiぶぶぶぶぶぶぷぷぷぷCgCgCgCgCgCgCgCgCgCgCgCgBgBg&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|BfBfBfBfBfBfBfBfBfBfBfBfBfBfBf&J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%I|%I|%I|%I|%I|#5H71O;3V?4iOBoSDsVFo]{[I^K`LbNdO{f}g~hjkTmUoVqWrWwXNxXNzYN{ZN}[N~[N\O]O]O^O^O_O_O`O`O`OaOaPaPbPbPbPbPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPcPbPbPbPbPaPaPaO`O`O_O_O_O^O^O]O\O\N~[N|ZN{ZNyYNoToToTnTllljUiThTfTcSvirgnfyidqdah^^HBD?<@)+3OZkMYk(5F(5F(5F/S/S/S/S/STxTxTxTxTxTxTxTxTyTyTyTyUyHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlDhDhDhCh&K}&K}&K}&K}&K}&K}ChChCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCg&J|&J|&J|&J|&J|&J|BgBgBgBfBfBfBfBfBfBfBfBfBfBfBfBfBfBfBf&J|&J|&J|&J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%J|%I|%I|A99N?;L:2T>4gNBlRDk\n^z[J~^LaNcOdPfQgRhTjUlVnWpXrXsYqqrrrsz[z[z[{[{[{ZrqqppoyVxVxUwTwTaPbPbPbPbPbPbPbPbPbPbPbPbPbPaPaPaPaPaOaO`O`O`O_O_O^O^O^O]O]O\O~\N}[N|ZNzYNpTpUpUpUoVoVnVmVlVkVjVhVfU~cUujqh~mfugdkaad\^E@D98?$(2minffm^blV^lMYk(5F(5F/STxTxTxTxTxTxTxTxTxTyTyTyUyUyHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHlHl'K}'K}'K}'K}'K}'K}'K}'K}'K}&K}&K}ChChChChChChChCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCgCg&J|CgCgCgCgCgBgBgBgBgBgBgBfBfBfBfBfBfBfBfBfBfBfBfBf&J|&J|&J|&J|&J|&J|&J|%J|%J|%J|%J|%J|%J|%J|AeAe;GY<68I=:I82Q=4XA6~fZj\m^p`|]L`NcPeQgSjlmnoXqYrZt[rsstttz]{]{]{\{\{\{[srrqppyWonmllkkaOaOaOaOaOaOaO`O`O`O`O`O`O_O_O_O_O^O^O]O]O]O\O~\N}[N|ZNllmqVqVqVpWpWoWnnnnn~neWxltkpiykfodcf_`JDG@>C*,5$1MYktr~tstmolinadmX_lNZkMZkTxTxTxTxTxTxTxTyTyTyUyUyUyHlHlHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHm'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}'K}DhDhDhDhChChChChChChChCgCgCgCgCgCgCgCgCgCgCg&J}&J}&J}CgCgCgCgCgCgCgCgCgCgBgBgBgBgBgBgBfBfBfBfBfBfBfBfBf&J|&J|&J|&J|&J|&J|&J|&J|&J|&J|AfAfAfAf;GY;GY;GY1'!D:9N?;N;3]I?zdYh[l^oascuebQdRfTlmnopqrsv]w]uuuuv{^{^|^|]|]{\{\{[{[zZzZyYyXxXonnmmuTuStStStRsRsQ_O_O_O^O^O^O^O^O]O]O]OrSrSrSkllmmmnnqWqXqXooppppp}o{cXv`Vp]U}nishfhaba\_DAF::B$)4 +., 7(8'A1&F4(L8*oXIw]Jpdasfcvhexkg{mi~ojqll\Xn^Yp`Zpa[qa\rb]rc^sc^sd_ue`wf`xgayhayhayhbxyyyyyy~ywgbvfateasd`qd`pc`nb_la_ut|ssxqrunpZUXVRWROUMMSHIRIC@967-/3'+0(*-ACF?AD;=@#%( +.+>1(B3)B2&F4'E4)gTGlXJs^OzcTzaPqfethgvjhbVTcWUdXVeYWfZXg[Yh\Zi]Zi][j^\usususts~tt~tt}tt|st{stut~tt|sszrsyqrwpquoqsmpqloXTXTQWPOULLSSJEA<:=99757335./2113)+.'),)+.8:="( +"6*#5*">2)>0&A2'C3(I8-^OFbRHfUJjXMq^RwcVzfYfRDfQCdN@zdTqijrjksklrklrklrklqjmpjmpjmojmojmnimmimkhliflscYm`Xg\VbYT^VRE>;A<:>98:77645:873220/0,-/)+.*,/#%( & + +&3#.$-% .% .& /&!,#,#@70A71XNHXNHWNHWNHZRLYQLYQLXQLWQLWPLUOLSNLQMKOLJMJJ0//.-.,,-&(+"(!' + +%' %$#" ! !$ + + + + + +* + ;?E7CU;HY=I[ diff --git a/ext/tk/sample/demos-jp/items.rb b/ext/tk/sample/demos-jp/items.rb new file mode 100644 index 0000000000..84e561f27c --- /dev/null +++ b/ext/tk/sample/demos-jp/items.rb @@ -0,0 +1,372 @@ +# +# canvas item types widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($items_demo) && $items_demo + $items_demo.destroy + $items_demo = nil +end + +# demo 用の toplevel widget を生成 +$items_demo = TkToplevel.new {|w| + title("Canvas Item Demonstration") + iconname("Items") + positionWindow(w) +} + +# label 生成 +TkLabel.new($items_demo) { + font $font + wraplength '5i' + justify 'left' + text "このウィンドウにはキャンバス widget が入っており、その中にはキャンバス widget がサポートする様々なタイプのアイテムの例が入っています。次のような操作ができます。\n ボタン-1 ドラッグ:\tアイテムを動かす。\n ボタン-2 ドラッグ:\t見えている部分をずらす。\n ボタン-3 ドラッグ:\t領域を囲う。\n コントロール-F:\t領域の下のアイテムを表示する。" +}.pack('side'=>'top') + +# frame 生成 +TkFrame.new($items_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $items_demo + $items_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'items'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 生成 +cvs = nil +TkFrame.new($items_demo) {|cf| + # canvas 生成 + cvs = TkCanvas.new(cf) {|c| + focus + scrollregion '0c 0c 30c 24c' + width '15c' + height '10c' + relief 'sunken' + borderwidth 2 + + hs = TkScrollbar.new(cf) {|s| + orient 'horizontal' + command proc{|*args| c.xview(*args)} + c.xscrollcommand proc{|first,last| s.set first,last} + } + + vs = TkScrollbar.new(cf) {|s| + command proc{|*args| c.yview(*args)} + c.yscrollcommand proc{|first,last| s.set first,last} + } + + if $tk_version =~ /^4\.[01]/ + hs.pack('side'=>'bottom', 'fill'=>'x') + vs.pack('side'=>'right', 'fill'=>'y') + c.pack('in'=>cf, 'expand'=>'yes', 'fill'=>'both') + + else + c.grid('in'=>cf, 'row'=>0, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + vs.grid('row'=>0, 'column'=>1, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + hs.grid('row'=>1, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + TkGrid.rowconfigure(cf, 0, 'weight'=>1, 'minsize'=>0) + TkGrid.columnconfigure(cf, 0, 'weight'=>1, 'minsize'=>0) + + end + + } +}.pack('side'=>'top', 'fill'=>'both', 'expand'=>'yes') + +# Display a 3x3 rectangular grid +TkcRectangle.new(cvs, '0c', '0c', '30c', '24c', 'width'=>2) +TkcLine.new(cvs, '0c', '8c', '30c', '8c', 'width'=>2) +TkcLine.new(cvs, '0c', '16c', '30c', '16c', 'width'=>2) +TkcLine.new(cvs, '10c', '0c', '10c', '24c', 'width'=>2) +TkcLine.new(cvs, '20c', '0c', '20c', '24c', 'width'=>2) + +font1 = '-Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*' +font2 = '-Adobe-Helvetica-Bold-R-Normal--*-240-*-*-*-*-*-*' +if TkWinfo.depth($root).to_i > 1 + blue = 'DeepSkyBlue3' + red = 'red' + bisque = 'bisque3' + green = 'SeaGreen3' +else + blue = 'black' + red = 'black' + bisque = 'black' + green = 'black' +end + +# tag オブジェクトを生成 +$tag_item = TkcGroup.new(cvs) + +# Set up demos within each of the areas of the grid. +TkcText.new(cvs, '5c', '.2c', 'text'=>'ライン', 'anchor'=>'n') +TkcLine.new(cvs, '1c', '1c', '3c', '1c', '1c', '4c', '3c', '4c', + 'width'=>2, 'fill'=>blue, 'capstyle'=>'butt', + 'join'=>'miter', 'tags'=>$tag_item ) +TkcLine.new(cvs, '4.67c','1c','4.67c','4c', 'arrow'=>'last', 'tags'=>$tag_item) +TkcLine.new(cvs, '6.33c','1c','6.33c','4c', 'arrow'=>'both', 'tags'=>$tag_item) +TkcLine.new(cvs, '5c','6c','9c','6c','9c','1c','8c','1c','8c','4.8c','8.8c', + '4.8c','8.8c','1.2c','8.2c','1.2c','8.2c','4.6c','8.6c','4.6c', + '8.6c','1.4c','8.4c','1.4c','8.4c','4.4c', + 'width'=>3, 'fill'=>red, 'tags'=>$tag_item ) +TkcLine.new(cvs, '1c','5c','7c','5c','7c','7c','9c','7c', 'width'=>'.5c', + 'stipple'=>'@'+[$demo_dir, + 'images','gray25.bmp'].join(File::Separator), + 'arrow'=>'both', 'arrowshape'=>'15 15 7', 'tags'=>$tag_item ) +TkcLine.new(cvs, '1c','7c','1.75c','5.8c','2.5c','7c','3.25c','5.8c','4c','7c', + 'width'=>'.5c', 'capstyle'=>'round', 'join'=>'round', + 'tags'=>$tag_item ) + +TkcText.new(cvs, '15c', '.2c', + 'text'=>'曲線 (滑らかにつないだ直線)', 'anchor'=>'n') +TkcLine.new(cvs, '11c','4c','11.5c','1c','13.5c','1c','14c','4c', + 'smooth'=>'on', 'fill'=>blue, 'tags'=>$tag_item ) +TkcLine.new(cvs, '15.5c','1c','19.5c','1.5c','15.5c','4.5c','19.5c','4c', + 'smooth'=>'on', 'arrow'=>'both', 'width'=>3, 'tags'=>$tag_item ) +TkcLine.new(cvs, '12c','6c','13.5c','4.5c','16.5c','7.5c','18c','6c', + '16.5c','4.5c','13.5c','7.5c','12c','6c', + 'smooth'=>'on', 'width'=>'3m', 'capstyle'=>'round', + 'stipple'=>'@'+[$demo_dir, + 'images', 'gray25.bmp'].join(File::Separator), + 'fill'=>red, 'tags'=>$tag_item ) + +TkcText.new(cvs, '25c', '.2c', 'text'=>'多角形', 'anchor'=>'n') +TkcPolygon.new(cvs, '21c','1.0c','22.5c','1.75c','24c','1.0c','23.25c','2.5c', + '24c','4.0c','22.5c','3.25c','21c','4.0c','21.75c','2.5c', + 'fill'=>'green', 'outline'=>'black', 'width'=>4, + 'tags'=>$tag_item ) +TkcPolygon.new(cvs, '25c','4c','25c','4c','25c','1c','26c','1c','27c','4c', + '28c','1c','29c','1c','29c','4c','29c','4c', + 'fill'=>red, 'smooth'=>'on', 'tags'=> $tag_item) +TkcPolygon.new(cvs, '22c','4.5c','25c','4.5c','25c','6.75c','28c','6.75c', + '28c','5.25c','24c','5.25c','24c','6.0c','26c','6c','26c', + '7.5c','22c','7.5c', + 'stipple'=>'@' + [$demo_dir, + 'images', 'gray25.bmp'].join(File::Separator), + 'outline'=>'black', 'tags'=>$tag_item ) + +TkcText.new(cvs, '5c', '8.2c', 'text'=>'矩形', 'anchor'=>'n') +TkcRectangle.new(cvs, '1c','9.5c','4c','12.5c', + 'outline'=>red, 'width'=>'3m', 'tags'=>$tag_item) +TkcRectangle.new(cvs, '0.5c','13.5c','4.5c','15.5c', + 'fill'=>green, 'tags'=>$tag_item ) +TkcRectangle.new(cvs, '6c','10c','9c','15c', 'outline'=>'', + 'stipple'=>'@'+[$demo_dir, + 'images','gray25.bmp'].join(File::Separator), + 'fill'=>blue, 'tags'=>$tag_item ) + +TkcText.new(cvs, '15c', '8.2c', 'text'=>'楕円', 'anchor'=>'n') +TkcOval.new(cvs, '11c','9.5c','14c','12.5c', + 'outline'=>red, 'width'=>'3m', 'tags'=>$tag_item) +TkcOval.new(cvs, '10.5c','13.5c','14.5c','15.5c', + 'fill'=>green, 'tags'=>$tag_item ) +TkcOval.new(cvs, '16c','10c','19c','15c', 'outline'=>'', + 'stipple'=>'@'+[$demo_dir, + 'images','gray25.bmp'].join(File::Separator), + 'fill'=>blue, 'tags'=>$tag_item ) + +TkcText.new(cvs, '25c', '8.2c', 'text'=>'テキスト', 'anchor'=>'n') +TkcRectangle.new(cvs, '22.4c','8.9c','22.6c','9.1c') +TkcText.new(cvs, '22.5c', '9c', 'anchor'=>'n', 'font'=>font1, 'width'=>'4c', + 'text'=>'短いテキスト。ワードラップ、左揃え、アンカーは北 (上)。\ +□は各テキストのアンカーポイントを示す。', 'tags'=>$tag_item ) +TkcRectangle.new(cvs, '25.4c','10.9c','25.6c','11.1c') +TkcText.new(cvs, '25.5c', '11c', 'anchor'=>'w', 'font'=>font1, 'fill'=>blue, + 'text'=>'いくつかの行。\nそれぞれ独立に\n行揃え。\n\ +全て左端がアンカーされている。', 'justify'=>'center', 'tags'=>$tag_item ) +TkcRectangle.new(cvs, '24.9c','13.9c','25.1c','14.1c') +if $tk_version =~ /^4\.[01]/ + TkcText.new(cvs, '25c', '14c', 'anchor'=>'c', 'font'=>font2, 'fill'=>red, + 'stipple'=>'@' + [$demo_dir, + 'images', 'grey.5'].join(File::Separator), + 'text'=>'Stippled characters', 'tags'=>$tag_item ) +else + TkcText.new(cvs, '25c', '14c', 'anchor'=>'c', 'font'=>font2, 'fill'=>red, + 'stipple'=>'gray50', 'text'=>'Stippled characters', + 'tags'=>$tag_item ) +end + +TkcText.new(cvs, '5c', '16.2c', 'text'=>'弧', 'anchor'=>'n') +TkcArc.new(cvs, '0.5c','17c','7c','20c', 'fill'=>green, 'outline'=>'black', + 'start'=>45, 'extent'=>270, 'style'=>'pieslice', 'tags'=>$tag_item) +#TkcArc.new(cvs, '6.5c','17c','9.5c','20c', 'width'=>'4m', 'style'=>'arc', +# 'outline'=>blue, 'start'=>135, 'extent'=>270, +# 'outlinestipple'=>'@' + ['images', 'grey.25'].join(File::Separator), +# 'tags'=>$tag_item) +TkcArc.new(cvs, '6.5c','17c','9.5c','20c', 'width'=>'4m', 'style'=>'arc', + 'outline'=>blue, 'start'=>135, 'extent'=>270, + 'outlinestipple'=>'@'+[$demo_dir, + 'images','gray25.bmp'].join(File::Separator), + 'tags'=>$tag_item) +TkcArc.new(cvs, '0.5c','20c','9.5c','24c', 'width'=>'4m', 'style'=>'pieslice', + 'fill'=>'', 'outline'=>red, 'start'=>225, 'extent'=>90, + 'tags'=>$tag_item) +TkcArc.new(cvs, '5.5c','20.5c','9.5c','23.5c', 'width'=>'4m', 'style'=>'chord', + 'fill'=>blue, 'outline'=>'', 'start'=>45, 'extent'=>270, + 'tags'=>$tag_item) + +TkcText.new(cvs, '15c', '16.2c', 'text'=>'ビットマップ', 'anchor'=>'n') +#TkcBitmap.new(cvs, '13c','20c', +# 'bitmap'=>'@' + ['images', 'face'].join(File::Separator), +# 'tags'=>$tag_item) +TkcBitmap.new(cvs, '13c','20c', + 'bitmap'=>'@' + [$demo_dir, + 'images', 'face.bmp'].join(File::Separator), + 'tags'=>$tag_item) +#TkcBitmap.new(cvs, '17c','18.5c', +# 'bitmap'=>'@' + ['images', 'noletters'].join(File::Separator), +# 'tags'=>$tag_item) +TkcBitmap.new(cvs, '17c','18.5c', + 'bitmap'=>'@' + [$demo_dir, + 'images', 'noletter.bmp'].join(File::Separator), + 'tags'=>$tag_item) +#TkcBitmap.new(cvs, '17c','21.5c', +# 'bitmap'=>'@' + ['images', 'letters'].join(File::Separator), +# 'tags'=>$tag_item) +# ↓の形式でも可能 +TkcBitmap.new(cvs, '17c','21.5c') { + bitmap '@' + [$demo_dir, 'images', 'letters.bmp'].join(File::Separator) + tags $tag_item +} +#TkcBitmap.new(cvs, '17c','21.5c') { +# bitmap '@' + ['images', 'letters'].join(File::Separator) +# tags $tag_item +#} + +TkcText.new(cvs, '25c', '16.2c', 'text'=>'ウィンドウ', 'anchor'=>'n') +TkButton.new(cvs) {|b| + text '押してね' + command proc{butPress cvs, red} + TkcWindow.new(cvs, '21c','18c', + 'window'=>b, 'anchor'=>'nw', 'tags'=>$tag_item) +} +TkEntry.new(cvs, 'width'=>20, 'relief'=>'sunken') {|e| + insert 'end', '編集してね' + TkcWindow.new(cvs, '21c','21c', + 'window'=>e, 'anchor'=>'nw', 'tags'=>$tag_item) +} +TkScale.new(cvs, 'from'=>0, 'to'=>100, 'length'=>'6c', 'sliderlength'=>'.4c', + 'width'=>'.5c', 'tickinterval'=>0 ) {|s| + TkcWindow.new(cvs, '28.5c','17.5c', + 'window'=>s, 'anchor'=>'n', 'tags'=>$tag_item) +} +TkcText.new(cvs, '21c', '17.9c', 'text'=>'ボタン:', 'anchor'=>'sw') +TkcText.new(cvs, '21c', '20.9c', 'text'=>'エントリ:', 'anchor'=>'sw') +TkcText.new(cvs, '28.5c', '17.4c', 'text'=>'スケール:', 'anchor'=>'s') + +# Set up event bindings for canvas: +cvs.itembind($tag_item, 'Any-Enter', proc{itemEnter cvs}) +cvs.itembind($tag_item, 'Any-Leave', proc{itemLeave cvs}) +cvs.bind('2', proc{|x,y| cvs.scan_mark x,y}, '%x %y') +cvs.bind('B2-Motion', proc{|x,y| cvs.scan_dragto x,y}, '%x %y') +cvs.bind('3', proc{|x,y| itemMark cvs,x,y}, '%x %y') +cvs.bind('B3-Motion', proc{|x,y| itemStroke cvs,x,y}, '%x %y') +cvs.bind('Control-f', proc{itemsUnderArea cvs}) +cvs.bind('1', proc{|x,y| itemStartDrag cvs,x,y}, '%x %y') +cvs.bind('B1-Motion', proc{|x,y| itemDrag cvs,x,y}, '%x %y') +# Utility methods for highlighting the item under the pointer + +$restoreCmd = nil +def itemEnter (c) + if TkWinfo.depth(c).to_i == 1 + $restoreCmd = nil + return + end + type = c.itemtype('current') + if type == TkcWindow + $restoreCmd = nil + return + end + if type == TkcBitmap + bg = (c.itemconfiginfo('current', 'background'))[4] + $restoreCmd = proc{c.itemconfigure 'current', 'background', bg} + c.itemconfigure 'current', 'background', 'SteelBlue2' + return + end + fill = (c.itemconfiginfo('current', 'fill'))[4] + if (type == TkcRectangle || type == TkcOval || type == TkcArc) && fill == [] + outline = (c.itemconfiginfo('current', 'outline'))[4] + $restoreCmd = proc{c.itemconfigure 'current', 'outline', outline} + c.itemconfigure 'current', 'outline', 'SteelBlue2' + else + $restoreCmd = proc{c.itemconfigure 'current', 'fill', fill} + c.itemconfigure 'current', 'fill', 'SteelBlue2' + end +end + +def itemLeave(c) + $restoreCmd.call if $restoreCmd +end + +# Utility methods for stroking out a rectangle and printing what's +# underneath the rectangle's area. + +def itemMark(c,x,y) + $areaX1 = c.canvasx(x) + $areaY1 = c.canvasy(y) + c.delete 'area' +end + +def itemStroke(c,x,y) + x = c.canvasx(x) + y = c.canvasy(y) + if $areaX1 != x && $areaY1 != y + c.delete 'area' + c.addtag_withtag 'area', TkcRectangle.new(c, $areaX1, $areaY1, x, y, + '-outline', 'black') + $areaX2 = x + $areaY2 = y + end +end + +def itemsUnderArea(c) + area = c.find_withtag('area') + items = [] + c.find_enclosed($areaX1,$areaY1,$areaX2,$areaY2).each{|i| + items.push(i) if i.gettags.include?($tag_item) + } + print "Items enclosed by area: #{items.inspect}\n"; STDOUT.flush + items.clear + c.find_overlapping($areaX1,$areaY1,$areaX2,$areaY2).each{|i| + items.push(i) if i.gettags.include?($tag_item) + } + print "Items overlapping area: #{items.inspect}\n"; STDOUT.flush +end + +$areaX1 = 0 +$areaY1 = 0 +$areaX2 = 0 +$areaY2 = 0 + +# Utility methods to support dragging of items. + +def itemStartDrag(c,x,y) + $lastX = c.canvasx(x) + $lastY = c.canvasy(y) +end + +def itemDrag(c,x,y) + x = c.canvasx(x) + y = c.canvasy(y) + c.move 'current', x - $lastX, y - $lastY + $lastX = x + $lastY = y +end + +# Method that's invoked when the button embedded in the canvas +# is invoked. + +def butPress(w,color) + i = TkcText.new(w, '25c', '18.1c', + 'text'=>'いてて!!', 'fill'=>color, 'anchor'=>'n') + Tk.after(500, proc{w.delete i}) +end diff --git a/ext/tk/sample/demos-jp/ixset b/ext/tk/sample/demos-jp/ixset new file mode 100644 index 0000000000..5391012cfb --- /dev/null +++ b/ext/tk/sample/demos-jp/ixset @@ -0,0 +1,333 @@ +#!/usr/local/bin/ruby + +# ixset -- +# A nice interface to "xset" to change X server settings +# + +require 'tk' + +class Xsettings + # + # Button actions + # + def quit + @root.destroy + end + + def ok + writesettings + quit + end + + def cancel + readsettings + dispsettings + end + + # apply is just "writesettings" + + + # + # Read current settings + # + def readsettings + xfd = open("|xset q", 'r') + xfd.readlines.each{|line| + fields = line.chomp.strip.split(/\s+/) + case fields[0] + when "auto" + if fields[1] == 'repeat:' + @kbdrep = fields[2] + @w_kbdrep.set(@kbdrep) + @kbdcli = fields[6] + end + + when "bell" + @bellvol = fields[2] + @bellpit = fields[5] + @belldur = fields[8] + + when "acceleration:" + @mouseacc = fields[1] + @mousethr = fields[3] + + when "prefer" + if fields[2] == 'yes' + @screenbla = 'blank' + else + @screenbla = 'noblank' + end + @w_screenbla.set(@screenbla) + + when "timeout:" + @screentim = fields[1] + @screencyc = fields[3] + + end + } + + xfd.close + end + + # + # Write settings into the X server + # + def writesettings + @bellvol = @w_bellvol.get + @bellpit = @w_bellpit.get + @belldur = @w_belldur.get + + @kbdrep = @w_kbdrep.get + if @kbdrep == 'on' + @kbdcli = @w_kbdcli.get + else + @kbdcli = 'off' + end + + @mouseacc = @w_mouseacc.get + @mousethr = @w_mousethr.get + + @screentim = @w_screentim.get + @screencyc = @w_screencyc.get + @screenbla = @w_screenbla.get + + system("xset \ + b #{@bellvol} #{@bellpit} #{@belldur} \ + c #{@kbdcli} \ + r #{@kbdrep} \ + m #{@mouseacc} #{@mousethr} \ + s #{@screentim} #{@screencyc} \ + s #{@screenbla}") + end + + # + # Sends all settings to the window + # + def dispsettings + @w_bellvol.set(@bellvol) + @w_bellpit.set(@bellpit) + @w_belldur.set(@belldur) + + @w_kbdonoff.set(@w_kbdrep.get) + @w_kbdcli.set(@kbdcli) + + @w_mouseacc.set(@mouseacc) + @w_mousethr.set(@mousethr) + + @w_screenblank.set(@w_screenbla.get) + @w_screenpat.set(@w_screenbla.get) + + @w_screentim.set(@screentim) + @w_screencyc.set(@screencyc) + end + + # + # Create all windows, and pack them + # + class LabelEntry + def initialize(parent, text, length) + @frame = TkFrame.new(parent) + TkLabel.new(@frame, 'text'=>text).pack('side'=>'left','expand'=>'y') + @entry = TkEntry.new(@frame, 'width'=>length, 'relief'=>'sunken') { + pack('side'=>'left','expand'=>'y') + } + end + def pack(keys) + @frame.pack(keys) + end + def get + @entry.value + end + def set(value) + @entry.delete(0,'end') + @entry.insert(0, value) + end + end + + def createwindows + win = self + + # + # Buttons + # + buttons = TkFrame.new(@root) {|f| + [ TkButton.new(f, 'command'=>proc{win.ok}, 'text'=>'Ok'), + TkButton.new(f, 'command'=>proc{win.writesettings}, 'text'=>'Apply'), + TkButton.new(f, 'command'=>proc{win.cancel}, 'text'=>'Cancel'), + TkButton.new(f, 'command'=>proc{win.quit}, 'text'=>'Quit') ].each{|b| + b.pack('side'=>'left', 'expand'=>'yes', 'pady'=>5) + } + } + + # + # Bell settings + # + bell = TkFrame.new(@root, 'relief'=>'raised', 'borderwidth'=>2) + l = TkLabel.new(bell, 'text'=>'Bell Settings') + @w_bellvol = TkScale.new(bell, 'from'=>0, 'to'=>100, 'length'=>200, + 'tickinterval'=>20, 'orient'=>'horizontal', + 'label'=>"Volume (%)") + + f = TkFrame.new(bell) + @w_bellpit = LabelEntry.new(f, "Pitch (Hz)", 6) + @w_bellpit.pack('side'=>'left', 'padx'=>5) + @w_belldur = LabelEntry.new(f, "Duration (ms)", 6) + @w_belldur.pack('side'=>'right', 'padx'=>5) + + l.pack('side'=>'top', 'expand'=>'yes') + @w_bellvol.pack('side'=>'top', 'expand'=>'yes') + f.pack('side'=>'top', 'expand'=>'yes') + + # + # Keyboard settings + # + kbdonoff = nil + kbdcli = nil + kbd = TkFrame.new(@root, 'relief'=>'raised', 'borderwidth'=>2) + l = TkLabel.new(kbd, 'text'=>'Keyboard Repeat Settings') + f = TkFrame.new(kbd) + @w_kbdonoff = TkCheckButton.new(f, 'text'=>'On', 'relief'=>'flat', + 'onvalue'=>'on', 'offvalue'=>'off', + 'variable'=>@w_kbdrep ) { + def self.set(value) + if value == 'on' + self.select + else + self.deselect + end + end + pack('side'=>'left', 'expand'=>'yes', 'fill'=>'both') + } + @w_kbdcli = TkScale.new(f, 'from'=>0, 'to'=>100, 'length'=>200, + 'tickinterval'=>20, 'orient'=>'horizontal', + 'label'=>'Click Volume (%)') + @w_kbdcli.pack('side'=>'left', 'expand'=>'yes') + l.pack('side'=>'top', 'expand'=>'yes') + f.pack('side'=>'top', 'expand'=>'yes', 'pady'=>2, 'fill'=>'x') + + # + # Mouse settings + # + mouse = TkFrame.new(@root, 'relief'=>'raised', 'borderwidth'=>2) + l = TkLabel.new(mouse, 'text'=>'Mouse Settings') + f = TkFrame.new(mouse) + @w_mouseacc = LabelEntry.new(f, 'Acceleration', 3) + @w_mouseacc.pack('side'=>'left') + @w_mousethr = LabelEntry.new(f, 'Threshold (pixels)', 3) + @w_mousethr.pack('side'=>'right') + l.pack('side'=>'top') + f.pack('side'=>'top', 'expand'=>'yes') + + # + # Screen Saver settings + # + screen = TkFrame.new(@root, 'relief'=>'raised', 'borderwidth'=>2) + l = TkLabel.new(screen, 'text'=>'Screen-saver Settings') + f = TkFrame.new(screen) + ff1 = TkFrame.new(f) + [ @w_screenblank = TkRadioButton.new(ff1, 'text'=>'Blank', + 'relief'=>'flat', + 'variable'=>@w_screenbla, + 'value'=>'blank') { + def self.set(value) + if value == 'blank' + self.select + else + self.deselect + end + end + }, + @w_screenpat = TkRadioButton.new(ff1, 'text'=>'Pattern', + 'relief'=>'flat', + 'variable'=>@w_screenbla, + 'value'=>'noblank') { + def self.set(value) + if value != 'blank' + self.select + else + self.deselect + end + end + } + ].each {|w| w.pack('side'=>'top', 'pady'=>2, 'anchor'=>'w') } + + ff2 = TkFrame.new(f) + [ @w_screentim = LabelEntry.new(ff2, 'Timeout (s)', 5), + @w_screencyc = LabelEntry.new(ff2, 'Cycle (s)', 5) ].each{|w| + w.pack('side'=>'top', 'pady'=>2, 'anchor'=>'e') + } + + ff1.pack('side'=>'left') + ff2.pack('side'=>'left') + + l.pack('side'=>'top') + f.pack('side'=>'top', 'expand'=>'yes') + + # + # Main window + # + buttons.pack('side'=>'top', 'fill'=>'both') + bell.pack('side'=>'top', 'fill'=>'both', 'ipady'=>5, 'expand'=>'yes') + kbd.pack('side'=>'top', 'fill'=>'both', 'ipady'=>5, 'expand'=>'yes') + mouse.pack('side'=>'top', 'fill'=>'both', 'ipady'=>5, 'expand'=>'yes') + screen.pack('side'=>'top', 'fill'=>'both', 'ipady'=>5, 'expand'=>'yes') + + # + # Let the user resize our window + # + @root.minsize(10,10) + end + + def initialize + @root = TkRoot.new + + @kbdrep = 'on' + @w_kbdrep = TkVariable.new(@kbdrep) + def @w_kbdrep.get + self.value + end + def @w_kbdrep.set(val) + self.value=val + end + + @kbdcli = 0 + + @bellvol = 100 + @bellpit = 440 + @belldur = 100 + + @mouseacc = "3/1" + @mousethr = 4 + + @screenbla = "blank" + @w_screenbla = TkVariable.new(@screenbla) + def @w_screenbla.get + self.value + end + def @w_screenbla.set(val) + self.value=val + end + + @screentim = 600 + @screencyc = 600 + + # + # Listen what "xset" tells us... + # + readsettings + + # + # Create all windows + # + createwindows + + # + # Write xset parameters + # + dispsettings + end +end + +Xsettings.new + +Tk.mainloop diff --git a/ext/tk/sample/demos-jp/label.rb b/ext/tk/sample/demos-jp/label.rb new file mode 100644 index 0000000000..80ab5f3d8f --- /dev/null +++ b/ext/tk/sample/demos-jp/label.rb @@ -0,0 +1,64 @@ +# +# label widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($label_demo) && $label_demo + $label_demo.destroy + $label_demo = nil +end + +# demo 用の toplevel widget を生成 +$label_demo = TkToplevel.new {|w| + title("Label Demonstration") + iconname("label") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($label_demo) { + font $font + wraplength '4i' + justify 'left' + text "下には5つのラベルが表示されています。左側にはテキストラベルが3つあり、右側にはビットマップラベルとテキストラベルがあります。ラベルというのはあまり面白いものではありません。なぜなら眺める以外何もできないからです。" +} +msg.pack('side'=>'top') + +# frame 生成 +TkFrame.new($label_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $label_demo + $label_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'label'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# label demo 用フレーム生成 +f_left = TkFrame.new($label_demo) +f_right = TkFrame.new($label_demo) +[f_left, f_right].each{|w| w.pack('side'=>'left', 'expand'=>'yes', + 'padx'=>10, 'pady'=>10, 'fill'=>'both')} + +# label 生成 +[ TkLabel.new(f_left, 'text'=>'最初のラベル'), + TkLabel.new(f_left, 'text'=>'2 番目。ちょっと浮き上がらせてみました', + 'relief'=>'raised'), + TkLabel.new(f_left, 'text'=>'3 番目。沈んでいます ', 'relief'=>'sunken') +].each{|w| w.pack('side'=>'top', 'expand'=>'yes', 'pady'=>2, 'anchor'=>'w')} + +TkLabel.new(f_right) { + bitmap('@' + [$demo_dir,'images','face.bmp'].join(File::Separator)) + borderwidth 2 + relief 'sunken' +}.pack('side'=>'top') + +TkLabel.new(f_right) { text 'Tcl/Tk 所有者' }.pack('side'=>'top') diff --git a/ext/tk/sample/demos-jp/menu.rb b/ext/tk/sample/demos-jp/menu.rb new file mode 100644 index 0000000000..fb32623cc8 --- /dev/null +++ b/ext/tk/sample/demos-jp/menu.rb @@ -0,0 +1,186 @@ +# +# menus widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($menu_demo) && $menu_demo + $menu_demo.destroy + $menu_demo = nil +end + +# demo 用の toplevel widget を生成 +$menu_demo = TkToplevel.new {|w| + title("File Selection Dialogs") + iconname("menu") + positionWindow(w) +} + +# menu frame 生成 +$menu_frame = TkFrame.new($menu_demo, 'relief'=>'raised', 'bd'=>2) +$menu_frame.pack('side'=>'top', 'fill'=>'x') + +# label 生成 +TkLabel.new($menu_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left') { + if $tk_platform['platform'] == 'macintosh' + text("このウィンドウは様々なメニューとカスケードメニューから構成されています。Command-X を入力すると、Xがコマンドキー記号に続いて表示されている文字ならば、アクセラレータを使った項目起動を行うことができます。メニュー要素中、最後のものは、そのメニューの最初の項目を選択することで独立させることができます。") + else + text("このウィンドウは様々なメニューとカスケードメニューから構成されています。Alt-X を入力すると、Xがメニューにアンダーライン付きで表示されている文字ならば、キーボードからの指定ができます。矢印キーでメニューのトラバースも可能です。メニューが指定された際には、スペースキーで実行することができます。あるいは、アンダーライン付きの文字を入力することでも実行できます。メニューのエントリがアクセラレータを持っている場合は、そのアクセラレータを入力することでメニューを指定することなしに実行することができます。メニュー要素中、最後のものは、そのメニューの最初の項目を選択することで独立させることができます。") + end +}.pack('side'=>'top') + +# frame 生成 +TkFrame.new($menu_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $menu_demo + $menu_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'menu'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# menu 生成 +TkMenubutton.new($menu_frame, 'text'=>'File', 'underline'=>0) {|m| + pack('side'=>'left') + TkMenu.new(m, 'tearoff'=>false) {|file_menu| + m.configure('menu'=>file_menu) + add('command', 'label'=>'開く ...', 'command'=>proc{fail 'これは、デモですので"開く ..."に対するアクションは定義されていません。'}) + add('command', 'label'=>'新規', 'command'=>proc{fail 'これは、デモですので"新規"に対するアクションは定義されていません。'}) + add('command', 'label'=>'保存', 'command'=>proc{fail 'これは、デモですので"保存"に対するアクションは定義されていません。'}) + add('command', 'label'=>'保存(指定) ...', 'command'=>proc{fail 'これは、デモですので"保存(指定) ..."に対するアクションは定義されていません。'}) + add('separator') + add('command', 'label'=>'プリント設定 ...', 'command'=>proc{fail 'これは、デモですので"プリント設定 ..."に対するアクションは定義されていません。'}) + add('command', 'label'=>'プリント ...', 'command'=>proc{fail 'これは、デモですので"プリント ..."に対するアクションは定義されていません。'}) + add('separator') + add('command', 'label'=>'終了', 'command'=>proc{$menu_demo.destroy}) + } +} + +if $tk_platform['platform'] == 'macintosh' + modifier = 'Command' +elsif $tk_platform['platform'] == 'windows' + modifier = 'Control' +else + modifier = 'Meta' +end + +TkMenubutton.new($menu_frame, 'text'=>'Basic', 'underline'=>0) {|m| + pack('side'=>'left') + TkMenu.new(m, 'tearoff'=>false) {|basic_menu| + m.configure('menu'=>basic_menu) + add('command', 'label'=>'何もしない長いエントリ') + ['A','B','C','D','E','F','G'].each{|c| + # add('command', 'label'=>"文字 \"#{c}\" を印字", 'underline'=>4, + add('command', 'label'=>"Print letter \"#{c}\" (文字 \"#{c}\" を印字)", + 'underline'=>14, 'accelerator'=>"Meta+#{c}", + 'command'=>proc{print c,"\n"}, 'accelerator'=>"#{modifier}+#{c}") + $menu_demo.bind("#{modifier}-#{c.downcase}", proc{print c,"\n"}) + } + } +} + +TkMenubutton.new($menu_frame, 'text'=>'Cascades', 'underline'=>0) {|m| + pack('side'=>'left') + TkMenu.new(m, 'tearoff'=>false) {|cascade_menu| + m.configure('menu'=>cascade_menu) + add('command', 'label'=>'Print hello(こんにちは)', + 'command'=>proc{print "Hello(こんにちは)\n"}, + 'accelerator'=>"#{modifier}+H", 'underline'=>6) + $menu_demo.bind("#{modifier}-h", proc{print "Hello(こんにちは)\n"}) + add('command', 'label'=>'Print goodbye(さようなら)', + 'command'=>proc{print "Goodbye(さようなら)\n"}, + 'accelerator'=>"#{modifier}+G", 'underline'=>6) + $menu_demo.bind("#{modifier}-g", proc{print "Goodbye(さようなら)\n"}) + + TkMenu.new(m, 'tearoff'=>false) {|cascade_check| + cascade_menu.add('cascade', 'label'=>'Check buttons(チェックボタン)', + 'menu'=>cascade_check, 'underline'=>0) + oil = TkVariable.new(0) + add('check', 'label'=>'オイル点検', 'variable'=>oil) + trans = TkVariable.new(0) + add('check', 'label'=>'トランスミッション点検', 'variable'=>trans) + brakes = TkVariable.new(0) + add('check', 'label'=>'ブレーキ点検', 'variable'=>brakes) + lights = TkVariable.new(0) + add('check', 'label'=>'ライト点検', 'variable'=>lights) + add('separator') + add('command', 'label'=>'現在の値を表示', + 'command'=>proc{showVars($menu_demo, + ['オイル点検', oil], + ['トランスミッション点検', trans], + ['ブレーキ点検', brakes], + ['ライト点検', lights])} ) + invoke 1 + invoke 3 + } + + TkMenu.new(m, 'tearoff'=>false) {|cascade_radio| + cascade_menu.add('cascade', 'label'=>'Radio buttons(ラジオボタン)', + 'menu'=>cascade_radio, 'underline'=>0) + pointSize = TkVariable.new + add('radio', 'label'=>'10 ポイント', 'variable'=>pointSize, 'value'=>10) + add('radio', 'label'=>'14 ポイント', 'variable'=>pointSize, 'value'=>14) + add('radio', 'label'=>'18 ポイント', 'variable'=>pointSize, 'value'=>18) + add('radio', 'label'=>'24 ポイント', 'variable'=>pointSize, 'value'=>24) + add('radio', 'label'=>'32 ポイント', 'variable'=>pointSize, 'value'=>32) + add('separator') + style = TkVariable.new + add('radio', 'label'=>'ローマン', 'variable'=>style, 'value'=>'roman') + add('radio', 'label'=>'ボールド', 'variable'=>style, 'value'=>'bold') + add('radio', 'label'=>'イタリック', 'variable'=>style, 'value'=>'italic') + add('separator') + add('command', 'label'=>'現在の値を表示', + 'command'=>proc{showVars($menu_demo, + ['ポイントサイズ', pointSize], + ['スタイル', style])} ) + invoke 1 + invoke 7 + } + } +} + +TkMenubutton.new($menu_frame, 'text'=>'Icons', 'underline'=>0) {|m| + pack('side'=>'left') + TkMenu.new(m, 'tearoff'=>false) {|icon_menu| + m.configure('menu'=>icon_menu) + add('command', + 'bitmap'=>'@'+[$demo_dir,'images','pattern.bmp'].join(File::Separator), + 'command'=>proc{TkDialog.new('title'=>'Bitmap Menu Entry', + 'text'=>'今あなたが選択したメニューの項目はテキストではなくビットマップを表示していました。それ以外の点では他のメニュー項目と変わりません。', + 'bitmap'=>'', 'default'=>0, + 'buttons'=>'了解')} ) + ['info', 'questhead', 'error'].each{|icon| + add('command', 'bitmap'=>icon, + 'command'=>proc{print "You invoked the #{icon} bitmap\n"}) + } + } +} + +TkMenubutton.new($menu_frame, 'text'=>'More', 'underline'=>0) {|m| + pack('side'=>'left') + TkMenu.new(m, 'tearoff'=>false) {|more_menu| + m.configure('menu'=>more_menu) + [ 'エントリ','別のエントリ','何もしない','ほとんど何もしない', + '人生を意義あるものに' ].each{|i| + add('command', 'label'=>i, + 'command'=>proc{print "You invoked \"#{i}\"\n"}) + } + } +} + +TkMenubutton.new($menu_frame, 'text'=>'Colors', 'underline'=>0) {|m| + pack('side'=>'left') + TkMenu.new(m) {|colors_menu| + m.configure('menu'=>colors_menu) + ['red', 'orange', 'yellow', 'green', 'blue'].each{|c| + add('command', 'label'=>c, 'background'=>c, + 'command'=>proc{print "You invoked \"#{c}\"\n"}) + } + } +} diff --git a/ext/tk/sample/demos-jp/menu8x.rb b/ext/tk/sample/demos-jp/menu8x.rb new file mode 100644 index 0000000000..a6d3c5e09e --- /dev/null +++ b/ext/tk/sample/demos-jp/menu8x.rb @@ -0,0 +1,219 @@ +# +# menus widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($menu8x_demo) && $menu8x_demo + $menu8x_demo.destroy + $menu8x_demo = nil +end + +# demo 用の toplevel widget を生成 +$menu8x_demo = TkToplevel.new {|w| + title("Menu Demonstration (Tk8.x)") + iconname("menu") + positionWindow(w) +} + +# version check +if $tk_version.to_f < 8.0 + +# label 生成 +TkLabel.new($menu8x_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left') { + text("実行しようとしたスクリプトは Tk8.0 以上で利用できる機能を利用しているため、あなたの Ruby#{VERSION}/Tk#{$tk_version}#{(Tk::JAPANIZED_TK)? 'jp': ''} では正常に実行できません。よってデモの実行を中止しました。ただし、下のコード参照ボタンを押すことで、実行が中止されたスクリプトのソースを参照することは可能です。") +}.pack('side'=>'top') + +# frame 生成 +TkFrame.new($menu8x_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $menu8x_demo + $menu8x_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'menu'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +else ; # Tk8.x + +# label 生成 +TkLabel.new($menu8x_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left') { + if $tk_platform['platform'] == 'macintosh' + text("このウィンドウは様々なメニューとカスケードメニューから構成されています。Command-X を入力すると、Xがコマンドキー記号に続いて表示されている文字ならば、アクセラレータを使った項目起動を行うことができます。メニュー要素中、最後のものは、そのメニューの最初の項目を選択することで独立させることができます。") + else + text("このウィンドウは様々なメニューとカスケードメニューから構成されています。Alt-X を入力すると、Xがメニューにアンダーライン付きで表示されている文字ならば、キーボードからの指定ができます。矢印キーでメニューのトラバースも可能です。メニューが指定された際には、スペースキーで実行することができます。あるいは、アンダーライン付きの文字を入力することでも実行できます。メニューのエントリがアクセラレータを持っている場合は、そのアクセラレータを入力することでメニューを指定することなしに実行することができます。メニュー要素中、最後のものは、そのメニューの最初の項目を選択することで独立させることができます。") + end +}.pack('side'=>'top') + +# 状態表示の生成 +$menu8xstatus = TkVariable.new(" ") +TkFrame.new($menu8x_demo) {|frame| + TkLabel.new(frame, 'textvariable'=>$menu8xstatus, 'relief'=>'sunken', + 'bd'=>1, 'font'=>['Helvetica', '10'], 'anchor'=>'w')\ + .pack('side'=>'left', 'padx'=>2, 'expand'=>'yes', 'fill'=>'both') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>2) + +# frame 生成 +TkFrame.new($menu8x_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $menu8x_demo + $menu8x_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'menu'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# menu 生成 +TkMenu.new($menu8x_demo, 'tearoff'=>false) {|m| + TkMenu.new(m, 'tearoff'=>false) {|file_menu| + m.add('cascade', 'label'=>'File', 'menu'=>file_menu, 'underline'=>0) + add('command', 'label'=>'開く ...', 'command'=>proc{fail 'これは、デモですので"開く ..."に対するアクションは定義されていません。'}) + add('command', 'label'=>'新規', 'command'=>proc{fail 'これは、デモですので"新規"に対するアクションは定義されていません。'}) + add('command', 'label'=>'保存', 'command'=>proc{fail 'これは、デモですので"保存"に対するアクションは定義されていません。'}) + add('command', 'label'=>'保存(指定) ...', 'command'=>proc{fail 'これは、デモですので"保存(指定) ..."に対するアクションは定義されていません。'}) + add('separator') + add('command', 'label'=>'プリント設定 ...', 'command'=>proc{fail 'これは、デモですので"プリント設定 ..."に対するアクションは定義されていません。'}) + add('command', 'label'=>'プリント ...', 'command'=>proc{fail 'これは、デモですので"プリント ..."に対するアクションは定義されていません。'}) + add('separator') + add('command', 'label'=>'終了', 'command'=>proc{$menu8x_demo.destroy}) + } + + if $tk_platform['platform'] == 'macintosh' + modifier = 'Command' + elsif $tk_platform['platform'] == 'windows' + modifier = 'Control' + else + modifier = 'Meta' + end + + TkMenu.new(m, 'tearoff'=>false) {|basic_menu| + m.add('cascade', 'label'=>'Basic', 'menu'=>basic_menu, 'underline'=>0) + add('command', 'label'=>'何もしない長いエントリ') + ['A','B','C','D','E','F','G'].each{|c| + # add('command', 'label'=>"文字 \"#{c}\" を印字", 'underline'=>4, + add('command', 'label'=>"Print letter \"#{c}\" (文字 \"#{c}\" を印字)", + 'underline'=>14, 'accelerator'=>"Meta+#{c}", + 'command'=>proc{print c,"\n"}, 'accelerator'=>"#{modifier}+#{c}") + $menu8x_demo.bind("#{modifier}-#{c.downcase}", proc{print c,"\n"}) + } + } + + TkMenu.new(m, 'tearoff'=>false) {|cascade_menu| + m.add('cascade', 'label'=>'Cascades', 'menu'=>cascade_menu, 'underline'=>0) + add('command', 'label'=>'Print hello(こんにちは)', + 'command'=>proc{print "Hello(こんにちは)\n"}, + 'accelerator'=>"#{modifier}+H", 'underline'=>6) + $menu8x_demo.bind("#{modifier}-h", proc{print "Hello(こんにちは)\n"}) + add('command', 'label'=>'Print goodbye(さようなら)', + 'command'=>proc{print "Goodbye(さようなら)\n"}, + 'accelerator'=>"#{modifier}+G", 'underline'=>6) + $menu8x_demo.bind("#{modifier}-g", proc{print "Goodbye(さようなら)\n"}) + + TkMenu.new(m, 'tearoff'=>false) {|cascade_check| + cascade_menu.add('cascade', 'label'=>'Check buttons(チェックボタン)', + 'menu'=>cascade_check, 'underline'=>0) + oil = TkVariable.new(0) + add('check', 'label'=>'オイル点検', 'variable'=>oil) + trans = TkVariable.new(0) + add('check', 'label'=>'トランスミッション点検', 'variable'=>trans) + brakes = TkVariable.new(0) + add('check', 'label'=>'ブレーキ点検', 'variable'=>brakes) + lights = TkVariable.new(0) + add('check', 'label'=>'ライト点検', 'variable'=>lights) + add('separator') + add('command', 'label'=>'現在の値を表示', + 'command'=>proc{showVars($menu8x_demo, + ['オイル点検', oil], + ['トランスミッション点検', trans], + ['ブレーキ点検', brakes], + ['ライト点検', lights])} ) + invoke 1 + invoke 3 + } + + TkMenu.new(m, 'tearoff'=>false) {|cascade_radio| + cascade_menu.add('cascade', 'label'=>'Radio buttons(ラジオボタン)', + 'menu'=>cascade_radio, 'underline'=>0) + pointSize = TkVariable.new + add('radio', 'label'=>'10 ポイント', 'variable'=>pointSize, 'value'=>10) + add('radio', 'label'=>'14 ポイント', 'variable'=>pointSize, 'value'=>14) + add('radio', 'label'=>'18 ポイント', 'variable'=>pointSize, 'value'=>18) + add('radio', 'label'=>'24 ポイント', 'variable'=>pointSize, 'value'=>24) + add('radio', 'label'=>'32 ポイント', 'variable'=>pointSize, 'value'=>32) + add('separator') + style = TkVariable.new + add('radio', 'label'=>'ローマン', 'variable'=>style, 'value'=>'roman') + add('radio', 'label'=>'ボールド', 'variable'=>style, 'value'=>'bold') + add('radio', 'label'=>'イタリック', 'variable'=>style, 'value'=>'italic') + add('separator') + add('command', 'label'=>'現在の値を表示', + 'command'=>proc{showVars($menu8x_demo, + ['ポイントサイズ', pointSize], + ['スタイル', style])} ) + invoke 1 + invoke 7 + } + } + + TkMenu.new(m, 'tearoff'=>false) {|icon_menu| + m.add('cascade', 'label'=>'Icons', 'menu'=>icon_menu, 'underline'=>0) + add('command', + 'bitmap'=>'@'+[$demo_dir,'images','pattern.bmp'].join(File::Separator), + 'hidemargin'=>1, + 'command'=>proc{TkDialog.new('title'=>'Bitmap Menu Entry', + 'text'=>'今あなたが選択したメニューの項目はテキストではなくビットマップを表示していました。それ以外の点では他のメニュー項目と変わりません。', + 'bitmap'=>'', 'default'=>0, + 'buttons'=>'了解')} ) + ['info', 'questhead', 'error'].each{|icon| + add('command', 'bitmap'=>icon, 'hidemargin'=>1, + 'command'=>proc{print "You invoked the #{icon} bitmap\n"}) + } + + entryconfigure(2, 'columnbreak'=>1) + } + + TkMenu.new(m, 'tearoff'=>false) {|more_menu| + m.add('cascade', 'label'=>'More', 'menu'=>more_menu, 'underline'=>0) + [ 'エントリ','別のエントリ','何もしない','ほとんど何もしない', + '人生を意義あるものに' ].each{|i| + add('command', 'label'=>i, + 'command'=>proc{print "You invoked \"#{i}\"\n"}) + } + } + + TkMenu.new(m) {|colors_menu| + m.add('cascade', 'label'=>'Colors', 'menu'=>colors_menu, 'underline'=>1) + ['red', 'orange', 'yellow', 'green', 'blue'].each{|c| + add('command', 'label'=>c, 'background'=>c, + 'command'=>proc{print "You invoked \"#{c}\"\n"}) + } + } + + $menu8x_demo.configure('menu'=>m) +} + +TkMenu.bind('<MenuSelect>', + proc{|w| + begin + label = w.entrycget('active', 'label') + rescue + label = ' ' + end + $menu8xstatus.value = label + Tk.update('idletasks') + }, '%W') + +end ; # Tk 8.x diff --git a/ext/tk/sample/demos-jp/menubu.rb b/ext/tk/sample/demos-jp/menubu.rb new file mode 100644 index 0000000000..90056e02c6 --- /dev/null +++ b/ext/tk/sample/demos-jp/menubu.rb @@ -0,0 +1,223 @@ +require "tkcanvas" + +def optionMenu(menubutton, varName, firstValue, *rest) + varName.value = firstValue + configoptions = {'textvariable'=>varName,'indicatoron'=>'on', + 'relief'=>'raised','borderwidth'=>2,'highlightthickness'=>2, + 'anchor'=>'c','direction'=>'flush'} + configoptions.each {|key, value| + menubutton.configure(key, value) + } + menu = TkMenu.new(menubutton) { + tearoff 'off' + add 'radio', 'label'=>firstValue, 'variable'=>varName + } + menubutton.menu(menu) + for i in rest + menu.add 'radio', 'label'=>i, 'variable'=>varName + end + + return menu +end + +if defined?($menubu_demo) && $menubu_demo + $menubu_demo.destroy + $menubu_demo = nil +end + +$menubu_demo = TkToplevel.new {|w| + title("Menu Button Demonstration") + iconname("menubutton") +} + +positionWindow($menubu_demo) + +# version check +if $tk_version.to_f < 8.0 + +# label 生成 +TkLabel.new($menubu_demo,'font'=>$font,'wraplength'=>'4i','justify'=>'left') { + text("実行しようとしたスクリプトは Tk8.0 以上で利用できる機能を利用しているため、あなたの Ruby#{VERSION}/Tk#{$tk_version}#{(Tk::JAPANIZED_TK)? 'jp': ''} では正常に実行できません。よってデモの実行を中止しました。ただし、下のコード参照ボタンを押すことで、実行が中止されたスクリプトのソースを参照することは可能です。") +}.pack('side'=>'top') + +# frame 生成 +TkFrame.new($menubu_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $menubu_demo + $menubu_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'menu'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +else ; # Tk8.x + +body = TkFrame.new($menubu_demo) +body.pack('expand'=>'yes', 'fill'=>'both') + +below = TkMenubutton.new(body) { + text "Below" + underline 0 + direction 'below' + relief 'raised' +} +belowMenu = TkMenu.new(below) { + tearoff 0 + add 'command', 'label'=>"Below menu: first item", 'command'=>proc {puts "\"You have selected the first item from the Below menu.\""} + add 'command', 'label'=>"Below menu: second item", 'command'=>proc {puts "\"You have selected the second item from the Below menu.\""} +} +below.menu(belowMenu) +below.grid('row'=>0, 'column'=>1, 'sticky'=>'n') + +below = TkMenubutton.new(body) { + text "Below" + underline 0 + direction 'below' + relief 'raised' +} +belowMenu = TkMenu.new(below) { + tearoff 0 + add 'command', 'label'=>"Below menu: first item", 'command'=>proc {puts "\"You have selected the first item from the Below menu.\""} + add 'command', 'label'=>"Below menu: second item", 'command'=>proc {puts "\"You have selected the second item from the Below menu.\""} +} +below.menu(belowMenu) +below.grid('row'=>0, 'column'=>1, 'sticky'=>'n') + +below = TkMenubutton.new(body) { + text "Below" + underline 0 + direction 'below' + relief 'raised' +} +belowMenu = TkMenu.new(below) { + tearoff 0 + add 'command', 'label'=>"Below menu: first item", 'command'=>proc {puts "\"You have selected the first item from the Below menu.\""} + add 'command', 'label'=>"Below menu: second item", 'command'=>proc {puts "\"You have selected the second item from the Below menu.\""} +} +below.menu(belowMenu) +below.grid('row'=>0, 'column'=>1, 'sticky'=>'n') + +right = TkMenubutton.new(body) { + text "Right" + underline 0 + direction 'right' + relief 'raised' +} +rightMenu = TkMenu.new(right) { + tearoff 0 + add 'command', 'label'=>"Right menu: first item", 'command'=>proc {puts "\"You have selected the first item from the Left menu.\""} + add 'command', 'label'=>"Right menu: second item", 'command'=>proc {puts "\"You have selected the second item from the Right menu.\""} +} +right.menu(rightMenu) +right.grid('row'=>1, 'column'=>0, 'sticky'=>'w') + +left = TkMenubutton.new(body) { + text "Left" + underline 0 + direction 'left' + relief 'raised' +} +leftMenu = TkMenu.new(left) { + tearoff 0 + add 'command', 'label'=>"Left menu: first item", 'command'=>proc {puts "\"You have selected the first item from the Left menu.\""} + add 'command', 'label'=>"Left menu: second item", 'command'=>proc {puts "\"You have selected the second item from the Left menu.\""} +} +left.menu(leftMenu) +left.grid('row'=>1, 'column'=>2, 'sticky'=>'e') + +center = TkFrame.new(body) { + grid('row'=>1, 'column'=>1, 'sticky'=>'news') +} + +above = TkMenubutton.new(body) { + text "Above" + underline 0 + direction 'above' + relief 'raised' +} +aboveMenu = TkMenu.new(above) { + tearoff 0 + add 'command', 'label'=>"Above menu: first item", 'command'=>proc {puts "\"You have selected the first item from the Above menu.\""} + add 'command', 'label'=>"Above menu: second item", 'command'=>proc {puts "\"You have selected the second item from the Above menu.\""} +} +above.menu(aboveMenu) +above.grid('row'=>2, 'column'=>1, 'sticky'=>'s') + +center = TkFrame.new(body) { + grid('row'=>1, 'column'=>1, 'sticky'=>'news') +} + +TkFrame.new($menubu_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc { + tmppath = $menubu_demo + $menubu_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc { showCode 'menubu' } + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'expand'=>'yes', 'fill'=>'x', 'pady'=>'2m') + +msg = TkLabel.new(center) { +# font $font + wraplength '4i' + justify 'left' + text "これはメニューボタンのデモです。\"Below\"のボタンは\ +下にメニューを出し、\"Right\"のボタンは右にメニューを出して、\ +……となります。この文章の下には2つのオプションメニューがあります。\ +1つは普通のメニューで、もう1つは16色のパレットです。" +} +msg.pack('side'=>'top', 'padx'=>25, 'pady'=>25) + +TkFrame.new(center) {|f| + menubuttonoptions = TkVariable.new + mbutton = TkMenubutton.new(f) + options = optionMenu(mbutton, menubuttonoptions, + 'one', 'two', 'three') + mbutton.pack('side'=>'left', 'padx'=>25, 'pady'=>25) + paletteColor = TkVariable.new + colors = ['Black','red4','DarkGreen','NavyBlue', 'gray75', + 'Red','Green','Blue','gray50','Yellow','Cyan','Magenta', + 'White','Brown','DarkSeaGreen','DarkViolet'] + colorMenuButton = TkMenubutton.new(f) + m = optionMenu(colorMenuButton, paletteColor, *colors) + topBorderColor = 'gray50' + bottomBorderColor = 'gray75' + for i in 0..15 + image = TkPhotoImage.new('height'=>16, 'width'=>16) + image.put(topBorderColor, 0, 0, 16, 1) + image.put(topBorderColor, 0, 1, 1, 16) + image.put(bottomBorderColor, 0, 15, 16, 16) + image.put(bottomBorderColor, 15, 1, 16, 16) + image.put(colors[i], 1, 1, 15, 15) + + selectimage = TkPhotoImage.new('height'=>16, 'width'=>16) + selectimage.put('Black', 0, 0, 16, 2) + selectimage.put('Black', 0, 2, 2, 16) + selectimage.put('Black', 2, 14, 16, 16) + selectimage.put('Black', 14, 2, 16, 14) + selectimage.put(colors[i], 2, 2, 14, 14) + + m.entryconfigure(i, 'image'=>image, 'selectimage'=>selectimage, 'hidemargin'=>'on') + end + m.configure('tearoff', 'on') + for c in ['Black', 'gray75', 'gray50', 'White'] + m.entryconfigure(c, 'columnbreak'=>1) + end + colorMenuButton.pack('side'=>'left', 'padx'=>25, 'pady'=>25) + pack 'padx'=>25, 'pady'=>25 +} + +end ; # Tk8.x diff --git a/ext/tk/sample/demos-jp/msgbox.rb b/ext/tk/sample/demos-jp/msgbox.rb new file mode 100644 index 0000000000..cf53d70487 --- /dev/null +++ b/ext/tk/sample/demos-jp/msgbox.rb @@ -0,0 +1,85 @@ +# +# message boxes widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($msgbox_demo) && $msgbox_demo + $msgbox_demo.destroy + $msgbox_demo = nil +end + +# demo 用の toplevel widget を生成 +$msgbox_demo = TkToplevel.new {|w| + title("Message Box Demonstration") + iconname("messagebox") + positionWindow(w) +} + +# label 生成 +TkLabel.new($msgbox_demo, 'font'=>$font, 'wraplength'=>'4i', 'justify'=>'left', + 'text'=>"表示するアイコンとメッセージボックスの種類を選んで下さい。そして \"メッセージボックス\" ボタンを押すと、指定したメッセージボックスが表示されます。").pack('side'=>'top') + +# frame 生成 +TkFrame.new($msgbox_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $msgbox_demo + $msgbox_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'msgbox'} + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'メッセージボックス' + command proc{showMessageBox $msgbox_demo} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 生成 +$msgbox_leftframe = TkFrame.new($msgbox_demo) +$msgbox_rightframe = TkFrame.new($msgbox_demo) +$msgbox_leftframe .pack('side'=>'left', 'expand'=>'yes', 'fill'=>'y', + 'pady'=>'.5c', 'padx'=>'.5c') +$msgbox_rightframe.pack('side'=>'left', 'expand'=>'yes', 'fill'=>'y', + 'pady'=>'.5c', 'padx'=>'.5c') + +TkLabel.new($msgbox_leftframe, 'text'=>'アイコン').pack('side'=>'top') +TkFrame.new($msgbox_leftframe, 'relief'=>'ridge', 'bd'=>1, 'height'=>2)\ +.pack('side'=>'top', 'fill'=>'x', 'expand'=>'no') + +$msgboxIcon = TkVariable.new('info') +['error', 'info', 'question', 'warning'].each {|icon| + TkRadioButton.new($msgbox_leftframe, 'text'=>icon, 'variable'=>$msgboxIcon, + 'relief'=>'flat', 'value'=>icon, 'width'=>16, + 'anchor'=>'w').pack('side'=>'top', 'pady'=>2, + 'anchor'=>'w', 'fill'=>'x') +} + +TkLabel.new($msgbox_rightframe, 'text'=>'種類').pack('side'=>'top') +TkFrame.new($msgbox_rightframe, 'relief'=>'ridge', 'bd'=>1, 'height'=>2)\ +.pack('side'=>'top', 'fill'=>'x', 'expand'=>'no') + +$msgboxType = TkVariable.new('ok') +['abortretryignore', 'ok', 'okcancel', + 'retrycancel', 'yesno', 'yesnocancel'].each {|type| + TkRadioButton.new($msgbox_rightframe, 'text'=>type, 'variable'=>$msgboxType, + 'relief'=>'flat', 'value'=>type, 'width'=>16, + 'anchor'=>'w').pack('side'=>'top', 'pady'=>2, + 'anchor'=>'w', 'fill'=>'x') +} + +def showMessageBox(w) + button = Tk.messageBox('icon'=>$msgboxIcon.value, 'type'=>$msgboxType.value, + 'title'=>'Message', 'parent'=>w, + 'message'=>"これは \"#{$msgboxType.value}\" という種類のメッセージボックスで、\"#{$msgboxIcon.value}\" のアイコンが表示されています。") + + Tk.messageBox('icon'=>'info', 'type'=>'ok', 'parent'=>w, + 'message'=>"あなたは \"#{button}\" を押しましたね。") +end + diff --git a/ext/tk/sample/demos-jp/plot.rb b/ext/tk/sample/demos-jp/plot.rb new file mode 100644 index 0000000000..464dd4441d --- /dev/null +++ b/ext/tk/sample/demos-jp/plot.rb @@ -0,0 +1,118 @@ +# +# 2-D plot widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($plot_demo) && $plot_demo + $plot_demo.destroy + $plot_demo = nil +end + +# demo 用の toplevel widget を生成 +$plot_demo = TkToplevel.new {|w| + title("Plot Demonstration") + iconname("Plot") + positionWindow(w) +} + +# label 生成 +TkLabel.new($plot_demo, 'font'=>$font, 'wraplength'=>'4i', 'justify'=>'left', + 'text'=>"このウィンドウは簡単な2次元のプロットを含んだキャンバス widgetです。表示された点をマウスボタン1でドラッグしてデータをいじることができます。"){ + pack('side'=>'top') +} + +# frame 生成 +$plot_buttons = TkFrame.new($plot_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $plot_demo + $plot_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'plot'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$plot_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# font 設定 +plotFont = '-*-Helvetica-Medium-R-Normal--*-180-*-*-*-*-*-*' + +# canvas 設定 +$plot_canvas = TkCanvas.new($plot_demo,'relief'=>'raised','width'=>450,'height'=>300) +$plot_canvas.pack('side'=>'top', 'fill'=>'x') + +# plot 生成 +TkcLine.new($plot_canvas, 100, 250, 400, 250, 'width'=>2) +TkcLine.new($plot_canvas, 100, 250, 100, 50, 'width'=>2) +TkcText.new($plot_canvas, 225, 20, + 'text'=>"簡単なプロット", 'font'=>plotFont, 'fill'=>'brown') + +(0..10).each {|i| + x = 100 + (i * 30) + TkcLine.new($plot_canvas, x, 250, x, 245, 'width'=>2) + TkcText.new($plot_canvas, x, 254, + 'text'=>10*i, 'font'=>plotFont, 'anchor'=>'n') +} +(0..5).each {|i| + y = 250 - (i * 40) + TkcLine.new($plot_canvas, 100, y, 105, y, 'width'=>2) + TkcText.new($plot_canvas, 96, y, + 'text'=>"#{i*50}.0", 'font'=>plotFont, 'anchor'=>'e') +} + +for xx, yy in [[12,56],[20,94],[33,98],[32,120],[61,180],[75,160],[98,223]] + x = 100 + (3*xx) + y = 250 - (4*yy)/5 + item = TkcOval.new($plot_canvas, x-6, y-6, x+6, y+6, + 'width'=>1, 'outline'=>'black', 'fill'=>'SkyBlue2') + item.addtag 'point' +end + +$plot_canvas.itembind('point', 'Any-Enter', + proc{$plot_canvas.itemconfigure 'current','fill','red'}) +$plot_canvas.itembind('point', 'Any-Leave', + proc{$plot_canvas.itemconfigure 'current','fill','SkyBlue2'}) +$plot_canvas.itembind('point', '1', + proc{|x,y| plotDown $plot_canvas,x,y}, "%x %y") +$plot_canvas.itembind('point', 'ButtonRelease-1', + proc{$plot_canvas.dtag 'selected'}) +$plot_canvas.bind('B1-Motion', + proc{|x,y| plotMove $plot_canvas,x,y}, "%x %y") + +$plot = {'lastX'=>0, 'lastY'=>0} + +# plotDown -- +# This method is invoked when the mouse is pressed over one of the +# data points. It sets up state to allow the point to be dragged. +# +# Arguments: +# w - The canvas window. +# x, y - The coordinates of the mouse press. + +def plotDown (w, x, y) + w.dtag 'selected' + w.addtag_withtag 'selected', 'current' + w.raise 'current' + $plot['lastX'] = x + $plot['lastY'] = y +end + +# plotMove -- +# This method is invoked during mouse motion events. It drags the +# current item. +# +# Arguments: +# w - The canvas window. +# x, y - The coordinates of the mouse. + +def plotMove (w, x, y) + w.move 'selected', x - $plot['lastX'], y - $plot['lastY'] + $plot['lastX'] = x + $plot['lastY'] = y +end + diff --git a/ext/tk/sample/demos-jp/puzzle.rb b/ext/tk/sample/demos-jp/puzzle.rb new file mode 100644 index 0000000000..7e7aafac2f --- /dev/null +++ b/ext/tk/sample/demos-jp/puzzle.rb @@ -0,0 +1,105 @@ +# +# widet demo 'puzzle' (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($puzzle_demo) && $puzzle_demo + $puzzle_demo.destroy + $puzzle_demo = nil +end + +# demo 用の toplevel widget を生成 +$puzzle_demo = TkToplevel.new {|w| + title("15-Puzzle Demonstration") + iconname("15-Puzzle") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($puzzle_demo) { + font $font + wraplength '4i' + justify 'left' + text "下の15-パズルはボタンを集めてできています。空いている所の隣のピースをクリックすると、そのピースがその空いている場所にスライドします。この操作を続け、ピースがその数の順に上から下、左から右に並ぶようにしてください。" +} +msg.pack('side'=>'top') + +# frame 生成 +TkFrame.new($puzzle_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $puzzle_demo + $puzzle_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'puzzle'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 生成 +# +# Special trick: scrollbar widget を生成してその trough color を用いることで +# 空白部分のための暗色を選択し,設定する +# +s = TkScrollbar.new($puzzle_demo) +base = TkFrame.new($puzzle_demo) { + width 120 + height 120 + borderwidth 2 + relief 'sunken' + bg s['troughcolor'] +} +s.destroy +base.pack('side'=>'top', 'padx'=>'1c', 'pady'=>'1c') + +# proc のスコープを閉じるため,proc 生成メソッドを用意 +# こうしておかねば,ループ中で値が変化する num の影響を受けて +# puzzleSwitch の第 2 引数が変化してしまい,期待通りにはならない. +def def_puzzleswitch_proc(w, num) + proc{puzzleSwitch w, num} +end + +$xpos = {} +$ypos = {} +order = [3,1,6,2,5,7,15,13,4,11,8,9,14,10,12] +(0..14).each{|i| + num = order[i] + $xpos[num] = (i % 4) * 0.25 + $ypos[num] = (i / 4) * 0.25 + TkButton.new(base) {|w| + relief 'raised' + text num + highlightthickness 0 + command def_puzzleswitch_proc(w, num) + }.place('relx'=>$xpos[num], 'rely'=>$ypos[num], + 'relwidth'=>0.25, 'relheight'=>0.25) +} +$xpos['space'] = 0.75 +$ypos['space'] = 0.75 + +############ +def puzzleSwitch(w, num) + if ( ($ypos[num] >= ($ypos['space'] - 0.01)) \ + && ($ypos[num] <= ($ypos['space'] + 0.01)) \ + && ($xpos[num] >= ($xpos['space'] - 0.26)) \ + && ($xpos[num] <= ($xpos['space'] + 0.26))) \ + || (($xpos[num] >= ($xpos['space'] - 0.01)) \ + && ($xpos[num] <= ($xpos['space'] + 0.01)) \ + && ($ypos[num] >= ($ypos['space'] - 0.26)) \ + && ($ypos[num] <= ($ypos['space'] + 0.26))) + tmp = $xpos['space'] + $xpos['space'] = $xpos[num] + $xpos[num] = tmp + tmp = $ypos['space'] + $ypos['space'] = $ypos[num] + $ypos[num] = tmp + w.place('relx'=>$xpos[num], 'rely'=>$ypos[num]) + end +end + diff --git a/ext/tk/sample/demos-jp/radio.rb b/ext/tk/sample/demos-jp/radio.rb new file mode 100644 index 0000000000..871503029e --- /dev/null +++ b/ext/tk/sample/demos-jp/radio.rb @@ -0,0 +1,80 @@ +# +# radiobutton widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($radio_demo) && $radio_demo + $radio_demo.destroy + $radio_demo = nil +end + +# demo 用の toplevel widget を生成 +$radio_demo = TkToplevel.new {|w| + title("Radiobutton Demonstration") + iconname("radio") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($radio_demo) { + font $font + wraplength '4i' + justify 'left' + text "下には2つのラジオボタングループが表示されています。ボタンをクリックすると、そのボタンだけがそのグループの中で選択されます。各グループに対してそのグループの中のどのボタンが選択されているかを示す変数が割り当てられています。現在の変数の値を見るには「変数参照」ボタンをクリックしてください。" +} +msg.pack('side'=>'top') + +# 変数生成 +size = TkVariable.new +color = TkVariable.new + +# frame 生成 +TkFrame.new($radio_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $radio_demo + $radio_demo = nil + $showVarsWin[tmppath.path] = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'radio'} + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text '変数参照' + command proc{ + showVars($radio_demo, ['size', size], ['color', color]) + } + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 生成 +f_left = TkFrame.new($radio_demo) +f_right = TkFrame.new($radio_demo) +f_left.pack('side'=>'left', 'expand'=>'yes', 'padx'=>'.5c', 'pady'=>'.5c') +f_right.pack('side'=>'left', 'expand'=>'yes', 'padx'=>'.5c', 'pady'=>'.5c') + +# radiobutton 生成 +[10, 12, 18, 24].each {|sz| + TkRadioButton.new(f_left) { + text "ポイントサイズ #{sz}" + variable size + relief 'flat' + value sz + }.pack('side'=>'top', 'pady'=>2, 'anchor'=>'w') +} + +['赤', '緑', '青', '黄', '橙', '紫'].each {|col| + TkRadioButton.new(f_right) { + text col + variable color + relief 'flat' + value col.downcase + }.pack('side'=>'top', 'pady'=>2, 'anchor'=>'w') +} + diff --git a/ext/tk/sample/demos-jp/rmt b/ext/tk/sample/demos-jp/rmt new file mode 100644 index 0000000000..64583d714e --- /dev/null +++ b/ext/tk/sample/demos-jp/rmt @@ -0,0 +1,265 @@ +#!/usr/local/bin/ruby + +# rmt -- +# This script implements a simple remote-control mechanism for +# Tk applications. It allows you to select an application and +# then type commands to that application. + +require 'tk' + +class Rmt + def initialize(parent=nil) + win = self + + unless parent + parent = TkRoot.new + end + root = TkWinfo.toplevel(parent) + root.minsize(1,1) + + # The instance variable below keeps track of the remote application + # that we're sending to. If it's an empty string then we execute + # the commands locally. + @app = 'local' + @mode = 'Ruby' + + # The instance variable below keeps track of whether we're in the + # middle of executing a command entered via the text. + @executing = 0 + + # The instance variable below keeps track of the last command executed, + # so it can be re-executed in response to !! commands. + @lastCommand = "" + + # Create menu bar. Arrange to recreate all the information in the + # applications sub-menu whenever it is cascaded to. + + TkFrame.new(root, 'relief'=>'raised', 'bd'=>2) {|f| + pack('side'=>'top', 'fill'=>'x') + TkMenubutton.new(f, 'text'=>'File', 'underline'=>0) {|mb| + TkMenu.new(mb) {|mf| + mb.menu(mf) + TkMenu.new(mf) {|ma| + postcommand proc{win.fillAppsMenu ma} + mf.add('cascade', 'label'=>'Select Application', + 'menu'=>ma, 'underline'=>0) + } + add('command', 'label'=>'Quit', + 'command'=>proc{root.destroy}, 'underline'=>0) + } + pack('side'=>'left') + } + } + + # Create text window and scrollbar. + + @txt = TkText.new(root, 'relief'=>'sunken', 'bd'=>2, 'setgrid'=>true) {|t| + TkScrollbar.new(root, 'command'=>proc{|*args| t.yview *args}) { + pack('side'=>'right', 'fill'=>'both') + } + pack('side'=>'left') + } + + @promptEnd = TkTextMark.new(@txt, 'insert') + + # Create a binding to forward commands to the target application, + # plus modify many of the built-in bindings so that only information + # in the current command can be deleted (can still set the cursor + # earlier in the text and select and insert; just can't delete). + + @txt.bindtags([@txt, TkText, root, 'all']) + @txt.bind('Return', proc{ + @txt.set_insert('end - 1c') + @txt.insert('insert', "\n") + win.invoke + Tk.callback_break + }) + @txt.bind('Delete', proc{ + begin + @txt.tag_remove('sel', 'sel.first', @promptEnd) + rescue + end + if @txt.tag_nextrange('sel', '1.0', 'end') == [] + if @txt.compare('insert', '<', @promptEnd) + Tk.callback_break + end + end + }) + @txt.bind('BackSpace', proc{ + begin + @txt.tag_remove('sel', 'sel.first', @promptEnd) + rescue + end + if @txt.tag_nextrange('sel', '1.0', 'end') == [] + if @txt.compare('insert', '<', @promptEnd) + Tk.callback_break + end + end + }) + @txt.bind('Control-d', proc{ + if @txt.compare('insert', '<', @promptEnd) + Tk.callback_break + end + }) + @txt.bind('Control-k', proc{ + if @txt.compare('insert', '<', @promptEnd) + @txt.set_insert(@promptEnd) + end + }) + @txt.bind('Control-t', proc{ + if @txt.compare('insert', '<', @promptEnd) + Tk.callback_break + end + }) + @txt.bind('Meta-d', proc{ + if @txt.compare('insert', '<', @promptEnd) + Tk.callback_break + end + }) + @txt.bind('Meta-BackSpace', proc{ + if @txt.compare('insert', '<=', @promptEnd) + Tk.callback_break + end + }) + @txt.bind('Control-h', proc{ + if @txt.compare('insert', '<=', @promptEnd) + Tk.callback_break + end + }) + + @txt.tag_configure('bold', 'font'=>['Courier', 12, 'bold']) + + @app = Tk.appname('rmt') + if (@app =~ /^rmt(.*)$/) + root.title("Tk Remote Controller#{$1}") + root.iconname("Tk Remote#{$1}") + end + prompt + @txt.focus + #@app = TkWinfo.appname(TkRoot.new) + end + + def tkTextInsert(w,s) + return if s == "" + begin + if w.compare('sel.first','<=','insert') \ + && w.compare('sel.last','>=','insert') + w.tag_remove('sel', 'sel.first', @promptEnd) + w.delete('sel.first', 'sel.last') + end + rescue + end + w.insert('insert', s) + w.see('insert') + end + + # The method below is used to print out a prompt at the + # insertion point (which should be at the beginning of a line + # right now). + + def prompt + @txt.insert('insert', "#{@app}: ") + @promptEnd.set('insert') + @promptEnd.gravity = 'left' + @txt.tag_add('bold', "#{@promptEnd.path} linestart", @promptEnd) + end + + # The method below executes a command (it takes everything on the + # current line after the prompt and either sends it to the remote + # application or executes it locally, depending on "app". + + def invoke + cmd = @txt.get(@promptEnd, 'insert') + @executing += 1 + case (@mode) + when 'Tcl' + if Tk.info('complete', cmd) + if (cmd == "!!\n") + cmd = @lastCommand + else + @lastCommand = cmd + end + begin + msg = Tk.appsend(@app, false, cmd) + rescue + msg = "Error: #{$!}" + end + @txt.insert('insert', msg + "\n") if msg != "" + prompt + @promptEnd.set('insert') + end + + when 'Ruby' + if (cmd == "!!\n") + cmd = @lastCommand + end + complete = true + begin + eval("proc{#{cmd}}") + rescue + complete = false + end + if complete + @lastCommand = cmd + begin +# msg = Tk.appsend(@app, false, +# 'ruby', +# '"(' + cmd.gsub(/[][$"]/, '\\\\\&') + ').to_s"') + msg = Tk.rb_appsend(@app, false, cmd) + rescue + msg = "Error: #{$!}" + end + @txt.insert('insert', msg + "\n") if msg != "" + prompt + @promptEnd.set('insert') + end + end + + @executing -= 1 + @txt.yview_pickplace('insert') + end + + # The following method is invoked to change the application that + # we're talking to. It also updates the prompt for the current + # command, unless we're in the middle of executing a command from + # the text item (in which case a new prompt is about to be output + # so there's no need to change the old one). + + def newApp(appName, mode) + @app = appName + @mode = mode + if @executing == 0 + @promptEnd.gravity = 'right' + @txt.delete("#{@promptEnd.path} linestart", @promptEnd) + @txt.insert(@promptEnd, "#{appName}: ") + @txt.tag_add('bold', "#{@promptEnd.path} linestart", @promptEnd) + @promptEnd.gravity = 'left' + end + end + + # The method below will fill in the applications sub-menu with a list + # of all the applications that currently exist. + + def fillAppsMenu(menu) + win = self + begin + menu.delete(0,'last') + rescue + end + TkWinfo.interps.sort.each{|ip| + if Tk.appsend(ip, false, 'info commands ruby') == "" + mode = 'Tcl' + else + mode = 'Ruby' + end + menu.add('command', 'label'=>format("%s (#{mode}/Tk)", ip), + 'command'=>proc{win.newApp ip, mode}) + } + menu.add('command', 'label'=>format("local (Ruby/Tk)"), + 'command'=>proc{win.newApp 'local', 'Ruby'}) + end +end + +Rmt.new + +Tk.mainloop diff --git a/ext/tk/sample/demos-jp/rolodex b/ext/tk/sample/demos-jp/rolodex new file mode 100644 index 0000000000..9ed1f6d7d1 --- /dev/null +++ b/ext/tk/sample/demos-jp/rolodex @@ -0,0 +1,320 @@ +#!/usr/local/bin/ruby +# +# rolodex -- +# This script is a part of Tom LaStrange's rolodex +# +# Copyright (C) 1998 by Takaaki Tateishi <ttate@jaist.ac.jp> +# Time-stamp: "98/07/20 12:00:02 ttate" +# + +require "tk" + + +def show_help(topic,x=0,y=0) + if( topic.is_a?(TkWindow) ) + w = TkWinfo.containing(x,y) + if( TkWinfo.exist?(w) ) + topic = w + end + end + + if( $helpTopics.include?(topic) ) + msg = $helpTopics[topic] + else + msg = "Sorry, but no help is available for this topic" + end + TkDialog.new("title"=>"Rolodex Help", + "message"=>"Information on #{topic}:\n\n#{msg}", + "default_button"=>0, + "buttons"=>["OK"]) +end + +def fillCard + clearAction + $root.frame.entry[1].insert(0,"Takaaki Tateishi") + $root.frame.entry[2].insert(0,"Japan Advanced Institute of Science and Techonology") + $root.frame.entry[3].insert(0,"1-1 Asahidai, Tatsunokuchi") + $root.frame.entry[4].insert(0,"Ishikawa 923-1292, Japan") + $root.frame.entry[5].insert(0,"private") + $root.frame.entry[6].insert(0,"***-***-****") + $root.frame.entry[7].insert(0,"***-***-****") +end + +def addAction + for i in 1..7 + STDERR.print format("%-12s %s\n", + RolodexFrame::LABEL[i], + $root.frame.entry[i].value) + end +end + +def clearAction + for i in 1..7 + $root.frame.entry[i].delete(0,"end") + end +end + +def fileAction + TkDialog.new("title"=>"File Selection", + "message"=>"This is a dummy file selection dialog box.\n", + "default_button"=>0, + "buttons"=>["OK"]) + STDERR.print "dummy file name\n" +end + +def deleteAction + result = TkDialog.new("title"=>"Confirm Action", + "message"=>"Are you sure?", + "default_button"=>0, + "buttons"=>["Cancel"]) + if( result.value == 0 ) + clearAction + end +end + + +class RolodexFrame < TkFrame + attr_reader :entry, :label + + LABEL = ["","Name:","Address:","","","Home Phone:","Work Phone:","Fax:"] + + def initialize(parent=nil,keys=nil) + super(parent,keys) + self["relief"] = "flat" + + @i = [] + @label = [] + @entry = [] + for i in 1..7 + @i[i] = TkFrame.new(self) + @i[i].pack("side"=>"top", + "pady"=>2, + "anchor"=>"e") + @label[i] = TkLabel.new(@i[i], + "text"=>LABEL[i], + "anchor"=>"e") + @entry[i] = TkEntry.new(@i[i], + "width"=>30, + "relief"=>"sunken") + @entry[i].pack("side"=>"right") + @label[i].pack("side"=>"right") + end + end +end + +class RolodexButtons < TkFrame + attr_reader :clear, :add, :search, :delete + + def initialize(parent,keys=nil) + super(parent,keys) + @clear = TkButton.new(self, + "text" => "Clear") + @add = TkButton.new(self, + "text" => "Add") + @search = TkButton.new(self, + "text" => "Search") + @delete = TkButton.new(self, + "text" => "Delete") + for w in [@clear,@add,@search,@delete] + w.pack("side"=>"left", "padx"=>2) + end + end +end + +class RolodexMenuFrame < TkFrame + attr_reader :file_menu, :help_menu, :file, :help + + def initialize(parent,keys=nil) + super(parent,keys) + configure("relief"=>"raised", + "borderwidth"=>1) + + @file = TkMenubutton.new(self, + "text"=>"File", + "underline"=>0) + @file_menu = TkMenu.new(@file) + @file_menu.add("command", + "label" => "Load ...", + "command" => proc{fileAction}, + "underline" => 0) + @file_menu.add("command", + "label" => "Exit", + "command" => proc{$root.destroy}, + "underline" => 0) + @file.menu(@file_menu) + @file.pack("side"=>"left") + + @help = TkMenubutton.new(self, + "text"=>"Help", + "underline"=>0) + @help_menu = TkMenu.new(@help) + @help_menu.add("command", + "label"=>"On Context...", + "command"=>proc{show_help("context")}, + "underline"=>3) + @help_menu.add("command", + "label"=>"On Help...", + "command"=>proc{show_help("help")}, + "underline"=>3) + @help_menu.add("command", + "label"=>"On Window...", + "command"=>proc{show_help("window")}, + "underline"=>3) + @help_menu.add("command", + "label"=>"On Keys...", + "command"=>proc{show_help("keys")}, + "underline"=>3) + @help_menu.add("command", + "label"=>"On version...", + "command"=>proc{show_help("version")}, + "underline"=>3) + @help.menu(@help_menu) + @help.pack("side"=>"right") + end +end + +class Rolodex < TkRoot + attr_reader :frame, :buttons, :menu + + def initialize + super + @frame = RolodexFrame.new(self) + @frame.pack("side"=>"top", + "fill"=>"y", + "anchor"=>"center") + @buttons = RolodexButtons.new(self) + @buttons.pack("side"=>"bottom", + "pady"=>2, + "anchor"=>"center") + @menu = RolodexMenuFrame.new(self) + @menu.pack("before"=>@frame, + "side"=>"top", + "fill"=>"x") + end +end + +$root = Rolodex.new + +$root.buttons.delete.configure("command"=>proc{deleteAction}) +$root.buttons.add.configure("command"=>proc{addAction}) +$root.buttons.clear.configure("command"=>proc{clearAction}) +$root.buttons.search.configure("command"=>proc{addAction; fillCard}) + +$root.buttons.clear.configure("text"=>"Clear Ctrl+C") +$root.bind("Control-c",proc{clearAction}) + +$root.buttons.add.configure("text"=>"Add Ctrl+A") +$root.bind("Control-a",proc{addAction}) + +$root.buttons.search.configure("text"=>"Search Ctrl+S") +$root.bind("Control-s",proc{addAction; fillCard}) + +$root.buttons.delete.configure("text"=>"Delete... Ctrl+D") +$root.bind("Control-d",proc{deleteAction}) + +$root.menu.file_menu.entryconfigure(1, "accel"=>"Ctrl+F") +$root.bind("Control-f",proc{fileAction}) + +$root.menu.file_menu.entryconfigure(2, "accel"=>"Ctrl+Q") +$root.bind("Control-q",proc{$root.destroy}) + +$root.frame.entry[1].focus + +$root.bind("Any-F1", + proc{|event| show_help(event.widget, event.x_root, event.y_root)}) +$root.bind("Any-Help", + proc{|event| show_help(event.widget, event.x_root, event.y_root)}) + + +$helpTopics = {} + +$helpTopics[$root.menu.file] = <<EOF +This is the "file" menu. It can be used to invoke\ +some overall operations on the rolodex applications,\ +such as loading a file or exiting. +EOF + +$helpTopics[$root.menu.file_menu.index(0)] = <<EOF +The "Load" entry in the "File" menu posts a dialog box\ +that you can use to select a rolodex file +EOF + +$helpTopics[$root.menu.file_menu.index(1)] = <<EOF +The "Exit" entry in the "File" menu causes the rolodex\ +application to terminate +EOF + +$helpTopics[$root.frame.entry[1]] = <<EOF +In this field of the rolodex entry you should\ +type the person's name +EOF + +$helpTopics[$root.frame.entry[2]] = <<EOF +In this field of the rolodex entry you should\ +type the first line of the person's address +EOF + +$helpTopics[$root.frame.entry[3]] = <<EOF +In this field of the rolodex entry you should\ +type the second line of the person's address +EOF + +$helpTopics[$root.frame.entry[4]] = <<EOF +In this field of the rolodex entry you should\ +type the third line of the person's address +EOF + +$helpTopics[$root.frame.entry[5]] = <<EOF +In this field of the rolodex entry you should\ +type the person's home phone number, or "private"\ +if the person doesn't want his or he number publicized +EOF + +$helpTopics[$root.frame.entry[6]] = <<EOF +In this field of the rolodex entry you should\ +type the person's work phone number +EOF + +$helpTopics[$root.frame.entry[7]] = <<EOF +In this field of the rolodex entry you should\ +type the phone number for the person's FAX machine +EOF + +$helpTopics["context"] = <<EOF +Unfortunately, this application doesn't support context-sensitive\ +help in the usual way, because when this demo was written Ruby/Tk\ +didn't have a grab mechanism and this is needed for context-sensitive\ +help. Instead, you can achive much the same effect by simply moving\ +the mouse over the window you're curious about and pressing the\ +Help or F1 keys. You can do this anytime. +EOF + +$helpTopics["help"] = <<EOF +This application provides only very crude help. Besides the\ +entries in this menu, you can get help on individual windows\ +by moving the mouse cursor over the window and pressing the\ +Help or F1 keys. +EOF + +$helpTopics["window"] = <<EOF +This window is a dummy rolodex application created as part of\ +Tom LaStrange's toolkit benchmark. It doesn't really do anything\ +useful except to demonstrate a few features of the Ruby/Tk. +EOF + +$helpTopics["keys"] = <<EOF +The following accelerator keys are defined for this application\ +(in addition to those already available for the entry windows): +Ctrl+A: Add +Ctrl+C: Clear +Ctrl+D: Delete +Ctrl+F: Enter file name +Ctrl+Q: Exit application (quit) +Ctrl+S: Search (dummy operation) +EOF + +$helpTopics["version"] = <<EOF +This is version 1.0. +EOF + +Tk.mainloop diff --git a/ext/tk/sample/demos-jp/rolodex-j b/ext/tk/sample/demos-jp/rolodex-j new file mode 100644 index 0000000000..170f7bb96b --- /dev/null +++ b/ext/tk/sample/demos-jp/rolodex-j @@ -0,0 +1,311 @@ +#!/usr/local/bin/ruby +# +# rolodex -- +# このスクリプトは Tom LaStrange の rolodex の一部です。 +# +# Copyright (C) 1998 by Takaaki Tateishi <ttate@jaist.ac.jp> +# Time-stamp: "98/07/20 12:00:36 ttate" +# + +require "tk" + +# UTF8への変換を行なう。 + +$encoding = "euc-jp" +def j(str) + Tk.toUTF8(str,$encoding) +end + + +def show_help(topic,x=0,y=0) + if( topic.is_a?(TkWindow) ) + w = TkWinfo.containing(x,y) + if( w.is_a?(TkWindow) ) + if( TkWinfo.exist?(w) ) + topic = w + end + end + end + + if( $helpTopics.include?(topic) ) + msg = $helpTopics[topic] + else + msg = "このトピックについてのヘルプはまだ使用できません" + end + TkDialog.new("title"=>"Rolodex Help", + "message"=>j("「#{topic}」\n\n#{msg}"), + "default_button"=>0, + "buttons"=>["OK"]) +end + +def fillCard + clearAction + $root.frame.entry[1].insert(0,j("立石 孝彰")) + $root.frame.entry[2].insert(0,j("923-1292 石川県")) + $root.frame.entry[3].insert(0,j("辰口町 旭台 1-1")) + $root.frame.entry[4].insert(0,j("北陸先端科学技術大学院大学")) + $root.frame.entry[5].insert(0,"private") + $root.frame.entry[6].insert(0,"***-***-****") + $root.frame.entry[7].insert(0,"***-***-****") +end + +def addAction + for i in 1..7 + STDERR.print format("%-12s %s\n", + RolodexFrame::LABEL[i], + Tk.fromUTF8($root.frame.entry[i].value,$encoding)) + end +end + +def clearAction + for i in 1..7 + $root.frame.entry[i].delete(0,"end") + end +end + +def fileAction + TkDialog.new("title"=>"File Selection", + "message"=>j("これはファイル選択ダイアログのダミーです。\n"), + "default_button"=>0, + "buttons"=>["OK"]) + STDERR.print "dummy file name\n" +end + +def deleteAction + result = TkDialog.new("title"=>"Confirm Action", + "message"=>j("よろしいですか?"), + "default_button"=>0, + "buttons"=>[j("キャンセル")]) + if( result.value == 0 ) + clearAction + end +end + + +class RolodexFrame < TkFrame + attr_reader :entry, :label + + LABEL = ["","名前:","住所","","","電話(自宅):","電話(会社):","Fax:"] + + def initialize(parent=nil,keys=nil) + super(parent,keys) + self["relief"] = "flat" + + @i = [] + @label = [] + @entry = [] + for i in 1..7 + @i[i] = TkFrame.new(self) + @i[i].pack("side"=>"top", + "pady"=>2, + "anchor"=>"e") + @label[i] = TkLabel.new(@i[i], + "text"=>j(LABEL[i]), + "anchor"=>"e") + @entry[i] = TkEntry.new(@i[i], + "width"=>30, + "relief"=>"sunken") + @entry[i].pack("side"=>"right") + @label[i].pack("side"=>"right") + end + end +end + +class RolodexButtons < TkFrame + attr_reader :clear, :add, :search, :delete + + def initialize(parent,keys=nil) + super(parent,keys) + @clear = TkButton.new(self, + "text" => j("クリアー")) + @add = TkButton.new(self, + "text" => j("追加")) + @search = TkButton.new(self, + "text" => j("検索")) + @delete = TkButton.new(self, + "text" => j("消去")) + for w in [@clear,@add,@search,@delete] + w.pack("side"=>"left", "padx"=>2) + end + end +end + +class RolodexMenuFrame < TkFrame + attr_reader :file_menu, :help_menu, :file, :help + + def initialize(parent,keys=nil) + super(parent,keys) + configure("relief"=>"raised", + "borderwidth"=>1) + + @file = TkMenubutton.new(self, + "text"=>j("ファイル"), + "underline"=>0) + @file_menu = TkMenu.new(@file) + @file_menu.add("command", + "label" => j("読み込み ..."), + "command" => proc{fileAction}, + "underline" => 0) + @file_menu.add("command", + "label" => j("終了"), + "command" => proc{$root.destroy}, + "underline" => 0) + @file.menu(@file_menu) + @file.pack("side"=>"left") + + @help = TkMenubutton.new(self, + "text"=>j("ヘルプ"), + "underline"=>0) + @help_menu = TkMenu.new(@help) + @help_menu.add("command", + "label"=>j("コンテキストについて"), + "command"=>proc{show_help("コンテキスト")}, + "underline"=>3) + @help_menu.add("command", + "label"=>j("ヘルプについて"), + "command"=>proc{show_help("ヘルプ")}, + "underline"=>3) + @help_menu.add("command", + "label"=>j("ウィンドウについて"), + "command"=>proc{show_help("ウィンドウ")}, + "underline"=>3) + @help_menu.add("command", + "label"=>j("キー操作について"), + "command"=>proc{show_help("キー操作")}, + "underline"=>3) + @help_menu.add("command", + "label"=>j("バージョン情報"), + "command"=>proc{show_help("バージョン情報")}, + "underline"=>3) + @help.menu(@help_menu) + @help.pack("side"=>"right") + end +end + +class Rolodex < TkRoot + attr_reader :frame, :buttons, :menu + + def initialize + super + @frame = RolodexFrame.new(self) + @frame.pack("side"=>"top", + "fill"=>"y", + "anchor"=>"center") + @buttons = RolodexButtons.new(self) + @buttons.pack("side"=>"bottom", + "pady"=>2, + "anchor"=>"center") + @menu = RolodexMenuFrame.new(self) + @menu.pack("before"=>@frame, + "side"=>"top", + "fill"=>"x") + end +end + +$root = Rolodex.new + +$root.buttons.delete.configure("command"=>proc{deleteAction}) +$root.buttons.add.configure("command"=>proc{addAction}) +$root.buttons.clear.configure("command"=>proc{clearAction}) +$root.buttons.search.configure("command"=>proc{addAction; fillCard}) + +$root.buttons.clear.configure("text"=>j("クリアー Ctrl+C")) +$root.bind("Control-c",proc{clearAction}) + +$root.buttons.add.configure("text"=>j("追加 Ctrl+A")) +$root.bind("Control-a",proc{addAction}) + +$root.buttons.search.configure("text"=>j("検索 Ctrl+S")) +$root.bind("Control-s",proc{addAction; fillCard}) + +$root.buttons.delete.configure("text"=>j("消去 Ctrl+D")) +$root.bind("Control-d",proc{deleteAction}) + +$root.menu.file_menu.entryconfigure(1, "accel"=>"Ctrl+F") +$root.bind("Control-f",proc{fileAction}) + +$root.menu.file_menu.entryconfigure(2, "accel"=>"Ctrl+Q") +$root.bind("Control-q",proc{$root.destroy}) + +$root.frame.entry[1].focus + +$root.bind("Any-F1", + proc{|event| show_help(event.widget, event.x_root, event.y_root)}) +$root.bind("Any-Help", + proc{|event| show_help(event.widget, event.x_root, event.y_root)}) + + +$helpTopics = {} + +$helpTopics[$root.menu.file] = <<EOF +これは「ファイル」メニューです。「読み込み」や「終了」などを +行なうことができます。 +EOF + +$helpTopics[$root.menu.file_menu.index(0)] = <<EOF +ファイルの読み込みを行なうときに使います。 +EOF + +$helpTopics[$root.menu.file_menu.index(1)] = <<EOF +アプリケーションを終了するときに使います。 +EOF + +$helpTopics[$root.frame.entry[1]] = <<EOF +名前を記入するエントリです。 +EOF + +$helpTopics[$root.frame.entry[2]] = <<EOF +住所を記入するエントリです。 +EOF + +$helpTopics[$root.frame.entry[3]] = <<EOF +住所を記入するエントリです。 +EOF + +$helpTopics[$root.frame.entry[4]] = <<EOF +住所を記入するエントリです。 +EOF + +$helpTopics[$root.frame.entry[5]] = <<EOF +自宅の電話番号を記入するエントリです。公開\ +したくないときは private と記入します。 +EOF + +$helpTopics[$root.frame.entry[6]] = <<EOF +会社の電話番号を記入するエントリです。 +EOF + +$helpTopics[$root.frame.entry[7]] = <<EOF +FAX番号を記入するエントリです。 +EOF + +$helpTopics["コンテキスト"] = <<EOF +Ruby/Tkではgrabの機構がないためこのアプリケーションでは\ +コンテキストヘルプはサポートされていません。 +しかし同じような効果をbindとマウスの位置のWedgetを知る\ +ことで得ることができます。 +EOF + +$helpTopics["ヘルプ"] = <<EOF +マウスをウィンドウにあわせてF1キーを押すことによって\ +そのヘルプを見ることができます。 +EOF + +$helpTopics["ウィンドウ"] = <<EOF +このウィンドウはダミーです。 +EOF + +$helpTopics["キー操作"] = <<EOF +Ctrl+A: 追加 +Ctrl+C: クリアー +Ctrl+D: 消去 +Ctrl+F: ファイル選択 +Ctrl+Q: 終了 +Ctrl+S: 検索 +EOF + +$helpTopics["バージョン情報"] = <<EOF +バージョンは 1.0 です。 +EOF + +Tk.mainloop diff --git a/ext/tk/sample/demos-jp/ruler.rb b/ext/tk/sample/demos-jp/ruler.rb new file mode 100644 index 0000000000..d1a7818be4 --- /dev/null +++ b/ext/tk/sample/demos-jp/ruler.rb @@ -0,0 +1,197 @@ +# +# ruler widget demo (called by 'widget') +# + +# rulerMkTab -- +# This method creates a new triangular polygon in a canvas to +# represent a tab stop. +# +# Arguments: +# c - The canvas window. +# x, y - Coordinates at which to create the tab stop. + +def rulerMkTab(c,x,y) + v = $demo_rulerInfo + TkcPolygon.new(c, x, y, x+v.size, y+v.size, x-v.size, y+v.size) +end + +# toplevel widget が存在すれば削除する +if defined?($ruler_demo) && $ruler_demo + $ruler_demo.destroy + $ruler_demo = nil +end + +# demo 用の toplevel widget を生成 +$ruler_demo = TkToplevel.new {|w| + title("Ruler Demonstration") + iconname("ruler") + positionWindow(w) +} + +# label 生成 +TkLabel.new($ruler_demo, 'font'=>$font, 'wraplength'=>'5i', 'justify'=>'left', + 'text'=>"このキャンバスwidgetはルーラーの模型です。ルーラーの右にあるのはタブストップの井戸で、ここから引っ張ってくることによってタブストップを作ることができます。また、すでにあるタブストップを動かすこともできます。タブストップを上方または下方にかすれて表示されるまでドラッグすると、マウスボタンを離した時にそのタブストップは消えます。"){ + pack('side'=>'top') +} + +# frame 生成 +$ruler_buttons = TkFrame.new($ruler_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $ruler_demo + $ruler_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'ruler'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$ruler_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# canvas 設定 +$ruler_canvas = TkCanvas.new($ruler_demo, 'width'=>'14.8c', 'height'=>'2.5c') +$ruler_canvas.pack('side'=>'top', 'fill'=>'x') + +# 値設定 +unless Struct.const_defined?("RulerInfo") + $demo_rulerInfo = Struct.new("RulerInfo", :grid, :left, :right, :x, :y, + :top, :bottom, :size, :normalStyle, + :activeStyle, :deleteStyle).new +end +$demo_rulerInfo.grid = '.25c' +$demo_rulerInfo.left = TkWinfo.fpixels($ruler_canvas, '1c') +$demo_rulerInfo.right = TkWinfo.fpixels($ruler_canvas, '13c') +$demo_rulerInfo.top = TkWinfo.fpixels($ruler_canvas, '1c') +$demo_rulerInfo.bottom = TkWinfo.fpixels($ruler_canvas, '1.5c') +$demo_rulerInfo.size = TkWinfo.fpixels($ruler_canvas, '.2c') +$demo_rulerInfo.normalStyle = {'fill'=>'black'} +if TkWinfo.depth($ruler_canvas) > 1 + $demo_rulerInfo.activeStyle = {'fill'=>'red', 'stipple'=>''} + $demo_rulerInfo.deleteStyle = {'fill'=>'red', + 'stipple'=>'@'+[$demo_dir, 'images', 'gray25.bmp'].join(File::Separator)} +else + $demo_rulerInfo.activeStyle = {'fill'=>'black', 'stipple'=>''} + $demo_rulerInfo.deleteStyle = {'fill'=>'black', + 'stipple'=>'@'+[$demo_dir, 'images', 'gray25.bmp'].join(File::Separator)} +end + +TkcLine.new($ruler_canvas, + '1c', '0.5c', '1c', '1c', '13c', '1c', '13c', '0.5c', 'width'=>1) +(0..11).each{|i| + x = i+1 + TkcLine.new($ruler_canvas, "#{x}c", '1c', "#{x}c", '0.6c', 'width'=>1) + TkcLine.new($ruler_canvas, "#{x}.25c", '1c', "#{x}.25c", '0.8c', 'width'=>1) + TkcLine.new($ruler_canvas, "#{x}.5c", '1c', "#{x}.5c", '0.7c', 'width'=>1) + TkcLine.new($ruler_canvas, "#{x}.75c", '1c', "#{x}.75c", '0.8c', 'width'=>1) + TkcText.new($ruler_canvas, "#{x}.15c", '0.75c', 'text'=>i, 'anchor'=>'sw') +} + +$rulerTag_well = TkcTag.new($ruler_canvas) +$ruler_canvas\ +.addtag_withtag($rulerTag_well, + TkcRectangle.new($ruler_canvas, + '13.2c', '1c', '13.8c', '0.5c', + 'outline'=>'black', + 'fill'=>($ruler_canvas\ + .configinfo('background'))[4]) ) +$ruler_canvas\ +.addtag_withtag($rulerTag_well, + rulerMkTab($ruler_canvas, + TkWinfo.pixels($ruler_canvas, '13.5c'), + TkWinfo.pixels($ruler_canvas, '.65c') ) ) + +$rulerTag_well.bind('1', proc{|x,y| rulerNewTab($ruler_canvas,x,y)}, '%x %y') +$ruler_canvas.itembind('tab', '1', + proc{|x,y| rulerSelectTab($ruler_canvas,x,y)}, '%x %y') +$ruler_canvas.bind('B1-Motion', + proc{|x,y| rulerMoveTab($ruler_canvas,x,y)}, '%x %y') +$ruler_canvas.bind('Any-ButtonRelease-1', proc{rulerReleaseTab($ruler_canvas)}) + +# rulerNewTab -- +# Does all the work of creating a tab stop, including creating the +# triangle object and adding tags to it to give it tab behavior. +# +# Arguments: +# c - The canvas window. +# x, y - The coordinates of the tab stop. + +def rulerNewTab(c,x,y) + v = $demo_rulerInfo + c.addtag_withtag('active', rulerMkTab(c,x,y)) + c.addtag_withtag('tab', 'active') + v.x = x + v.y = y + rulerMoveTab(c,x,y) +end + +# rulerSelectTab -- +# This method is invoked when mouse button 1 is pressed over +# a tab. It remembers information about the tab so that it can +# be dragged interactively. +# +# Arguments: +# c - The canvas widget. +# x, y - The coordinates of the mouse (identifies the point by +# which the tab was picked up for dragging). + +def rulerSelectTab(c,x,y) + v = $demo_rulerInfo + v.x = c.canvasx(x, v.grid) + v.y = v.top+2 + c.addtag_withtag('active', 'current') + c.itemconfigure('active', v.activeStyle) + c.raise('active') +end + +# rulerMoveTab -- +# This method is invoked during mouse motion events to drag a tab. +# It adjusts the position of the tab, and changes its appearance if +# it is about to be dragged out of the ruler. +# +# Arguments: +# c - The canvas widget. +# x, y - The coordinates of the mouse. + +def rulerMoveTab(c,x,y) + v = $demo_rulerInfo + return if c.find_withtag('active') == [] + cx = c.canvasx(x,v.grid) + cy = c.canvasy(y) + cx = v.left if cx < v.left + cx = v.right if cx > v.right + if (cy >= v.top && cy <= v.bottom) + cy = v.top+2 + c.itemconfigure('active', v.activeStyle) + else + cy = cy-v.size-2 + c.itemconfigure('active', v.deleteStyle) + end + c.move('active', cx-v.x, cy-v.y) + v.x = cx + v.y = cy +end + +# rulerReleaseTab -- +# This method is invoked during button release events that end +# a tab drag operation. It deselects the tab and deletes the tab if +# it was dragged out of the ruler. +# +# Arguments: +# c - The canvas widget. +# x, y - The coordinates of the mouse. + +def rulerReleaseTab(c) + v = $demo_rulerInfo + return if c.find_withtag('active') == [] + if v.y != v.top+2 + c.delete('active') + else + c.itemconfigure('active', v.normalStyle) + c.dtag('active') + end +end + diff --git a/ext/tk/sample/demos-jp/sayings.rb b/ext/tk/sample/demos-jp/sayings.rb new file mode 100644 index 0000000000..f627396e0f --- /dev/null +++ b/ext/tk/sample/demos-jp/sayings.rb @@ -0,0 +1,99 @@ +# +# listbox widget demo 'sayings' (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($sayings_demo) && $sayings_demo + $sayings_demo.destroy + $sayings_demo = nil +end + +# demo 用の toplevel widget を生成 +$sayings_demo = TkToplevel.new {|w| + title("Listbox Demonstration (well-known sayings)") + iconname("sayings") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($sayings_demo) { + font $font + wraplength '4i' + justify 'left' + text "下のリストボックスにはいろいろな格言が入っています。リストをスクロールさせるのはスクロールバーでもできますし、リストボックスの中でマウスのボタン2(中ボタン)を押したままドラッグしてもできます。" +} +msg.pack('side'=>'top') + +# frame 生成 +TkFrame.new($sayings_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $sayings_demo + $sayings_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'sayings'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 生成 +sayings_lbox = nil +TkFrame.new($sayings_demo, 'borderwidth'=>10) {|w| + sv = TkScrollbar.new(w) + sh = TkScrollbar.new(w, 'orient'=>'horizontal') + sayings_lbox = TkListbox.new(w) { + setgrid 1 + width 20 + height 10 + yscrollcommand proc{|first,last| sv.set first,last} + xscrollcommand proc{|first,last| sh.set first,last} + } + sv.command(proc{|*args| sayings_lbox.yview(*args)}) + sh.command(proc{|*args| sayings_lbox.xview(*args)}) + + if $tk_version =~ /^4\.[01]/ + sv.pack('side'=>'right', 'fill'=>'y') + sh.pack('side'=>'bottom', 'fill'=>'x') + sayings_lbox.pack('expand'=>'yes', 'fill'=>'y') + + else + sayings_lbox.grid('row'=>0, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + sv.grid('row'=>0, 'column'=>1, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + sh.grid('row'=>1, 'column'=>0, + 'rowspan'=>1, 'columnspan'=>1, 'sticky'=>'news') + TkGrid.rowconfigure(w, 0, 'weight'=>1, 'minsize'=>0) + TkGrid.columnconfigure(w, 0, 'weight'=>1, 'minsize'=>0) + end + +}.pack('side'=>'top', 'expand'=>'yes', 'fill'=>'y') + +sayings_lbox.insert(0, +"Waste not, want not", +"Early to bed and early to rise makes a man healthy, wealthy, and wise", +"Ask not what your country can do for you, ask what you can do for your country", +"I shall return", +"NOT", +"A picture is worth a thousand words", +"User interfaces are hard to build", +"Thou shalt not steal", +"A penny for your thoughts", +"Fool me once, shame on you; fool me twice, shame on me", +"Every cloud has a silver lining", +"Where there's smoke there's fire", +"It takes one to know one", +"Curiosity killed the cat", +"Take this job and shove it", +"Up a creek without a paddle", +"I'm mad as hell and I'm not going to take it any more", +"An apple a day keeps the doctor away", +"Don't look a gift horse in the mouth" +) + diff --git a/ext/tk/sample/demos-jp/search.rb b/ext/tk/sample/demos-jp/search.rb new file mode 100644 index 0000000000..538c607c01 --- /dev/null +++ b/ext/tk/sample/demos-jp/search.rb @@ -0,0 +1,187 @@ +# +# Text Search widget demo (called by 'widget') +# + +# textLoadFile -- +# This method below loads a file into a text widget, discarding +# the previous contents of the widget. Tags for the old widget are +# not affected, however. +# +# Arguments: +# w - The window into which to load the file. Must be a +# text widget. +# file - The name of the file to load. Must be readable. + +def textLoadFile(w,file) + w.delete('1.0', 'end') + f = open(file, 'r') + while(!f.eof?) + w.insert('end', f.read(1000)) + end + f.close +end + +# textSearch -- +# Search for all instances of a given string in a text widget and +# apply a given tag to each instance found. +# +# Arguments: +# w - The window in which to search. Must be a text widget. +# string - The string to search for. The search is done using +# exact matching only; no special characters. +# tag - Tag to apply to each instance of a matching string. + +def textSearch(w, string, tag) + tag.remove('0.0', 'end') + return if string == "" + cur = '1.0' + loop { + cur, len = w.search_with_length(string, cur, 'end') + break if cur == "" + tag.add(cur, "#{cur} + #{len} char") + cur = w.index("#{cur} + #{len} char") + } +end + +# textToggle -- +# This method is invoked repeatedly to invoke two commands at +# periodic intervals. It normally reschedules itself after each +# execution but if an error occurs (e.g. because the window was +# deleted) then it doesn't reschedule itself. +# +# Arguments: +# cmd1 - Command to execute when method is called. +# sleep1 - Ms to sleep after executing cmd1 before executing cmd2. +# cmd2 - Command to execute in the *next* invocation of this method. +# sleep2 - Ms to sleep after executing cmd2 before executing cmd1 again. + +def textToggle(cmd1,sleep1,cmd2,sleep2) + sleep_list = [sleep2, sleep1] + TkAfter.new(proc{sleep = sleep_list.shift; sleep_list.push(sleep); sleep}, + -1, cmd1, cmd2).start(sleep1) +end + +# toplevel widget が存在すれば削除する +if defined?($search_demo) && $search_demo + $search_demo.destroy + $search_demo = nil +end + +# demo 用の toplevel widget を生成 +$search_demo = TkToplevel.new {|w| + title("Text Demonstration - Search and Highlight") + iconname("search") + positionWindow(w) +} + +# frame 生成 +$search_buttons = TkFrame.new($search_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $search_demo + $search_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'search'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$search_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 生成 +TkFrame.new($search_demo) {|f| + TkLabel.new(f, 'text'=>'ファイル名:', + 'width'=>13, 'anchor'=>'w').pack('side'=>'left') + $search_fileName = TkVariable.new + TkEntry.new(f, 'width'=>40, + 'textvariable'=>$search_fileName) { + pack('side'=>'left') + bind('Return', proc{textLoadFile($search_text, $search_fileName.value) + $search_string_entry.focus}) + focus + } + TkButton.new(f, 'text'=>'読み込み', + 'command'=>proc{textLoadFile($search_text, + $search_fileName.value)})\ + .pack('side'=>'left', 'pady'=>5, 'padx'=>10) +}.pack('side'=>'top', 'fill'=>'x') + +TkFrame.new($search_demo) {|f| + TkLabel.new(f, 'text'=>'検索文字列:', + 'width'=>13, 'anchor'=>'w').pack('side'=>'left') + $search_searchString = TkVariable.new + $search_string_entry = TkEntry.new(f, 'width'=>40, + 'textvariable'=>$search_searchString) { + pack('side'=>'left') + bind('Return', proc{textSearch($search_text, $search_searchString.value, + $search_Tag)}) + } + TkButton.new(f, 'text'=>'反転', + 'command'=>proc{textSearch($search_text, + $search_searchString.value, + $search_Tag)}) { + pack('side'=>'left', 'pady'=>5, 'padx'=>10) + } +}.pack('side'=>'top', 'fill'=>'x') + +$search_text = TkText.new($search_demo, 'setgrid'=>true) {|t| + $search_Tag = TkTextTag.new(t) + TkScrollbar.new($search_demo, 'command'=>proc{|*args| t.yview(*args)}) {|sc| + t.yscrollcommand(proc{|first,last| sc.set first,last}) + pack('side'=>'right', 'fill'=>'y') + } + pack('expand'=>'yes', 'fill'=>'both') +} + +# Set up display styles for text highlighting. + +if TkWinfo.depth($search_demo) > 1 + textToggle(proc{ + begin + $search_Tag.configure('background'=>'#ce5555', + 'foreground'=>'white') + rescue + end + }, + 800, + proc{ + begin + $search_Tag.configure('background'=>'', 'foreground'=>'') + rescue + end + }, + 200 ) +else + textToggle(proc{ + begin + $search_Tag.configure('background'=>'black', + 'foreground'=>'white') + rescue + end + }, + 800, + proc{ + begin + $search_Tag.configure('background'=>'', 'foreground'=>'') + rescue + end + }, + 200 ) +end +$search_text.insert('1.0', '\ +このウィンドウは検索機構を実現するのにテキスト widget のタグ機能がどの +ように使われるのかをデモするものです。まず上のエントリにファイル名を入 +れ、<リターン> を押すか「ロード」ボタンを押してください。次にその下の +エントリに文字列を入力し、<リターン> を押すか「反転」ボタンを押してく +ださい。するとファイル中の、検索文字列と一致する部分に全て "search_Tag" +というタグがつけられ、タグの表示属性としてその文字列が点滅するように +設定されます。') +$search_text.set_insert '0.0' + +$search_fileName.value = '' +$search_searchString.value = '' + diff --git a/ext/tk/sample/demos-jp/square b/ext/tk/sample/demos-jp/square new file mode 100644 index 0000000000..b914b735b2 --- /dev/null +++ b/ext/tk/sample/demos-jp/square @@ -0,0 +1,74 @@ +#!/usr/local/bin/ruby + +# square -- +# This script generates a demo application containing only +# a "square" widget. It's only usable if Tk has been compiled +# with tkSquare.c and with the -DSQUARE_DEMO compiler switch. +# This demo arranges the following bindings for the widget: +# +# Button-1 press/drag: moves square to mouse +# "a": toggle size animation on/off +# + +require 'tk' +require 'tkafter' + +class TkSquare<TkWindow + def create_self + tk_call 'square', path + end + def size(amount=nil) + if amount + tk_send 'size', amount + else + number(tk_send 'size') + end + end + def position(x,y) + tk_send 'position', x, y + end +end + +$s = TkSquare.new{ + pack('expand'=>'yes', 'fill'=>'both') + bind('1', proc{|x,y| center(x,y)}, '%s %y') + bind('B1-Motion', proc{|x,y| center(x,y)}, '%s %y') + bind('a', proc{animate}) + focus +} +TkRoot.new.minsize(1,1) + +# The procedure below centers the square on a given position. + +def center(x,y) + a = $s.size + $s.position(x-(a/2), y-(a/2)) +end + +# The procedures below provide a simple form of animation where +# the box changes size in a pulsing pattern: larger, smaller, larger, +# and so on. + +$inc = 0 + +def timer_proc + a = $s.size + return if $inc == 0 + $inc = -3 if a >= 40 + $inc = 3 if a <= 10 + $s.size(a+$inc) +end + +$timer = TkAfter.new(30, -1, proc{timer_proc}) + +def animate + if $inc == 0 + $inc = 3 + $timer.start + else + $inc = 0 + $timer.stop + end +end + +Tk.mainloop diff --git a/ext/tk/sample/demos-jp/states.rb b/ext/tk/sample/demos-jp/states.rb new file mode 100644 index 0000000000..cf8a6768b6 --- /dev/null +++ b/ext/tk/sample/demos-jp/states.rb @@ -0,0 +1,70 @@ +# +# listbox widget demo 'states' (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($states_demo) && $states_demo + $states_demo.destroy + $states_demo = nil +end + +# demo 用の toplevel widget を生成 +$states_demo = TkToplevel.new {|w| + title("Listbox Demonstration (states)") + iconname("states") + positionWindow(w) +} + +# label 生成 +msg = TkLabel.new($states_demo) { + font $font + wraplength '4i' + justify 'left' + text "下にあるのは都道府県名が入ったスクロールバー付のリストボックスです。リストをスクロールさせるのはスクロールバーでもできますし、リストボックスの中でマウスのボタン2(中ボタン)を押したままドラッグしてもできます。" +} +msg.pack('side'=>'top') + +# frame 生成 +TkFrame.new($states_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $states_demo + $states_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'states'} + }.pack('side'=>'left', 'expand'=>'yes') + +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 生成 +states_lbox = nil +TkFrame.new($states_demo, 'borderwidth'=>'.5c') {|w| + s = TkScrollbar.new(w) + states_lbox = TkListbox.new(w) { + setgrid 1 + height 12 + yscrollcommand proc{|first,last| s.set first,last} + } + s.command(proc{|*args| states_lbox.yview(*args)}) + s.pack('side'=>'right', 'fill'=>'y') + states_lbox.pack('side'=>'left', 'expand'=>1, 'fill'=>'both') +}.pack('side'=>'top', 'expand'=>'yes', 'fill'=>'y') + +ins_data = [ + '愛知','青森','秋田','石川','茨城','岩手','愛媛', + '大分','大阪','岡山','沖縄','香川','鹿児島','神奈川', + '岐阜','京都','熊本','群馬','高知','埼玉','佐賀', + '滋賀','静岡','島根','千葉','東京','徳島','栃木', + '鳥取','富山','長崎','長野','奈良','新潟','兵庫', + '広島','福井','福岡','福島','北海道','三重','宮城', + '宮崎','山形','山口','山梨','和歌山' +] + +states_lbox.insert(0, *ins_data) + diff --git a/ext/tk/sample/demos-jp/style.rb b/ext/tk/sample/demos-jp/style.rb new file mode 100644 index 0000000000..d58c6115ae --- /dev/null +++ b/ext/tk/sample/demos-jp/style.rb @@ -0,0 +1,247 @@ +# +# text (display styles) widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($style_demo) && $style_demo + $style_demo.destroy + $style_demo = nil +end + +# demo 用の toplevel widget を生成 +$style_demo = TkToplevel.new {|w| + title("Text Demonstration - Display Styles") + iconname("style") + positionWindow(w) +} + +# frame 生成 +TkFrame.new($style_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $style_demo + $style_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'style'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# text 生成 +TkText.new($style_demo){|t| + # 生成 + setgrid 'true' + width 70 + height 32 + wrap 'word' + TkScrollbar.new($style_demo) {|s| + pack('side'=>'right', 'fill'=>'y') + command proc{|*args| t.yview(*args)} + t.yscrollcommand proc{|first,last| s.set first,last} + } + pack('expand'=>'yes', 'fill'=>'both') + + # テキストタグ設定 (フォント関連) + style_tag_bold = TkTextTag.new(t, 'font'=>'-*-Courier-Bold-O-Normal--*-120-*-*-*-*-*-*') + style_tag_big = TkTextTag.new(t, 'font'=>'-*-Courier-Bold-R-Normal--*-140-*-*-*-*-*-*', 'kanjifont'=>$msg_kanji_font) + style_tag_verybig = TkTextTag.new(t, 'font'=>'-*-Helvetica-Bold-R-Normal--*-240-*-*-*-*-*-*') +# style_tag_small = TkTextTag.new(t, 'font'=>'-Adobe-Helvetica-Bold-R-Normal-*-100-*', 'kanjifont'=>$kanji_font) + style_tag_small = TkTextTag.new(t, 'font'=>'-Adobe-Helvetica-Bold-R-Normal-*-100-*') +### +# case($tk_version) +# when /^4.*/ +# style_tag_big = TkTextTag.new(t, 'font'=>'-*-Courier-Bold-R-Normal--*-140-*-*-*-*-*-*', 'kanjifont'=>$msg_kanji_font) +# style_tag_small = TkTextTag.new(t, 'font'=>'-Adobe-Helvetica-Bold-R-Normal-*-100-*', 'kanjifont'=>$kanji_font) +# when /^8.*/ +# unless $style_demo_do_first +# $style_demo_do_first = true +# Tk.tk_call('font', 'create', '@bigascii', +# '-copy', '-*-Courier-Bold-R-Normal--*-140-*-*-*-*-*-*') +# Tk.tk_call('font', 'create', '@smallascii', +# '-copy', '-Adobe-Helvetica-Bold-R-Normal-*-100-*') +# Tk.tk_call('font', 'create', '@cBigFont', +# '-compound', '@bigascii @msg_knj') +# Tk.tk_call('font', 'create', '@cSmallFont', +# '-compound', '@smallascii @kanji') +# end +# style_tag_big = TkTextTag.new(t, 'font'=>'@cBigFont') +# style_tag_small = TkTextTag.new(t, 'font'=>'@cSmallFont') +# end + + # テキストタグ設定 (色,レリーフ関連) + if TkWinfo.depth($root).to_i > 1 + style_tag_color1 = TkTextTag.new(t, 'background'=>'#a0b7ce') + style_tag_color2 = TkTextTag.new(t, 'foreground'=>'red') + style_tag_raised = TkTextTag.new(t, 'relief'=>'raised', 'borderwidth'=>1) + style_tag_sunken = TkTextTag.new(t, 'relief'=>'sunken', 'borderwidth'=>1) + else + style_tag_color1 = TkTextTag.new(t, 'background'=>'black', + 'foreground'=>'white') + style_tag_color2 = TkTextTag.new(t, 'background'=>'black', + 'foreground'=>'white') + style_tag_raised = TkTextTag.new(t, 'background'=>'white', + 'relief'=>'raised', 'borderwidth'=>1) + style_tag_sunken = TkTextTag.new(t, 'background'=>'white', + 'relief'=>'sunken', 'borderwidth'=>1) + end + + # テキストタグ設定 (その他) + if $tk_version =~ /^4\.[01]/ + style_tag_bgstipple = TkTextTag.new(t, 'background'=>'black', + 'borderwidth'=>0, + 'bgstipple'=>'gray25') + else + style_tag_bgstipple = TkTextTag.new(t, 'background'=>'black', + 'borderwidth'=>0, + 'bgstipple'=>'gray12') + end + style_tag_fgstipple = TkTextTag.new(t, 'fgstipple'=>'gray50') + style_tag_underline = TkTextTag.new(t, 'underline'=>'on') + style_tag_overstrike = TkTextTag.new(t, 'overstrike'=>'on') + style_tag_right = TkTextTag.new(t, 'justify'=>'right') + style_tag_center = TkTextTag.new(t, 'justify'=>'center') + style_tag_super = TkTextTag.new(t, 'offset'=>'4p', 'font'=>'-Adobe-Courier-Medium-R-Normal--*-100-*-*-*-*-*-*') + style_tag_sub = TkTextTag.new(t, 'offset'=>'-2p', 'font'=>'-Adobe-Courier-Medium-R-Normal--*-100-*-*-*-*-*-*') + style_tag_margins = TkTextTag.new(t, 'lmargin1'=>'12m', 'lmargin2'=>'6m', + 'rmargin'=>'10m') + style_tag_spacing = TkTextTag.new(t, 'spacing1'=>'10p', 'spacing2'=>'2p', + 'lmargin1'=>'12m', 'lmargin2'=>'6m', + 'rmargin'=>'10m') + + # テキスト挿入 + insert('end', 'このようにテキスト widget は情報を様々なスタイルで表示すること +ができます。') + insert('end', 'タグ', style_tag_big) + insert('end', 'というメカニズムでコントロールされます。 +タグとはテキスト widget 内のある文字 (の範囲)に対して適用できる +単なる名前のことです。タグは様々な表示スタイルに設定できます。 +設定すると、そのタグのついた文字は指定したスタイルで表示される +ようになります。使用できる表示スタイルは次の通りです。 +') + insert('end', ' +1. フォント', style_tag_big) + insert('end', ' どんな X のフォントでも使えます。') + insert('end', 'large', style_tag_verybig) + insert('end', ' +とか') +# insert('end', '小さい', style_tag_small) + insert('end', 'small', style_tag_small) + insert('end', 'とか。 +') + insert('end', ' +2. 色', style_tag_big) + insert('end', ' ') + insert('end', '背景色', style_tag_color1) + insert('end', 'も') + insert('end', '前景色', style_tag_color2) + insert('end', 'も') + insert('end', '両方', style_tag_color1, style_tag_color2) + insert('end', 'とも変えることができます。 +') + insert('end', ' +3. 網かけ', style_tag_big) + insert('end', ' このように描画の際に') + insert('end', '背景も', style_tag_bgstipple) + insert('end', '文字も', style_tag_fgstipple) + insert('end', '単なる塗りつぶし +でなく、網かけを使うことができます。 +') + insert('end', ' +4. 下線', style_tag_big) + insert('end', ' このように') + insert('end', '文字に下線を引く', style_tag_underline) + insert('end', 'ことができます。 +') + insert('end', ' +5. 打ち消し線', style_tag_big) + insert('end', ' このように') + insert('end', '文字に重ねて線を引く', style_tag_overstrike) + insert('end', 'ことができます。 +') + insert('end', ' +6. 3D 効果', style_tag_big) + insert('end', ' 背景に枠をつけて、文字を') + insert('end', '飛び出す', style_tag_raised) + insert('end', 'ようにしたり') + insert('end', '沈む', style_tag_sunken) + insert('end', ' +ようにできます。 +') + insert('end', ' +7. 行揃え', style_tag_big) + insert('end', ' このように行を +') + insert('end', '左に揃えたり +') + insert('end', '右に揃えたり +', style_tag_right) + insert('end', '真中に揃えたりできます。 +', style_tag_center) + insert('end', ' +8. 肩付き文字と添字', style_tag_big) + insert('end', ' 10') + insert('end', 'n', style_tag_super) + insert('end', ' のように肩付き文字の効果や、') + insert('end', ' +X') + insert('end', 'i', style_tag_sub) + insert('end', 'のように添字の効果を出すことができます。 +') + insert('end', ' +9. マージン', style_tag_big) + insert('end', 'テキストの左側に余分な空白を置くことができます: +') + insert('end', 'この段落はマージンの使用例です。スクリーン', + style_tag_margins) + insert('end', '上で折り返されて表示されている1行のテキストです。', + style_tag_margins) + insert('end', '左側には2種類のマージンを持ちます。', style_tag_margins) + insert('end', '1行目に対するものと、', style_tag_margins) + insert('end', '2行目以降の連続したマージン', style_tag_margins) + insert('end', 'です。また右側にもマージンがあります。', style_tag_margins) + insert('end', '行の折り返し位置を決めるために使用することができます。 +', style_tag_margins) + insert('end', ' +10. スペーシング', style_tag_big) + insert('end', '3つのパラメータで行のスペーシングを') + insert('end', '制御す +ることができます。Spacing1で、行の') + insert('end', '上にどのくらいの空間を置くか、 +spacing3') + insert('end', 'で行の下にどのくらいの空間を置くか、') + insert('end', '行が折り返されているなら +ば、spacing2で、') + insert('end', 'テキスト行を生成している行の間にどのくらい') + insert('end', 'の空間を置 +くかを示します。 +') + insert('end', 'これらのインデントされた段落はどのように', + style_tag_spacing) + insert('end', 'スペーシングがが行われるのかを示します。', + style_tag_spacing) + insert('end', '各段落は実際はテキストwidget', style_tag_spacing) + insert('end', 'の1行で、widgetによって折り畳まれています。 +', style_tag_spacing) + insert('end', 'Spacing1はこのテキストでは10pointに', style_tag_spacing) + insert('end', '設定されています。', style_tag_spacing) + insert('end', 'これにより、段落の間に大きな間隔が', style_tag_spacing) + insert('end', '存在しています。', style_tag_spacing) + insert('end', 'Spacing2は2pointに設定されています。', style_tag_spacing) + insert('end', 'これで段落の中にほんの少し間隔が存在しています。', + style_tag_spacing) + insert('end', 'Spacing3はこの例では使用されていません。 +', style_tag_spacing) + insert('end', '間隔がどこにあるかを見たければ、これらの段落の', + style_tag_spacing) + insert('end', 'なかでテキストを選択してください。選択の', style_tag_spacing) + insert('end', '反転した部分には余分にとられた間隔が', style_tag_spacing) + insert('end', '含まれています。 +', style_tag_spacing) + +} + diff --git a/ext/tk/sample/demos-jp/tcolor b/ext/tk/sample/demos-jp/tcolor new file mode 100644 index 0000000000..5464aebae2 --- /dev/null +++ b/ext/tk/sample/demos-jp/tcolor @@ -0,0 +1,513 @@ +#!/usr/local/bin/ruby +# +# tcolor -- +# このスクリプトはRGB,HSB,CYM形式をサポートする +# 簡易カラーエディタです。 +# +# Copyright (C) 1998 Takaaki Tateishi(ttate@jaist.ac.jp) +# last update: Thu Jun 18 06:32:35 JST 1998 +# + +# まずはtk.rbを読み込む。 + +require "tk" + + +# Tkによって変更される変数はTkVariableのインスタンスを使う。 + +$colorSpace = TkVariable.new(:rgb) +$red = 65535 +$green = 0 +$blue = 0 +$color = "#ffff00000000" +$updating = TkVariable.new(0) +$autoUpdate = TkVariable.new(1) +$name = TkVariable.new("") +# $command = TkVariable.new("print(%%,\"\n\")") +$command = TkVariable.new("") +$label1 = TkVariable.new("label1") +$label2 = TkVariable.new("label2") +$label3 = TkVariable.new("label3") + + +# 各イベント用のメソッド + +def rgbToHsv(red,green,blue) + + if ( red > green ) + max = red + min = green + else + max = green + min = red + end + + if ( blue > max ) + max = blue + else + if ( blue < min ) + min = blue + end + end + + range = max - min + + if ( max == 0 ) + sat = 0.0 + else + sat = (max-min)/max + end + + if ( sat == 0 ) + hue = 0.0 + else + rc = (max-red)/range + gc = (max-green)/range + bc = (max-blue)/range + if ( red == max ) + hue = 0.166667 * (bc - gc) + else + if ( green == max ) + hue = 0.166667 * (2.0 + rc - bc) + else + hue = 0.166667 * (4.0 + gc - rc) + end + end + if ( hue < 0.0 ) + hue = hue + 1.0 + end + end + + [hue,sat,max/65535] +end + + +def hsbToRgb(hue,sat,value) + v = 65535.0 * value + if( sat == 0 ) + ans = [v,v,v] + else + hue = hue*6.0 + if ( hue >= 6 ) + hue = 0.0 + end + i = hue.to_i + f = hue - i + p = 65535.0 * value * (1.0 - sat) + q = 65535.0 * value * (1.0 - (sat * f)) + t = 65535.0 * value * (1.0 - (sat * (1.0 - f))) + case i + when 0 + ans = [v,t,p] + when 1 + ans = [q,v,p] + when 2 + ans = [p,v,t] + when 3 + ans = [p,q,v] + when 4 + ans = [t,p,v] + when 5 + ans = [v,p,q] + else + raise(eException,"i value #{i} is out of range") + end + end + return ans +end + + +def doUpdate + newCmd = $command.to_s.gsub("%%","\"#{$color}\"") + eval(newCmd) +end + + +def tc_scaleChanged + if( $updating.to_i == 1 ) + return + end + + scale1 = $root.middle.middle.scale1 + scale2 = $root.middle.middle.scale2 + scale3 = $root.middle.middle.scale3 + + case $colorSpace.to_i + when :rgb + $red = (scale1.get * 65.535).to_i + $green = (scale2.get * 65.535).to_i + $blue = (scale3.get * 65.535).to_i + when :cmy + $red = (65535 - scale1.get * 65.535).to_i + $green = (65535 - scale2.get * 65.535).to_i + $blue = (65535 - scale3.get * 65.535).to_i + when :hsb + list = hsbToRgb(scale1.get / 1000.0, + scale2.get / 1000.0, + scale3.get / 1000.0) + $red = list[0] + $green = list[1] + $blue = list[2] + else + raise(Exception,"unknown colorSpace") + end + $color = format("#%04x%04x%04x",$red.to_i,$green.to_i,$blue.to_i) + $root.middle.right.set_color($color) + if( $autoUpdate.to_i == 1 ) + doUpdate + end + Tk.update(TRUE) +end + + +def tc_setScales + $updating.value = 1 + + scale1 = $root.middle.middle.scale1 + scale2 = $root.middle.middle.scale2 + scale3 = $root.middle.middle.scale3 + + case $colorSpace.to_i + when :rgb + scale1.set($red / 65.535) + scale2.set($green / 65.535) + scale3.set($blue / 65.535) + when :cmy + scale1.set((65535 - $red) / 65.535) + scale2.set((65535 - $green) / 65.535) + scale3.set((65535 - $blue) / 65.535) + when :hsb + list = rgbToHsv($red,$green,$blue) + scale1.set( list[0] * 1000.0 ) + scale2.set( list[1] * 1000.0 ) + scale3.set( list[2] * 1000.0 ) + else + raise(Exception,"unknown colorSpace") + end + + $updating.value = 0 +end + + +def tc_loadNamedColor(name) + if name[0,1] != "#" + list = TkWinfo.rgb($root.middle.right.swatch,name) + $red = list[0] + $green = list[1] + $blue = list[2] + else + case name.length + when 4 + format = /#(.{1})(.{1})(.{1})/ + shift = 12 + when 7 + format = /#(.{2})(.{2})(.{2})/ + shift = 8 + when 10 + format = /#(.{3})(.{3})(.{3})/ + shift = 4 + when 13 + format = /#(.{4})(.{4})(.{4})/ + shift = 0 + else + raise(eException,"syntax error in color name \"#{name}\"") + end + name.scan(format){|strlist| + if strlist.length != 3 + raise(eException,"syntax error in color name \"#{name}\"") + end + $red = strlist[0].to_i + $green = strlist[1].to_i + $blue = strlist[2].to_i + } + $red = $red << shift + $green = $green << shift + $blue = $blue << shift + end + + tc_setScales + $color = format("#%04x%04x%04x",$red,$green,$blue) + $root.middle.right.set_color($color) + if $autoUpdate.to_i == 1 + doUpdate + end +end + + +def changeColorSpace(space) + case space + when :rgb + $label1.value = "Red" + $label2.value = "Green" + $label3.value = "Blue" + when :cmy + $label1.value = "Cyan" + $label2.value = "Magenta" + $label3.value = "Yellow" + when :hsb + $label1.value = "Hue" + $label2.value = "Saturation" + $label3.value = "Brightness" + end + tc_setScales +end + + + + + +# tcolor用のメニュー + +class TkColorMenuFrame<TkFrame + def initialize(parent) + super(parent, + "relief"=>"raised", + "borderwidth"=>"2") + + # Fileメニューボタンの生成 + @file = TkMenubutton.new(self){|button| + + # Fileメニューの作成 + @file_menu = TkMenu.new(button){ + add "radio", + "label" => "RGB color space", + "variable" => $colorSpace, + "value" => :rgb, + "underline" => "0", + "command" => proc{changeColorSpace(:rgb)} + add "radio", + "label" => "CMY color space", + "variable" => $colorSpace, + "value" => :cmy, + "underline" => "0", + "command" => proc{changeColorSpace(:cmy)} + add "radio", + "label" => "HSB color space", + "variable" => $colorSpace, + "value" => :hsb, + "underline" => "0", + "command" => proc{changeColorSpace(:hsb)} + add "separator" + add "radio", + "label" => "Qutomatic updates", + "variable" => $autoUpdate, + "value" => "1", + "underline" => "0" + add "radio", + "label" => "Manual updates", + "variable" => $autoUpdate, + "value" => "0", + "underline" => "0" + add "separator" + add "command", + "label" => "Exit program", + "underline" => "0", + "command" => proc{exit} + } + + # FileメニューとFileボタンを関連付ける + menu @file_menu + + text "File" + underline "0" + }.pack("side"=>"left") + + self + end +end + + +# 下部のフレームのためのクラス +class TkColorBotFrame<TkFrame + def initialize(parent) + super(parent, + "relief"=> "raised", + "borderwidth"=> 2) + + @commandLabel = TkLabel.new(self, + "text"=> "Command:") + @command = TkEntry.new(self, + "relief"=> "sunken", + "borderwidth"=> "2", + "textvariable"=> $command, + "font"=> "-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*") + @update = TkButton.new(self, + "text"=> "Update", + "command"=> proc{doUpdate}) + @commandLabel.pack("side"=>"left") + @update.pack("side"=>"right","pady"=>".1c","padx"=>".25c") + @command.pack("expand"=>"yes","fill"=>"x","ipadx"=>".25c") + + self + end +end + + +# 中段左のフレーム +class TkColorMiddleLeftFrame<TkFrame + def initialize(parent) + super(parent) + + for i in ["/usr/local/lib/X11rgb.txt","/usr/lib/X11/rgb.txt", + "/X11/R5/lib/X11/rgb.txt","/X11/R4/lib/rgb/rgb.txt", + "/usr/openwin/lib/X11/rgb.txt"] + if !File.readable?(i) + next + end + f = File.open(i) + @scroll = TkScrollbar.new(self, + "orient"=>"vertical", + "relief"=>"sunken", + "borderwidth"=>"2") + @scroll.pack("side"=>"right","fill"=>"y") + @names = TkListbox.new(self, + "width"=>"20", + "height"=>"12", + "yscrollcommand"=> proc{|first,last| @scroll.set first,last}, + "relief"=>"sunken", + "borderwidth"=>"2", + "exportselection"=>"false") + @scroll.command(proc{|*args| @names.yview *args}) + @names.bind("Double-1",proc{ + tc_loadNamedColor(@names.get(@names.curselection))}) + @names.pack("side"=>"left") + while (line = f.gets) + line.chop! + linelist = line.split(/[ \t]+/) + if linelist.length == 4 + @names.insert("end",linelist[3]) + end + end + f.close + break + end + + self + end +end + + +# 中段中央のフレーム +class TkColorMiddleMiddleFrame<TkFrame + # @scale1,@scale2,@scale3を外部から参照のみ許可する。(変更不可) + attr_reader :scale1, :scale2, :scale3 + + def initialize(parent) + super(parent) + + @f1 = TkFrame.new(self) + @f2 = TkFrame.new(self) + @f3 = TkFrame.new(self) + @f4 = TkFrame.new(self) + + for f in [@f1,@f2,@f3] + f.pack("side"=>"top","expand"=>"yes") + end + @f4.pack("side"=>"top","expand"=>"yes","fill"=>"x") + + @label1 = TkLabel.new(self,"textvariable"=>$label1) + @scale1 = TkScale.new(self,"from"=>"0","to"=>"1000","length"=>"6c", + "orient"=>"horizontal", + "command"=>proc{tc_scaleChanged}) + @scale1.pack("side"=>"top","anchor"=>"w") + @label1.pack("side"=>"top","anchor"=>"w") + + @label2 = TkLabel.new(self,"textvariable"=>$label2) + @scale2 = TkScale.new(self,"from"=>"0","to"=>"1000","length"=>"6c", + "orient"=>"horizontal", + "command"=>proc{tc_scaleChanged}) + @scale2.pack("side"=>"top","anchor"=>"w") + @label2.pack("side"=>"top","anchor"=>"w") + + @label3 = TkLabel.new(self,"textvariable"=>$label3) + @scale3 = TkScale.new(self,"from"=>"0","to"=>"1000","length"=>"6c", + "orient"=>"horizontal", + "command"=>proc{tc_scaleChanged}) + @scale3.pack("side"=>"top","anchor"=>"w") + @label3.pack("side"=>"top","anchor"=>"w") + + @nameLabel = TkLabel.new(self,"text"=>"Name:") + @name = TkEntry.new(self,"relief"=>"sunken","borderwidth"=>"2", + "textvariable"=>$name,"width"=>"10", + "font"=>"-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*") + @nameLabel.pack("side"=>"left") + @name.pack("side"=>"right", "expand"=>"1", "fill"=>"x") + @name.bind("Return",proc{tc_loadNamedColor $name.to_s}) + + self + end +end + + +class TkColorMiddleRightFrame<TkFrame + attr_reader :swatch + + def initialize(parent) + super(parent) + @swatch = TkFrame.new(self, "width"=>"2c", "height"=>"5c", + "background"=>$color) + @value = TkLabel.new(self, + "text"=>$color, + "width"=>"13", + "font"=>"-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*") + @swatch.pack("side"=>"top","expand"=>"yes","fill"=>"both") + @value.pack("side"=>"bottom","pady"=>".25c") + + self + end + + def set_color(color) + @swatch["background"] = color + @value["text"] = color + end +end + + + +# 中段のフレーム +class TkColorMiddleFrame<TkFrame + attr_reader :left, :middle, :right + + def initialize(parent) + super(parent, + "relief"=> "raised", + "borderwidth"=> "2") + + @left = TkColorMiddleLeftFrame.new(self) + @left.pack("side"=>"left","padx"=>".25c","pady"=>".25c") + + @middle = TkColorMiddleMiddleFrame.new(self) + @middle.pack("side"=>"left","expand"=>"yes","fill"=>"y") + + @right = TkColorMiddleRightFrame.new(self) + @right.pack("side"=>"left","padx"=>".25c","pady"=>".25c","anchor"=>"s") + + self + end +end + + +class TkColor<TkRoot + attr_reader :menu, :bottom, :middle + + def initialize + super + @menu = TkColorMenuFrame.new(self) + @menu.pack("side"=>"top", "fill"=>"x") + + @bottom = TkColorBotFrame.new(self) + @bottom.pack("side"=>"bottom","fill"=>"x") + + @middle = TkColorMiddleFrame.new(self) + @middle.pack("side"=>"top","fill"=>"both") + + self + end +end + + +$root = TkColor.new + +# イベントを待つ為にループに入る。 +changeColorSpace :rgb +Tk.mainloop diff --git a/ext/tk/sample/demos-jp/text.rb b/ext/tk/sample/demos-jp/text.rb new file mode 100644 index 0000000000..a8232088a5 --- /dev/null +++ b/ext/tk/sample/demos-jp/text.rb @@ -0,0 +1,94 @@ +# +# text (basic facilities) widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($text_demo) && $text_demo + $text_demo.destroy + $text_demo = nil +end + +# demo 用の toplevel widget を生成 +$text_demo = TkToplevel.new {|w| + title("Text Demonstration - Basic Facilities") + iconname("text") + positionWindow(w) +} + +# frame 生成 +TkFrame.new($text_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $text_demo + $text_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'text'} + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# text 生成 +TkText.new($text_demo){|t| + # 生成 + relief 'sunken' + bd 2 + setgrid 1 + height 30 + TkScrollbar.new($text_demo) {|s| + pack('side'=>'right', 'fill'=>'y') + command proc{|*args| t.yview(*args)} + t.yscrollcommand proc{|first,last| s.set first,last} + } + pack('expand'=>'yes', 'fill'=>'both') + + # テキスト挿入 + insert('0.0', %q| +このウィンドウはテキスト widget です。1行またはそれ以上のテキストを表 +示・編集することができます。以下はテキスト widget でできる操作について +まとめたものです。 + +1. スクロール。スクロールバーでテキストの表示部分を動かすことができます。 + +2. スキャニング。テキストのウィンドウでマウスボタン2 (中ボタンを) を押 +して上下にドラッグしてください。そうするとテキストが高速でドラッグされ、 +内容をざっと眺めることができます。 + +3. テキストの挿入。マウスボタン1 (左ボタン) を押し、挿入カーソルをセッ +トしてからテキストを入力してください。入力したものが widget に入ります。 + +4. 選択。ある範囲の文字を選択するにはマウスボタン1 を押し、ドラッグし +てください。一度ボタンを離したら、シフトキーを押しながらボタン1 を押す +ことで選択範囲の調整ができます。これは選択範囲の最後をマウスカーソルに +最も近い位置にリセットし、ボタンを離す前にマウスをドラッグすることでさ +らに選択範囲を調整できます。ダブルクリックでワードを、またトリプルクリッ +クで行全体を選択することができます。 + +5. 消去と置換。テキストを消去するには、消去したい文字を選択してバック +スペースかデリートキーを入力してください。あるいは、新しいテキストを +入力すると選択されたテキストと置換されます。 + +6. 選択部分のコピー。選択部分をこのウィンドウの中のどこかにコピーする +には、まずコピーしたい所を選択(ここで、あるいは別のアプリケーションで) +し、ボタン 2 をクリックして、挿入カーソルの位置にコピーしてください。 + +7. 編集。テキスト widget は Emacs のキーバインドに加えて標準的なの Motif +の編集機能をサポートしています。バックスペースとコントロール-H は挿入 +カーソルの左側の文字を削除します。デリートキーとコントロール-D は挿入 +カーソルの右側の文字を削除します。Meta-バックスペースは挿入カーソルの +右側の単語を削除し、Meta-D は挿入カーソルの左側の単語を削除します。 +コントロール-K は挿入カーソルから行末までを削除し、その位置に改行 +しかなかった場合は、改行を削除します。 + +8. ウィンドウのリサイズ。この widget は "setGrid" オプションをオンにし +てありますので、ウィンドウをリサイズする時には高さと幅は常に文字高と文 +字幅の整数倍になります。また、ウィンドウを狭くした場合には長い行が自動 +的に折り返され、常に全ての内容が見えるようになっています。|) + + set_insert('0.0') +} + diff --git a/ext/tk/sample/demos-jp/timer b/ext/tk/sample/demos-jp/timer new file mode 100644 index 0000000000..232f4ae5ca --- /dev/null +++ b/ext/tk/sample/demos-jp/timer @@ -0,0 +1,120 @@ +#!/usr/local/bin/ruby +# +# timer -- +# This script generates a counter with start,stop and reset buttons. +# +# Copyright (C) 1998 Takaaki Tateishi (ttate@jaist.ac.jp) +# last update: Sat Jun 27 12:24:14 JST 1998 +# + +require "tk" +require "thread" +require "tkafter" + +$time = "0.00" +$m = Mutex.new +$loop = false + +def timer_stop + $loop = false + $m.lock +end + +def timer_start + $loop = true + $m.unlock +end + +def timer_reset + $time = "0.00" + $root.countframe.counter['text'] = $time +end + +def timer_loop + if $loop + $time = $time.succ + $root.countframe.counter['text'] = $time + end + Tk.after(10,proc{timer_loop}) +end + + +# +# thread version +# +def timer_loop2 + while true + $m.lock + $time = $time.succ + $root.countframe.counter['text'] = $time + sleep(0.01) + $m.unlock + end +end + +# +# TkAfter +# +def timer_loop3 + if $loop + $time = $time.succ + $root.countframe.counter['text'] = $time + end +end + + +class CountFrame < TkFrame + attr_reader :counter + + def initialize(parent=nil,keys=nil) + super(parent,keys) + @counter = TkLabel.new(self, + 'text'=>$time, + 'relief'=>'raised') + @counter.pack('fill'=>'both') + self + end +end + + +class ButtonFrame < TkFrame + def initialize(parent=nil,keys=nil) + super(parent,keys) + @stop = TkButton.new(self, + 'text'=>'Stop', + 'command'=>proc{timer_stop}) + @start = TkButton.new(self, + 'text'=>'Start', + 'command'=>proc{timer_start}) + @reset = TkButton.new(self, + 'text'=>'Reset', + 'command'=>proc{timer_reset}) + for b in [@stop,@start,@reset] + b.pack('side'=>'left', 'fill'=>'both', 'expand'=>'yes') + end + end +end + + +class Timer < TkRoot + attr_reader :countframe + + def initialize + super + @countframe = CountFrame.new(self) + @buttonframe = ButtonFrame.new(self) + for f in [@buttonframe,@countframe] + f.pack('side'=>'top', 'fill'=>'both') + end + self + end +end + + +$root = Timer.new + +#$thread = Thread.start{timer_loop2} +#timer_loop +TkAfter.new(10,-1,proc{timer_loop3}).start + +Tk.mainloop diff --git a/ext/tk/sample/demos-jp/twind.rb b/ext/tk/sample/demos-jp/twind.rb new file mode 100644 index 0000000000..d35acd24d0 --- /dev/null +++ b/ext/tk/sample/demos-jp/twind.rb @@ -0,0 +1,284 @@ +# +# text (embedded windows) widget demo (called by 'widget') +# + +# toplevel widget が存在すれば削除する +if defined?($twind_demo) && $twind_demo + $twind_demo.destroy + $twind_demo = nil +end + +# demo 用の toplevel widget を生成 +$twind_demo = TkToplevel.new {|w| + title("Text Demonstration - Embedded Windows") + iconname("Embedded Windows") + positionWindow(w) +} + +# frame 生成 +$twind_buttons = TkFrame.new($twind_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc{ + tmppath = $twind_demo + $twind_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc{showCode 'twind'} + }.pack('side'=>'left', 'expand'=>'yes') +} +$twind_buttons.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +# frame 生成 +$twind_text = nil +TkFrame.new($twind_demo, 'highlightthickness'=>2, 'borderwidth'=>2, + 'relief'=>'sunken') {|f| + $twind_text = TkText.new(f, 'setgrid'=>'true', 'font'=>$font, + 'width'=>'70', 'height'=>35, 'wrap'=>'word', + 'highlightthickness'=>0, 'borderwidth'=>0 ){|t| + TkScrollbar.new(f) {|s| + command proc{|*args| t.yview(*args)} + t.yscrollcommand proc{|first,last| s.set first,last} + }.pack('side'=>'right', 'fill'=>'y') + }.pack('expand'=>'yes', 'fill'=>'both') +}.pack('expand'=>'yes', 'fill'=>'both') + +# タグ生成 +$tag_center = TkTextTag.new($twind_text, + 'justify' =>'center', + 'spacing1'=>'5m', + 'spacing3'=>'5m' ) +$tag_buttons = TkTextTag.new($twind_text, + 'lmargin1'=>'1c', + 'lmargin2'=>'1c', + 'rmargin' =>'1c', + 'spacing1'=>'3m', + 'spacing2'=>0, + 'spacing3'=>0 ) + +# テキストの生成 +$twind_text.insert('end', + 'テキストwidget上に他のwidgetを組み込むことができます。') +$twind_text.insert('end', + '組み込みウィンドウと呼ばれ、任意のwidgetが可能です。') +$twind_text.insert('end', + '例えば、ここに2つのボタンwidgetが組み込まれています。') +$twind_text.insert('end', '最初のボタンをクリックすと水平方向のスクロールを') +TkTextWindow.new($twind_text, 'end', + 'window'=>TkButton.new($twind_text) { + #text 'ON' + text 'オン' + command proc{textWindOn $twind_text,$twind_buttons} + cursor 'top_left_arrow' + }) +$twind_text.insert('end', 'にします。また2つめのボタンをクリックすると') +$twind_text.insert('end', '水平方向のスクロールを') +TkTextWindow.new($twind_text, 'end', + 'window'=>TkButton.new($twind_text) { + #text 'OFF' + text 'オフ' + command proc{textWindOff $twind_text} + cursor 'top_left_arrow' + }) +$twind_text.insert('end', 'にします。') + +$twind_text.insert('end', 'もうひとつの例です。') +TkTextWindow.new($twind_text, 'end', + 'window'=>TkButton.new($twind_text) { + text 'ここをクリック' + command proc{textWindPlot $twind_text} + cursor 'top_left_arrow' + }) +$twind_text.insert('end', 'すると、x-yプロットがここに現れます。') +$mark_plot = TkTextMark.new($twind_text, 'insert') +$mark_plot.gravity='left' +$twind_text.insert('end', 'マウスでデータを描画することができます。') +TkTextWindow.new($twind_text, 'end', + 'window'=>TkButton.new($twind_text) { + text '消去' + command proc{textWindDel $twind_text} + cursor 'top_left_arrow' + }) +$twind_text.insert('end', 'をクリックすると元に戻ります。 + +') + +$twind_text.insert('end', '組み込みウィンドウだけをテキストwidget上に、実際の') +$twind_text.insert('end', 'テキストはなしで組み込むことは便利です。') +$twind_text.insert('end', 'この場合は、テキストwidgetはウィンドウマネージャの') +$twind_text.insert('end', 'ように動作します。例えば、ここにはテキストwidgetに') +$twind_text.insert('end', 'よってボタンがきれいに並べられています。') +$twind_text.insert('end', 'これらのボタンで背景色を変えることができます') +$twind_text.insert('end', '("Default"で元の色に戻すことができます)。') +$twind_text.insert('end', '"Short"というボタンをクリックすると文字列の長さが') +$twind_text.insert('end', '変わります。すると自動的にテキストwidgetが') +$twind_text.insert('end', 'レイアウトを整えてくれます。') +$twind_text.insert('end', 'もう一度同じボタンを押すと元に戻ります。 + +') + +TkTextWindow.new($twind_text, 'end', + 'window'=>TkButton.new($twind_text) {|b| + text 'デフォルト' + command proc{embDefBg $twind_text} + cursor 'top_left_arrow' + $tag_buttons.add('end') + }, + 'padx'=>3 ) +embToggle = TkVariable.new('Short') +TkTextWindow.new($twind_text, 'end', + 'window'=>TkCheckButton.new($twind_text) { + textvariable embToggle + indicatoron 0 + variable embToggle + onvalue 'A much longer string' + offvalue 'Short' + cursor 'top_left_arrow' + pady 5 + padx 2 + }, + 'padx'=>3, + 'pady'=>2 ) + +[ 'AntiqueWhite3', 'Bisque1', 'Bisque2', 'Bisque3', 'Bisque4', + 'SlateBlue3', 'RoyalBlue1', 'SteelBlue2', 'DeepSkyBlue3', 'LightBlue1', + 'DarkSlateGray1', 'Aquamarine2', 'DarkSeaGreen2', 'SeaGreen1', + 'Yellow1', 'IndianRed1', 'IndianRed2', 'Tan1', 'Tan4' +].each{|twind_color| + TkTextWindow.new($twind_text, 'end', + 'window'=>TkButton.new($twind_text) { + text twind_color + cursor 'top_left_arrow' + command proc{$twind_text.bg twind_color} + }, + 'padx'=>3, + 'pady'=>2 ) +} + +# メソッド定義 +def textWindOn (w,f) + if defined? $twind_scroll + begin + $twind_scroll.destroy + rescue + end + $twind_scroll = nil + end + + base = TkWinfo.parent( TkWinfo.parent(w) ) + $twind_scroll = TkScrollbar.new(base) {|s| + orient 'horizontal' + command proc{|*args| w.xview(*args)} + w.xscrollcommand proc{|first,last| s.set first,last} + w.wrap 'none' + pack('after'=>f, 'side'=>'bottom', 'fill'=>'x') + } + + return nil +end + +def textWindOff (w) + if defined? $twind_scroll + begin + $twind_scroll.destroy + rescue + end + $twind_scroll = nil + end + w.xscrollcommand '' + w.wrap 'word' +end + +def textWindPlot (t) + if (defined? $twind_plot) && (TkWinfo.exist?($twind_plot)) + return + end + + $twind_plot = TkCanvas.new(t) { + relief 'sunken' + width 450 + height 300 + cursor 'top_left_arrow' + } + + font = '-Adobe-Helvetica-Medium-R-Normal--*-180-*-*-*-*-*-*' + + TkcLine.new($twind_plot, 100, 250, 400, 250, 'width'=>2) + TkcLine.new($twind_plot, 100, 250, 100, 50, 'width'=>2) + TkcText.new($twind_plot, 225, 20, + 'text'=>"A Simple Plot", 'font'=>font, 'fill'=>'brown') + + (0..10).each {|i| + x = 100 + (i * 30) + TkcLine.new($twind_plot, x, 250, x, 245, 'width'=>2) + TkcText.new($twind_plot, x, 254, + 'text'=>10*i, 'font'=>font, 'anchor'=>'n') + } + (0..5).each {|i| + y = 250 - (i * 40) + TkcLine.new($twind_plot, 100, y, 105, y, 'width'=>2) + TkcText.new($twind_plot, 96, y, + 'text'=>"#{i*50}.0", 'font'=>font, 'anchor'=>'e') + } + + for xx, yy in [[12,56],[20,94],[33,98],[32,120],[61,180],[75,160],[98,223]] + x = 100 + (3*xx) + y = 250 - (4*yy)/5 + item = TkcOval.new($twind_plot, x-6, y-6, x+6, y+6, + 'width'=>1, 'outline'=>'black', 'fill'=>'SkyBlue2') + item.addtag 'point' + end + + $twind_plot.itembind('point', 'Any-Enter', + proc{$twind_plot.itemconfigure 'current', 'fill', 'red'}) + $twind_plot.itembind('point', 'Any-Leave', + proc{$twind_plot.itemconfigure 'current', 'fill', 'SkyBlue2'}) + $twind_plot.itembind('point', '1', + proc{|x,y| embPlotDown $twind_plot,x,y}, "%x %y") + $twind_plot.itembind('point', 'ButtonRelease-1', + proc{$twind_plot.dtag 'selected'}) + $twind_plot.bind('B1-Motion', + proc{|x,y| embPlotMove $twind_plot,x,y}, "%x %y") + while ($twind_text.get($mark_plot) =~ /[ \t\n]/) + $twind_text.delete $mark_plot + end + $twind_text.insert $mark_plot,"\n" + TkTextWindow.new($twind_text, $mark_plot, 'window'=>$twind_plot) + $tag_center.add $mark_plot + $twind_text.insert $mark_plot,"\n" +end + +$embPlot = {'lastX'=>0, 'lastY'=>0} + +def embPlotDown (w, x, y) + w.dtag 'selected' + w.addtag_withtag 'selected', 'current' + w.raise 'current' + $embPlot['lastX'] = x + $embPlot['lastY'] = y +end + +def embPlotMove (w, x, y) + w.move 'selected', x - $embPlot['lastX'], y - $embPlot['lastY'] + $embPlot['lastX'] = x + $embPlot['lastY'] = y +end + +def textWindDel (w) + if (defined? $twind_text) && TkWinfo.exist?($twind_plot) + $twind_text.delete $twind_plot + $twind_plot = nil + while ($twind_text.get($mark_plot) =~ /[ \t\n]/) + $twind_text.delete $mark_plot + end + $twind_text.insert $mark_plot," " + end +end + +def embDefBg (w) + w['background'] = w.configinfo('background')[3] +end diff --git a/ext/tk/sample/demos-jp/vscale.rb b/ext/tk/sample/demos-jp/vscale.rb new file mode 100644 index 0000000000..4cb8e0f6b7 --- /dev/null +++ b/ext/tk/sample/demos-jp/vscale.rb @@ -0,0 +1,77 @@ +require "tkcanvas" + +if defined?($vscale_demo) && $vscale_demo + $vscale_demo.destroy + $vscale_demo = nil +end + +$vscale_demo = TkToplevel.new {|w| + title("Vertical Scale Demonstration") + iconname("vscale") +} +positionWindow($vscale_demo) + +msg = TkLabel.new($vscale_demo) { + font $font + wraplength '3.5i' + justify 'left' +# text "下には矢印が1つと乗直なスケールが表示されています。\ +#スケール上でマウスボタン1をクリック、またはドラッグすると\ +#矢印の長さを変えることができます。" + text "にはバーと縦型のスケールが表示されています。スケールでマウスのボタン1 をクリックするかドラッグしてバーの高さを変えることができます。終ったら「了解」ボタンを押してください。" +} +msg.pack('side'=>'top', 'padx'=>'.5c') + +TkFrame.new($vscale_demo) {|frame| + TkButton.new(frame) { + text '了解' + command proc { + tmppath = $vscale_demo + $vscale_demo = nil + tmppath.destroy + } + }.pack('side'=>'left', 'expand'=>'yes') + + TkButton.new(frame) { + text 'コード参照' + command proc { showCode 'vscale' } + }.pack('side'=>'left', 'expand'=>'yes') +}.pack('side'=>'bottom', 'fill'=>'x', 'pady'=>'2m') + +TkFrame.new($vscale_demo) {|frame| + borderwidth 10 + canvas = TkCanvas.new(frame) {|c| + width 50 + height 50 + bd 0 + highlightthickness 0 + TkcPolygon.new(c, 0, 0, 1, 1, 2, 2) { + fill 'SeaGreen3' + tags 'poly' + } + TkcLine.new(c, 0, 0, 1, 1, 2, 2, 0, 0) { + fill 'black' + tags 'line' + } + }.pack('side'=>'left', 'anchor'=>'nw', 'fill'=>'y') + scale = TkScale.new(frame) { + orient 'vertical' + length 284 + from 0 + to 250 + command proc{|value| setHeight(canvas, value)} + tickinterval 50 + }.pack('side'=>'left', 'anchor'=>'ne') + scale.set 75 +}.pack + + +def setHeight(w, height) + height = height + 21 + y2 = height - 30 + if y2 < 21 + y2 = 21 + end + w.coords 'poly',15,20,35,20,35,y2,45,y2,25,height,5,y2,15,y2,15,20 + w.coords 'line',15,20,35,20,35,y2,45,y2,25,height,5,y2,15,y2,15,20 +end diff --git a/ext/tk/sample/demos-jp/widget b/ext/tk/sample/demos-jp/widget new file mode 100644 index 0000000000..3d4690d57a --- /dev/null +++ b/ext/tk/sample/demos-jp/widget @@ -0,0 +1,504 @@ +#!/usr/local/bin/ruby + +# 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 + +# tcl_platform 情報へのアクセスオブジェクト +$tk_platform = TkVarAccess.new('tcl_platform') + +# フォント設定 +$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') +####### +#case($tk_version) +#when /^4.*/ +# $font = '-*-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*' +# $kanji_font = '-*--16-*-jisx0208.1983-0' +# $msg_kanji_font = '-*--24-*-jisx0208.1983-0' +# $knjfont_opt = 'kanjifont' +# TkOption.add('*kanjiFont', $kanji_font, 'startupFile') +# +#when /^8.*/ +# Tk.tk_call('font', 'create', '@ascii', +# '-copy', '-*-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*') +# Tk.tk_call('font', 'create', '@kanji', +# '-copy', '-*--16-*-jisx0208.1983-0') +# Tk.tk_call('font', 'create', '@msg_knj', +# '-copy', '-*--24-*-jisx0208.1983-0') +# Tk.tk_call('font', 'create', '@cFont', '-compound', '@ascii @kanji') +# Tk.tk_call('font', 'create', '@cMsgFont', '-compound', '@ascii @msg_knj') +# $font = '-*-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*' +# $kanji_font = '@cFont' +# $msg_kanji_font = '@cMsgFont' +# $knjfont_opt = 'font' +#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}) + +=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 60 + 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 60 + height 30 + font $font + setgrid 'yes' + highlightthickness 0 + padx 4 + pady 2 + takefocus 0 + 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_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 のコードを見\ +るために、"コード参照"ボタンをクリックすることができます。あなたが\ +望むなら、そのコードを修正することができます。修正したコードでデモ\ +ンストレーションを再実行するためには、コードが書かれたウィンドウに\ +ある"デモ再実行" ボタンをクリックしてください。 + +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. ボタン \n", tag_demo, "demo-button") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "3. チェックボタン (複数を選択可能)\n", + tag_demo, "demo-check") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "4. ラジオボタン (任意の一つを選択可能)\n", + tag_demo, "demo-radio") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "5. ボタンで作られた15-パズルゲーム\n", + tag_demo, "demo-puzzle") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "6. ビットマップを使用したアイコンボタン\n", + tag_demo, "demo-icon") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "7. 画像を表示する二つのラベル\n", + tag_demo, "demo-image1") +txt.insert('end', " \n ", tag_demospace) +txt.insert('end', "8. 画像を見るための簡単なユーザインターフェース\n", + tag_demo, "demo-image2") +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. 簡単なフォーム\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. 検索\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-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_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. メニューボタン (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. 組み込みのビットマップ\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 showVars (parent, *args) + if $showVarsWin[parent.path] + begin + $showVarsWin[parent.path].destroy + rescue + end + end + w = 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] = w +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` + 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 showCode (demo) + file = "#{demo}.rb" + $code_window = nil unless defined? $code_window + if $code_window == nil || TkWinfo.exist?($code_window) == '0' + $code_window = TkToplevel.new(nil) + f = TkFrame.new($code_window) + TkButton.new(f) { + 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 + +# 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.2.2\n\n( based on Tk ウィジェットデモ :: Copyright (c) 1996-1997 Sun Microsystems, Inc. )\n\nRunning Version :: Ruby#{VERSION}/Tk#{$tk_version}#{(Tk::JAPANIZED_TK)? 'jp': ''}") +end + +################################ +# イベント待ちに入る +Tk.mainloop |