mirror of https://github.com/gogits/gogs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.2 KiB
98 lines
3.2 KiB
// 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; |
|
} |
|
});
|
|
|