1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* (IMPORTANT BUG FIX) scan of event keywords doesn't work on recent

versions of Tck/Tk
* (bug fix) initialize error of instance variable on TkComposite
* (bug fix) initialize error on encoding-system on MultiTkIp
* (bug fix) trouble on destroying widgets
* (new) add JP and EN version of Ruby/Tk widget demos


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4249 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagai 2003-07-31 20:52:40 +00:00
parent 0cdf0d99c1
commit 75362fbd47
141 changed files with 19495 additions and 25 deletions

View file

@ -174,6 +174,8 @@ class MultiTkIp
@@DEFAULT_MASTER = self.allocate @@DEFAULT_MASTER = self.allocate
@@DEFAULT_MASTER.instance_eval{ @@DEFAULT_MASTER.instance_eval{
@encoding = []
@tk_windows = {} @tk_windows = {}
@tk_table_list = [] @tk_table_list = []
@ -433,6 +435,8 @@ class MultiTkIp
fail ArgumentError, "expecting a Hash object for the 2nd argument" fail ArgumentError, "expecting a Hash object for the 2nd argument"
end end
@encoding = []
@tk_windows = {} @tk_windows = {}
@tk_table_list = [] @tk_table_list = []
@ -792,6 +796,10 @@ end
# class methods to delegate to TclTkIp # class methods to delegate to TclTkIp
class << MultiTkIp class << MultiTkIp
def method_missing(id, *args)
__getip.send(id, *args)
end
def make_safe def make_safe
__getip.make_safe __getip.make_safe
end end
@ -1141,6 +1149,41 @@ class MultiTkIp
end end
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 # end of MultiTkIp definition
MultiTkIp.freeze # defend against modification MultiTkIp.freeze # defend against modification

View file

@ -407,7 +407,13 @@ module TkComm
if num = EV_KEY.index($1) if num = EV_KEY.index($1)
case EV_TYPE[num] case EV_TYPE[num]
when ?n 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 when ?s
arg_cnv << TkComm::string(arg_val[idx]) arg_cnv << TkComm::string(arg_val[idx])
when ?b when ?b
@ -3748,24 +3754,28 @@ class TkWindow<TkObject
self self
end end
def _destroy_children def destroy
super
children = [] children = []
rexp = /^#{self.path}\.[^.]+$/ rexp = /^#{self.path}\.[^.]+$/
TkCore::INTERP.tk_windows.each{|path, obj| 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) if defined?(@cmdtbl)
for id in @cmdtbl for id in @cmdtbl
uninstall_cmd id uninstall_cmd id
end end
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 tk_call 'destroy', epath
uninstall_win uninstall_win
end end
@ -5020,6 +5030,9 @@ module TkComposite
extend Tk extend Tk
def initialize(parent=nil, *args) def initialize(parent=nil, *args)
@delegates = {}
@delegates['DEFAULT'] = @frame
if parent.kind_of? Hash if parent.kind_of? Hash
keys = _symbolkey2str(parent) keys = _symbolkey2str(parent)
parent = keys['parent'] parent = keys['parent']
@ -5031,10 +5044,6 @@ module TkComposite
@path = @epath = @frame.path @path = @epath = @frame.path
initialize_composite(*args) initialize_composite(*args)
end end
unless defined? @delegates
@delegates = {}
@delegates['DEFAULT'] = @frame
end
end end
def epath def epath
@ -5148,21 +5157,17 @@ end
# widget_destroy_hook # widget_destroy_hook
require 'tkvirtevent' require 'tkvirtevent'
TkBindTag::ALL.bind(TkVirtualEvent.new('Destroy'), proc{|widget| TkBindTag::ALL.bind(TkVirtualEvent.new('Destroy'), proc{|xpath|
if widget.respond_to?(:path) path = xpath[1..-1]
w = widget.path if (widget = TkCore::INTERP.tk_windows[path])
else
w = widget.to_s
end
if widget.respond_to?(:__destroy_hook__) if widget.respond_to?(:__destroy_hook__)
begin begin
if TkCore::INTERP._invoke('winfo','exist',w) == '1'
widget.__destroy_hook__ widget.__destroy_hook__
end
rescue Exception rescue Exception
end end
end end
}, '%W') end
}, 'x%W')
# autoload # autoload
autoload :TkCanvas, 'tkcanvas' autoload :TkCanvas, 'tkcanvas'

View file

@ -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.

View file

@ -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.

View file

@ -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)
さんに捧げたいと思います.

View file

@ -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"
---

View file

@ -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

View file

@ -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')
}

View file

@ -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')
}

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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')}

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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.

View file

@ -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.

View file

@ -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

View file

@ -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.

View file

@ -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.

View file

@ -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', "")

View file

@ -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')

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -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')}

View file

@ -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

View file

@ -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

View file

@ -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')

View file

@ -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')}

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View file

@ -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};

View file

@ -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};

View file

@ -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};

View file

@ -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};

View file

@ -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};

View file

@ -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};

View file

@ -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};

View file

@ -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};

View file

@ -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};

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

File diff suppressed because one or more lines are too long

View file

@ -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

View file

@ -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

View file

@ -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')

View file

@ -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 <20><><EFBFBD><EFBFBD>
$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"})
}
}
}

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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')
}

265
ext/tk/sample/demos-en/rmt Normal file
View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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"
)

View file

@ -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 = ''

View file

@ -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

View file

@ -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)

View file

@ -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)
}

View file

@ -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

View file

@ -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

View file

@ -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 <20><><EFBFBD><EFBFBD>
TkText.new($text_demo){|t|
# <20><><EFBFBD><EFBFBD>
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')
}

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)
さんに捧げたいと思います.

View file

@ -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

View file

@ -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')
}

View file

@ -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')
}

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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')}

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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.

View file

@ -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.

View file

@ -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

View file

@ -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.

View file

@ -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.

View file

@ -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', "ならないでしょう。")

View file

@ -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')

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -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')}

View file

@ -0,0 +1,9 @@
#!/usr/local/bin/ruby
require 'tk'
TkButton.new(nil,
'text'=>"こんにちは、世界",
'command'=>proc{print "こんにちは、世界\n"; exit}
).pack
Tk.mainloop

View file

@ -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

Some files were not shown because too many files have changed in this diff Show more