1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/ext/tk/lib/tkextlib/treectrl/tktreectrl.rb
nagai ed6ce8b43b * ext/tk/extconf.rb: New strategy for searching Tcl/Tk libraries.
* ext/tk/*: Support new features of Tcl/Tk8.6b1 and minor bug fixes.
     ( [KNOWN BUG] Ruby/Tk on Ruby 1.9 will not work on Cygwin. )
* ext/tk/*: Unify sources between Ruby 1.8 & 1.9.
            Improve default_widget_set handling.
* ext/tk/*: Multi-TkInterpreter (multi-tk.rb) works on Ruby 1.8 & 1.9.
     ( [KNOWN BUG] On Ruby 1.8, join to a long term Thread on Tk
       callbacks may freeze. On Ruby 1.9, cannot create a second 
       master interpreter (creating slaves are OK); supported master
       interpreter is the default master interpreter only. )
* ext/tk/lib/tkextlib/*: Update supported versions of Tk extensions.
         Tcllib 1.8/Tklib 0.4.1  ==>  Tcllib 1.11.1/Tklib 0.5
         BWidgets 1.7            ==>  BWidgets 1.8
         TkTable 2.9             ==>  TkTable 2.10
         TkTreeCtrl 2005-12-02   ==>  TkTreeCtrl 2.2.9
         Tile 0.8.0/8.5.1        ==>  Tile 0.8.3/8.6b1
         IncrTcl 2005-02-14      ==>  IncrTcl 2008-12-15
         TclX 2005-02-07         ==>  TclX 2008-12-15
         Trofs 0.4.3             ==>  Trofs 0.4.4


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24063 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2009-07-12 23:08:32 +00:00

2522 lines
58 KiB
Ruby

#
# tkextlib/treectrl/tktreectrl.rb
# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
#
require 'tk'
# call setup script for general 'tkextlib' libraries
require 'tkextlib/setup.rb'
# call setup script
require 'tkextlib/treectrl/setup.rb'
# TkPackage.require('treectrl', '1.0')
# TkPackage.require('treectrl', '1.1')
TkPackage.require('treectrl')
module Tk
class TreeCtrl < TkWindow
BindTag_FileList = TkBindTag.new_by_name('TreeCtrlFileList')
PACKAGE_NAME = 'treectrl'.freeze
def self.package_name
PACKAGE_NAME
end
def self.package_version
begin
TkPackage.require('treectrl')
rescue
''
end
end
HasColumnCreateCommand =
(TkPackage.vcompare(self.package_version, '1.1') >= 0)
# dummy ::
# pkgIndex.tcl of TreeCtrl-1.0 doesn't support auto_load for
# 'loupe' command (probably it is bug, I think).
# So, calling a 'treectrl' command for loading the dll with
# the auto_load facility.
begin
tk_call('treectrl')
rescue
end
def self.loupe(img, x, y, w, h, zoom)
# NOTE: platform == 'unix' only
# img => TkPhotoImage
# x, y => screen coords
# w, h => magnifier width and height
# zoom => zooming rate
Tk.tk_call_without_enc('loupe', img, x, y, w, h, zoom)
end
def self.text_layout(font, text, keys={})
TkComm.list(Tk.tk_call_without_enc('textlayout', font, text, keys))
end
def self.image_tint(img, color, alpha)
Tk.tk_call_without_enc('imagetint', img, color, alpha)
end
class NotifyEvent < TkUtil::CallbackSubst
end
module ConfigMethod
end
end
TreeCtrl_Widget = TreeCtrl
end
##############################################
class Tk::TreeCtrl::NotifyEvent
# [ <'%' subst-key char>, <proc type char>, <instance var (accessor) name>]
KEY_TBL = [
[ ?c, ?n, :item_num ],
[ ?d, ?s, :detail ],
[ ?D, ?l, :items ],
[ ?e, ?e, :event ],
[ ?I, ?n, :id ],
[ ?l, ?n, :lower_bound ],
[ ?p, ?n, :active_id ],
[ ?P, ?e, :pattern ],
[ ?S, ?l, :sel_items ],
[ ?T, ?w, :widget ],
[ ?u, ?n, :upper_bound ],
[ ?W, ?o, :object ],
[ ??, ?x, :parm_info ],
nil
]
# [ <proc type char>, <proc/method to convert tcl-str to ruby-obj>]
PROC_TBL = [
[ ?n, TkComm.method(:num_or_str) ],
[ ?s, TkComm.method(:string) ],
[ ?l, TkComm.method(:list) ],
[ ?w, TkComm.method(:window) ],
[ ?e, proc{|val|
case val
when /^<<[^<>]+>>$/
TkVirtualEvent.getobj(val[1..-2])
when /^<[^<>]+>$/
val[1..-2]
else
val
end
}
],
[ ?o, proc{|val| TkComm.tk_tcl2ruby(val)} ],
[ ?x, proc{|val|
begin
inf = {}
Hash[*(TkComm.list(val))].each{|k, v|
if keyinfo = KEY_TBL.assoc(k[0])
if cmd = PROC_TBL.assoc(keyinfo[1])
begin
new_v = cmd.call(v)
v = new_v
rescue
end
end
end
inf[k] = v
}
inf
rescue
val
end
} ],
nil
]
=begin
# for Ruby m17n :: ?x --> String --> char-code ( getbyte(0) )
KEY_TBL.map!{|inf|
if inf.kind_of?(Array)
inf[0] = inf[0].getbyte(0) if inf[0].kind_of?(String)
inf[1] = inf[1].getbyte(0) if inf[1].kind_of?(String)
end
inf
}
PROC_TBL.map!{|inf|
if inf.kind_of?(Array)
inf[0] = inf[0].getbyte(0) if inf[0].kind_of?(String)
end
inf
}
=end
# setup tables to be used by scan_args, _get_subst_key, _get_all_subst_keys
#
# _get_subst_key() and _get_all_subst_keys() generates key-string
# which describe how to convert callback arguments to ruby objects.
# When binding parameters are given, use _get_subst_key().
# But when no parameters are given, use _get_all_subst_keys() to
# create a Event class object as a callback parameter.
#
# scan_args() is used when doing callback. It convert arguments
# ( which are Tcl strings ) to ruby objects based on the key string
# that is generated by _get_subst_key() or _get_all_subst_keys().
#
_setup_subst_table(KEY_TBL, PROC_TBL);
end
##############################################
module Tk::TreeCtrl::ConfigMethod
include TkItemConfigMethod
def treectrl_tagid(key, obj)
if key.kind_of?(Array)
key = key.join(' ')
else
key = key.to_s
end
if (obj.kind_of?(Tk::TreeCtrl::Column) ||
obj.kind_of?(Tk::TreeCtrl::Element) ||
obj.kind_of?(Tk::TreeCtrl::Item) ||
obj.kind_of?(Tk::TreeCtrl::Style))
obj = obj.id
end
case key
when 'column'
obj
when 'debug'
None
when 'dragimage'
None
when 'element'
obj
when 'item element'
obj
when 'marquee'
None
when 'notify'
obj
when 'style'
obj
else
obj
end
end
def tagid(mixed_id)
if mixed_id == 'debug'
['debug', None]
elsif mixed_id == 'dragimage'
['dragimage', None]
elsif mixed_id == 'marquee'
['marquee', None]
elsif mixed_id.kind_of?(Array)
[mixed_id[0], treectrl_tagid(*mixed_id)]
else
tagid(mixed_id.split(':'))
end
end
def __item_cget_cmd(mixed_id)
if mixed_id[0] == 'column' && mixed_id[1] == 'drag'
return [self.path, 'column', 'dragcget']
end
if mixed_id[1].kind_of?(Array)
id = mixed_id[1]
else
id = [mixed_id[1]]
end
if mixed_id[0].kind_of?(Array)
([self.path].concat(mixed_id[0]) << 'cget').concat(id)
else
[self.path, mixed_id[0], 'cget'].concat(id)
end
end
private :__item_cget_cmd
def __item_config_cmd(mixed_id)
if mixed_id[0] == 'column' && mixed_id[1] == 'drag'
return [self.path, 'column', 'dragconfigure']
end
if mixed_id[1].kind_of?(Array)
id = mixed_id[1]
else
id = [mixed_id[1]]
end
if mixed_id[0].kind_of?(Array)
([self.path].concat(mixed_id[0]) << 'configure').concat(id)
else
[self.path, mixed_id[0], 'configure'].concat(id)
end
end
private :__item_config_cmd
def __item_pathname(id)
if id.kind_of?(Array)
key = id[0]
if key.kind_of?(Array)
key = key.join(' ')
end
tag = id[1]
if tag.kind_of?(Array)
tag = tag.join(' ')
end
id = [key, tag].join(':')
end
[self.path, id].join(';')
end
private :__item_pathname
def __item_configinfo_struct(id)
if id.kind_of?(Array) && id[0].to_s == 'notify'
{:key=>0, :alias=>nil, :db_name=>nil, :db_class=>nil,
:default_value=>nil, :current_value=>1}
else
{:key=>0, :alias=>1, :db_name=>1, :db_class=>2,
:default_value=>3, :current_value=>4}
end
end
private :__item_configinfo_struct
def __item_font_optkeys(id)
if id.kind_of?(Array) && (id[0] == 'element' ||
(id[0].kind_of?(Array) && id[0][1] == 'element'))
[]
else
['font']
end
end
private :__item_font_optkeys
def __item_numstrval_optkeys(id)
if id == 'debug'
['displaydelay']
else
super(id)
end
end
private :__item_numstrval_optkeys
def __item_boolval_optkeys(id)
if id == 'debug'
['data', 'display', 'enable', 'span', 'textlayout']
elsif id == 'dragimage'
['visible']
elsif id == 'marquee'
['visible']
elsif id.kind_of?(Array)
case id[0]
when 'item'
['visible', 'wrap', 'open', 'returnid', 'visible']
when 'column'
if id[1] == 'drag'
['enable']
else
['button', 'expand', 'resize', 'squeeze', 'sunken',
'visible', 'widthhack']
end
when 'element'
['draw', 'filled', 'showfocus', 'clip', 'destroy']
when 'notify'
['active']
when 'style'
['detach', 'indent', 'visible']
else
if id[0].kind_of?(Array) && id[0][1] == 'element'
['filled', 'showfocus']
else
super(id)
end
end
else
super(id)
end
end
private :__item_boolval_optkeys
def __item_strval_optkeys(id)
if id == 'debug'
['erasecolor']
elsif id.kind_of?(Array)
case id[0]
when 'column'
if id[1] == 'drag'
['indicatorcolor']
else
super(id) << 'textcolor'
end
when 'element'
super(id) << 'fill' << 'outline' << 'format'
else
super(id)
end
else
super(id)
end
end
private :__item_strval_optkeys
def __item_listval_optkeys(id)
if id.kind_of?(Array)
case id[0]
when 'column'
['itembackground']
when 'element'
['relief']
when 'style'
['union']
else
if id[0].kind_of?(Array) && id[0][1] == 'element'
['relief']
else
[]
end
end
else
[]
end
end
private :__item_listval_optkeys
def __item_val2ruby_optkeys(id)
if id.kind_of?(Array)
case id[0]
when 'item'
{ 'button' => proc{|id,val| (val == 'auto')? val: TkComm.bool(val)} }
else
[]
end
else
[]
end
end
private :__item_val2ruby_optkeys
def __item_keyonly_optkeys(id) # { def_key=>(undef_key|nil), ... }
{
'notreally'=>nil,
'increasing'=>'decreasing',
'decreasing'=>'increasing',
'ascii'=>nil,
'dictionary'=>nil,
'integer'=>nil,
'real'=>nil
}
end
private :__item_keyonly_optkeys
def column_cget_tkstring(tagOrId, option)
itemcget_tkstring(['column', tagOrId], option)
end
def column_cget(tagOrId, option)
itemcget(['column', tagOrId], option)
end
def column_cget_strict(tagOrId, option)
itemcget_strict(['column', tagOrId], option)
end
def column_configure(tagOrId, slot, value=None)
itemconfigure(['column', tagOrId], slot, value)
end
def column_configinfo(tagOrId, slot=nil)
itemconfiginfo(['column', tagOrId], slot)
end
def current_column_configinfo(tagOrId, slot=nil)
current_itemconfiginfo(['column', tagOrId], slot)
end
def column_dragcget_tkstring(option)
itemcget_tkstring(['column', 'drag'], option)
end
def column_dragcget(option)
itemcget(['column', 'drag'], option)
end
def column_dragcget_strict(option)
itemcget_strict(['column', 'drag'], option)
end
def column_dragconfigure(slot, value=None)
itemconfigure(['column', 'drag'], slot, value)
end
def column_dragconfiginfo(slot=nil)
itemconfiginfo(['column', 'drag'], slot)
end
def current_column_dragconfiginfo(slot=nil)
current_itemconfiginfo(['column', 'drag'], slot)
end
def debug_cget_tkstring(option)
itemcget_tkstring('debug', option)
end
def debug_cget(option)
itemcget('debug', option)
end
def debug_cget_strict(option)
itemcget_strict('debug', option)
end
def debug_configure(slot, value=None)
itemconfigure('debug', slot, value)
end
def debug_configinfo(slot=nil)
itemconfiginfo('debug', slot)
end
def current_debug_configinfo(slot=nil)
current_itemconfiginfo('debug', slot)
end
def dragimage_cget_tkstring(option)
itemcget_tkstring('dragimage', option)
end
def dragimage_cget(option)
itemcget('dragimage', option)
end
def dragimage_cget_strict(option)
itemcget_strict('dragimage', option)
end
def dragimage_configure(slot, value=None)
itemconfigure('dragimage', slot, value)
end
def dragimage_configinfo(slot=nil)
itemconfiginfo('dragimage', slot)
end
def current_dragimage_configinfo(slot=nil)
current_itemconfiginfo('dragimage', slot)
end
def element_cget_tkstring(tagOrId, option)
itemcget_tkstring(['element', tagOrId], option)
end
def element_cget(tagOrId, option)
itemcget(['element', tagOrId], option)
end
def element_cget_strict(tagOrId, option)
itemcget_strict(['element', tagOrId], option)
end
def element_configure(tagOrId, slot, value=None)
itemconfigure(['element', tagOrId], slot, value)
end
def element_configinfo(tagOrId, slot=nil)
itemconfiginfo(['element', tagOrId], slot)
end
def current_element_configinfo(tagOrId, slot=nil)
current_itemconfiginfo(['element', tagOrId], slot)
end
def item_cget_tkstring(tagOrId, option)
itemcget_tkstring(['item', tagOrId], option)
end
def item_cget(tagOrId, option)
itemcget(['item', tagOrId], option)
end
def item_cget_strict(tagOrId, option)
itemcget_strict(['item', tagOrId], option)
end
def item_configure(tagOrId, slot, value=None)
itemconfigure(['item', tagOrId], slot, value)
end
def item_configinfo(tagOrId, slot=nil)
itemconfiginfo(['item', tagOrId], slot)
end
def current_item_configinfo(tagOrId, slot=nil)
current_itemconfiginfo(['item', tagOrId], slot)
end
def item_element_cget_tkstring(item, column, elem, option)
itemcget_tkstring([['item', 'element'], [item, column, elem]], option)
end
def item_element_cget(item, column, elem, option)
itemcget([['item', 'element'], [item, column, elem]], option)
end
def item_element_cget_strict(item, column, elem, option)
itemcget_strict([['item', 'element'], [item, column, elem]], option)
end
def item_element_configure(item, column, elem, slot, value=None)
itemconfigure([['item', 'element'], [item, column, elem]], slot, value)
end
def item_element_configinfo(item, column, elem, slot=nil)
itemconfiginfo([['item', 'element'], [item, column, elem]], slot)
end
def current_item_element_configinfo(item, column, elem, slot=nil)
current_itemconfiginfo([['item', 'element'], [item, column, elem]], slot)
end
def marquee_cget_tkstring(option)
itemcget_tkstring('marquee', option)
end
def marquee_cget(option)
itemcget('marquee', option)
end
def marquee_cget_strict(option)
itemcget_strict('marquee', option)
end
def marquee_configure(slot, value=None)
itemconfigure('marquee', slot, value)
end
def marquee_configinfo(slot=nil)
itemconfiginfo('marquee', slot)
end
def current_marquee_configinfo(slot=nil)
current_itemconfiginfo('marquee', slot)
end
def notify_cget_tkstring(win, pattern, option)
pattern = "<#{pattern}>"
# "notify" doesn't have cget subcommand.
tk_split_simplelist(tk_call_without_enc(*(__item_confinfo_cmd(tagid(['notify', [win, pattern]])) << "-#{option}")), false, true)[-1]
end
def notify_cget(win, pattern, option)
pattern = "<#{pattern}>"
# "notify" doesn't have cget subcommand.
current_itemconfiginfo(['notify', [win, pattern]])[option.to_s]
end
def notify_cget_strict(win, pattern, option)
pattern = "<#{pattern}>"
# "notify" doesn't have cget subcommand.
info = current_itemconfiginfo(['notify', [win, pattern]])
option = option.to_s
unless info.has_key?(option)
fail RuntimeError, "unknown option \"#{option}\""
else
info[option]
end
end
def notify_configure(win, pattern, slot, value=None)
pattern = "<#{pattern}>"
itemconfigure(['notify', [win, pattern]], slot, value)
end
def notify_configinfo(win, pattern, slot=nil)
pattern = "<#{pattern}>"
itemconfiginfo(['notify', [win, pattern]], slot)
end
def current_notify_configinfo(tagOrId, slot=nil)
pattern = "<#{pattern}>"
current_itemconfiginfo(['notify', [win, pattern]], slot)
end
def style_cget_tkstring(tagOrId, option)
itemcget_tkstring(['style', tagOrId], option)
end
def style_cget(tagOrId, option)
itemcget(['style', tagOrId], option)
end
def style_cget_strict(tagOrId, option)
itemcget_strict(['style', tagOrId], option)
end
def style_configure(tagOrId, slot, value=None)
itemconfigure(['style', tagOrId], slot, value)
end
def style_configinfo(tagOrId, slot=nil)
itemconfiginfo(['style', tagOrId], slot)
end
def current_style_configinfo(tagOrId, slot=nil)
current_itemconfiginfo(['style', tagOrId], slot)
end
private :itemcget_tkstring, :itemcget, :itemcget_strict
private :itemconfigure, :itemconfiginfo, :current_itemconfiginfo
end
##############################################
class Tk::TreeCtrl
include Tk::TreeCtrl::ConfigMethod
include Scrollable
TkCommandNames = ['treectrl'.freeze].freeze
WidgetClassName = 'TreeCtrl'.freeze
WidgetClassNames[WidgetClassName] ||= self
#########################
def __destroy_hook__
Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.mutex.synchronize{
Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.delete(@path)
}
Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.mutex.synchronize{
Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.delete(@path)
}
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.mutex.synchronize{
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.delete(@path)
}
Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.mutex.synchronize{
Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.delete(@path)
}
end
#########################
def __strval_optkeys
super() + [
'buttoncolor', 'columnprefix', 'itemprefix', 'linecolor'
]
end
private :__strval_optkeys
def __boolval_optkeys
[
'itemwidthequal', 'usetheme',
'showbuttons', 'showheader', 'showlines', 'showroot',
'showrootbutton', 'showrootlines', 'showrootchildbuttons'
]
end
private :__boolval_optkeys
def __listval_optkeys
[ 'defaultstyle' ]
end
private :__listval_optkeys
#########################
def install_bind(cmd, *args)
install_bind_for_event_class(Tk::TreeCtrl::NotifyEvent, cmd, *args)
end
#########################
def create_self(keys)
if keys and keys != None
tk_call_without_enc(self.class::TkCommandNames[0], @path,
*hash_kv(keys, true))
else
tk_call_without_enc(self.class::TkCommandNames[0], @path)
end
end
private :create_self
#########################
def activate(desc)
tk_send('activate', desc)
self
end
def canvasx(x)
number(tk_send('canvasx', x))
end
def canvasy(y)
number(tk_send('canvasy', y))
end
def collapse(*dsc)
tk_send_without_enc('collapse', *(dsc.map!{|d| _get_eval_string(d, true)}))
self
end
def collapse_recurse(*dsc)
tk_send_without_enc('collapse', '-recurse',
*(dsc.map!{|d| _get_eval_string(d, true)}))
self
end
def column_bbox(idx)
list(tk_send('column', 'bbox', idx))
end
def column_compare(column1, op, column2)
bool(tk_send('column', 'compare', column1, op, column2))
end
def column_count
num_or_str(tk_send('column', 'count'))
end
def column_create(keys=nil)
if keys && keys.kind_of?(Hash)
num_or_str(tk_send('column', 'create', *hash_kv(keys)))
else
num_or_str(tk_send('column', 'create'))
end
end
def column_delete(idx)
Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.mutex.synchronize{
if Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[self.path]
Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[self.path].delete(idx)
end
}
tk_send('column', 'delete', idx)
self
end
def column_index(idx)
num_or_str(tk_send('column', 'index', idx))
end
def column_id(idx)
tk_send('column', 'id', idx)
end
def column_list(visible=false)
if visible
simplelist(tk_send('column', 'list', '-visible'))
else
simplelist(tk_send('column', 'list'))
end
end
def column_visible_list
column_list(true)
end
def column_move(idx, before)
tk_send('column', 'move', idx, before)
self
end
def column_needed_width(idx)
num_or_str(tk_send('column', 'neededwidth', idx))
end
alias column_neededwidth column_needed_width
def column_order(column, visible=false)
if visible
num_or_str(tk_send('column', 'order', column, '-visible'))
else
num_or_str(tk_send('column', 'order', column))
end
end
def column_visible_order(column)
column_order(column, true)
end
def column_width(idx)
num_or_str(tk_send('column', 'width', idx))
end
def compare(item1, op, item2)
bool(tk_send('compare', item1, op, item2))
end
def contentbox()
list(tk_send('contentbox'))
end
def depth(item=None)
num_or_str(tk_send_without_enc('depth', _get_eval_string(item, true)))
end
def dragimage_add(item, *args)
tk_send('dragimage', 'add', item, *args)
self
end
def dragimage_clear()
tk_send('dragimage', 'clear')
self
end
def dragimage_offset(*args) # x, y
if args.empty?
list(tk_send('dragimage', 'offset'))
else
tk_send('dragimage', 'offset', *args)
self
end
end
def dragimage_visible(*args) # mode
if args..empty?
bool(tk_send('dragimage', 'visible'))
else
tk_send('dragimage', 'visible', *args)
self
end
end
def dragimage_visible?
dragimage_visible()
end
def debug_dinfo
tk_send('debug', 'dinfo')
self
end
def debug_scroll
tk_send('debug', 'scroll')
end
def element_create(elem, type, keys=nil)
if keys && keys.kind_of?(Hash)
tk_send('element', 'create', elem, type, *hash_kv(keys))
else
tk_send('element', 'create', elem, type)
end
end
def element_delete(*elems)
Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.mutex.synchronize{
if Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[self.path]
elems.each{|elem|
Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[self.path].delete(elem)
}
end
}
tk_send('element', 'delete', *elems)
self
end
def element_names()
list(tk_send('element', 'names')).collect!{|elem|
Tk::TreeCtrl::Element.id2obj(self, elem)
}
end
def _conv_element_perstate_val(opt, val)
case opt
when 'background', 'foreground', 'fill', 'outline', 'format'
val
when 'draw', 'filled', 'showfocus', 'destroy'
bool(val)
else
tk_tcl2ruby(val)
end
end
private :_conv_element_perstate_val
def element_perstate(elem, opt, st_list)
tk_send('element', 'perstate', elem, "-{opt}", st_list)
end
def element_type(elem)
tk_send('element', 'type', elem)
end
def element_class(elem)
Tk::TreeCtrl::Element.type2class(element_type(elem))
end
def expand(*dsc)
tk_send('expand', *dsc)
self
end
def expand_recurse(*dsc)
tk_send('expand', '-recurse', *dsc)
self
end
def identify(x, y)
lst = list(tk_send('identify', x, y))
if lst[0] == 'item'
lst[1] = Tk::TreeCtrl::Item.id2obj(self, lst[1])
size = lst.size
i = 2
while i < size
case lst[i]
when 'line'
i += 1
lst[i] = Tk::TreeCtrl::Item.id2obj(self, lst[i])
i += 1
when 'button'
i += 1
when 'column'
i += 2
when 'elem'
i += 1
lst[i] = Tk::TreeCtrl::Element.id2obj(self, lst[i])
i += 1
else
i += 1
end
end
end
lst
end
def index(idx)
num_or_str(tk_send('index', idx))
end
def item_ancestors(item)
list(tk_send('item', 'ancestors', item)).collect!{|id|
Tk::TreeCtrl::Item.id2obj(self, id)
}
end
def item_bbox(item, *args)
list(tk_send('item', 'bbox', item, *args))
end
def item_children(item)
list(tk_send('item', 'children', item)).collect!{|id|
Tk::TreeCtrl::Item.id2obj(self, id)
}
end
def item_collapse(item)
tk_send_without_enc('item', 'collapse', _get_eval_string(item, true))
self
end
def item_collapse_recurse(item)
tk_send_without_enc('item', 'collapse',
_get_eval_string(item, true), '-recurse')
self
end
def item_compare(item1, op, item2)
bool(tk_send('item', 'compare', item1, op, item2))
end
def item_complex(item, *args)
tk_send_without_enc('item', 'complex',
_get_eval_string(item, true),
*(args.map!{|arg| _get_eval_string(arg, true)}))
self
end
def item_count
num_or_str(tk_send('item', 'count'))
end
def item_create(keys={})
num_or_str(tk_send_without_enc('item', 'create', *hash_kv(keys, true)))
end
def _erase_children(item)
item_children(item).each{|i| _erase_children(i)}
# table is already locked
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[self.path].delete(item)
end
private :_erase_children
def item_delete(first, last=None)
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.mutex.synchronize{
if Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[self.path]
if first == 'all' || first == :all || last == 'all' || last == :all
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[self.path].clear
elsif last == None
_erase_children(first)
else
self.range(first, last).each{|id|
_erase_children(id)
}
end
end
}
tk_send('item', 'delete', first, last)
self
end
def item_dump(item)
list(tk_send('item', 'dump', item))
end
def item_dump_hash(item)
Hash[*list(tk_send('item', 'dump', item))]
end
def item_element_actual(item, column, elem, key)
tk_send('item', 'element', 'actual', item, column, elem, "-#{key}")
end
def item_element_perstate(elem, opt, st_list)
tk_send('item', 'element', 'perstate', elem, "-{opt}", st_list)
end
def item_expand(item)
tk_send('item', 'expand', item)
self
end
def item_expand_recurse(item)
tk_send('item', 'expand', item, '-recurse')
self
end
def item_firstchild(parent, child=nil)
if child
tk_send_without_enc('item', 'firstchild',
_get_eval_string(parent, true),
_get_eval_string(child, true))
self
else
id = num_or_str(tk_send_without_enc('item', 'firstchild',
_get_eval_string(parent, true)))
Tk::TreeCtrl::Item.id2obj(self, id)
end
end
alias item_first_child item_firstchild
def item_hasbutton(item, st=None)
if st == None
bool(tk_send_without_enc('item', 'hasbutton',
_get_eval_string(item, true)))
else
tk_send_without_enc('item', 'hasbutton',
_get_eval_string(item, true),
_get_eval_string(st))
self
end
end
alias item_has_button item_hasbutton
def item_hasbutton?(item)
item_hasbutton(item)
end
alias item_has_button? item_hasbutton?
def item_id(item)
tk_send('item', 'id', item)
end
def item_image(item, column=nil, *args)
if args.empty?
if column
img = tk_send('item', 'image', item, column)
TkImage::Tk_IMGTBL[img]? TkImage::Tk_IMGTBL[img] : img
else
simplelist(tk_send('item', 'image', item)).collect!{|img|
TkImage::Tk_IMGTBL[img]? TkImage::Tk_IMGTBL[img] : img
}
end
else
tk_send('item', 'image', item, column, *args)
self
end
end
def get_item_image(item, column=nil)
item_image(item, column)
end
def set_item_image(item, col, img, *args)
item_image(item, col, img, *args)
end
def item_index(item)
list(tk_send('item', 'index', item))
end
def item_isancestor(item, des)
bool(tk_send('item', 'isancestor', item, des))
end
alias item_is_ancestor item_isancestor
alias item_isancestor? item_isancestor
alias item_is_ancestor? item_isancestor
def item_isopen(item)
bool(tk_send('item', 'isopen', item))
end
alias item_is_open item_isopen
alias item_isopen? item_isopen
alias item_is_open? item_isopen
alias item_isopened? item_isopen
alias item_is_opened? item_isopen
def item_lastchild(parent, child=nil)
if child
tk_send_without_enc('item', 'lastchild',
_get_eval_string(parent, true),
_get_eval_string(child, true))
self
else
id = num_or_str(tk_send_without_enc('item', 'lastchild',
_get_eval_string(parent, true)))
Tk::TreeCtrl::Item.id2obj(self, id)
end
end
alias item_last_child item_lastchild
def item_nextsibling(sibling, nxt=nil)
if nxt
tk_send('item', 'nextsibling', sibling, nxt)
self
else
id = num_or_str(tk_send('item', 'nextsibling', sibling))
Tk::TreeCtrl::Item.id2obj(self, id)
end
end
alias item_next_sibling item_nextsibling
def item_numchildren(item)
number(tk_send_without_enc('item', 'numchildren',
_get_eval_string(item, true)))
end
alias item_num_children item_numchildren
alias item_children_size item_numchildren
def item_order(item, visible=false)
if visible
ret = num_or_str(tk_send('item', 'order', item, '-visible'))
else
ret = num_or_str(tk_send('item', 'order', item))
end
(ret.kind_of?(Fixnum) && ret < 0)? nil: ret
end
def item_visible_order(item)
item_order(item, true)
end
def item_parent(item)
id = num_or_str(tk_send('item', 'parent', item))
Tk::TreeCtrl::Item.id2obj(self, id)
end
def item_prevsibling(sibling, prev=nil)
if prev
tk_send('item', 'prevsibling', sibling, prev)
self
else
id = num_or_str(tk_send('item', 'prevsibling', sibling))
Tk::TreeCtrl::Item.id2obj(self, id)
end
end
alias item_prev_sibling item_prevsibling
def item_range(first, last)
simplelist(tk_send('item', 'range', first, last))
end
def item_remove(item)
tk_send('item', 'remove', item)
self
end
def item_rnc(item)
list(tk_send('item', 'rnc', item))
end
def _item_sort_core(real_sort, item, *opts)
# opts ::= sort_param [, sort_param, ... ]
# sort_param ::= {key=>val, ...}
# [type, desc, {key=>val, ...}]
# param
opts = opts.collect{|param|
if param.kind_of?(Hash)
param = _symbolkey2str(param)
if param.key?('column')
key = '-column'
desc = param.delete('column')
elsif param.key?('element')
key = '-element'
desc = param.delete('element')
else
key = nil
end
if param.empty?
param = None
else
param = hash_kv(__conv_item_keyonly_opts(item, param))
end
if key
[key, desc].concat(param)
else
param
end
elsif param.kind_of?(Array)
if param[2].kind_of?(Hash)
param[2] = hash_kv(__conv_item_keyonly_opts(item, param[2]))
end
param
elsif param.kind_of?(String) && param =~ /\A[a-z]+\Z/
'-' << param
elsif param.kind_of?(Symbol)
'-' << param.to_s
else
param
end
}.flatten
if real_sort
tk_send('item', 'sort', item, *opts)
self
else
list(tk_send('item', 'sort', item, '-notreally', *opts))
end
end
private :_item_sort_core
def item_sort(item, *opts)
_item_sort_core(true, item, *opts)
end
def item_sort_not_really(item, *opts)
_item_sort_core(false, item, *opts)
end
def item_span(item, column=nil, *args)
if args.empty?
if column
list(tk_send('item', 'span', item, column))
else
simplelist(tk_send('item', 'span', item)).collect!{|elem| list(elem)}
end
else
tk_send('item', 'span', item, column, *args)
self
end
end
def get_item_span(item, column=nil)
item_span(item, column)
end
def set_item_span(item, col, num, *args)
item_span(item, col, num, *args)
end
def item_state_forcolumn(item, column, *args)
tk_send('item', 'state', 'forcolumn', item, column, *args)
end
alias item_state_for_column item_state_forcolumn
def item_state_get(item, *args)
if args.empty?
list(tk_send('item', 'state', 'get', item *args))
else
bool(tk_send('item', 'state', 'get', item))
end
end
def item_state_set(item, *args)
tk_send('item', 'state', 'set', item, *args)
end
def item_style_elements(item, column)
list(tk_send('item', 'style', 'elements', item, column)).collect!{|id|
Tk::TreeCtrl::Style.id2obj(self, id)
}
end
def item_style_map(item, column, style, map)
tk_send('item', 'style', 'map', item, column, style, map)
self
end
def item_style_set(item, column=nil, *args)
if args.empty?
if column
id = tk_send_without_enc('item', 'style', 'set',
_get_eval_string(item, true),
_get_eval_string(column, true))
Tk::TreeCtrl::Style.id2obj(self, id)
else
list(tk_send_without_enc('item', 'style', 'set',
_get_eval_string(item, true))).collect!{|id|
Tk::TreeCtrl::Style.id2obj(self, id)
}
end
else
tk_send_without_enc('item', 'style', 'set',
_get_eval_string(item, true),
_get_eval_string(column, true),
*(args.flatten.map!{|arg|
_get_eval_string(arg, true)
}))
self
end
end
def item_text(item, column, txt=nil, *args)
if args.empty?
if txt
tk_send('item', 'text', item, column, txt)
self
else
tk_send('item', 'text', item, column)
end
else
tk_send('item', 'text', item, column, txt, *args)
self
end
end
def item_toggle(item)
tk_send('item', 'toggle', item)
self
end
def item_toggle_recurse(item)
tk_send('item', 'toggle', item, '-recurse')
self
end
def item_visible(item, st=None)
if st == None
bool(tk_send('item', 'visible', item))
else
tk_send('item', 'visible', item, st)
self
end
end
def item_visible?(item)
item_visible(item)
end
def marquee_anchor(*args)
if args.empty?
list(tk_send('marquee', 'anchor'))
else
tk_send('marquee', 'anchor', *args)
self
end
end
def marquee_coords(*args)
if args.empty?
list(tk_send('marquee', 'coords'))
else
tk_send('marquee', 'coords', *args)
self
end
end
def marquee_corner(*args)
if args.empty?
tk_send('marquee', 'corner')
else
tk_send('marquee', 'corner', *args)
self
end
end
def marquee_identify()
list(tk_send('marquee', 'identify')).collect!{|id|
Tk::TreeCtrl::Item.id2obj(self, id)
}
end
def marquee_visible(st=None)
if st == None
bool(tk_send('marquee', 'visible'))
else
tk_send('marquee', 'visible', st)
self
end
end
def marquee_visible?()
marquee_visible()
end
#def notify_bind(obj, event, cmd=Proc.new, *args)
# _bind([@path, 'notify', 'bind', obj], event, cmd, *args)
# self
#end
def notify_bind(obj, event, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift
else
cmd = Proc.new
end
_bind([@path, 'notify', 'bind', obj], event, cmd, *args)
self
end
#def notify_bind_append(obj, event, cmd=Proc.new, *args)
# _bind_append([@path, 'notify', 'bind', obj], event, cmd, *args)
# self
#end
def notify_bind_append(obj, event, *args)
# if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
if TkComm._callback_entry?(args[0]) || !block_given?
cmd = args.shift
else
cmd = Proc.new
end
_bind_append([@path, 'notify', 'bind', obj], event, cmd, *args)
self
end
def notify_bind_remove(obj, event)
_bind_remove([@path, 'notify', 'bind', obj], event)
self
end
def notify_bindinfo(obj, event=nil)
_bindinfo([@path, 'notify', 'bind', obj], event)
end
def notify_detailnames(event)
list(tk_send('notify', 'detailnames', event))
end
def notify_eventnames()
list(tk_send('notify', 'eventnames'))
end
def notify_generate(pattern, char_map=None, percents_cmd=None)
pattern = "<#{pattern}>"
tk_send('notify', 'generate', pattern, char_map, percents_cmd)
self
end
def notify_install(pattern, percents_cmd=nil, &b)
pattern = "<#{pattern}>"
percents_cmd = Proc.new(&b) if !percents_cmd && b
if percents_cmd
procedure(tk_send('notify', 'install', pattern, percents_cmd))
else
procedure(tk_send('notify', 'install', pattern))
end
end
def notify_install_detail(event, detail, percents_cmd=nil, &b)
percents_cmd = Proc.new(&b) if !percents_cmd && b
if percents_cmd
tk_send('notify', 'install', 'detail', event, detail, percents_cmd)
else
tk_send('notify', 'install', 'detail', event, detail)
end
end
def notify_install_event(event, percents_cmd=nil, &b)
percents_cmd = Proc.new(&b) if !percents_cmd && b
if percents_cmd
tk_send('notify', 'install', 'event', event, percents_cmd)
else
tk_send('notify', 'install', 'event', event)
end
end
def notify_linkage(pattern, detail=None)
if detail != None
tk_send('notify', 'linkage', pattern, detail)
else
begin
if pattern.to_s.index(?-)
# TreeCtrl 1.1 format?
begin
tk_send('notify', 'linkage', "<#{pattern}>")
rescue
# TreeCtrl 1.0?
tk_send('notify', 'linkage', pattern)
end
else
# TreeCtrl 1.0 format?
begin
tk_send('notify', 'linkage', pattern)
rescue
# TreeCtrl 1.1?
tk_send('notify', 'linkage', "<#{pattern}>")
end
end
end
end
end
def notify_unbind(pattern=nil)
if pattern
tk_send('notify', 'unbind', "<#{pattern}>")
else
tk_send('notify', 'unbind')
end
self
end
def notify_uninstall(pattern)
pattern = "<#{pattern}>"
tk_send('notify', 'uninstall', pattern)
self
end
def notify_uninstall_detail(event, detail)
tk_send('notify', 'uninstall', 'detail', event, detail)
self
end
def notify_uninstall_event(event)
tk_send('notify', 'uninstall', 'event', event)
self
end
def numcolumns()
num_or_str(tk_send('numcolumns'))
end
alias num_columns numcolumns
alias columns_size numcolumns
def numitems()
num_or_str(tk_send('numitems'))
end
alias num_items numitems
alias items_size numitems
def orphans()
list(tk_send('orphans')).collect!{|id|
Tk::TreeCtrl::Item.id2obj(self, id)
}
end
def range(first, last)
list(tk_send('range', first, last)).collect!{|id|
Tk::TreeCtrl::Item.id2obj(self, id)
}
end
def state_define(name)
tk_send('state', 'define', name)
self
end
def state_linkage(name)
tk_send('state', 'linkage', name)
end
def state_names()
list(tk_send('state', 'names'))
end
def state_undefine(*names)
tk_send('state', 'undefine', *names)
self
end
def see(item, column=None, keys={})
tk_send('see', item, column, *hash_kv(keys))
self
end
def selection_add(first, last=None)
tk_send('selection', 'add', first, last)
self
end
def selection_anchor(item=None)
id = num_or_str(tk_send('selection', 'anchor', item))
Tk::TreeCtrl::Item.id2obj(self, id)
end
def selection_clear(*args) # first, last
tk_send('selection', 'clear', *args)
self
end
def selection_count()
number(tk_send('selection', 'count'))
end
def selection_get()
list(tk_send('selection', 'get')).collect!{|id|
Tk::TreeCtrl::Item.id2obj(self, id)
}
end
def selection_includes(item)
bool(tk_send('selection', 'includes', item))
end
def selection_modify(sel, desel)
tk_send('selection', 'modify', sel, desel)
self
end
def style_create(style, keys=None)
if keys && keys != None
tk_send('style', 'create', style, *hash_kv(keys))
else
tk_send('style', 'create', style)
end
end
def style_delete(*args)
Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.mutex.synchronize{
if Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[self.path]
args.each{|sty|
Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[self.path].delete(sty)
}
end
}
tk_send('style', 'delete', *args)
self
end
def style_elements(style, *elems)
if elems.empty?
list(tk_send('style', 'elements', style)).collect!{|id|
Tk::TreeCtrl::Element.id2obj(self, id)
}
else
tk_send('style', 'elements', style, elems.flatten)
self
end
end
def _conv_style_layout_val(sty, val)
case sty.to_s
when 'padx', 'pady', 'ipadx', 'ipady'
lst = list(val)
(lst.size == 1)? lst[0]: lst
when 'detach', 'indent'
bool(val)
when 'union'
simplelist(val).collect!{|elem|
Tk::TreeCtrl::Element.id2obj(self, elem)
}
else
val
end
end
private :_conv_style_layout_val
def style_layout(style, elem, keys=None)
if keys && keys != None
if keys.kind_of?(Hash)
tk_send('style', 'layout', style, elem, *hash_kv(keys))
self
else
_conv_style_layout_val(keys,
tk_send('style', 'layout',
style, elem, "-#{keys}"))
end
else
ret = Hash.new
Hash[*simplelist(tk_send('style', 'layout', style, elem))].each{|k, v|
k = k[1..-1]
ret[k] = _conv_style_layout_val(k, v)
}
ret
end
end
def get_style_layout(style, elem, opt=None)
style_layout(style, elem, opt)
end
def set_style_layout(style, elem, slot, value=None)
if slot.kind_of?(Hash)
style_layout(style, elem, slot)
else
style_layout(style, elem, {slot=>value})
end
end
def style_names()
list(tk_send('style', 'names')).collect!{|id|
Tk::TreeCtrl::Style.id2obj(self, id)
}
end
def toggle(*items)
tk_send('toggle', *items)
self
end
def toggle_recurse()
tk_send('toggle', '-recurse', *items)
self
end
end
#####################
class Tk::TreeCtrl::Column < TkObject
TreeCtrlColumnID_TBL = TkCore::INTERP.create_table
(TreeCtrlColumnID = ['treectrl_column'.freeze, TkUtil.untrust('00000')]).instance_eval{
@mutex = Mutex.new
def mutex; @mutex; end
freeze
}
TkCore::INTERP.init_ip_env{
Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.mutex.synchronize{
Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.clear
}
}
def self.id2obj(tree, id)
tpath = tree.path
Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.mutex.synchronize{
if Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[tpath]
Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[tpath][id]? \
Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[tpath][id] : id
else
id
end
}
end
def initialize(parent, keys={})
@tree = parent
@tpath = parent.path
keys = _symbolkey2str(keys)
Tk::TreeCtrl::Column::TreeCtrlColumnID.mutex.synchronize{
@path = @id =
keys.delete('tag') ||
Tk::TreeCtrl::Column::TreeCtrlColumnID.join(TkCore::INTERP._ip_id_)
Tk::TreeCtrl::Column::TreeCtrlColumnID[1].succ!
}
keys['tag'] = @id
Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL.mutex.synchronize{
Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[@tpath] ||= {}
Tk::TreeCtrl::Column::TreeCtrlColumnID_TBL[@tpath][@id] = self
}
@tree.column_create(keys)
end
def id
@id
end
def to_s
@id.to_s.dup
end
def cget_tkstring(opt)
@tree.column_cget_tkstring(@tree.column_index(@id), opt)
end
def cget(opt)
@tree.column_cget(@tree.column_index(@id), opt)
end
def cget_strict(opt)
@tree.column_cget_strict(@tree.column_index(@id), opt)
end
def configure(*args)
@tree.column_configure(@tree.column_index(@id), *args)
end
def configinfo(*args)
@tree.column_configinfo(@tree.column_index(@id), *args)
end
def current_configinfo(*args)
@tree.current_column_configinfo(@tree.column_index(@id), *args)
end
def delete
@tree.column_delete(@tree.column_index(@id))
self
end
def index
@tree.column_index(@id)
end
def move(before)
@tree.column_move(@tree.column_index(@id), before)
self
end
def needed_width
@tree.column_needed_width(@tree.column_index(@id))
end
alias neededwidth needed_width
def current_width
@tree.column_width(@tree.column_index(@id))
end
end
#####################
class Tk::TreeCtrl::Element < TkObject
TreeCtrlElementID_TBL = TkCore::INTERP.create_table
(TreeCtrlElementID = ['treectrl_element'.freeze, TkUtil.untrust('00000')]).instance_eval{
@mutex = Mutex.new
def mutex; @mutex; end
freeze
}
TreeCtrlElemTypeToClass = {}
TkCore::INTERP.init_ip_env{
Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.mutex.synchronize{
Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.clear
}
}
def self.type2class(type)
TreeCtrlElemTypeToClass[type] || type
end
def self.id2obj(tree, id)
tpath = tree.path
Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.mutex.synchronize{
if Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[tpath]
Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[tpath][id]? \
Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[tpath][id] : id
else
id
end
}
end
def initialize(parent, type, keys=nil)
@tree = parent
@tpath = parent.path
@type = type.to_s
Tk::TreeCtrl::Element::TreeCtrlElementID.mutex.synchronize{
@path = @id =
Tk::TreeCtrl::Element::TreeCtrlElementID.join(TkCore::INTERP._ip_id_)
Tk::TreeCtrl::Element::TreeCtrlElementID[1].succ!
}
Tk::TreeCtrl::Element::TreeCtrlElementID_TBL.mutex.synchronize{
Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[@tpath] ||= {}
Tk::TreeCtrl::Element::TreeCtrlElementID_TBL[@tpath][@id] = self
}
@tree.element_create(@id, @type, keys)
end
def id
@id
end
def to_s
@id.dup
end
def cget_tkstring(opt)
@tree.element_cget_tkstring(@id, opt)
end
def cget(opt)
@tree.element_cget(@id, opt)
end
def cget_strict(opt)
@tree.element_cget_strict(@id, opt)
end
def configure(*args)
@tree.element_configure(@id, *args)
end
def configinfo(*args)
@tree.element_configinfo(@id, *args)
end
def current_configinfo(*args)
@tree.current_element_configinfo(@id, *args)
end
def delete
@tree.element_delete(@id)
self
end
def element_type
@tree.element_type(@id)
end
def element_class
@tree.element_class(@id)
end
end
class Tk::TreeCtrl::BitmapElement < Tk::TreeCtrl::Element
TreeCtrlElemTypeToClass['bitmap'] = self
def initialize(parent, keys=nil)
super(parent, 'bitmap', keys)
end
end
class Tk::TreeCtrl::BorderElement < Tk::TreeCtrl::Element
TreeCtrlElemTypeToClass['border'] = self
def initialize(parent, keys=nil)
super(parent, 'border', keys)
end
end
class Tk::TreeCtrl::ImageElement < Tk::TreeCtrl::Element
TreeCtrlElemTypeToClass['image'] = self
def initialize(parent, keys=nil)
super(parent, 'image', keys)
end
end
class Tk::TreeCtrl::RectangleElement < Tk::TreeCtrl::Element
TreeCtrlElemTypeToClass['rect'] = self
def initialize(parent, keys=nil)
super(parent, 'rect', keys)
end
end
#####################
class Tk::TreeCtrl::Item < TkObject
TreeCtrlItemID_TBL = TkCore::INTERP.create_table
TkCore::INTERP.init_ip_env{
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.mutex.synchronize{
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.clear
}
}
def self.id2obj(tree, id)
tpath = tree.path
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.mutex.synchronize{
if Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[tpath]
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[tpath][id]? \
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[tpath][id] : id
else
id
end
}
end
def initialize(parent, keys={})
@tree = parent
@tpath = parent.path
@path = @id = @tree.item_create(keys)
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL.mutex.synchronize{
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[@tpath] ||= {}
Tk::TreeCtrl::Item::TreeCtrlItemID_TBL[@tpath][@id] = self
}
end
def id
@id
end
def to_s
@id.to_s.dup
end
def ancestors
@tree.item_ancestors(@id)
end
def bbox(*args)
@tree.item_bbox(@id, *args)
end
def children
@tree.item_children(@id)
end
def collapse
@tree.item_collapse(@id)
self
end
def collapse_recurse
@tree.item_collapse_recurse(@id)
self
end
def complex(*args)
@tree.item_complex(@id, *args)
self
end
def cget_tkstring(opt)
@tree.item_cget_tkstring(@id, opt)
end
def cget(opt)
@tree.item_cget(@id, opt)
end
def cget_strict(opt)
@tree.item_cget_strict(@id, opt)
end
def configure(*args)
@tree.item_configure(@id, *args)
end
def configinfo(*args)
@tree.item_configinfo(@id, *args)
end
def current_configinfo(*args)
@tree.current_item_configinfo(@id, *args)
end
def delete
@tree.item_delete(@id)
self
end
def element_dump
@tree.item_dump(@id)
end
def element_dump_hash
@tree.item_dump_hash(@id)
end
def element_actual(column, elem, key)
@tree.item_element_actual(@id, column, elem, key)
end
def element_cget_tkstring(opt)
@tree.item_element_cget(@id, opt)
end
def element_cget_tkstring(opt)
@tree.item_element_cget(@id, opt)
end
def element_cget_strict(opt)
@tree.item_element_cget_strict(@id, opt)
end
def element_configure(*args)
@tree.item_element_configure(@id, *args)
end
def element_configinfo(*args)
@tree.item_element_configinfo(@id, *args)
end
def current_element_configinfo(*args)
@tree.current_item_element_configinfo(@id, *args)
end
def expand
@tree.item_expand(@id)
self
end
def expand_recurse
@tree.item_expand_recurse(@id)
self
end
def firstchild(child=nil)
if child
@tree.item_firstchild(@id, child)
self
else
@tree.item_firstchild(@id)
end
end
alias first_child firstchild
def hasbutton(st=None)
if st == None
@tree.item_hasbutton(@id)
else
@tree.item_hasbutton(@id, st)
self
end
end
alias has_button hasbutton
def hasbutton?
@tree.item_hasbutton(@id)
end
alias has_button? hasbutton?
def index
@tree.item_index(@id)
end
def isancestor(des)
@tree.item_isancestor(@id, des)
end
alias is_ancestor isancestor
alias isancestor? isancestor
alias is_ancestor? isancestor
alias ancestor? isancestor
def isopen
@tree.item_isopen(@id)
end
alias is_open isopen
alias isopen? isopen
alias is_open? isopen
alias isopened? isopen
alias is_opened? isopen
alias open? isopen
def lastchild(child=nil)
if child
@tree.item_lastchild(@id, child)
self
else
@tree.item_lastchild(@id)
end
end
alias last_child lastchild
def nextsibling(nxt=nil)
if nxt
@tree.item_nextsibling(@id, nxt)
self
else
@tree.item_nextsibling(@id)
end
end
alias next_sibling nextsibling
def numchildren
@tree.item_numchildren(@id)
end
alias num_children numchildren
alias children_size numchildren
def parent_index
@tree.item_parent(@id)
end
def prevsibling(nxt=nil)
if nxt
@tree.item_prevsibling(@id, nxt)
self
else
@tree.item_prevsibling(@id)
end
end
alias prev_sibling prevsibling
def remove
@tree.item_remove(@id)
end
def rnc
@tree.item_rnc(@id)
end
def sort(*opts)
@tree.item_sort(@id, *opts)
end
def sort_not_really(*opts)
@tree.item_sort_not_really(@id, *opts)
self
end
def state_forcolumn(column, *args)
@tree.item_state_forcolumn(@id, column, *args)
self
end
alias state_for_column state_forcolumn
def state_get(*args)
@tree.item_state_get(@id, *args)
end
def state_set(*args)
@tree.item_state_set(@id, *args)
self
end
def style_elements(column)
@tree.item_style_elements(@id, column)
end
def style_map(column, style, map)
@tree.item_style_map(@id, column, style, map)
self
end
def style_set(column=nil, *args)
if args.empty?
@tree.item_style_set(@id, column)
else
@tree.item_style_set(@id, column, *args)
self
end
end
def item_text(column, txt=nil, *args)
if args.empty?
if txt
@tree.item_text(@id, column, txt)
self
else
@tree.item_text(@id, column)
end
else
@tree.item_text(@id, column, txt, *args)
self
end
end
def toggle
@tree.item_toggle(@id)
self
end
def toggle_recurse
@tree.item_toggle_recurse(@id)
self
end
def visible(st=None)
if st == None
@tree.item_visible(@id)
else
@tree.item_visible(@id, st)
self
end
end
end
#####################
class Tk::TreeCtrl::Style < TkObject
TreeCtrlStyleID_TBL = TkCore::INTERP.create_table
(TreeCtrlStyleID = ['treectrl_style'.freeze, TkUtil.untrust('00000')]).instance_eval{
@mutex = Mutex.new
def mutex; @mutex; end
freeze
}
TkCore::INTERP.init_ip_env{
Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.mutex.synchronize{
Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.clear
}
}
def self.id2obj(tree, id)
tpath = tree.path
Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.mutex.synchronize{
if Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[tpath]
Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[tpath][id]? \
Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[tpath][id] : id
else
id
end
}
end
def initialize(parent, keys=nil)
@tree = parent
@tpath = parent.path
Tk::TreeCtrl::Style::TreeCtrlStyleID.mutex.synchronize{
@path = @id =
Tk::TreeCtrl::Style::TreeCtrlStyleID.join(TkCore::INTERP._ip_id_)
Tk::TreeCtrl::Style::TreeCtrlStyleID[1].succ!
}
Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL.mutex.synchronize{
Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[@tpath] ||= {}
Tk::TreeCtrl::Style::TreeCtrlStyleID_TBL[@tpath][@id] = self
}
@tree.style_create(@id, keys)
end
def id
@id
end
def to_s
@id.dup
end
def cget_tkstring(opt)
@tree.style_cget_tkstring(@id, opt)
end
def cget(opt)
@tree.style_cget(@id, opt)
end
def cget_strict(opt)
@tree.style_cget_strict(@id, opt)
end
def configure(*args)
@tree.style_configure(@id, *args)
end
def configinfo(*args)
@tree.style_configinfo(@id, *args)
end
def current_configinfo(*args)
@tree.current_style_configinfo(@id, *args)
end
def delete
@tree.style_delete(@id)
self
end
def elements(*elems)
if elems.empty?
@tree.style_elements(@id)
else
@tree.style_elements(@id, *elems)
self
end
end
def layout(elem, keys=None)
if keys && keys != None && keys.kind_of?(Hash)
@tree.style_layout(@id, elem, keys)
self
else
@tree.style_layout(@id, elem, keys)
end
end
end
module Tk::TreeCtrl::BindCallback
include Tk
extend Tk
end
class << Tk::TreeCtrl::BindCallback
def percentsCmd(*args)
tk_call('::TreeCtrl::PercentsCmd', *args)
end
def cursorCheck(w, x, y)
tk_call('::TreeCtrl::CursorCheck', w, x, y)
end
def cursorCheckAux(w)
tk_call('::TreeCtrl::CursorCheckAux', w)
end
def cursorCancel(w)
tk_call('::TreeCtrl::CursorCancel', w)
end
def buttonPress1(w, x, y)
tk_call('::TreeCtrl::ButtonPress1', w, x, y)
end
def doubleButton1(w, x, y)
tk_call('::TreeCtrl::DoubleButton1', w, x, y)
end
def motion1(w, x, y)
tk_call('::TreeCtrl::Motion1', w, x, y)
end
def leave1(w, x, y)
tk_call('::TreeCtrl::Leave1', w, x, y)
end
def release1(w, x, y)
tk_call('::TreeCtrl::Release1', w, x, y)
end
def beginSelect(w, el)
tk_call('::TreeCtrl::BeginSelect', w, el)
end
def motion(w, le)
tk_call('::TreeCtrl::Motion', w, el)
end
def beginExtend(w, el)
tk_call('::TreeCtrl::BeginExtend', w, el)
end
def beginToggle(w, el)
tk_call('::TreeCtrl::BeginToggle', w, el)
end
def cancelRepeat
tk_call('::TreeCtrl::CancelRepeat')
end
def autoScanCheck(w, x, y)
tk_call('::TreeCtrl::AutoScanCheck', w, x, y)
end
def autoScanCheckAux(w)
tk_call('::TreeCtrl::AutoScanCheckAux', w)
end
def autoScanCancel(w)
tk_call('::TreeCtrl::AutoScanCancel', w)
end
def up_down(w, n)
tk_call('::TreeCtrl::UpDown', w, n)
end
def left_right(w, n)
tk_call('::TreeCtrl::LeftRight', w, n)
end
def setActiveItem(w, idx)
tk_call('::TreeCtrl::SetActiveItem', w, idx)
end
def extendUpDown(w, amount)
tk_call('::TreeCtrl::ExtendUpDown', w, amount)
end
def dataExtend(w, el)
tk_call('::TreeCtrl::DataExtend', w, el)
end
def cancel(w)
tk_call('::TreeCtrl::Cancel', w)
end
def selectAll(w)
tk_call('::TreeCtrl::selectAll', w)
end
def marqueeBegin(w, x, y)
tk_call('::TreeCtrl::MarqueeBegin', w, x, y)
end
def marqueeUpdate(w, x, y)
tk_call('::TreeCtrl::MarqueeUpdate', w, x, y)
end
def marqueeEnd(w, x, y)
tk_call('::TreeCtrl::MarqueeEnd', w, x, y)
end
def scanMark(w, x, y)
tk_call('::TreeCtrl::ScanMark', w, x, y)
end
def scanDrag(w, x, y)
tk_call('::TreeCtrl::ScanDrag', w, x, y)
end
# filelist-bindings
def fileList_button1(w, x, y)
tk_call('::TreeCtrl::FileListButton1', w, x, y)
end
def fileList_motion1(w, x, y)
tk_call('::TreeCtrl::FileListMotion1', w, x, y)
end
def fileList_motion(w, x, y)
tk_call('::TreeCtrl::FileListMotion', w, x, y)
end
def fileList_leave1(w, x, y)
tk_call('::TreeCtrl::FileListLeave1', w, x, y)
end
def fileList_release1(w, x, y)
tk_call('::TreeCtrl::FileListRelease1', w, x, y)
end
def fileList_edit(w, i, s, e)
tk_call('::TreeCtrl::FileListEdit', w, i, s, e)
end
def fileList_editCancel(w)
tk_call('::TreeCtrl::FileListEditCancel', w)
end
def fileList_autoScanCheck(w, x, y)
tk_call('::TreeCtrl::FileListAutoScanCheck', w, x, y)
end
def fileList_autoScanCheckAux(w)
tk_call('::TreeCtrl::FileListAutoScanCheckAux', w)
end
def entryOpen(w, item, col, elem)
tk_call('::TreeCtrl::EntryOpen', w, item, col, elem)
end
def entryExpanderOpen(w, item, col, elem)
tk_call('::TreeCtrl::EntryExpanderOpen', w, item, col, elem)
end
def entryClose(w, accept)
tk_call('::TreeCtrl::EntryClose', w, accept)
end
def entryExpanderKeypress(w)
tk_call('::TreeCtrl::EntryExpanderKeypress', w)
end
def textOpen(w, item, col, elem, width=0, height=0)
tk_call('::TreeCtrl::TextOpen', w, item, col, elem, width, height)
end
def textExpanderOpen(w, item, col, elem, width)
tk_call('::TreeCtrl::TextOpen', w, item, col, elem, width)
end
def textClose(w, accept)
tk_call('::TreeCtrl::TextClose', w, accept)
end
def textExpanderKeypress(w)
tk_call('::TreeCtrl::TextExpanderKeypress', w)
end
end