class Hyalite::EventDispatcher

Public Class Methods

new(&extract_events) click to toggle source
# File lib/hyalite/event_dispatcher.rb, line 3
def initialize(&extract_events)
  @enabled = true
  @listener_bank = {}
  @extract_events = extract_events
  @event_queue = []
end

Public Instance Methods

delete_all_listeners(id) { |id, registration_name| ... } click to toggle source
# File lib/hyalite/event_dispatcher.rb, line 81
def delete_all_listeners(id, &block)
  @listener_bank.each do |registration_name, bank|
    next unless bank[id]
    yield(id, registration_name) if block_given?
    bank.delete(id)
  end
end
delete_listener(id, registration_name) { |id, registration_name| ... } click to toggle source
# File lib/hyalite/event_dispatcher.rb, line 74
def delete_listener(id, registration_name)
  if @listener_bank.has_key? registration_name
    yield(id, registration_name)
    @listener_bank[registration_name].delete(id)
  end
end
dispatch_event(top_level_type, event) click to toggle source
# File lib/hyalite/event_dispatcher.rb, line 58
def dispatch_event(top_level_type, event)
  return unless @enabled

  book_keeping = TopLevelCallbackBookKeeping.new(top_level_type, event)
  Hyalite.updates.batched_updates { handle_top_level(book_keeping) }
end
enabled=(enabled) click to toggle source
# File lib/hyalite/event_dispatcher.rb, line 14
def enabled=(enabled)
  @enabled = enabled
end
enabled?() click to toggle source
# File lib/hyalite/event_dispatcher.rb, line 10
def enabled?
  @enabled
end
find_parent(node) click to toggle source
# File lib/hyalite/event_dispatcher.rb, line 26
def find_parent(node)
  node_id = Mount.node_id(node)
  root_id = InstanceHandles.root_id_from_node_id(node_id)
  container = Mount.container_for_id(root_id)
  Mount.find_first_hyalite_dom(container)
end
get_listener(id, registration_name) click to toggle source
# File lib/hyalite/event_dispatcher.rb, line 70
def get_listener(id, registration_name)
  @listener_bank[registration_name].try {|listeners| listeners[id] }
end
handle_top_level(book_keeping) click to toggle source
# File lib/hyalite/event_dispatcher.rb, line 33
def handle_top_level(book_keeping)
  ancestor = Mount.find_first_hyalite_dom(book_keeping.event.target)
  while ancestor
    book_keeping.ancestors << ancestor
    ancestor = find_parent(ancestor)
  end

  book_keeping.ancestors.each do |top_level_target|
    top_level_target_id = Mount.node_id(top_level_target) || ''
    synthetic_events = @extract_events.call(
      book_keeping.top_level_type,
      top_level_target,
      top_level_target_id,
      book_keeping.event,
    ).flatten

    synthetic_events.each do |synthetic_event|
      synthetic_event.each_listener do |listener, dom_id|
        target = Mount.node(dom_id);
        listener.call(synthetic_event.event, target)
      end
    end
  end
end
put_listener(id, registration_name, listener) click to toggle source
# File lib/hyalite/event_dispatcher.rb, line 65
def put_listener(id, registration_name, listener)
  listeners = @listener_bank[registration_name] ||= {}
  listeners[id] = listener
end
trap_bubbled_event(top_level_type, handler_base_name, element) click to toggle source
# File lib/hyalite/event_dispatcher.rb, line 18
def trap_bubbled_event(top_level_type, handler_base_name, element)
  return nil unless element

  element.on handler_base_name do |event|
    dispatch_event(top_level_type, event)
  end
end