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

* ext/tk/lib/tkextlib/tile.rb: [incompatible] remove TileWidgets' instate/state/identify method to avoid the conflict with standard widget options. Those methods are renamed to ttk_instate/ttk_state/ ttk_identify (tile_instate/tile_state/tile_identify are available too). Although I don't recommend, if you realy need old methods, please define "Tk::USE_OBSOLETE_TILE_STATE_METHOD = true" before "require 'tkextlib/tile'". * ext/tk/lib/tkextlib/tile.rb: "Tk::Tile::__Import_Tile_Widgets__!" is obsolete. It outputs warning. To control default widget set, use "Tk.default_widget_set = :Ttk". * ext/tk/lib/tk.rb: __IGNORE_UNKNOWN_CONFIGURE_OPTION__ method and __set_IGNORE_UNKNOWN_CONFIGURE_OPTION__!(mode) method are defind as module methods of TkConfigMethod. It may help users to wrap old Ruby/Tk scripts (use standard widgets) to force to use Ttk widgets. Ttk widgets don't have some options of standard widgets which are control the view of widgets. When set ignore-mode true, configure method tries to ignoure such unknown options with no exception. Of course, it may raise other troubles on the GUI design. So, those are a little danger methods. * ext/tk/lib/tk/itemconfig.rb: __IGNORE_UNKNOWN_CONFIGURE_OPTION__ method and __set_IGNORE_UNKNOWN_CONFIGURE_OPTION__!(mode) method are defind as module methods of TkItemConfigMethod as the same purpose as TkConfigMethod's ones. * ext/tk/sample/ttk_wrapper.rb: A new example. This is a tool for wrapping old Ruby/Tk scripts (which use standard widgets) to use Ttk (Tile) widgets as default. * ext/tk/sample/tkextlib/tile/demo.rb: use ttk_instate/ttk_state method instead of instate/state method. * ext/tk/lib/tk/root, ext/tk/lib/tk/namespace.rb, ext/tk/lib/tk/text.rb, ext/tk/lib/tkextlib/*: some 'instance_eval's are replaced to "instance_exec(self)". * ext/tk/lib/tk/event.rb: bug fix on KEY_TBL and PROC_TBL (?x is not a character code on Ruby1.9). * ext/tk/lib/tk/variable.rb: support new style of operation argument on Tcl/Tk's 'trace' command for variables. * ext/tk/sample/demos-jp/widget, ext/tk/sample/demos-en/widget: bug fix * ext/tk/sammple/demos-jp/textpeer.rb, ext/tk/sammple/demos-en/textpeer.rb: new widget demo. * ext/tk/tcltklib.c: decrase SEGV troubles (probably) * ext/tk/lib/tk.rb: remove Thread.critical access if Ruby1.9 * ext/tk/lib/tk/multi-tk.rb: support Ruby1.9 (probably) * ext/tk/lib/tkextlib/tile.rb: add method to define Tcl/Tk command to make Tcl/Tk theme sources (based on different version of Tile extension) available. (Tk::Tile::__define_LoadImages_proc_for_comaptibility__) * ext/tk/lib/tk.rb, ext/tk/lib/tk/wm.rb: support dockable frames (Tcl/Tk8.5 feature). 'wm' command can treat many kinds of widgets as toplevel widgets. * ext/tk/lib/tkextlib/tile/style.rb: ditto. (Tk::Tile::Style.__define_wrapper_proc_for_compatibility__) * ext/tk/lib/tk/font.rb: add actual_hash and metrics_hash to get properties as a hash. metrics_hash method returns a boolean value for 'fixed' option. But metrics method returns numeric value (0 or 1) for 'fixed' option, because of backward compatibility. * ext/tk/lib/tk/timer.rb: somtimes fail to set callback procedure. * ext/tk/lib/tk.rb: add Tk.sleep and Tk.wakeup method. Tk.sleep doesn't block the eventloop. It will be better to use the method in event callbacks. * ext/tk/sample/tksleep_sample.rb: sample script about Tk.sleep. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@15849 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
406 lines
10 KiB
Ruby
406 lines
10 KiB
Ruby
#
|
|
# tk/composite.rb :
|
|
#
|
|
require 'tk'
|
|
|
|
module TkComposite
|
|
include Tk
|
|
extend Tk
|
|
|
|
=begin
|
|
def initialize(parent=nil, *args)
|
|
@delegates = {}
|
|
@option_methods = {}
|
|
@option_setting = {}
|
|
|
|
if parent.kind_of? Hash
|
|
keys = _symbolkey2str(parent)
|
|
parent = keys.delete('parent')
|
|
@frame = TkFrame.new(parent)
|
|
@path = @epath = @frame.path
|
|
initialize_composite(keys)
|
|
else
|
|
@frame = TkFrame.new(parent)
|
|
@path = @epath = @frame.path
|
|
initialize_composite(*args)
|
|
end
|
|
end
|
|
=end
|
|
|
|
def _choice_classname_of_baseframe
|
|
base_class_name = nil
|
|
|
|
klass = WidgetClassNames[self.class::WidgetClassName]
|
|
|
|
if klass
|
|
# WidgetClassName is a known class
|
|
#if klass <= TkFrame || klass < TkComposite
|
|
if klass <= TkFrame || klass < Tk::Frame || klass < TkComposite
|
|
# klass is valid for the base frame
|
|
if self.class <= klass
|
|
# use my classname
|
|
base_class_name = self.class.name
|
|
if base_class_name == ''
|
|
# anonymous class -> use ancestor's name
|
|
base_class_name = klass.name
|
|
end
|
|
else
|
|
# not subclass -> use WidgetClassName
|
|
base_class_name = klass.name
|
|
end
|
|
|
|
else
|
|
# klass is invalid for the base frame
|
|
#if self.class < TkFrame || self.class.superclass < TkComposite
|
|
if self.class < TkFrame || self.class.superclass < Tk::Frame || self.class.superclass < TkComposite
|
|
# my class name is valid for the base frame -> use my classname
|
|
base_class_name = self.class.name
|
|
if base_class_name == ''
|
|
# anonymous class -> use TkFrame
|
|
base_class_name = nil
|
|
end
|
|
else
|
|
# no idea for the base frame -> use TkFrame
|
|
base_class_name = nil
|
|
end
|
|
end
|
|
|
|
elsif self.class::WidgetClassName && ! self.class::WidgetClassName.empty?
|
|
# unknown WidgetClassName is defined -> use it for the base frame
|
|
base_class_name = self.class::WidgetClassName
|
|
|
|
else
|
|
# no valid WidgetClassName
|
|
#if self.class < TkFrame || self.class.superclass < TkComposite
|
|
if self.class < TkFrame || self.class.superclass < Tk::Frame || self.class.superclass < TkComposite
|
|
# my class name is valid for the base frame -> use my classname
|
|
base_class_name = self.class.name
|
|
if base_class_name == ''
|
|
# anonymous class -> use TkFrame
|
|
base_class_name = nil
|
|
end
|
|
else
|
|
# no idea for the base frame -> use TkFrame
|
|
base_class_name = nil
|
|
end
|
|
end
|
|
|
|
base_class_name
|
|
end
|
|
private :_choice_classname_of_baseframe
|
|
|
|
# def initialize(parent=nil, *args)
|
|
def initialize(*args)
|
|
@delegates = {}
|
|
@option_methods = {}
|
|
@option_setting = {}
|
|
|
|
if args[-1].kind_of?(Hash)
|
|
keys = _symbolkey2str(args.pop)
|
|
else
|
|
keys = {}
|
|
end
|
|
parent = args.shift
|
|
parent = keys.delete('parent') if keys.has_key?('parent')
|
|
|
|
if keys.key?('classname')
|
|
keys['class'] = keys.delete('classname')
|
|
end
|
|
if (base_class_name = (keys.delete('class')).to_s).empty?
|
|
base_class_name = _choice_classname_of_baseframe
|
|
end
|
|
|
|
if base_class_name
|
|
# @frame = Tk::Frame.new(parent, :class=>base_class_name)
|
|
# --> use current TkFrame class
|
|
@frame = TkFrame.new(parent, :class=>base_class_name)
|
|
else
|
|
# @frame = Tk::Frame.new(parent)
|
|
# --> use current TkFrame class
|
|
@frame = TkFrame.new(parent)
|
|
end
|
|
@path = @epath = @frame.path
|
|
|
|
args.push(keys) unless keys.empty?
|
|
initialize_composite(*args)
|
|
end
|
|
|
|
def database_classname
|
|
@frame.database_classname
|
|
end
|
|
|
|
def database_class
|
|
@frame.database_class
|
|
end
|
|
|
|
def epath
|
|
@epath
|
|
end
|
|
|
|
def initialize_composite(*args) end
|
|
private :initialize_composite
|
|
|
|
def inspect
|
|
str = super
|
|
str.chop << ' @epath=' << @epath.inspect << '>'
|
|
end
|
|
|
|
def option_methods(*opts)
|
|
opts.each{|m_set, m_cget, m_info|
|
|
m_set = m_set.to_s
|
|
m_cget = m_set if !m_cget && self.method(m_set).arity == -1
|
|
m_cget = m_cget.to_s if m_cget
|
|
m_info = m_info.to_s if m_info
|
|
@option_methods[m_set] = {
|
|
:set => m_set, :cget => m_cget, :info => m_info
|
|
}
|
|
}
|
|
end
|
|
|
|
def delegate_alias(alias_opt, option, *wins)
|
|
if wins.length == 0
|
|
fail ArgumentError, "target widgets are not given"
|
|
end
|
|
if alias_opt != option && (alias_opt == 'DEFAULT' || option == 'DEFAULT')
|
|
fail ArgumentError, "cannot alias 'DEFAULT' option"
|
|
end
|
|
alias_opt = alias_opt.to_s
|
|
option = option.to_s
|
|
if @delegates[alias_opt].kind_of?(Array)
|
|
if (elem = @delegates[alias_opt].assoc(option))
|
|
wins.each{|w| elem[1].push(w)}
|
|
else
|
|
@delegates[alias_opt] << [option, wins]
|
|
end
|
|
else
|
|
@delegates[alias_opt] = [ [option, wins] ]
|
|
end
|
|
end
|
|
|
|
def delegate(option, *wins)
|
|
delegate_alias(option, option, *wins)
|
|
end
|
|
|
|
def cget(slot)
|
|
slot = slot.to_s
|
|
|
|
if @option_methods.include?(slot)
|
|
if @option_methods[slot][:cget]
|
|
return self.__send__(@option_methods[slot][:cget])
|
|
else
|
|
if @option_setting[slot]
|
|
return @option_setting[slot]
|
|
else
|
|
return ''
|
|
end
|
|
end
|
|
end
|
|
|
|
tbl = @delegates[slot]
|
|
tbl = @delegates['DEFAULT'] unless tbl
|
|
|
|
begin
|
|
if tbl
|
|
opt, wins = tbl[-1]
|
|
opt = slot if opt == 'DEFAULT'
|
|
if wins && wins[-1]
|
|
return wins[-1].cget(opt)
|
|
end
|
|
end
|
|
rescue
|
|
end
|
|
|
|
super(slot)
|
|
end
|
|
|
|
def configure(slot, value=None)
|
|
if slot.kind_of? Hash
|
|
slot.each{|slot,value| configure slot, value}
|
|
return self
|
|
end
|
|
|
|
slot = slot.to_s
|
|
|
|
if @option_methods.include?(slot)
|
|
unless @option_methods[slot][:cget]
|
|
if value.kind_of?(Symbol)
|
|
@option_setting[slot] = value.to_s
|
|
else
|
|
@option_setting[slot] = value
|
|
end
|
|
end
|
|
return self.__send__(@option_methods[slot][:set], value)
|
|
end
|
|
|
|
tbl = @delegates[slot]
|
|
tbl = @delegates['DEFAULT'] unless tbl
|
|
|
|
begin
|
|
if tbl
|
|
last = nil
|
|
tbl.each{|opt, wins|
|
|
opt = slot if opt == 'DEFAULT'
|
|
wins.each{|w| last = w.configure(opt, value)}
|
|
}
|
|
return last
|
|
end
|
|
rescue
|
|
end
|
|
|
|
super(slot, value)
|
|
end
|
|
|
|
def configinfo(slot = nil)
|
|
if TkComm::GET_CONFIGINFO_AS_ARRAY
|
|
if slot
|
|
slot = slot.to_s
|
|
if @option_methods.include?(slot)
|
|
if @option_methods[slot][:info]
|
|
return self.__send__(@option_methods[slot][:info])
|
|
else
|
|
return [slot, '', '', '', self.cget(slot)]
|
|
end
|
|
end
|
|
|
|
tbl = @delegates[slot]
|
|
tbl = @delegates['DEFAULT'] unless tbl
|
|
|
|
begin
|
|
if tbl
|
|
if tbl.length == 1
|
|
opt, wins = tbl[0]
|
|
if slot == opt || opt == 'DEFAULT'
|
|
return wins[-1].configinfo(slot)
|
|
else
|
|
info = wins[-1].configinfo(opt)
|
|
info[0] = slot
|
|
return info
|
|
end
|
|
else
|
|
opt, wins = tbl[-1]
|
|
return [slot, '', '', '', wins[-1].cget(opt)]
|
|
end
|
|
end
|
|
rescue
|
|
end
|
|
|
|
super(slot)
|
|
|
|
else # slot == nil
|
|
info_list = super(slot)
|
|
|
|
tbl = @delegates['DEFAULT']
|
|
if tbl
|
|
wins = tbl[0][1]
|
|
if wins && wins[-1]
|
|
wins[-1].configinfo.each{|info|
|
|
slot = info[0]
|
|
info_list.delete_if{|i| i[0] == slot} << info
|
|
}
|
|
end
|
|
end
|
|
|
|
@delegates.each{|slot, tbl|
|
|
next if slot == 'DEFAULT'
|
|
if tbl.length == 1
|
|
opt, wins = tbl[0]
|
|
next unless wins && wins[-1]
|
|
if slot == opt
|
|
info_list.delete_if{|i| i[0] == slot} <<
|
|
wins[-1].configinfo(slot)
|
|
else
|
|
info = wins[-1].configinfo(opt)
|
|
info[0] = slot
|
|
info_list.delete_if{|i| i[0] == slot} << info
|
|
end
|
|
else
|
|
opt, wins = tbl[-1]
|
|
info_list.delete_if{|i| i[0] == slot} <<
|
|
[slot, '', '', '', wins[-1].cget(opt)]
|
|
end
|
|
}
|
|
|
|
@option_methods.each{|slot, m|
|
|
if m[:info]
|
|
info = self.__send__(m[:info])
|
|
else
|
|
info = [slot, '', '', '', self.cget(slot)]
|
|
end
|
|
info_list.delete_if{|i| i[0] == slot} << info
|
|
}
|
|
|
|
info_list
|
|
end
|
|
|
|
else # ! TkComm::GET_CONFIGINFO_AS_ARRAY
|
|
if slot
|
|
slot = slot.to_s
|
|
if @option_methods.include?(slot)
|
|
if @option_methods[slot][:info]
|
|
return self.__send__(@option_methods[slot][:info])
|
|
else
|
|
return {slot => ['', '', '', self.cget(slot)]}
|
|
end
|
|
end
|
|
|
|
tbl = @delegates[slot]
|
|
tbl = @delegates['DEFAULT'] unless tbl
|
|
|
|
begin
|
|
if tbl
|
|
if tbl.length == 1
|
|
opt, wins = tbl[0]
|
|
if slot == opt || opt == 'DEFAULT'
|
|
return wins[-1].configinfo(slot)
|
|
else
|
|
return {slot => wins[-1].configinfo(opt)[opt]}
|
|
end
|
|
else
|
|
opt, wins = tbl[-1]
|
|
return {slot => ['', '', '', wins[-1].cget(opt)]}
|
|
end
|
|
end
|
|
rescue
|
|
end
|
|
|
|
super(slot)
|
|
|
|
else # slot == nil
|
|
info_list = super(slot)
|
|
|
|
tbl = @delegates['DEFAULT']
|
|
if tbl
|
|
wins = tbl[0][1]
|
|
info_list.update(wins[-1].configinfo) if wins && wins[-1]
|
|
end
|
|
|
|
@delegates.each{|slot, tbl|
|
|
next if slot == 'DEFAULT'
|
|
if tbl.length == 1
|
|
opt, wins = tbl[0]
|
|
next unless wins && wins[-1]
|
|
if slot == opt
|
|
info_list.update(wins[-1].configinfo(slot))
|
|
else
|
|
info_list.update({slot => wins[-1].configinfo(opt)[opt]})
|
|
end
|
|
else
|
|
opt, wins = tbl[-1]
|
|
info_list.update({slot => ['', '', '', wins[-1].cget(opt)]})
|
|
end
|
|
}
|
|
|
|
@option_methods.each{|slot, m|
|
|
if m[:info]
|
|
info = self.__send__(m[:info])
|
|
else
|
|
info = {slot => ['', '', '', self.cget(slot)]}
|
|
end
|
|
info_list.update(info)
|
|
}
|
|
|
|
info_list
|
|
end
|
|
end
|
|
end
|
|
end
|