remove delta.range
This commit is contained in:
parent
b5af2c898c
commit
4299db01bd
15 changed files with 136 additions and 155 deletions
|
|
@ -111,14 +111,13 @@ var Anchor = exports.Anchor = function(doc, row, column) {
|
|||
}
|
||||
|
||||
this.$getTransformedPoint = function (delta, point) {
|
||||
|
||||
// Get delta info.
|
||||
var moveIfEqual = this.$insertRight;
|
||||
var deltaIsInsert = (delta.action == 'insert')
|
||||
var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.range.end.row - delta.range.start.row);
|
||||
var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.range.end.column - delta.range.start.column);
|
||||
var deltaStart = delta.range.start;
|
||||
var deltaEnd = (deltaIsInsert ? deltaStart : delta.range.end); // Collapse insert range.
|
||||
var deltaIsInsert = (delta.action == "insert")
|
||||
var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);
|
||||
var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);
|
||||
var deltaStart = delta.start;
|
||||
var deltaEnd = (deltaIsInsert ? deltaStart : delta.end); // Collapse insert range.
|
||||
|
||||
// DELTA AFTER POINT: No change needed.
|
||||
if ($pointsInOrder(point, deltaStart, moveIfEqual)) {
|
||||
|
|
@ -137,8 +136,8 @@ var Anchor = exports.Anchor = function(doc, row, column) {
|
|||
}
|
||||
|
||||
// DELTA ENVELOPS POINT (delete only): Move point to delta start.
|
||||
if (delta.action != 'remove')
|
||||
throw 'Delete action expected.';
|
||||
if (delta.action != "remove")
|
||||
throw "Delete action expected.";
|
||||
|
||||
return {
|
||||
row: deltaStart.row,
|
||||
|
|
@ -181,7 +180,7 @@ var Anchor = exports.Anchor = function(doc, row, column) {
|
|||
};
|
||||
|
||||
/**
|
||||
* When called, the `'change'` event listener is removed.
|
||||
* When called, the `"change"` event listener is removed.
|
||||
*
|
||||
**/
|
||||
this.detach = function() {
|
||||
|
|
|
|||
|
|
@ -41,12 +41,12 @@ function splitLine (docLines, position) {
|
|||
|
||||
function joinLineWithNext(docLines, row) {
|
||||
docLines[row] += docLines[row + 1];
|
||||
docLines.splice(row + 1, 1);
|
||||
docLines.splice(row + 1, 1);
|
||||
}
|
||||
|
||||
function throwDeltaError(delta, errorText){
|
||||
console.log('Invalid Delta:', delta);
|
||||
throw 'Invalid Delta: ' + errorText;
|
||||
console.log("Invalid Delta:", delta);
|
||||
throw "Invalid Delta: " + errorText;
|
||||
}
|
||||
|
||||
function positionInDocument(docLines, position) {
|
||||
|
|
@ -57,32 +57,32 @@ function positionInDocument(docLines, position) {
|
|||
function validateDelta(docLines, delta) {
|
||||
|
||||
// Validate action string.
|
||||
if (delta.action != 'insert' && delta.action != 'remove')
|
||||
throwDeltaError(delta, 'delta.action must be "insert" or "remove"');
|
||||
if (delta.action != "insert" && delta.action != "remove")
|
||||
throwDeltaError(delta, "delta.action must be 'insert' or 'remove'");
|
||||
|
||||
// Validate lines type.
|
||||
if (!(delta.lines instanceof Array))
|
||||
throwDeltaError(delta, 'delta.lines must be an Array');
|
||||
throwDeltaError(delta, "delta.lines must be an Array");
|
||||
|
||||
// Validate range type.
|
||||
if (!(delta.range instanceof Range))
|
||||
throwDeltaError(delta, 'delta.range must be an instance of the Range class');
|
||||
if (!delta.start || !delta.end)
|
||||
throwDeltaError(delta, "delta.start/end must be an present");
|
||||
|
||||
// Validate that the start point is contained in the document.
|
||||
var start = delta.range.start;
|
||||
if (!positionInDocument(docLines, delta.range.start))
|
||||
throwDeltaError(delta, 'delta.range.start must be contained in document');
|
||||
var start = delta.start;
|
||||
if (!positionInDocument(docLines, delta.start))
|
||||
throwDeltaError(delta, "delta.start must be contained in document");
|
||||
|
||||
// Validate that the end point is contained in the document (remove deltas only).
|
||||
var end = delta.range.end;
|
||||
if (delta.action == 'remove' && !positionInDocument(docLines, end))
|
||||
throwDeltaError(delta, 'delta.range.end must contained in document for "remove" actions');
|
||||
var end = delta.end;
|
||||
if (delta.action == "remove" && !positionInDocument(docLines, end))
|
||||
throwDeltaError(delta, "delta.end must contained in document for 'remove' actions");
|
||||
|
||||
// Validate that the .range size matches the .lines size.
|
||||
var numRangeRows = end.row - start.row;
|
||||
var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));
|
||||
if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)
|
||||
throwDeltaError(delta, 'delta.range must match delta lines');
|
||||
throwDeltaError(delta, "delta.range must match delta lines");
|
||||
}
|
||||
|
||||
exports.applyDelta = function(docLines, delta, doNotValidate) {
|
||||
|
|
@ -92,21 +92,21 @@ exports.applyDelta = function(docLines, delta, doNotValidate) {
|
|||
validateDelta(docLines, delta);
|
||||
|
||||
// Apply delta.
|
||||
if (delta.range.start.row == delta.range.end.row) {
|
||||
if (delta.start.row == delta.end.row) {
|
||||
// Apply single-line delta.
|
||||
// Note: The multi-line code below correctly handle single-line
|
||||
// deltas too, but we need to short-circuit for speed.
|
||||
var row = delta.range.start.row;
|
||||
var startColumn = delta.range.start.column;
|
||||
var endColumn = delta.range.end.column;
|
||||
var row = delta.start.row;
|
||||
var startColumn = delta.start.column;
|
||||
var endColumn = delta.end.column;
|
||||
var line = docLines[row];
|
||||
switch (delta.action) {
|
||||
|
||||
case 'insert':
|
||||
case "insert":
|
||||
docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);
|
||||
break;
|
||||
|
||||
case 'remove':
|
||||
case "remove":
|
||||
docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);
|
||||
break;
|
||||
}
|
||||
|
|
@ -114,22 +114,21 @@ exports.applyDelta = function(docLines, delta, doNotValidate) {
|
|||
|
||||
// Apply multi-line delta.
|
||||
switch (delta.action) {
|
||||
|
||||
case 'insert':
|
||||
splitLine(docLines, delta.range.start);
|
||||
docLines.splice.apply(docLines, [delta.range.start.row + 1, 0].concat(delta.lines));
|
||||
joinLineWithNext(docLines, delta.range.start.row);
|
||||
joinLineWithNext(docLines, delta.range.end.row);
|
||||
case "insert":
|
||||
splitLine(docLines, delta.start);
|
||||
docLines.splice.apply(docLines, [delta.start.row + 1, 0].concat(delta.lines));
|
||||
joinLineWithNext(docLines, delta.start.row);
|
||||
joinLineWithNext(docLines, delta.end.row);
|
||||
break;
|
||||
|
||||
case 'remove':
|
||||
splitLine(docLines, delta.range.end);
|
||||
splitLine(docLines, delta.range.start);
|
||||
case "remove":
|
||||
splitLine(docLines, delta.end);
|
||||
splitLine(docLines, delta.start);
|
||||
docLines.splice(
|
||||
delta.range.start.row + 1, // Where to start deleting
|
||||
delta.range.end.row - delta.range.start.row + 1 // Num lines to delete.
|
||||
delta.start.row + 1, // Where to start deleting
|
||||
delta.end.row - delta.start.row + 1 // Num lines to delete.
|
||||
);
|
||||
joinLineWithNext(docLines, delta.range.start.row);
|
||||
joinLineWithNext(docLines, delta.start.row);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -177,13 +177,12 @@ var BackgroundTokenizer = function(tokenizer, editor) {
|
|||
}
|
||||
|
||||
this.$updateOnChange = function(delta) {
|
||||
var range = delta.range;
|
||||
var startRow = range.start.row;
|
||||
var len = range.end.row - startRow;
|
||||
var startRow = delta.start.row;
|
||||
var len = delta.end.row - startRow;
|
||||
|
||||
if (len === 0) {
|
||||
this.lines[startRow] = null;
|
||||
} else if (delta.action == 'remove') {
|
||||
} else if (delta.action == "remove") {
|
||||
this.lines.splice(startRow, len + 1, null);
|
||||
this.states.splice(startRow, len + 1, null);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ var EventEmitter = require("../lib/event_emitter").EventEmitter;
|
|||
|
||||
/**
|
||||
* new CommandManager(platform, commands)
|
||||
* @param {String} platform Identifier for the platform; must be either `'mac'` or `'win'`
|
||||
* @param {String} platform Identifier for the platform; must be either `"mac"` or `"win"`
|
||||
* @param {Array} commands A list of commands
|
||||
*
|
||||
**/
|
||||
|
|
@ -33,7 +33,7 @@ oop.inherits(CommandManager, HashHandler);
|
|||
oop.implement(this, EventEmitter);
|
||||
|
||||
this.exec = function(command, editor, args) {
|
||||
if (typeof command === 'string')
|
||||
if (typeof command === "string")
|
||||
command = this.commands[command];
|
||||
|
||||
if (!command)
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ var Anchor = require("./anchor").Anchor;
|
|||
**/
|
||||
|
||||
var Document = function(textOrLines) {
|
||||
this.$lines = [''];
|
||||
this.$lines = [""];
|
||||
|
||||
// There has to be one line at least in the document. If you pass an empty
|
||||
// string to the insert function, nothing will happen. Workaround.
|
||||
|
|
@ -99,7 +99,7 @@ var Document = function(textOrLines) {
|
|||
};
|
||||
|
||||
/**
|
||||
* Splits a string of text on any newline (`\n`) or carriage-return ('\r') characters.
|
||||
* Splits a string of text on any newline (`\n`) or carriage-return (`\r`) characters.
|
||||
*
|
||||
* @method $split
|
||||
* @param {String} text The text to work with
|
||||
|
|
@ -225,12 +225,9 @@ var Document = function(textOrLines) {
|
|||
this.getLinesForRange = function(range) {
|
||||
var lines;
|
||||
if (range.start.row == range.end.row) {
|
||||
|
||||
// Handle a single-line range.
|
||||
lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];
|
||||
|
||||
lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)];
|
||||
} else {
|
||||
|
||||
// Handle a multi-line range.
|
||||
lines = this.getLines(range.start.row, range.end.row);
|
||||
lines[0] = (lines[0] || "").substring(range.start.column);
|
||||
|
|
@ -254,7 +251,6 @@ var Document = function(textOrLines) {
|
|||
};
|
||||
|
||||
this.$getClippedRange = function(range) {
|
||||
|
||||
// Get Range object.
|
||||
if (!range instanceof Range)
|
||||
range = Range.fromPoints(range.start, range.end);
|
||||
|
|
@ -267,16 +263,16 @@ var Document = function(textOrLines) {
|
|||
|
||||
// Deprecated methods retained for backwards compatibility.
|
||||
this.insertLines = function(row, lines) {
|
||||
console.warn('Use of document.insertLines is deprecated. Use the insertFullLines method instead.');
|
||||
console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead.");
|
||||
return this.insertFullLines(row, lines);
|
||||
};
|
||||
this.removeLines = function(firstRow, lastRow) {
|
||||
console.warn('Use of document.removeLines is deprecated. Use the removeFullLines method instead.');
|
||||
console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead.");
|
||||
return this.removeFullLines(firstRow, lastRow);
|
||||
};
|
||||
this.insertNewLine = function(position) {
|
||||
console.warn('Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead.');
|
||||
return this.insertMergedLines(position, ['', '']);
|
||||
console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead.");
|
||||
return this.insertMergedLines(position, ["", ""]);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -287,7 +283,6 @@ var Document = function(textOrLines) {
|
|||
*
|
||||
**/
|
||||
this.insert = function(position, text) {
|
||||
|
||||
// Only detect new lines if the document has no line break yet.
|
||||
if (this.getLength() <= 1)
|
||||
this.$detectNewLine(text);
|
||||
|
|
@ -296,7 +291,7 @@ var Document = function(textOrLines) {
|
|||
};
|
||||
|
||||
/**
|
||||
* Inserts `text` into the `position` at the current row. This method also triggers the `'change'` event.
|
||||
* Inserts `text` into the `position` at the current row. This method also triggers the `"change"` event.
|
||||
*
|
||||
* This differs from the `insert` method in two ways:
|
||||
* 1. This does NOT handle newline characters (single-line text only).
|
||||
|
|
@ -310,7 +305,6 @@ var Document = function(textOrLines) {
|
|||
* ```
|
||||
**/
|
||||
this.insertInLine = function(position, text) {
|
||||
|
||||
// Calculate insertion range end point.
|
||||
this.$clipPosition(position);
|
||||
var endPoint = {
|
||||
|
|
@ -318,10 +312,12 @@ var Document = function(textOrLines) {
|
|||
column : position.column + text.length
|
||||
};
|
||||
|
||||
var range = Range.fromPoints(position, endPoint);
|
||||
// Apply delta (emits change).
|
||||
this.applyDelta({
|
||||
action: "insert",
|
||||
range: Range.fromPoints(position, endPoint),
|
||||
start: range.start,
|
||||
end: range.end,
|
||||
lines: [text]
|
||||
}, true /*doNotValidate*/);
|
||||
|
||||
|
|
@ -346,7 +342,7 @@ var Document = function(textOrLines) {
|
|||
**/
|
||||
|
||||
/**
|
||||
* Inserts the elements in `lines` into the document as full lines (does not merge with existing line), starting at the row index given by `row`. This method also triggers the `'change'` event.
|
||||
* Inserts the elements in `lines` into the document as full lines (does not merge with existing line), starting at the row index given by `row`. This method also triggers the `"change"` event.
|
||||
* @param {Number} row The index of the row to insert at
|
||||
* @param {Array} lines An array of strings
|
||||
* @returns {Object} Contains the final row and column, like this:
|
||||
|
|
@ -368,11 +364,11 @@ var Document = function(textOrLines) {
|
|||
var column = 0;
|
||||
if (row < this.getLength()) {
|
||||
// Insert before the specified row.
|
||||
lines = lines.concat(['']);
|
||||
lines = lines.concat([""]);
|
||||
column = 0;
|
||||
} else {
|
||||
// Insert after the last row in the document.
|
||||
lines = [''].concat(lines);
|
||||
lines = [""].concat(lines);
|
||||
row--;
|
||||
column = this.$lines[row].length;
|
||||
}
|
||||
|
|
@ -382,7 +378,7 @@ var Document = function(textOrLines) {
|
|||
};
|
||||
|
||||
/**
|
||||
* Inserts the elements in `lines` into the document, starting at the position index given by `row`. This method also triggers the `'change'` event.
|
||||
* Inserts the elements in `lines` into the document, starting at the position index given by `row`. This method also triggers the `"change"` event.
|
||||
* @param {Number} row The index of the row to insert at
|
||||
* @param {Array} lines An array of strings
|
||||
* @returns {Object} Contains the final row and column, like this:
|
||||
|
|
@ -396,7 +392,6 @@ var Document = function(textOrLines) {
|
|||
*
|
||||
**/
|
||||
this.insertMergedLines = function(position, lines) {
|
||||
|
||||
// Calculate insertion range end point.
|
||||
this.$clipPosition(position);
|
||||
var endPoint = {
|
||||
|
|
@ -407,7 +402,8 @@ var Document = function(textOrLines) {
|
|||
// Apply delta (emits change).
|
||||
this.applyDelta({
|
||||
action: "insert",
|
||||
range: Range.fromPoints(position, endPoint),
|
||||
start: position,
|
||||
end: endPoint,
|
||||
lines: lines
|
||||
});
|
||||
|
||||
|
|
@ -421,19 +417,19 @@ var Document = function(textOrLines) {
|
|||
*
|
||||
**/
|
||||
this.remove = function(range) {
|
||||
|
||||
// Apply delta (emits change).
|
||||
range = this.$getClippedRange(range);
|
||||
this.applyDelta({
|
||||
action: 'remove',
|
||||
range: range,
|
||||
action: "remove",
|
||||
start: range.start,
|
||||
end: range.end,
|
||||
lines: this.getLinesForRange(range),
|
||||
});
|
||||
return range.start;
|
||||
return range.start;
|
||||
};
|
||||
|
||||
/**
|
||||
* Removes the specified columns from the `row`. This method also triggers the `'change'` event.
|
||||
* Removes the specified columns from the `row`. This method also triggers the `"change"` event.
|
||||
* @param {Number} row The row to remove from
|
||||
* @param {Number} startColumn The column to start removing at
|
||||
* @param {Number} endColumn The column to stop removing at
|
||||
|
|
@ -441,15 +437,15 @@ var Document = function(textOrLines) {
|
|||
*
|
||||
**/
|
||||
this.removeInLine = function(row, startColumn, endColumn) {
|
||||
|
||||
// Calculate deleteion range.
|
||||
var range = new Range(row, startColumn, row, endColumn);
|
||||
range = this.$getClippedRange(range);
|
||||
|
||||
// Apply delta (emits change).
|
||||
this.applyDelta({
|
||||
action: 'remove',
|
||||
range: range,
|
||||
action: "remove",
|
||||
start: range.start,
|
||||
end: range.end,
|
||||
lines: this.getLinesForRange(range),
|
||||
}, true /*doNotValidate*/);
|
||||
|
||||
|
|
@ -457,14 +453,13 @@ var Document = function(textOrLines) {
|
|||
};
|
||||
|
||||
/**
|
||||
* Removes a range of full lines. This method also triggers the `'change'` event.
|
||||
* Removes a range of full lines. This method also triggers the `"change"` event.
|
||||
* @param {Number} firstRow The first row to be removed
|
||||
* @param {Number} lastRow The last row to be removed
|
||||
* @returns {[String]} Returns all the removed lines.
|
||||
*
|
||||
**/
|
||||
this.removeFullLines = function(firstRow, lastRow) {
|
||||
|
||||
// Clip to document.
|
||||
firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);
|
||||
lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1);
|
||||
|
|
@ -485,8 +480,9 @@ var Document = function(textOrLines) {
|
|||
|
||||
// Apply delta (emits change).
|
||||
this.applyDelta({
|
||||
action: 'remove',
|
||||
range: range,
|
||||
action: "remove",
|
||||
start: range.start,
|
||||
end: range.end,
|
||||
lines: this.getLinesForRange(range)
|
||||
});
|
||||
|
||||
|
|
@ -495,18 +491,19 @@ var Document = function(textOrLines) {
|
|||
};
|
||||
|
||||
/**
|
||||
* Removes the new line between `row` and the row immediately following it. This method also triggers the `'change'` event.
|
||||
* Removes the new line between `row` and the row immediately following it. This method also triggers the `"change"` event.
|
||||
* @param {Number} row The row to check
|
||||
*
|
||||
**/
|
||||
this.removeNewLine = function(row) {
|
||||
|
||||
if (row < this.getLength() - 1 && row >= 0) {
|
||||
var range = new Range(row, this.getLine(row).length, row + 1, 0);
|
||||
// Apply delta (emits change).
|
||||
this.applyDelta({
|
||||
action: 'remove',
|
||||
range: new Range(row, this.getLine(row).length, row + 1, 0),
|
||||
lines: ['', '']
|
||||
action: "remove",
|
||||
start: range.start,
|
||||
end: range.end,
|
||||
lines: ["", ""]
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -546,7 +543,7 @@ var Document = function(textOrLines) {
|
|||
|
||||
/**
|
||||
* Applies all changes in `deltas` to the document.
|
||||
* @param {Array} deltas An array of delta objects (can include 'insert' and 'remove' actions)
|
||||
* @param {Array} deltas An array of delta objects (can include "insert" and "remove" actions)
|
||||
**/
|
||||
this.applyDeltas = function(deltas) {
|
||||
for (var i=0; i<deltas.length; i++) {
|
||||
|
|
@ -556,7 +553,7 @@ var Document = function(textOrLines) {
|
|||
|
||||
/**
|
||||
* Reverts all changes in `deltas` from the document.
|
||||
* @param {Array} deltas An array of delta objects (can include 'insert' and 'remove' actions)
|
||||
* @param {Array} deltas An array of delta objects (can include "insert" and "remove" actions)
|
||||
**/
|
||||
this.revertDeltas = function(deltas) {
|
||||
for (var i=deltas.length-1; i>=0; i--) {
|
||||
|
|
@ -566,12 +563,11 @@ var Document = function(textOrLines) {
|
|||
|
||||
/**
|
||||
* Applies `delta` to the document.
|
||||
* @param {Object} delta A delta object (can include 'insert' and 'remove' actions)
|
||||
* @param {Object} delta A delta object (can include "insert" and "remove" actions)
|
||||
**/
|
||||
this.applyDelta = function(delta, doNotValidate) {
|
||||
|
||||
// An empty range is a NOOP.
|
||||
if (delta.range.isEmpty())
|
||||
if (!Range.comparePoints(delta.start, delta.end))
|
||||
return;
|
||||
|
||||
// Split large insert deltas. This is necessary because:
|
||||
|
|
@ -582,37 +578,40 @@ var Document = function(textOrLines) {
|
|||
// delta handling is too slow. If we make delete delta handling faster we can split all large deltas
|
||||
// as shown in https://gist.github.com/aldendaniels/8367109#file-document-snippet-js
|
||||
// If we do this, update validateDelta() to limit the number of lines in a delete delta.
|
||||
var bIsInsert = delta.action == 'insert';
|
||||
var bIsInsert = delta.action == "insert";
|
||||
while (bIsInsert && delta.lines.length > 65001) {
|
||||
|
||||
// Get split deltas.
|
||||
var lines = delta.lines.splice(0, 65000);
|
||||
lines.push('');
|
||||
lines.push("");
|
||||
var range = new Range(delta.start.row, delta.start.column,
|
||||
delta.start.row + 65000, 0)
|
||||
this.applyDelta({
|
||||
action: delta.action,
|
||||
lines: lines,
|
||||
range: new Range(delta.range.start.row, delta.range.start.column,
|
||||
delta.range.start.row + 65000, 0)
|
||||
start: range.start,
|
||||
end: range.end,
|
||||
});
|
||||
|
||||
// Update remaining delta.
|
||||
delta.range.start.row += 65000;
|
||||
delta.range.start.column = 0;
|
||||
delta.start.row += 65000;
|
||||
delta.start.column = 0;
|
||||
}
|
||||
|
||||
// Apply.
|
||||
applyDelta(this.$lines, delta, doNotValidate);
|
||||
this._emit("change", { data: delta });
|
||||
this._emit("change", { data: delta });
|
||||
};
|
||||
|
||||
/**
|
||||
* Reverts `delta` from the document.
|
||||
* @param {Object} delta A delta object (can include 'insert' and 'remove' actions)
|
||||
* @param {Object} delta A delta object (can include "insert" and "remove" actions)
|
||||
**/
|
||||
this.revertDelta = function(delta) {
|
||||
var range = Range.fromPoints(delta.start, delta.end);
|
||||
this.applyDelta({
|
||||
action: (delta.action == 'insert' ? 'remove' : 'insert'),
|
||||
range: delta.range.clone(),
|
||||
action: (delta.action == "insert" ? "remove" : "insert"),
|
||||
start: range.start,
|
||||
end: range.end,
|
||||
lines: delta.lines.slice()
|
||||
});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -253,7 +253,7 @@ var EditSession = function(text, mode) {
|
|||
var delta = e.data;
|
||||
this.$modified = true;
|
||||
|
||||
this.$resetRowCache(delta.range.start.row);
|
||||
this.$resetRowCache(delta.start.row);
|
||||
|
||||
var removedFolds = this.$updateInternalDataOnChange(e);
|
||||
if (!this.$fromUndo && this.$undoManager && !delta.ignore) {
|
||||
|
|
@ -1247,30 +1247,29 @@ var EditSession = function(text, mode) {
|
|||
var range, point;
|
||||
var lastDeltaIsInsert = false;
|
||||
if (isInsert(delta)) {
|
||||
range = Range.fromPoints(delta.range.start, delta.range.end);
|
||||
range = Range.fromPoints(delta.start, delta.end);
|
||||
lastDeltaIsInsert = true;
|
||||
} else {
|
||||
range = Range.fromPoints(delta.range.start, delta.range.start);
|
||||
range = Range.fromPoints(delta.start, delta.start);
|
||||
lastDeltaIsInsert = false;
|
||||
}
|
||||
|
||||
for (var i = 1; i < deltas.length; i++) {
|
||||
delta = deltas[i];
|
||||
if (isInsert(delta)) {
|
||||
point = delta.range.start;
|
||||
point = delta.start;
|
||||
if (range.compare(point.row, point.column) == -1) {
|
||||
range.setStart(delta.range.start);
|
||||
range.setStart(point);
|
||||
}
|
||||
point = delta.range.end;
|
||||
point = delta.end;
|
||||
if (range.compare(point.row, point.column) == 1) {
|
||||
range.setEnd(delta.range.end);
|
||||
range.setEnd(point);
|
||||
}
|
||||
lastDeltaIsInsert = true;
|
||||
} else {
|
||||
point = delta.range.start;
|
||||
point = delta.start;
|
||||
if (range.compare(point.row, point.column) == -1) {
|
||||
range =
|
||||
Range.fromPoints(delta.range.start, delta.range.start);
|
||||
range = Range.fromPoints(delta.start, delta.start);
|
||||
}
|
||||
lastDeltaIsInsert = false;
|
||||
}
|
||||
|
|
@ -1676,8 +1675,8 @@ var EditSession = function(text, mode) {
|
|||
this.$updateInternalDataOnChange = function(e) {
|
||||
var useWrapMode = this.$useWrapMode;
|
||||
var action = e.data.action;
|
||||
var start = e.data.range.start;
|
||||
var end = e.data.range.end;
|
||||
var start = e.data.start;
|
||||
var end = e.data.end;
|
||||
var firstRow = start.row;
|
||||
var lastRow = end.row;
|
||||
var len = lastRow - firstRow;
|
||||
|
|
@ -1685,11 +1684,11 @@ var EditSession = function(text, mode) {
|
|||
|
||||
this.$updating = true;
|
||||
if (len != 0) {
|
||||
if (action == 'remove') {
|
||||
if (action == "remove") {
|
||||
this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len);
|
||||
|
||||
var foldLines = this.$foldData;
|
||||
removedFolds = this.getFoldsInRange(e.data.range);
|
||||
removedFolds = this.getFoldsInRange(e.data);
|
||||
this.removeFolds(removedFolds);
|
||||
|
||||
var foldLine = this.getFoldLine(end.row);
|
||||
|
|
@ -1759,10 +1758,10 @@ var EditSession = function(text, mode) {
|
|||
} else {
|
||||
// Realign folds. E.g. if you add some new chars before a fold, the
|
||||
// fold should "move" to the right.
|
||||
len = Math.abs(e.data.range.start.column - e.data.range.end.column);
|
||||
if (action == 'remove') {
|
||||
len = Math.abs(e.data.start.column - e.data.end.column);
|
||||
if (action == "remove") {
|
||||
// Get all the folds in the change range and remove them.
|
||||
removedFolds = this.getFoldsInRange(e.data.range);
|
||||
removedFolds = this.getFoldsInRange(e.data);
|
||||
this.removeFolds(removedFolds);
|
||||
|
||||
len = -len;
|
||||
|
|
|
|||
|
|
@ -830,9 +830,8 @@ function Folding() {
|
|||
|
||||
this.updateFoldWidgets = function(e) {
|
||||
var delta = e.data;
|
||||
var range = delta.range;
|
||||
var firstRow = range.start.row;
|
||||
var len = range.end.row - firstRow;
|
||||
var firstRow = delta.start.row;
|
||||
var len = delta.end.row - firstRow;
|
||||
|
||||
if (len === 0) {
|
||||
this.foldWidgets[firstRow] = null;
|
||||
|
|
|
|||
|
|
@ -607,11 +607,10 @@ var Editor = function(renderer, session) {
|
|||
*
|
||||
**/
|
||||
this.onDocumentChange = function(e) {
|
||||
|
||||
// Rerender and emit "change" event.
|
||||
var range = e.data.range;
|
||||
var lastRow = (range.start.row == range.end.row ? range.end.row : Infinity);
|
||||
this.renderer.updateLines(range.start.row, lastRow);
|
||||
var delta = e.data;
|
||||
var lastRow = (delta.start.row == delta.end.row ? delta.end.row : Infinity);
|
||||
this.renderer.updateLines(delta.start.row, lastRow);
|
||||
this._signal("change", e);
|
||||
|
||||
// Update cursor because tab characters can influence the cursor position.
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ var ElasticTabstopsLite = function(editor) {
|
|||
recordChanges = true;
|
||||
};
|
||||
this.onChange = function(e) {
|
||||
var range = e.data.range
|
||||
var range = e.data;
|
||||
if (recordChanges) {
|
||||
if (changedRows.indexOf(range.start.row) == -1)
|
||||
changedRows.push(range.start.row);
|
||||
|
|
|
|||
|
|
@ -94,11 +94,9 @@ module.exports = {
|
|||
editor.removeLines();
|
||||
util.insertMode(editor);
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
if (range) {
|
||||
|
||||
// range.end.column ++;
|
||||
editor.session.remove(range);
|
||||
util.insertMode(editor);
|
||||
|
|
|
|||
|
|
@ -103,9 +103,8 @@ var Gutter = function(parentEl) {
|
|||
if (!this.$annotations.length)
|
||||
return;
|
||||
var delta = e.data;
|
||||
var range = delta.range;
|
||||
var firstRow = range.start.row;
|
||||
var len = range.end.row - firstRow;
|
||||
var firstRow = delta.start.row;
|
||||
var len = delta.end.row - firstRow;
|
||||
if (len === 0) {
|
||||
// do nothing
|
||||
} else if (delta.action == 'remove') {
|
||||
|
|
|
|||
|
|
@ -150,7 +150,6 @@ exports.getMatchOffsets = function(string, regExp) {
|
|||
|
||||
/* deprecated */
|
||||
exports.deferredCall = function(fcn) {
|
||||
|
||||
var timer = null;
|
||||
var callback = function() {
|
||||
timer = null;
|
||||
|
|
|
|||
|
|
@ -119,9 +119,8 @@ function LineWidgets(session) {
|
|||
if (!lineWidgets) return;
|
||||
|
||||
var delta = e.data;
|
||||
var range = delta.range;
|
||||
var startRow = range.start.row;
|
||||
var len = range.end.row - startRow;
|
||||
var startRow = delta.start.row;
|
||||
var len = delta.end.row - startRow;
|
||||
|
||||
if (len === 0) {
|
||||
// return
|
||||
|
|
|
|||
|
|
@ -178,29 +178,31 @@ var UndoManager = function() {
|
|||
function $serializeDelta(delta){
|
||||
return {
|
||||
action: delta.action,
|
||||
range: delta.range,
|
||||
lines: (delta.lines.length == 1 ? null : delta.lines),
|
||||
text: (delta.lines.length == 1 ? delta.lines[0] : null ),
|
||||
start: delta.start,
|
||||
end: delta.end,
|
||||
lines: delta.lines.length == 1 ? null : delta.lines,
|
||||
text: delta.lines.length == 1 ? delta.lines[0] : null,
|
||||
};
|
||||
}
|
||||
|
||||
function $deserializeDelta(delta) {
|
||||
return {
|
||||
action: delta.action,
|
||||
range: delta.range,
|
||||
lines: (delta.text === null ? delta.lines : [delta.text])
|
||||
start: delta.start,
|
||||
end: delta.end,
|
||||
lines: delta.lines || [delta.text]
|
||||
};
|
||||
}
|
||||
|
||||
function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) {
|
||||
var deltaSets_new = new Array(deltaSets_old.length);
|
||||
for (var i in deltaSets_old) {
|
||||
for (var i = 0; i < deltaSets_old.length; i++) {
|
||||
var deltaSet_old = deltaSets_old[i];
|
||||
var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)};
|
||||
|
||||
for (var i_ in deltaSet_old.deltas) {
|
||||
var delta_old = deltaSet_old.deltas[i_];
|
||||
deltaSet_new.deltas[i_] = fnGetModifiedDelta(delta_old);
|
||||
for (var j = 0; j < deltaSet_old.deltas.length; j++) {
|
||||
var delta_old = deltaSet_old.deltas[j];
|
||||
deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old);
|
||||
}
|
||||
|
||||
deltaSets_new[i] = deltaSet_new;
|
||||
|
|
|
|||
|
|
@ -13,16 +13,7 @@ var Mirror = exports.Mirror = function(sender) {
|
|||
|
||||
var _self = this;
|
||||
sender.on("change", function(e) {
|
||||
|
||||
// Convert delta.range back into a Range instance since
|
||||
// window.onMessage loses non-primitive data. See http://jsfiddle.net/nqJfw/1/.
|
||||
var deltas = e.data;
|
||||
for (var i in deltas) {
|
||||
var delta = deltas[i];
|
||||
delta.range = Range.fromPoints(delta.range.start, delta.range.end);
|
||||
}
|
||||
|
||||
doc.applyDeltas(deltas);
|
||||
doc.applyDeltas(e.data);
|
||||
if (_self.$timeout)
|
||||
return deferredUpdate.schedule(_self.$timeout);
|
||||
_self.onUpdate();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue