From bf88abd8d93ff0f42e67f07a68aab3751cdc7f17 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Thu, 17 Feb 2011 10:37:20 +0100 Subject: [PATCH] take into account that undos can have inserts and removes mixed --- lib/ace/edit_session.js | 68 +++++++++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 19 deletions(-) diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index a16b5ba4..539ca1f2 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -536,15 +536,7 @@ var EditSession = function(text, mode) { this.doc.revertDeltas(deltas); this.$fromUndo = false; - // update the selection - var firstDelta = deltas[0]; - var lastDelta = deltas[deltas.length-1]; - - this.selection.clearSelection(); - if (firstDelta.action == "insertText" || firstDelta.action == "insertLines") - this.selection.moveCursorToPosition(firstDelta.range.start); - if (firstDelta.action == "removeText" || firstDelta.action == "removeLines") - this.selection.setSelectionRange(Range.fromPoints(lastDelta.range.start, firstDelta.range.end)); + this.$setUndoSelection(deltas, true); }, this.redoChanges = function(deltas) { @@ -555,17 +547,55 @@ var EditSession = function(text, mode) { this.doc.applyDeltas(deltas); this.$fromUndo = false; - // update the selection - var firstDelta = deltas[0]; - var lastDelta = deltas[deltas.length-1]; - - this.selection.clearSelection(); - if (firstDelta.action == "insertText" || firstDelta.action == "insertLines") - this.selection.setSelectionRange(Range.fromPoints(firstDelta.range.start, lastDelta.range.end)); - if (firstDelta.action == "removeText" || firstDelta.action == "removeLines") - this.selection.moveCursorToPosition(lastDelta.range.start); + this.$setUndoSelection(deltas, false); }, + this.$setUndoSelection = function(deltas, isUndo) { + // invert deltas is they are an undo + if (isUndo) + deltas = deltas.map(function(delta) { + var d = { + range: delta.range + } + if (delta.action == "insertText" || delta.action == "insertLines") + d.action = "removeText" + else + d.action = "insertText" + return d; + }).reverse(); + + + var actions = [{}]; + + // collapse insert and remove operations + for (var i=0; i