(doc, type, allowSelectionOnly)
| 5298 | |
| 5299 | // Revert a change stored in a document's history. |
| 5300 | function makeChangeFromHistory(doc, type, allowSelectionOnly) { |
| 5301 | var suppress = doc.cm && doc.cm.state.suppressEdits; |
| 5302 | if (suppress && !allowSelectionOnly) { return } |
| 5303 | |
| 5304 | var hist = doc.history, event, selAfter = doc.sel; |
| 5305 | var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; |
| 5306 | |
| 5307 | // Verify that there is a useable event (so that ctrl-z won't |
| 5308 | // needlessly clear selection events) |
| 5309 | var i = 0; |
| 5310 | for (; i < source.length; i++) { |
| 5311 | event = source[i]; |
| 5312 | if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) |
| 5313 | { break } |
| 5314 | } |
| 5315 | if (i == source.length) { return } |
| 5316 | hist.lastOrigin = hist.lastSelOrigin = null; |
| 5317 | |
| 5318 | for (;;) { |
| 5319 | event = source.pop(); |
| 5320 | if (event.ranges) { |
| 5321 | pushSelectionToHistory(event, dest); |
| 5322 | if (allowSelectionOnly && !event.equals(doc.sel)) { |
| 5323 | setSelection(doc, event, {clearRedo: false}); |
| 5324 | return |
| 5325 | } |
| 5326 | selAfter = event; |
| 5327 | } else if (suppress) { |
| 5328 | source.push(event); |
| 5329 | return |
| 5330 | } else { break } |
| 5331 | } |
| 5332 | |
| 5333 | // Build up a reverse change object to add to the opposite history |
| 5334 | // stack (redo when undoing, and vice versa). |
| 5335 | var antiChanges = []; |
| 5336 | pushSelectionToHistory(selAfter, dest); |
| 5337 | dest.push({changes: antiChanges, generation: hist.generation}); |
| 5338 | hist.generation = event.generation || ++hist.maxGeneration; |
| 5339 | |
| 5340 | var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); |
| 5341 | |
| 5342 | var loop = function ( i ) { |
| 5343 | var change = event.changes[i]; |
| 5344 | change.origin = type; |
| 5345 | if (filter && !filterChange(doc, change, false)) { |
| 5346 | source.length = 0; |
| 5347 | return {} |
| 5348 | } |
| 5349 | |
| 5350 | antiChanges.push(historyChangeFromChange(doc, change)); |
| 5351 | |
| 5352 | var after = i ? computeSelAfterChange(doc, change) : lst(source); |
| 5353 | makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); |
| 5354 | if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); } |
| 5355 | var rebased = []; |
| 5356 | |
| 5357 | // Propagate to the linked documents |
no test coverage detected