mirror of
https://github.com/atom/atom.git
synced 2026-01-25 06:48:28 -05:00
Add TextEditorMarkerLayer
This commit is contained in:
@@ -8,7 +8,7 @@ Model = require './model'
|
||||
Token = require './token'
|
||||
Decoration = require './decoration'
|
||||
LayerDecoration = require './layer-decoration'
|
||||
TextEditorMarker = require './text-editor-marker'
|
||||
TextEditorMarkerLayer = require './text-editor-marker-layer'
|
||||
|
||||
class BufferToScreenConversionError extends Error
|
||||
constructor: (@message, @metadata) ->
|
||||
@@ -53,7 +53,7 @@ class DisplayBuffer extends Model
|
||||
})
|
||||
@buffer = @tokenizedBuffer.buffer
|
||||
@charWidthsByScope = {}
|
||||
@markers = {}
|
||||
@defaultMarkerLayer = new TextEditorMarkerLayer(this, @buffer.getDefaultMarkerLayer(), true)
|
||||
@foldsByMarkerId = {}
|
||||
@decorationsById = {}
|
||||
@decorationsByMarkerId = {}
|
||||
@@ -832,17 +832,13 @@ class DisplayBuffer extends Model
|
||||
#
|
||||
# Returns the {TextEditorMarker} (if it exists).
|
||||
getMarker: (id) ->
|
||||
unless marker = @markers[id]
|
||||
if bufferMarker = @buffer.getMarker(id)
|
||||
marker = new TextEditorMarker({bufferMarker, displayBuffer: this})
|
||||
@markers[id] = marker
|
||||
marker
|
||||
@defaultMarkerLayer.getMarker(id)
|
||||
|
||||
# Retrieves the active markers in the buffer.
|
||||
#
|
||||
# Returns an {Array} of existing {TextEditorMarker}s.
|
||||
getMarkers: ->
|
||||
@buffer.getMarkers().map ({id}) => @getMarker(id)
|
||||
@defaultMarkerLayer.getMarkers()
|
||||
|
||||
getMarkerCount: ->
|
||||
@buffer.getMarkerCount()
|
||||
@@ -853,9 +849,8 @@ class DisplayBuffer extends Model
|
||||
# options - Options to pass to the {TextEditorMarker} constructor
|
||||
#
|
||||
# Returns a {Number} representing the new marker's ID.
|
||||
markScreenRange: (args...) ->
|
||||
bufferRange = @bufferRangeForScreenRange(args.shift())
|
||||
@markBufferRange(bufferRange, args...)
|
||||
markScreenRange: (screenRange, options) ->
|
||||
@defaultMarkerLayer.markScreenRange(screenRange, options)
|
||||
|
||||
# Public: Constructs a new marker at the given buffer range.
|
||||
#
|
||||
@@ -863,8 +858,8 @@ class DisplayBuffer extends Model
|
||||
# options - Options to pass to the {TextEditorMarker} constructor
|
||||
#
|
||||
# Returns a {Number} representing the new marker's ID.
|
||||
markBufferRange: (range, options) ->
|
||||
@getMarker(@buffer.markRange(range, options).id)
|
||||
markBufferRange: (bufferRange, options) ->
|
||||
@defaultMarkerLayer.markBufferRange(bufferRange, options)
|
||||
|
||||
# Public: Constructs a new marker at the given screen position.
|
||||
#
|
||||
@@ -873,7 +868,7 @@ class DisplayBuffer extends Model
|
||||
#
|
||||
# Returns a {Number} representing the new marker's ID.
|
||||
markScreenPosition: (screenPosition, options) ->
|
||||
@markBufferPosition(@bufferPositionForScreenPosition(screenPosition), options)
|
||||
@defaultMarkerLayer.markScreenPosition(screenPosition, options)
|
||||
|
||||
# Public: Constructs a new marker at the given buffer position.
|
||||
#
|
||||
@@ -882,14 +877,7 @@ class DisplayBuffer extends Model
|
||||
#
|
||||
# Returns a {Number} representing the new marker's ID.
|
||||
markBufferPosition: (bufferPosition, options) ->
|
||||
@getMarker(@buffer.markPosition(bufferPosition, options).id)
|
||||
|
||||
# Public: Removes the marker with the given id.
|
||||
#
|
||||
# id - The {Number} of the ID to remove
|
||||
destroyMarker: (id) ->
|
||||
@buffer.destroyMarker(id)
|
||||
delete @markers[id]
|
||||
@defaultMarkerLayer.markBufferPosition(bufferPosition, options)
|
||||
|
||||
# Finds the first marker satisfying the given attributes
|
||||
#
|
||||
@@ -897,7 +885,7 @@ class DisplayBuffer extends Model
|
||||
#
|
||||
# Returns a {TextEditorMarker} or null
|
||||
findMarker: (params) ->
|
||||
@findMarkers(params)[0]
|
||||
@defaultMarkerLayer.findMarkers(params)[0]
|
||||
|
||||
# Public: Find all markers satisfying a set of parameters.
|
||||
#
|
||||
@@ -918,46 +906,7 @@ class DisplayBuffer extends Model
|
||||
#
|
||||
# Returns an {Array} of {TextEditorMarker}s
|
||||
findMarkers: (params) ->
|
||||
params = @translateToBufferMarkerParams(params)
|
||||
@buffer.findMarkers(params).map (stringMarker) => @getMarker(stringMarker.id)
|
||||
|
||||
translateToBufferMarkerParams: (params) ->
|
||||
bufferMarkerParams = {}
|
||||
for key, value of params
|
||||
switch key
|
||||
when 'startBufferRow'
|
||||
key = 'startRow'
|
||||
when 'endBufferRow'
|
||||
key = 'endRow'
|
||||
when 'startScreenRow'
|
||||
key = 'startRow'
|
||||
value = @bufferRowForScreenRow(value)
|
||||
when 'endScreenRow'
|
||||
key = 'endRow'
|
||||
value = @bufferRowForScreenRow(value)
|
||||
when 'intersectsBufferRowRange'
|
||||
key = 'intersectsRowRange'
|
||||
when 'intersectsScreenRowRange'
|
||||
key = 'intersectsRowRange'
|
||||
[startRow, endRow] = value
|
||||
value = [@bufferRowForScreenRow(startRow), @bufferRowForScreenRow(endRow)]
|
||||
when 'containsBufferRange'
|
||||
key = 'containsRange'
|
||||
when 'containsBufferPosition'
|
||||
key = 'containsPosition'
|
||||
when 'containedInBufferRange'
|
||||
key = 'containedInRange'
|
||||
when 'containedInScreenRange'
|
||||
key = 'containedInRange'
|
||||
value = @bufferRangeForScreenRange(value)
|
||||
when 'intersectsBufferRange'
|
||||
key = 'intersectsRange'
|
||||
when 'intersectsScreenRange'
|
||||
key = 'intersectsRange'
|
||||
value = @bufferRangeForScreenRange(value)
|
||||
bufferMarkerParams[key] = value
|
||||
|
||||
bufferMarkerParams
|
||||
@defaultMarkerLayer.findMarkers(params)
|
||||
|
||||
findFoldMarker: (attributes) ->
|
||||
@findFoldMarkers(attributes)[0]
|
||||
@@ -978,7 +927,7 @@ class DisplayBuffer extends Model
|
||||
|
||||
destroyed: ->
|
||||
fold.destroy() for markerId, fold of @foldsByMarkerId
|
||||
marker.disposables.dispose() for id, marker of @markers
|
||||
@defaultMarkerLayer.destroy()
|
||||
@scopedConfigSubscriptions.dispose()
|
||||
@disposables.dispose()
|
||||
@tokenizedBuffer.destroy()
|
||||
|
||||
80
src/text-editor-marker-layer.coffee
Normal file
80
src/text-editor-marker-layer.coffee
Normal file
@@ -0,0 +1,80 @@
|
||||
TextEditorMarker = require './text-editor-marker'
|
||||
|
||||
module.exports =
|
||||
class TextEditorMarkerLayer
|
||||
constructor: (@displayBuffer, @bufferMarkerLayer, @isDefaultLayer) ->
|
||||
@markersById = {}
|
||||
|
||||
getMarker: (id) ->
|
||||
if editorMarker = @markersById[id]
|
||||
editorMarker
|
||||
else if bufferMarker = @bufferMarkerLayer.getMarker(id)
|
||||
@markersById[id] = new TextEditorMarker(this, bufferMarker)
|
||||
|
||||
getMarkers: ->
|
||||
@bufferMarkerLayer.getMarkers().map ({id}) => @getMarker(id)
|
||||
|
||||
markBufferRange: (bufferRange, options) ->
|
||||
@getMarker(@bufferMarkerLayer.markRange(bufferRange, options).id)
|
||||
|
||||
markScreenRange: (screenRange, options) ->
|
||||
bufferRange = @displayBuffer.bufferRangeForScreenRange(screenRange)
|
||||
@markBufferRange(bufferRange, options)
|
||||
|
||||
markBufferPosition: (bufferPosition, options) ->
|
||||
@getMarker(@bufferMarkerLayer.markPosition(bufferPosition, options).id)
|
||||
|
||||
markScreenPosition: (screenPosition, options) ->
|
||||
bufferPosition = @displayBuffer.bufferPositionForScreenPosition(screenPosition)
|
||||
@markBufferPosition(bufferPosition, options)
|
||||
|
||||
findMarkers: (params) ->
|
||||
params = @translateToBufferMarkerParams(params)
|
||||
@bufferMarkerLayer.findMarkers(params).map (stringMarker) => @getMarker(stringMarker.id)
|
||||
|
||||
destroy: ->
|
||||
if @isDefaultLayer
|
||||
marker.destroy() for id, marker of @markersById
|
||||
else
|
||||
@bufferMarkerLayer.destroy()
|
||||
|
||||
didDestroyMarker: (marker) ->
|
||||
delete @markersById[marker.id]
|
||||
|
||||
translateToBufferMarkerParams: (params) ->
|
||||
bufferMarkerParams = {}
|
||||
for key, value of params
|
||||
switch key
|
||||
when 'startBufferRow'
|
||||
key = 'startRow'
|
||||
when 'endBufferRow'
|
||||
key = 'endRow'
|
||||
when 'startScreenRow'
|
||||
key = 'startRow'
|
||||
value = @displayBuffer.bufferRowForScreenRow(value)
|
||||
when 'endScreenRow'
|
||||
key = 'endRow'
|
||||
value = @displayBuffer.bufferRowForScreenRow(value)
|
||||
when 'intersectsBufferRowRange'
|
||||
key = 'intersectsRowRange'
|
||||
when 'intersectsScreenRowRange'
|
||||
key = 'intersectsRowRange'
|
||||
[startRow, endRow] = value
|
||||
value = [@displayBuffer.bufferRowForScreenRow(startRow), @displayBuffer.bufferRowForScreenRow(endRow)]
|
||||
when 'containsBufferRange'
|
||||
key = 'containsRange'
|
||||
when 'containsBufferPosition'
|
||||
key = 'containsPosition'
|
||||
when 'containedInBufferRange'
|
||||
key = 'containedInRange'
|
||||
when 'containedInScreenRange'
|
||||
key = 'containedInRange'
|
||||
value = @displayBuffer.bufferRangeForScreenRange(value)
|
||||
when 'intersectsBufferRange'
|
||||
key = 'intersectsRange'
|
||||
when 'intersectsScreenRange'
|
||||
key = 'intersectsRange'
|
||||
value = @displayBuffer.bufferRangeForScreenRange(value)
|
||||
bufferMarkerParams[key] = value
|
||||
|
||||
bufferMarkerParams
|
||||
@@ -53,7 +53,8 @@ class TextEditorMarker
|
||||
Section: Construction and Destruction
|
||||
###
|
||||
|
||||
constructor: ({@bufferMarker, @displayBuffer}) ->
|
||||
constructor: (@markerLayer, @bufferMarker) ->
|
||||
{@displayBuffer} = @markerLayer
|
||||
@emitter = new Emitter
|
||||
@disposables = new CompositeDisposable
|
||||
@id = @bufferMarker.id
|
||||
@@ -81,7 +82,7 @@ class TextEditorMarker
|
||||
#
|
||||
# Returns a {TextEditorMarker}.
|
||||
copy: (properties) ->
|
||||
@displayBuffer.getMarker(@bufferMarker.copy(properties).id)
|
||||
@markerLayer.getMarker(@bufferMarker.copy(properties).id)
|
||||
|
||||
###
|
||||
Section: Event Subscription
|
||||
@@ -169,7 +170,7 @@ class TextEditorMarker
|
||||
@bufferMarker.setProperties(properties)
|
||||
|
||||
matchesProperties: (attributes) ->
|
||||
attributes = @displayBuffer.translateToBufferMarkerParams(attributes)
|
||||
attributes = @markerLayer.translateToBufferMarkerParams(attributes)
|
||||
@bufferMarker.matchesParams(attributes)
|
||||
|
||||
###
|
||||
@@ -333,7 +334,7 @@ class TextEditorMarker
|
||||
"TextEditorMarker(id: #{@id}, bufferRange: #{@getBufferRange()})"
|
||||
|
||||
destroyed: ->
|
||||
delete @displayBuffer.markers[@id]
|
||||
@markerLayer.didDestroyMarker(this)
|
||||
@emitter.emit 'did-destroy'
|
||||
@emitter.dispose()
|
||||
|
||||
|
||||
@@ -1681,10 +1681,6 @@ class TextEditor extends Model
|
||||
getMarkerCount: ->
|
||||
@buffer.getMarkerCount()
|
||||
|
||||
# {Delegates to: DisplayBuffer.destroyMarker}
|
||||
destroyMarker: (args...) ->
|
||||
@displayBuffer.destroyMarker(args...)
|
||||
|
||||
###
|
||||
Section: Cursors
|
||||
###
|
||||
|
||||
Reference in New Issue
Block a user