diff options
Diffstat (limited to 'lib/handler_stack.coffee')
| -rw-r--r-- | lib/handler_stack.coffee | 37 | 
1 files changed, 37 insertions, 0 deletions
| diff --git a/lib/handler_stack.coffee b/lib/handler_stack.coffee new file mode 100644 index 00000000..858f2ec9 --- /dev/null +++ b/lib/handler_stack.coffee @@ -0,0 +1,37 @@ +root = exports ? window + +class root.HandlerStack + +  constructor: -> +    @stack = [] +    @counter = 0 + +  genId: -> @counter = ++@counter & 0xffff + +  # Adds a handler to the stack. Returns a unique ID for that handler that can be used to remove it later. +  push: (handler) -> +    handler.id = @genId() +    @stack.push handler +    handler.id + +  # Called whenever we receive a key event. Each individual handler has the option to stop the event's +  # propagation by returning a falsy value. +  bubbleEvent: (type, event) -> +    for i in [(@stack.length - 1)..0] by -1 +      handler = @stack[i] +      # We need to check for existence of handler because the last function call may have caused the release +      # of more than one handler. +      if handler && handler[type] +        @currentId = handler.id +        passThrough = handler[type].call(@, event) +        if not passThrough +          DomUtils.suppressEvent(event) +          return false +    true + +  remove: (id = @currentId) -> +    for i in [(@stack.length - 1)..0] by -1 +      handler = @stack[i] +      if handler.id == id +        @stack.splice(i, 1) +        break | 
