diff --git a/spec/display-buffer-spec.coffee b/spec/display-buffer-spec.coffee index 433b2a234..ca5048433 100644 --- a/spec/display-buffer-spec.coffee +++ b/spec/display-buffer-spec.coffee @@ -722,7 +722,7 @@ describe "DisplayBuffer", -> beforeEach -> marker = displayBuffer.markScreenRange([[5, 4], [5, 10]]) - marker.on 'changed', markerChangedHandler = jasmine.createSpy("markerChangedHandler") + marker.onDidChange markerChangedHandler = jasmine.createSpy("markerChangedHandler") it "triggers the 'changed' event whenever the markers head's screen position changes in the buffer or on screen", -> marker.setHeadScreenPosition([8, 20]) @@ -859,7 +859,7 @@ describe "DisplayBuffer", -> it "updates markers before emitting buffer change events, but does not notify their observers until the change event", -> marker2 = displayBuffer.markBufferRange([[8, 1], [8, 1]]) - marker2.on 'changed', marker2ChangedHandler = jasmine.createSpy("marker2ChangedHandler") + marker2.onDidChange marker2ChangedHandler = jasmine.createSpy("marker2ChangedHandler") displayBuffer.on 'changed', changeHandler = jasmine.createSpy("changeHandler").andCallFake -> onDisplayBufferChange() # New change ---- @@ -886,7 +886,7 @@ describe "DisplayBuffer", -> marker2ChangedHandler.reset() marker3 = displayBuffer.markBufferRange([[8, 1], [8, 2]]) - marker3.on 'changed', marker3ChangedHandler = jasmine.createSpy("marker3ChangedHandler") + marker3.onDidChange marker3ChangedHandler = jasmine.createSpy("marker3ChangedHandler") onDisplayBufferChange = -> # calls change handler first diff --git a/src/cursor.coffee b/src/cursor.coffee index f75b8f790..95807d978 100644 --- a/src/cursor.coffee +++ b/src/cursor.coffee @@ -44,7 +44,7 @@ class Cursor extends Model constructor: ({@editor, @marker, id}) -> @assignId(id) @updateVisibility() - @marker.on 'changed', (e) => + @marker.onDidChange (e) => @updateVisibility() {oldHeadScreenPosition, newHeadScreenPosition} = e {oldHeadBufferPosition, newHeadBufferPosition} = e @@ -66,7 +66,7 @@ class Cursor extends Model @emit 'moved', movedEvent @editor.cursorMoved(this, movedEvent) - @marker.on 'destroyed', => + @marker.onDidDestroy => @destroyed = true @editor.removeCursor(this) @emit 'destroyed' diff --git a/src/display-buffer-marker.coffee b/src/display-buffer-marker.coffee index 7f868f24e..6d7b97e6f 100644 --- a/src/display-buffer-marker.coffee +++ b/src/display-buffer-marker.coffee @@ -1,10 +1,12 @@ {Range} = require 'text-buffer' _ = require 'underscore-plus' -{Emitter, Subscriber} = require 'emissary' +{Subscriber} = require 'emissary' +EmitterMixin = require('emissary').Emitter +{Emitter} = require 'event-kit' module.exports = class DisplayBufferMarker - Emitter.includeInto(this) + EmitterMixin.includeInto(this) Subscriber.includeInto(this) bufferMarkerSubscription: null @@ -15,6 +17,7 @@ class DisplayBufferMarker wasValid: true constructor: ({@bufferMarker, @displayBuffer}) -> + @emitter = new Emitter @id = @bufferMarker.id @oldHeadBufferPosition = @getHeadBufferPosition() @oldHeadScreenPosition = @getHeadScreenPosition() @@ -25,6 +28,12 @@ class DisplayBufferMarker @subscribe @bufferMarker.onDidDestroy => @destroyed() @subscribe @bufferMarker.onDidChange (event) => @notifyObservers(event) + onDidChange: (callback) -> + @emitter.on 'did-change', callback + + onDidDestroy: (callback) -> + @emitter.on 'did-destroy', callback + copy: (attributes) -> @displayBuffer.getMarker(@bufferMarker.copy(attributes).id) @@ -199,6 +208,8 @@ class DisplayBufferMarker destroyed: -> delete @displayBuffer.markers[@id] @emit 'destroyed' + @emitter.emit 'did-destroy' + @emitter.dispose() notifyObservers: ({textChanged}) -> textChanged ?= false @@ -215,7 +226,7 @@ class DisplayBufferMarker _.isEqual(newTailBufferPosition, @oldTailBufferPosition) and _.isEqual(newTailScreenPosition, @oldTailScreenPosition) - @emit 'changed', { + changeEvent = { @oldHeadScreenPosition, newHeadScreenPosition, @oldTailScreenPosition, newTailScreenPosition, @oldHeadBufferPosition, newHeadBufferPosition, @@ -223,6 +234,8 @@ class DisplayBufferMarker textChanged, isValid } + @emit 'changed', changeEvent + @emitter.emit 'did-change', changeEvent @oldHeadBufferPosition = newHeadBufferPosition @oldHeadScreenPosition = newHeadScreenPosition diff --git a/src/selection.coffee b/src/selection.coffee index 38198fef4..a071f8d83 100644 --- a/src/selection.coffee +++ b/src/selection.coffee @@ -30,8 +30,8 @@ class Selection extends Model @cursor.selection = this @decoration = @editor.decorateMarker(@marker, type: 'highlight', class: 'selection') - @marker.on 'changed', => @screenRangeChanged() - @marker.on 'destroyed', => + @marker.onDidChange => @screenRangeChanged() + @marker.onDidDestroy => @destroyed = true @editor.removeSelection(this) @emit 'destroyed' unless @editor.isDestroyed()