annotate .cms/lib/codemirror/src/util/event.js @ 1:1d486627aa1e draft default tip

24.10
author Coffee CMS <info@coffee-cms.ru>
date Sat, 12 Oct 2024 02:51:39 +0000
parents 78edf6b517a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 import { mac } from "./browser.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 import { indexOf } from "./misc.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 // EVENT HANDLING
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 // Lightweight event framework. on/off also work on DOM nodes,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 // registering native DOM handlers.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 const noHandlers = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 export let on = function(emitter, type, f) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 if (emitter.addEventListener) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 emitter.addEventListener(type, f, false)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 } else if (emitter.attachEvent) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 emitter.attachEvent("on" + type, f)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 let map = emitter._handlers || (emitter._handlers = {})
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 map[type] = (map[type] || noHandlers).concat(f)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 export function getHandlers(emitter, type) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 return emitter._handlers && emitter._handlers[type] || noHandlers
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 export function off(emitter, type, f) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 if (emitter.removeEventListener) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 emitter.removeEventListener(type, f, false)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 } else if (emitter.detachEvent) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 emitter.detachEvent("on" + type, f)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 let map = emitter._handlers, arr = map && map[type]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 if (arr) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 let index = indexOf(arr, f)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 if (index > -1)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 map[type] = arr.slice(0, index).concat(arr.slice(index + 1))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 export function signal(emitter, type /*, values...*/) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 let handlers = getHandlers(emitter, type)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 if (!handlers.length) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 let args = Array.prototype.slice.call(arguments, 2)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 for (let i = 0; i < handlers.length; ++i) handlers[i].apply(null, args)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 // The DOM events that CodeMirror handles can be overridden by
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 // registering a (non-DOM) handler on the editor for the event name,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 // and preventDefault-ing the event in that handler.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 export function signalDOMEvent(cm, e, override) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 if (typeof e == "string")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 e = {type: e, preventDefault: function() { this.defaultPrevented = true }}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 signal(cm, override || e.type, cm, e)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 return e_defaultPrevented(e) || e.codemirrorIgnore
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 export function signalCursorActivity(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 let arr = cm._handlers && cm._handlers.cursorActivity
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 if (!arr) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 let set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = [])
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 for (let i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 set.push(arr[i])
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 export function hasHandler(emitter, type) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 return getHandlers(emitter, type).length > 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 // Add on and off methods to a constructor's prototype, to make
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 // registering events on such objects more convenient.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 export function eventMixin(ctor) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 ctor.prototype.on = function(type, f) {on(this, type, f)}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 ctor.prototype.off = function(type, f) {off(this, type, f)}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 // Due to the fact that we still support jurassic IE versions, some
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 // compatibility wrappers are needed.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 export function e_preventDefault(e) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 if (e.preventDefault) e.preventDefault()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 else e.returnValue = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 export function e_stopPropagation(e) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 if (e.stopPropagation) e.stopPropagation()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 else e.cancelBubble = true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 export function e_defaultPrevented(e) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 export function e_stop(e) {e_preventDefault(e); e_stopPropagation(e)}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 export function e_target(e) {return e.target || e.srcElement}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 export function e_button(e) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 let b = e.which
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 if (b == null) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 if (e.button & 1) b = 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 else if (e.button & 2) b = 3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 else if (e.button & 4) b = 2
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 if (mac && e.ctrlKey && b == 1) b = 3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 return b
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 }