1999-08-13 01:37:52 -04:00
|
|
|
#
|
|
|
|
# tkvirtevent.rb : treats virtual events
|
|
|
|
# 1998/07/16 by Hidetoshi Nagai <nagai@ai.kyutech.ac.jp>
|
|
|
|
#
|
|
|
|
require 'tk'
|
|
|
|
|
|
|
|
class TkVirtualEvent<TkObject
|
|
|
|
extend Tk
|
|
|
|
|
2003-07-23 12:07:35 -04:00
|
|
|
TkCommandNames = ['event'.freeze].freeze
|
2001-05-06 11:06:00 -04:00
|
|
|
|
2003-08-02 01:04:30 -04:00
|
|
|
TkVirtualEventID = ["<VirtEvent".freeze, "00000", ">".freeze].freeze
|
2003-07-23 12:07:35 -04:00
|
|
|
TkVirtualEventTBL = TkCore::INTERP.create_table
|
2003-06-18 15:46:20 -04:00
|
|
|
|
2003-07-23 12:07:35 -04:00
|
|
|
TkCore::INTERP.init_ip_env{ TkVirtualEventTBL.clear }
|
2003-06-18 15:46:20 -04:00
|
|
|
|
2001-05-06 11:06:00 -04:00
|
|
|
class PreDefVirtEvent<self
|
|
|
|
def initialize(event)
|
|
|
|
@path = @id = event
|
|
|
|
TkVirtualEvent::TkVirtualEventTBL[@id] = self
|
|
|
|
end
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
|
|
|
|
def TkVirtualEvent.getobj(event)
|
2001-05-06 11:06:00 -04:00
|
|
|
obj = TkVirtualEventTBL[event]
|
|
|
|
if obj
|
|
|
|
obj
|
|
|
|
else
|
|
|
|
if tk_call('event', 'info').index("<#{event}>")
|
|
|
|
PreDefVirtEvent.new(event)
|
|
|
|
else
|
|
|
|
fail ArgumentError, "undefined virtual event '<#{event}>'"
|
|
|
|
end
|
|
|
|
end
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def TkVirtualEvent.info
|
2000-05-24 00:34:26 -04:00
|
|
|
tk_call('event', 'info').split(/\s+/).collect!{|seq|
|
1999-08-13 01:37:52 -04:00
|
|
|
TkVirtualEvent.getobj(seq[1..-2])
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def initialize(*sequences)
|
2003-07-23 12:07:35 -04:00
|
|
|
@path = @id = TkVirtualEventID.join
|
|
|
|
TkVirtualEventID[1].succ!
|
1999-08-13 01:37:52 -04:00
|
|
|
add(*sequences)
|
|
|
|
end
|
|
|
|
|
|
|
|
def add(*sequences)
|
|
|
|
if sequences != []
|
|
|
|
tk_call('event', 'add', "<#{@id}>",
|
|
|
|
*(sequences.collect{|seq| "<#{tk_event_sequence(seq)}>"}) )
|
2001-05-06 11:06:00 -04:00
|
|
|
TkVirtualEventTBL[@id] = self
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
def delete(*sequences)
|
|
|
|
if sequences == []
|
|
|
|
tk_call('event', 'delete', "<#{@id}>")
|
2002-10-02 02:02:17 -04:00
|
|
|
TkVirtualEventTBL.delete(@id)
|
1999-08-13 01:37:52 -04:00
|
|
|
else
|
|
|
|
tk_call('event', 'delete', "<#{@id}>",
|
|
|
|
*(sequences.collect{|seq| "<#{tk_event_sequence(seq)}>"}) )
|
2002-10-02 02:02:17 -04:00
|
|
|
TkVirtualEventTBL.delete(@id) if info == []
|
1999-08-13 01:37:52 -04:00
|
|
|
end
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
|
|
|
def info
|
2000-05-24 00:34:26 -04:00
|
|
|
tk_call('event', 'info', "<#{@id}>").split(/\s+/).collect!{|seq|
|
|
|
|
l = seq.scan(/<*[^<>]+>*/).collect!{|subseq|
|
1999-08-13 01:37:52 -04:00
|
|
|
case (subseq)
|
|
|
|
when /^<<[^<>]+>>$/
|
|
|
|
TkVirtualEvent.getobj(subseq[1..-2])
|
|
|
|
when /^<[^<>]+>$/
|
|
|
|
subseq[1..-2]
|
|
|
|
else
|
|
|
|
subseq.split('')
|
|
|
|
end
|
|
|
|
}.flatten
|
|
|
|
(l.size == 1) ? l[0] : l
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|