/*!
* UI development toolkit for HTML5 (OpenUI5)
* (c) Copyright 2009-2018 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
// Provides functionality related to eventing.
sap.ui.define([
'jquery.sap.global',
'sap/ui/events/ControlEvents',
'sap/ui/events/PseudoEvents',
'sap/ui/events/checkMouseEnterOrLeave',
'sap/ui/events/isSpecialKey',
'sap/ui/events/isMouseEventDelayed',
'sap/ui/events/F6Navigation',
'sap/ui/events/jquery/EventExtension',
'sap/ui/events/jquery/EventSimulation',
'sap/ui/events/KeyCodes',
'sap/base/util/defineCoupledProperty'
], function(jQuery, ControlEvents, PseudoEvents, fnCheckMouseEnterOrLeave, fnIsSpecialKey, fnIsMouseEventDelayed, F6Navigation, EventExtension, EventSimulation, KeyCodes, defineCoupledProperty) {
"use strict";
/**
* Enumeration of all so called "pseudo events", a useful classification
* of standard browser events as implied by SAP product standards.
*
* Whenever a browser event is recognized as one or more pseudo events, then this
* classification is attached to the original {@link jQuery.Event} object and thereby
* delivered to any jQuery-style listeners registered for that browser event.
*
* Pure JavaScript listeners can evaluate the classification information using
* the {@link jQuery.Event#isPseudoType} method.
*
* Instead of using the procedure as described above, the SAPUI5 controls and elements
* should simply implement an onpseudo-event(oEvent)
method. It will
* be invoked only when that specific pseudo event has been recognized. This simplifies event
* dispatching even further.
*
* @namespace
* @public
* @deprecated since 1.58 use {@link module:sap/ui/events/PseudoEvents.events} instead
*/
jQuery.sap.PseudoEvents = PseudoEvents.events;
/**
* Pseudo event for keyboard arrow down without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapdown
*/
/**
* Pseudo event for keyboard arrow down with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapdownmodifiers
*/
/**
* Pseudo event for pseudo 'show' event (F4, Alt + down-Arrow)
* @public
* @name jQuery.sap.PseudoEvents.sapshow
*/
/**
* Pseudo event for keyboard arrow up without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapup
*/
/**
* Pseudo event for keyboard arrow up with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapupmodifiers
*/
/**
* Pseudo event for pseudo 'hide' event (Alt + up-Arrow)
* @public
* @name jQuery.sap.PseudoEvents.saphide
*/
/**
* Pseudo event for keyboard arrow left without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapleft
*/
/**
* Pseudo event for keyboard arrow left with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapleftmodifiers
*/
/**
* Pseudo event for keyboard arrow right without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapright
*/
/**
* Pseudo event for keyboard arrow right with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.saprightmodifiers
*/
/**
* Pseudo event for keyboard Home/Pos1 with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.saphome
*/
/**
* Pseudo event for keyboard Home/Pos1 without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.saphomemodifiers
*/
/**
* Pseudo event for pseudo top event
* @public
* @name jQuery.sap.PseudoEvents.saptop
*/
/**
* Pseudo event for keyboard End without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapend
*/
/**
* Pseudo event for keyboard End with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapendmodifiers
*/
/**
* Pseudo event for pseudo bottom event
* @public
* @name jQuery.sap.PseudoEvents.sapbottom
*/
/**
* Pseudo event for keyboard page up without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sappageup
*/
/**
* Pseudo event for keyboard page up with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sappageupmodifiers
*/
/**
* Pseudo event for keyboard page down without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sappagedown
*/
/**
* Pseudo event for keyboard page down with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sappagedownmodifiers
*/
/**
* Pseudo event for pseudo 'select' event... space, enter, ... without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapselect
*/
/**
* Pseudo event for pseudo 'select' event... space, enter, ... with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapselectmodifiers
*/
/**
* Pseudo event for keyboard space without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapspace
*/
/**
* Pseudo event for keyboard space with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapspacemodifiers
*/
/**
* Pseudo event for keyboard enter without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapenter
*/
/**
* Pseudo event for keyboard enter with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapentermodifiers
*/
/**
* Pseudo event for keyboard backspace without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapbackspace
*/
/**
* Pseudo event for keyboard backspace with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapbackspacemodifiers
*/
/**
* Pseudo event for keyboard delete without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapdelete
*/
/**
* Pseudo event for keyboard delete with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapdeletemodifiers
*/
/**
* Pseudo event for pseudo expand event (keyboard numpad +) without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapexpand
*/
/**
* Pseudo event for pseudo expand event (keyboard numpad +) with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapexpandmodifiers
*/
/**
* Pseudo event for pseudo collapse event (keyboard numpad -) without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapcollapse
*/
/**
* Pseudo event for pseudo collapse event (keyboard numpad -) with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapcollapsemodifiers
*/
/**
* Pseudo event for pseudo collapse event (keyboard numpad *)
* @public
* @name jQuery.sap.PseudoEvents.sapcollapseall
*/
/**
* Pseudo event for keyboard escape
* @public
* @name jQuery.sap.PseudoEvents.sapescape
*/
/**
* Pseudo event for keyboard tab (TAB + no modifier)
* @public
* @name jQuery.sap.PseudoEvents.saptabnext
*/
/**
* Pseudo event for keyboard tab (TAB + shift modifier)
* @public
* @name jQuery.sap.PseudoEvents.saptabprevious
*/
/**
* Pseudo event for pseudo skip forward (F6 + no modifier)
* @public
* @name jQuery.sap.PseudoEvents.sapskipforward
*/
/**
* Pseudo event for pseudo skip back (F6 + shift modifier)
* @public
* @name jQuery.sap.PseudoEvents.sapskipback
*/
/**
* Pseudo event for pseudo 'decrease' event without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapdecrease
*/
/**
* Pseudo event for pressing the '-' (minus) sign.
* @since 1.25.0
* @public
* @name jQuery.sap.PseudoEvents.sapminus
*/
/**
* Pseudo event for pseudo 'decrease' event with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapdecreasemodifiers
*/
/**
* Pseudo event for pseudo 'increase' event without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapincrease
*/
/**
* Pseudo event for pressing the '+' (plus) sign.
* @since 1.25.0
* @public
* @name jQuery.sap.PseudoEvents.sapplus
*/
/**
* Pseudo event for pseudo 'increase' event with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapincreasemodifiers
*/
/**
* Pseudo event for pseudo 'previous' event without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapprevious
*/
/**
* Pseudo event for pseudo 'previous' event with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sappreviousmodifiers
*/
/**
* Pseudo event for pseudo 'next' event without modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapnext
*/
/**
* Pseudo event for pseudo 'next' event with modifiers (Ctrl, Alt or Shift)
* @public
* @name jQuery.sap.PseudoEvents.sapnextmodifiers
*/
/**
* Pseudo event indicating delayed double click (e.g. for inline edit)
* @public
* @name jQuery.sap.PseudoEvents.sapdelayeddoubleclick
*/
/**
* List of DOM events that a UIArea automatically takes care of.
*
* A control/element doesn't have to bind listeners for these events.
* It instead can implement an onevent(oEvent)
method
* for any of the following events that it wants to be notified about:
*
* click, dblclick, contextmenu, focusin, focusout, keydown, keypress, keyup, mousedown, mouseout, mouseover,
* mouseup, select, selectstart, dragstart, dragenter, dragover, dragleave, dragend, drop, paste, cut, input,
* touchstart, touchend, touchmove, touchcancel, tap, swipe, swipeleft, swiperight, scrollstart, scrollstop
*
* The mouse events and touch events are supported simultaneously on both desktop and mobile browsers. Do NOT
* create both onmouse* and ontouch* functions to avoid one event being handled twice on the same control.
* @namespace
* @public
* @deprecated since 1.58 use {@link module:sap/ui/events/ControlEvents.events} instead
*/
jQuery.sap.ControlEvents = ControlEvents.events;
/**
* Disable touch to mouse handling
*
* @public
* @function
* @deprecated since 1.58 use {@link module:sap/ui/events/jquery/EventSimulation.disableTouchToMouseHandling} instead
*/
jQuery.sap.disableTouchToMouseHandling = EventSimulation.disableTouchToMouseHandling;
/**
* Defines touch event mode. Values used 'ON' and 'SIM'.
* @private
* @deprecated since 1.58 use {@link module:sap/ui/events/jquery/EventSimulation.touchEventMode} instead
*/
defineCoupledProperty(jQuery.sap, "touchEventMode", EventSimulation, "touchEventMode");
/**
* Binds all events for listening with the given callback function.
*
* @param {function} fnCallback Callback function
* @public
* @function
* @deprecated since 1.58 use {@link module:sap/ui/events/ControlEvents.bindAnyEvent} instead
*/
jQuery.sap.bindAnyEvent = ControlEvents.bindAnyEvent;
/**
* Unbinds all events for listening with the given callback function.
*
* @param {function} fnCallback Callback function
* @public
* @function
* @deprecated since 1.58 use {@link module:sap/ui/events/ControlEvents.unbindAnyEvent} instead
*/
jQuery.sap.unbindAnyEvent = ControlEvents.unbindAnyEvent;
/**
* Checks a given mouseover or mouseout event whether it is
* equivalent to a mouseenter or mousleave event regarding the given DOM reference.
*
* @param {jQuery.Event} oEvent
* @param {Element} oDomRef
* @public
* @function
* @deprecated since 1.58 use {@link module:sap/ui/events/checkMouseEnterOrLeave} instead
*/
jQuery.sap.checkMouseEnterOrLeave = fnCheckMouseEnterOrLeave;
/**
* Detect whether the pressed key is:
* SHIFT, CONTROL, ALT, BREAK, CAPS_LOCK,
* PAGE_UP, PAGE_DOWN, END, HOME, ARROW_LEFT, ARROW_UP, ARROW_RIGHT, ARROW_DOWN,
* PRINT, INSERT, DELETE, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12,
* BACKSPACE, TAB, ENTER, ESCAPE
*
* @param {jQuery.Event} oEvent The event object of the keydown
, keyup
or keypress
events.
* @static
* @returns {boolean}
* @protected
* @since 1.24.0
* @experimental Since 1.24.0 Implementation might change.
* @function
* @deprecated since 1.58 use {@link module:sap/ui/events/isSpecialKey} instead
*/
jQuery.sap.isSpecialKey = function(oEvent) {
if (oEvent.key) {
return fnIsSpecialKey(oEvent);
}
// legacy case where Event.key is not use, e.g. when jQuery.Events are created manually instead of using the Browser's KeyBoardEvent
/**
* Detect whether the pressed key is a modifier.
*
* Modifier keys are considered:
* SHIFT, CONTROL, ALT, CAPS_LOCK, NUM_LOCK
* These keys don't send characters, but modify the characters sent by other keys.
*
* @param {jQuery.Event} oEvent The event object of the keydown
, keyup
or keypress
events.
* @static
* @returns {boolean} True if a modifier key was pressed
*/
function isModifierKey(oEvent) {
var iKeyCode = oEvent.which; // jQuery oEvent.which normalizes oEvent.keyCode and oEvent.charCode
return (iKeyCode === KeyCodes.SHIFT) ||
(iKeyCode === KeyCodes.CONTROL) ||
(iKeyCode === KeyCodes.ALT) ||
(iKeyCode === KeyCodes.CAPS_LOCK) ||
(iKeyCode === KeyCodes.NUM_LOCK);
}
/**
* Detect whether the pressed key is a navigation key.
*
* Navigation keys are considered:
* ARROW_LEFT, ARROW_UP, ARROW_RIGHT, ARROW_DOWN
*
* @param {jQuery.Event} oEvent The event object of the keydown
, keyup
or keypress
events.
* @static
* @returns {boolean} True if a arrow key was pressed
*/
function isArrowKey(oEvent) {
var iKeyCode = oEvent.which, // jQuery oEvent.which normalizes oEvent.keyCode and oEvent.charCode
bArrowKey = (iKeyCode >= 37 && iKeyCode <= 40); // ARROW_LEFT, ARROW_UP, ARROW_RIGHT, ARROW_DOWN
switch (oEvent.type) {
case "keydown":
case "keyup":
return bArrowKey;
// note: the keypress event should be fired only when a character key is pressed,
// unfortunately some browsers fire the keypress event for other keys. e.g.:
//
// Firefox fire it for:
// ARROW_LEFT, ARROW_RIGHT
case "keypress":
// in Firefox, almost all noncharacter keys that fire the keypress event have a key code of 0
return iKeyCode === 0;
default:
return false;
}
}
var iKeyCode = oEvent.which, // jQuery oEvent.which normalizes oEvent.keyCode and oEvent.charCode
bSpecialKey = isModifierKey(oEvent) ||
isArrowKey(oEvent) ||
(iKeyCode >= 33 && iKeyCode <= 36) || // PAGE_UP, PAGE_DOWN, END, HOME
(iKeyCode >= 44 && iKeyCode <= 46) || // PRINT, INSERT, DELETE
(iKeyCode >= 112 && iKeyCode <= 123) || // F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12
(iKeyCode === KeyCodes.BREAK) ||
(iKeyCode === KeyCodes.BACKSPACE) ||
(iKeyCode === KeyCodes.TAB) ||
(iKeyCode === KeyCodes.ENTER) ||
(iKeyCode === KeyCodes.ESCAPE) ||
(iKeyCode === KeyCodes.SCROLL_LOCK);
switch (oEvent.type) {
case "keydown":
case "keyup":
return bSpecialKey;
// note: the keypress event should be fired only when a character key is pressed,
// unfortunately some browsers fire the keypress event for other keys. e.g.:
//
// Firefox fire it for:
// BREAK, ARROW_LEFT, ARROW_RIGHT, INSERT, DELETE,
// F1, F2, F3, F5, F6, F7, F8, F9, F10, F11, F12
// BACKSPACE, ESCAPE
//
// Internet Explorer fire it for:
// ESCAPE
case "keypress":
// note: in Firefox, almost all noncharacter keys that fire the keypress event have a key code of 0,
// with the exception of BACKSPACE (key code of 8).
// note: in IE the ESCAPE key is also fired for the keypress event
return (iKeyCode === 0 || // in Firefox, almost all noncharacter keys that fire the keypress event have a key code of 0, with the exception of BACKSPACE (key code of 8)
iKeyCode === KeyCodes.BACKSPACE ||
iKeyCode === KeyCodes.ESCAPE ||
iKeyCode === KeyCodes.ENTER /* all browsers */) || false;
default:
return false;
}
};
/**
* Central handler for F6 key event. Based on the current target and the given event the next element in the F6 chain is focused.
*
* This handler might be also called manually. In this case the central handler is deactivated for the given event.
*
* If the event is not a keydown event, it does not represent the F6 key, the default behavior is prevented,
* the handling is explicitly skipped (oSettings.skip
) or the target (oSettings.target
) is not contained
* in the used scopes (oSettings.scope
), the event is skipped.
*
* @param {jQuery.Event} oEvent a keydown
event object.
* @param {object} [oSettings] further options in case the handler is called manually.
* @param {boolean} [oSettings.skip=false] whether the event should be ignored by the central handler (see above)
* @param {Element} [oSettings.target=document.activeElement] the DOMNode which should be used as starting point to find the next DOMNode in the F6 chain.
* @param {Element[]} [oSettings.scope=[document]] the DOMNodes(s) which are used for the F6 chain search
* @static
* @private
* @since 1.25.0
* @function
* @deprecated since 1.58 use {@link module:sap/ui/events/F6Navigation.handleF6GroupNavigation} instead
*/
jQuery.sap.handleF6GroupNavigation = function (oEvent, oSettings) {
// map keyCode to key property of the event, e.g. if jQuery.Event was created manually
if (!oEvent.key && oEvent.keyCode === KeyCodes.F6) {
oEvent.key = "F6";
}
return F6Navigation.handleF6GroupNavigation(oEvent, oSettings);
};
/**
* CustomData attribute name for fast navigation groups (in DOM additional prefix "data-" is needed)
* @private
* @deprecated since 1.58 use {@link module:sap/ui/events/F6Navigation.fastNavigationKey} instead
*/
jQuery.sap._FASTNAVIGATIONKEY = F6Navigation.fastNavigationKey;
/**
* Whether the current browser fires mouse events after touch events with long delay (~300ms)
*
* Mobile browsers fire mouse events after touch events with a delay (~300ms)
* Some modern mobile browsers already removed the delay under some condition. Those browsers are:
* 1. iOS Safari in iOS 8 (except UIWebView / WKWebView).
* 2. Chrome on Android from version 32 (exclude the Samsung stock browser which also uses Chrome kernel)
*
* @param {Navigator} oNavigator the window navigator object.
* @private
* @name jQuery.sap.isMouseEventDelayed
* @since 1.30.0
* @deprecated since 1.58 use {@link module:sap/ui/events/isMouseEventDelayed} instead
*/
jQuery.sap._refreshMouseEventDelayedFlag = function(oNavigator) {
jQuery.sap.isMouseEventDelayed = fnIsMouseEventDelayed.apply(this, arguments);
};
jQuery.sap._refreshMouseEventDelayedFlag(navigator);
return jQuery;
});