(cm, event, pos, behavior)
| 145 | // Start a text drag. When it ends, see if any dragging actually |
| 146 | // happen, and treat as a click if it didn't. |
| 147 | function leftButtonStartDrag(cm, event, pos, behavior) { |
| 148 | let display = cm.display, moved = false |
| 149 | let dragEnd = operation(cm, e => { |
| 150 | if (webkit) display.scroller.draggable = false |
| 151 | cm.state.draggingText = false |
| 152 | if (cm.state.delayingBlurEvent) { |
| 153 | if (cm.hasFocus()) cm.state.delayingBlurEvent = false |
| 154 | else delayBlurEvent(cm) |
| 155 | } |
| 156 | off(display.wrapper.ownerDocument, "mouseup", dragEnd) |
| 157 | off(display.wrapper.ownerDocument, "mousemove", mouseMove) |
| 158 | off(display.scroller, "dragstart", dragStart) |
| 159 | off(display.scroller, "drop", dragEnd) |
| 160 | if (!moved) { |
| 161 | e_preventDefault(e) |
| 162 | if (!behavior.addNew) |
| 163 | extendSelection(cm.doc, pos, null, null, behavior.extend) |
| 164 | // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) |
| 165 | if ((webkit && !safari) || ie && ie_version == 9) |
| 166 | setTimeout(() => {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus()}, 20) |
| 167 | else |
| 168 | display.input.focus() |
| 169 | } |
| 170 | }) |
| 171 | let mouseMove = function(e2) { |
| 172 | moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10 |
| 173 | } |
| 174 | let dragStart = () => moved = true |
| 175 | // Let the drag handler handle this. |
| 176 | if (webkit) display.scroller.draggable = true |
| 177 | cm.state.draggingText = dragEnd |
| 178 | dragEnd.copy = !behavior.moveOnDrag |
| 179 | on(display.wrapper.ownerDocument, "mouseup", dragEnd) |
| 180 | on(display.wrapper.ownerDocument, "mousemove", mouseMove) |
| 181 | on(display.scroller, "dragstart", dragStart) |
| 182 | on(display.scroller, "drop", dragEnd) |
| 183 | |
| 184 | cm.state.delayingBlurEvent = true |
| 185 | setTimeout(() => display.input.focus(), 20) |
| 186 | // IE's approach to draggable |
| 187 | if (display.scroller.dragDrop) display.scroller.dragDrop() |
| 188 | } |
| 189 | |
| 190 | function rangeForUnit(cm, pos, unit) { |
| 191 | if (unit == "char") return new Range(pos, pos) |
no test coverage detected