From 37913f80a1471fe0570c364debae21df8e3c77f5 Mon Sep 17 00:00:00 2001 From: Eddy Bruel Date: Tue, 2 Nov 2010 14:43:48 +0100 Subject: [PATCH 1/4] Fixed a bug in the auto-indentation where already existing whitespace was not taken into account. --- lib/ace/Editor.js | 78 +++++++++++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 29 deletions(-) diff --git a/lib/ace/Editor.js b/lib/ace/Editor.js index 99c80d77..da1c1a5e 100644 --- a/lib/ace/Editor.js +++ b/lib/ace/Editor.js @@ -147,11 +147,7 @@ var Editor = function(renderer, doc) { this.setTheme = function(theme) { this.renderer.setTheme(theme); }; - - this.setShowGutter = function(show){ - this.renderer.setShowGutter(show); - } - + this.$highlightBrackets = function() { if (this.$bracketHighlight) { this.renderer.removeMarker(this.$bracketHighlight); @@ -393,11 +389,11 @@ var Editor = function(renderer, doc) { this.clearSelection(); - var _self = this; - var row = cursor.row; - this.bgTokenizer.getState(cursor.row-1, function (lineState) { - var shouldOutdent = _self.mode.checkOutdent(lineState, _self.doc.getLine(row), text); - var line = _self.doc.getLine(row); + var _self = this; + this.bgTokenizer.getState(cursor.row, function (lineState) { + var shouldOutdent = _self.mode.checkOutdent(lineState, _self.doc.getLine(cursor.row), text); + var line = _self.doc.getLine(cursor.row), + lineIndent = _self.mode.getNextLineIndent(lineState, line, _self.doc.getTabString()); var end = _self.doc.insert(cursor, text); /* TODO: This shortcut is somehow broken @@ -408,15 +404,45 @@ var Editor = function(renderer, doc) { } */ - var line = _self.doc.getLine(row); - _self.bgTokenizer.getState(row, function(lineState) { + _self.bgTokenizer.getState(cursor.row, function(lineState) { // multi line insert - if (row !== end.row) { - var indent = _self.mode.getNextLineIndent(lineState, line, _self.doc.getTabString()); - if (indent) { - var indentRange = new Range(row+1, 0, end.row, end.column); - end.column += _self.doc.indentRows(indentRange, indent); + if (cursor.row != end.row) { + var size = _self.doc.getTabSize(), + minIndent = Number.MAX_VALUE; + + console.log("line indent " + lineIndent.length); + for (var row = cursor.row + 1; row <= end.row; ++row) { + var indent = 0; + + line = _self.doc.getLine(row); + for (var i = 0; i < line.length; ++i) + if (line.charAt(i) == '\t') + indent += size; + else if (line.charAt(i) == ' ') + indent += 1; + else + break; + console.log("Indent " + indent + "(" + line.length + ")"); + if (line.length != 0) + minIndent = Math.min(indent, minIndent); } + console.log("min indent " + minIndent); + for (var row = cursor.row + 1; row <= end.row; ++row) { + var outdent = minIndent; + + line = _self.doc.getLine(row); + for (var i = 0; i < line.length && outdent > 0; ++i) + if (line.charAt(i) == '\t') + outdent -= size; + else if (line.charAt(i) == ' ') + outdent -= 1; + console.log("from '" + line); + console.log("to '" + line.substr(i)); + _self.doc.replace(new Range(row, 0, row, line.length), line.substr(i)); + } + end.column += _self.doc.indentRows( + new Range(cursor.row + 1, 0, end.row, end.column), + lineIndent); } else { if (shouldOutdent) { end.column += _self.mode.autoOutdent(lineState, _self.doc, row); @@ -692,24 +718,18 @@ var Editor = function(renderer, doc) { this.getLastVisibleRow = function() { return this.renderer.getLastVisibleRow(); }; - - this.getFirstFullyVisibleRow = function(){ - return this.renderer.getFirstFullyVisibleRow(); - } - - this.getLastFullyVisibleRow = function(){ - return this.renderer.getLastFullyVisibleRow(); - } this.isRowVisible = function(row) { - return (row >= this.getFirstFullyVisibleRow() && row <= this.getLastFullyVisibleRow()); + return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); }; this.getVisibleRowCount = function() { return this.getLastVisibleRow() - this.getFirstVisibleRow() + 1; }; - this.getPageDownRow = this.getLastFullyVisibleRow; + this.getPageDownRow = function() { + return this.renderer.getLastVisibleRow() - 1; + }; this.getPageUpRow = function() { var firstRow = this.renderer.getFirstVisibleRow(); @@ -800,11 +820,11 @@ var Editor = function(renderer, doc) { }; - this.gotoLine = function(lineNumber, column) { + this.gotoLine = function(lineNumber, row) { this.selection.clearSelection(); this.$blockScrolling = true; - this.moveCursorTo(lineNumber-1, column || 0); + this.moveCursorTo(lineNumber-1, row || 0); this.$blockScrolling = false; if (!this.isRowVisible(this.getCursorPosition().row)) { From e02afd98068224573814b042c4c85d2d7e08aca6 Mon Sep 17 00:00:00 2001 From: Eddy Bruel Date: Tue, 2 Nov 2010 15:14:38 +0100 Subject: [PATCH 2/4] Small fix in audo-indentation. --- lib/ace/Document.js | 2 +- lib/ace/Editor.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ace/Document.js b/lib/ace/Document.js index 5814b8c6..74d021c2 100644 --- a/lib/ace/Document.js +++ b/lib/ace/Document.js @@ -25,7 +25,7 @@ var Document = function(text, mode) { if (mode) { this.setMode(mode); } - + if (lang.isArray(text)) { this.$insertLines(0, text); } else { diff --git a/lib/ace/Editor.js b/lib/ace/Editor.js index da1c1a5e..8aa330d5 100644 --- a/lib/ace/Editor.js +++ b/lib/ace/Editor.js @@ -423,7 +423,7 @@ var Editor = function(renderer, doc) { else break; console.log("Indent " + indent + "(" + line.length + ")"); - if (line.length != 0) + if (/[^\s]$/.test(line)) minIndent = Math.min(indent, minIndent); } console.log("min indent " + minIndent); From 5d9f8cf0e9556e06ffc77745b43924c393eae723 Mon Sep 17 00:00:00 2001 From: Eddy Bruel Date: Tue, 2 Nov 2010 16:03:01 +0100 Subject: [PATCH 3/4] Fixed single replace and removed several spurious log messages. --- lib/ace/Editor.js | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/lib/ace/Editor.js b/lib/ace/Editor.js index 79a2e73b..902b2eab 100644 --- a/lib/ace/Editor.js +++ b/lib/ace/Editor.js @@ -414,7 +414,6 @@ var Editor = function(renderer, doc) { var size = _self.doc.getTabSize(), minIndent = Number.MAX_VALUE; - console.log("line indent " + lineIndent.length); for (var row = cursor.row + 1; row <= end.row; ++row) { var indent = 0; @@ -426,11 +425,9 @@ var Editor = function(renderer, doc) { indent += 1; else break; - console.log("Indent " + indent + "(" + line.length + ")"); if (/[^\s]$/.test(line)) minIndent = Math.min(indent, minIndent); } - console.log("min indent " + minIndent); for (var row = cursor.row + 1; row <= end.row; ++row) { var outdent = minIndent; @@ -440,8 +437,6 @@ var Editor = function(renderer, doc) { outdent -= size; else if (line.charAt(i) == ' ') outdent -= 1; - console.log("from '" + line); - console.log("to '" + line.substr(i)); _self.doc.replace(new Range(row, 0, row, line.length), line.substr(i)); } end.column += _self.doc.indentRows( @@ -766,8 +761,6 @@ var Editor = function(renderer, doc) { }; this.gotoPageDown = function() { - console.log("Goto page down"); - var row = this.getPageDownRow(), column = Math.min(this.getCursorPosition().column, this.doc.getLine(row).length); @@ -777,8 +770,6 @@ var Editor = function(renderer, doc) { }; this.gotoPageUp = function() { - console.log("Goto page up"); - var row = this.getPageUpRow(), column = Math.min(this.getCursorPosition().column, this.doc.getLine(row).length); @@ -922,20 +913,21 @@ var Editor = function(renderer, doc) { }; this.replace = function(replacement, options) { - if (options) - this.$search.set(options); - var range = this.$tryReplace(this.getSelectionRange(), replacement); - if (range !== null) - this.selection.setSelectionRange(range); - this.$updateDesiredColumn(); + console.log("replacing with " + replacement); + if (options) + this.$search.set(options); + + var range = this.$search.find(this.doc); + this.$tryReplace(range, replacement); + if (range !== null) + this.selection.setSelectionRange(range); + this.$updateDesiredColumn(); }, this.replaceAll = function(replacement, options) { if (options) { - console.log("Find " + options.needle); this.$search.set(options); } - console.log("Replace " + replacement); this.clearSelection(); this.selection.moveCursorTo(0, 0); @@ -945,7 +937,8 @@ var Editor = function(renderer, doc) { for (var i = ranges.length - 1; i >= 0; --i) this.$tryReplace(ranges[i], replacement); - this.selection.setSelectionRange(ranges[0]); + if (ranges[0] !== null) + this.selection.setSelectionRange(ranges[0]); this.$updateDesiredColumn(); }, From 86478b9353be78cb80ede3bd792f6da0e2785ab1 Mon Sep 17 00:00:00 2001 From: Eddy Bruel Date: Tue, 2 Nov 2010 18:24:06 +0100 Subject: [PATCH 4/4] After undoing an insert (which amounts to a remove) there should not be a selection (fixed) --- lib/ace/Document.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/Document.js b/lib/ace/Document.js index bb7b27b7..54aa2030 100644 --- a/lib/ace/Document.js +++ b/lib/ace/Document.js @@ -557,7 +557,7 @@ var Document = function(text, mode) { this.selection.moveCursorToPosition(delta.range.start); } else { this.insert(delta.range.start, delta.text, true); - this.selection.setSelectionRange(delta.range); + this.selection.clearSelection(); } } },