123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- // CodeMirror, copyright (c) by Marijn Haverbeke and others
- // Distributed under an MIT license: https://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)
- // Plain browser env
- else 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
- }
- })
|