mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
a25fbe3b3e
* parse.y: encoding aware parsing. * parse.y (pragma_encoding): encoding specification pragma. * parse.y (rb_intern3): encoding specified symbols. * string.c (rb_str_length): length based on characters. for older behavior, bytesize method added. * string.c (rb_str_index_m): index based on characters. rindex as well. * string.c (succ_char): encoding aware succeeding string. * string.c (rb_str_reverse): reverse based on characters. * string.c (rb_str_inspect): encoding aware string description. * string.c (rb_str_upcase_bang): encoding aware case conversion. downcase, capitalize, swapcase as well. * string.c (rb_str_tr_bang): tr based on characters. delete, squeeze, tr_s, count as well. * string.c (rb_str_split_m): split based on characters. * string.c (rb_str_each_line): encoding aware each_line. * string.c (rb_str_each_char): added. iteration based on characters. * string.c (rb_str_strip_bang): encoding aware whitespace stripping. lstrip, rstrip as well. * string.c (rb_str_justify): encoding aware justifying (ljust, rjust, center). * string.c (str_encoding): get encoding attribute from a string. * re.c (rb_reg_initialize): encoding aware regular expression * sprintf.c (rb_str_format): formatting (i.e. length count) based on characters. * io.c (rb_io_getc): getc to return one-character string. for older behavior, getbyte method added. * ext/stringio/stringio.c (strio_getc): ditto. * io.c (rb_io_ungetc): allow pushing arbitrary string at the current reading point. * ext/stringio/stringio.c (strio_ungetc): ditto. * ext/strscan/strscan.c: encoding support. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13261 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
300 lines
7.3 KiB
Ruby
300 lines
7.3 KiB
Ruby
#!/usr/bin/env ruby
|
|
# -*- coding: euc-jp -*-
|
|
#
|
|
# rolodex --
|
|
# このスクリプトは Tom LaStrange の rolodex の一部です。
|
|
#
|
|
# Copyright (C) 1998 by Takaaki Tateishi <ttate@jaist.ac.jp>
|
|
# Time-stamp: "04/04/09 00:32:12 nagai"
|
|
#
|
|
|
|
require "tk"
|
|
Tk.encoding = "euc-jp"
|
|
|
|
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}",
|
|
"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",
|
|
"default_button"=>0,
|
|
"buttons"=>["OK"])
|
|
STDERR.print "dummy file name\n"
|
|
end
|
|
|
|
def deleteAction
|
|
result = TkDialog.new("title"=>"Confirm Action",
|
|
"message"=>"よろしいですか?",
|
|
"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")
|
|
@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" => "クリアー")
|
|
@add = TkButton.new(self, "text" => "追加")
|
|
@search = TkButton.new(self, "text" => "検索")
|
|
@delete = TkButton.new(self, "text" => "消去")
|
|
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"=> "ファイル",
|
|
"underline"=>0)
|
|
@file_menu = TkMenu.new(@file)
|
|
@file_menu.add("command",
|
|
"label" => "読み込み ...",
|
|
"command" => proc{fileAction},
|
|
"underline" => 0)
|
|
@file_menu.add("command",
|
|
"label" => "終了",
|
|
"command" => proc{$root.destroy},
|
|
"underline" => 0)
|
|
@file.menu(@file_menu)
|
|
@file.pack("side"=>"left")
|
|
|
|
@help = TkMenubutton.new(self,
|
|
"text"=> "ヘルプ",
|
|
"underline"=>0)
|
|
@help_menu = TkMenu.new(@help)
|
|
@help_menu.add("command",
|
|
"label"=> "コンテキストについて",
|
|
"command"=>proc{show_help("コンテキスト")},
|
|
"underline"=>3)
|
|
@help_menu.add("command",
|
|
"label"=> "ヘルプについて",
|
|
"command"=>proc{show_help("ヘルプ")},
|
|
"underline"=>3)
|
|
@help_menu.add("command",
|
|
"label"=> "ウィンドウについて",
|
|
"command"=>proc{show_help("ウィンドウ")},
|
|
"underline"=>3)
|
|
@help_menu.add("command",
|
|
"label"=> "キー操作について",
|
|
"command"=>proc{show_help("キー操作")},
|
|
"underline"=>3)
|
|
@help_menu.add("command",
|
|
"label"=> "バージョン情報",
|
|
"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(*args)
|
|
super(*args)
|
|
@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")
|
|
$root.bind("Control-c",proc{clearAction})
|
|
|
|
$root.buttons.add.configure("text"=> "追加 Ctrl+A")
|
|
$root.bind("Control-a",proc{addAction})
|
|
|
|
$root.buttons.search.configure("text"=> "検索 Ctrl+S")
|
|
$root.bind("Control-s",proc{addAction; fillCard})
|
|
|
|
$root.buttons.delete.configure("text"=> "消去 Ctrl+D")
|
|
$root.bind("Control-d",proc{deleteAction})
|
|
|
|
$root.menu.file_menu.entryconfigure(1, "accel"=>"Ctrl+F")
|
|
$root.bind("Control-f",proc{fileAction})
|
|
|
|
$root.menu.file_menu.entryconfigure(2, "accel"=>"Ctrl+Q")
|
|
$root.bind("Control-q",proc{$root.destroy})
|
|
|
|
$root.frame.entry[1].focus
|
|
|
|
$root.bind("Any-F1",
|
|
proc{|event| show_help(event.widget, event.x_root, event.y_root)})
|
|
$root.bind("Any-Help",
|
|
proc{|event| show_help(event.widget, event.x_root, event.y_root)})
|
|
|
|
|
|
$helpTopics = {}
|
|
|
|
$helpTopics[$root.menu.file] = <<EOF
|
|
これは「ファイル」メニューです。「読み込み」や「終了」などを
|
|
行なうことができます。
|
|
EOF
|
|
|
|
$helpTopics[$root.menu.file_menu.index(0)] = <<EOF
|
|
ファイルの読み込みを行なうときに使います。
|
|
EOF
|
|
|
|
$helpTopics[$root.menu.file_menu.index(1)] = <<EOF
|
|
アプリケーションを終了するときに使います。
|
|
EOF
|
|
|
|
$helpTopics[$root.frame.entry[1]] = <<EOF
|
|
名前を記入するエントリです。
|
|
EOF
|
|
|
|
$helpTopics[$root.frame.entry[2]] = <<EOF
|
|
住所を記入するエントリです。
|
|
EOF
|
|
|
|
$helpTopics[$root.frame.entry[3]] = <<EOF
|
|
住所を記入するエントリです。
|
|
EOF
|
|
|
|
$helpTopics[$root.frame.entry[4]] = <<EOF
|
|
住所を記入するエントリです。
|
|
EOF
|
|
|
|
$helpTopics[$root.frame.entry[5]] = <<EOF
|
|
自宅の電話番号を記入するエントリです。公開\
|
|
したくないときは private と記入します。
|
|
EOF
|
|
|
|
$helpTopics[$root.frame.entry[6]] = <<EOF
|
|
会社の電話番号を記入するエントリです。
|
|
EOF
|
|
|
|
$helpTopics[$root.frame.entry[7]] = <<EOF
|
|
FAX番号を記入するエントリです。
|
|
EOF
|
|
|
|
$helpTopics["コンテキスト"] = <<EOF
|
|
Ruby/Tkではgrabの機構がないためこのアプリケーションでは\
|
|
コンテキストヘルプはサポートされていません。
|
|
しかし同じような効果をbindとマウスの位置のWedgetを知る\
|
|
ことで得ることができます。
|
|
EOF
|
|
|
|
$helpTopics["ヘルプ"] = <<EOF
|
|
マウスをウィンドウにあわせてF1キーを押すことによって\
|
|
そのヘルプを見ることができます。
|
|
EOF
|
|
|
|
$helpTopics["ウィンドウ"] = <<EOF
|
|
このウィンドウはダミーです。
|
|
EOF
|
|
|
|
$helpTopics["キー操作"] = <<EOF
|
|
Ctrl+A: 追加
|
|
Ctrl+C: クリアー
|
|
Ctrl+D: 消去
|
|
Ctrl+F: ファイル選択
|
|
Ctrl+Q: 終了
|
|
Ctrl+S: 検索
|
|
EOF
|
|
|
|
$helpTopics["バージョン情報"] = <<EOF
|
|
バージョンは 1.0.1j です。
|
|
EOF
|
|
|
|
Tk.mainloop
|