annotate .cms/lib/codemirror/src/edit/CodeMirror.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
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 { Display } from "../display/Display.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 import { onFocus, onBlur } from "../display/focus.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 import { maybeUpdateLineNumberWidth } from "../display/line_numbers.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 import { endOperation, operation, startOperation } from "../display/operations.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 import { initScrollbars } from "../display/scrollbars.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 import { onScrollWheel } from "../display/scroll_events.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 import { setScrollLeft, updateScrollTop } from "../display/scrolling.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 import { clipPos, Pos } from "../line/pos.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 import { posFromMouse } from "../measurement/position_measurement.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 import { eventInWidget } from "../measurement/widgets.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 import Doc from "../model/Doc.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 import { attachDoc } from "../model/document_data.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 import { Range } from "../model/selection.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 import { extendSelection } from "../model/selection_updates.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 import { ie, ie_version, mobile, webkit } from "../util/browser.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 import { e_preventDefault, e_stop, on, signal, signalDOMEvent } from "../util/event.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 import { copyObj, Delayed } from "../util/misc.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 import { clearDragCursor, onDragOver, onDragStart, onDrop } from "./drop_events.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 import { ensureGlobalHandlers } from "./global_events.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 import { onKeyDown, onKeyPress, onKeyUp } from "./key_events.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 import { clickInGutter, onContextMenu, onMouseDown } from "./mouse_events.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 import { themeChanged } from "./utils.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 import { defaults, optionHandlers, Init } from "./options.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 // A CodeMirror instance represents an editor. This is the object
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 // that user code is usually dealing with.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 export function CodeMirror(place, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 if (!(this instanceof CodeMirror)) return new CodeMirror(place, options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 this.options = options = options ? copyObj(options) : {}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 // Determine effective options based on given values and defaults.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 copyObj(defaults, options, false)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 let doc = options.value
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 if (typeof doc == "string") doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 else if (options.mode) doc.modeOption = options.mode
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 this.doc = doc
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 let input = new CodeMirror.inputStyles[options.inputStyle](this)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 let display = this.display = new Display(place, doc, input, options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 display.wrapper.CodeMirror = this
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 themeChanged(this)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 if (options.lineWrapping)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 this.display.wrapper.className += " CodeMirror-wrap"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 initScrollbars(this)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 this.state = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 keyMaps: [], // stores maps added by addKeyMap
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 overlays: [], // highlighting overlays, as added by addOverlay
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 overwrite: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 delayingBlurEvent: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 focused: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 suppressEdits: false, // used to disable editing during key handlers when in readOnly mode
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 selectingText: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 draggingText: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 highlight: new Delayed(), // stores highlight worker timeout
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 keySeq: null, // Unfinished key sequence
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 specialChars: null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 if (options.autofocus && !mobile) display.input.focus()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 // Override magic textarea content restore that IE sometimes does
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 // on our hidden textarea on reload
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 if (ie && ie_version < 11) setTimeout(() => this.display.input.reset(true), 20)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 registerEventHandlers(this)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 ensureGlobalHandlers()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 startOperation(this)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 this.curOp.forceUpdate = true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 attachDoc(this, doc)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 if ((options.autofocus && !mobile) || this.hasFocus())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 setTimeout(() => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 if (this.hasFocus() && !this.state.focused) onFocus(this)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 }, 20)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 onBlur(this)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 for (let opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 optionHandlers[opt](this, options[opt], Init)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 maybeUpdateLineNumberWidth(this)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 if (options.finishInit) options.finishInit(this)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 for (let i = 0; i < initHooks.length; ++i) initHooks[i](this)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 endOperation(this)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 // Suppress optimizelegibility in Webkit, since it breaks text
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 // measuring on line wrapping boundaries.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 if (webkit && options.lineWrapping &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 getComputedStyle(display.lineDiv).textRendering == "optimizelegibility")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 display.lineDiv.style.textRendering = "auto"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 // The default configuration options.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 CodeMirror.defaults = defaults
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 // Functions to run when options are changed.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 CodeMirror.optionHandlers = optionHandlers
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 export default CodeMirror
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 // Attach the necessary event handlers when initializing the editor
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 function registerEventHandlers(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 let d = cm.display
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 on(d.scroller, "mousedown", operation(cm, onMouseDown))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 // Older IE's will not fire a second mousedown for a double click
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 if (ie && ie_version < 11)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 on(d.scroller, "dblclick", operation(cm, e => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 if (signalDOMEvent(cm, e)) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 let pos = posFromMouse(cm, e)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 e_preventDefault(e)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 let word = cm.findWordAt(pos)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 extendSelection(cm.doc, word.anchor, word.head)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 }))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 on(d.scroller, "dblclick", e => signalDOMEvent(cm, e) || e_preventDefault(e))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 // Some browsers fire contextmenu *after* opening the menu, at
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 // which point we can't mess with it anymore. Context menu is
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 // handled in onMouseDown for these browsers.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 on(d.scroller, "contextmenu", e => onContextMenu(cm, e))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 on(d.input.getField(), "contextmenu", e => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 if (!d.scroller.contains(e.target)) onContextMenu(cm, e)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 // Used to suppress mouse event handling when a touch happens
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 let touchFinished, prevTouch = {end: 0}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 function finishTouch() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 if (d.activeTouch) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 touchFinished = setTimeout(() => d.activeTouch = null, 1000)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 prevTouch = d.activeTouch
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 prevTouch.end = +new Date
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 function isMouseLikeTouchEvent(e) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 if (e.touches.length != 1) return false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 let touch = e.touches[0]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 return touch.radiusX <= 1 && touch.radiusY <= 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 function farAway(touch, other) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 if (other.left == null) return true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 let dx = other.left - touch.left, dy = other.top - touch.top
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 return dx * dx + dy * dy > 20 * 20
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 on(d.scroller, "touchstart", e => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 d.input.ensurePolled()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 clearTimeout(touchFinished)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 let now = +new Date
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 d.activeTouch = {start: now, moved: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 prev: now - prevTouch.end <= 300 ? prevTouch : null}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 if (e.touches.length == 1) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 d.activeTouch.left = e.touches[0].pageX
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 d.activeTouch.top = e.touches[0].pageY
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 on(d.scroller, "touchmove", () => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 if (d.activeTouch) d.activeTouch.moved = true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 on(d.scroller, "touchend", e => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 let touch = d.activeTouch
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 if (touch && !eventInWidget(d, e) && touch.left != null &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 !touch.moved && new Date - touch.start < 300) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 let pos = cm.coordsChar(d.activeTouch, "page"), range
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 if (!touch.prev || farAway(touch, touch.prev)) // Single tap
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 range = new Range(pos, pos)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 range = cm.findWordAt(pos)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 else // Triple tap
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0)))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 cm.setSelection(range.anchor, range.head)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 cm.focus()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 e_preventDefault(e)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 finishTouch()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 on(d.scroller, "touchcancel", finishTouch)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 // Sync scrolling between fake scrollbars and real scrollable
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 // area, ensure viewport is updated when scrolling.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 on(d.scroller, "scroll", () => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 if (d.scroller.clientHeight) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 updateScrollTop(cm, d.scroller.scrollTop)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 setScrollLeft(cm, d.scroller.scrollLeft, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189 signal(cm, "scroll", cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 // Listen to wheel events in order to try and update the viewport on time.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 on(d.scroller, "mousewheel", e => onScrollWheel(cm, e))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 on(d.scroller, "DOMMouseScroll", e => onScrollWheel(cm, e))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197 // Prevent wrapper from ever scrolling
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198 on(d.wrapper, "scroll", () => d.wrapper.scrollTop = d.wrapper.scrollLeft = 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 d.dragFunctions = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 enter: e => {if (!signalDOMEvent(cm, e)) e_stop(e)},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 over: e => {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e) }},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203 start: e => onDragStart(cm, e),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 drop: operation(cm, onDrop),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205 leave: e => {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm) }}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 let inp = d.input.getField()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
209 on(inp, "keyup", e => onKeyUp.call(cm, e))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
210 on(inp, "keydown", operation(cm, onKeyDown))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
211 on(inp, "keypress", operation(cm, onKeyPress))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
212 on(inp, "focus", e => onFocus(cm, e))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
213 on(inp, "blur", e => onBlur(cm, e))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
216 let initHooks = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
217 CodeMirror.defineInitHook = f => initHooks.push(f)