keyComposer._longPressTimeout = setTimeout(function() { var longPressEvent; keyComposer._longPressTimeout = null; longPressEvent = document.createEvent("CustomEvent"); longPressEvent.initCustomEvent(LONGKEYPRESS_EVENT_TYPE, true, true, null); longPressEvent.activeElement = event.target; longPressEvent.identifier = keyComposer.identifier; longPressEvent = MutableEvent.fromEvent(longPressEvent); defaultEventManager.activeTarget.dispatchEvent(longPressEvent); delete thisRef._longPressKeys[keyComposer.uuid]; }, this._longPressThreshold);
value: function(matches, event) { var thisRef = this, stopped = false, keyUp = event.type == "keyup", keyDown = event.type == "keydown", eventType = keyUp ? KEYRELEASE_EVENT_TYPE : KEYPRESS_EVENT_TYPE, nbrMatches = matches.length, keyComposer, keyComposerEvent, triggeredKeys, i; // matches could be either an array of matches or an array of keyComposers for (i = 0; i < nbrMatches && !stopped; i ++) { keyComposer = matches[i].object || matches[i]; // Make sure keyboard event's target is a descendant of the keyComposer's element var target = event.target, element = keyComposer.element, onTarget = (keyComposer.element === window); while (!onTarget) { onTarget = (target === element); if (target == document) { break; } else { target = target.parentElement; if (!target) { target = document; } } } if (!onTarget) { continue; } if (keyUp) { triggeredKeys = Object.keys(this._triggeredKeys); if (triggeredKeys.indexOf(keyComposer.uuid) == -1) { // Do not generate a keyup event if the composerKey has not been triggered on keydown or keypress continue; } if (keyComposer._longPressTimeout) { clearTimeout(keyComposer._longPressTimeout); keyComposer._longPressTimeout = null; delete this._longPressKeys[keyComposer.uuid]; } } else { if (keyDown) { // Reset trigger delete this._triggeredKeys[keyComposer.uuid]; event.preventDefault(); } else if (this._triggeredKeys[keyComposer.uuid]) { // that key has already been triggered, let's ignore it... continue; } if (keyComposer._shouldDispatchLongPress && !keyComposer._longPressTimeout) { keyComposer._longPressTimeout = setTimeout(function() { var longPressEvent; keyComposer._longPressTimeout = null; longPressEvent = document.createEvent("CustomEvent"); longPressEvent.initCustomEvent(LONGKEYPRESS_EVENT_TYPE, true, true, null); longPressEvent.activeElement = event.target; longPressEvent.identifier = keyComposer.identifier; longPressEvent = MutableEvent.fromEvent(longPressEvent); defaultEventManager.activeTarget.dispatchEvent(longPressEvent); delete thisRef._longPressKeys[keyComposer.uuid]; }, this._longPressThreshold); // Let's remember any longKeyPress key waiting for timeout this._longPressKeys[keyComposer.uuid] = keyComposer; } } keyComposerEvent = document.createEvent("CustomEvent"); keyComposerEvent.initCustomEvent(eventType, true, true, null); keyComposerEvent.activeElement = event.target; keyComposerEvent.identifier = keyComposer.identifier; keyComposerEvent.keyComposer = keyComposer; keyComposerEvent = MutableEvent.fromEvent(keyComposerEvent); if (this._opera) { keyComposerEvent.type = eventType; // Opera modifes the capitalization of custom event's type when that one is similar to a native event's type } defaultEventManager.activeTarget.dispatchEvent(keyComposerEvent); // console.log("keyComposer Event DISPATCHED:", keyComposerEvent, event.target, keyComposer); if (keyComposerEvent.defaultPrevented) { event.preventDefault(); } if (keyComposerEvent.propagationStopped) { event.stopPropagation(); stopped = true; } if (keyUp) { // We already dispatched a keyup event for this key, let's remove it delete this._triggeredKeys[keyComposer.uuid]; } else { // We need to remember any composerKey triggered during the keydown phase in order to generate an equivalent keyup this._triggeredKeys[keyComposer.uuid] = keyComposer; } } // if the composer key even has been stopped, we need clean the list of triggered keys as we wont get a keyup event anymore. // We need also stop pending longPress key if (stopped) { for (i = (keyUp ? i : 0); i < nbrMatches; i ++) { keyComposer = matches[i].object || matches[i]; delete this._triggeredKeys[keyComposer.uuid]; if (keyComposer._longPressTimeout) { clearTimeout(keyComposer._longPressTimeout); keyComposer._longPressTimeout = null; delete this._longPressKeys[keyComposer.uuid]; } } } return stopped; }