From 569359b6874e5bdd71e3d78d6fc57198f0cc0f9e Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 5 Jul 2012 15:20:28 -0600 Subject: [PATCH] Don't destroy selection/cursor anchors when encompassed by a change Add the 'strong' option to anchors. If anchors are 'strong' instead of being destroyed by encompassing changes they move to the beginning of the change range. --- spec/app/edit-session-spec.coffee | 13 +++++++++++++ src/app/anchor.coffee | 7 +++++-- src/app/cursor.coffee | 2 +- src/app/selection.coffee | 2 +- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index 48a64a8d8..34e24d637 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -1276,6 +1276,19 @@ describe "EditSession", -> expect(cursor2.getScreenPosition()).toEqual [0, 8] expect(cursor3.getScreenPosition()).toEqual [1, 0] + it "does not destroy cursor or selection anchors when a change encompasses them", -> + cursor = editSession.getLastCursor() + cursor.setBufferPosition [3, 3] + editSession.buffer.delete([[3, 1], [3, 5]]) + expect(cursor.getBufferPosition()).toEqual [3, 1] + expect(editSession.getAnchors().indexOf(cursor.anchor)).not.toBe -1 + + selection = editSession.getLastSelection() + selection.setBufferRange [[3, 5], [3, 10]] + editSession.buffer.delete [[3, 3], [3, 8]] + expect(selection.getBufferRange()).toEqual [[3, 3], [3, 5]] + expect(editSession.getAnchors().indexOf(selection.anchor)).not.toBe -1 + it "merges cursors when the change causes them to overlap", -> editSession.setCursorScreenPosition([0, 0]) editSession.addCursorAtScreenPosition([0, 1]) diff --git a/src/app/anchor.coffee b/src/app/anchor.coffee index f16f20b5d..69fad7dcd 100644 --- a/src/app/anchor.coffee +++ b/src/app/anchor.coffee @@ -9,14 +9,17 @@ class Anchor screenPosition: null constructor: (@editSession, options = {}) -> - { @ignoreEqual } = options + { @ignoreEqual, @strong } = options handleBufferChange: (e) -> { oldRange, newRange } = e position = @getBufferPosition() if oldRange.containsPoint(position, exclusive: true) - @destroy() + if @strong + @setBufferPosition(oldRange.start) + else + @destroy() return if @ignoreEqual diff --git a/src/app/cursor.coffee b/src/app/cursor.coffee index 9596280fe..a7f3a736f 100644 --- a/src/app/cursor.coffee +++ b/src/app/cursor.coffee @@ -12,7 +12,7 @@ class Cursor wordRegex: /(\w+)|([^\w\s]+)/g constructor: ({@editSession, screenPosition, bufferPosition}) -> - @anchor = @editSession.addAnchor() + @anchor = @editSession.addAnchor(strong: true) @anchor.on 'change-screen-position', (args...) => @trigger 'change-screen-position', args... @setScreenPosition(screenPosition) if screenPosition @setBufferPosition(bufferPosition) if bufferPosition diff --git a/src/app/selection.coffee b/src/app/selection.coffee index 36b0906d4..ffe5c58b4 100644 --- a/src/app/selection.coffee +++ b/src/app/selection.coffee @@ -226,7 +226,7 @@ class Selection @trigger 'change-screen-range', newScreenRange unless oldScreenRange.isEqual(newScreenRange) placeAnchor: -> - @anchor = @editSession.addAnchor() + @anchor = @editSession.addAnchor(strong: true) @anchor.setScreenPosition(@cursor.getScreenPosition()) @anchor.on 'change-screen-position.selection', => @trigger 'change-screen-range'