UNPKG

nscomponentsreact

Version:

React Wrapper Components for NSComponents

297 lines (279 loc) 9.13 kB
var nsModuleExport = function(root,name,prototype) { if(typeof exports === 'object' && typeof module === 'object') { module.exports[name] = prototype; } else if (typeof define === "function" && define.amd) { define(name,[], function () {return prototype;}); } else if(typeof exports === 'object') { exports[name] = prototype; } else { root[name] = prototype; } };var nsIsWeb = function(root) { if(typeof exports === 'object' && typeof module === 'object') { return false; } else if (typeof define === "function" && define.amd) { return false; } else if(typeof exports === 'object') { return false; } else { return true; } };if(!nsIsWeb()) { var nsutilRef = require('./nsUtil.min.js'); var NSUtil = nsutilRef.NSUtil; } "use strict"; var NSTouchToMouse = (function() { function NSTouchToMouse(element,setting,doc,win) { this.util = new NSUtil(); this.doc = this.util.getDoc(doc); this.win = this.util.getWin(win); this.__element = this.util.getElement(element); this.__setting = setting; this.__config = null; this.__touchEventRef = null; this.__gestureChangeRef = null; this.__gestureEndRef = null; this.__objLocal = {documentClick: false,doubleTapWaiting: false,preTouchStart: false,gestureChanged: false}; this.__objEvents = null; this.__useConstructor = false; this.__initialize(); }; NSTouchToMouse.prototype.isTouchSupported = function() { var isTouchSupported = (("ontouchstart" in this.win) || (this.win.navigator.msMaxTouchPoints > 0)); return isTouchSupported; }; NSTouchToMouse.prototype.isGestureSupported = function() { var isGestureSupported = ("ongesturestart" in this.win); return isGestureSupported; }; NSTouchToMouse.prototype.destroy = function() { if(this.__touchEventRef) { this.util.removeEvent(this.__element,"touchstart",this.__touchEventRef); this.util.removeEvent(this.__element,"touchmove",this.__touchEventRef,true); this.util.removeEvent(this.__element,"touchend",this.__touchEventRef,true); this.util.removeEvent(this.__element,"touchcancel",this.__touchEventRef,true); this.__touchEventRef = null; } if(this.__gestureChangeRef) { this.util.removeEvent(this.__element,"gesturechange",this.__gestureChangeRef); this.__gestureChangeRef = null; } if(this.__gestureEndRef) { this.util.removeEvent(this.__element,"gestureend",this.__gestureEndRef); this.__gestureEndRef = null; } this.__objLocal = {documentClick: false,doubleTapWaiting: false,preTouchStart: false,gestureChanged: false}; }; NSTouchToMouse.prototype.__initialize = function() { if(!this.__element) { this.util.throwNSError("NSTouchToMouse","Element is not valid"); } var setting = this.__setting || {}; this.__config = { doubleTapInterval: this.util.isUndefinedOrNull(setting["doubleTapInterval"]) ? 500 : parseInt(setting["doubleTapInterval"]), suppressMouseEvent: Boolean.parse(setting["suppressMouseEvent"]), touchStartHandler: setting["touchStartHandler"],//format function(screenXPos,screenYPos,event) touchMoveHandler: setting["touchMoveHandler"],//format function(screenXPos,screenYPos,event) touchEndHandler: setting["touchEndHandler"],//format function(screenXPos,screenYPos,event) doubleTapHandler: setting["doubleTapHandler"],//format function(screenXPos,screenYPos,event) pinchHandler: setting["pinchHandler"],//format function(scale,event) }; this.__initObjEvents(); this.__addListeners(); this.__useConstructor = this.__isMouseEventConstructorExists(); }; NSTouchToMouse.prototype.__initObjEvents = function() { this.__objEvents = { "touchstart":{mouseEventType: "mousedown",callback:this.__touchStartHandler.bind(this)}, "touchmove":{mouseEventType: "mousemove",callback:this.__touchMoveHandler.bind(this)}, "touchend":{mouseEventType: "mouseup",callback:this.__touchEndHandler.bind(this),fireExtraEvent:this.__fireClickEvent.bind(this)}, }; }; NSTouchToMouse.prototype.__addListeners = function() { var isTouchSupported = this.isTouchSupported(); var isGestureSupported = this.isGestureSupported(); if (isTouchSupported) { if(!this.__touchEventRef) { this.__touchEventRef = this.__touchEventHandler.bind(this); this.util.addEvent(this.__element,"touchstart",this.__touchEventRef); this.util.addEvent(this.__element,"touchmove",this.__touchEventRef,true); this.util.addEvent(this.__element,"touchend",this.__touchEventRef,true); this.util.addEvent(this.__element,"touchcancel",this.__touchEventRef,true); } } else { this.util.debug("NSTouchToMouse","Touch is not supported"); } if(isGestureSupported) { if(!this.__gestureChangeRef) { this.__gestureChangeRef = this.__gestureChangeHandler.bind(this); this.util.addEvent(this.__element,"gesturechange",this.__gestureChangeRef); } if(!this.__gestureEndRef) { this.__gestureEndRef = this.__gestureEndHandler.bind(this); this.util.addEvent(this.__element,"gestureend",this.__gestureEndRef); } } else { this.util.debug("NSTouchToMouse","Gesture is not supported"); } }; NSTouchToMouse.prototype.__touchEventHandler = function(event) { if(!this.__objLocal.gestureChanged) { event = this.util.getEvent(event); var touch = event.touchEvent; var item = this.__objEvents[event.type]; if(item) { var mouseEventType = item.mouseEventType; item.callback(event,touch); this.__fireMouseEvent(mouseEventType,event,touch); if(item.fireExtraEvent) { item.fireExtraEvent(event,touch); } event.preventDefault(); } else { this.util.debug("NSTouchToMouse",event.type + " is not supported"); } } }; NSTouchToMouse.prototype.__gestureChangeHandler = function(event) { event = this.util.getEvent(event); this.__objLocal.gestureChanged = true; if(this.__config.pinchHandler) { this.__config.pinchHandler(event.scale,event); } this.__objLocal.preTouchStart = true; event.preventDefault(); }; NSTouchToMouse.prototype.__gestureEndHandler = function(event) { event = this.util.getEvent(event); this.__objLocal.gestureChanged = false; event.preventDefault(); }; NSTouchToMouse.prototype.__touchStartHandler = function(event,touch) { this.__fireCallback("touchStartHandler",event,touch); this.__objLocal.preTouchStart = true; this.__objLocal.documentClick = true; }; NSTouchToMouse.prototype.__touchMoveHandler = function(event,touch) { this.__fireCallback("touchMoveHandler",event,touch); this.__objLocal.preTouchStart = false; this.__objLocal.documentClick = false; }; NSTouchToMouse.prototype.__touchEndHandler = function(event,touch) { if (this.__objLocal.doubleTapWaiting && this.__objLocal.preTouchStart) { this.__fireCallback("doubleTapHandler",event,touch); } else { this.__objLocal.doubleTapWaiting = true; this.__fireCallback("touchEndHandler",event,touch); var self = this; window.setTimeout(function () { self.__objLocal.doubleTapWaiting = false; }, this.__config.doubleTapInterval); } this.__objLocal.preTouchStart = false; }; NSTouchToMouse.prototype.__fireClickEvent = function(event,touch) { if(this.__objLocal.documentClick) { this.__fireMouseEvent("click",event,touch); this.__objLocal.documentClick = false; } }; NSTouchToMouse.prototype.__fireMouseEvent = function(mouseEventType,event,touch) { if(!this.__config.suppressMouseEvent) { var mouseEvent = null; var option = {bubbles: true,cancelable: true,view:this.win,detail:1,screenX:touch.screenX,screenY:touch.screenY,clientX:touch.clientX,clientY:touch.clientY,ctrlKey:false, altKey:false,shiftKey:false,metaKey:false,button:0,relatedTarget:null}; if(this.__useConstructor) { mouseEvent = new MouseEvent(mouseEventType,option); } else { mouseEvent = this.doc.createEvent("MouseEvent"); mouseEvent.initMouseEvent(mouseEventType,option.bubbles,option.cancelable,option.view,option.detail, option.screenX,option.screenY,option.clientX,option.clientY,option.ctrlKey, option.altKey,option.shiftKey,option.metaKey,option.button,option.relatedTarget); } touch.target.dispatchEvent(mouseEvent); } }; NSTouchToMouse.prototype.__isMouseEventConstructorExists = function() { try { new MouseEvent("test"); return true; } catch(error) { } return false; }; NSTouchToMouse.prototype.__fireCallback = function(callbackKey,event,touch) { if(this.__config[callbackKey]) { this.__config[callbackKey](touch.screenX,touch.screenY,event); } }; return NSTouchToMouse; })(); nsModuleExport(this,"NSTouchToMouse",NSTouchToMouse);