GPQAPP

Форк
0
98 строк · 3.2 Кб
1
// CodeMirror, copyright (c) by Marijn Haverbeke and others
2
// Distributed under an MIT license: https://codemirror.net/LICENSE
3

4
(function(mod) {
5
  if (typeof exports == "object" && typeof module == "object") // CommonJS
6
    mod(require("../../lib/codemirror"));
7
  else if (typeof define == "function" && define.amd) // AMD
8
    define(["../../lib/codemirror"], mod);
9
  else // Plain browser env
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
});
99

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.