move tab support from editor to the document
This commit is contained in:
parent
6a11af1a44
commit
3e8639596a
6 changed files with 58 additions and 70 deletions
|
|
@ -34,6 +34,11 @@ ace.Editor.prototype.setDocument = function(doc) {
|
||||||
doc.addEventListener("change", ace.bind(this.onDocumentChange, this));
|
doc.addEventListener("change", ace.bind(this.onDocumentChange, this));
|
||||||
this.renderer.setDocument(doc);
|
this.renderer.setDocument(doc);
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
doc.addEventListener("changeTabSize", function() {
|
||||||
|
self.renderer.draw();
|
||||||
|
});
|
||||||
|
|
||||||
this.selection = doc.getSelection();
|
this.selection = doc.getSelection();
|
||||||
|
|
||||||
var onCursorChange = ace.bind(this.onCursorChange, this);
|
var onCursorChange = ace.bind(this.onCursorChange, this);
|
||||||
|
|
@ -42,6 +47,7 @@ ace.Editor.prototype.setDocument = function(doc) {
|
||||||
var onSelectionChange = ace.bind(this.onSelectionChange, this);
|
var onSelectionChange = ace.bind(this.onSelectionChange, this);
|
||||||
this.selection.addEventListener("changeSelection", onSelectionChange);
|
this.selection.addEventListener("changeSelection", onSelectionChange);
|
||||||
|
|
||||||
|
|
||||||
this.bgTokenizer.setLines(this.doc.lines);
|
this.bgTokenizer.setLines(this.doc.lines);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -216,8 +222,8 @@ ace.Editor.prototype.onCut = function() {
|
||||||
ace.Editor.prototype.onTextInput = function(text) {
|
ace.Editor.prototype.onTextInput = function(text) {
|
||||||
var cursor = this.getCursorPosition();
|
var cursor = this.getCursorPosition();
|
||||||
|
|
||||||
if (this.getUseSoftTabs()) {
|
if (this.doc.getUseSoftTabs()) {
|
||||||
text = text.replace(/\t/g, this.getTabString());
|
text = text.replace(/\t/g, this.doc.getTabString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.selection.isEmpty()) {
|
if (!this.selection.isEmpty()) {
|
||||||
|
|
@ -233,7 +239,7 @@ ace.Editor.prototype.onTextInput = function(text) {
|
||||||
if (row !== end.row) {
|
if (row !== end.row) {
|
||||||
var line = this.doc.getLine(row);
|
var line = this.doc.getLine(row);
|
||||||
var lineState = this.bgTokenizer.getState(row);
|
var lineState = this.bgTokenizer.getState(row);
|
||||||
var indent = this.mode.getNextLineIndent(line, lineState, this.getTabString());
|
var indent = this.mode.getNextLineIndent(line, lineState, this.doc.getTabString());
|
||||||
if (indent) {
|
if (indent) {
|
||||||
var indentRange = {
|
var indentRange = {
|
||||||
start: {
|
start: {
|
||||||
|
|
@ -250,37 +256,6 @@ ace.Editor.prototype.onTextInput = function(text) {
|
||||||
this.renderer.scrollCursorIntoView();
|
this.renderer.scrollCursorIntoView();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
ace.Editor.prototype.getTabString = function() {
|
|
||||||
if (this.getUseSoftTabs()) {
|
|
||||||
return new Array(this.getTabSize()+1).join(" ");
|
|
||||||
}
|
|
||||||
return "\t";
|
|
||||||
};
|
|
||||||
|
|
||||||
ace.Editor.prototype._useSoftTabs = true;
|
|
||||||
ace.Editor.prototype.setUseSoftTabs = function(useSoftTabs) {
|
|
||||||
if (this._useSoftTabs === useSoftTabs) return;
|
|
||||||
|
|
||||||
this._useSoftTabs = useSoftTabs;
|
|
||||||
};
|
|
||||||
|
|
||||||
ace.Editor.prototype.getUseSoftTabs = function() {
|
|
||||||
return this._useSoftTabs;
|
|
||||||
};
|
|
||||||
|
|
||||||
ace.Editor.prototype._tabSize = 4;
|
|
||||||
ace.Editor.prototype.setTabSize = function(tabSize) {
|
|
||||||
if (this._tabSize === tabSize) return;
|
|
||||||
|
|
||||||
this._tabSize = tabSize;
|
|
||||||
this.renderer.draw();
|
|
||||||
};
|
|
||||||
|
|
||||||
ace.Editor.prototype.getTabSize = function() {
|
|
||||||
return this._tabSize;
|
|
||||||
};
|
|
||||||
|
|
||||||
ace.Editor.prototype.removeRight = function() {
|
ace.Editor.prototype.removeRight = function() {
|
||||||
if (this.selection.isEmpty()) {
|
if (this.selection.isEmpty()) {
|
||||||
this.selection.selectRight();
|
this.selection.selectRight();
|
||||||
|
|
@ -309,14 +284,14 @@ ace.Editor.prototype.removeLine = function() {
|
||||||
};
|
};
|
||||||
|
|
||||||
ace.Editor.prototype.blockIndent = function(indentString) {
|
ace.Editor.prototype.blockIndent = function(indentString) {
|
||||||
var indentString = indentString || this.getTabString();
|
var indentString = indentString || this.doc.getTabString();
|
||||||
var addedColumns = this.doc.indentRows(this.getSelectionRange(), indentString);
|
var addedColumns = this.doc.indentRows(this.getSelectionRange(), indentString);
|
||||||
|
|
||||||
this.selection.shiftSelection(addedColumns);
|
this.selection.shiftSelection(addedColumns);
|
||||||
};
|
};
|
||||||
|
|
||||||
ace.Editor.prototype.blockOutdent = function(indentString) {
|
ace.Editor.prototype.blockOutdent = function(indentString) {
|
||||||
var indentString = indentString || this.getTabString();
|
var indentString = indentString || this.doc.getTabString();
|
||||||
var addedColumns = this.doc.outdentRows(this.getSelectionRange(), indentString);
|
var addedColumns = this.doc.outdentRows(this.getSelectionRange(), indentString);
|
||||||
|
|
||||||
this.selection.shiftSelection(addedColumns);
|
this.selection.shiftSelection(addedColumns);
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,36 @@ ace.TextDocument.prototype.fireChangeEvent = function(firstRow, lastRow) {
|
||||||
this.$dispatchEvent("change", { data: data});
|
this.$dispatchEvent("change", { data: data});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ace.TextDocument.prototype.getTabString = function() {
|
||||||
|
if (this.getUseSoftTabs()) {
|
||||||
|
return new Array(this.getTabSize()+1).join(" ");
|
||||||
|
}
|
||||||
|
return "\t";
|
||||||
|
};
|
||||||
|
|
||||||
|
ace.TextDocument.prototype._useSoftTabs = true;
|
||||||
|
ace.TextDocument.prototype.setUseSoftTabs = function(useSoftTabs) {
|
||||||
|
if (this._useSoftTabs === useSoftTabs) return;
|
||||||
|
|
||||||
|
this._useSoftTabs = useSoftTabs;
|
||||||
|
};
|
||||||
|
|
||||||
|
ace.TextDocument.prototype.getUseSoftTabs = function() {
|
||||||
|
return this._useSoftTabs;
|
||||||
|
};
|
||||||
|
|
||||||
|
ace.TextDocument.prototype._tabSize = 4;
|
||||||
|
ace.TextDocument.prototype.setTabSize = function(tabSize) {
|
||||||
|
if (this._tabSize === tabSize) return;
|
||||||
|
|
||||||
|
this._tabSize = tabSize;
|
||||||
|
this.$dispatchEvent("changeTabSize");
|
||||||
|
};
|
||||||
|
|
||||||
|
ace.TextDocument.prototype.getTabSize = function() {
|
||||||
|
return this._tabSize;
|
||||||
|
};
|
||||||
|
|
||||||
ace.TextDocument.prototype.getWidth = function() {
|
ace.TextDocument.prototype.getWidth = function() {
|
||||||
if (this.modified) {
|
if (this.modified) {
|
||||||
this.modified = false;
|
this.modified = false;
|
||||||
|
|
@ -50,32 +80,6 @@ ace.TextDocument.prototype.getLine = function(row) {
|
||||||
return this.lines[row] || "";
|
return this.lines[row] || "";
|
||||||
};
|
};
|
||||||
|
|
||||||
ace.TextDocument.prototype.keywords = {
|
|
||||||
"break" : 1,
|
|
||||||
"case" : 1,
|
|
||||||
"catch" : 1,
|
|
||||||
"continue" : 1,
|
|
||||||
"default" : 1,
|
|
||||||
"delete" : 1,
|
|
||||||
"do" : 1,
|
|
||||||
"else" : 1,
|
|
||||||
"finally" : 1,
|
|
||||||
"for" : 1,
|
|
||||||
"function" : 1,
|
|
||||||
"if" : 1,
|
|
||||||
"in" : 1,
|
|
||||||
"instanceof" : 1,
|
|
||||||
"new" : 1,
|
|
||||||
"return" : 1,
|
|
||||||
"switch" : 1,
|
|
||||||
"throw" : 1,
|
|
||||||
"try" : 1,
|
|
||||||
"typeof" : 1,
|
|
||||||
"var" : 1,
|
|
||||||
"while" : 1,
|
|
||||||
"with" : 1
|
|
||||||
};
|
|
||||||
|
|
||||||
ace.TextDocument.prototype.getLength = function() {
|
ace.TextDocument.prototype.getLength = function() {
|
||||||
return this.lines.length;
|
return this.lines.length;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ ace.TextLayer = function(parentEl) {
|
||||||
parentEl.appendChild(this.element);
|
parentEl.appendChild(this.element);
|
||||||
|
|
||||||
this._measureSizes();
|
this._measureSizes();
|
||||||
|
this._tabString = " ";
|
||||||
};
|
};
|
||||||
|
|
||||||
ace.TextLayer.prototype.setTokenizer = function(tokenizer) {
|
ace.TextLayer.prototype.setTokenizer = function(tokenizer) {
|
||||||
|
|
@ -41,6 +42,10 @@ ace.TextLayer.prototype._measureSizes = function() {
|
||||||
this.element.removeChild(measureNode);
|
this.element.removeChild(measureNode);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ace.TextLayer.prototype.setTabSize = function(tabSize) {
|
||||||
|
this._tabString = new Array(tabSize+1).join(" ");
|
||||||
|
};
|
||||||
|
|
||||||
ace.TextLayer.prototype.updateLines = function(layerConfig, firstRow, lastRow) {
|
ace.TextLayer.prototype.updateLines = function(layerConfig, firstRow, lastRow) {
|
||||||
var first = Math.max(firstRow, layerConfig.firstRow);
|
var first = Math.max(firstRow, layerConfig.firstRow);
|
||||||
var last = Math.min(lastRow, layerConfig.lastRow);
|
var last = Math.min(lastRow, layerConfig.lastRow);
|
||||||
|
|
@ -73,8 +78,11 @@ ace.TextLayer.prototype.renderLine = function(stringBuilder, row) {
|
||||||
for ( var i = 0; i < tokens.length; i++) {
|
for ( var i = 0; i < tokens.length; i++) {
|
||||||
var token = tokens[i];
|
var token = tokens[i];
|
||||||
|
|
||||||
var output = token.value.replace(/&/g, "&").replace(/</g, "<")
|
var output = token.value
|
||||||
.replace(/\s/g, " ");
|
.replace(/&/g, "&")
|
||||||
|
.replace(/</g, "<")
|
||||||
|
.replace(/\t/g, this._tabString)
|
||||||
|
.replace(/\s/g, " ");
|
||||||
|
|
||||||
if (token.type !== "text") {
|
if (token.type !== "text") {
|
||||||
stringBuilder.push("<span class='", token.type, "'>", output,
|
stringBuilder.push("<span class='", token.type, "'>", output,
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ ace.VirtualRenderer.prototype.setDocument = function(doc) {
|
||||||
this.lines = doc.lines;
|
this.lines = doc.lines;
|
||||||
this.doc = doc;
|
this.doc = doc;
|
||||||
this.markerLayer.setDocument(doc);
|
this.markerLayer.setDocument(doc);
|
||||||
|
this.textLayer.setTabSize(doc.getTabSize());
|
||||||
};
|
};
|
||||||
|
|
||||||
ace.VirtualRenderer.prototype.setTokenizer = function(tokenizer) {
|
ace.VirtualRenderer.prototype.setTokenizer = function(tokenizer) {
|
||||||
|
|
|
||||||
|
|
@ -194,13 +194,13 @@ var TextEditTest = TestCase("TextEditTest",
|
||||||
var doc = new ace.TextDocument("");
|
var doc = new ace.TextDocument("");
|
||||||
var editor = new ace.Editor(new MockRenderer(), doc);
|
var editor = new ace.Editor(new MockRenderer(), doc);
|
||||||
|
|
||||||
editor.setTabSize(2);
|
doc.setTabSize(2);
|
||||||
editor.setUseSoftTabs(true);
|
doc.setUseSoftTabs(true);
|
||||||
|
|
||||||
editor.onTextInput("\t");
|
editor.onTextInput("\t");
|
||||||
assertEquals(" ", doc.toString());
|
assertEquals(" ", doc.toString());
|
||||||
|
|
||||||
editor.setTabSize(5);
|
doc.setTabSize(5);
|
||||||
editor.onTextInput("\t");
|
editor.onTextInput("\t");
|
||||||
assertEquals(" ", doc.toString());
|
assertEquals(" ", doc.toString());
|
||||||
},
|
},
|
||||||
|
|
@ -209,7 +209,7 @@ var TextEditTest = TestCase("TextEditTest",
|
||||||
var doc = new ace.TextDocument("");
|
var doc = new ace.TextDocument("");
|
||||||
var editor = new ace.Editor(new MockRenderer(), doc);
|
var editor = new ace.Editor(new MockRenderer(), doc);
|
||||||
|
|
||||||
editor.setUseSoftTabs(false);
|
doc.setUseSoftTabs(false);
|
||||||
|
|
||||||
editor.onTextInput("\t");
|
editor.onTextInput("\t");
|
||||||
assertEquals("\t", doc.toString());
|
assertEquals("\t", doc.toString());
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ var JavaScriptTest = new TestCase("mode.JavaScriptTest", {
|
||||||
editor.navigateLineEnd();
|
editor.navigateLineEnd();
|
||||||
editor.onTextInput("\n");
|
editor.onTextInput("\n");
|
||||||
|
|
||||||
assertEquals(["if () {", editor.getTabString()].join("\n"), doc.toString());
|
assertEquals(["if () {", doc.getTabString()].join("\n"), doc.toString());
|
||||||
},
|
},
|
||||||
|
|
||||||
"test: no auto indent after opening brace in multi line comment" : function() {
|
"test: no auto indent after opening brace in multi line comment" : function() {
|
||||||
|
|
@ -76,6 +76,6 @@ var JavaScriptTest = new TestCase("mode.JavaScriptTest", {
|
||||||
editor.navigateLineEnd();
|
editor.navigateLineEnd();
|
||||||
editor.onTextInput("\n");
|
editor.onTextInput("\n");
|
||||||
|
|
||||||
assertEquals([" if () {", " " + editor.getTabString()].join("\n"), doc.toString());
|
assertEquals([" if () {", " " + doc.getTabString()].join("\n"), doc.toString());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Loading…
Add table
Add a link
Reference in a new issue