mirror of
https://github.com/atom/atom.git
synced 2026-02-15 09:05:58 -05:00
107 lines
3.5 KiB
CoffeeScript
107 lines
3.5 KiB
CoffeeScript
CursorsComponent = require './cursors-component'
|
|
LinesTileComponent = require './lines-tile-component'
|
|
TiledComponent = require './tiled-component'
|
|
|
|
DummyLineNode = document.createElement('div')
|
|
DummyLineNode.className = 'line'
|
|
DummyLineNode.style.position = 'absolute'
|
|
DummyLineNode.style.visibility = 'hidden'
|
|
DummyLineNode.appendChild(document.createElement('span'))
|
|
DummyLineNode.firstChild.textContent = 'x'
|
|
|
|
module.exports =
|
|
class LinesComponent extends TiledComponent
|
|
placeholderTextDiv: null
|
|
|
|
constructor: ({@presenter, @useShadowDOM, @domElementPool}) ->
|
|
@domNode = document.createElement('div')
|
|
@domNode.classList.add('lines')
|
|
@tilesNode = document.createElement("div")
|
|
# Create a new stacking context, so that tiles z-index does not interfere
|
|
# with other visual elements.
|
|
@tilesNode.style.isolation = "isolate"
|
|
@tilesNode.style.zIndex = 0
|
|
@domNode.appendChild(@tilesNode)
|
|
|
|
@cursorsComponent = new CursorsComponent
|
|
@domNode.appendChild(@cursorsComponent.getDomNode())
|
|
|
|
if @useShadowDOM
|
|
insertionPoint = document.createElement('content')
|
|
insertionPoint.setAttribute('select', '.overlayer')
|
|
@domNode.appendChild(insertionPoint)
|
|
|
|
getDomNode: ->
|
|
@domNode
|
|
|
|
shouldRecreateAllTilesOnUpdate: ->
|
|
@oldState.indentGuidesVisible isnt @newState.indentGuidesVisible or @newState.continuousReflow
|
|
|
|
beforeUpdateSync: (state) ->
|
|
if @newState.maxHeight isnt @oldState.maxHeight
|
|
@domNode.style.height = @newState.maxHeight + 'px'
|
|
@oldState.maxHeight = @newState.maxHeight
|
|
|
|
if @newState.backgroundColor isnt @oldState.backgroundColor
|
|
@domNode.style.backgroundColor = @newState.backgroundColor
|
|
@oldState.backgroundColor = @newState.backgroundColor
|
|
|
|
afterUpdateSync: (state) ->
|
|
if @newState.placeholderText isnt @oldState.placeholderText
|
|
@placeholderTextDiv?.remove()
|
|
if @newState.placeholderText?
|
|
@placeholderTextDiv = document.createElement('div')
|
|
@placeholderTextDiv.classList.add('placeholder-text')
|
|
@placeholderTextDiv.textContent = @newState.placeholderText
|
|
@domNode.appendChild(@placeholderTextDiv)
|
|
|
|
if @newState.width isnt @oldState.width
|
|
@domNode.style.width = @newState.width + 'px'
|
|
@oldState.width = @newState.width
|
|
|
|
@cursorsComponent.updateSync(state)
|
|
|
|
@oldState.indentGuidesVisible = @newState.indentGuidesVisible
|
|
|
|
buildComponentForTile: (id) -> new LinesTileComponent({id, @presenter, @domElementPool})
|
|
|
|
buildEmptyState: ->
|
|
{tiles: {}}
|
|
|
|
getNewState: (state) ->
|
|
state.content
|
|
|
|
getTilesNode: -> @tilesNode
|
|
|
|
measureLineHeightAndDefaultCharWidth: ->
|
|
@domNode.appendChild(DummyLineNode)
|
|
lineHeightInPixels = DummyLineNode.getBoundingClientRect().height
|
|
charWidth = DummyLineNode.firstChild.getBoundingClientRect().width
|
|
@domNode.removeChild(DummyLineNode)
|
|
|
|
@presenter.setLineHeight(lineHeightInPixels)
|
|
@presenter.setBaseCharacterWidth(charWidth)
|
|
|
|
remeasureCharacterWidths: ->
|
|
return unless @presenter.baseCharacterWidth
|
|
|
|
@clearScopedCharWidths()
|
|
@measureCharactersInNewLines()
|
|
|
|
measureCharactersInNewLines: ->
|
|
@presenter.batchCharacterMeasurement =>
|
|
for id, component of @componentsByTileId
|
|
component.measureCharactersInNewLines()
|
|
|
|
return
|
|
|
|
clearScopedCharWidths: ->
|
|
for id, component of @componentsByTileId
|
|
component.clearMeasurements()
|
|
|
|
@presenter.clearScopedCharacterWidths()
|
|
|
|
lineNodeForLineIdAndScreenRow: (lineId, screenRow) ->
|
|
tile = @presenter.tileForRow(screenRow)
|
|
@getComponentForTile(tile)?.lineNodeForLineId(lineId)
|