diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/dom_utils.coffee | 4 | ||||
| -rw-r--r-- | lib/handler_stack.coffee | 37 | 
2 files changed, 41 insertions, 0 deletions
| diff --git a/lib/dom_utils.coffee b/lib/dom_utils.coffee index 30530e0d..501e43a5 100644 --- a/lib/dom_utils.coffee +++ b/lib/dom_utils.coffee @@ -131,5 +131,9 @@ DomUtils =      document.documentElement.appendChild(flashEl)      setTimeout((-> DomUtils.removeElement flashEl), 400) +  suppressEvent: (event) -> +    event.preventDefault() +    event.stopPropagation() +  root = exports ? window  root.DomUtils = DomUtils 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 | 
