|
2271 | 2271 | var range = doc.sel.ranges[i]; |
2272 | 2272 | var collapsed = range.empty(); |
2273 | 2273 | if (collapsed || cm.options.showCursorWhenSelecting) |
2274 | | - drawSelectionCursor(cm, range, curFragment); |
| 2274 | + drawSelectionCursor(cm, range.head, curFragment); |
2275 | 2275 | if (!collapsed) |
2276 | 2276 | drawSelectionRange(cm, range, selFragment); |
2277 | 2277 | } |
2278 | 2278 | return result; |
2279 | 2279 | } |
2280 | 2280 |
|
2281 | 2281 | // Draws a cursor for the given range |
2282 | | - function drawSelectionCursor(cm, range, output) { |
2283 | | - var pos = cursorCoords(cm, range.head, "div", null, null, !cm.options.singleCursorHeightPerLine); |
| 2282 | + function drawSelectionCursor(cm, head, output) { |
| 2283 | + var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); |
2284 | 2284 |
|
2285 | 2285 | var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); |
2286 | 2286 | cursor.style.left = pos.left + "px"; |
|
3444 | 3444 | on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); |
3445 | 3445 |
|
3446 | 3446 | d.dragFunctions = { |
3447 | | - simple: function(e) {if (!signalDOMEvent(cm, e)) e_stop(e);}, |
| 3447 | + enter: function(e) {if (!signalDOMEvent(cm, e)) e_stop(e);}, |
| 3448 | + over: function(e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }}, |
3448 | 3449 | start: function(e){onDragStart(cm, e);}, |
3449 | | - drop: operation(cm, onDrop) |
| 3450 | + drop: operation(cm, onDrop), |
| 3451 | + leave: function() {clearDragCursor(cm);} |
3450 | 3452 | }; |
3451 | 3453 |
|
3452 | 3454 | var inp = d.input.getField(); |
|
3463 | 3465 | var funcs = cm.display.dragFunctions; |
3464 | 3466 | var toggle = value ? on : off; |
3465 | 3467 | toggle(cm.display.scroller, "dragstart", funcs.start); |
3466 | | - toggle(cm.display.scroller, "dragenter", funcs.simple); |
3467 | | - toggle(cm.display.scroller, "dragover", funcs.simple); |
| 3468 | + toggle(cm.display.scroller, "dragenter", funcs.enter); |
| 3469 | + toggle(cm.display.scroller, "dragover", funcs.over); |
| 3470 | + toggle(cm.display.scroller, "dragleave", funcs.leave); |
3468 | 3471 | toggle(cm.display.scroller, "drop", funcs.drop); |
3469 | 3472 | } |
3470 | 3473 | } |
|
3787 | 3790 |
|
3788 | 3791 | function onDrop(e) { |
3789 | 3792 | var cm = this; |
| 3793 | + clearDragCursor(cm); |
3790 | 3794 | if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) |
3791 | 3795 | return; |
3792 | 3796 | e_preventDefault(e); |
|
3859 | 3863 | } |
3860 | 3864 | } |
3861 | 3865 |
|
| 3866 | + function onDragOver(cm, e) { |
| 3867 | + var pos = posFromMouse(cm, e); |
| 3868 | + if (!pos) return; |
| 3869 | + var frag = document.createDocumentFragment(); |
| 3870 | + drawSelectionCursor(cm, pos, frag); |
| 3871 | + if (!cm.display.dragCursor) { |
| 3872 | + cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); |
| 3873 | + cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); |
| 3874 | + } |
| 3875 | + removeChildrenAndAdd(cm.display.dragCursor, frag); |
| 3876 | + } |
| 3877 | + |
| 3878 | + function clearDragCursor(cm) { |
| 3879 | + if (cm.display.dragCursor) { |
| 3880 | + cm.display.lineSpace.removeChild(cm.display.dragCursor); |
| 3881 | + cm.display.dragCursor = null; |
| 3882 | + } |
| 3883 | + } |
| 3884 | + |
3862 | 3885 | // SCROLL EVENTS |
3863 | 3886 |
|
3864 | 3887 | // Sync the scrollable area and scrollbars, ensure the viewport |
|
0 commit comments