diff options
-rw-r--r-- | ext/tk/lib/tk.rb | 14 | ||||
-rw-r--r-- | ext/tk/lib/tkcanvas.rb | 9 | ||||
-rw-r--r-- | ext/tk/lib/tktext.rb | 145 |
3 files changed, 128 insertions, 40 deletions
diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index d7531b2f8f..6d8618a58a 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -3088,7 +3088,9 @@ class TkObject<TkKernel begin cget name rescue - fail NameError, "undefined local variable or method `#{name}' for #{self.to_s}", error_at + fail NameError, + "undefined local variable or method `#{name}' for #{self.to_s}", + error_at end else fail NameError, "undefined method `#{name}' for #{self.to_s}", error_at @@ -4773,6 +4775,15 @@ module TkClipboard end end +# widget_destroy_hook +require 'tkvirtevent' +TkBindTag::ALL.bind(TkVirtualEvent.new('Destroy'), proc{|widget| + if widget.respond_to? :__destroy_hook__ + widget.__destroy_hook__ + end + }, '%W') + +# autoload autoload :TkCanvas, 'tkcanvas' autoload :TkImage, 'tkcanvas' autoload :TkBitmapImage, 'tkcanvas' @@ -4789,7 +4800,6 @@ autoload :TkAfter, 'tkafter' autoload :TkTimer, 'tkafter' autoload :TkPalette, 'tkpalette' autoload :TkFont, 'tkfont' -autoload :TkVirtualEvent, 'tkvirtevent' autoload :TkBgError, 'tkbgerror' autoload :TkManageFocus, 'tkmngfocus' autoload :TkPalette, 'tkpalette' diff --git a/ext/tk/lib/tkcanvas.rb b/ext/tk/lib/tkcanvas.rb index 8c5b610f18..a98d770ccd 100644 --- a/ext/tk/lib/tkcanvas.rb +++ b/ext/tk/lib/tkcanvas.rb @@ -32,6 +32,10 @@ class TkCanvas<TkWindow WidgetClassName = 'Canvas'.freeze WidgetClassNames[WidgetClassName] = self + def __destroy_hook__ + TkcItem::CItemID_TBL.delete(@path) + end + def create_self(keys) if keys and keys != None tk_call 'canvas', @path, *hash_kv(keys) @@ -119,6 +123,11 @@ class TkCanvas<TkWindow end def delete(*args) + if TkcItem::CItemID_TBL[self.path] + find('withtag', *args).each{|item| + TkcItem::CItemID_TBL[self.path].delete(item.id) + } + end tk_send 'delete', *args.collect{|t| tagid(t)} self end diff --git a/ext/tk/lib/tktext.rb b/ext/tk/lib/tktext.rb index 638be472f3..f23744af22 100644 --- a/ext/tk/lib/tktext.rb +++ b/ext/tk/lib/tktext.rb @@ -39,9 +39,15 @@ class TkText<TkTextWin end def init_instance_variable + @cmdtbl = {} @tags = {} end + def __destroy_hook__ + TTagID_TBL.delete(@path) + TMarkID_TBL.delete(@path) + end + def create_self(keys) if keys and keys != None tk_call 'text', @path, *hash_kv(keys) @@ -73,10 +79,10 @@ class TkText<TkTextWin end def tagid2obj(tagid) - if not @tags[tagid] - tagid - else + if @tags[tagid] @tags[tagid] + else + tagid end end @@ -92,13 +98,36 @@ class TkText<TkTextWin } end + def mark_gravity(mark, direction=nil) + if direction + tk_send 'mark', 'gravity', mark, direction + self + else + tk_send 'mark', 'gravity', mark + end + end + + def mark_set(mark, index) + tk_send 'mark', 'set', mark, index + self + end + alias set_mark mark_set + + def mark_unset(*marks) + tk_send 'mark', 'unset', *marks + self + end + alias unset_mark mark_unset + def mark_next(index) tagid2obj(tk_send('mark', 'next', index)) end + alias next_mark mark_next def mark_previous(index) tagid2obj(tk_send('mark', 'previous', index)) end + alias previous_mark mark_previous def image_cget(index, slot) case slot.to_s @@ -259,12 +288,23 @@ class TkText<TkTextWin self end alias addtag tag_add + alias add_tag tag_add def tag_delete(*tags) tk_send 'tag', 'delete', *tags + if TkTextTag::TTagID_TBL[@path] + tags.each{|tag| + if tag.kind_of? TkTextTag + TTagID_TBL[@path].delete(tag.id) + else + TTagID_TBL[@path].delete(tag) + end + } + end self end alias deltag tag_delete + alias delete_tag tag_delete def tag_bind(tag, seq, cmd=Proc.new, args=nil) _bind([@path, 'tag', 'bind', tag], seq, cmd, args) @@ -876,7 +916,7 @@ class TkTextTag<TkObject def destroy tk_call @t.path, 'tag', 'delete', @id - TTagID_TBL[@tpath].delete(@id) if CTagID_TBL[@tpath] + TTagID_TBL[@tpath].delete(@id) if TTagID_TBL[@tpath] self end end @@ -884,7 +924,18 @@ end class TkTextNamedTag<TkTextTag def self.new(parent, name, *args) if TTagID_TBL[parent.path] && TTagID_TBL[parent.path][name] - return TTagID_TBL[parent.path][name] + tagobj = TTagID_TBL[parent.path][name] + if args != [] then + keys = args.pop + if keys.kind_of? Hash then + tagobj.add(*args) if args != [] + tagobj.configure(keys) + else + args.push keys + tagobj.add(*args) + end + end + return tagobj else super(parent, name, *args) end @@ -894,11 +945,11 @@ class TkTextNamedTag<TkTextTag if not parent.kind_of?(TkText) fail format("%s need to be TkText", parent.inspect) end - @t = parent + @parent = @t = parent @tpath = parent.path @path = @id = name TTagID_TBL[@tpath] = {} unless TTagID_TBL[@tpath] - TTagID_TBL[@tpath][@id] = self + TTagID_TBL[@tpath][@id] = self unless TTagID_TBL[@tpath][@id] #if mode # tk_call @t.path, "addtag", @id, *args #end @@ -916,27 +967,39 @@ class TkTextNamedTag<TkTextTag end end -class TkTextTagSel<TkTextTag - def initialize(parent, keys=nil) - if not parent.kind_of?(TkText) - fail format("%s need to be TkText", parent.inspect) - end - @t = parent - @path = @id = 'sel' - #tk_call @t.path, "tag", "configure", @id, *hash_kv(keys) - configure(keys) if keys - @t._addtag id, self +class TkTextTagSel<TkTextNamedTag + def self.new(parent, *args) + super(parent, 'sel', *args) end end class TkTextMark<TkObject + TMarkID_TBL = {} Tk_TextMark_ID = ['mark0000'] + + TkComm.__add_target_for_init__(self) + + def self.__init_tables__ + TMarkID_TBL.clear + Tk_TextMark_ID[0] = 'mark0000' + end + + def TkTextMark.id2obj(text, id) + tpath = text.path + return id unless TMarkID_TBL[tpath] + TMarkID_TBL[tpath][id]? TMarkID_TBL[tpath][id]: id + end + def initialize(parent, index) if not parent.kind_of?(TkText) fail format("%s need to be TkText", parent.inspect) end - @t = parent + @parent = @t = parent + @tpath = parent.path @path = @id = Tk_TextMark_ID[0] + TMarkID_TBL[@id] = self + TMarkID_TBL[@tpath] = {} unless TMarkID_TBL[@tpath] + TMarkID_TBL[@tpath][@id] = self Tk_TextMark_ID[0] = Tk_TextMark_ID[0].succ tk_call @t.path, 'mark', 'set', @id, index @t._addtag id, self @@ -990,39 +1053,45 @@ class TkTextMark<TkObject end end -class TkTextMarkInsert<TkTextMark - def initialize(parent, index=nil) +class TkTextNamedMark<TkTextMark + def self.new(parent, name, *args) + if TMarkID_TBL[parent.path] && TMarkID_TBL[parent.path][name] + return TMarkID_TBL[parent.path][name] + else + super(parent, name, *args) + end + end + + def initialize(parent, name, index=nil) if not parent.kind_of?(TkText) fail format("%s need to be TkText", parent.inspect) end - @t = parent - @path = @id = 'insert' + @parent = @t = parent + @tpath = parent.path + @path = @id = name + TMarkID_TBL[@id] = self + TMarkID_TBL[@tpath] = {} unless TMarkID_TBL[@tpath] + TMarkID_TBL[@tpath][@id] = self unless TMarkID_TBL[@tpath][@id] tk_call @t.path, 'mark', 'set', @id, index if index @t._addtag id, self end end +class TkTextMarkInsert<TkTextNamedMark + def self.new(parent,*args) + super(parent, 'insert', *args) + end +end + class TkTextMarkCurrent<TkTextMark - def initialize(parent,index=nil) - if not parent.kind_of?(TkText) - fail format("%s need to be TkText", parent.inspect) - end - @t = parent - @path = @id = 'current' - tk_call @t.path, 'mark', 'set', @id, index if index - @t._addtag id, self + def self.new(parent,*args) + super(parent, 'current', *args) end end class TkTextMarkAnchor<TkTextMark - def initialize(parent,index=nil) - if not parent.kind_of?(TkText) - fail format("%s need to be TkText", parent.inspect) - end - @t = parent - @path = @id = 'anchor' - tk_call @t.path, 'mark', 'set', @id, index if index - @t._addtag id, self + def self.new(parent,*args) + super(parent, 'anchor', *args) end end |