Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 3844 → Rev 3845

/trunk/widget/modules/saisie/squelettes/js/tb-geoloc/js/Leaflet.GestureHandling-master/src/js/leaflet-gesture-handling.js
New file
0,0 → 1,284
/*
* * Leaflet Gesture Handling **
* * Version 1.1.8
*/
import LanguageContent from "./language-content";
 
L.Map.mergeOptions({
gestureHandlingOptions: {
text: {},
duration: 1000
}
});
 
var draggingMap = false;
 
export var GestureHandling = L.Handler.extend({
addHooks: function() {
this._handleTouch = this._handleTouch.bind(this);
 
this._setupPluginOptions();
this._setLanguageContent();
this._disableInteractions();
 
//Uses native event listeners instead of L.DomEvent due to issues with Android touch events
//turning into pointer events
this._map._container.addEventListener("touchstart", this._handleTouch);
this._map._container.addEventListener("touchmove", this._handleTouch);
this._map._container.addEventListener("touchend", this._handleTouch);
this._map._container.addEventListener("touchcancel", this._handleTouch);
this._map._container.addEventListener("click", this._handleTouch);
 
L.DomEvent.on(
this._map._container,
"wheel",
this._handleScroll,
this
);
L.DomEvent.on(this._map, "mouseover", this._handleMouseOver, this);
L.DomEvent.on(this._map, "mouseout", this._handleMouseOut, this);
 
// Listen to these events so will not disable dragging if the user moves the mouse out the boundary of the map container whilst actively dragging the map.
L.DomEvent.on(this._map, "movestart", this._handleDragging, this);
L.DomEvent.on(this._map, "move", this._handleDragging, this);
L.DomEvent.on(this._map, "moveend", this._handleDragging, this);
},
 
removeHooks: function() {
this._enableInteractions();
 
this._map._container.removeEventListener(
"touchstart",
this._handleTouch
);
this._map._container.removeEventListener(
"touchmove",
this._handleTouch
);
this._map._container.removeEventListener("touchend", this._handleTouch);
this._map._container.removeEventListener(
"touchcancel",
this._handleTouch
);
this._map._container.removeEventListener("click", this._handleTouch);
 
L.DomEvent.off(
this._map._container,
"wheel",
this._handleScroll,
this
);
L.DomEvent.off(this._map, "mouseover", this._handleMouseOver, this);
L.DomEvent.off(this._map, "mouseout", this._handleMouseOut, this);
 
L.DomEvent.off(this._map, "movestart", this._handleDragging, this);
L.DomEvent.off(this._map, "move", this._handleDragging, this);
L.DomEvent.off(this._map, "moveend", this._handleDragging, this);
},
 
_handleDragging: function(e) {
if (e.type == "movestart" || e.type == "move") {
draggingMap = true;
} else if (e.type == "moveend") {
draggingMap = false;
}
},
 
_disableInteractions: function() {
this._map.dragging.disable();
this._map.scrollWheelZoom.disable();
if (this._map.tap) {
this._map.tap.disable();
}
},
 
_enableInteractions: function() {
this._map.dragging.enable();
this._map.scrollWheelZoom.enable();
if (this._map.tap) {
this._map.tap.enable();
}
},
 
_setupPluginOptions: function() {
//For backwards compatibility, merge gestureHandlingText into the new options object
if (this._map.options.gestureHandlingText) {
this._map.options.gestureHandlingOptions.text = this._map.options.gestureHandlingText;
}
},
 
_setLanguageContent: function() {
var languageContent;
//If user has supplied custom language, use that
if (
this._map.options.gestureHandlingOptions &&
this._map.options.gestureHandlingOptions.text &&
this._map.options.gestureHandlingOptions.text.touch &&
this._map.options.gestureHandlingOptions.text.scroll &&
this._map.options.gestureHandlingOptions.text.scrollMac
) {
languageContent = this._map.options.gestureHandlingOptions.text;
} else {
//Otherwise auto set it from the language files
 
//Determine their language e.g fr or en-US
var lang = this._getUserLanguage();
 
//If we couldn't find it default to en
if (!lang) {
lang = "en";
}
 
//Lookup the appropriate language content
if (LanguageContent[lang]) {
languageContent = LanguageContent[lang];
}
 
//If no result, try searching by the first part only. e.g en-US just use en.
if (!languageContent && lang.indexOf("-") !== -1) {
lang = lang.split("-")[0];
languageContent = LanguageContent[lang];
}
 
if (!languageContent) {
// If still nothing, default to English
// console.log("No lang found for", lang);
lang = "en";
languageContent = LanguageContent[lang];
}
}
 
//TEST
// languageContent = LanguageContent["bg"];
 
//Check if they're on a mac for display of command instead of ctrl
var mac = false;
if (navigator.platform.toUpperCase().indexOf("MAC") >= 0) {
mac = true;
}
 
var scrollContent = languageContent.scroll;
if (mac) {
scrollContent = languageContent.scrollMac;
}
 
this._map._container.setAttribute(
"data-gesture-handling-touch-content",
languageContent.touch
);
this._map._container.setAttribute(
"data-gesture-handling-scroll-content",
scrollContent
);
},
 
_getUserLanguage: function() {
var lang = navigator.languages
? navigator.languages[0]
: navigator.language || navigator.userLanguage;
return lang;
},
 
_handleTouch: function(e) {
//Disregard touch events on the minimap if present
var ignoreList = [
"leaflet-control-minimap",
"leaflet-interactive",
"leaflet-popup-content",
"leaflet-popup-content-wrapper",
"leaflet-popup-close-button",
"leaflet-control-zoom-in",
"leaflet-control-zoom-out"
];
 
var ignoreElement = false;
for (var i = 0; i < ignoreList.length; i++) {
if (L.DomUtil.hasClass(e.target, ignoreList[i])) {
ignoreElement = true;
}
}
 
if (ignoreElement) {
if (
L.DomUtil.hasClass(e.target, "leaflet-interactive") &&
e.type === "touchmove" &&
e.touches.length === 1
) {
L.DomUtil.addClass(this._map._container,
"leaflet-gesture-handling-touch-warning"
);
this._disableInteractions();
} else {
L.DomUtil.removeClass(this._map._container,
"leaflet-gesture-handling-touch-warning"
);
}
return;
}
// screenLog(e.type+' '+e.touches.length);
if (e.type !== "touchmove" && e.type !== "touchstart") {
L.DomUtil.removeClass(this._map._container,
"leaflet-gesture-handling-touch-warning"
);
return;
}
if (e.touches.length === 1) {
L.DomUtil.addClass(this._map._container,
"leaflet-gesture-handling-touch-warning"
);
this._disableInteractions();
} else {
this._enableInteractions();
L.DomUtil.removeClass(this._map._container,
"leaflet-gesture-handling-touch-warning"
);
}
},
 
_isScrolling: false,
 
_handleScroll: function(e) {
if (e.metaKey || e.ctrlKey) {
e.preventDefault();
L.DomUtil.removeClass(this._map._container,
"leaflet-gesture-handling-scroll-warning"
);
this._map.scrollWheelZoom.enable();
} else {
L.DomUtil.addClass(this._map._container,
"leaflet-gesture-handling-scroll-warning"
);
this._map.scrollWheelZoom.disable();
 
clearTimeout(this._isScrolling);
 
// Set a timeout to run after scrolling ends
this._isScrolling = setTimeout(function() {
// Run the callback
var warnings = document.getElementsByClassName(
"leaflet-gesture-handling-scroll-warning"
);
for (var i = 0; i < warnings.length; i++) {
L.DomUtil.removeClass(warnings[i],
"leaflet-gesture-handling-scroll-warning"
);
}
}, this._map.options.gestureHandlingOptions.duration);
}
},
 
_handleMouseOver: function(e) {
this._enableInteractions();
},
 
_handleMouseOut: function(e) {
if (!draggingMap) {
this._disableInteractions();
}
}
 
});
 
L.Map.addInitHook("addHandler", "gestureHandling", GestureHandling);
 
export default GestureHandling;