diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index 2bdc18d68..46ec5debc 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -523,6 +523,31 @@ describe "EditSession", -> editSession.selectWord() expect(editSession.getSelectedText()).toBe '' + describe ".setSelectedBufferRanges(ranges)", -> + it "clears existing selections and creates selections for each of the given ranges", -> + editSession.setSelectedBufferRanges([[[2, 2], [3, 3]], [[4, 4], [5, 5]]]) + expect(editSession.getSelectedBufferRanges()).toEqual [[[2, 2], [3, 3]], [[4, 4], [5, 5]]] + + editSession.setSelectedBufferRanges([[[5, 5], [6, 6]]]) + expect(editSession.getSelectedBufferRanges()).toEqual [[[5, 5], [6, 6]]] + + it "merges intersecting selections", -> + 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) + + 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 cursor is moved while there is a selection", -> makeSelection = -> selection.setBufferRange [[1, 2], [1, 5]] @@ -1243,20 +1268,17 @@ describe "EditSession", -> selections = editSession.getSelections() expect(buffer.lineForRow(1)).toBe ' var = function( {' - expect(selections[0].getBufferRange()).toEqual [[1, 6], [1, 6]] - expect(selections[1].getBufferRange()).toEqual [[1, 17], [1, 17]] + + expect(editSession.getSelectedBufferRanges()).toEqual [[[1, 6], [1, 6]], [[1, 17], [1, 17]]] editSession.undo() - expect(selections[0].getBufferRange()).toEqual [[1, 6], [1, 6]] - expect(selections[1].getBufferRange()).toEqual [[1, 18], [1, 18]] + expect(editSession.getSelectedBufferRanges()).toEqual [[[1, 6], [1, 6]], [[1, 18], [1, 18]]] editSession.undo() - expect(selections[0].getBufferRange()).toEqual [[1, 6], [1, 10]] - expect(selections[1].getBufferRange()).toEqual [[1, 22], [1, 27]] + expect(editSession.getSelectedBufferRanges()).toEqual [[[1, 6], [1, 10]], [[1, 22], [1, 27]]] editSession.redo() - expect(selections[0].getBufferRange()).toEqual [[1, 6], [1, 6]] - expect(selections[1].getBufferRange()).toEqual [[1, 18], [1, 18]] + expect(editSession.getSelectedBufferRanges()).toEqual [[[1, 6], [1, 6]], [[1, 18], [1, 18]]] it "restores selected ranges even when the change occurred in another edit session", -> otherEditSession = fixturesProject.open(editSession.getPath()) diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 53d4a265c..91bfefee4 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -5,6 +5,7 @@ DisplayBuffer = require 'display-buffer' Cursor = require 'cursor' Selection = require 'selection' EventEmitter = require 'event-emitter' +Range = require 'range' AnchorRange = require 'anchor-range' _ = require 'underscore' @@ -309,13 +310,14 @@ class EditSession @getLastSelection().setBufferRange(bufferRange, options) setSelectedBufferRanges: (bufferRanges, options) -> - selections = @getSelections() + throw new Error("Passed an empty array to setSelectedBufferRanges") unless bufferRanges.length + selection.destroy() for selection in @getSelections() for bufferRange, i in bufferRanges - if selections[i] - selections[i].setBufferRange(bufferRange, options) - else + bufferRange = Range.fromObject(bufferRange) + for row in [bufferRange.start.row..bufferRange.end.row] + @destroyFoldsContainingBufferRow(row) @addSelectionForBufferRange(bufferRange, options) - @mergeIntersectingSelections() + @mergeIntersectingSelections(options) removeSelection: (selection) -> _.remove(@selections, selection)