annotate .cms/lib/codemirror/src/edit/global_events.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 { onBlur } from "../display/focus.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 import { on } from "../util/event.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 // These must be handled carefully, because naively registering a
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 // handler for each editor will cause the editors to never be
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 // garbage collected.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 function forEachCodeMirror(f) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 if (!document.getElementsByClassName) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 let byClass = document.getElementsByClassName("CodeMirror"), editors = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 for (let i = 0; i < byClass.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 let cm = byClass[i].CodeMirror
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 if (cm) editors.push(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 if (editors.length) editors[0].operation(() => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 for (let i = 0; i < editors.length; i++) f(editors[i])
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 let globalsRegistered = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 export function ensureGlobalHandlers() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 if (globalsRegistered) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 registerGlobalHandlers()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 globalsRegistered = true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 function registerGlobalHandlers() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 // When the window resizes, we need to refresh active editors.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 let resizeTimer
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 on(window, "resize", () => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 if (resizeTimer == null) resizeTimer = setTimeout(() => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 resizeTimer = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 forEachCodeMirror(onResize)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 }, 100)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 // When the window loses focus, we want to show the editor as blurred
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 on(window, "blur", () => forEachCodeMirror(onBlur))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 // Called when the window resizes
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 function onResize(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 let d = cm.display
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 // Might be a text scaling operation, clear size caches.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 d.scrollbarsClipped = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 cm.setSize()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 }