|
|
@@ -36,7 +36,7 @@ window.CodeMirror = (function() {
|
|
|
if (opera_version && opera_version >= 15) { opera = false; webkit = true; }
|
|
|
// Some browsers use the wrong event properties to signal cmd/ctrl on OS X
|
|
|
var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11));
|
|
|
- var captureMiddleClick = gecko || (old_ie && !ie_lt9);
|
|
|
+ var captureMiddleClick = gecko || (ie && !ie_lt9);
|
|
|
|
|
|
// Optimize some code when these features are not used
|
|
|
var sawReadOnlySpans = false, sawCollapsedSpans = false;
|
|
|
@@ -62,7 +62,8 @@ window.CodeMirror = (function() {
|
|
|
overlays: [],
|
|
|
modeGen: 0,
|
|
|
overwrite: false, focused: false,
|
|
|
- suppressEdits: false, pasteIncoming: false,
|
|
|
+ suppressEdits: false,
|
|
|
+ pasteIncoming: false, cutIncoming: false,
|
|
|
draggingText: false,
|
|
|
highlight: new Delayed()};
|
|
|
|
|
|
@@ -336,8 +337,9 @@ window.CodeMirror = (function() {
|
|
|
if (needsV) {
|
|
|
d.scrollbarV.style.display = "block";
|
|
|
d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0";
|
|
|
+ // A bug in IE8 can cause this value to be negative, so guard it.
|
|
|
d.scrollbarV.firstChild.style.height =
|
|
|
- (scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px";
|
|
|
+ Math.max(0, scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px";
|
|
|
} else {
|
|
|
d.scrollbarV.style.display = "";
|
|
|
d.scrollbarV.firstChild.style.height = "0";
|
|
|
@@ -1512,11 +1514,11 @@ window.CodeMirror = (function() {
|
|
|
|
|
|
var updateInput = cm.curOp.updateInput;
|
|
|
var changeEvent = {from: from, to: to, text: splitLines(inserted),
|
|
|
- origin: cm.state.pasteIncoming ? "paste" : "+input"};
|
|
|
+ origin: cm.state.pasteIncoming ? "paste" : cm.state.cutIncoming ? "cut" : "+input"};
|
|
|
makeChange(cm.doc, changeEvent, "end");
|
|
|
cm.curOp.updateInput = updateInput;
|
|
|
signalLater(cm, "inputRead", cm, changeEvent);
|
|
|
- if (!cm.state.pasteIncoming && cm.options.electricChars &&
|
|
|
+ if (inserted && !cm.state.pasteIncoming && cm.options.electricChars &&
|
|
|
cm.options.smartIndent && sel.head.ch < 100) {
|
|
|
var electric = cm.getModeAt(sel.head).electricChars;
|
|
|
if (electric) for (var i = 0; i < electric.length; i++)
|
|
|
@@ -1529,7 +1531,7 @@ window.CodeMirror = (function() {
|
|
|
if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = "";
|
|
|
else cm.display.prevInput = text;
|
|
|
if (withOp) endOperation(cm);
|
|
|
- cm.state.pasteIncoming = false;
|
|
|
+ cm.state.pasteIncoming = cm.state.cutIncoming = false;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@@ -1627,10 +1629,7 @@ window.CodeMirror = (function() {
|
|
|
}
|
|
|
setTimeout(unregister, 5000);
|
|
|
|
|
|
- on(d.input, "keyup", operation(cm, function(e) {
|
|
|
- if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
|
|
|
- if (e.keyCode == 16) cm.doc.sel.shift = false;
|
|
|
- }));
|
|
|
+ on(d.input, "keyup", operation(cm, onKeyUp));
|
|
|
on(d.input, "input", function() {
|
|
|
if (ie && !ie_lt9 && cm.display.inputHasSelection) cm.display.inputHasSelection = null;
|
|
|
fastPoll(cm);
|
|
|
@@ -1670,13 +1669,14 @@ window.CodeMirror = (function() {
|
|
|
fastPoll(cm);
|
|
|
});
|
|
|
|
|
|
- function prepareCopy() {
|
|
|
+ function prepareCopy(e) {
|
|
|
if (d.inaccurateSelection) {
|
|
|
d.prevInput = "";
|
|
|
d.inaccurateSelection = false;
|
|
|
d.input.value = cm.getSelection();
|
|
|
selectInput(d.input);
|
|
|
}
|
|
|
+ if (e.type == "cut") cm.state.cutIncoming = true;
|
|
|
}
|
|
|
on(d.input, "cut", prepareCopy);
|
|
|
on(d.input, "copy", prepareCopy);
|
|
|
@@ -1723,6 +1723,7 @@ window.CodeMirror = (function() {
|
|
|
}
|
|
|
if (clickInGutter(cm, e)) return;
|
|
|
var start = posFromMouse(cm, e);
|
|
|
+ window.focus();
|
|
|
|
|
|
switch (e_button(e)) {
|
|
|
case 3:
|
|
|
@@ -1768,6 +1769,9 @@ window.CodeMirror = (function() {
|
|
|
e_preventDefault(e2);
|
|
|
extendSelection(cm.doc, start);
|
|
|
focusInput(cm);
|
|
|
+ // Work around unexplainable focus problem in IE9 (#2127)
|
|
|
+ if (old_ie && !ie_lt9)
|
|
|
+ setTimeout(function() {document.body.focus(); focusInput(cm);}, 20);
|
|
|
}
|
|
|
});
|
|
|
// Let the drag handler handle this.
|
|
|
@@ -1987,7 +1991,7 @@ window.CodeMirror = (function() {
|
|
|
// know one. These don't have to be accurate -- the result of them
|
|
|
// being wrong would just be a slight flicker on the first wheel
|
|
|
// scroll (if it is large enough).
|
|
|
- if (old_ie) wheelPixelsPerUnit = -.53;
|
|
|
+ if (ie) wheelPixelsPerUnit = -.53;
|
|
|
else if (gecko) wheelPixelsPerUnit = 15;
|
|
|
else if (chrome) wheelPixelsPerUnit = -.7;
|
|
|
else if (safari) wheelPixelsPerUnit = -1/3;
|
|
|
@@ -2136,6 +2140,12 @@ window.CodeMirror = (function() {
|
|
|
return handled;
|
|
|
}
|
|
|
|
|
|
+ function onKeyUp(e) {
|
|
|
+ var cm = this;
|
|
|
+ if (signalDOMEvent(cm, e) || cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return;
|
|
|
+ if (e.keyCode == 16) cm.doc.sel.shift = false;
|
|
|
+ }
|
|
|
+
|
|
|
var lastStoppedKey = null;
|
|
|
function onKeyDown(e) {
|
|
|
var cm = this;
|
|
|
@@ -2232,7 +2242,7 @@ window.CodeMirror = (function() {
|
|
|
|
|
|
// Try to detect the user choosing select-all
|
|
|
if (display.input.selectionStart != null) {
|
|
|
- if (!old_ie || ie_lt9) prepareSelectAllHack();
|
|
|
+ if (!ie || ie_lt9) prepareSelectAllHack();
|
|
|
clearTimeout(detectingSelectAll);
|
|
|
var i = 0, poll = function(){
|
|
|
if (display.prevInput == "\u200b" && display.input.selectionStart == 0)
|
|
|
@@ -2244,7 +2254,7 @@ window.CodeMirror = (function() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (old_ie && !ie_lt9) prepareSelectAllHack();
|
|
|
+ if (ie && !ie_lt9) prepareSelectAllHack();
|
|
|
if (captureMiddleClick) {
|
|
|
e_stop(e);
|
|
|
var mouseup = function() {
|
|
|
@@ -3151,8 +3161,13 @@ window.CodeMirror = (function() {
|
|
|
},
|
|
|
|
|
|
triggerOnKeyDown: operation(null, onKeyDown),
|
|
|
+ triggerOnKeyPress: operation(null, onKeyPress),
|
|
|
+ triggerOnKeyUp: operation(null, onKeyUp),
|
|
|
|
|
|
- execCommand: function(cmd) {return commands[cmd](this);},
|
|
|
+ execCommand: function(cmd) {
|
|
|
+ if (commands.hasOwnProperty(cmd))
|
|
|
+ return commands[cmd](this);
|
|
|
+ },
|
|
|
|
|
|
findPosH: function(from, amount, unit, visually) {
|
|
|
var dir = 1;
|
|
|
@@ -3214,8 +3229,10 @@ window.CodeMirror = (function() {
|
|
|
this.display.cursor.className += " CodeMirror-overwrite";
|
|
|
else
|
|
|
this.display.cursor.className = this.display.cursor.className.replace(" CodeMirror-overwrite", "");
|
|
|
+
|
|
|
+ signal(this, "overwriteToggle", this, this.state.overwrite);
|
|
|
},
|
|
|
- hasFocus: function() { return this.state.focused; },
|
|
|
+ hasFocus: function() { return document.activeElement == this.display.input; },
|
|
|
|
|
|
scrollTo: operation(null, function(x, y) {
|
|
|
updateScrollPos(this, x, y);
|
|
|
@@ -3256,16 +3273,19 @@ window.CodeMirror = (function() {
|
|
|
if (this.options.lineWrapping)
|
|
|
this.display.measureLineCache.length = this.display.measureLineCachePos = 0;
|
|
|
this.curOp.forceUpdate = true;
|
|
|
+ signal(this, "refresh", this);
|
|
|
}),
|
|
|
|
|
|
operation: function(f){return runInOp(this, f);},
|
|
|
|
|
|
refresh: operation(null, function() {
|
|
|
- var badHeight = this.display.cachedTextHeight == null;
|
|
|
+ var oldHeight = this.display.cachedTextHeight;
|
|
|
clearCaches(this);
|
|
|
updateScrollPos(this, this.doc.scrollLeft, this.doc.scrollTop);
|
|
|
regChange(this);
|
|
|
- if (badHeight) estimateLineHeights(this);
|
|
|
+ if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)
|
|
|
+ estimateLineHeights(this);
|
|
|
+ signal(this, "refresh", this);
|
|
|
}),
|
|
|
|
|
|
swapDoc: operation(null, function(doc) {
|
|
|
@@ -3619,7 +3639,7 @@ window.CodeMirror = (function() {
|
|
|
// default. Unknown commands are simply ignored.
|
|
|
keyMap.pcDefault = {
|
|
|
"Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
|
|
|
- "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
|
|
|
+ "Ctrl-Home": "goDocStart", "Ctrl-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
|
|
|
"Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
|
|
|
"Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
|
|
|
"Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
|
|
|
@@ -4467,7 +4487,7 @@ window.CodeMirror = (function() {
|
|
|
function interpretTokenStyle(style, builder) {
|
|
|
if (!style) return null;
|
|
|
for (;;) {
|
|
|
- var lineClass = style.match(/(?:^|\s)line-(background-)?(\S+)/);
|
|
|
+ var lineClass = style.match(/(?:^|\s+)line-(background-)?(\S+)/);
|
|
|
if (!lineClass) break;
|
|
|
style = style.slice(0, lineClass.index) + style.slice(lineClass.index + lineClass[0].length);
|
|
|
var prop = lineClass[1] ? "bgClass" : "textClass";
|
|
|
@@ -4476,9 +4496,10 @@ window.CodeMirror = (function() {
|
|
|
else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(builder[prop]))
|
|
|
builder[prop] += " " + lineClass[2];
|
|
|
}
|
|
|
+ if (/^\s*$/.test(style)) return null;
|
|
|
var cache = builder.cm.options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
|
|
|
return cache[style] ||
|
|
|
- (cache[style] = "cm-" + style.replace(/ +/g, " cm-"));
|
|
|
+ (cache[style] = style.replace(/\S+/g, "cm-$&"));
|
|
|
}
|
|
|
|
|
|
function buildLineContent(cm, realLine, measure, copyWidgets) {
|
|
|
@@ -4495,7 +4516,7 @@ window.CodeMirror = (function() {
|
|
|
builder.measure = line == realLine && measure;
|
|
|
builder.pos = 0;
|
|
|
builder.addToken = builder.measure ? buildTokenMeasure : buildToken;
|
|
|
- if ((old_ie || webkit) && cm.getOption("lineWrapping"))
|
|
|
+ if ((ie || webkit) && cm.getOption("lineWrapping"))
|
|
|
builder.addToken = buildTokenSplitSpaces(builder.addToken);
|
|
|
var next = insertLineContent(line, builder, getLineStyles(cm, line));
|
|
|
if (measure && line == realLine && !builder.measuredSomething) {
|
|
|
@@ -5311,6 +5332,8 @@ window.CodeMirror = (function() {
|
|
|
hist.lastTime = time;
|
|
|
hist.lastOp = opId;
|
|
|
hist.lastOrigin = change.origin;
|
|
|
+
|
|
|
+ if (!last) signal(doc, "historyAdded");
|
|
|
}
|
|
|
|
|
|
function removeClearedSpans(spans) {
|
|
|
@@ -6033,7 +6056,7 @@ window.CodeMirror = (function() {
|
|
|
|
|
|
// THE END
|
|
|
|
|
|
- CodeMirror.version = "3.20.1";
|
|
|
+ CodeMirror.version = "3.21.1";
|
|
|
|
|
|
return CodeMirror;
|
|
|
})();
|