annotate .cms/lib/codemirror/src/display/update_display.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 { sawCollapsedSpans } from "../line/saw_special_spans.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 import { heightAtLine, visualLineEndNo, visualLineNo } from "../line/spans.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 import { getLine, lineNumberFor } from "../line/utils_line.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 import { displayHeight, displayWidth, getDimensions, paddingVert, scrollGap } from "../measurement/position_measurement.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 import { mac, webkit } from "../util/browser.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 import { activeElt, removeChildren, contains, win, root, rootNode } from "../util/dom.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 import { hasHandler, signal } from "../util/event.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 import { signalLater } from "../util/operation_group.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 import { indexOf } from "../util/misc.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 import { buildLineElement, updateLineForChanges } from "./update_line.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 import { startWorker } from "./highlight_worker.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 import { maybeUpdateLineNumberWidth } from "./line_numbers.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 import { measureForScrollbars, updateScrollbars } from "./scrollbars.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 import { updateSelection } from "./selection.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 import { updateHeightsInViewport, visibleLines } from "./update_lines.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 import { adjustView, countDirtyView, resetView } from "./view_tracking.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 // DISPLAY DRAWING
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 export class DisplayUpdate {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 constructor(cm, viewport, force) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 let display = cm.display
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 this.viewport = viewport
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 // Store some values that we'll need later (but don't want to force a relayout for)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 this.visible = visibleLines(display, cm.doc, viewport)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 this.editorIsHidden = !display.wrapper.offsetWidth
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 this.wrapperHeight = display.wrapper.clientHeight
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 this.wrapperWidth = display.wrapper.clientWidth
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 this.oldDisplayWidth = displayWidth(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 this.force = force
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 this.dims = getDimensions(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 this.events = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 signal(emitter, type) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 if (hasHandler(emitter, type))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 this.events.push(arguments)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 finish() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 for (let i = 0; i < this.events.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 signal.apply(null, this.events[i])
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 export function maybeClipScrollbars(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 let display = cm.display
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 if (!display.scrollbarsClipped && display.scroller.offsetWidth) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 display.heightForcer.style.height = scrollGap(cm) + "px"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 display.sizer.style.marginBottom = -display.nativeBarWidth + "px"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 display.sizer.style.borderRightWidth = scrollGap(cm) + "px"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 display.scrollbarsClipped = true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 }
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 function selectionSnapshot(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 if (cm.hasFocus()) return null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 let active = activeElt(root(cm))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 if (!active || !contains(cm.display.lineDiv, active)) return null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 let result = {activeElt: active}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 if (window.getSelection) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 let sel = win(cm).getSelection()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 result.anchorNode = sel.anchorNode
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 result.anchorOffset = sel.anchorOffset
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 result.focusNode = sel.focusNode
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 result.focusOffset = sel.focusOffset
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 return result
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 function restoreSelection(snapshot) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt(rootNode(snapshot.activeElt))) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 snapshot.activeElt.focus()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 let doc = snapshot.activeElt.ownerDocument
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 let sel = doc.defaultView.getSelection(), range = doc.createRange()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 range.setEnd(snapshot.anchorNode, snapshot.anchorOffset)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 range.collapse(false)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 sel.removeAllRanges()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 sel.addRange(range)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 sel.extend(snapshot.focusNode, snapshot.focusOffset)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 // Does the actual updating of the line display. Bails out
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 // (returning false) when there is nothing to be done and forced is
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 // false.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 export function updateDisplayIfNeeded(cm, update) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 let display = cm.display, doc = cm.doc
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 if (update.editorIsHidden) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 resetView(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 return false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 // Bail out if the visible area is already rendered and nothing changed.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 if (!update.force &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 display.renderedView == display.view && countDirtyView(cm) == 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 return false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 if (maybeUpdateLineNumberWidth(cm)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 resetView(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 update.dims = getDimensions(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 // Compute a suitable new viewport (from & to)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 let end = doc.first + doc.size
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 let from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 let to = Math.min(end, update.visible.to + cm.options.viewportMargin)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 if (sawCollapsedSpans) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 from = visualLineNo(cm.doc, from)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 to = visualLineEndNo(cm.doc, to)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 let different = from != display.viewFrom || to != display.viewTo ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 adjustView(cm, from, to)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 // Position the mover div to align with the current scroll position
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 cm.display.mover.style.top = display.viewOffset + "px"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 let toUpdate = countDirtyView(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 return false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 // For big changes, we hide the enclosing element during the
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 // update, since that speeds up the operations on most browsers.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 let selSnapshot = selectionSnapshot(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 if (toUpdate > 4) display.lineDiv.style.display = "none"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 patchDisplay(cm, display.updateLineNumbers, update.dims)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 if (toUpdate > 4) display.lineDiv.style.display = ""
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 display.renderedView = display.view
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 // There might have been a widget with a focused element that got
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 // hidden or updated, if so re-focus it.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 restoreSelection(selSnapshot)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 // Prevent selection and cursors from interfering with the scroll
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 // width and height.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 removeChildren(display.cursorDiv)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 removeChildren(display.selectionDiv)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 display.gutters.style.height = display.sizer.style.minHeight = 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 if (different) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 display.lastWrapHeight = update.wrapperHeight
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 display.lastWrapWidth = update.wrapperWidth
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 startWorker(cm, 400)
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 display.updateLineNumbers = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 return true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 export function postUpdateDisplay(cm, update) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 let viewport = update.viewport
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 for (let first = true;; first = false) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170 // Clip forced viewport to actual scrollable area.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 if (viewport && viewport.top != null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 // Updated line heights might result in the drawn area not
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 // actually covering the viewport. Keep looping until it does.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 update.visible = visibleLines(cm.display, cm.doc, viewport)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 break
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178 } else if (first) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 update.visible = visibleLines(cm.display, cm.doc, viewport)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 if (!updateDisplayIfNeeded(cm, update)) break
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 updateHeightsInViewport(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 let barMeasure = measureForScrollbars(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 updateSelection(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 updateScrollbars(cm, barMeasure)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 setDocumentHeight(cm, barMeasure)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187 update.force = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 update.signal(cm, "update", cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191 if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192 update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197 export function updateDisplaySimple(cm, viewport) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198 let update = new DisplayUpdate(cm, viewport)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199 if (updateDisplayIfNeeded(cm, update)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 updateHeightsInViewport(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201 postUpdateDisplay(cm, update)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 let barMeasure = measureForScrollbars(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203 updateSelection(cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 updateScrollbars(cm, barMeasure)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205 setDocumentHeight(cm, barMeasure)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 update.finish()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
209
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
210 // Sync the actual display DOM structure with display.view, removing
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
211 // nodes for lines that are no longer in view, and creating the ones
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
212 // that are not there yet, and updating the ones that are out of
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
213 // date.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 function patchDisplay(cm, updateNumbersFrom, dims) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215 let display = cm.display, lineNumbers = cm.options.lineNumbers
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
216 let container = display.lineDiv, cur = container.firstChild
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
217
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
218 function rm(node) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
219 let next = node.nextSibling
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
220 // Works around a throw-scroll bug in OS X Webkit
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
221 if (webkit && mac && cm.display.currentWheelTarget == node)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
222 node.style.display = "none"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
223 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
224 node.parentNode.removeChild(node)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
225 return next
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
226 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
227
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
228 let view = display.view, lineN = display.viewFrom
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
229 // Loop over the elements in the view, syncing cur (the DOM nodes
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
230 // in display.lineDiv) with the view as we go.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
231 for (let i = 0; i < view.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
232 let lineView = view[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
233 if (lineView.hidden) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
234 } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
235 let node = buildLineElement(cm, lineView, lineN, dims)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
236 container.insertBefore(node, cur)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
237 } else { // Already drawn
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
238 while (cur != lineView.node) cur = rm(cur)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
239 let updateNumber = lineNumbers && updateNumbersFrom != null &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
240 updateNumbersFrom <= lineN && lineView.lineNumber
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
241 if (lineView.changes) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
242 if (indexOf(lineView.changes, "gutter") > -1) updateNumber = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
243 updateLineForChanges(cm, lineView, lineN, dims)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
244 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
245 if (updateNumber) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
246 removeChildren(lineView.lineNumber)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
247 lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
248 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
249 cur = lineView.node.nextSibling
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
250 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
251 lineN += lineView.size
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
252 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
253 while (cur) cur = rm(cur)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
254 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
255
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
256 export function updateGutterSpace(display) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
257 let width = display.gutters.offsetWidth
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
258 display.sizer.style.marginLeft = width + "px"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
259 // Send an event to consumers responding to changes in gutter width.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
260 signalLater(display, "gutterChanged", display)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
261 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
262
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
263 export function setDocumentHeight(cm, measure) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
264 cm.display.sizer.style.minHeight = measure.docHeight + "px"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
265 cm.display.heightForcer.style.top = measure.docHeight + "px"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
266 cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
267 }