mirror of
https://github.com/atom/atom.git
synced 2026-01-23 05:48:10 -05:00
Back DisplayBuffer with a telepath document
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user