toggleCommentLines and indentRows now take row

numbers instead of ranges as arguments
This commit is contained in:
Fabian Jakobs 2010-12-15 19:16:44 +01:00
commit aa594119b7
13 changed files with 64 additions and 47 deletions

View file

@ -622,12 +622,12 @@ var Document = function(text, mode) {
return end; return end;
}; };
this.indentRows = function(range, indentString) { this.indentRows = function(startRow, endRow, indentString) {
indentString = indentString.replace("\t", this.getTabString()); indentString = indentString.replace("\t", this.getTabString());
for (var row=range.start.row; row<=range.end.row; row++) { for (var row=startRow; row<=endRow; row++) {
this.$insert({row: row, column:0}, indentString); this.$insert({row: row, column:0}, indentString);
} }
this.fireChangeEvent(range.start.row, range.end.row); this.fireChangeEvent(startRow, endRow);
return indentString.length; return indentString.length;
}; };

View file

@ -469,9 +469,7 @@ var Editor =function(renderer, doc) {
outdent -= 1; outdent -= 1;
_self.doc.replace(new Range(row, 0, row, line.length), line.substr(i)); _self.doc.replace(new Range(row, 0, row, line.length), line.substr(i));
} }
end.column += _self.doc.indentRows( end.column += _self.doc.indentRows(cursor.row + 1, end.row, lineIndent);
new Range(cursor.row + 1, 0, end.row, end.column),
lineIndent);
} else { } else {
if (shouldOutdent) { if (shouldOutdent) {
end.column += _self.mode.autoOutdent(lineState, _self.doc, cursor.row); end.column += _self.mode.autoOutdent(lineState, _self.doc, cursor.row);
@ -606,9 +604,9 @@ var Editor =function(renderer, doc) {
var doc = this.doc, var doc = this.doc,
range = this.getSelectionRange(); range = this.getSelectionRange();
if (range.start.row < range.end.row || if (range.start.row < range.end.row || range.start.column < range.end.column) {
range.start.column < range.end.column) { var rows = this.$getSelectedRows();
var count = doc.indentRows(this.getSelectionRange(), "\t"); var count = doc.indentRows(rows.first, rows.last, "\t");
this.selection.shiftSelection(count); this.selection.shiftSelection(count);
} else { } else {
@ -642,12 +640,10 @@ var Editor =function(renderer, doc) {
if (this.$readOnly) if (this.$readOnly)
return; return;
var rows = this.$getSelectedRows();
var range = new Range(rows.first, 0, rows.last, 0);
var _self = this; var _self = this;
this.bgTokenizer.getState(this.getCursorPosition().row, function(state) { this.bgTokenizer.getState(this.getCursorPosition().row, function(state) {
var addedColumns = _self.mode.toggleCommentLines(state, _self.doc, range); var rows = _self.$getSelectedRows()
var addedColumns = _self.mode.toggleCommentLines(state, _self.doc, rows.first, rows.last);
_self.selection.shiftSelection(addedColumns); _self.selection.shiftSelection(addedColumns);
}); });
}; };

View file

@ -54,7 +54,7 @@ oop.inherits(Mode, TextMode);
(function() { (function() {
this.toggleCommentLines = function(state, doc, range) { this.toggleCommentLines = function(state, doc, startRow, endRow) {
return this.$delegate("toggleCommentLines", arguments, function() { return this.$delegate("toggleCommentLines", arguments, function() {
return 0; return 0;
}); });

View file

@ -52,12 +52,12 @@ oop.inherits(Mode, TextMode);
(function() { (function() {
this.toggleCommentLines = function(state, doc, range) { this.toggleCommentLines = function(state, doc, startRow, endRow) {
var outdent = true; var outdent = true;
var outentedRows = []; var outentedRows = [];
var re = /^(\s*)\/\//; var re = /^(\s*)\/\//;
for (var i=range.start.row; i<= range.end.row; i++) { for (var i=startRow; i<= endRow; i++) {
if (!re.test(doc.getLine(i))) { if (!re.test(doc.getLine(i))) {
outdent = false; outdent = false;
break; break;
@ -66,7 +66,7 @@ oop.inherits(Mode, TextMode);
if (outdent) { if (outdent) {
var deleteRange = new Range(0, 0, 0, 0); var deleteRange = new Range(0, 0, 0, 0);
for (var i=range.start.row; i<= range.end.row; i++) for (var i=startRow; i<= endRow; i++)
{ {
var line = doc.getLine(i).replace(re, "$1"); var line = doc.getLine(i).replace(re, "$1");
deleteRange.start.row = i; deleteRange.start.row = i;
@ -77,7 +77,7 @@ oop.inherits(Mode, TextMode);
return -2; return -2;
} }
else { else {
return doc.indentRows(range, "//"); return doc.indentRows(startRow, endRow, "//");
} }
}; };

View file

@ -52,12 +52,12 @@ oop.inherits(Mode, TextMode);
(function() { (function() {
this.toggleCommentLines = function(state, doc, range) { this.toggleCommentLines = function(state, doc, startRow, endRow) {
var outdent = true; var outdent = true;
var outentedRows = []; var outentedRows = [];
var re = /^(\s*)#/; var re = /^(\s*)#/;
for (var i=range.start.row; i<= range.end.row; i++) { for (var i=startRow; i<= endRow; i++) {
if (!re.test(doc.getLine(i))) { if (!re.test(doc.getLine(i))) {
outdent = false; outdent = false;
break; break;
@ -66,7 +66,7 @@ oop.inherits(Mode, TextMode);
if (outdent) { if (outdent) {
var deleteRange = new Range(0, 0, 0, 0); var deleteRange = new Range(0, 0, 0, 0);
for (var i=range.start.row; i<= range.end.row; i++) for (var i=startRow; i<= endRow; i++)
{ {
var line = doc.getLine(i).replace(re, "$1"); var line = doc.getLine(i).replace(re, "$1");
deleteRange.start.row = i; deleteRange.start.row = i;
@ -77,7 +77,7 @@ oop.inherits(Mode, TextMode);
return -2; return -2;
} }
else { else {
return doc.indentRows(range, "#"); return doc.indentRows(startRow, endRow, "#");
} }
}; };

View file

@ -50,7 +50,7 @@ var Mode = function() {
return this.$tokenizer; return this.$tokenizer;
}; };
this.toggleCommentLines = function(state, doc, range) { this.toggleCommentLines = function(state, doc, startRow, endRow) {
return 0; return 0;
}; };

View file

@ -138,7 +138,7 @@ var Range = function(startRow, startColumn, endRow, endColumn) {
return Range.fromPoints(this.start, this.end); return Range.fromPoints(this.start, this.end);
}; };
this.collapseLines = function() { this.collapseRows = function() {
if (this.end.column == 0) if (this.end.column == 0)
return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)
else else

View file

@ -38,7 +38,6 @@
define(function(require, exports, module) { define(function(require, exports, module) {
var Document = require("ace/document").Document; var Document = require("ace/document").Document;
var Range = require("ace/range").Range;
var Css = require("ace/mode/css").Mode; var Css = require("ace/mode/css").Mode;
var CssTest = new TestCase("mode.CssTest", { var CssTest = new TestCase("mode.CssTest", {
@ -50,8 +49,7 @@ var CssTest = new TestCase("mode.CssTest", {
"test: toggle comment lines should not do anything" : function() { "test: toggle comment lines should not do anything" : function() {
var doc = new Document([" abc", "cde", "fg"].join("\n")); var doc = new Document([" abc", "cde", "fg"].join("\n"));
var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, 0, 1);
var comment = this.mode.toggleCommentLines("start", doc, range);
assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString()); assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString());
}, },

View file

@ -51,7 +51,7 @@ var HtmlTest = new TestCase("mode.HtmlTest", {
var doc = new Document([" abc", "cde", "fg"]); var doc = new Document([" abc", "cde", "fg"]);
var range = new Range(0, 3, 1, 1); var range = new Range(0, 3, 1, 1);
var comment = this.mode.toggleCommentLines("start", doc, range); var comment = this.mode.toggleCommentLines("start", doc, 0, 1);
assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString()); assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString());
}, },

View file

@ -38,7 +38,6 @@
define(function(require, exports, module) { define(function(require, exports, module) {
var Document = require("ace/document").Document; var Document = require("ace/document").Document;
var Range = require("ace/range").Range;
var Tokenizer = require("ace/tokenizer").Tokenizer; var Tokenizer = require("ace/tokenizer").Tokenizer;
var JavaScript = require("ace/mode/javascript").Mode; var JavaScript = require("ace/mode/javascript").Mode;
@ -60,32 +59,36 @@ var JavaScriptTest = new TestCase("mode.JavaScriptTest", {
"test: toggle comment lines should prepend '//' to each line" : function() { "test: toggle comment lines should prepend '//' to each line" : function() {
var doc = new Document([" abc", "cde", "fg"]); var doc = new Document([" abc", "cde", "fg"]);
var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, 0, 1);
var comment = this.mode.toggleCommentLines("start", doc, range);
assertEquals(["// abc", "//cde", "fg"].join("\n"), doc.toString()); assertEquals(["// abc", "//cde", "fg"].join("\n"), doc.toString());
}, },
"test: toggle comment on commented lines should remove leading '//' chars" : function() { "test: toggle comment on commented lines should remove leading '//' chars" : function() {
var doc = new Document(["// abc", "//cde", "fg"]); var doc = new Document(["// abc", "//cde", "fg"]);
var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, 0, 1);
var comment = this.mode.toggleCommentLines("start", doc, range);
assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString()); assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString());
}, },
"test: toggle comment lines twice should return the original text" : function() {
var doc = new Document([" abc", "cde", "fg"]);
this.mode.toggleCommentLines("start", doc, 0, 2);
this.mode.toggleCommentLines("start", doc, 0, 2);
assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString());
},
"test: toggle comment on multiple lines with one commented line prepend '//' to each line" : function() { "test: toggle comment on multiple lines with one commented line prepend '//' to each line" : function() {
var doc = new Document(["// abc", "//cde", "fg"]); var doc = new Document(["// abc", "//cde", "fg"]);
var range = new Range(0, 3, 2, 1); var comment = this.mode.toggleCommentLines("start", doc, 0, 2);
var comment = this.mode.toggleCommentLines("start", doc, range);
assertEquals(["//// abc", "////cde", "//fg"].join("\n"), doc.toString()); assertEquals(["//// abc", "////cde", "//fg"].join("\n"), doc.toString());
}, },
"test: toggle comment on a comment line with leading white space": function() { "test: toggle comment on a comment line with leading white space": function() {
var doc = new Document(["//cde", " //fg"]); var doc = new Document(["//cde", " //fg"]);
var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, 0, 1);
var comment = this.mode.toggleCommentLines("start", doc, range);
assertEquals(["cde", " fg"].join("\n"), doc.toString()); assertEquals(["cde", " fg"].join("\n"), doc.toString());
}, },

View file

@ -38,7 +38,6 @@
define(function(require, exports, module) { define(function(require, exports, module) {
var Document = require("ace/document").Document; var Document = require("ace/document").Document;
var Range = require("ace/range").Range;
var Text = require("ace/mode/text").Mode; var Text = require("ace/mode/text").Mode;
var TextTest = new TestCase("mode.TextTest", { var TextTest = new TestCase("mode.TextTest", {
@ -50,8 +49,7 @@ var TextTest = new TestCase("mode.TextTest", {
"test: toggle comment lines should not do anything" : function() { "test: toggle comment lines should not do anything" : function() {
var doc = new Document([" abc", "cde", "fg"]); var doc = new Document([" abc", "cde", "fg"]);
var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, 0, 1);
var comment = this.mode.toggleCommentLines("start", doc, range);
assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString()); assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString());
}, },

View file

@ -38,7 +38,6 @@
define(function(require, exports, module) { define(function(require, exports, module) {
var Document = require("ace/document").Document; var Document = require("ace/document").Document;
var Range = require("ace/range").Range;
var Tokenizer = require("ace/tokenizer").Tokenizer; var Tokenizer = require("ace/tokenizer").Tokenizer;
var Xml = require("ace/mode/xml").Mode; var Xml = require("ace/mode/xml").Mode;
@ -60,8 +59,7 @@ var XmlTest = new TestCase("mode.XmlTest", {
"test: toggle comment lines should not do anything" : function() { "test: toggle comment lines should not do anything" : function() {
var doc = new Document([" abc", "cde", "fg"]); var doc = new Document([" abc", "cde", "fg"]);
var range = new Range(0, 3, 1, 1); var comment = this.mode.toggleCommentLines("start", doc, 0, 1);
var comment = this.mode.toggleCommentLines("start", doc, range);
assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString()); assertEquals([" abc", "cde", "fg"].join("\n"), doc.toString());
}, },

View file

@ -114,8 +114,7 @@ var Test = {
editor.indent(); editor.indent();
assert.equal(["a12345", " b12345", " c12345"].join("\n"), assert.equal(["a12345", " b12345", " c12345"].join("\n"), doc.toString());
doc.toString());
assert.position(editor.getCursorPosition(), 2, 7); assert.position(editor.getCursorPosition(), 2, 7);
@ -124,6 +123,17 @@ var Test = {
assert.position(range.end, 2, 7); assert.position(range.end, 2, 7);
}, },
"test: indent selected lines" : function() {
var doc = new Document(["a12345", "b12345", "c12345"].join("\n"));
var editor = new Editor(new MockRenderer(), doc);
editor.moveCursorTo(1, 0);
editor.getSelection().selectDown();
editor.indent();
assert.equal(["a12345", " b12345", "c12345"].join("\n"), doc.toString());
},
"test: outdent block" : function() { "test: outdent block" : function() {
var doc = new Document([" a12345", " b12345", " c12345"].join("\n")); var doc = new Document([" a12345", " b12345", " c12345"].join("\n"));
var editor = new Editor(new MockRenderer(), doc); var editor = new Editor(new MockRenderer(), doc);
@ -166,7 +176,6 @@ var Test = {
editor.moveCursorTo(0, 2); editor.moveCursorTo(0, 2);
editor.getSelection().selectDown(); editor.getSelection().selectDown();
editor.toggleCommentLines(); editor.toggleCommentLines();
assert.equal(["// abc", "//cde"].join("\n"), doc.toString()); assert.equal(["// abc", "//cde"].join("\n"), doc.toString());
@ -191,6 +200,21 @@ var Test = {
assert.range(editor.getSelectionRange(), 0, 0, 1, 1); assert.range(editor.getSelectionRange(), 0, 0, 1, 1);
}, },
"test: toggle comment lines twice should return the original text" : function() {
var doc = new Document([" abc", "cde", "fg"], new JavaScriptMode());
var editor = new Editor(new MockRenderer(), doc);
editor.moveCursorTo(0, 0);
editor.getSelection().selectDown();
editor.getSelection().selectDown();
editor.toggleCommentLines();
editor.toggleCommentLines();
assert.equal([" abc", "cde", "fg"].join("\n"), doc.toString());
},
"test: comment lines - if the selection end is at the line start it should stay there": function() { "test: comment lines - if the selection end is at the line start it should stay there": function() {
//select down //select down
var doc = new Document(["abc", "cde"].join("\n"), new JavaScriptMode()); var doc = new Document(["abc", "cde"].join("\n"), new JavaScriptMode());