diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index 48844144e..b68bed630 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -8,7 +8,7 @@ describe "DisplayBuffer", -> tabLength = 2 atom.activatePackage('javascript-tmbundle', sync: true) buffer = project.bufferForPath('sample.js') - displayBuffer = new DisplayBuffer(buffer, { tabLength }) + displayBuffer = new DisplayBuffer({buffer, tabLength}) changeHandler = jasmine.createSpy 'changeHandler' displayBuffer.on 'changed', changeHandler @@ -16,6 +16,17 @@ describe "DisplayBuffer", -> displayBuffer.destroy() buffer.release() + describe "@deserialize(state)", -> + it "constructs a display buffer with the same buffer, softWrapColumn, and tabLength", -> + displayBuffer.setTabLength(4) + displayBuffer.setSoftWrapColumn(64) + displayBuffer2 = deserialize(displayBuffer.serialize()) + expect(displayBuffer2.id).toBe displayBuffer.id + expect(displayBuffer2.buffer).toBe displayBuffer.buffer + expect(displayBuffer2.tokenizedBuffer.buffer).toBe displayBuffer.tokenizedBuffer.buffer + expect(displayBuffer2.getSoftWrapColumn()).toBe displayBuffer.getSoftWrapColumn() + expect(displayBuffer2.getTabLength()).toBe displayBuffer.getTabLength() + describe ".copy()", -> it "creates a new DisplayBuffer with the same initial state", -> marker1 = displayBuffer.markBufferRange([[1, 2], [3, 4]], id: 1) @@ -168,7 +179,7 @@ describe "DisplayBuffer", -> displayBuffer.destroy() buffer.release() buffer = project.bufferForPath('two-hundred.txt') - displayBuffer = new DisplayBuffer(buffer, { tabLength }) + displayBuffer = new DisplayBuffer({buffer, tabLength}) displayBuffer.on 'changed', changeHandler describe "when folds are created and destroyed", -> @@ -274,7 +285,7 @@ describe "DisplayBuffer", -> describe "when there is another display buffer pointing to the same buffer", -> it "does not create folds in the other display buffer", -> - otherDisplayBuffer = new DisplayBuffer(buffer, { tabLength }) + otherDisplayBuffer = new DisplayBuffer({buffer, tabLength}) displayBuffer.createFold(2, 4) expect(otherDisplayBuffer.foldsStartingAtBufferRow(2).length).toBe 0 diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index ffd3b60b7..fab2f9a7a 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -1,6 +1,7 @@ _ = require 'underscore' guid = require 'guid' -{Point, Range} = require 'telepath' +telepath = require 'telepath' +{Point, Range} = telepath TokenizedBuffer = require 'tokenized-buffer' RowMap = require 'row-map' EventEmitter = require 'event-emitter' @@ -11,30 +12,47 @@ Subscriber = require 'subscriber' module.exports = class DisplayBuffer - @idCounter: 1 screenLines: null rowMap: null tokenizedBuffer: null markers: null foldsByMarkerId: null - ### Internal ### + @acceptsDocuments: true + registerDeserializer(this) + + @deserialize: (state) -> + new DisplayBuffer(state) + + constructor: (optionsOrState) -> + if optionsOrState instanceof telepath.Document + @state = optionsOrState + @id = @state.get('id') + @tokenizedBuffer = deserialize(@state.get('tokenizedBuffer')) + @buffer = @tokenizedBuffer.buffer + else + {@buffer, softWrapColumn} = optionsOrState + @id = guid.create().toString() + @tokenizedBuffer = new TokenizedBuffer(optionsOrState) + @state = telepath.create + deserializer: @constructor.name + id: @id + tokenizedBuffer: @tokenizedBuffer.getState() + softWrapColumn: softWrapColumn ? Infinity - constructor: (@buffer, options={}) -> - @id = guid.create().toString() - @tokenizedBuffer = new TokenizedBuffer(_.defaults({@buffer}, options)) - @softWrapColumn = options.softWrapColumn ? Infinity @markers = {} @foldsByMarkerId = {} @updateAllScreenLines() - @tokenizedBuffer.on 'grammar-changed', (grammar) => @trigger 'grammar-changed', grammar @tokenizedBuffer.on 'changed', @handleTokenizedBufferChange @subscribe @buffer, 'markers-updated', @handleMarkersUpdated @subscribe @buffer, 'marker-created', @handleMarkerCreated + serialize: -> @state.clone() + getState: -> @state + copy: -> - newDisplayBuffer = new DisplayBuffer(@buffer, tabLength: @getTabLength()) + newDisplayBuffer = new DisplayBuffer({@buffer, tabLength: @getTabLength()}) for marker in @findMarkers(displayBufferId: @id) marker.copy(displayBufferId: newDisplayBuffer.id) newDisplayBuffer @@ -62,7 +80,8 @@ class DisplayBuffer # Defines the limit at which the buffer begins to soft wrap text. # # softWrapColumn - A {Number} defining the soft wrap limit. - setSoftWrapColumn: (@softWrapColumn) -> + setSoftWrapColumn: (softWrapColumn) -> + @state.set('softWrapColumn', softWrapColumn) start = 0 end = @getLastRow() @updateAllScreenLines() @@ -70,6 +89,9 @@ class DisplayBuffer bufferDelta = 0 @triggerChanged({ start, end, screenDelta, bufferDelta }) + getSoftWrapColumn: -> + @state.get('softWrapColumn') + # Gets the screen line for the given screen row. # # screenRow - A {Number} indicating the screen row. @@ -379,7 +401,7 @@ class DisplayBuffer # # Returns a {Number} representing the `line` position where the wrap would take place. # Returns `null` if a wrap wouldn't occur. - findWrapColumn: (line, softWrapColumn=@softWrapColumn) -> + findWrapColumn: (line, softWrapColumn=@getSoftWrapColumn()) -> return unless line.length > softWrapColumn if /\s/.test(line[softWrapColumn]) diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index a614b6b78..e5547512d 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -45,7 +45,7 @@ class EditSession @state = optionsOrState {@id, tabLength, softTabs, @softWrap} = @state.toObject() @setBuffer(project.bufferForId(@state.get('bufferId'))) - @setDisplayBuffer(new DisplayBuffer(@buffer, { tabLength })) + @setDisplayBuffer(new DisplayBuffer({@buffer, tabLength})) @addSelection(marker) for marker in @findMarkers(@getSelectionMarkerAttributes()) @setScrollTop(@state.get('scrollTop')) @setScrollLeft(@state.get('scrollLeft')) @@ -59,7 +59,7 @@ class EditSession scrollTop: 0 scrollLeft: 0 @setBuffer(buffer) - @setDisplayBuffer(displayBuffer ? new DisplayBuffer(@buffer, { tabLength })) + @setDisplayBuffer(displayBuffer ? new DisplayBuffer({@buffer, tabLength})) @addCursorAtScreenPosition([0, 0]) unless suppressCursorCreation @languageMode = new LanguageMode(this, @buffer.getExtension())