Back DisplayBuffer with a telepath document

This commit is contained in:
Nathan Sobo
2013-07-20 16:06:56 -07:00
parent e1f795a352
commit eeeb453cf9
3 changed files with 49 additions and 16 deletions

View File

@@ -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

View File

@@ -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])

View File

@@ -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())