diff --git a/src/editor/model.js b/src/editor/model.js index 1080df67ba..778797dad2 100644 --- a/src/editor/model.js +++ b/src/editor/model.js @@ -97,24 +97,26 @@ export default class EditorModel { if (diff.removed) { removedOffsetDecrease = this.removeText(position, diff.removed.length); } + const canOpenAutoComplete = inputType !== "insertFromPaste" && inputType !== "insertFromDrop"; let addedLen = 0; if (diff.added) { - addedLen = this._addText(position, diff.added); + // these shouldn't trigger auto-complete, you just want to append a piece of text + addedLen = this._addText(position, diff.added, {validate: canOpenAutoComplete}); } this._mergeAdjacentParts(); const caretOffset = diff.at - removedOffsetDecrease + addedLen; const newPosition = this.positionForOffset(caretOffset, true); - this._setActivePart(newPosition); + this._setActivePart(newPosition, canOpenAutoComplete); this._updateCallback(newPosition); } - _setActivePart(pos) { + _setActivePart(pos, canOpenAutoComplete) { const {index} = pos; const part = this._parts[index]; if (part) { if (index !== this._activePartIdx) { this._activePartIdx = index; - if (this._activePartIdx !== this._autoCompletePartIdx) { + if (canOpenAutoComplete && this._activePartIdx !== this._autoCompletePartIdx) { // else try to create one const ac = part.createAutoComplete(this._onAutoComplete); if (ac) { @@ -220,14 +222,16 @@ export default class EditorModel { * @return {Number} how far from position (in characters) the insertion ended. * This can be more than the length of `str` when crossing non-editable parts, which are skipped. */ - _addText(pos, str) { + _addText(pos, str, {validate=true}) { let {index} = pos; const {offset} = pos; let addLen = str.length; const part = this._parts[index]; if (part) { if (part.canEdit) { - if (part.insertAll(offset, str)) { + if (validate && part.validateAndInsert(offset, str)) { + str = null; + } else if (!validate && part.insert(offset, str)) { str = null; } else { const splitPart = part.split(offset); @@ -243,7 +247,12 @@ export default class EditorModel { } while (str) { const newPart = this._partCreator.createPartForInput(str); - str = newPart.appendUntilRejected(str); + if (validate) { + str = newPart.appendUntilRejected(str); + } else { + newPart.insert(0, str); + str = null; + } this._insertPart(index, newPart); index += 1; } diff --git a/src/editor/parts.js b/src/editor/parts.js index dc2c1e69a2..572a861024 100644 --- a/src/editor/parts.js +++ b/src/editor/parts.js @@ -69,7 +69,7 @@ class BasePart { // inserts str at offset if all the characters in str were accepted, otherwise don't do anything // return whether the str was accepted or not. - insertAll(offset, str) { + validateAndInsert(offset, str) { for (let i = 0; i < str.length; ++i) { const chr = str.charAt(i); if (!this.acceptsInsertion(chr)) { @@ -82,6 +82,16 @@ class BasePart { return true; } + insert(offset, str) { + if (this.canEdit) { + const beforeInsert = this._text.substr(0, offset); + const afterInsert = this._text.substr(offset); + this._text = beforeInsert + str + afterInsert; + return true; + } + return false; + } + createAutoComplete() {} trim(len) {