From: nagai@... Date: 2000-04-10T12:09:41+09:00 Subject: [ruby-list:21825] Re: tktext.rb BUG 永井@知能.九工大です. From: matz@netlab.co.jp (Yukihiro Matsumoto) Subject: [ruby-list:21809] Re: tktext.rb BUG Date: Sat, 8 Apr 2000 17:41:50 +0900 Message-ID: matz> In message "[ruby-list:21808] tktext.rb BUG" matz> on 00/04/08, nagai@ai.kyutech.ac.jp writes: matz> |tktext.rb に bug がありました. matz> |テキストウィジェットの dump コマンドが, matz> |どこをどう間違ったのか,TkTextWindow クラスの中にあります.(^_^; matz> |dump 関連を TkText クラスに移しておいてください. matz> _dump, dump_all, dump_mark, dump_tag, dump_text, dump_window matz> で全部ですか? _retrieve_braced_text と _retrive_backshashed_text もです. が,ついでですので,欠けてる機能を追加しておきます. TkTextWindow クラスから dump 関連を削った後, 後述のリストを TkText クラスに加えてください. これにより,dump_command や dump_image が追加される上, ---------------------------------------------------------- require 'tk' t = TkText.new.pack t.bind('Control-Button-1', proc{p t.dump(['text', 'mark', ['command', proc{|*args| p args}]], '1.0', 'end')}) Tk.mainloop ---------------------------------------------------------- などということができます. ついでに bind_remove を tk.rb に追加しておきます. こちらは, ================================================================= module TkComm において, ------------------------------------------------------- def _bind_remove(what, context) tk_call(*(what + ["<#{tk_event_sequence(context)}>", ''])) end ------------------------------------------------------- を追加し,private リストの ------------------------------------------------------- private :install_bind, :tk_event_sequence, :_bind_core, :_bind, :_bind_append, :_bindinfo ------------------------------------------------------- に :_bind_remove を追加. さらに同モジュールに ------------------------------------------------------- def bind_remove(tagOrClass, context) _bind_remove(['bind', tagOrClass], context) end ------------------------------------------------------- を追加. modlue TkBindCore に ------------------------------------------------------- def bind_remove(context) Tk.bind_remove(to_eval, context) end ------------------------------------------------------- を追加. ================================================================= というようにお願いします. bind_remove は滅多に使うことはないと思いますが, 衝突するバインディングの優先順序を変更するためには必須ですので. # 例えば と とがあるとき, # Control + Shift + Button-1 でどちらが実行されるかという話です. # 順序変更には,バインドを一旦抹殺した後に再定義する必要があります. では,以下が TkText クラスの修正分です. ================================================================= def dump(type_info, *index) args = type_info.collect{|inf| if inf.kind_of? Array inf[0] = '-' + inf[0] inf else '-' + inf end }.flatten str = tk_send('dump', *(args + index)) result = [] sel = nil i = 0 while i < str.size # retrieve key idx = str.index(/ /, i) result.push str[i..(idx-1)] i = idx + 1 # retrieve value case result[-1] when 'text' if str[i] == ?{ # text formed as {...} val, i = _retrieve_braced_text(str, i) result.push val else # text which may contain backslahes val, i = _retrieve_backslashed_text(str, i) result.push val end else idx = str.index(/ /, i) val = str[i..(idx-1)] case result[-1] when 'mark' case val when 'insert' result.push TkTextMarkInsert.new(self) when 'current' result.push TkTextMarkCurrent.new(self) when 'anchor' result.push TkTextMarkAnchor.new(self) else result.push tk_tcl2rb(val) end when 'tagon' if val == 'sel' if sel result.push sel else result.push TkTextTagSel.new(self) end else result.push tk_tcl2rb val end when 'tagoff' result.push tk_tcl2rb sel when 'window' result.push tk_tcl2rb val end i = idx + 1 end # retrieve index idx = str.index(/ /, i) if idx result.push str[i..(idx-1)] i = idx + 1 else result.push str[i..-1] break end end kvis = [] until result.empty? kvis.push [result.shift, result.shift, result.shift] end kvis # result is [[key1, value1, index1], [key2, value2, index2], ...] end def _retrieve_braced_text(str, i) cnt = 0 idx = i while idx < str.size case str[idx] when ?{ cnt += 1 when ?} cnt -= 1 if cnt == 0 break end end idx += 1 end return str[i+1..idx-1], idx + 2 end private :_retrieve_braced_text def _retrieve_backslashed_text(str, i) j = i idx = nil loop { idx = str.index(/ /, j) if str[idx-1] == ?\\ j += 1 else break end } val = str[i..(idx-1)] val.gsub!(/\\( |\{|\})/, '\1') return val, idx + 1 end private :_retrieve_backslashed_text def dump_all(*index) dump(['all'], *index) end def dump_command(cmd, *index) dump([['command', cmd]], *index) end def dump_mark(*index) dump(['mark'], *index) end def dump_tag(*index) dump(['tag'], *index) end def dump_text(*index) dump(['text'], *index) end def dump_window(*index) dump(['window'], *index) end def dump_image(*index) dump(['image'], *index) end ================================================================= -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp