aboutsummaryrefslogtreecommitdiffstats
path: root/ext/tk/lib/tkdialog.rb
diff options
context:
space:
mode:
authornagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-06-18 19:46:20 +0000
committernagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-06-18 19:46:20 +0000
commitd8b02b509608c5b90056c7befa89fa29fda45f8f (patch)
treefa79099d51b611202df51b03218b0743c2cdfbf1 /ext/tk/lib/tkdialog.rb
parent151f1241c665b0307234e931bec2c32bfea0138d (diff)
downloadruby-d8b02b509608c5b90056c7befa89fa29fda45f8f.tar.gz
tk.rb :
* small bug fix * rename 'no_create' option to 'without_creating' * add TkWindow#pack_in, TkWindow#grid_in, TkWindow#place_in * add TkWindow#bind_class and TkWindow#database_class If defined specific_class (@db_class), bind_class returns @db_class. In other case, bind_class returns TkWinow#class(). It is useful for binding. TkWindow#database_class is defined for querying the option database. It's same to TkWinfo.classname(self). * add TkBindTag.new_by_name and TkDatabaseClass for binding to database class * check varname whether already exsist or not. (TkVarAccess.new) * TkTextWin#bbox returns an array of four numbers * autoload TkDialog2, TkWarning2 * scan event callback arguments and convert to proper type * TkBindTag.new accepts a block ( TkBindTag.new(context){callback} ) * If given taglist, TkWindow#bindtags(taglist) returns taglist * add TkWindow#bindtags=(taglist) * Tk.focue and Tk.focus_lastfor return nil if there is no target widget. * Tk::Wm.client returns the argument string when setting name * TkGrid.columnconfiginfo and rowconfiginfo given a slot return a number. * TkWindow.grid_columnconfiginfo and grid_rowconfiginfo :: ditto * rename and define alias :: TkOption ==> TkOptionDB * define alias :: TkTimer ==> TkAfter * some instance methods change from public to private * some TkComm methods change to module functions (help to treat return values from Tk) * add support for -displayof option to some TkWinfo methods * bind, bind_append and bind_remove :: returns the target of event-binding * add Tk8.4 features * add TkPaneWindow tkdialog.rb: * classes without showing at initialize : TkDialog2, TkWarning2 * add show method to reuse TkDialog object * some instance methods change from public to private * add new features for configuration tktext.rb : * small bug fix * some methods return self * add TkTextMark#+(mod) and TkTextMark#-(mod) (e.g. mark + '3 chars') * add some methods tkcanvas.rb : * small bug fix * some methods return self tkentry.rb : * some methods return self * TkEntry#bbox returns an array of four numbers * scan validatecommand arguments and convert to proper type tkbgerror.rb : * support to define a error handler by user tcltklib.rb : * reported by Ferenc Engard <engard@all.hu> on [ruby-talk:60759] ... and so on git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3960 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/tk/lib/tkdialog.rb')
-rw-r--r--ext/tk/lib/tkdialog.rb185
1 files changed, 153 insertions, 32 deletions
diff --git a/ext/tk/lib/tkdialog.rb b/ext/tk/lib/tkdialog.rb
index 8b8ee69128..31d50fc67b 100644
--- a/ext/tk/lib/tkdialog.rb
+++ b/ext/tk/lib/tkdialog.rb
@@ -1,13 +1,55 @@
require "tk"
-class TkDialog < TkWindow
+class TkDialog2 < TkWindow
extend Tk
+ def self.show(*args)
+ dlog = self.new(*args)
+ dlog.show
+ dlog
+ end
+
+ def _set_button_config(configs)
+ set_config = proc{|c,i|
+ if $VERBOSE && (c.has_key?('command') || c.has_key?(:command))
+ STDERR.print("Warning: cannot give a command option " +
+ "to the dialog button#{i}. It was removed.\n")
+ end
+ c.delete('command'); c.delete(:command)
+ @config << format("%s.button%s configure %s; ",
+ @path, i, hash_kv(c).join(' '))
+ }
+ case configs
+ when Proc
+ @buttons.each_index{|i|
+ if (c = configs.call(i)).kind_of? Hash
+ set_config.call(c,i)
+ end
+ }
+
+ when Array
+ @buttons.each_index{|i|
+ if (c = configs[i]).kind_of? Hash
+ set_config.call(c,i)
+ end
+ }
+
+ when Hash
+ @buttons.each_with_index{|s,i|
+ if (c = configs[s]).kind_of? Hash
+ set_config.call(c,i)
+ end
+ }
+ end
+ @config = 'after idle {' + @config + '};' if @config != ""
+ end
+ private :_set_button_config
+
# initialize tk_dialog
def initialize(keys = nil)
super()
+
@var = TkVariable.new
- id = @var.id
@title = title
@@ -20,28 +62,42 @@ class TkDialog < TkWindow
@default_button = default_button
@buttons = buttons
- @button_configs = proc{|num| button_configs num}
+ @button_configs = proc{|num| button_configs(num)}
+
+ #@config = "puts [winfo children .w0000];"
+ @config = ""
if keys.kind_of? Hash
keys = _symbolkey2str(keys)
- @title = keys['title'] if keys['title']
- @message = keys['message'] if keys['message']
- @bitmap = keys['bitmap'] if keys['bitmap']
- @default_button = keys['default'] if keys['default']
- @buttons = keys['buttons'] if keys['buttons']
+ @title = keys['title'] if keys.key? 'title'
+ @message = keys['message'] if keys.key? 'message'
+ @bitmap = keys['bitmap'] if keys.key? 'bitmap'
+ @default_button = keys['default'] if keys.key? 'default'
+ @buttons = keys['buttons'] if keys.key? 'buttons'
@command = keys['prev_command']
- @message_config = keys['message_config'] if keys['message_config']
- @bitmap_config = keys['bitmap_config'] if keys['bitmap_config']
- @button_configs = keys['button_configs'] if keys['button_configs']
+ @message_config = keys['message_config'] if keys.key? 'message_config'
+ @msgframe_config = keys['msgframe_config'] if keys.key? 'msgframe_config'
+ @bitmap_config = keys['bitmap_config'] if keys.key? 'bitmap_config'
+ @button_configs = keys['button_configs'] if keys.key? 'button_configs'
+ @btnframe_config = keys['btnframe_config'] if keys.key? 'btnframe_config'
end
if @title.include? ?\s
@title = '{' + @title + '}'
end
- @buttons = tk_split_list(@buttons) if @buttons.kind_of? String
+ if @buttons.kind_of? Array
+ _set_button_config(@buttons.collect{|cfg|
+ (cfg.kind_of? Array)? cfg[1]: nil})
+ @buttons = @buttons.collect{|cfg| (cfg.kind_of? Array)? cfg[0]: cfg}
+ end
+ if @buttons.kind_of? Hash
+ _set_button_config(@buttons)
+ @buttons = @buttons.keys
+ end
+ @buttons = tk_split_simplelist(@buttons) if @buttons.kind_of? String
@buttons = @buttons.collect{|s|
if s.kind_of? Array
s = s.join(' ')
@@ -53,34 +109,46 @@ class TkDialog < TkWindow
end
}
- config = ""
if @message_config.kind_of? Hash
- config << format("%s.msg configure %s\n",
+ @config << format("%s.msg configure %s;",
@path, hash_kv(@message_config).join(' '))
end
+
+ if @msgframe_config.kind_of? Hash
+ @config << format("%s.top configure %s;",
+ @path, hash_kv(@msgframe_config).join(' '))
+ end
+
+ if @btnframe_config.kind_of? Hash
+ @config << format("%s.bot configure %s;",
+ @path, hash_kv(@btnframe_config).join(' '))
+ end
+
if @bitmap_config.kind_of? Hash
- config << format("%s.msg configure %s\n",
+ @config << format("%s.bitmap configure %s;",
@path, hash_kv(@bitmap_config).join(' '))
end
- if @button_configs.kind_of? Proc
- @buttons.each_index{|i|
- if (c = @button_configs.call(i)).kind_of? Hash
- config << format("%s.button%s configure %s\n",
- @path, i, hash_kv(c).join(' '))
- end
- }
- end
- config = 'after idle {' + config + '};' if config != ""
+
+ _set_button_config(@button_configs) if @button_configs
if @command.kind_of? Proc
@command.call(self)
end
+ end
- INTERP._eval('eval {global '+id+';'+config+
- 'set '+id+' [tk_dialog '+
+ def show
+ if @default_button.kind_of? String
+ default_button = @buttons.index(@default_button)
+ else
+ default_button = @default_button
+ end
+ default_button = '{}' if default_button == nil
+ INTERP._eval('eval {global '+@var.id+';'+@config+
+ 'set '+@var.id+' [tk_dialog '+
@path+" "+@title+" {#{@message}} "+@bitmap+" "+
- String(@default_button)+" "+@buttons.join(' ')+']}')
+ String(default_button)+" "+@buttons.join(' ')+']}')
end
+
def value
return @var.value.to_i
end
@@ -89,22 +157,36 @@ class TkDialog < TkWindow
# these methods must be overridden for each dialog #
# #
######################################################
+ private
+
def title
+ # returns a title string of the dialog window
return "DIALOG"
end
def message
+ # returns a message text to display on the dialog
return "MESSAGE"
end
def message_config
+ # returns a Hash {option=>value, ...} for the message text
+ return nil
+ end
+ def msgframe_config
+ # returns a Hash {option=>value, ...} for the message text frame
return nil
end
def bitmap
+ # returns a bitmap name or a bitmap file path
+ # (@ + path ; e.g. '@/usr/share/bitmap/sample.xbm')
return "info"
end
def bitmap_config
+ # returns nil or a Hash {option=>value, ...} for the bitmap
return nil
end
def default_button
+ # returns a default button's number or name
+ # if nil or null string, set no-default
return 0
end
def buttons
@@ -112,21 +194,50 @@ class TkDialog < TkWindow
return ["BUTTON1", "BUTTON2"]
end
def button_configs(num)
+ # returns nil / Proc / Array or Hash (see _set_button_config)
+ return nil
+ end
+ def btnframe_config
+ # returns nil or a Hash {option=>value, ...} for the button frame
return nil
end
end
+
+#
+# TkDialog : with showing at initialize
+#
+class TkDialog < TkDialog2
+ def self.show(*args)
+ self.new(*args)
+ end
+
+ def initialize(*args)
+ super(*args)
+ show
+ end
+end
+
+
#
# dialog for warning
#
-class TkWarning < TkDialog
+class TkWarning2 < TkDialog2
def initialize(mes)
- @mes = mes
- super()
+ super(:message=>mes)
end
- def message
- return @mes
+
+ def show(mes = nil)
+ mes_bup = @message
+ @message = mes if mes
+ ret = super()
+ @message = mes_bup
+ ret
end
+
+ #######
+ private
+
def title
return "WARNING";
end
@@ -140,3 +251,13 @@ class TkWarning < TkDialog
return "OK";
end
end
+
+class TkWarning < TkWarning2
+ def self.show(*args)
+ self.new(*args)
+ end
+ def initialize(mes)
+ super(mes)
+ show
+ end
+end