mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
3024ffdc3a
* 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/trunk@15848 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
940 lines
22 KiB
Ruby
940 lines
22 KiB
Ruby
#
|
|
# tkextlib/tktable/tktable.rb
|
|
# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)
|
|
#
|
|
|
|
require 'tk'
|
|
require 'tk/validation'
|
|
|
|
# call setup script for general 'tkextlib' libraries
|
|
require 'tkextlib/setup.rb'
|
|
|
|
# call setup script
|
|
require 'tkextlib/tktable/setup.rb'
|
|
|
|
# TkPackage.require('Tktable', '2.8')
|
|
TkPackage.require('Tktable')
|
|
|
|
module Tk
|
|
class TkTable < TkWindow
|
|
PACKAGE_NAME = 'Tktable'.freeze
|
|
def self.package_name
|
|
PACKAGE_NAME
|
|
end
|
|
|
|
def self.package_version
|
|
begin
|
|
TkPackage.require('Tktable')
|
|
rescue
|
|
''
|
|
end
|
|
end
|
|
|
|
class CellTag < TkObject
|
|
end
|
|
|
|
module ConfigMethod
|
|
end
|
|
end
|
|
end
|
|
|
|
module Tk::TkTable::ConfigMethod
|
|
include TkItemConfigMethod
|
|
|
|
def __item_cget_cmd(id) # id := [ type, tagOrId ]
|
|
[self.path, id[0], 'cget', id[1]]
|
|
end
|
|
private :__item_cget_cmd
|
|
|
|
def __item_config_cmd(id) # id := [ type, tagOrId ]
|
|
[self.path, id[0], 'configure', id[1]]
|
|
end
|
|
private :__item_config_cmd
|
|
|
|
def __item_pathname(id)
|
|
if id.kind_of?(Array)
|
|
id = tagid(id[1])
|
|
end
|
|
[self.path, id].join(';')
|
|
end
|
|
private :__item_pathname
|
|
|
|
def __item_boolval_optkeys(id)
|
|
super(id) << 'multiline' << 'showtext' << 'wrap'
|
|
end
|
|
private :__item_boolval_optkeys
|
|
|
|
def __item_strval_optkeys(id)
|
|
super(id) << 'ellipsis'
|
|
end
|
|
private :__item_strval_optkeys
|
|
|
|
def __item_val2ruby_optkeys(id) # { key=>method, ... }
|
|
super(id).update('window'=>proc{|v| window(v)})
|
|
end
|
|
private :__item_val2ruby_optkeys
|
|
|
|
def tag_cget(tagOrId, option)
|
|
itemcget(['tag', tagid(tagOrId)], option)
|
|
end
|
|
def tag_configure(tagOrId, slot, value=None)
|
|
itemconfigure(['tag', tagid(tagOrId)], slot, value)
|
|
end
|
|
def tag_configinfo(tagOrId, slot=nil)
|
|
itemconfiginfo(['tag', tagid(tagOrId)], slot)
|
|
end
|
|
def current_tag_configinfo(tagOrId, slot=nil)
|
|
current_itemconfiginfo(['tag', tagid(tagOrId)], slot)
|
|
end
|
|
|
|
def window_cget(tagOrId, option)
|
|
itemcget(['window', tagid(tagOrId)], option)
|
|
end
|
|
def window_configure(tagOrId, slot, value=None)
|
|
if slot == :window || slot == 'window'
|
|
value = _epath(value)
|
|
elsif slot.kind_of?(Hash)
|
|
if slot.key?(:window) || slot.key?('window')
|
|
slot = _symbolkey2str(slot)
|
|
slot['window'] = _epath(slot['window'])
|
|
end
|
|
end
|
|
itemconfigure(['window', tagid(tagOrId)], slot, value)
|
|
end
|
|
def window_configinfo(tagOrId, slot=nil)
|
|
itemconfiginfo(['window', tagid(tagOrId)], slot)
|
|
end
|
|
def current_window_configinfo(tagOrId, slot=nil)
|
|
current_itemconfiginfo(['window', tagid(tagOrId)], slot)
|
|
end
|
|
|
|
private :itemcget, :itemconfigure
|
|
private :itemconfiginfo, :current_itemconfiginfo
|
|
end
|
|
|
|
#####################################################
|
|
|
|
class Tk::TkTable::CellTag
|
|
include TkTreatTagFont
|
|
|
|
CellTagID_TBL = TkCore::INTERP.create_table
|
|
|
|
(CellTag_ID = ['tktbl:celltag'.freeze, '00000'.taint]).instance_eval{
|
|
@mutex = Mutex.new
|
|
def mutex; @mutex; end
|
|
freeze
|
|
}
|
|
|
|
TkCore::INTERP.init_ip_env{
|
|
CellTagID_TBL.mutex.synchronize{ CellTagID_TBL.clear }
|
|
}
|
|
|
|
def self.id2obj(table, id)
|
|
tpath = table.path
|
|
CellTagID_TBL.mutex.synchronize{
|
|
if CellTagID_TBL[tpath]
|
|
CellTagID_TBL[tpath][id]? CellTagID_TBL[tpath][id] : id
|
|
else
|
|
id
|
|
end
|
|
}
|
|
end
|
|
|
|
def initialize(parent, keys=nil)
|
|
@parent = @t = parent
|
|
@tpath - parent.path
|
|
CellTag_ID.mutex.synchronize{
|
|
@path = @id = CellTag_ID.join(TkCore::INTERP._ip_id_)
|
|
CellTag_ID[1].succ!
|
|
}
|
|
CellTagID_TBL.mutex.synchronize{
|
|
CellTagID_TBL[@tpath] = {} unless CellTagID_TBL[@tpath]
|
|
CellTagID_TBL[@tpath][@id] = self
|
|
}
|
|
configure(keys) if keys
|
|
end
|
|
|
|
def id
|
|
@id
|
|
end
|
|
|
|
def destroy
|
|
tk_call(@tpath, 'tag', 'delete', @id)
|
|
CellTagID_TBL.mutex.synchronize{
|
|
CellTagID_TBL[@tpath].delete(@id) if CellTagID_TBL[@tpath]
|
|
}
|
|
self
|
|
end
|
|
alias delete destroy
|
|
|
|
def exist?
|
|
@t.tag_exist?(@id)
|
|
end
|
|
def include?(idx)
|
|
@t.tag_include?(@id, idx)
|
|
end
|
|
|
|
def add_cell(*args)
|
|
@t.tag_cell(@id, *args)
|
|
end
|
|
def add_col(*args)
|
|
@t.tag_col(@id, *args)
|
|
end
|
|
def add_row(*args)
|
|
@t.tag_row(@id, *args)
|
|
end
|
|
|
|
def raise(target=None)
|
|
@t.tag_raise(@id, target)
|
|
end
|
|
def lower(target=None)
|
|
@t.tag_lower(@id, target)
|
|
end
|
|
|
|
def cget(key)
|
|
@t.tag_cget(@id, key)
|
|
end
|
|
def configure(key, val=None)
|
|
@t.tag_configure(@id, key, val)
|
|
end
|
|
def configinfo(key=nil)
|
|
@t.tag_configinfo(@id, key)
|
|
end
|
|
def current_configinfo(key=nil)
|
|
@t.current_tag_configinfo(@id, key)
|
|
end
|
|
end
|
|
|
|
class Tk::TkTable::NamedCellTag < Tk::TkTable::CellTag
|
|
def self.new(parent, name, keys=nil)
|
|
obj = nil
|
|
CellTagID_TBL.mutex.synchronize{
|
|
if CellTagID_TBL[parent.path] && CellTagID_TBL[parent.path][name]
|
|
obj = CellTagID_TBL[parent.path][name]
|
|
else
|
|
#super(parent, name, keys)
|
|
(obj = self.allocate).instance_eval{
|
|
@parent = @t = parent
|
|
@tpath = parent.path
|
|
@path = @id = name
|
|
CellTagID_TBL[@tpath] = {} unless CellTagID_TBL[@tpath]
|
|
CellTagID_TBL[@tpath][@id] = self
|
|
}
|
|
end
|
|
}
|
|
obj.configure(keys) if keys && ! keys.empty?
|
|
obj
|
|
end
|
|
|
|
def initialize(parent, name, keys=nil)
|
|
# dummy:: not called by 'new' method
|
|
@parent = @t = parent
|
|
@tpath = parent.path
|
|
@path = @id = name
|
|
CellTagID_TBL.mutex.synchronize{
|
|
CellTagID_TBL[@tpath] = {} unless CellTagID_TBL[@tpath]
|
|
CellTagID_TBL[@tpath][@id] = self
|
|
}
|
|
configure(keys) if keys && ! keys.empty?
|
|
end
|
|
end
|
|
|
|
#####################################################
|
|
|
|
class Tk::TkTable
|
|
TkCommandNames = ['table'.freeze].freeze
|
|
WidgetClassName = 'Table'.freeze
|
|
WidgetClassNames[WidgetClassName] = self
|
|
|
|
include Scrollable
|
|
include Tk::TkTable::ConfigMethod
|
|
include Tk::ValidateConfigure
|
|
|
|
def __destroy_hook__
|
|
Tk::TkTable::CelTag::CellTagID_TBL.mutex.synchronize{
|
|
Tk::TkTable::CelTag::CellTagID_TBL.delete(@path)
|
|
}
|
|
end
|
|
|
|
def __boolval_optkeys
|
|
super() << 'autoclear' << 'flashmode' << 'invertselected' <<
|
|
'multiline' << 'selecttitle' << 'wrap'
|
|
end
|
|
private :__boolval_optkeys
|
|
|
|
def __strval_optkeys
|
|
super() << 'colseparator' << 'ellipsis' << 'rowseparator' << 'sparsearray'
|
|
end
|
|
private :__strval_optkeys
|
|
|
|
|
|
#################################
|
|
|
|
class BrowseCommand < TkValidateCommand
|
|
class ValidateArgs < TkUtil::CallbackSubst
|
|
KEY_TBL = [
|
|
[ ?c, ?n, :column ],
|
|
[ ?C, ?s, :index ],
|
|
[ ?i, ?x, :cursor ],
|
|
[ ?r, ?n, :row ],
|
|
[ ?s, ?s, :last_index ],
|
|
[ ?S, ?s, :new_index ],
|
|
[ ?W, ?w, :widget ],
|
|
nil
|
|
]
|
|
|
|
PROC_TBL = [
|
|
[ ?n, TkComm.method(:number) ],
|
|
[ ?x, TkComm.method(:num_or_str) ],
|
|
[ ?s, TkComm.method(:string) ],
|
|
[ ?w, TkComm.method(:window) ],
|
|
nil
|
|
]
|
|
|
|
# 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
|
|
}
|
|
|
|
_setup_subst_table(KEY_TBL, PROC_TBL);
|
|
|
|
def self.ret_val(val)
|
|
val
|
|
end
|
|
end
|
|
|
|
def self._config_keys
|
|
['browsecommand', 'browsecmd']
|
|
end
|
|
end
|
|
#--------------------------------
|
|
class CellCommand < TkValidateCommand
|
|
class ValidateArgs < TkUtil::CallbackSubst
|
|
KEY_TBL = [
|
|
[ ?c, ?n, :column ],
|
|
[ ?C, ?s, :index ],
|
|
[ ?i, ?m, :rw_mode ],
|
|
[ ?r, ?n, :row ],
|
|
[ ?s, ?v, :value ],
|
|
[ ?W, ?w, :widget ],
|
|
nil
|
|
]
|
|
|
|
PROC_TBL = [
|
|
[ ?n, TkComm.method(:number) ],
|
|
[ ?s, TkComm.method(:string) ],
|
|
[ ?w, TkComm.method(:window) ],
|
|
[ ?m, proc{|val| (val == '0')? (:r) : (:w)} ],
|
|
[ ?v, proc{|val| TkComm.tk_tcl2ruby(val, true, false)} ],
|
|
nil
|
|
]
|
|
|
|
# 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
|
|
}
|
|
|
|
_setup_subst_table(KEY_TBL, PROC_TBL);
|
|
|
|
def self.ret_val(val)
|
|
TkComm._get_eval_string(val)
|
|
end
|
|
end
|
|
|
|
def self._config_keys
|
|
['command']
|
|
end
|
|
end
|
|
#--------------------------------
|
|
class SelectionCommand < TkValidateCommand
|
|
class ValidateArgs < TkUtil::CallbackSubst
|
|
KEY_TBL = [
|
|
[ ?c, ?n, :sel_columns ],
|
|
[ ?C, ?s, :sel_area ],
|
|
[ ?i, ?n, :total ],
|
|
[ ?r, ?n, :sel_rows ],
|
|
[ ?s, ?s, :value ],
|
|
[ ?W, ?w, :widget ],
|
|
nil
|
|
]
|
|
|
|
PROC_TBL = [
|
|
[ ?n, TkComm.method(:number) ],
|
|
[ ?s, TkComm.method(:string) ],
|
|
[ ?w, TkComm.method(:window) ],
|
|
nil
|
|
]
|
|
|
|
# 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
|
|
}
|
|
|
|
_setup_subst_table(KEY_TBL, PROC_TBL);
|
|
|
|
def self.ret_val(val)
|
|
val.to_s
|
|
end
|
|
end
|
|
|
|
def self._config_keys
|
|
['selectioncommand', 'selcmd']
|
|
end
|
|
end
|
|
#--------------------------------
|
|
class ValidateCommand < TkValidateCommand
|
|
class ValidateArgs < TkUtil::CallbackSubst
|
|
KEY_TBL = [
|
|
[ ?c, ?n, :column ],
|
|
[ ?C, ?s, :index ],
|
|
[ ?i, ?x, :cursor ],
|
|
[ ?r, ?n, :row ],
|
|
[ ?s, ?v, :current_value ],
|
|
[ ?S, ?v, :new_value ],
|
|
[ ?W, ?w, :widget ],
|
|
nil
|
|
]
|
|
|
|
PROC_TBL = [
|
|
[ ?n, TkComm.method(:number) ],
|
|
[ ?x, TkComm.method(:num_or_str) ],
|
|
[ ?s, TkComm.method(:string) ],
|
|
[ ?w, TkComm.method(:window) ],
|
|
[ ?v, proc{|val| TkComm.tk_tcl2ruby(val, true, false)} ],
|
|
nil
|
|
]
|
|
|
|
# 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
|
|
}
|
|
|
|
_setup_subst_table(KEY_TBL, PROC_TBL);
|
|
end
|
|
|
|
def self._config_keys
|
|
['vcmd', 'validatecommand']
|
|
end
|
|
end
|
|
|
|
#################################
|
|
|
|
def __validation_class_list
|
|
super() <<
|
|
BrowseCommand << CellCommand << SelectionCommand << ValidateCommand
|
|
end
|
|
|
|
Tk::ValidateConfigure.__def_validcmd(binding, BrowseCommand)
|
|
Tk::ValidateConfigure.__def_validcmd(binding, CellCommand)
|
|
Tk::ValidateConfigure.__def_validcmd(binding, SelectionCommand)
|
|
Tk::ValidateConfigure.__def_validcmd(binding, ValidateCommand)
|
|
|
|
#################################
|
|
|
|
def activate(idx)
|
|
tk_send('activate', tagid(idx))
|
|
end
|
|
|
|
def bbox(idx)
|
|
list(tk_send('bbox', tagid(idx)))
|
|
end
|
|
|
|
def border_mark(x, y)
|
|
simplelist(tk_send('border', 'mark', x, y))
|
|
end
|
|
def border_mark_row(x, y)
|
|
tk_send('border', 'mark', x, y, 'row')
|
|
end
|
|
def border_mark_col(x, y)
|
|
tk_send('border', 'mark', x, y, 'col')
|
|
end
|
|
def border_dragto(x, y)
|
|
tk_send('border', 'dragto', x, y)
|
|
end
|
|
|
|
def clear_cache(first=None, last=None)
|
|
tk_send('clear', 'cache', tagid(first), tagid(last))
|
|
self
|
|
end
|
|
def clear_sizes(first=None, last=None)
|
|
tk_send('clear', 'sizes', tagid(first), tagid(last))
|
|
self
|
|
end
|
|
def clear_tags(first=None, last=None)
|
|
tk_send('clear', 'tags', tagid(first), tagid(last))
|
|
self
|
|
end
|
|
def clear_all(first=None, last=None)
|
|
tk_send('clear', 'all', tagid(first), tagid(last))
|
|
self
|
|
end
|
|
|
|
def curselection
|
|
simplelist(tk_send('curselection'))
|
|
end
|
|
def curselection=(val)
|
|
tk_send('curselection', val)
|
|
val
|
|
end
|
|
|
|
def curvalue
|
|
tk_tcl2ruby(tk_send('curvalue'), true, false)
|
|
end
|
|
def curvalue=(val)
|
|
tk_send('curvalue', val)
|
|
val
|
|
end
|
|
|
|
def delete_active(idx1, idx2=None)
|
|
tk_send('delete', 'active', tagid(idx1), tagid(idx2))
|
|
self
|
|
end
|
|
def delete_cols(*args) # ?switches_array?, index, ?count?
|
|
params = []
|
|
if args[0].kind_of?(Array)
|
|
switches = args.shift
|
|
switches.each{|k| params << "-#{k}"}
|
|
end
|
|
params << '--'
|
|
params << tagid(args.shift)
|
|
params.concat(args)
|
|
tk_send('delete', 'cols', *params)
|
|
self
|
|
end
|
|
def delete_rows(*args) # ?switches_array?, index, ?count?
|
|
params = []
|
|
if args[0].kind_of?(Array)
|
|
switches = args.shift
|
|
switches.each{|k| params << "-#{k}"}
|
|
end
|
|
params << '--'
|
|
params << tagid(args.shift)
|
|
params.concat(args)
|
|
tk_send('delete', 'rows', *params)
|
|
self
|
|
end
|
|
|
|
def get(idx)
|
|
tk_tcl2ruby(tk_send('get', tagid(idx)), true, false)
|
|
end
|
|
def get_area(idx1, idx2)
|
|
simplelist(tk_send('get', tagid(idx1), tagid(idx2))).collect{|v|
|
|
tk_tcl2ruby(v, true, false)
|
|
}
|
|
end
|
|
|
|
def height_list
|
|
list(tk_send('height'))
|
|
end
|
|
def height(row)
|
|
number(tk_send('height', row))
|
|
end
|
|
def set_height(*pairs)
|
|
tk_send('height', *(pairs.flatten))
|
|
self
|
|
end
|
|
|
|
def hidden_list
|
|
simplelist(tk_send('hidden'))
|
|
end
|
|
def hidden?(idx, *args)
|
|
if args.empty?
|
|
if (ret = tk_send('hidden', tagid(idx))) == ''
|
|
false
|
|
else
|
|
ret
|
|
end
|
|
else
|
|
bool(tk_send('hidden', tagid(idx), *(args.collect{|i| tagid(i)})))
|
|
end
|
|
end
|
|
|
|
def icursor
|
|
number(tk_send('icursor'))
|
|
end
|
|
def icursor_set(idx)
|
|
number(tk_send('icursor', tagid(idx)))
|
|
end
|
|
|
|
def index(idx)
|
|
tk_send('index', tagid(idx))
|
|
end
|
|
def row_index(idx)
|
|
number(tk_send('index', tagid(idx), 'row'))
|
|
end
|
|
def col_index(idx)
|
|
number(tk_send('index', tagid(idx), 'col'))
|
|
end
|
|
|
|
def insert_active(idx, val)
|
|
tk_send('insert', 'active', tagid(idx), val)
|
|
self
|
|
end
|
|
def insert_cols(*args) # ?switches_array?, index, ?count?
|
|
params = []
|
|
if args[0].kind_of?(Array)
|
|
switches = args.shift
|
|
switches.each{|k| params << "-#{k}"}
|
|
end
|
|
params << '--'
|
|
params.concat(args)
|
|
params << tagid(args.shift)
|
|
tk_send('insert', 'cols', *params)
|
|
self
|
|
end
|
|
def insert_rows(*args) # ?switches_array?, index, ?count?
|
|
params = []
|
|
if args[0].kind_of?(Array)
|
|
switches = args.shift
|
|
switches.each{|k| params << "-#{k}"}
|
|
end
|
|
params << '--'
|
|
params << tagid(args.shift)
|
|
params.concat(args)
|
|
tk_send('insert', 'rows', *params)
|
|
self
|
|
end
|
|
|
|
# def postscript(*args)
|
|
# tk_send('postscript', *args)
|
|
# end
|
|
|
|
def reread
|
|
tk_send('reread')
|
|
self
|
|
end
|
|
|
|
def scan_mark(x, y)
|
|
tk_send('scan', 'mark', x, y)
|
|
self
|
|
end
|
|
def scan_dragto(x, y)
|
|
tk_send('scan', 'dragto', x, y)
|
|
self
|
|
end
|
|
|
|
def see(idx)
|
|
tk_send('see', tagid(idx))
|
|
self
|
|
end
|
|
|
|
def selection_anchor(idx)
|
|
tk_send('selection', 'anchor', tagid(idx))
|
|
self
|
|
end
|
|
def selection_clear(first, last=None)
|
|
tk_send('selection', 'clear', tagid(first), tagid(last))
|
|
self
|
|
end
|
|
def selection_clear_all
|
|
selection_clear('all')
|
|
end
|
|
def selection_include?(idx)
|
|
bool(tk_send('selection', 'includes', tagid(idx)))
|
|
end
|
|
def selection_present
|
|
bool(tk_send('selection', 'present'))
|
|
end
|
|
def selection_set(first, last=None)
|
|
tk_send('selection', 'set', tagid(first), tagid(last))
|
|
self
|
|
end
|
|
|
|
def set(*pairs) # idx, val, idx, val, ...
|
|
args = []
|
|
0.step(pairs.size-1, 2){|i|
|
|
args << tagid(pairs[i])
|
|
args << pairs[i+1]
|
|
}
|
|
tk_send('set', *args)
|
|
self
|
|
end
|
|
def set_row(*pairs) # idx, val, idx, val, ...
|
|
args = []
|
|
0.step(pairs.size-1, 2){|i|
|
|
args << tagid(pairs[i])
|
|
args << pairs[i+1]
|
|
}
|
|
tk_send('set', 'row', *args)
|
|
self
|
|
end
|
|
def set_col(*pairs) # idx, val, idx, val, ...
|
|
args = []
|
|
0.step(pairs.size-1, 2){|i|
|
|
args << tagid(pairs[i])
|
|
args << pairs[i+1]
|
|
}
|
|
tk_send('set', 'col', *args)
|
|
self
|
|
end
|
|
=begin
|
|
def set(*pairs) # idx, val, idx, val, ... OR [idx, val], [idx, val], ...
|
|
if pairs[0].kind_of?(Array)
|
|
# [idx, val], [idx, val], ...
|
|
args = []
|
|
pairs.each{|idx, val| args << tagid(idx) << val }
|
|
tk_send('set', *args)
|
|
else
|
|
# idx, val, idx, val, ...
|
|
args = []
|
|
0.step(pairs.size-1, 2){|i|
|
|
args << tagid(pairs[i])
|
|
args << pairs[i+1]
|
|
}
|
|
tk_send('set', *args)
|
|
end
|
|
self
|
|
end
|
|
def set_row(*pairs)
|
|
if pairs[0].kind_of?(Array)
|
|
# [idx, val], [idx, val], ...
|
|
args = []
|
|
pairs.each{|idx, val| args << tagid(idx) << val }
|
|
tk_send('set', 'row', *args)
|
|
else
|
|
# idx, val, idx, val, ...
|
|
args = []
|
|
0.step(pairs.size-1, 2){|i|
|
|
args << tagid(pairs[i])
|
|
args << pairs[i+1]
|
|
}
|
|
tk_send('set', 'row', *args)
|
|
end
|
|
self
|
|
end
|
|
def set_col(*pairs)
|
|
if pairs[0].kind_of?(Array)
|
|
# [idx, val], [idx, val], ...
|
|
args = []
|
|
pairs.each{|idx, val| args << idx << val }
|
|
tk_send('set', 'col', *args)
|
|
else
|
|
# idx, val, idx, val, ...
|
|
args = []
|
|
0.step(pairs.size-1, 2){|i|
|
|
args << tagid(pairs[i])
|
|
args << pairs[i+1]
|
|
}
|
|
tk_send('set', 'col', *args)
|
|
end
|
|
self
|
|
end
|
|
=end
|
|
|
|
def spans
|
|
simplelist(tk_send('spans')).collect{|inf|
|
|
lst = simplelist(inf)
|
|
idx = lst[0]
|
|
rows, cols = lst[1].split(',').map!{|n| Integer(n)}
|
|
[idx [rows, cols]]
|
|
}
|
|
end
|
|
alias span_list spans
|
|
def span(idx)
|
|
lst = simplelist(tk_send('spans', tagid(idx)))
|
|
idx = lst[0]
|
|
rows, cols = lst[1].split(',').map!{|n| Integer(n)}
|
|
[idx [rows, cols]]
|
|
end
|
|
def set_spans(*pairs)
|
|
# idx, val, idx, val, ...
|
|
args = []
|
|
0.step(pairs.size-1, 2){|i|
|
|
args << tagid(pairs[i])
|
|
val = pairs[i+1]
|
|
if val.kind_of?(Array)
|
|
args << val.join(',')
|
|
else
|
|
args << val
|
|
end
|
|
}
|
|
tk_send('spans', *args)
|
|
self
|
|
end
|
|
=begin
|
|
def set_spans(*pairs)
|
|
if pairs[0].kind_of?(Array)
|
|
# [idx, val], [idx, val], ...
|
|
args = []
|
|
pairs.each{|idx, val|
|
|
args << tagid(idx)
|
|
if val.kind_of?(Array)
|
|
args << val.join(',')
|
|
else
|
|
args << val
|
|
end
|
|
}
|
|
tk_send('spans', *args)
|
|
else
|
|
# idx, val, idx, val, ...
|
|
args = []
|
|
0.step(pairs.size-1, 2){|i|
|
|
args << tagid(pairs[i])
|
|
val = pairs[i+1]
|
|
if val.kind_of?(Array)
|
|
args << val.join(',')
|
|
else
|
|
args << val
|
|
end
|
|
}
|
|
tk_send('spans', *args)
|
|
end
|
|
self
|
|
end
|
|
=end
|
|
|
|
def tagid(tag)
|
|
if tag.kind_of?(Tk::TkTable::CellTag)
|
|
tag.id
|
|
elsif tag.kind_of?(Array)
|
|
if tag[0].kind_of?(Integer) && tag[1].kind_of?(Integer)
|
|
# [row, col]
|
|
tag.join(',')
|
|
else
|
|
tag
|
|
end
|
|
else
|
|
tag
|
|
end
|
|
end
|
|
|
|
def tagid2obj(tagid)
|
|
Tk::TkTable::CellTag::CellTagID_TBL.mutex.synchronize{
|
|
if Tk::TkTable::CellTag::CellTagID_TBL.key?(@path)
|
|
if Tk::TkTable::CellTag::CellTagID_TBL[@path].key?(tagid)
|
|
Tk::TkTable::CellTag::CellTagID_TBL[@path][tagid]
|
|
else
|
|
tagid
|
|
end
|
|
else
|
|
tagid
|
|
end
|
|
}
|
|
end
|
|
|
|
def tag_cell(tag, *cells)
|
|
tk_send('tag', 'cell', tagid(tag), *(cells.collect{|idx| tagid(idx)}))
|
|
self
|
|
end
|
|
def tag_reset(*cells)
|
|
tk_send('tag', 'cell', '', *(cells.collect{|idx| tagid(idx)}))
|
|
self
|
|
end
|
|
def tag_col(tag, *cols)
|
|
tk_send('tag', 'col', tagid(tag), *cols)
|
|
self
|
|
end
|
|
def tag_col_reset(*cols)
|
|
tk_send('tag', 'col', '', *cols)
|
|
self
|
|
end
|
|
def tag_delete(tag)
|
|
tk_send('tag', 'delete', tagid(tag))
|
|
Tk::TkTable::CellTag::CellTagID_TBL.mutex.synchronize{
|
|
if Tk::TkTable::CellTag::CellTagID_TBL[@path]
|
|
if tag.kind_of? Tk::TkTable::CellTag
|
|
Tk::TkTable::CellTag::CellTagID_TBL[@path].delete(tag.id)
|
|
else
|
|
Tk::TkTable::CellTag::CellTagID_TBL[@path].delete(tag)
|
|
end
|
|
end
|
|
}
|
|
self
|
|
end
|
|
def tag_exist?(tag)
|
|
bool(tk_send('tag', 'exists', tagid(tag)))
|
|
end
|
|
def tag_include?(tag, idx)
|
|
bool(tk_send('tag', 'includes', tagid(tag), tagid(idx)))
|
|
end
|
|
def tag_lower(tag, target=None)
|
|
tk_send('tag', 'lower', tagid(tag), tagid(target))
|
|
self
|
|
end
|
|
def tag_names(pat=None)
|
|
simplelist(tk_send('tag', 'names', pat)).collect{|tag| tagid2obj(tag)}
|
|
end
|
|
def tag_raise(tag, target=None)
|
|
tk_send('tag', 'raise', tagid(tag), tagid(target))
|
|
self
|
|
end
|
|
def tag_row(tag, *rows)
|
|
tk_send('tag', 'row', tagid(tag), *rows)
|
|
self
|
|
end
|
|
def tag_row_reset(*rows)
|
|
tk_send('tag', 'row', '', *rows)
|
|
self
|
|
end
|
|
|
|
def validate(idx)
|
|
bool(tk_send('validate', tagid(idx)))
|
|
end
|
|
|
|
def width_list
|
|
list(tk_send('width'))
|
|
end
|
|
def width(row)
|
|
number(tk_send('width', row))
|
|
end
|
|
def set_width(*pairs)
|
|
tk_send('width', *(pairs.flatten))
|
|
self
|
|
end
|
|
|
|
def window_delete(*args)
|
|
tk_send('window', 'delete', *(args.collect{|idx| tagid(idx)}))
|
|
self
|
|
end
|
|
def window_move(from_idx, to_idx)
|
|
tk_send('window', 'move', tagid(from_idx), tagid(to_idx))
|
|
self
|
|
end
|
|
def window_names(pat=None)
|
|
simplelist(tk_send('window', 'names', pat))
|
|
end
|
|
end
|