coffeescript-ui
Version:
Coffeescript User Interface System
301 lines (229 loc) • 6.4 kB
text/coffeescript
###
* coffeescript-ui - Coffeescript User Interface System (CUI)
* Copyright (c) 2013 - 2016 Programmfabrik GmbH
* MIT Licence
* https://github.com/programmfabrik/coffeescript-ui, http://www.coffeescript-ui.org
###
class CUI.Event extends CUI.Element
constructor: (opts) ->
super(opts)
if
console.debug "require node in dom", ,
CUI.util.assert(, "new Event", "node is not in DOM, unable to create event.", opts: )
= false
= false
= false
= false
initOpts: ->
super()
type:
mandatory: true
check: (v) ->
CUI.util.isString(v) and not CUI.util.isEmpty(v) and v.split(/\s+/).length == 1
# node to start from
node:
default: document.documentElement
mandatory: true
check: (v) ->
CUI.dom.isNode(v)
require_node_in_dom:
default: false
mandatory: true
check: Boolean
bubble:
default: false
check: Boolean
sink:
default: false
check: Boolean
# trigger skips the start node
exclude_self:
default: false
check: Boolean
# info to pass alongside the event
info:
default: {}
check: "PlainObject"
prevent_default:
default: false
check: Boolean
readOpts: ->
super()
= CUI.dom.getNode()
# if
# CUI.util.assert( != false, "new EventsEvent", "opts.exclude_self can only be set if bubble is set to true.", opts: )
if
= null
= null
# CUI.util.assert(not or , "DOMEvent needs opts.bubble set.", opts: )
__setListener: (listener) ->
if not
= listener.getElementClass()
else
CUI.util.assert( == listener.getElementClass(), "Event.setListener", "listener class cannot change during an events life cycle.", listener: listener, listenerClass: )
@
__setPhase: () ->
isExcludeSelf: ->
getPhase: ->
getType: ->
getDebug: ->
+"["++"]"
getInfo: ->
getNode: ->
getElement: ->
CUI.dom.data(, "element")
isBubble: ->
isSink: ->
isInDOM: ->
if != null
# cached result
else if == document or == window
= true
else
= CUI.dom.isInDOM()
setNativeEvent: (NativeEvent) ->
# avoid checking instanceof, so external initializers like TestCafé work
CUI.util.assert(typeof(NativeEvent) == 'object', "CUI.Event.setNativeEvent", "Event needs to be instanceof Event", Event: NativeEvent)
= NativeEvent
@
getNativeEvent: ->
getPointTarget: ->
document.elementFromPoint(, )
getTarget: ->
or ?.target
setTarget: (tg) ->
= tg
getCurrentTarget: ->
or
setCurrentTarget: (ct) ->
= ct
getModifiers: ->
mods = []
for k, v of {
meta: "Meta"
ctrl: "Control"
alt: "Alt"
shift: "Shift"
}
if @[k+"Key"]()
mods.push(v)
mods
hasModifierKey: (includeShift=false) ->
or
or
or
(includeShift and )
getButton: ->
?.button
keyCode: ->
?.which
metaKey: ->
?.metaKey
ctrlKey: ->
?.ctrlKey
altKey: ->
?.altKey
shiftKey: ->
?.shiftKey
clientX: ->
?.clientX
clientY: ->
?.clientY
pageX: ->
?.pageX
pageY: ->
?.pageY
stopImmediatePropagation: ->
= true
?.stopImmediatePropagation()
@
stopPropagation: ->
= true
?.stopPropagation()
@
preventDefault: ->
= true
?.preventDefault()
@
isImmediatePropagationStopped: ->
isPropagationStopped: ->
isDefaultPrevented: ->
dispatch: ->
# console.info "CUI.Events.trigger jQuery DOMEvent", event.getType()
CUI.util.assert(not , "CUI.Event.dispatch", "Can only dispatch once.", event: @)
ev = document.createEvent("Event")
ev.initEvent(, , true)
ev.__cui_event = @
if # or
# when sinking, we touch the node while sinking, so
# its ok to start with the parent to not trigger
# it twice
node = CUI.dom.parent()
else
# even is event.isBubble() === false
# we trigger here using the bubble mechanism,
# handleEvent takes care of the bubble check
node =
if
ev.preventDefault()
# if the dom event is not set yet on this
# we set it now
# console.error "dispatch event on node:", , node, , ev
node.dispatchEvent(ev)
ev
dump: ->
txt = +": **"++"**"
mods =
if mods.length > 0
txt += " Modifiers: **"+mods.join("+")+"**"
txt
stop: ->
false
: (event, func) ->
if CUI.util.isPlainObject(event)
ev_info = CUI.Events.getEventType(event.type)
if ev_info.eventClass
eventClass = ev_info.eventClass
else
eventClass = CUI.Event
CUI.util.mergeMap(event, ev_info)
delete(event.eventClass)
delete(event.listenerClass)
ev = new eventClass(event)
else
ev = event
CUI.util.assert(ev instanceof CUI.Event, "#{func}", "event needs to be PlainObject or instance of CUI.Event.")
ev
# cr
: (event, eventClass) ->
ev_info = CUI.Events.getEventType(event.type)
if not eventClass
if ev_info.eventClass
eventClass = ev_info.eventClass
else
eventClass = CUI.Event
ev = new eventClass
type: event.type
bubble: event.bubbles
node: event.target
# console.debug "Event.createFromDOMEvent", event.type, eventClass.name, ev.getUniqueId()
ev.setNativeEvent(event)
ev