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 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 {

View file

@ -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) {

View file

@ -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() {

View file

@ -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 () {", " "));
},