mirror of
https://github.com/atom/atom.git
synced 2026-02-05 04:05:05 -05:00
75 lines
1.6 KiB
CoffeeScript
75 lines
1.6 KiB
CoffeeScript
Range = require 'range'
|
|
Point = require 'point'
|
|
|
|
module.exports =
|
|
class Fold
|
|
@idCounter: 1
|
|
|
|
displayBuffer: null
|
|
startRow: null
|
|
endRow: null
|
|
|
|
constructor: (@displayBuffer, @startRow, @endRow) ->
|
|
@id = @constructor.idCounter++
|
|
|
|
destroy: ->
|
|
@displayBuffer.destroyFold(this)
|
|
|
|
inspect: ->
|
|
"Fold(#{@startRow}, #{@endRow})"
|
|
|
|
getBufferRange: ({includeNewline}={}) ->
|
|
if includeNewline
|
|
end = [@endRow + 1, 0]
|
|
else
|
|
end = [@endRow, Infinity]
|
|
|
|
new Range([@startRow, 0], end)
|
|
|
|
getBufferRowCount: ->
|
|
@endRow - @startRow + 1
|
|
|
|
handleBufferChange: (event) ->
|
|
oldStartRow = @startRow
|
|
|
|
if @isContainedByRange(event.oldRange)
|
|
@displayBuffer.unregisterFold(@startRow, this)
|
|
return
|
|
|
|
@updateStartRow(event)
|
|
@updateEndRow(event)
|
|
|
|
if @startRow != oldStartRow
|
|
@displayBuffer.unregisterFold(oldStartRow, this)
|
|
@displayBuffer.registerFold(this)
|
|
|
|
isContainedByRange: (range) ->
|
|
range.start.row <= @startRow and @endRow <= range.end.row
|
|
|
|
isContainedByFold: (fold) ->
|
|
@isContainedByRange(fold.getBufferRange())
|
|
|
|
updateStartRow: (event) ->
|
|
{ newRange, oldRange } = event
|
|
|
|
if oldRange.end.row < @startRow
|
|
delta = newRange.end.row - oldRange.end.row
|
|
else if newRange.end.row < @startRow
|
|
delta = newRange.end.row - @startRow
|
|
else
|
|
delta = 0
|
|
|
|
@startRow += delta
|
|
|
|
updateEndRow: (event) ->
|
|
{ newRange, oldRange } = event
|
|
|
|
if oldRange.end.row <= @endRow
|
|
delta = newRange.end.row - oldRange.end.row
|
|
else if newRange.end.row <= @endRow
|
|
delta = newRange.end.row - @endRow
|
|
else
|
|
delta = 0
|
|
|
|
@endRow += delta
|