nscomponentsreact
Version:
React Wrapper Components for NSComponents
297 lines (279 loc) • 9.13 kB
JavaScript
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);