mirror of
https://github.com/atom/atom.git
synced 2026-01-24 14:28:14 -05:00
98 lines
3.1 KiB
CoffeeScript
98 lines
3.1 KiB
CoffeeScript
TiledComponent = require './tiled-component'
|
|
LineNumbersTileComponent = require './line-numbers-tile-component'
|
|
WrapperDiv = document.createElement('div')
|
|
DummyLineNumberComponent = LineNumbersTileComponent.createDummy()
|
|
|
|
module.exports =
|
|
class LineNumberGutterComponent extends TiledComponent
|
|
dummyLineNumberNode: null
|
|
|
|
constructor: ({@onMouseDown, @editor, @gutter}) ->
|
|
@visible = true
|
|
|
|
@domNode = atom.views.getView(@gutter)
|
|
@lineNumbersNode = @domNode.firstChild
|
|
@lineNumbersNode.innerHTML = ''
|
|
|
|
@domNode.addEventListener 'click', @onClick
|
|
@domNode.addEventListener 'mousedown', @onMouseDown
|
|
|
|
destroy: ->
|
|
@domNode.removeEventListener 'click', @onClick
|
|
@domNode.removeEventListener 'mousedown', @onMouseDown
|
|
|
|
getDomNode: ->
|
|
@domNode
|
|
|
|
hideNode: ->
|
|
if @visible
|
|
@domNode.style.display = 'none'
|
|
@visible = false
|
|
|
|
showNode: ->
|
|
if not @visible
|
|
@domNode.style.removeProperty('display')
|
|
@visible = true
|
|
|
|
buildEmptyState: ->
|
|
{
|
|
tiles: {}
|
|
styles: {}
|
|
}
|
|
|
|
getNewState: (state) -> state
|
|
|
|
getTilesNode: -> @lineNumbersNode
|
|
|
|
beforeUpdateSync: (state) ->
|
|
@appendDummyLineNumber() unless @dummyLineNumberNode?
|
|
|
|
if @newState.styles.scrollHeight isnt @oldState.styles.scrollHeight
|
|
@lineNumbersNode.style.height = @newState.styles.scrollHeight + 'px'
|
|
@oldState.scrollHeight = @newState.scrollHeight
|
|
|
|
if @newState.styles.backgroundColor isnt @oldState.styles.backgroundColor
|
|
@lineNumbersNode.style.backgroundColor = @newState.styles.backgroundColor
|
|
@oldState.styles.backgroundColor = @newState.styles.backgroundColor
|
|
|
|
if @newState.maxLineNumberDigits isnt @oldState.maxLineNumberDigits
|
|
@updateDummyLineNumber()
|
|
@oldState.styles = {}
|
|
@oldState.maxLineNumberDigits = @newState.maxLineNumberDigits
|
|
|
|
buildComponentForTile: (id) -> new LineNumbersTileComponent({id})
|
|
|
|
###
|
|
Section: Private Methods
|
|
###
|
|
|
|
# This dummy line number element holds the gutter to the appropriate width,
|
|
# since the real line numbers are absolutely positioned for performance reasons.
|
|
appendDummyLineNumber: ->
|
|
DummyLineNumberComponent.newState = @newState
|
|
WrapperDiv.innerHTML = DummyLineNumberComponent.buildLineNumberHTML({bufferRow: -1})
|
|
@dummyLineNumberNode = WrapperDiv.children[0]
|
|
@lineNumbersNode.appendChild(@dummyLineNumberNode)
|
|
|
|
updateDummyLineNumber: ->
|
|
DummyLineNumberComponent.newState = @newState
|
|
@dummyLineNumberNode.innerHTML = DummyLineNumberComponent.buildLineNumberInnerHTML(0, false)
|
|
|
|
onMouseDown: (event) =>
|
|
{target} = event
|
|
lineNumber = target.parentNode
|
|
|
|
unless target.classList.contains('icon-right') and lineNumber.classList.contains('foldable')
|
|
@onMouseDown(event)
|
|
|
|
onClick: (event) =>
|
|
{target} = event
|
|
lineNumber = target.parentNode
|
|
|
|
if target.classList.contains('icon-right') and lineNumber.classList.contains('foldable')
|
|
bufferRow = parseInt(lineNumber.getAttribute('data-buffer-row'))
|
|
if lineNumber.classList.contains('folded')
|
|
@editor.unfoldBufferRow(bufferRow)
|
|
else
|
|
@editor.foldBufferRow(bufferRow)
|