Toggle comment on line with leading whitespace does

This commit is contained in:
Fabian Jakobs 2010-05-18 16:42:11 +02:00
commit 2522cdd288
4 changed files with 73 additions and 14 deletions

View file

@ -67,18 +67,29 @@ ace.Selection = function(doc) {
var anchor = this.getSelectionAnchor(); var anchor = this.getSelectionAnchor();
var lead = this.getSelectionLead(); var lead = this.getSelectionLead();
this.setSelectionAnchor(anchor.row, anchor.column + columns); var isBackwards = this.$isBackwards();
this.$moveSelection(function() {
this.moveCursorTo(lead.row, lead.column + columns); 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() { this.getRange = function() {
var anchor = this.selectionAnchor || this.selectionLead; var anchor = this.selectionAnchor || this.selectionLead;
var lead = this.selectionLead; var lead = this.selectionLead;
if (anchor.row > lead.row if (this.$isBackwards()) {
|| (anchor.row == lead.row && anchor.column > lead.column)) {
return ace.Range.fromPoints(lead, anchor); return ace.Range.fromPoints(lead, anchor);
} }
else { else {

View file

@ -9,11 +9,32 @@ ace.inherits(ace.mode.JavaScript, ace.mode.Text);
(function() { (function() {
this.toggleCommentLines = function(state, doc, range) { this.toggleCommentLines = function(state, doc, range) {
var addedRows = doc.outdentRows(range, "//"); var outdent = true;
if (addedRows == 0) { var outentedRows = [];
var addedRows = doc.indentRows(range, "//"); var re = /^(\s*)\/\//;
};
return addedRows; 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) { this.getNextLineIndent = function(state, line, tab) {

View file

@ -145,10 +145,29 @@ var TextEditTest = TestCase("TextEditTest",
editor.toggleCommentLines(); editor.toggleCommentLines();
assertEquals([" abc", "cde"].join("\n"), doc.toString()); assertEquals([" abc", "cde"].join("\n"), doc.toString());
assertRange(0, 0, 1, 1, editor.getSelectionRange());
},
var selection = editor.getSelectionRange(); "test: comment lines - if the selection end is at the line start it should stay there": function() {
assertPosition(0, 0, selection.start); //select down
assertPosition(1, 1, selection.end); 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() { "test: move lines down should select moved lines" : function() {

View file

@ -37,6 +37,14 @@ var JavaScriptTest = new TestCase("mode.JavaScriptTest", {
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() {
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() { "test: auto indent after opening brace" : function() {
assertEquals(" ", this.mode.getNextLineIndent("start", "if () {", " ")); assertEquals(" ", this.mode.getNextLineIndent("start", "if () {", " "));
}, },