|
1 | 1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others |
2 | 2 | // Distributed under an MIT license: https://codemirror.net/LICENSE |
3 | 3 |
|
| 4 | +var mac = /Mac/.test(navigator.platform); |
| 5 | + |
4 | 6 | (function(mod) { |
5 | 7 | if (typeof exports == "object" && typeof module == "object") // CommonJS |
6 | 8 | mod(require("../../lib/codemirror")); |
|
46 | 48 | completion.update(true); |
47 | 49 | }); |
48 | 50 |
|
| 51 | + CodeMirror.defineExtension("closeHint", function() { |
| 52 | + if (this.state.completionActive) this.state.completionActive.close() |
| 53 | + }) |
| 54 | + |
49 | 55 | function Completion(cm, options) { |
50 | 56 | this.cm = cm; |
51 | 57 | this.options = options; |
|
163 | 169 | Tab: handle.pick, |
164 | 170 | Esc: handle.close |
165 | 171 | }; |
| 172 | + |
| 173 | + if (mac) { |
| 174 | + baseMap["Ctrl-P"] = function() {handle.moveFocus(-1);}; |
| 175 | + baseMap["Ctrl-N"] = function() {handle.moveFocus(1);}; |
| 176 | + } |
| 177 | + |
166 | 178 | var custom = completion.options.customKeys; |
167 | 179 | var ourMap = custom ? {} : baseMap; |
168 | 180 | function addBinding(key, val) { |
|
198 | 210 | this.data = data; |
199 | 211 | this.picked = false; |
200 | 212 | var widget = this, cm = completion.cm; |
| 213 | + var ownerDocument = cm.getInputField().ownerDocument; |
| 214 | + var parentWindow = ownerDocument.defaultView || ownerDocument.parentWindow; |
201 | 215 |
|
202 | | - var hints = this.hints = document.createElement("ul"); |
| 216 | + var hints = this.hints = ownerDocument.createElement("ul"); |
203 | 217 | var theme = completion.cm.options.theme; |
204 | 218 | hints.className = "CodeMirror-hints " + theme; |
205 | 219 | this.selectedHint = data.selectedHint || 0; |
206 | 220 |
|
207 | 221 | var completions = data.list; |
208 | 222 | for (var i = 0; i < completions.length; ++i) { |
209 | | - var elt = hints.appendChild(document.createElement("li")), cur = completions[i]; |
| 223 | + var elt = hints.appendChild(ownerDocument.createElement("li")), cur = completions[i]; |
210 | 224 | var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS); |
211 | 225 | if (cur.className != null) className = cur.className + " " + className; |
212 | 226 | elt.className = className; |
213 | 227 | if (cur.render) cur.render(elt, data, cur); |
214 | | - else elt.appendChild(document.createTextNode(cur.displayText || getText(cur))); |
| 228 | + else elt.appendChild(ownerDocument.createTextNode(cur.displayText || getText(cur))); |
215 | 229 | elt.hintId = i; |
216 | 230 | } |
217 | 231 |
|
|
220 | 234 | hints.style.left = left + "px"; |
221 | 235 | hints.style.top = top + "px"; |
222 | 236 | // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor. |
223 | | - var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); |
224 | | - var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight); |
225 | | - (completion.options.container || document.body).appendChild(hints); |
| 237 | + var winW = parentWindow.innerWidth || Math.max(ownerDocument.body.offsetWidth, ownerDocument.documentElement.offsetWidth); |
| 238 | + var winH = parentWindow.innerHeight || Math.max(ownerDocument.body.offsetHeight, ownerDocument.documentElement.offsetHeight); |
| 239 | + (completion.options.container || ownerDocument.body).appendChild(hints); |
226 | 240 | var box = hints.getBoundingClientRect(), overlapY = box.bottom - winH; |
227 | 241 | var scrolls = hints.scrollHeight > hints.clientHeight + 1 |
228 | 242 | var startScroll = cm.getScrollInfo(); |
|
273 | 287 | cm.on("scroll", this.onScroll = function() { |
274 | 288 | var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect(); |
275 | 289 | var newTop = top + startScroll.top - curScroll.top; |
276 | | - var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop); |
| 290 | + var point = newTop - (parentWindow.pageYOffset || (ownerDocument.documentElement || ownerDocument.body).scrollTop); |
277 | 291 | if (!below) point += hints.offsetHeight; |
278 | 292 | if (point <= editor.top || point >= editor.bottom) return completion.close(); |
279 | 293 | hints.style.top = newTop + "px"; |
|
0 commit comments