mirror of
https://github.com/atom/atom.git
synced 2026-02-08 05:35:04 -05:00
73 lines
2.3 KiB
CoffeeScript
73 lines
2.3 KiB
CoffeeScript
{View, $$, $$$} = require 'space-pen'
|
|
|
|
$ = require 'jquery'
|
|
_ = require 'underscore'
|
|
|
|
module.exports =
|
|
class Gutter extends View
|
|
@content: ->
|
|
@div class: 'gutter', =>
|
|
@div outlet: 'lineNumbers', class: 'line-numbers'
|
|
|
|
firstScreenRow: -1
|
|
highestNumberWidth: null
|
|
|
|
afterAttach: (onDom) ->
|
|
return if @attached or not onDom
|
|
@attached = true
|
|
|
|
editor = @editor()
|
|
highlightCursorLine = => @highlightCursorLine()
|
|
editor.on 'cursor-move', highlightCursorLine
|
|
editor.on 'selection-change', highlightCursorLine
|
|
@calculateWidth()
|
|
|
|
editor: ->
|
|
@parentView
|
|
|
|
calculateLineNumberPadding: ->
|
|
widthTesterElement = $$ -> @div {class: 'line-number'}, ""
|
|
widthTesterElement.width(0)
|
|
@append(widthTesterElement)
|
|
lineNumberPadding = widthTesterElement.outerWidth()
|
|
widthTesterElement.remove()
|
|
lineNumberPadding
|
|
|
|
renderLineNumbers: (startScreenRow, endScreenRow) ->
|
|
@firstScreenRow = startScreenRow
|
|
lastScreenRow = -1
|
|
rows = @editor().bufferRowsForScreenRows(startScreenRow, endScreenRow)
|
|
|
|
cursorScreenRow = @editor().getCursorScreenPosition().row
|
|
@lineNumbers[0].innerHTML = $$$ ->
|
|
for row in rows
|
|
if row == lastScreenRow
|
|
rowValue = '•'
|
|
else
|
|
rowValue = row + 1
|
|
@div {class: 'line-number'}, rowValue
|
|
lastScreenRow = row
|
|
|
|
@calculateWidth()
|
|
@highlightCursorLine()
|
|
|
|
calculateWidth: ->
|
|
highestNumberWidth = @editor().getLineCount().toString().length * @editor().charWidth
|
|
if highestNumberWidth != @highestNumberWidth
|
|
@highestNumberWidth = highestNumberWidth
|
|
@lineNumbers.width(highestNumberWidth + @calculateLineNumberPadding())
|
|
@widthChanged?(@outerWidth())
|
|
|
|
highlightCursorLine: ->
|
|
cursorScreenRow = @editor().getCursorScreenPosition().row
|
|
screenRowIndex = cursorScreenRow - @firstScreenRow
|
|
|
|
currentLineNumberRow = @find(".line-number.cursor-line-number")
|
|
currentLineNumberRow.removeClass('cursor-line-number')
|
|
currentLineNumberRow.removeClass('cursor-line-number-background')
|
|
|
|
newLineNumberRow = @find(".line-number:eq(#{screenRowIndex})")
|
|
newLineNumberRow.addClass('cursor-line-number')
|
|
if @editor().getSelection().isSingleScreenLine()
|
|
newLineNumberRow.addClass('cursor-line-number-background')
|