From aa594119b7c33a5614276dac291a96ec5fb7efa1 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Wed, 15 Dec 2010 19:16:44 +0100 Subject: [PATCH] toggleCommentLines and indentRows now take row numbers instead of ranges as arguments --- lib/ace/document.js | 6 +++--- lib/ace/editor.js | 16 ++++++-------- lib/ace/mode/html.js | 2 +- lib/ace/mode/javascript.js | 8 +++---- lib/ace/mode/python.js | 8 +++---- lib/ace/mode/text.js | 2 +- lib/ace/range.js | 2 +- lib/ace/test/mode/css_test.js | 4 +--- lib/ace/test/mode/html_test.js | 2 +- lib/ace/test/mode/javascript_test.js | 21 ++++++++++-------- lib/ace/test/mode/text_test.js | 4 +--- lib/ace/test/mode/xml_test.js | 4 +--- lib/ace/test/text_edit_test.js | 32 ++++++++++++++++++++++++---- 13 files changed, 64 insertions(+), 47 deletions(-) diff --git a/lib/ace/document.js b/lib/ace/document.js index bd4454dc..291ad4c3 100644 --- a/lib/ace/document.js +++ b/lib/ace/document.js @@ -622,12 +622,12 @@ var Document = function(text, mode) { return end; }; - this.indentRows = function(range, indentString) { + this.indentRows = function(startRow, endRow, indentString) { 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.fireChangeEvent(range.start.row, range.end.row); + this.fireChangeEvent(startRow, endRow); return indentString.length; }; diff --git a/lib/ace/editor.js b/lib/ace/editor.js index c8647636..7c18514c 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -469,9 +469,7 @@ var Editor =function(renderer, doc) { outdent -= 1; _self.doc.replace(new Range(row, 0, row, line.length), line.substr(i)); } - end.column += _self.doc.indentRows( - new Range(cursor.row + 1, 0, end.row, end.column), - lineIndent); + end.column += _self.doc.indentRows(cursor.row + 1, end.row, lineIndent); } else { if (shouldOutdent) { end.column += _self.mode.autoOutdent(lineState, _self.doc, cursor.row); @@ -606,9 +604,9 @@ var Editor =function(renderer, doc) { var doc = this.doc, range = this.getSelectionRange(); - if (range.start.row < range.end.row || - range.start.column < range.end.column) { - var count = doc.indentRows(this.getSelectionRange(), "\t"); + if (range.start.row < range.end.row || range.start.column < range.end.column) { + var rows = this.$getSelectedRows(); + var count = doc.indentRows(rows.first, rows.last, "\t"); this.selection.shiftSelection(count); } else { @@ -642,12 +640,10 @@ var Editor =function(renderer, doc) { if (this.$readOnly) return; - var rows = this.$getSelectedRows(); - - var range = new Range(rows.first, 0, rows.last, 0); var _self = this; 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); }); }; diff --git a/lib/ace/mode/html.js b/lib/ace/mode/html.js index a6ecc6c8..3d8f07f5 100644 --- a/lib/ace/mode/html.js +++ b/lib/ace/mode/html.js @@ -54,7 +54,7 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, range) { + this.toggleCommentLines = function(state, doc, startRow, endRow) { return this.$delegate("toggleCommentLines", arguments, function() { return 0; }); diff --git a/lib/ace/mode/javascript.js b/lib/ace/mode/javascript.js index 1e4eb24b..1f5f4c2c 100644 --- a/lib/ace/mode/javascript.js +++ b/lib/ace/mode/javascript.js @@ -52,12 +52,12 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, range) { + this.toggleCommentLines = function(state, doc, startRow, endRow) { var outdent = true; var outentedRows = []; 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))) { outdent = false; break; @@ -66,7 +66,7 @@ oop.inherits(Mode, TextMode); if (outdent) { 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"); deleteRange.start.row = i; @@ -77,7 +77,7 @@ oop.inherits(Mode, TextMode); return -2; } else { - return doc.indentRows(range, "//"); + return doc.indentRows(startRow, endRow, "//"); } }; diff --git a/lib/ace/mode/python.js b/lib/ace/mode/python.js index 7687e553..d60c08b0 100644 --- a/lib/ace/mode/python.js +++ b/lib/ace/mode/python.js @@ -52,12 +52,12 @@ oop.inherits(Mode, TextMode); (function() { - this.toggleCommentLines = function(state, doc, range) { + this.toggleCommentLines = function(state, doc, startRow, endRow) { var outdent = true; var outentedRows = []; 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))) { outdent = false; break; @@ -66,7 +66,7 @@ oop.inherits(Mode, TextMode); if (outdent) { 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"); deleteRange.start.row = i; @@ -77,7 +77,7 @@ oop.inherits(Mode, TextMode); return -2; } else { - return doc.indentRows(range, "#"); + return doc.indentRows(startRow, endRow, "#"); } }; diff --git a/lib/ace/mode/text.js b/lib/ace/mode/text.js index 0e18d038..361dd572 100644 --- a/lib/ace/mode/text.js +++ b/lib/ace/mode/text.js @@ -50,7 +50,7 @@ var Mode = function() { return this.$tokenizer; }; - this.toggleCommentLines = function(state, doc, range) { + this.toggleCommentLines = function(state, doc, startRow, endRow) { return 0; }; diff --git a/lib/ace/range.js b/lib/ace/range.js index ae49f04e..65775cb0 100644 --- a/lib/ace/range.js +++ b/lib/ace/range.js @@ -138,7 +138,7 @@ var Range = function(startRow, startColumn, endRow, endColumn) { return Range.fromPoints(this.start, this.end); }; - this.collapseLines = function() { + this.collapseRows = function() { if (this.end.column == 0) return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) else diff --git a/lib/ace/test/mode/css_test.js b/lib/ace/test/mode/css_test.js index 27b5e55a..cbcefb21 100644 --- a/lib/ace/test/mode/css_test.js +++ b/lib/ace/test/mode/css_test.js @@ -38,7 +38,6 @@ define(function(require, exports, module) { var Document = require("ace/document").Document; -var Range = require("ace/range").Range; var Css = require("ace/mode/css").Mode; 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() { var doc = new Document([" abc", "cde", "fg"].join("\n")); - 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()); }, diff --git a/lib/ace/test/mode/html_test.js b/lib/ace/test/mode/html_test.js index 1e631b55..d37e47e8 100644 --- a/lib/ace/test/mode/html_test.js +++ b/lib/ace/test/mode/html_test.js @@ -51,7 +51,7 @@ var HtmlTest = new TestCase("mode.HtmlTest", { var doc = new Document([" abc", "cde", "fg"]); 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()); }, diff --git a/lib/ace/test/mode/javascript_test.js b/lib/ace/test/mode/javascript_test.js index 52de56d1..ed65caaf 100644 --- a/lib/ace/test/mode/javascript_test.js +++ b/lib/ace/test/mode/javascript_test.js @@ -38,7 +38,6 @@ define(function(require, exports, module) { var Document = require("ace/document").Document; -var Range = require("ace/range").Range; var Tokenizer = require("ace/tokenizer").Tokenizer; 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() { var doc = new Document([" abc", "cde", "fg"]); - 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()); }, "test: toggle comment on commented lines should remove leading '//' chars" : function() { var doc = new Document(["// abc", "//cde", "fg"]); - 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()); }, + "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() { var doc = new Document(["// abc", "//cde", "fg"]); - var range = new Range(0, 3, 2, 1); - var comment = this.mode.toggleCommentLines("start", doc, range); + var comment = this.mode.toggleCommentLines("start", doc, 0, 2); assertEquals(["//// abc", "////cde", "//fg"].join("\n"), doc.toString()); }, "test: toggle comment on a comment line with leading white space": function() { var doc = new Document(["//cde", " //fg"]); - 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(["cde", " fg"].join("\n"), doc.toString()); }, diff --git a/lib/ace/test/mode/text_test.js b/lib/ace/test/mode/text_test.js index ef41e7b3..5f39311e 100644 --- a/lib/ace/test/mode/text_test.js +++ b/lib/ace/test/mode/text_test.js @@ -38,7 +38,6 @@ define(function(require, exports, module) { var Document = require("ace/document").Document; -var Range = require("ace/range").Range; var Text = require("ace/mode/text").Mode; 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() { var doc = new Document([" abc", "cde", "fg"]); - 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()); }, diff --git a/lib/ace/test/mode/xml_test.js b/lib/ace/test/mode/xml_test.js index 8f2962c6..bf3578da 100644 --- a/lib/ace/test/mode/xml_test.js +++ b/lib/ace/test/mode/xml_test.js @@ -38,7 +38,6 @@ define(function(require, exports, module) { var Document = require("ace/document").Document; -var Range = require("ace/range").Range; var Tokenizer = require("ace/tokenizer").Tokenizer; 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() { var doc = new Document([" abc", "cde", "fg"]); - 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()); }, diff --git a/lib/ace/test/text_edit_test.js b/lib/ace/test/text_edit_test.js index ea9b77a9..61658cca 100644 --- a/lib/ace/test/text_edit_test.js +++ b/lib/ace/test/text_edit_test.js @@ -114,8 +114,7 @@ var Test = { editor.indent(); - assert.equal(["a12345", " b12345", " c12345"].join("\n"), - doc.toString()); + assert.equal(["a12345", " b12345", " c12345"].join("\n"), doc.toString()); assert.position(editor.getCursorPosition(), 2, 7); @@ -124,13 +123,24 @@ var Test = { 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() { var doc = new Document([" a12345", " b12345", " c12345"].join("\n")); var editor = new Editor(new MockRenderer(), doc); editor.moveCursorTo(0, 5); editor.getSelection().selectDown(); - editor.getSelection().selectDown(); + editor.getSelection().selectDown(); editor.blockOutdent(); assert.equal(doc.toString(), [" a12345", "b12345", " c12345"].join("\n")); @@ -166,7 +176,6 @@ var Test = { editor.moveCursorTo(0, 2); editor.getSelection().selectDown(); - editor.toggleCommentLines(); assert.equal(["// abc", "//cde"].join("\n"), doc.toString()); @@ -190,6 +199,21 @@ var Test = { assert.equal([" abc", "cde"].join("\n"), doc.toString()); 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() { //select down