diff --git a/src/ace/Selection.js b/src/ace/Selection.js index f4ba4be7..f29cf1b8 100644 --- a/src/ace/Selection.js +++ b/src/ace/Selection.js @@ -67,18 +67,29 @@ ace.Selection = function(doc) { var anchor = this.getSelectionAnchor(); var lead = this.getSelectionLead(); - this.setSelectionAnchor(anchor.row, anchor.column + columns); - this.$moveSelection(function() { - this.moveCursorTo(lead.row, lead.column + columns); - }); + var isBackwards = this.$isBackwards(); + + if (!isBackwards || anchor.column !== 0) + this.setSelectionAnchor(anchor.row, anchor.column + columns); + + if (isBackwards || lead.column !== 0) { + this.$moveSelection(function() { + this.moveCursorTo(lead.row, lead.column + columns); + }); + } + }; + + this.$isBackwards = function() { + var anchor = this.selectionAnchor || this.selectionLead; + var lead = this.selectionLead; + return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); }; this.getRange = function() { var anchor = this.selectionAnchor || this.selectionLead; var lead = this.selectionLead; - if (anchor.row > lead.row - || (anchor.row == lead.row && anchor.column > lead.column)) { + if (this.$isBackwards()) { return ace.Range.fromPoints(lead, anchor); } else { diff --git a/src/ace/mode/JavaScript.js b/src/ace/mode/JavaScript.js index 35329f03..e8076ab6 100644 --- a/src/ace/mode/JavaScript.js +++ b/src/ace/mode/JavaScript.js @@ -9,11 +9,32 @@ ace.inherits(ace.mode.JavaScript, ace.mode.Text); (function() { this.toggleCommentLines = function(state, doc, range) { - var addedRows = doc.outdentRows(range, "//"); - if (addedRows == 0) { - var addedRows = doc.indentRows(range, "//"); - }; - return addedRows; + var outdent = true; + var outentedRows = []; + var re = /^(\s*)\/\//; + + for (var i=range.start.row; i<= range.end.row; i++) { + if (!re.test(doc.getLine(i))) { + outdent = false; + break; + } + } + + if (outdent) { + var deleteRange = new ace.Range(0, 0, 0, 0); + for (var i=range.start.row; i<= range.end.row; i++) + { + var line = doc.getLine(i).replace(re, "$1"); + deleteRange.start.row = i; + deleteRange.end.row = i; + deleteRange.end.column = line.length + 2; + doc.replace(deleteRange, line); + } + return -2; + } + else { + return doc.indentRows(range, "//"); + } }; this.getNextLineIndent = function(state, line, tab) { diff --git a/src/test/ace/TextEditTest.js b/src/test/ace/TextEditTest.js index f05ef3cc..c31650c9 100644 --- a/src/test/ace/TextEditTest.js +++ b/src/test/ace/TextEditTest.js @@ -145,10 +145,29 @@ var TextEditTest = TestCase("TextEditTest", editor.toggleCommentLines(); assertEquals([" abc", "cde"].join("\n"), doc.toString()); + assertRange(0, 0, 1, 1, editor.getSelectionRange()); + }, - var selection = editor.getSelectionRange(); - assertPosition(0, 0, selection.start); - assertPosition(1, 1, selection.end); + "test: comment lines - if the selection end is at the line start it should stay there": function() { + //select down + var doc = new ace.Document(["abc", "cde"].join("\n"), new ace.mode.JavaScript()); + var editor = new ace.Editor(new MockRenderer(), doc); + + editor.moveCursorTo(0, 0); + editor.getSelection().selectDown(); + + editor.toggleCommentLines(); + assertRange(0, 2, 1, 0, editor.getSelectionRange()); + + // select up + var doc = new ace.Document(["abc", "cde"].join("\n"), new ace.mode.JavaScript()); + var editor = new ace.Editor(new MockRenderer(), doc); + + editor.moveCursorTo(1, 0); + editor.getSelection().selectUp(); + + editor.toggleCommentLines(); + assertRange(0, 2, 1, 0, editor.getSelectionRange()); }, "test: move lines down should select moved lines" : function() { diff --git a/src/test/ace/mode/JavaScriptTest.js b/src/test/ace/mode/JavaScriptTest.js index 1a03692d..79f49330 100644 --- a/src/test/ace/mode/JavaScriptTest.js +++ b/src/test/ace/mode/JavaScriptTest.js @@ -37,6 +37,14 @@ var JavaScriptTest = new TestCase("mode.JavaScriptTest", { assertEquals(["//// abc", "////cde", "//fg"].join("\n"), doc.toString()); }, + "test: toggle comment on a comment line with leading white space": function() { + var doc = new ace.Document(["//cde", " //fg"]); + + var range = new ace.Range(0, 3, 1, 1); + var comment = this.mode.toggleCommentLines("start", doc, range); + assertEquals(["cde", " fg"].join("\n"), doc.toString()); + }, + "test: auto indent after opening brace" : function() { assertEquals(" ", this.mode.getNextLineIndent("start", "if () {", " ")); },