Merge current ajaxorg:master with jviereck:wrapMode

This commit is contained in:
Julian Viereck 2011-01-26 23:51:04 +01:00
commit 725820e05d
15 changed files with 937 additions and 358 deletions

View file

@ -64,9 +64,9 @@ var Document = function(text) {
this.getValue = function() {
return this.$lines.join(this.getNewLineCharacter());
};
// check for IE split bug
if ("aaa".split(/a/).length == 0)
if ("aaa".split(/a/).length == 0)
this.$split = function(text) {
return text.replace(/\r\n|\r/g, "\n").split("\n");
}
@ -75,7 +75,7 @@ var Document = function(text) {
return text.split(/\r\n|\r|\n/);
};
this.$detectNewLine = function(text) {
var match = text.match(/^.*?(\r?\n)/m);
if (match) {
@ -84,7 +84,7 @@ var Document = function(text) {
this.$autoNewLine = "\n";
}
};
this.getNewLineCharacter = function() {
switch (this.$newLineMode) {
case "windows":
@ -109,24 +109,24 @@ var Document = function(text) {
this.getNewLineMode = function() {
return this.$newLineMode;
};
this.isNewLine = function(text) {
return (text == "\r\n" || text == "\r" || text == "\n");
};
/**
* Get a verbatim copy of the given line as it is in the document
* Get a verbatim copy of the given line as it is in the document
*/
this.getLine = function(row) {
return this.$lines[row] || "";
};
this.getLines = function(firstRow, lastRow) {
return this.$lines.slice(firstRow, lastRow+1);
};
/**
* Returns all lines in the document as string array. Warning: The caller
* Returns all lines in the document as string array. Warning: The caller
* should not modify this array!
*/
this.getAllLines = function() {
@ -157,15 +157,15 @@ var Document = function(text) {
position.row = Math.max(0, length - 1);
position.column = this.getLine(length-1).length;
}
return position;
return position;
}
this.insert = function(position, text) {
if (text.length == 0)
return position;
position = this.$clipPosition(position);
if (this.getLength() <= 1)
this.$detectNewLine(text);
@ -182,56 +182,56 @@ var Document = function(text) {
this.insertNewLine(end);
if (newLines.length > 2)
this.insertLines(position.row+1, newLines.slice(1, newLines.length-1));
var end = this.insertInLine({row: position.row + newLines.length - 1, column: 0}, newLines[newLines.length-1]);
}
return end;
};
this.insertLines = function(row, lines) {
if (lines.length == 0)
return {row: row, column: 0};
var args = [row, 0];
args.push.apply(args, lines);
this.$lines.splice.apply(this.$lines, args);
var range = new Range(row, 0, row + lines.length - 1, 0);
var delta = {
action: "insertLines",
range: range,
lines: lines
};
this._dispatchEvent("change", { data: delta });
this._dispatchEvent("change", { data: delta });
return range.end;
},
this.insertNewLine = function(position) {
position = this.$clipPosition(position);
var line = this.$lines[position.row] || "";
this.$lines[position.row] = line.substring(0, position.column);
this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));
var end = {
row : position.row + 1,
column : 0
};
var delta = {
action: "insertText",
range: Range.fromPoints(position, end),
text: this.getNewLineCharacter()
};
this._dispatchEvent("change", { data: delta });
return end;
};
this.insertInLine = function(position, text) {
if (text.length == 0)
return position;
var line = this.$lines[position.row] || "";
this.$lines[position.row] = line.substring(0, position.column) + text
+ line.substring(position.column);
@ -240,14 +240,14 @@ var Document = function(text) {
row : position.row,
column : position.column + text.length
};
var delta = {
action: "insertText",
range: Range.fromPoints(position, end),
text: text
};
this._dispatchEvent("change", { data: delta });
return end;
};
@ -258,12 +258,12 @@ var Document = function(text) {
if (range.isEmpty())
return range.start;
var firstRow = range.start.row;
var lastRow = range.end.row;
if (range.isMultiLine()) {
// TODO removeInLine can be optimized away!
this.removeInLine(lastRow, 0, range.end.column);
if (lastRow - firstRow >= 2)
@ -276,17 +276,17 @@ var Document = function(text) {
}
return range.start;
};
this.removeInLine = function(row, startColumn, endColumn) {
if (startColumn == endColumn)
return;
var range = new Range(row, startColumn, row, endColumn);
var line = this.getLine(row);
var removed = line.substring(startColumn, endColumn);
var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);
this.$lines.splice(row, 1, newLine);
var delta = {
action: "removeText",
range: range,
@ -295,18 +295,18 @@ var Document = function(text) {
this._dispatchEvent("change", { data: delta });
return range.start;
};
/**
* Removes a range of full lines
*
*
* @param firstRow {Integer} The first row to be removed
* @param lastRow {Integer} The last row to be removed
* @return {String[]} The removed lines
*/
this.removeLines = function(firstRow, lastRow) {
var range = new Range(firstRow, 0, lastRow, this.$lines[lastRow].length);
var range = new Range(firstRow, 0, lastRow, this.$lines[lastRow].length);
var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);
var delta = {
action: "removeLines",
range: range,
@ -316,16 +316,16 @@ var Document = function(text) {
this._dispatchEvent("change", { data: delta });
return removed;
};
this.removeNewLine = function(row) {
var firstLine = this.getLine(row);
var secondLine = this.getLine(row+1);
var range = new Range(row, firstLine.length, row+1, 0);
var line = firstLine + secondLine;
this.$lines.splice(row, 2, line);
var delta = {
action: "removeText",
range: range,
@ -333,16 +333,16 @@ var Document = function(text) {
};
this._dispatchEvent("change", { data: delta });
};
this.replace = function(range, text) {
if (text.length == 0 && range.isEmpty())
return range.start;
// Shortcut: If the text we want to insert is the same as it is already
// in the document, we don't have to replace anything.
if (text == this.getTextRange(range))
return range.end;
this.remove(range);
if (text) {
var end = this.insert(range.start, text);
@ -350,15 +350,15 @@ var Document = function(text) {
else {
end = range.start;
}
return end;
};
this.applyDeltas = function(deltas) {
for (var i=0; i<deltas.length; i++) {
var delta = deltas[i];
var range = Range.fromPoints(delta.range.start, delta.range.end);
if (delta.action == "insertLines")
this.insertLines(range.start.row, delta.lines)
else if (delta.action == "insertText")
@ -367,14 +367,14 @@ var Document = function(text) {
this.removeLines(range.start.row, range.end.row)
else if (delta.action == "removeText")
this.remove(range)
}
}
};
this.revertDeltas = function(deltas) {
for (var i=deltas.length-1; i>=0; i--) {
var delta = deltas[i];
var range = Range.fromPoints(delta.range.start, delta.range.end);
if (delta.action == "insertLines")
this.removeLines(range.start.row, range.end.row)
else if (delta.action == "insertText")
@ -383,7 +383,7 @@ var Document = function(text) {
this.insertLines(range.start.row, delta.lines)
else if (delta.action == "removeText")
this.insert(range.start, delta.text)
}
}
};
}).call(Document.prototype);