From 55a5f1b30eb6d8361d38b42ed5b9a0628ea38391 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Tue, 6 Mar 2012 19:15:13 -0700 Subject: [PATCH] Install Renderer in Editor instead of LineWrapper & LineFolder --- spec/atom/editor-spec.coffee | 14 +++++------- spec/atom/renderer-spec.coffee | 13 +++++++++++ src/atom/editor.coffee | 41 +++++++++++++++++----------------- src/atom/renderer.coffee | 18 +++++++++++++++ src/atom/selection.coffee | 2 +- 5 files changed, 57 insertions(+), 31 deletions(-) diff --git a/spec/atom/editor-spec.coffee b/spec/atom/editor-spec.coffee index fde0b4645..57273e0b1 100644 --- a/spec/atom/editor-spec.coffee +++ b/spec/atom/editor-spec.coffee @@ -63,7 +63,7 @@ describe "Editor", -> editor.attachToDom() - expect(editor.lineWrapper.maxLength).toBe 50 + expect(editor.renderer.maxLineLength).toBe 50 it "wraps lines that are too long to fit within the editor's width, adjusting cursor positioning accordingly", -> expect(editor.lines.find('.line').length).toBe 16 @@ -106,10 +106,10 @@ describe "Editor", -> expect(editor.setMaxLineLength).not.toHaveBeenCalled() it "allows the cursor to move down to the last line", -> - _.times editor.lastScreenRow(), -> editor.moveCursorDown() - expect(editor.getCursorScreenPosition()).toEqual [editor.lastScreenRow(), 0] + _.times editor.lastRow(), -> editor.moveCursorDown() + expect(editor.getCursorScreenPosition()).toEqual [editor.lastRow(), 0] editor.moveCursorDown() - expect(editor.getCursorScreenPosition()).toEqual [editor.lastScreenRow(), 2] + expect(editor.getCursorScreenPosition()).toEqual [editor.lastRow(), 2] it "allows the cursor to move up to a shorter soft wrapped line", -> editor.setCursorScreenPosition([11, 15]) @@ -148,8 +148,6 @@ describe "Editor", -> describe "when wrapping is on", -> it "renders a • instead of line number for wrapped portions of lines", -> - - describe "cursor movement", -> describe ".setCursorScreenPosition({row, column})", -> beforeEach -> @@ -378,7 +376,7 @@ describe "Editor", -> beforeEach -> setEditorWidthInChars(editor, 50) editor.setSoftWrap(true) - editor.lineFolder.createFold(new Range([3, 3], [3, 7])) + editor.createFold(new Range([3, 3], [3, 7])) describe "when it is a single click", -> it "re-positions the cursor from the clicked screen position to the corresponding buffer position", -> @@ -839,5 +837,3 @@ describe "Editor", -> expect(editor.lines.find('.line:eq(5)').text()).toBe ' current = items.shift();' expect(editor.getCursorBufferPosition()).toEqual [4, 29] - - diff --git a/spec/atom/renderer-spec.coffee b/spec/atom/renderer-spec.coffee index 76c6579f6..ac4d383c8 100644 --- a/spec/atom/renderer-spec.coffee +++ b/spec/atom/renderer-spec.coffee @@ -12,6 +12,7 @@ describe "Renderer", -> describe "soft wrapping", -> beforeEach -> renderer.setMaxLineLength(50) + changeHandler.reset() describe "rendering of soft-wrapped lines", -> describe "when the line is shorter than the max line length", -> @@ -135,6 +136,18 @@ describe "Renderer", -> expect(renderer.screenPositionForBufferPosition([4, 5])).toEqual([5, 5]) expect(renderer.bufferPositionForScreenPosition([5, 5])).toEqual([4, 5]) + describe ".setMaxLineLength(length)", -> + it "changes the length at which lines are wrapped and emits a change event for all screen lines", -> + renderer.setMaxLineLength(40) + expect(tokensText renderer.lineForRow(4).tokens).toBe 'left = [], right = [];' + expect(tokensText renderer.lineForRow(5).tokens).toBe ' while(items.length > 0) {' + expect(tokensText renderer.lineForRow(12).tokens).toBe 'sort(left).concat(pivot).concat(sort(rig' + + expect(changeHandler).toHaveBeenCalled() + [event] = changeHandler.argsForCall[0] + expect(event.oldRange).toEqual([[0, 0], [15, 2]]) + expect(event.newRange).toEqual([[0, 0], [18, 2]]) + describe "folding", -> describe "when folds are created and destroyed", -> describe "when a fold spans multiple lines", -> diff --git a/src/atom/editor.coffee b/src/atom/editor.coffee index ccb771dc8..f1e5e2194 100644 --- a/src/atom/editor.coffee +++ b/src/atom/editor.coffee @@ -2,9 +2,7 @@ Buffer = require 'buffer' Cursor = require 'cursor' Gutter = require 'gutter' -Highlighter = require 'highlighter' -LineFolder = require 'line-folder' -LineWrapper = require 'line-wrapper' +Renderer = require 'renderer' Point = require 'point' Range = require 'range' Selection = require 'selection' @@ -32,7 +30,7 @@ class Editor extends View selection: null buffer: null highlighter: null - lineWrapper: null + renderer: null undoManager: null initialize: () -> @@ -150,21 +148,19 @@ class Editor extends View @lines.append @buildLineElement(screenLine) getScreenLines: -> - @lineWrapper.getLines() + @renderer.getLines() - linesForScreenRows: (start, end) -> - @lineWrapper.linesForScreenRows(start, end) + linesForRows: (start, end) -> + @renderer.linesForRows(start, end) screenLineCount: -> - @lineWrapper.lineCount() + @renderer.lineCount() - lastScreenRow: -> + lastRow: -> @screenLineCount() - 1 setBuffer: (@buffer) -> - @highlighter = new Highlighter(@buffer) - @lineFolder = new LineFolder(@highlighter) - @lineWrapper = new LineWrapper(Infinity, @lineFolder) + @renderer = new Renderer(@buffer) @undoManager = new UndoManager(@buffer) @renderLines() @gutter.renderLineNumbers(@getScreenLines()) @@ -174,12 +170,12 @@ class Editor extends View @buffer.on 'change', (e) => @cursor.bufferChanged(e) - @lineWrapper.on 'change', (e) => + @renderer.on 'change', (e) => @gutter.renderLineNumbers(@getScreenLines()) @cursor.refreshScreenPosition() { oldRange, newRange } = e - screenLines = @linesForScreenRows(newRange.start.row, newRange.end.row) + screenLines = @linesForRows(newRange.start.row, newRange.end.row) if newRange.end.row > oldRange.end.row # update, then insert elements for row in [newRange.start.row..newRange.end.row] @@ -223,7 +219,10 @@ class Editor extends View else Infinity - @lineWrapper.setMaxLength(maxLength) if maxLength + @renderer.setMaxLineLength(maxLength) if maxLength + + createFold: (range) -> + @renderer.createFold(range) setSoftWrap: (@softWrap) -> @setMaxLineLength() @@ -234,7 +233,7 @@ class Editor extends View $(window).off 'resize', @_setMaxLineLength clipScreenPosition: (screenPosition, options={}) -> - @lineWrapper.clipScreenPosition(screenPosition, options) + @renderer.clipScreenPosition(screenPosition, options) pixelPositionForScreenPosition: ({row, column}) -> { top: row * @lineHeight, left: @linesPositionLeft() + column * @charWidth } @@ -246,16 +245,16 @@ class Editor extends View screenPosition = new Point(Math.floor(top / @lineHeight), Math.floor(left / @charWidth)) screenPositionForBufferPosition: (position) -> - @lineWrapper.screenPositionForBufferPosition(position) + @renderer.screenPositionForBufferPosition(position) bufferPositionForScreenPosition: (position) -> - @lineWrapper.bufferPositionForScreenPosition(position) + @renderer.bufferPositionForScreenPosition(position) screenRangeForBufferRange: (range) -> - @lineWrapper.screenRangeForBufferRange(range) + @renderer.screenRangeForBufferRange(range) bufferRangeForScreenRange: (range) -> - @lineWrapper.bufferRangeForScreenRange(range) + @renderer.bufferRangeForScreenRange(range) screenPositionFromMouseEvent: (e) -> { pageX, pageY } = e @@ -322,6 +321,6 @@ class Editor extends View @undoManager.redo() destroyFold: (foldId) -> - fold = @lineFolder.foldsById[foldId] + fold = @renderer.foldsById[foldId] fold.destroy() @setCursorBufferPosition(fold.start) diff --git a/src/atom/renderer.coffee b/src/atom/renderer.coffee index 18691763e..e24193ade 100644 --- a/src/atom/renderer.coffee +++ b/src/atom/renderer.coffee @@ -31,7 +31,10 @@ class Renderer @lineMap.insertAtInputRow 0, @buildLinesForBufferRows(0, @buffer.lastRow()) setMaxLineLength: (@maxLineLength) -> + oldRange = @rangeForAllLines() @buildLineMap() + newRange = @rangeForAllLines() + @trigger 'change', { oldRange, newRange } lineForRow: (row) -> @lineMap.lineForOutputRow(row) @@ -39,6 +42,9 @@ class Renderer linesForRows: (startRow, endRow) -> @lineMap.linesForOutputRows(startRow, endRow) + getLines: -> + @lineMap.linesForOutputRows(0, @lineMap.lastOutputRow()) + createFold: (bufferRange) -> bufferRange = Range.fromObject(bufferRange) return if bufferRange.isEmpty() @@ -81,6 +87,15 @@ class Renderer screenRangeForBufferRange: (bufferRange) -> @lineMap.outputRangeForInputRange(bufferRange) + bufferRangeForScreenRange: (screenRange) -> + @lineMap.inputRangeForOutputRange(screenRange) + + lineCount: -> + @lineMap.outputLineCount() + + lastRow: -> + @lineCount() - 1 + logLines: -> @lineMap.logLines() @@ -193,4 +208,7 @@ class Renderer { start, end } = bufferRange new Range([start.row, 0], [end.row, @lineMap.lineForInputRow(end.row).text.length]) + rangeForAllLines: -> + new Range([0, 0], @clipScreenPosition([Infinity, Infinity])) + _.extend Renderer.prototype, EventEmitter diff --git a/src/atom/selection.coffee b/src/atom/selection.coffee index c8e6f51e6..8fe9b8a67 100644 --- a/src/atom/selection.coffee +++ b/src/atom/selection.coffee @@ -168,5 +168,5 @@ class Selection extends View fold: -> range = @getBufferRange() - @editor.lineFolder.createFold(range) + @editor.createFold(range) @cursor.setBufferPosition(range.end)