summaryrefslogtreecommitdiff
path: root/ext/tk/lib/tk/virtevent.rb
blob: bb95ed2421e616b769a297af5c8c3fe2d45a09c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#
#   tk/virtevent.rb : treats virtual events
#                     1998/07/16 by Hidetoshi Nagai <nagai@ai.kyutech.ac.jp>
#
require 'tk'

class TkVirtualEvent<TkObject
  extend Tk

  TkCommandNames = ['event'.freeze].freeze

  TkVirtualEventID = ["<VirtEvent".freeze, "00000".taint, ">".freeze].freeze
  TkVirtualEventTBL = TkCore::INTERP.create_table

  TkCore::INTERP.init_ip_env{ TkVirtualEventTBL.clear }

  class PreDefVirtEvent<self
    def initialize(event)
      @path = @id = event
      TkVirtualEvent::TkVirtualEventTBL[@id] = self
    end
  end

  def TkVirtualEvent.getobj(event)
    obj = TkVirtualEventTBL[event]
    if obj
      obj
    else
      if tk_call_without_enc('event', 'info').index("<#{event}>")
	PreDefVirtEvent.new(event)
      else
	fail ArgumentError, "undefined virtual event '<#{event}>'"
      end
    end
  end

  def TkVirtualEvent.info
    tk_call_without_enc('event', 'info').split(/\s+/).collect!{|seq|
      TkVirtualEvent.getobj(seq[1..-2])
    }
  end

  def initialize(*sequences)
    @path = @id = TkVirtualEventID.join('')
    TkVirtualEventID[1].succ!
    add(*sequences)
  end

  def add(*sequences)
    if sequences != []
      tk_call_without_enc('event', 'add', "<#{@id}>", 
			  *(sequences.collect{|seq| 
			      "<#{tk_event_sequence(seq)}>"
			    }) )
      TkVirtualEventTBL[@id] = self
    end
    self
  end

  def delete(*sequences)
    if sequences == []
      tk_call_without_enc('event', 'delete', "<#{@id}>")
      TkVirtualEventTBL.delete(@id)
    else
      tk_call_without_enc('event', 'delete', "<#{@id}>", 
			  *(sequences.collect{|seq| 
			      "<#{tk_event_sequence(seq)}>"
			    }) )
      TkVirtualEventTBL.delete(@id) if info == []
    end
    self
  end

  def info
    tk_call_without_enc('event','info',"<#{@id}>").split(/\s+/).collect!{|seq|
      l = seq.scan(/<*[^<>]+>*/).collect!{|subseq|
	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