From 729a8848d36a6feaa7ff2ffc042182742b775982 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Tue, 2 Nov 2010 16:54:04 +0100 Subject: [PATCH 01/13] add support for paddings --- lib/ace/VirtualRenderer.js | 53 ++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/lib/ace/VirtualRenderer.js b/lib/ace/VirtualRenderer.js index 6d0e16a4..3f1ef494 100644 --- a/lib/ace/VirtualRenderer.js +++ b/lib/ace/VirtualRenderer.js @@ -84,10 +84,11 @@ var VirtualRenderer = function(container, theme) { scrollerWidth: 0 }; - this.$updatePrintMargin(); - this.$loop = new RenderLoop(lang.bind(this.$renderChanges, this)); this.$loop.schedule(this.CHANGE_FULL); + + this.$updatePrintMargin(); + this.setPadding(4); }; (function() { @@ -283,12 +284,19 @@ var VirtualRenderer = function(container, theme) { return (this.layerConfig || {}).lastRow || 0; }; + this.$padding = null; + this.setPadding = function(padding) { + this.$padding = padding; + this.content.style.padding = "0 " + padding + "px"; + this.$loop.schedule(this.CHANGE_FULL); + }; + this.onScroll = function(e) { this.scrollToY(e.data); }; this.$updateScrollBar = function() { - this.scrollBar.setInnerHeight(this.doc.getLength() * this.lineHeight); + this.scrollBar.setInnerHeight(this.doc.getLength() * this.lineHeight + this.$padding * 2); this.scrollBar.setScrollTop(this.scrollTop); }; @@ -361,7 +369,7 @@ var VirtualRenderer = function(container, theme) { }; this.$computeLayerConfig = function() { - var offset = this.scrollTop % this.lineHeight; + var offset = (this.scrollTop % this.lineHeight) - this.$padding; var minHeight = this.$size.scrollerHeight + this.lineHeight; var longestLine = this.$getLongestLine(); @@ -373,6 +381,7 @@ var VirtualRenderer = function(container, theme) { var layerConfig = this.layerConfig = { width : longestLine, + padding : this.$padding, firstRow : firstRow, lastRow : lastRow, lineHeight : this.lineHeight, @@ -392,6 +401,7 @@ var VirtualRenderer = function(container, theme) { this.$gutterLayer.element.style.marginTop = (-offset) + "px"; this.content.style.marginTop = (-offset) + "px"; + this.content.style.width = longestLine + "px"; this.content.style.height = minHeight + "px"; }; @@ -428,7 +438,7 @@ var VirtualRenderer = function(container, theme) { if (this.$showInvisibles) charCount += 1; - return Math.max(this.$size.scrollerWidth, Math.round(charCount * this.characterWidth)); + return Math.max(this.$size.scrollerWidth - this.$padding * 2, Math.round(charCount * this.characterWidth)); }; this.addMarker = function(range, clazz, type) { @@ -473,8 +483,8 @@ var VirtualRenderer = function(container, theme) { this.scrollCursorIntoView = function() { var pos = this.$cursorLayer.getPixelPosition(); - var left = pos.left; - var top = pos.top; + var left = pos.left + this.$padding; + var top = pos.top + this.$padding; if (this.getScrollTop() > top) { this.scrollToY(top); @@ -486,13 +496,13 @@ var VirtualRenderer = function(container, theme) { } if (this.scroller.scrollLeft > left) { - this.scroller.scrollLeft = left; + this.scrollToX(left); } if (this.scroller.scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) { - this.scroller.scrollLeft = Math.round(left + this.characterWidth - - this.$size.scrollerWidth); + this.scrollToX(Math.round(left + this.characterWidth + - this.$size.scrollerWidth)); } }, @@ -513,26 +523,37 @@ var VirtualRenderer = function(container, theme) { }; this.scrollToY = function(scrollTop) { - var maxHeight = this.lines.length * this.lineHeight - this.$size.scrollerHeight; + var maxHeight = this.lines.length * this.lineHeight - this.$size.scrollerHeight + this.$padding * 2; var scrollTop = Math.max(0, Math.min(maxHeight, scrollTop)); + if (scrollTop >= maxHeight - this.$padding) + scrollTop = maxHeight; + else if (scrollTop <= this.$padding) + scrollTop = 0; if (this.scrollTop !== scrollTop) { this.scrollTop = scrollTop; this.$loop.schedule(this.CHANGE_SCROLL); } }; + + this.scrollToX = function(scrollLeft) { + if (scrollLeft <= this.$padding) + scrollLeft = 0; + + this.scroller.scrollLeft = scrollLeft; + }; this.scrollBy = function(deltaX, deltaY) { deltaY && this.scrollToY(this.scrollTop + deltaY); - deltaX && (this.scroller.scrollLeft += deltaX); + deltaX && this.scrollToX(this.scroller.scrollLeft + deltaX); }; this.screenToTextCoordinates = function(pageX, pageY) { var canvasPos = this.scroller.getBoundingClientRect(); - var col = Math.round((pageX + this.scroller.scrollLeft - canvasPos.left) + var col = Math.round((pageX + this.scroller.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth); - var row = Math.floor((pageY + this.scrollTop - canvasPos.top) + var row = Math.floor((pageY + this.scrollTop - canvasPos.top - this.$padding) / this.lineHeight); return { @@ -544,7 +565,7 @@ var VirtualRenderer = function(container, theme) { this.textToScreenCoordinates = function(row, column) { var canvasPos = this.scroller.getBoundingClientRect(); - var x = Math.round(this.doc.documentToScreenColumn(row, column) * this.characterWidth); + var x = this.padding + Math.round(this.doc.documentToScreenColumn(row, column) * this.characterWidth); var y = row * this.lineHeight; return { @@ -602,4 +623,4 @@ var VirtualRenderer = function(container, theme) { }).call(VirtualRenderer.prototype); return VirtualRenderer; -}); +}); \ No newline at end of file From 3e1eb8d5928282be3270b180f37cd3585e523bdf Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Tue, 2 Nov 2010 17:06:09 +0100 Subject: [PATCH 02/13] fix detection of doc comments --- lib/ace/mode/DocCommentHighlightRules.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/mode/DocCommentHighlightRules.js b/lib/ace/mode/DocCommentHighlightRules.js index 1b500c6e..915c7d29 100644 --- a/lib/ace/mode/DocCommentHighlightRules.js +++ b/lib/ace/mode/DocCommentHighlightRules.js @@ -41,7 +41,7 @@ oop.inherits(DocCommentHighlightRules, TextHighlightRules); this.getStartRule = function(start) { return { token : "comment.doc", // doc comment - regex : "\\/\\*\\*", + regex : "\\/\\*(?=\\*)", next: start }; }; From ce6e512e9cade4bcc1f11cdd87143b80688661b6 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Tue, 2 Nov 2010 18:28:03 +0100 Subject: [PATCH 03/13] fix first row calculation --- lib/ace/VirtualRenderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/VirtualRenderer.js b/lib/ace/VirtualRenderer.js index 3f1ef494..d7324e17 100644 --- a/lib/ace/VirtualRenderer.js +++ b/lib/ace/VirtualRenderer.js @@ -376,7 +376,7 @@ var VirtualRenderer = function(container, theme) { var widthChanged = !this.layerConfig ? true : (this.layerConfig.width != longestLine); var lineCount = Math.ceil(minHeight / this.lineHeight); - var firstRow = Math.round((this.scrollTop - offset) / this.lineHeight); + var firstRow = Math.max(Math.round((this.scrollTop - offset) / this.lineHeight, 0)); var lastRow = Math.min(this.lines.length, firstRow + lineCount) - 1; var layerConfig = this.layerConfig = { From c0ee8087862d2cde7fa0f7c598dba7692e9d2af1 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Tue, 2 Nov 2010 18:28:49 +0100 Subject: [PATCH 04/13] reset changes lines correctly --- lib/ace/VirtualRenderer.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/ace/VirtualRenderer.js b/lib/ace/VirtualRenderer.js index d7324e17..67bb1482 100644 --- a/lib/ace/VirtualRenderer.js +++ b/lib/ace/VirtualRenderer.js @@ -408,10 +408,7 @@ var VirtualRenderer = function(container, theme) { this.$updateLines = function() { var firstRow = this.$changedLines.firstRow; var lastRow = this.$changedLines.lastRow; - this.$changedLines = { - firstRow: 0, - lastRow: Infinity - }; + this.$changedLines = null; var layerConfig = this.layerConfig; From d9ac4f3abed95cf5cbc71c4c75bfc906f6cac5c0 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Tue, 2 Nov 2010 18:49:14 +0100 Subject: [PATCH 05/13] fix redrawing bugs --- lib/ace/BackgroundTokenizer.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/ace/BackgroundTokenizer.js b/lib/ace/BackgroundTokenizer.js index 57e74f84..c9075639 100644 --- a/lib/ace/BackgroundTokenizer.js +++ b/lib/ace/BackgroundTokenizer.js @@ -120,8 +120,11 @@ var BackgroundTokenizer = function(tokenizer, editor) { this.lines[row] = tokens; } } - else - rows.push(this.lines[row]); + else { + var tokens = this.lines[row]; + state = tokens.state; + rows.push(tokens); + } } return rows; }; From 85422c35ec2a0c2a326e05591847152760232a1f Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Tue, 2 Nov 2010 18:56:08 +0100 Subject: [PATCH 06/13] what a crappy fix --- lib/ace/VirtualRenderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/VirtualRenderer.js b/lib/ace/VirtualRenderer.js index 67bb1482..2e31c6a1 100644 --- a/lib/ace/VirtualRenderer.js +++ b/lib/ace/VirtualRenderer.js @@ -376,7 +376,7 @@ var VirtualRenderer = function(container, theme) { var widthChanged = !this.layerConfig ? true : (this.layerConfig.width != longestLine); var lineCount = Math.ceil(minHeight / this.lineHeight); - var firstRow = Math.max(Math.round((this.scrollTop - offset) / this.lineHeight, 0)); + var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight)); var lastRow = Math.min(this.lines.length, firstRow + lineCount) - 1; var layerConfig = this.layerConfig = { From 89e7b97ea4493d15a83ab24f66a764b0b4f24963 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Tue, 2 Nov 2010 18:58:52 +0100 Subject: [PATCH 07/13] remove log statement --- lib/ace/Editor.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ace/Editor.js b/lib/ace/Editor.js index 902b2eab..43819a8d 100644 --- a/lib/ace/Editor.js +++ b/lib/ace/Editor.js @@ -913,7 +913,6 @@ var Editor = function(renderer, doc) { }; this.replace = function(replacement, options) { - console.log("replacing with " + replacement); if (options) this.$search.set(options); From ab4f1c0e1a6291b1997a4bd27d44cf855f90088b Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Tue, 2 Nov 2010 19:12:43 +0100 Subject: [PATCH 08/13] fix typo fox copy lines down --- lib/ace/conf/keybindings/default_mac.js | 2 +- lib/ace/conf/keybindings/default_win.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ace/conf/keybindings/default_mac.js b/lib/ace/conf/keybindings/default_mac.js index ad1c9f26..0a652dda 100644 --- a/lib/ace/conf/keybindings/default_mac.js +++ b/lib/ace/conf/keybindings/default_mac.js @@ -26,7 +26,7 @@ return { "selectup": "Shift-Up", "golineup": "Up", "copylinesdown": "Command-Option-Down", - "movelinsedown": "Option-Down", + "movelinesdown": "Option-Down", "selecttoend": "Command-Shift-Down", "gotoend": "Command-End|Command-Down", "selectdown": "Shift-Down", diff --git a/lib/ace/conf/keybindings/default_win.js b/lib/ace/conf/keybindings/default_win.js index 6bcb1960..fd5d393c 100644 --- a/lib/ace/conf/keybindings/default_win.js +++ b/lib/ace/conf/keybindings/default_win.js @@ -26,7 +26,7 @@ return { "selectup": "Shift-Up", "golineup": "Up", "copylinesdown": "Ctrl-Alt-Down", - "movelinsedown": "Alt-Down", + "movelinesdown": "Alt-Down", "selecttoend": "Ctrl-Shift-Down", "gotoend": "Ctrl-End|Ctrl-Down", "selectdown": "Shift-Down", From 043dfa705efb7d7b2e2fb3f1ee4427421175edcd Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Tue, 2 Nov 2010 19:24:01 +0100 Subject: [PATCH 09/13] fix: undo broken after move lines --- lib/ace/Document.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/ace/Document.js b/lib/ace/Document.js index 54aa2030..13a87dba 100644 --- a/lib/ace/Document.js +++ b/lib/ace/Document.js @@ -634,20 +634,22 @@ var Document = function(text, mode) { this.moveLinesUp = function(firstRow, lastRow) { if (firstRow <= 0) return 0; - var removed = this.lines.splice(firstRow, lastRow-firstRow+1); - this.$insertLines(firstRow-1, removed); + var removed = this.lines.slice(firstRow, lastRow + 1); + this.$remove(new Range(firstRow, 0, lastRow + 1, 0)); + this.$insertLines(firstRow - 1, removed); - this.fireChangeEvent(firstRow-1, lastRow); + this.fireChangeEvent(firstRow - 1, lastRow); return -1; }; this.moveLinesDown = function(firstRow, lastRow) { if (lastRow >= this.lines.length-1) return 0; - var removed = this.lines.splice(firstRow, lastRow-firstRow+1); + var removed = this.lines.slice(firstRow, lastRow + 1); + this.$remove(new Range(firstRow, 0, lastRow + 1, 0)); this.$insertLines(firstRow+1, removed); - - this.fireChangeEvent(firstRow, lastRow+1); + + this.fireChangeEvent(firstRow, lastRow + 1); return 1; }; From 3e28057caf8b10b7d5a170fd54c16da6bf16db80 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Tue, 2 Nov 2010 19:37:56 +0100 Subject: [PATCH 10/13] navigate line start: toggle between line start and text start --- lib/ace/Selection.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/ace/Selection.js b/lib/ace/Selection.js index 015057dc..7915481c 100644 --- a/lib/ace/Selection.js +++ b/lib/ace/Selection.js @@ -260,11 +260,13 @@ var Selection = function(doc) { var row = this.selectionLead.row; var column = this.selectionLead.column; var beforeCursor = this.doc.getLine(row).slice(0, column); - var leadingSpace = beforeCursor.match(/^\s+/); - if (!leadingSpace || leadingSpace[0].length >= column) - this.moveCursorTo(this.selectionLead.row, 0); + var leadingSpace = beforeCursor.match(/^\s*/); + if (leadingSpace[0].length == 0) + this.moveCursorTo(row, this.doc.getLine(row).match(/^\s*/)[0].length); + else if (leadingSpace[0].length >= column) + this.moveCursorTo(row, 0); else - this.moveCursorTo(this.selectionLead.row, leadingSpace[0].length); + this.moveCursorTo(row, leadingSpace[0].length); }; this.moveCursorLineEnd = function() { From 3c2bd0f76e1349281eefb757c5c3511f7c9605cf Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Wed, 3 Nov 2010 11:12:21 +0100 Subject: [PATCH 11/13] remove top padding --- lib/ace/VirtualRenderer.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/ace/VirtualRenderer.js b/lib/ace/VirtualRenderer.js index 2e31c6a1..b92df7ec 100644 --- a/lib/ace/VirtualRenderer.js +++ b/lib/ace/VirtualRenderer.js @@ -369,7 +369,7 @@ var VirtualRenderer = function(container, theme) { }; this.$computeLayerConfig = function() { - var offset = (this.scrollTop % this.lineHeight) - this.$padding; + var offset = this.scrollTop % this.lineHeight; var minHeight = this.$size.scrollerHeight + this.lineHeight; var longestLine = this.$getLongestLine(); @@ -481,7 +481,7 @@ var VirtualRenderer = function(container, theme) { var pos = this.$cursorLayer.getPixelPosition(); var left = pos.left + this.$padding; - var top = pos.top + this.$padding; + var top = pos.top; if (this.getScrollTop() > top) { this.scrollToY(top); @@ -520,12 +520,10 @@ var VirtualRenderer = function(container, theme) { }; this.scrollToY = function(scrollTop) { - var maxHeight = this.lines.length * this.lineHeight - this.$size.scrollerHeight + this.$padding * 2; + var maxHeight = this.lines.length * this.lineHeight - this.$size.scrollerHeight + this.$padding; var scrollTop = Math.max(0, Math.min(maxHeight, scrollTop)); if (scrollTop >= maxHeight - this.$padding) scrollTop = maxHeight; - else if (scrollTop <= this.$padding) - scrollTop = 0; if (this.scrollTop !== scrollTop) { this.scrollTop = scrollTop; @@ -550,7 +548,7 @@ var VirtualRenderer = function(container, theme) { var col = Math.round((pageX + this.scroller.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth); - var row = Math.floor((pageY + this.scrollTop - canvasPos.top - this.$padding) + var row = Math.floor((pageY + this.scrollTop - canvasPos.top) / this.lineHeight); return { From d14c7e6a581166de15175c95c912d425d064f70c Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Wed, 3 Nov 2010 11:33:48 +0100 Subject: [PATCH 12/13] fix update bug after removing lines --- lib/ace/Document.js | 4 +--- lib/ace/RenderLoop.js | 2 ++ lib/ace/VirtualRenderer.js | 8 +++++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/ace/Document.js b/lib/ace/Document.js index 13a87dba..ee9f025e 100644 --- a/lib/ace/Document.js +++ b/lib/ace/Document.js @@ -513,9 +513,7 @@ var Document = function(text, mode) { this.$remove(range, fromUndo); - this.fireChangeEvent(range.start.row, - !range.isMultiLine() ? range.start.row - : undefined); + this.fireChangeEvent(range.start.row, range.isMultiLine() ? undefined : range.start.row); return range.start; }; diff --git a/lib/ace/RenderLoop.js b/lib/ace/RenderLoop.js index 97c02a83..c1fcd490 100644 --- a/lib/ace/RenderLoop.js +++ b/lib/ace/RenderLoop.js @@ -16,6 +16,8 @@ var RenderLoop = function(onRender) { (function() { this.schedule = function(change) { +// this.onRender(change); +// return; this.changes = this.changes | change; if (!this.pending) { this.pending = true; diff --git a/lib/ace/VirtualRenderer.js b/lib/ace/VirtualRenderer.js index b92df7ec..dbf08e1e 100644 --- a/lib/ace/VirtualRenderer.js +++ b/lib/ace/VirtualRenderer.js @@ -120,6 +120,9 @@ var VirtualRenderer = function(container, theme) { * Triggers partial update of the text layer */ this.updateLines = function(firstRow, lastRow) { + if (lastRow === undefined) + lastRow = Infinity; + if (!this.$changedLines) { this.$changedLines = { firstRow: firstRow, @@ -133,8 +136,6 @@ var VirtualRenderer = function(container, theme) { if (this.$changedLines.lastRow < lastRow) this.$changedLines.lastRow = lastRow; } - if (this.$changedLines.lastRow === undefined) - this.$changedLines.lastRow = Infinity; this.$loop.schedule(this.CHANGE_LINES); }; @@ -186,6 +187,7 @@ var VirtualRenderer = function(container, theme) { }; this.setTokenizer = function(tokenizer) { + this.$tokenizer = tokenizer; this.$textLayer.setTokenizer(tokenizer); this.$loop.schedule(this.CHANGE_TEXT); }; @@ -301,7 +303,7 @@ var VirtualRenderer = function(container, theme) { }; this.$renderChanges = function(changes) { - if (!changes) + if (!changes || !this.doc || !this.$tokenizer) return; // text, scrolling and resize changes can cause the view port size to change From 4c865950ed626ae7ea3107e1f817eac90bac7e66 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Wed, 3 Nov 2010 16:12:03 +0100 Subject: [PATCH 13/13] fix scroll to Y --- lib/ace/VirtualRenderer.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/ace/VirtualRenderer.js b/lib/ace/VirtualRenderer.js index dbf08e1e..21042538 100644 --- a/lib/ace/VirtualRenderer.js +++ b/lib/ace/VirtualRenderer.js @@ -298,7 +298,7 @@ var VirtualRenderer = function(container, theme) { }; this.$updateScrollBar = function() { - this.scrollBar.setInnerHeight(this.doc.getLength() * this.lineHeight + this.$padding * 2); + this.scrollBar.setInnerHeight(this.doc.getLength() * this.lineHeight + this.$padding); this.scrollBar.setScrollTop(this.scrollTop); }; @@ -523,10 +523,11 @@ var VirtualRenderer = function(container, theme) { this.scrollToY = function(scrollTop) { var maxHeight = this.lines.length * this.lineHeight - this.$size.scrollerHeight + this.$padding; - var scrollTop = Math.max(0, Math.min(maxHeight, scrollTop)); if (scrollTop >= maxHeight - this.$padding) scrollTop = maxHeight; + var scrollTop = Math.max(0, Math.min(maxHeight, scrollTop)); + if (this.scrollTop !== scrollTop) { this.scrollTop = scrollTop; this.$loop.schedule(this.CHANGE_SCROLL); @@ -536,7 +537,7 @@ var VirtualRenderer = function(container, theme) { this.scrollToX = function(scrollLeft) { if (scrollLeft <= this.$padding) scrollLeft = 0; - + this.scroller.scrollLeft = scrollLeft; };