1 |
|
2 |
|
3 |
|
4 | (function(mod) {
|
5 | if (typeof exports == "object" && typeof module == "object")
|
6 | mod(require("../../lib/codemirror"));
|
7 | else if (typeof define == "function" && define.amd)
|
8 | define(["../../lib/codemirror"], mod);
|
9 | else
|
10 | mod(CodeMirror);
|
11 | })(function(CodeMirror) {
|
12 | "use strict";
|
13 |
|
14 | CodeMirror.defineOption("selectionPointer", false, function(cm, val) {
|
15 | var data = cm.state.selectionPointer;
|
16 | if (data) {
|
17 | CodeMirror.off(cm.getWrapperElement(), "mousemove", data.mousemove);
|
18 | CodeMirror.off(cm.getWrapperElement(), "mouseout", data.mouseout);
|
19 | CodeMirror.off(window, "scroll", data.windowScroll);
|
20 | cm.off("cursorActivity", reset);
|
21 | cm.off("scroll", reset);
|
22 | cm.state.selectionPointer = null;
|
23 | cm.display.lineDiv.style.cursor = "";
|
24 | }
|
25 | if (val) {
|
26 | data = cm.state.selectionPointer = {
|
27 | value: typeof val == "string" ? val : "default",
|
28 | mousemove: function(event) { mousemove(cm, event); },
|
29 | mouseout: function(event) { mouseout(cm, event); },
|
30 | windowScroll: function() { reset(cm); },
|
31 | rects: null,
|
32 | mouseX: null, mouseY: null,
|
33 | willUpdate: false
|
34 | };
|
35 | CodeMirror.on(cm.getWrapperElement(), "mousemove", data.mousemove);
|
36 | CodeMirror.on(cm.getWrapperElement(), "mouseout", data.mouseout);
|
37 | CodeMirror.on(window, "scroll", data.windowScroll);
|
38 | cm.on("cursorActivity", reset);
|
39 | cm.on("scroll", reset);
|
40 | }
|
41 | });
|
42 |
|
43 | function mousemove(cm, event) {
|
44 | var data = cm.state.selectionPointer;
|
45 | if (event.buttons == null ? event.which : event.buttons) {
|
46 | data.mouseX = data.mouseY = null;
|
47 | } else {
|
48 | data.mouseX = event.clientX;
|
49 | data.mouseY = event.clientY;
|
50 | }
|
51 | scheduleUpdate(cm);
|
52 | }
|
53 |
|
54 | function mouseout(cm, event) {
|
55 | if (!cm.getWrapperElement().contains(event.relatedTarget)) {
|
56 | var data = cm.state.selectionPointer;
|
57 | data.mouseX = data.mouseY = null;
|
58 | scheduleUpdate(cm);
|
59 | }
|
60 | }
|
61 |
|
62 | function reset(cm) {
|
63 | cm.state.selectionPointer.rects = null;
|
64 | scheduleUpdate(cm);
|
65 | }
|
66 |
|
67 | function scheduleUpdate(cm) {
|
68 | if (!cm.state.selectionPointer.willUpdate) {
|
69 | cm.state.selectionPointer.willUpdate = true;
|
70 | setTimeout(function() {
|
71 | update(cm);
|
72 | cm.state.selectionPointer.willUpdate = false;
|
73 | }, 50);
|
74 | }
|
75 | }
|
76 |
|
77 | function update(cm) {
|
78 | var data = cm.state.selectionPointer;
|
79 | if (!data) return;
|
80 | if (data.rects == null && data.mouseX != null) {
|
81 | data.rects = [];
|
82 | if (cm.somethingSelected()) {
|
83 | for (var sel = cm.display.selectionDiv.firstChild; sel; sel = sel.nextSibling)
|
84 | data.rects.push(sel.getBoundingClientRect());
|
85 | }
|
86 | }
|
87 | var inside = false;
|
88 | if (data.mouseX != null) for (var i = 0; i < data.rects.length; i++) {
|
89 | var rect = data.rects[i];
|
90 | if (rect.left <= data.mouseX && rect.right >= data.mouseX &&
|
91 | rect.top <= data.mouseY && rect.bottom >= data.mouseY)
|
92 | inside = true;
|
93 | }
|
94 | var cursor = inside ? data.value : "";
|
95 | if (cm.display.lineDiv.style.cursor != cursor)
|
96 | cm.display.lineDiv.style.cursor = cursor;
|
97 | }
|
98 | });
|