annotate .cms/lib/codemirror/src/model/selection_updates.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 { signalLater } from "../util/operation_group.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 import { ensureCursorVisible } from "../display/scrolling.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 import { clipPos, cmp, Pos } from "../line/pos.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 import { getLine } from "../line/utils_line.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 import { hasHandler, signal, signalCursorActivity } from "../util/event.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 import { lst, sel_dontScroll } from "../util/misc.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 import { addSelectionToHistory } from "./history.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 import { normalizeSelection, Range, Selection, simpleSelection } from "./selection.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 // The 'scroll' parameter given to many of these indicated whether
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 // the new cursor position should be scrolled into view after
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 // modifying the selection.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 // If shift is held or the extend flag is set, extends a range to
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 // include a given position (and optionally a second position).
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 // Otherwise, simply returns the range between the given positions.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 // Used for cursor motion and such.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 export function extendRange(range, head, other, extend) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 if (extend) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 let anchor = range.anchor
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 if (other) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 let posBefore = cmp(head, anchor) < 0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 if (posBefore != (cmp(other, anchor) < 0)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 anchor = head
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 head = other
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 } else if (posBefore != (cmp(head, other) < 0)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 head = other
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 return new Range(anchor, head)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 return new Range(other || head, head)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 }
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 // Extend the primary selection range, discard the rest.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 export function extendSelection(doc, head, other, options, extend) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 if (extend == null) extend = doc.cm && (doc.cm.display.shift || doc.extend)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options)
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 // Extend all selections (pos is an array of selections with length
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 // equal the number of selections)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 export function extendSelections(doc, heads, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 let out = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 let extend = doc.cm && (doc.cm.display.shift || doc.extend)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 for (let i = 0; i < doc.sel.ranges.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 let newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 setSelection(doc, newSel, options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 // Updates a single range in the selection.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 export function replaceOneSelection(doc, i, range, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 let ranges = doc.sel.ranges.slice(0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 ranges[i] = range
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 // Reset the selection to a single range.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 export function setSimpleSelection(doc, anchor, head, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 setSelection(doc, simpleSelection(anchor, head), options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 // Give beforeSelectionChange handlers a change to influence a
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 // selection update.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 function filterSelectionChange(doc, sel, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 let obj = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 ranges: sel.ranges,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 update: function(ranges) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 this.ranges = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 for (let i = 0; i < ranges.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 clipPos(doc, ranges[i].head))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 origin: options && options.origin
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 signal(doc, "beforeSelectionChange", doc, obj)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 if (obj.ranges != sel.ranges) return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 else return sel
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 export function setSelectionReplaceHistory(doc, sel, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 let done = doc.history.done, last = lst(done)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 if (last && last.ranges) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 done[done.length - 1] = sel
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 setSelectionNoUndo(doc, sel, options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 setSelection(doc, sel, options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 // Set a new selection.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 export function setSelection(doc, sel, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 setSelectionNoUndo(doc, sel, options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options)
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 export function setSelectionNoUndo(doc, sel, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange"))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 sel = filterSelectionChange(doc, sel, options)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 let bias = options && options.bias ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption("readOnly") != "nocursor")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 ensureCursorVisible(doc.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 function setSelectionInner(doc, sel) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 if (sel.equals(doc.sel)) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 doc.sel = sel
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 if (doc.cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 doc.cm.curOp.updateInput = 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 doc.cm.curOp.selectionChanged = true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 signalCursorActivity(doc.cm)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 signalLater(doc, "cursorActivity", doc)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 // Verify that the selection does not partially select any atomic
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 // marked ranges.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 export function reCheckSelection(doc) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 // Return a selection that does not partially select any atomic
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 // ranges.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134 function skipAtomicInSelection(doc, sel, bias, mayClear) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 let out
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 for (let i = 0; i < sel.ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 let range = sel.ranges[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 let old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 let newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140 let newHead = range.head == range.anchor ? newAnchor : skipAtomic(doc, range.head, old && old.head, bias, mayClear)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 if (out || newAnchor != range.anchor || newHead != range.head) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 if (!out) out = sel.ranges.slice(0, i)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 out[i] = new Range(newAnchor, newHead)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 let line = getLine(doc, pos.line)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 if (line.markedSpans) for (let i = 0; i < line.markedSpans.length; ++i) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 let sp = line.markedSpans[i], m = sp.marker
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 // Determine if we should prevent the cursor being placed to the left/right of an atomic marker
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 // is with selectLeft/Right
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 let preventCursorLeft = ("selectLeft" in m) ? !m.selectLeft : m.inclusiveLeft
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 let preventCursorRight = ("selectRight" in m) ? !m.selectRight : m.inclusiveRight
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161 (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 if (mayClear) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163 signal(m, "beforeCursorEnter")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 if (m.explicitlyCleared) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 if (!line.markedSpans) break
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 else {--i; continue}
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
169 if (!m.atomic) continue
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
170
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
171 if (oldPos) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
172 let near = m.find(dir < 0 ? 1 : -1), diff
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
173 if (dir < 0 ? preventCursorRight : preventCursorLeft)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
174 near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
175 if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
176 return skipAtomicInner(doc, near, pos, dir, mayClear)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
177 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
178
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
179 let far = m.find(dir < 0 ? -1 : 1)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
180 if (dir < 0 ? preventCursorLeft : preventCursorRight)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
181 far = movePos(doc, far, dir, far.line == pos.line ? line : null)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
182 return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
183 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
184 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
185 return pos
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
186 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
187
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
188 // Ensure a given position is not inside an atomic range.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
189 export function skipAtomic(doc, pos, oldPos, bias, mayClear) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
190 let dir = bias || 1
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
191 let found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
192 (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
193 skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
194 (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
195 if (!found) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
196 doc.cantEdit = true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
197 return Pos(doc.first, 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
198 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
199 return found
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
200 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
201
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
202 function movePos(doc, pos, dir, line) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
203 if (dir < 0 && pos.ch == 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
204 if (pos.line > doc.first) return clipPos(doc, Pos(pos.line - 1))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
205 else return null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
206 } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
207 if (pos.line < doc.first + doc.size - 1) return Pos(pos.line + 1, 0)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
208 else return null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
209 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
210 return new Pos(pos.line, pos.ch + dir)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
211 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
212 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
213
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
214 export function selectAll(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
215 cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
216 }