mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
75362fbd47
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
320 lines
8.3 KiB
Ruby
320 lines
8.3 KiB
Ruby
#!/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
|