1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
class Scroll
isComplete: -> true
isRecordable: -> false
constructor: (@editorElement) ->
@scrolloff = 2 # atom default
@editor = @editorElement.getModel()
@rows =
first: @editorElement.getFirstVisibleScreenRow()
last: @editorElement.getLastVisibleScreenRow()
final: @editor.getLastScreenRow()
class ScrollDown extends Scroll
execute: (count=1) ->
@keepCursorOnScreen(count)
@scrollUp(count)
keepCursorOnScreen: (count) ->
{row, column} = @editor.getCursorScreenPosition()
firstScreenRow = @rows.first + @scrolloff + 1
if row - count <= firstScreenRow
@editor.setCursorScreenPosition([firstScreenRow + count, column])
scrollUp: (count) ->
lastScreenRow = @rows.last - @scrolloff
@editor.scrollToScreenPosition([lastScreenRow + count, 0])
class ScrollUp extends Scroll
execute: (count=1) ->
@keepCursorOnScreen(count)
@scrollDown(count)
keepCursorOnScreen: (count) ->
{row, column} = @editor.getCursorScreenPosition()
lastScreenRow = @rows.last - @scrolloff - 1
if row + count >= lastScreenRow
@editor.setCursorScreenPosition([lastScreenRow - count, column])
scrollDown: (count) ->
firstScreenRow = @rows.first + @scrolloff
@editor.scrollToScreenPosition([firstScreenRow - count, 0])
class ScrollCursor extends Scroll
constructor: (@editorElement, @opts={}) ->
super
cursor = @editor.getCursorScreenPosition()
@pixel = @editorElement.pixelPositionForScreenPosition(cursor).top
class ScrollCursorToTop extends ScrollCursor
execute: ->
@moveToFirstNonBlank() unless @opts.leaveCursor
@scrollUp()
scrollUp: ->
return if @rows.last is @rows.final
@pixel -= (@editor.getLineHeightInPixels() * @scrolloff)
@editor.setScrollTop(@pixel)
moveToFirstNonBlank: ->
@editor.moveToFirstCharacterOfLine()
class ScrollCursorToMiddle extends ScrollCursor
execute: ->
@moveToFirstNonBlank() unless @opts.leaveCursor
@scrollMiddle()
scrollMiddle: ->
@pixel -= (@editor.getHeight() / 2)
@editor.setScrollTop(@pixel)
moveToFirstNonBlank: ->
@editor.moveToFirstCharacterOfLine()
class ScrollCursorToBottom extends ScrollCursor
execute: ->
@moveToFirstNonBlank() unless @opts.leaveCursor
@scrollDown()
scrollDown: ->
return if @rows.first is 0
offset = (@editor.getLineHeightInPixels() * (@scrolloff + 1))
@pixel -= (@editor.getHeight() - offset)
@editor.setScrollTop(@pixel)
moveToFirstNonBlank: ->
@editor.moveToFirstCharacterOfLine()
class ScrollHorizontal
isComplete: -> true
isRecordable: -> false
constructor: (@editorElement) ->
@editor = @editorElement.getModel()
cursorPos = @editor.getCursorScreenPosition()
@pixel = @editorElement.pixelPositionForScreenPosition(cursorPos).left
@cursor = @editor.getLastCursor()
putCursorOnScreen: ->
@editor.scrollToCursorPosition({center: false})
class ScrollCursorToLeft extends ScrollHorizontal
execute: ->
@editor.setScrollLeft(@pixel)
@putCursorOnScreen()
class ScrollCursorToRight extends ScrollHorizontal
execute: ->
@editor.setScrollRight(@pixel)
@putCursorOnScreen()
module.exports = {ScrollDown, ScrollUp, ScrollCursorToTop, ScrollCursorToMiddle,
ScrollCursorToBottom, ScrollCursorToLeft, ScrollCursorToRight}
|