Buffer changes updates a stable list of folds

This commit is contained in:
Corey Johnson & Nathan Sobo
2012-05-25 10:58:30 -07:00
parent f8c3d89e60
commit 35b2f0e8c7
4 changed files with 44 additions and 28 deletions

View File

@@ -293,36 +293,45 @@ describe "Renderer", ->
expect(event.newRange).toEqual [[1, 0], [1, 9]]
expect(event.lineNumbersChanged).toBeTruthy()
describe "when multiple changes happen above the fold", ->
it "repositions folds correctly", ->
buffer.delete([[1, 1], [2, 0]])
buffer.insert([0, 1], "\nnew")
expect(fold1.startRow).toBe 2
expect(fold1.endRow).toBe 4
describe "when the old range precedes lines with a fold", ->
it "updates the buffer and re-positions subsequent folds", ->
buffer.change([[0, 0], [1, 1]], 'abc')
describe "when the new range precedes lines with a fold", ->
it "updates the buffer and re-positions subsequent folds", ->
buffer.change([[0, 0], [1, 1]], 'abc')
expect(renderer.lineForRow(0).text).toBe "abc"
expect(renderer.lineForRow(1).fold).toBe fold1
expect(renderer.lineForRow(2).text).toBe "5"
expect(renderer.lineForRow(3).fold).toBe fold2
expect(renderer.lineForRow(4).text).toMatch /^9-+/
expect(renderer.lineForRow(0).text).toBe "abc"
expect(renderer.lineForRow(1).fold).toBe fold1
expect(renderer.lineForRow(2).text).toBe "5"
expect(renderer.lineForRow(3).fold).toBe fold2
expect(renderer.lineForRow(4).text).toMatch /^9-+/
expect(changeHandler).toHaveBeenCalled()
[[event]] = changeHandler.argsForCall
expect(event.oldRange).toEqual [[0, 0], [1, 1]]
expect(event.newRange).toEqual [[0, 0], [0, 3]]
expect(event.lineNumbersChanged).toBeTruthy()
changeHandler.reset()
expect(changeHandler).toHaveBeenCalled()
[[event]] = changeHandler.argsForCall
expect(event.oldRange).toEqual [[0, 0], [1, 1]]
expect(event.newRange).toEqual [[0, 0], [0, 3]]
expect(event.lineNumbersChanged).toBeTruthy()
changeHandler.reset()
fold1.destroy()
expect(renderer.lineForRow(0).text).toBe "abc"
expect(renderer.lineForRow(1).text).toBe "2"
expect(renderer.lineForRow(3).text).toMatch /^4-+/
expect(renderer.lineForRow(4).text).toBe "5"
expect(renderer.lineForRow(5).fold).toBe fold2
expect(renderer.lineForRow(6).text).toMatch /^9-+/
fold1.destroy()
expect(renderer.lineForRow(0).text).toBe "abc"
expect(renderer.lineForRow(1).text).toBe "2"
expect(renderer.lineForRow(3).text).toMatch /^4-+/
expect(renderer.lineForRow(4).text).toBe "5"
expect(renderer.lineForRow(5).fold).toBe fold2
expect(renderer.lineForRow(6).text).toMatch /^9-+/
expect(changeHandler).toHaveBeenCalled()
[[event]] = changeHandler.argsForCall
expect(event.oldRange).toEqual [[1, 0], [1, 1]]
expect(event.newRange).toEqual [[1, 0], [3, 101]]
expect(event.lineNumbersChanged).toBeTruthy()
expect(changeHandler).toHaveBeenCalled()
[[event]] = changeHandler.argsForCall
expect(event.oldRange).toEqual [[1, 0], [1, 1]]
expect(event.newRange).toEqual [[1, 0], [3, 101]]
expect(event.lineNumbersChanged).toBeTruthy()
describe "when the old range straddles the beginning of a fold", ->
it "replaces lines in the portion of the range that precedes the fold and adjusts the end of the fold to encompass additional lines", ->

View File

@@ -285,6 +285,12 @@ describe "Selection", ->
selection.insertText('holy cow')
expect(editor.screenLineForRow(3).text).toBe buffer.lineForRow(3)
describe "backspace", ->
it "destroys the fold", ->
selection.setBufferRange([[1,0], [2,0]])
selection.backspace()
expect(editor.screenLineForRow(3).text).toBe buffer.lineForRow(3)
describe "when the selection is empty", ->
describe "delete, when the selection is empty", ->
it "removes the lines contained by the fold", ->

View File

@@ -127,9 +127,9 @@ class Renderer
@lineMap.clipScreenPosition(position, options)
handleBufferChange: (e) ->
for row, folds of @activeFolds
for fold in new Array(folds...)
fold.handleBufferChange(e)
allFolds = [] # Folds can modify @activeFolds, so first make sure we have a stable array of folds
allFolds.push(folds...) for row, folds of @activeFolds
fold.handleBufferChange(e) for fold in allFolds
@handleHighlighterChange(@lastHighlighterChangeEvent)

View File

@@ -145,6 +145,7 @@ class Selection extends View
@editor.getCurrentMode().autoOutdent(state, new AceOutdentAdaptor(@editor.buffer, @editor), bufferRow)
backspace: ->
@editor.destroyFoldsContainingBufferRow(@getBufferRange().end.row)
@selectLeft() if @isEmpty()
@deleteSelectedText()