From 7ade415f252d3ed3b5e753a0aea1e2aeac8d9889 Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 21 Oct 2011 11:09:10 +0500 Subject: [PATCH] toggleFold must fold strings and comments as well --- lib/ace/edit_session.js | 53 +++++++++++++++++++++++---------- lib/ace/edit_session/folding.js | 22 +++++++++++++- 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index 3994488f..9f22e284 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -91,7 +91,7 @@ var EditSession = function(text, mode) { this.doc = doc; doc.on("change", this.onChange.bind(this)); this.on("changeFold", this.onChangeFold.bind(this)); - + if (this.bgTokenizer) { this.bgTokenizer.setDocument(this.getDocument()); this.bgTokenizer.start(0); @@ -136,7 +136,7 @@ var EditSession = function(text, mode) { folds: removedFolds }); } - + this.$informUndoManager.schedule(); } @@ -148,7 +148,7 @@ var EditSession = function(text, mode) { this.doc.setValue(text); this.selection.moveCursorTo(0, 0); this.selection.clearSelection(); - + this.$resetRowCache(0); this.$deltas = []; this.$deltasDoc = []; @@ -173,6 +173,27 @@ var EditSession = function(text, mode) { return this.bgTokenizer.getTokens(firstRow, lastRow); }; + this.getTokenAt = function(row, column) { + var tokens = this.bgTokenizer.getTokens(row, row)[0].tokens; + var token, c = 0; + if (column == null) { + i = tokens.length - 1; + c = this.getLine(row).length; + } else { + for (var i = 0; i < tokens.length; i++) { + c += tokens[i].value.length; + if (c >= column) + break; + } + } + token = tokens[i]; + if (!token) + return null; + token.index = i; + token.start = c - token.value.length; + return token; + }; + this.setUndoManager = function(undoManager) { this.$undoManager = undoManager; this.$resetRowCache(0); @@ -187,7 +208,7 @@ var EditSession = function(text, mode) { var self = this; this.$syncInformUndoManager = function() { self.$informUndoManager.cancel(); - + if (self.$deltasFold.length) { self.$deltas.push({ group: "fold", @@ -195,7 +216,7 @@ var EditSession = function(text, mode) { }); self.$deltasFold = []; } - + if (self.$deltasDoc.length) { self.$deltas.push({ group: "doc", @@ -203,14 +224,14 @@ var EditSession = function(text, mode) { }); self.$deltasDoc = []; } - + if (self.$deltas.length > 0) { undoManager.execute({ action: "aceupdate", args: [self.$deltas, self] }); } - + self.$deltas = []; } this.$informUndoManager = @@ -479,7 +500,7 @@ var EditSession = function(text, mode) { this.bgTokenizer.setDocument(this.getDocument()); this.bgTokenizer.start(0); - + this.tokenRe = mode.tokenRe; this.nonTokenRe = mode.nonTokenRe; @@ -894,7 +915,7 @@ var EditSession = function(text, mode) { this.$clipRowToDocument = function(row) { return Math.max(0, Math.min(row, this.doc.getLength()-1)); }; - + this.$clipPositionToDocument = function(row, column) { column = Math.max(0, column); @@ -910,7 +931,7 @@ var EditSession = function(text, mode) { column = Math.min(this.doc.getLine(row).length, column); } } - + return { row: row, column: column @@ -1433,7 +1454,7 @@ var EditSession = function(text, mode) { column: 0 } } - + var line; var docRow = 0; var docColumn = 0; @@ -1453,7 +1474,7 @@ var EditSession = function(text, mode) { } } var doCache = !rowCache.length || i == rowCache.length; - + // clamp row before clamping column, for selection on last line var maxRow = this.getLength() - 1; @@ -1521,7 +1542,7 @@ var EditSession = function(text, mode) { if (foldLine) { return foldLine.idxToPosition(docColumn); } - + return { row: docRow, column: docColumn @@ -1532,12 +1553,12 @@ var EditSession = function(text, mode) { // Normalize the passed in arguments. if (typeof docColumn === "undefined") var pos = this.$clipPositionToDocument(docRow.row, docRow.column); - else + else pos = this.$clipPositionToDocument(docRow, docColumn); docRow = pos.row; docColumn = pos.column; - + var LL = this.$rowCache.length; var wrapData; @@ -1596,7 +1617,7 @@ var EditSession = function(text, mode) { screenRow += this.getRowLength(row); row = rowEnd; - + if (doCache) { rowCache.push({ docRow: row, diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index d3f442cf..1e6e357c 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -494,7 +494,7 @@ function Folding() { var selection = this.selection; var range = selection.getRange(); - if(range.isEmpty()) { + if (range.isEmpty()) { var cursor = range.start var fold = this.getFoldAt(cursor.row, cursor.column); var bracketPos, column; @@ -517,6 +517,26 @@ function Folding() { range.start = bracketPos; range.start.column++; + } else { + var token = this.getTokenAt(cursor.row, cursor.column); + if (token && /^comment|string/.test(token.type)) { + var startRow = cursor.row; + var endRow = cursor.row; + var t = token; + while ((t = this.getTokenAt(startRow - 1)) && t.type == token.type) { + startRow --; + token = t; + } + range.start.row = startRow; + range.start.column = token.start + 2; + + while ((t = this.getTokenAt(endRow + 1, 0)) && t.type == token.type) { + endRow ++; + token = t; + } + range.end.row = endRow; + range.end.column = token.start + token.value.length - 1; + } } } else { var folds = this.getFoldsInRange(range);