# # tkextlib/tcllib/tablelist_core.rb # # by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) # # * Part of tcllib extension # * This file is required by 'tkextlib/tcllib/tablelist.rb' or # 'tkextlib/tcllib/tablelist_tile.rb'. # module Tk module Tcllib class Tablelist < TkWindow if Tk::Tcllib::Tablelist_usingTile PACKAGE_NAME = 'Tablelist_tile'.freeze else PACKAGE_NAME = 'Tablelist'.freeze end def self.package_name PACKAGE_NAME end def self.package_version begin TkPackage.require(self.package_name) rescue '' end end def self.use_Tile? (Tk::Tcllib::Tablelist_usingTile)? true: false end end TableList = Tablelist end end module Tk::Tcllib::TablelistItemConfig include TkItemConfigMethod def _to_idx(idx) if idx.kind_of?(Array) idx.collect{|elem| _get_eval_string(elem)}.join(',') else idx end end def _from_idx(idx) return idx unless idx.kind_of?(String) if idx[0] == ?@ # '@x,y' idx elsif idx =~ /([^,]+),([^,]+)/ row = $1, column = $2 [num_or_str(row), num_or_str(column)] else num_or_str(idx) end end private :_to_idx, :_from_idx def __item_cget_cmd(mixed_id) [self.path, mixed_id[0] + 'cget', _to_idx(mixed_id[1])] end def __item_config_cmd(mixed_id) [self.path, mixed_id[0] + 'configure', _to_idx(mixed_id[1])] end def cell_cget_tkstring(tagOrId, option) itemcget_tkstring(['cell', tagOrId], option) end def cell_cget(tagOrId, option) itemcget(['cell', tagOrId], option) end def cell_cget_strict(tagOrId, option) itemcget_strict(['cell', tagOrId], option) end def cell_configure(tagOrId, slot, value=None) itemconfigure(['cell', tagOrId], slot, value) end def cell_configinfo(tagOrId, slot=nil) itemconfiginfo(['cell', tagOrId], slot) end def current_cell_configinfo(tagOrId, slot=nil) current_itemconfiginfo(['cell', tagOrId], slot) end alias cellcget_tkstring cell_cget_tkstring alias cellcget cell_cget alias cellcget_strict cell_cget_strict alias cellconfigure cell_configure alias cellconfiginfo cell_configinfo alias current_cellconfiginfo current_cell_configinfo 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 alias columncget_tkstring column_cget_tkstring alias columncget column_cget alias columncget_strict column_cget_strict alias columnconfigure column_configure alias columnconfiginfo column_configinfo alias current_columnconfiginfo current_column_configinfo def row_cget_tkstring(tagOrId, option) itemcget_tkstring(['row', tagOrId], option) end def row_cget(tagOrId, option) itemcget(['row', tagOrId], option) end def row_cget_strict(tagOrId, option) itemcget_strict(['row', tagOrId], option) end def row_configure(tagOrId, slot, value=None) itemconfigure(['row', tagOrId], slot, value) end def row_configinfo(tagOrId, slot=nil) itemconfiginfo(['row', tagOrId], slot) end def current_row_configinfo(tagOrId, slot=nil) current_itemconfiginfo(['row', tagOrId], slot) end alias rowcget_tkstring row_cget_tkstring alias rowcget row_cget alias rowcget_strict row_cget_strict alias rowconfigure row_configure alias rowconfiginfo row_configinfo alias current_rowconfiginfo current_row_configinfo private :itemcget_tkstring, :itemcget, :itemcget_strict private :itemconfigure, :itemconfiginfo, :current_itemconfiginfo end class Tk::Tcllib::Tablelist include Tk::Tcllib::TablelistItemConfig include Scrollable TkCommandNames = ['::tablelist::tablelist'.freeze].freeze WidgetClassName = 'Tablelist'.freeze WidgetClassNames[WidgetClassName] ||= self 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 __numval_optkeys super() + ['titlecolumns'] end private :__numval_optkeys def __strval_optkeys super() + ['snipstring'] end private :__strval_optkeys def __boolval_optkeys super() - ['takefocus'] + [ 'forceeditendcommand', 'movablecolumns', 'movablerows', 'protecttitlecolumns', 'resizablecolumns', 'setfocus', 'showarrow', 'showlabels', 'showseparators' ] end private :__boolval_optkeys def __listval_optkeys super() + ['columns', 'columntitles'] end private :__listval_optkeys def __tkvariable_optkeys super() + ['listvariable'] end private :__tkvariable_optkeys def __val2ruby_optkeys # { key=>proc, ... } # The method is used to convert a opt-value to a ruby's object. # When get the value of the option "key", "proc.call(value)" is called. super().update('stretch'=>proc{|v| (v == 'all')? v: simplelist(v) }, 'takefocus'=>proc{|v| case v when '1' true when '0' false when '' nil else # cmd tk_tcl2ruby(cmd) end }) end private :__val2ruby_optkeys def __ruby2val_optkeys # { key=>proc, ... } # The method is used to convert a ruby's object to a opt-value. # When set the value of the option "key", "proc.call(value)" is called. # That is, "-#{key} #{proc.call(value)}". super().update('stretch'=>proc{|v| (v.kind_of?(Array))? v.collect{|e| _to_idx(e)}: v }, 'takefocus'=>proc{|v| case v when true '1' when false '0' when nil '' else _get_eval_string(v) end }) end private :__ruby2val_optkeys def __font_optkeys super() + ['labelfont'] end private :__font_optkeys ########################## def __item_strval_optkeys(id) if id[0] == 'cell' super(id) + ['title'] else super(id) - ['text'] + ['title', 'name'] end end private :__item_strval_optkeys def __item_boolval_optkeys(id) super(id) + [ 'changesnipside', 'editable', 'hide', 'resizable', 'selectable', 'showarrow', 'showlinenumbers', 'stretchable', 'stretchwindow', 'wrap' ] end private :__item_boolval_optkeys def __item_listval_optkeys(id) if id[0] == 'cell' super(id) else super(id) + ['text'] end end private :__item_listval_optkeys def __item_font_optkeys(id) # maybe need to override super(id) + ['labelfont'] end private :__item_font_optkeys ########################## def activate(index) tk_send('activate', _to_idx(index)) self end def activate_cell(index) tk_send('activatecell', _to_idx(index)) self end alias activatecell activate_cell def get_attrib(name=nil) if name && name != None tk_send('attrib', name) else ret = [] lst = simplelist(tk_send('attrib')) until lst.empty? ret << ( [lst.shift] << lst.shift ) end ret end end def set_attrib(*args) tk_send('attrib', *(args.flatten)) self end def bbox(index) list(tk_send('bbox', _to_idx(index))) end def bodypath window(tk_send('bodypath')) end def bodytag TkBindTag.new_by_name(tk_send('bodytag')) end def cancel_editing tk_send('cancelediting') self end alias cancelediting cancel_editing def get_cellattrib(name=nil) if name && name != None tk_send('cellattrib', name) else ret = [] lst = simplelist(tk_send('cellattrib')) until lst.empty? ret << ( [lst.shift] << lst.shift ) end ret end end def set_cellattrib(*args) tk_send('cellattrib', *(args.flatten)) self end def cellindex(idx) _from_idx(tk_send('cellindex', _to_idx(idx))) end def cellselection_anchor(idx) tk_send('cellselection', 'anchor', _to_idx(idx)) self end def cellselection_clear(first, last=nil) if first.kind_of?(Array) tk_send('cellselection', 'clear', first.collect{|idx| _to_idx(idx)}) else first = _to_idx(first) last = (last)? _to_idx(last): first tk_send('cellselection', 'clear', first, last) end self end def cellselection_includes(idx) bool(tk_send('cellselection', 'includes', _to_idx(idx))) end def cellselection_set(first, last=nil) if first.kind_of?(Array) tk_send('cellselection', 'set', first.collect{|idx| _to_idx(idx)}) else first = _to_idx(first) last = (last)? _to_idx(last): first tk_send('cellselection', 'set', first, last) end self end def get_columnattrib(name=nil) if name && name != None tk_send('columnattrib', name) else ret = [] lst = simplelist(tk_send('columnattrib')) until lst.empty? ret << ( [lst.shift] << lst.shift ) end ret end end def set_columnattrib(*args) tk_send('columnattrib', *(args.flatten)) self end def columncount number(tk_send('columncount')) end def columnindex(idx) number(tk_send('columnindex', _to_idx(idx))) end def columnwidth(idx, opt=nil) if opt number(tk_send('columnwidth', _to_idx(idx), "-#{opt}")) else number(tk_send('columnwidth', _to_idx(idx))) end end def requested_columnwidth(idx) columnwidth(idx, 'requested') end def stretched_columnwidth(idx) columnwidth(idx, 'stretched') end def total_columnwidth(idx) columnwidth(idx, 'total') end def configcelllist(lst) # lst ==> [idx, opt, val, idx, opt, val, ...] ary = [] lst.slice(3){|idx, opt, val| ary << _to_idx(idx) << "-#{opt}" << val } tk_send('configcelllist', ary) self end alias config_celllist configcelllist def configcells(*args) # args ==> idx, opt, val, idx, opt, val, ... ary = [] args.slice(3){|idx, opt, val| ary << _to_idx(idx) << "-#{opt}" << val } tk_send('configcells', *ary) self end alias config_cells configcells def configcolumnlist(lst) # lst ==> [idx, opt, val, idx, opt, val, ...] ary = [] lst.slice(3){|idx, opt, val| ary << _to_idx(idx) << "-#{opt}" << val } tk_send('configcolumnlist', ary) self end alias config_columnlist configcolumnlist def configcolumns(*args) # args ==> idx, opt, val, idx, opt, val, ... ary = [] args.slice(3){|idx, opt, val| ary << _to_idx(idx) << "-#{opt}" << val } tk_send('configcolumns', *ary) self end alias config_columns configcolumns def configrowlist(lst) # lst ==> [idx, opt, val, idx, opt, val, ...] ary = [] lst.slice(3){|idx, opt, val| ary << _to_idx(idx) << "-#{opt}" << val } tk_send('configrowlist', ary) self end alias config_rowlist configrowlist def configrows(*args) # args ==> idx, opt, val, idx, opt, val, ... ary = [] args.slice(3){|idx, opt, val| ary << _to_idx(idx) << "-#{opt}" << val } tk_send('configrows', *ary) self end alias config_rows configrows def containing(y) idx = num_or_str(tk_send('containing', y)) (idx.kind_of?(Fixnum) && idx < 0)? nil: idx end def containing_cell(x, y) idx = _from_idx(tk_send('containingcell', x, y)) if idx.kind_of?(Array) [ ((idx[0].kind_of?(Fixnum) && idx[0] < 0)? nil: idx[0]), ((idx[1].kind_of?(Fixnum) && idx[1] < 0)? nil: idx[1]) ] else idx end end alias containingcell containing_cell def containing_column(x) idx = num_or_str(tk_send('containingcolumn', x)) (idx.kind_of?(Fixnum) && idx < 0)? nil: idx end alias containingcolumn containing_column def curcellselection simplelist(tk_send('curcellselection')).collect!{|idx| _from_idx(idx)} end def curselection list(tk_send('curselection')) end def delete_items(first, last=nil) if first.kind_of?(Array) tk_send('delete', first.collect{|idx| _to_idx(idx)}) else first = _to_idx(first) last = (last)? _to_idx(last): first tk_send('delete', first, last) end self end alias delete delete_items alias deleteitems delete_items def delete_columns(first, last=nil) if first.kind_of?(Array) tk_send('deletecolumns', first.collect{|idx| _to_idx(idx)}) else first = _to_idx(first) last = (last)? _to_idx(last): first tk_send('deletecolumns', first, last) end self end alias deletecolumns delete_columns def edit_cell(idx) tk_send('editcell', _to_idx(idx)) self end alias editcell edit_cell def editwintag TkBindTag.new_by_name(tk_send('editwintag')) end def editwinpath window(tk_send('editwinpath')) end def entrypath window(tk_send('entrypath')) end def fill_column(idx, txt) tk_send('fillcolumn', _to_idx(idx), txt) self end alias fillcolumn fill_column def finish_editing tk_send('finishediting') self end alias finishediting finish_editing def formatinfo key, row, col = simplelist(tk_send('formatinfo')) [key, number(row), number(col)] end def get(first, last=nil) if first.kind_of?(Array) simplelist(tk_send('get', first.collect{|idx| _to_idx(idx)})).collect!{|elem| simplelist(elem) } else first = _to_idx(first) last = (last)? _to_idx(last): first simplelist(tk_send('get', first, last)) end end def get_cells(first, last=nil) if first.kind_of?(Array) simplelist(tk_send('getcells', first.collect{|idx| _to_idx(idx)})).collect!{|elem| simplelist(elem) } else first = _to_idx(first) last = (last)? _to_idx(last): first simplelist(tk_send('getcells', first, last)) end end alias getcells get_cells def get_columns(first, last=nil) if first.kind_of?(Array) simplelist(tk_send('getcolumns', first.collect{|idx| _to_idx(idx)})).collect!{|elem| simplelist(elem) } else first = _to_idx(first) last = (last)? _to_idx(last): first simplelist(tk_send('getcolumns', first, last)) end end alias getcolumns get_columns def get_keys(first, last=nil) if first.kind_of?(Array) simplelist(tk_send('getkeys', first.collect{|idx| _to_idx(idx)})).collect!{|elem| simplelist(elem) } else first = _to_idx(first) last = (last)? _to_idx(last): first simplelist(tk_send('getkeys', first, last)) end end alias getkeys get_keys def has_attrib?(name) bool(tk_send('hasattrib', name)) end def has_cellattrib?(idx, name) bool(tk_send('hascellattrib', _to_idx(idx), name)) end def has_columnattrib?(idx, name) bool(tk_send('hascolumnattrib', _to_idx(idx), name)) end def has_rowattrib?(idx, name) bool(tk_send('hasrowattrib', _to_idx(idx), name)) end def imagelabelpath(idx) window(tk_send('imagelabelpath', _to_idx(idx))) end def index(idx) number(tk_send('index', _to_idx(idx))) end def insert(idx, *items) tk_send('insert', _to_idx(idx), *items) self end def insert_columnlist(idx, columnlist) tk_send('insertcolumnlist', _to_idx(idx), columnlist) self end alias insertcolumnlist insert_columnlist def insert_columns(idx, *args) tk_send('insertcolums', _to_idx(idx), *args) self end alias insertcolumns insert_columns def insert_list(idx, list) tk_send('insertlist', _to_idx(idx), list) self end alias insertlist insert_list def is_elem_snipped?(cellidx, tkvar) bool(tk_send('iselemsnipped', _to_idx(cellidx), tkvar)) end alias elem_snipped? is_elem_snipped? def is_title_snipped?(colidx, tkvar) bool(tk_send('istitlesnipped', _to_idx(colidx), tkvar)) end alias title_snipped? is_title_snipped? def itemlistvar TkVarAccess.new(tk_send('itemlistvar')) end def labelpath(idx) window(tk_send('labelpath', _to_idx(idx))) end def labels simplelist(tk_send('labels')) end def labeltag TkBindTag.new_by_name(tk_send('labeltag')) end def move(src, target) tk_send('move', _to_idx(src), _to_idx(target)) self end def move_column(src, target) tk_send('movecolumn', _to_idx(src), _to_idx(target)) self end alias movecolumn move_column def nearest(y) _from_idx(tk_send('nearest', y)) end def nearest_cell(x, y) _from_idx(tk_send('nearestcell', x, y)) end alias nearestcell nearest_cell def nearest_column(x) _from_idx(tk_send('nearestcolumn', x)) end alias nearestcolumn nearest_column def reject_input tk_send('rejectinput') self end alias rejectinput reject_input def reset_sortinfo tk_send('resetsortinfo') self end alias resetsortinfo reset_sortinfo def get_rowattrib(name=nil) if name && name != None tk_send('rowattrib', name) else ret = [] lst = simplelist(tk_send('rowattrib')) until lst.empty? ret << ( [lst.shift] << lst.shift ) end ret end end def set_rowattrib(*args) tk_send('rowattrib', *(args.flatten)) 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', _to_idx(idx)) self end def see_cell(idx) tk_send('seecell', _to_idx(idx)) self end alias seecell see_cell def see_column(idx) tk_send('seecolumn', _to_idx(idx)) self end alias seecolumn see_column def selection_anchor(idx) tk_send('selection', 'anchor', _to_idx(idx)) self end def selection_clear(first, last=nil) if first.kind_of?(Array) tk_send('selection', 'clear', first.collect{|idx| _to_idx(idx)}) else first = _to_idx(first) last = (last)? _to_idx(last): first tk_send('selection', 'clear', first, last) end self end def selection_includes(idx) bool(tk_send('selection', 'includes', _to_idx(idx))) end def selection_set(first, last=nil) if first.kind_of?(Array) tk_send('selection', 'set', first.collect{|idx| _to_idx(idx)}) else first = _to_idx(first) last = (last)? _to_idx(last): first tk_send('selection', 'set', first, last) end self end def separatorpath(idx=nil) if idx window(tk_send('separatorpath', _to_idx(idx))) else window(tk_send('separatorpath')) end end def separators simplelist(tk_send('separators')).collect!{|w| window(w)} end def size number(tk_send('size')) end def sort(order=nil) if order order = order.to_s order = '-' << order if order[0] != ?- if order.length < 2 order = nil end end if order tk_send('sort', order) else tk_send('sort') end self end def sort_increasing tk_send('sort', '-increasing') self end def sort_decreasing tk_send('sort', '-decreasing') self end # default of 'labelcommand' option DEFAULT_labelcommand_value = DEFAULT_sortByColumn_cmd = '::tablelist::sortByColumn' # default of 'labelcommand2' option DEFAULT_labelcommand2_value = DEFAULT_addToSortColumns_cmd = '::tablelist::addToSortColumns' def sortByColumn_with_event_generate(idx) tk_call('::tablelist::sortByColumn', @path, _to_idx(idx)) end def addToSortColumns_with_event_generate(idx) tk_call('::tablelist::addToSortColumns', @path, _to_idx(idx)) end def sort_by_column(idx, order=nil) if order order = order.to_s order = '-' << order if order[0] != ?- if order.length < 2 order = nil end end if order tk_send('sortbycolumn', _to_idx(idx), order) else tk_send('sortbycolumn', _to_idx(idx)) end self end def sort_by_column_increasing(idx) tk_send('sortbycolumn', _to_idx(idx), '-increasing') self end def sort_by_column_decreasing(idx) tk_send('sortbycolumn', _to_idx(idx), '-decreasing') self end def sort_by_columnlist(idxlist, orderlist=None) # orderlist :: list of 'increasing' or 'decreasing' tk_send('sortbycolumnlist', idxlist.map{|idx| _to_idx(idx)}, orderlist) self end def sortcolumn idx = num_or_str(tk_send('sortcolum')) (idx.kind_of?(Fixnum) && idx < 0)? nil: idx end def sortcolumnlist simplelist(tk_send('sortcolumlist')).map{|col| num_or_str(col)} end def sortorder tk_send('sortorder') end def sortorderlist simplelist(tk_send('sortorderlist')) end def toggle_columnhide(first, last=nil) if first.kind_of?(Array) tk_send('togglecolumnhide', first.collect{|idx| _to_idx(idx)}) else first = _to_idx(first) last = (last)? _to_idx(last): first tk_send('togglecolumnhide', first, last) end end def toggle_rowhide(first, last=nil) if first.kind_of?(Array) tk_send('togglerowhide', first.collect{|idx| _to_idx(idx)}) else first = _to_idx(first) last = (last)? _to_idx(last): first tk_send('togglerowhide', first, last) end end def toggle_visibility(first, last=nil) if first.kind_of?(Array) tk_send('togglevisibility', first.collect{|idx| _to_idx(idx)}) else first = _to_idx(first) last = (last)? _to_idx(last): first tk_send('togglevisibility', first, last) end self end alias togglevisibility toggle_visibility def unset_attrib(name) tk_send('unsetattrib', name) self end def unset_cellattrib(idx, name) tk_send('unsetcellattrib', _to_idx(idx), name) self end def unset_columnattrib(idx, name) tk_send('unsetcolumnattrib', _to_idx(idx), name) self end def unset_rowattrib(idx, name) tk_send('unsetrowattrib', _to_idx(idx), name) self end def windowpath(idx) window(tk_send('windowpath', _to_idx(idx))) end end class << Tk::Tcllib::Tablelist ############################################################ # helper commands def getTablelistPath(descendant) window(Tk.tk_call('::tablelist::getTablelistPath', descendant)) end def getTablelistColumn(descendant) num_or_str(Tk.tk_call('::tablelist::getTablelistColumn', headerlabel)) end def convEventFields(descendant, x, y) window(Tk.tk_call('::tablelist::convEventFields', descendant, x, y)) end ############################################################ # with the BWidget package def addBWidgetEntry(name=None) Tk.tk_call('::tablelist::addBWidgetEntry', name) end def addBWidgetSpinBox(name=None) Tk.tk_call('::tablelist::addBWidgetSpinBox', name) end def addBWidgetComboBox(name=None) Tk.tk_call('::tablelist::addBWidgetComboBox', name) end ############################################################ # with the Iwidgets ([incr Widgets]) package def addIncrEntryfield(name=None) Tk.tk_call('::tablelist::addIncrEntry', name) end def addIncrDateTimeWidget(type, seconds=false, name=None) # type := 'datefield'|'dateentry'|timefield'|'timeentry' if seconds && seconds != None seconds = '-seconds' else seconds = None end Tk.tk_call('::tablelist::addDateTimeWidget', type, seconds, name) end def addIncrSpinner(name=None) Tk.tk_call('::tablelist::addIncrSpinner', name) end def addIncrSpinint(name=None) Tk.tk_call('::tablelist::addIncrSpinint', name) end def addIncrCombobox(name=None) Tk.tk_call('::tablelist::addIncrCombobox', name) end ############################################################ # with Bryan Oakley's combobox package def addOakleyCombobox(name=None) Tk.tk_call('::tablelist::addOakleyCombobox', name) end ############################################################ # with the multi-entry package Mentry is a library extension def addDateMentry(format, separator, gmt=false, name=None) if gmt && gmt != None gmt = '-gmt' else gmt = None end Tk.tk_call('::tablelist::addDateMentry', format, separator, gmt, name) end def addTimeMentry(format, separator, gmt=false, name=None) if gmt && gmt != None gmt = '-gmt' else gmt = None end Tk.tk_call('::tablelist::addTimeMentry', format, separator, gmt, name) end def addDateTimeMentry(format, date_sep, time_sep, gmt=false, name=None) if gmt && gmt != None gmt = '-gmt' else gmt = None end Tk.tk_call('::tablelist::addDateTimeMentry', format, date_sep, time_sep, gmt, name) end def addFixedPointMentry(count1, count2, comma=false, name=None) if comma && comma != None comma = '-comma' else comma = None end Tk.tk_call('::tablelist::addFixedPoingMentry', count1, count2, comma, name) end def addIPAddrMentry(name=None) Tk.tk_call('::tablelist::addIPAddrMentry', name) end end