From a4db677979be8c954402dd0625cca999bad7bc3f Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 12 Jul 2012 18:57:12 -0600 Subject: [PATCH] Implement setSelectedBufferRange w/ setSelectedBufferRanges MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also add the preserveFolds option, which doesn't destroy folds containing the selected ranges – mainly for specs right now --- spec/app/edit-session-spec.coffee | 34 +++++++++++++++++++------------ spec/app/editor-spec.coffee | 8 ++++---- spec/app/selection-spec.coffee | 9 ++++++++ src/app/edit-session.coffee | 12 +++++------ src/app/selection.coffee | 1 + 5 files changed, 41 insertions(+), 23 deletions(-) diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index 46ec5debc..43466df05 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -535,18 +535,26 @@ describe "EditSession", -> editSession.setSelectedBufferRanges([[[2, 2], [3, 3]], [[3, 0], [5, 5]]]) expect(editSession.getSelectedBufferRanges()).toEqual [[[2, 2], [5, 5]]] - it "removes folds that contain the selections", -> - editSession.setSelectedBufferRange([[0,0], [0,0]]) - editSession.createFold(1, 4) - editSession.createFold(2, 3) - editSession.createFold(6, 8) - editSession.createFold(10, 11) + describe "when the preserveFolds option is false (the default)", -> + it "removes folds that contain the selections", -> + editSession.setSelectedBufferRange([[0,0], [0,0]]) + editSession.createFold(1, 4) + editSession.createFold(2, 3) + editSession.createFold(6, 8) + editSession.createFold(10, 11) - editSession.setSelectedBufferRanges([[[2, 2], [3, 3]], [[6, 6], [7, 7]]]) - expect(editSession.lineForScreenRow(1).fold).toBeUndefined() - expect(editSession.lineForScreenRow(2).fold).toBeUndefined() - expect(editSession.lineForScreenRow(6).fold).toBeUndefined() - expect(editSession.lineForScreenRow(10).fold).toBeDefined() + editSession.setSelectedBufferRanges([[[2, 2], [3, 3]], [[6, 6], [7, 7]]]) + expect(editSession.lineForScreenRow(1).fold).toBeUndefined() + expect(editSession.lineForScreenRow(2).fold).toBeUndefined() + expect(editSession.lineForScreenRow(6).fold).toBeUndefined() + expect(editSession.lineForScreenRow(10).fold).toBeDefined() + + describe "when the preserve folds option is true", -> + it "does not remove folds that contain the selections", -> + editSession.setSelectedBufferRange([[0,0], [0,0]]) + editSession.createFold(1, 4) + editSession.setSelectedBufferRanges([[[2, 2], [3, 3]]], preserveFolds: true) + expect(editSession.lineForScreenRow(1).fold).toBeDefined() describe "when the cursor is moved while there is a selection", -> makeSelection = -> selection.setBufferRange [[1, 2], [1, 5]] @@ -895,8 +903,8 @@ describe "EditSession", -> describe "when the selection ends on a folded line", -> it "destroys the fold", -> - editSession.toggleFoldAtBufferRow(4) editSession.setSelectedBufferRange([[3,0], [4,0]]) + editSession.toggleFoldAtBufferRow(4) editSession.backspace() expect(buffer.lineForRow(3)).toBe " return sort(left).concat(pivot).concat(sort(right));" @@ -980,12 +988,12 @@ describe "EditSession", -> describe "when the cursor is on a folded line", -> it "removes the lines contained by the fold", -> + editSession.setSelectedBufferRange([[2, 0], [2, 0]]) editSession.createFold(2,4) editSession.createFold(2,6) oldLine7 = buffer.lineForRow(7) oldLine8 = buffer.lineForRow(8) - editSession.setSelectedBufferRange([[2, 0], [2, 0]]) editSession.delete() expect(editSession.lineForScreenRow(2).text).toBe oldLine7 expect(editSession.lineForScreenRow(3).text).toBe oldLine8 diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index bce9373d3..757d8ca28 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -1549,13 +1549,13 @@ describe "Editor", -> it "adds/removes the 'selected' class to the fold's line element and hides the cursor if it is on the fold line", -> editor.createFold(2, 4) - editor.setSelectedBufferRange([[1, 0], [2, 0]], reverse: true) + editor.setSelectedBufferRange([[1, 0], [2, 0]], preserveFolds: true, reverse: true) expect(editor.lineElementForScreenRow(2)).toMatchSelector('.fold.selected') - editor.setSelectedBufferRange([[1, 0], [1, 1]]) + editor.setSelectedBufferRange([[1, 0], [1, 1]], preserveFolds: true) expect(editor.lineElementForScreenRow(2)).not.toMatchSelector('.fold.selected') - editor.setSelectedBufferRange([[1, 0], [5, 0]]) + editor.setSelectedBufferRange([[1, 0], [5, 0]], preserveFolds: true) expect(editor.lineElementForScreenRow(2)).toMatchSelector('.fold.selected') editor.setCursorScreenPosition([3,0]) @@ -1574,7 +1574,7 @@ describe "Editor", -> editor.renderLines() # re-render lines so certain lines are not rendered editor.createFold(2, 4) - editor.setSelectedBufferRange([[1, 0], [5, 0]]) + editor.setSelectedBufferRange([[1, 0], [5, 0]], preserveFolds: true) expect(editor.renderedLines.find('.fold.selected')).toExist() editor.scrollToBottom() diff --git a/spec/app/selection-spec.coffee b/spec/app/selection-spec.coffee index 0a91272ea..a43ad7f1e 100644 --- a/spec/app/selection-spec.coffee +++ b/spec/app/selection-spec.coffee @@ -66,3 +66,12 @@ describe "Selection", -> buffer.insert([2, 5], 'abc') expect(changeScreenRangeHandler).toHaveBeenCalled() + + describe "when the selection is destroyed", -> + it "destroys its cursor and its anchor's cursor", -> + selection.setBufferRange([[2, 0], [2, 10]]) + + selection.destroy() + + expect(editSession.getAnchors().indexOf(selection.anchor)).toBe -1 + expect(editSession.getAnchors().indexOf(selection.cursor.anchor)).toBe -1 diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 91bfefee4..7887cb900 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -306,17 +306,17 @@ class EditSession @addCursor().selection.setBufferRange(bufferRange, options) setSelectedBufferRange: (bufferRange, options) -> - @clearSelections() - @getLastSelection().setBufferRange(bufferRange, options) + @setSelectedBufferRanges([bufferRange], options) - setSelectedBufferRanges: (bufferRanges, options) -> + setSelectedBufferRanges: (bufferRanges, options={}) -> throw new Error("Passed an empty array to setSelectedBufferRanges") unless bufferRanges.length selection.destroy() for selection in @getSelections() for bufferRange, i in bufferRanges bufferRange = Range.fromObject(bufferRange) - for row in [bufferRange.start.row..bufferRange.end.row] - @destroyFoldsContainingBufferRow(row) - @addSelectionForBufferRange(bufferRange, options) + unless options.preserveFolds + for row in [bufferRange.start.row..bufferRange.end.row] + @destroyFoldsContainingBufferRow(row) + @addSelectionForBufferRange(bufferRange, options) @mergeIntersectingSelections(options) removeSelection: (selection) -> diff --git a/src/app/selection.coffee b/src/app/selection.coffee index ffe5c58b4..85819ef6b 100644 --- a/src/app/selection.coffee +++ b/src/app/selection.coffee @@ -21,6 +21,7 @@ class Selection if @cursor @cursor.off('.selection') @cursor.destroy() + @anchor?.destroy() @editSession.removeSelection(this) @trigger 'destroy'