annotate .cms/lib/codemirror/src/display/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 { gecko, ie, ie_version, mobile, webkit, chrome, chrome_version } from "../util/browser.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 import { elt, eltP } from "../util/dom.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 import { scrollerGap } from "../util/misc.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 import { getGutters, renderGutters } from "./gutters.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 // The display handles the DOM integration, both for input reading
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 // and content drawing. It holds references to DOM nodes and
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 // display-related state.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 export function Display(place, doc, input, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 let d = this
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 this.input = input
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 // Covers bottom-right square when both scrollbars are present.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 d.scrollbarFiller.setAttribute("cm-not-content", "true")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 // Covers bottom of gutter when coverGutterNextToScrollbar is on
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 // and h scrollbar is present.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 d.gutterFiller.setAttribute("cm-not-content", "true")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 // Will contain the actual code, positioned to cover the viewport.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 d.lineDiv = eltP("div", null, "CodeMirror-code")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 // Elements are added to these to represent selection and cursors.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 d.cursorDiv = elt("div", null, "CodeMirror-cursors")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 // A visibility: hidden element used to find the size of things.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 d.measure = elt("div", null, "CodeMirror-measure")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 // When lines outside of the viewport are measured, they are drawn in this.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 d.lineMeasure = elt("div", null, "CodeMirror-measure")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 // Wraps everything that needs to exist inside the vertically-padded coordinate system
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 null, "position: relative; outline: none")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 let lines = eltP("div", [d.lineSpace], "CodeMirror-lines")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 // Moved around its parent to cover visible view.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 d.mover = elt("div", [lines], null, "position: relative")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 // Set to the height of the document, allowing scrolling.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 d.sizer = elt("div", [d.mover], "CodeMirror-sizer")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 d.sizerWidth = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 // Behavior of elts with overflow: auto and padding is
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 // inconsistent across browsers. This is used to ensure the
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 // scrollable area is big enough.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 // Will contain the gutters, if any.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 d.gutters = elt("div", null, "CodeMirror-gutters")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 d.lineGutter = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 // Actual scrollable element.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 d.scroller.setAttribute("tabIndex", "-1")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 // The element in which the editor lives.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 // See #6982. FIXME remove when this has been fixed for a while in Chrome
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 if (chrome && chrome_version >= 105) d.wrapper.style.clipPath = "inset(0px)"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 // This attribute is respected by automatic translation systems such as Google Translate,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 // and may also be respected by tools used by human translators.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 d.wrapper.setAttribute('translate', 'no')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 if (!webkit && !(gecko && mobile)) d.scroller.draggable = true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 if (place) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 if (place.appendChild) place.appendChild(d.wrapper)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 else place(d.wrapper)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 // Current rendered range (may be bigger than the view window).
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 d.viewFrom = d.viewTo = doc.first
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 d.reportedViewFrom = d.reportedViewTo = doc.first
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 // Information about the rendered lines.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 d.view = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 d.renderedView = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 // Holds info about a single rendered line when it was rendered
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 // for measurement, while not in view.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 d.externalMeasured = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 // Empty space (in pixels) above the view
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 d.viewOffset = 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 d.lastWrapHeight = d.lastWrapWidth = 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 d.updateLineNumbers = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 d.nativeBarWidth = d.barHeight = d.barWidth = 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 d.scrollbarsClipped = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 // Used to only resize the line number gutter when necessary (when
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 // the amount of lines crosses a boundary that makes its width change)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 // Set to true when a non-horizontal-scrolling line widget is
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 // added. As an optimization, line widget aligning is skipped when
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 // this is false.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 d.alignWidgets = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 // Tracks the maximum line length so that the horizontal scrollbar
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 // can be kept static when scrolling.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 d.maxLine = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 d.maxLineLength = 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 d.maxLineChanged = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 // Used for measuring wheel scrolling granularity
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 // True when shift is held down.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 d.shift = false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 // Used to track whether anything happened since the context menu
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 // was opened.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 d.selForContextMenu = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 d.activeTouch = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 d.gutterSpecs = getGutters(options.gutters, options.lineNumbers)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 renderGutters(d)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 input.init(d)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 }