Spaces:
Sleeping
Sleeping
processmaker-community / processmaker-files /gulliver /js /codemirror /addon /selection /selection-pointer.js
| // CodeMirror, copyright (c) by Marijn Haverbeke and others | |
| // Distributed under an MIT license: http://codemirror.net/LICENSE | |
| (function(mod) { | |
| if (typeof exports == "object" && typeof module == "object") // CommonJS | |
| mod(require("../../lib/codemirror")); | |
| else if (typeof define == "function" && define.amd) // AMD | |
| define(["../../lib/codemirror"], mod); | |
| else // Plain browser env | |
| mod(CodeMirror); | |
| })(function(CodeMirror) { | |
| "use strict"; | |
| CodeMirror.defineOption("selectionPointer", false, function(cm, val) { | |
| var data = cm.state.selectionPointer; | |
| if (data) { | |
| CodeMirror.off(cm.getWrapperElement(), "mousemove", data.mousemove); | |
| CodeMirror.off(cm.getWrapperElement(), "mouseout", data.mouseout); | |
| CodeMirror.off(window, "scroll", data.windowScroll); | |
| cm.off("cursorActivity", reset); | |
| cm.off("scroll", reset); | |
| cm.state.selectionPointer = null; | |
| cm.display.lineDiv.style.cursor = ""; | |
| } | |
| if (val) { | |
| data = cm.state.selectionPointer = { | |
| value: typeof val == "string" ? val : "default", | |
| mousemove: function(event) { mousemove(cm, event); }, | |
| mouseout: function(event) { mouseout(cm, event); }, | |
| windowScroll: function() { reset(cm); }, | |
| rects: null, | |
| mouseX: null, mouseY: null, | |
| willUpdate: false | |
| }; | |
| CodeMirror.on(cm.getWrapperElement(), "mousemove", data.mousemove); | |
| CodeMirror.on(cm.getWrapperElement(), "mouseout", data.mouseout); | |
| CodeMirror.on(window, "scroll", data.windowScroll); | |
| cm.on("cursorActivity", reset); | |
| cm.on("scroll", reset); | |
| } | |
| }); | |
| function mousemove(cm, event) { | |
| var data = cm.state.selectionPointer; | |
| if (event.buttons == null ? event.which : event.buttons) { | |
| data.mouseX = data.mouseY = null; | |
| } else { | |
| data.mouseX = event.clientX; | |
| data.mouseY = event.clientY; | |
| } | |
| scheduleUpdate(cm); | |
| } | |
| function mouseout(cm, event) { | |
| if (!cm.getWrapperElement().contains(event.relatedTarget)) { | |
| var data = cm.state.selectionPointer; | |
| data.mouseX = data.mouseY = null; | |
| scheduleUpdate(cm); | |
| } | |
| } | |
| function reset(cm) { | |
| cm.state.selectionPointer.rects = null; | |
| scheduleUpdate(cm); | |
| } | |
| function scheduleUpdate(cm) { | |
| if (!cm.state.selectionPointer.willUpdate) { | |
| cm.state.selectionPointer.willUpdate = true; | |
| setTimeout(function() { | |
| update(cm); | |
| cm.state.selectionPointer.willUpdate = false; | |
| }, 50); | |
| } | |
| } | |
| function update(cm) { | |
| var data = cm.state.selectionPointer; | |
| if (!data) return; | |
| if (data.rects == null && data.mouseX != null) { | |
| data.rects = []; | |
| if (cm.somethingSelected()) { | |
| for (var sel = cm.display.selectionDiv.firstChild; sel; sel = sel.nextSibling) | |
| data.rects.push(sel.getBoundingClientRect()); | |
| } | |
| } | |
| var inside = false; | |
| if (data.mouseX != null) for (var i = 0; i < data.rects.length; i++) { | |
| var rect = data.rects[i]; | |
| if (rect.left <= data.mouseX && rect.right >= data.mouseX && | |
| rect.top <= data.mouseY && rect.bottom >= data.mouseY) | |
| inside = true; | |
| } | |
| var cursor = inside ? data.value : ""; | |
| if (cm.display.lineDiv.style.cursor != cursor) | |
| cm.display.lineDiv.style.cursor = cursor; | |
| } | |
| }); | |