annotate .cms/lib/codemirror/src/util/operation_group.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 { getHandlers } from "./event.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 let operationGroup = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 export function pushOperation(op) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 if (operationGroup) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 operationGroup.ops.push(op)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 op.ownsGroup = operationGroup = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 ops: [op],
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 delayedCallbacks: []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 function fireCallbacksForOps(group) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 // Calls delayed callbacks and cursorActivity handlers until no
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 // new ones appear
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 let callbacks = group.delayedCallbacks, i = 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 do {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 for (; i < callbacks.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 callbacks[i].call(null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 for (let j = 0; j < group.ops.length; j++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 let op = group.ops[j]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 if (op.cursorActivityHandlers)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 while (op.cursorActivityCalled < op.cursorActivityHandlers.length)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 } while (i < callbacks.length)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 export function finishOperation(op, endCb) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 let group = op.ownsGroup
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 if (!group) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 try { fireCallbacksForOps(group) }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 finally {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 operationGroup = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 endCb(group)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 let orphanDelayedCallbacks = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 // Often, we want to signal events at a point where we are in the
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 // middle of some work, but don't want the handler to start calling
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 // other methods on the editor, which might be in an inconsistent
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 // state or simply not expect any other events to happen.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 // signalLater looks whether there are any handlers, and schedules
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 // them to be executed when the last operation ends, or, if no
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 // operation is active, when a timeout fires.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 export function signalLater(emitter, type /*, values...*/) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 let arr = getHandlers(emitter, type)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 if (!arr.length) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 let args = Array.prototype.slice.call(arguments, 2), list
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 if (operationGroup) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 list = operationGroup.delayedCallbacks
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 } else if (orphanDelayedCallbacks) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 list = orphanDelayedCallbacks
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 list = orphanDelayedCallbacks = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 setTimeout(fireOrphanDelayed, 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 for (let i = 0; i < arr.length; ++i)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 list.push(() => arr[i].apply(null, args))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 function fireOrphanDelayed() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 let delayed = orphanDelayedCallbacks
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 orphanDelayedCallbacks = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 for (let i = 0; i < delayed.length; ++i) delayed[i]()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 }