Files
atom/src/app/fold.coffee

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