From 60a4f23c501872d7a84ccf7f104b6f43c7718b4c Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 5 Jul 2012 14:53:37 -0600 Subject: [PATCH] Anchors are destroyed when encompassed by a buffer change --- spec/app/edit-session-spec.coffee | 22 ++++++++++++++++++++++ src/app/anchor.coffee | 7 ++++++- src/app/range.coffee | 7 +++++-- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/spec/app/edit-session-spec.coffee b/spec/app/edit-session-spec.coffee index c1f0b7165..48a64a8d8 100644 --- a/spec/app/edit-session-spec.coffee +++ b/spec/app/edit-session-spec.coffee @@ -1331,6 +1331,28 @@ describe "EditSession", -> editSession.foldAll() expect(editSession.getCursorBufferPosition()).toEqual([5,5]) + describe "anchors", -> + [anchor, destroyHandler] = [] + + beforeEach -> + destroyHandler = jasmine.createSpy("destroyHandler") + anchor = editSession.addAnchorAtBufferPosition([4, 25]) + anchor.on 'destroy', destroyHandler + + describe "when a buffer change precedes an anchor", -> + it "moves the anchor in accordance with the change", -> + editSession.setSelectedBufferRange([[3, 0], [4, 10]]) + editSession.delete() + expect(anchor.getBufferPosition()).toEqual [3, 15] + expect(destroyHandler).not.toHaveBeenCalled() + + describe "when a buffer change surrounds an anchor", -> + it "destroys the anchor", -> + editSession.setSelectedBufferRange([[3, 0], [5, 0]]) + editSession.delete() + expect(destroyHandler).toHaveBeenCalled() + expect(editSession.getAnchors().indexOf(anchor)).toBe -1 + describe ".clipBufferPosition(bufferPosition)", -> it "clips the given position to a valid position", -> expect(editSession.clipBufferPosition([-1, -1])).toEqual [0,0] diff --git a/src/app/anchor.coffee b/src/app/anchor.coffee index 305bde8de..f16f20b5d 100644 --- a/src/app/anchor.coffee +++ b/src/app/anchor.coffee @@ -15,6 +15,10 @@ class Anchor { oldRange, newRange } = e position = @getBufferPosition() + if oldRange.containsPoint(position, exclusive: true) + @destroy() + return + if @ignoreEqual return if position.isLessThanOrEqual(oldRange.end) else @@ -62,7 +66,8 @@ class Anchor @setScreenPosition(screenPosition, bufferChange: options.bufferChange, clip: false, assignBufferPosition: false) destroy: -> - @off() @editSession.removeAnchor(this) + @trigger 'destroy' + @off() _.extend(Anchor.prototype, EventEmitter) diff --git a/src/app/range.coffee b/src/app/range.coffee index c50b766fd..4f2f9632a 100644 --- a/src/app/range.coffee +++ b/src/app/range.coffee @@ -49,9 +49,12 @@ class Range else otherRange.intersectsWith(this) - containsPoint: (point) -> + containsPoint: (point, { exclusive } = {}) -> point = Point.fromObject(point) - point.isGreaterThanOrEqual(@start) and point.isLessThanOrEqual(@end) + if exclusive + point.isGreaterThan(@start) and point.isLessThan(@end) + else + point.isGreaterThanOrEqual(@start) and point.isLessThanOrEqual(@end) containsRow: (row) -> @start.row <= row <= @end.row