diff --git a/lib/codemirror.js b/lib/codemirror.js index 151925f7fb36f30abb76b97865e495ce00a43942..25d0bd3aa3890968183e4be33f6222301fde3220 100644 --- a/lib/codemirror.js +++ b/lib/codemirror.js @@ -2837,9 +2837,10 @@ lastClick = {time: now, pos: start}; } - var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey; + var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey, contained; if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) && - type == "single" && sel.contains(start) > -1 && sel.somethingSelected()) + type == "single" && (contained = sel.contains(start)) > -1 && + !sel.ranges[contained].empty()) leftButtonStartDrag(cm, e, start, modifier); else leftButtonSelect(cm, e, start, type, modifier); @@ -2878,11 +2879,11 @@ var display = cm.display, doc = cm.doc; e_preventDefault(e); - var ourRange, ourIndex, startSel = doc.sel; + var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges; if (addNew && !e.shiftKey) { ourIndex = doc.sel.contains(start); if (ourIndex > -1) - ourRange = doc.sel.ranges[ourIndex]; + ourRange = ranges[ourIndex]; else ourRange = new Range(start, start); } else { @@ -2914,12 +2915,15 @@ ourIndex = 0; setSelection(doc, new Selection([ourRange], 0), sel_mouse); startSel = doc.sel; - } else if (ourIndex > -1) { - replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); - } else { - ourIndex = doc.sel.ranges.length; - setSelection(doc, normalizeSelection(doc.sel.ranges.concat([ourRange]), ourIndex), + } else if (ourIndex == -1) { + ourIndex = ranges.length; + setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex), {scroll: false, origin: "*mouse"}); + } else if (ranges.length > 1 && ranges[ourIndex].empty()) { + setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0)); + startSel = doc.sel; + } else { + replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); } var lastPos = start;