diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index 95fa44f10..8c20b3f23 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -19,13 +19,20 @@ describe "EditSession", -> it "returns a different edit session with the same initial state", -> editSession.setSelectedBufferRange([[1, 2], [3, 4]]) editSession.addSelectionForBufferRange([[5, 6], [7, 8]], isReversed: true) + editSession.foldBufferRow(4) + expect(editSession.isFoldedAtBufferRow(4)).toBeTruthy() + editSession2 = editSession.copy() expect(editSession2.id).not.toBe editSession.id expect(editSession2.getSelectedBufferRanges()).toEqual editSession.getSelectedBufferRanges() expect(editSession2.getSelection(1).isReversed()).toBeTruthy() + expect(editSession2.isFoldedAtBufferRow(4)).toBeTruthy() + # editSession2 can now diverge from its origin edit session editSession2.getSelection().setBufferRange([[2, 1], [4, 3]]) expect(editSession2.getSelectedBufferRanges()).not.toEqual editSession.getSelectedBufferRanges() + editSession2.unfoldBufferRow(4) + expect(editSession2.isFoldedAtBufferRow(4)).not.toBe editSession.isFoldedAtBufferRow(4) describe "title", -> describe ".getTitle()", -> diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index b5513037f..a614b6b78 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -45,12 +45,12 @@ class EditSession @state = optionsOrState {@id, tabLength, softTabs, @softWrap} = @state.toObject() @setBuffer(project.bufferForId(@state.get('bufferId'))) - @buildDisplayBuffer({tabLength}) + @setDisplayBuffer(new DisplayBuffer(@buffer, { tabLength })) @addSelection(marker) for marker in @findMarkers(@getSelectionMarkerAttributes()) @setScrollTop(@state.get('scrollTop')) @setScrollLeft(@state.get('scrollLeft')) else - {buffer, tabLength, softTabs, @softWrap} = optionsOrState + {buffer, displayBuffer, tabLength, softTabs, @softWrap, suppressCursorCreation} = optionsOrState @id = guid.create().toString() @state = telepath.Document.create deserializer: 'EditSession' @@ -59,8 +59,8 @@ class EditSession scrollTop: 0 scrollLeft: 0 @setBuffer(buffer) - @buildDisplayBuffer({tabLength}) - @addCursorAtScreenPosition([0, 0]) + @setDisplayBuffer(displayBuffer ? new DisplayBuffer(@buffer, { tabLength })) + @addCursorAtScreenPosition([0, 0]) unless suppressCursorCreation @languageMode = new LanguageMode(this, @buffer.getExtension()) @softTabs = @buffer.usesSoftTabs() ? softTabs ? true @@ -82,8 +82,7 @@ class EditSession @subscribe @buffer, "modified-status-changed", => @trigger "modified-status-changed" @preserveCursorPositionOnBufferReload() - buildDisplayBuffer: ({tabLength}) -> - @displayBuffer = new DisplayBuffer(@buffer, { tabLength }) + setDisplayBuffer: (@displayBuffer) -> @subscribe @displayBuffer, 'marker-created', @handleMarkerCreated @subscribe @displayBuffer, "changed", (e) => @trigger 'screen-lines-changed', e @subscribe @displayBuffer, "markers-updated", => @mergeIntersectingSelections() @@ -120,15 +119,13 @@ class EditSession # Creates an {EditSession} with the same initial state copy: -> tabLength = @getTabLength() - copy = new EditSession({@buffer, tabLength, @softTabs, @softWrap}) - copy.setScrollTop(@getScrollTop()) - copy.setScrollLeft(@getScrollLeft()) - for selection, i in @getSelections() - if i is 0 - copy.setSelectedBufferRange(selection.getBufferRange(), isReversed: selection.isReversed()) - else - copy.addSelectionForBufferRange(selection.getBufferRange(), isReversed: selection.isReversed()) - copy + displayBuffer = @displayBuffer.copy() + newEditSession = new EditSession({@buffer, displayBuffer, tabLength, @softTabs, @softWrap, suppressCursorCreation: true}) + newEditSession.setScrollTop(@getScrollTop()) + newEditSession.setScrollLeft(@getScrollLeft()) + for marker in @findMarkers(editSessionId: @id) + marker.copy(editSessionId: newEditSession.id, preserveFolds: true) + newEditSession ### Public ### @@ -605,8 +602,7 @@ class EditSession # # Returns `true` if the buffer row is folded, `false` otherwise. isFoldedAtBufferRow: (bufferRow) -> - screenRow = @screenPositionForBufferPosition([bufferRow]).row - @isFoldedAtScreenRow(screenRow) + @displayBuffer.isFoldedAtBufferRow(bufferRow) # Determines if the given screen row is folded. # @@ -614,7 +610,7 @@ class EditSession # # Returns `true` if the screen row is folded, `false` otherwise. isFoldedAtScreenRow: (screenRow) -> - @lineForScreenRow(screenRow)?.fold? + @displayBuffer.isFoldedAtScreenRow(screenRow) # {Delegates to: DisplayBuffer.largestFoldContainingBufferRow} largestFoldContainingBufferRow: (bufferRow) -> @@ -787,6 +783,9 @@ class EditSession getMarker: (id) -> @displayBuffer.getMarker(id) + getMarkers: -> + @displayBuffer.getMarkers() + findMarkers: (attributes) -> @displayBuffer.findMarkers(attributes)