diff options
author | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-18 19:46:20 +0000 |
---|---|---|
committer | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-18 19:46:20 +0000 |
commit | d8b02b509608c5b90056c7befa89fa29fda45f8f (patch) | |
tree | fa79099d51b611202df51b03218b0743c2cdfbf1 /ext/tk/lib/tkdialog.rb | |
parent | 151f1241c665b0307234e931bec2c32bfea0138d (diff) |
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.rb | 185 |
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 |