From 5573252193675b13ffe39444e7de83e9097ae177 Mon Sep 17 00:00:00 2001 From: Julian Viereck Date: Thu, 28 Apr 2011 18:21:36 +0200 Subject: [PATCH] Make Selection.moveCursorFirstLine work again. Fixing some bugs on the way. --- lib/ace/edit_session.js | 10 ++++---- lib/ace/edit_session/fold_line.js | 18 +++++++++++++- lib/ace/edit_session/folding.js | 39 +++++++++++++++++++------------ lib/ace/selection.js | 29 +++++++++++++++-------- lib/ace/test/all_browser.js | 30 ++++++++++++------------ 5 files changed, 80 insertions(+), 46 deletions(-) diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index ec2ef3d1..0eaa721c 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -1325,11 +1325,6 @@ var EditSession = function(text, mode) { docColumn += this.$getStringScreenWidth(line, screenColumn)[1]; - if (foldLine) { - var position = foldLine.idxToPosition(docColumn); - return [position.row, position.column]; - } - // Need to do some clamping action here. if (this.$useWrapMode) { column = splits[screenRow - row] @@ -1343,6 +1338,11 @@ var EditSession = function(text, mode) { docColumn = Math.min(docColumn, line.length); } + if (foldLine) { + var position = foldLine.idxToPosition(docColumn); + return [position.row, position.column]; + } + return [docRow, docColumn, screenRow, row] } diff --git a/lib/ace/edit_session/fold_line.js b/lib/ace/edit_session/fold_line.js index 1a5cb7a3..9bde99a5 100644 --- a/lib/ace/edit_session/fold_line.js +++ b/lib/ace/edit_session/fold_line.js @@ -131,7 +131,7 @@ function FoldLine(foldData, folds) { } stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); - stop = !stop && callback(fold.placeholder, null, null, lastEnd); + stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); // If the user requested to stop the walk or endRow/endColumn is // inside of this fold (comp == 0), then end here. @@ -267,6 +267,22 @@ function FoldLine(foldData, folds) { column: this.end.column + idx }; } + +// this.positionToIdx = function(pos) { +// var row = pos.row; +// var column = pos.column; +// var idx = 0; +// +// this.walk(function(placeholder, row, column, lastColumn) { +// if (placeholder +// var range = new Range(row, lastColumn, row, column); +// var cmp = range.compareEnd(row, column); +// +// if (cmp == 0) { +// idx += +// } +// }); +// } }).call(FoldLine.prototype); exports.FoldLine = FoldLine; diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index c183bc58..e2d8cec2 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -350,41 +350,50 @@ function Folding() { : docRow) }; - this.getFoldDisplayLine = function(foldLine, endRow, endColumn) { + this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) { + if (startRow == null) { + startRow = foldLine.start.row; + startColumn = 0; + } + if (endRow == null) { endRow = foldLine.end.row; endColumn = this.getLine(endRow).length; } // Build the textline using the FoldLine walker. - var line = "", - textLine = ""; + var line = ""; + var lines = this.doc.$lines; + var textLine = ""; foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) { + if (row < startRow) { + return; + } else if (row == startRow) { + if (column < startColumn) { + return; + } + lastColumn = Math.max(startColumn, lastColumn); + } if (placeholder) { textLine += placeholder; } else { - if (isNewRow) { - line = this.getLine(row); - } - textLine += line.substring(lastColumn, column); + textLine += lines[row].substring(lastColumn, column); } }.bind(this), endRow, endColumn); return textLine; }; - this.getDisplayLine = function(row, endColumn) { + this.getDisplayLine = function(row, endColumn, startRow, startColumn) { var foldLine = this.getFoldLine(row); if (!foldLine) { - if (endColumn == null) { - return this.doc.$lines[row]; - } else { - var line = this.doc.$lines[row]; - return line.substring(endColumn); - } + var line; + line = this.doc.$lines[row]; + return line.substring(startColumn || 0, endColumn || line.length); } else { - return this.getFoldDisplayLine(foldLine, row, endColumn); + return this.getFoldDisplayLine( + foldLine, row, endColumn, startRow, startColumn); } }; } diff --git a/lib/ace/selection.js b/lib/ace/selection.js index 2a91ff01..3e86a210 100644 --- a/lib/ace/selection.js +++ b/lib/ace/selection.js @@ -316,18 +316,27 @@ var Selection = function(session) { var row = this.selectionLead.row; var column = this.selectionLead.column; var screenRow = this.session.documentToScreenRow(row, column); - var firstRowColumn = this.session.screenToDocumentColumn(screenRow, 0) - var beforeCursor = this.doc.getLine(row).slice(firstRowColumn, column); + + // Determ the doc-position of the first character at the screen line. + var firstColumnPosition = + this.session.screenToDocumentPosition(screenRow, 0); + + // Determ the string "before" the cursor. + var beforeCursor = this.session.getDisplayLine( + row, column, + firstColumnPosition.row, firstColumnPosition.column); + + // var leadingSpace = beforeCursor.match(/^\s*/); - if (leadingSpace[0].length == 0) { - leadingSpace = this.doc.getLine(row). - substring(firstRowColumn, lastRowColumn). - match(/^\s*/); - this.moveCursorTo(row, firstRowColumn + leadingSpace[0].length); - } else if (leadingSpace[0].length >= column) { - this.moveCursorTo(row, firstRowColumn); + if (leadingSpace[0].length == 0 + || leadingSpace[0].length >= column - firstColumnPosition.column) + { + this.moveCursorTo( + firstColumnPosition.row, firstColumnPosition.column); } else { - this.moveCursorTo(row, firstRowColumn + leadingSpace[0].length); + this.moveCursorTo( + firstColumnPosition.row, + firstColumnPosition.column + leadingSpace[0].length); } }; diff --git a/lib/ace/test/all_browser.js b/lib/ace/test/all_browser.js index 1566cfde..698d3907 100644 --- a/lib/ace/test/all_browser.js +++ b/lib/ace/test/all_browser.js @@ -16,21 +16,21 @@ var tests = [ // require("ace/editor_text_edit_test"), // require("ace/document_test"), require("ace/edit_session_test"), - // require("ace/test/event_emitter_test"), - // require("ace/range_test"), - // require("ace/search_test"), - // require("ace/selection_test"), - // require("ace/virtual_renderer_test"), - // require("ace/anchor_test"), - // require("ace/mode/css_test"), - // require("ace/mode/css_tokenizer_test"), - // require("ace/mode/html_test"), - // require("ace/mode/html_tokenizer_test"), - // require("ace/mode/javascript_test"), - // require("ace/mode/javascript_tokenizer_test"), - // require("ace/mode/text_test"), - // require("ace/mode/xml_test"), - // require("ace/mode/xml_tokenizer_test") +// require("ace/test/event_emitter_test"), +// require("ace/range_test"), +// require("ace/search_test"), + require("ace/selection_test"), +// require("ace/virtual_renderer_test"), +// require("ace/anchor_test"), +// require("ace/mode/css_test"), +// require("ace/mode/css_tokenizer_test"), +// require("ace/mode/html_test"), +// require("ace/mode/html_tokenizer_test"), +// require("ace/mode/javascript_test"), +// require("ace/mode/javascript_tokenizer_test"), +// require("ace/mode/text_test"), +// require("ace/mode/xml_test"), +// require("ace/mode/xml_tokenizer_test") ] async.list(tests)