Buffer emits a contents-modified event when it's contents differ from disk.

Including when the Buffer's file is removed via another process.
This commit is contained in:
Corey Johnson
2012-11-29 12:05:05 -08:00
parent ada14a1cba
commit 69485724cd
3 changed files with 56 additions and 19 deletions

View File

@@ -744,22 +744,58 @@ describe 'Buffer', ->
buffer.setText('\n')
expect(buffer.isEmpty()).toBeFalsy()
describe "stopped-changing event", ->
it "fires 'stoppedChangingDelay' ms after the last buffer change", ->
delay = buffer.stoppedChangingDelay
stoppedChangingHandler = jasmine.createSpy("stoppedChangingHandler")
buffer.on 'stopped-changing', stoppedChangingHandler
describe "'contents-modified' event", ->
describe "when the buffer is deleted", ->
it "triggers the contents-modified event", ->
delay = buffer.stoppedChangingDelay
path = "/tmp/atom-file-to-delete.txt"
fs.write(path, 'delete me')
bufferToDelete = new Buffer(path)
contentsModifiedHandler = jasmine.createSpy("contentsModifiedHandler")
bufferToDelete.on 'contents-modified', contentsModifiedHandler
buffer.insert([0, 0], 'a')
expect(stoppedChangingHandler).not.toHaveBeenCalled()
expect(bufferToDelete.getPath()).toBe path
expect(bufferToDelete.isModified()).toBeFalsy()
expect(contentsModifiedHandler).not.toHaveBeenCalled()
advanceClock(delay / 2)
fs.remove(path)
waitsFor "file to be removed", (done) ->
bufferToDelete.file.one 'remove', done
buffer.insert([0, 0], 'b')
expect(stoppedChangingHandler).not.toHaveBeenCalled()
runs ->
expect(contentsModifiedHandler).toHaveBeenCalledWith(differsFromDisk:true)
bufferToDelete.destroy()
advanceClock(delay / 2)
expect(stoppedChangingHandler).not.toHaveBeenCalled()
advanceClock(delay / 2)
expect(stoppedChangingHandler).toHaveBeenCalled()
describe "when the buffer text has been changed", ->
it "triggers the contents-modified event 'stoppedChangingDelay' ms after the last buffer change", ->
delay = buffer.stoppedChangingDelay
contentsModifiedHandler = jasmine.createSpy("contentsModifiedHandler")
buffer.on 'contents-modified', contentsModifiedHandler
buffer.insert([0, 0], 'a')
expect(contentsModifiedHandler).not.toHaveBeenCalled()
advanceClock(delay / 2)
buffer.insert([0, 0], 'b')
expect(contentsModifiedHandler).not.toHaveBeenCalled()
advanceClock(delay / 2)
expect(contentsModifiedHandler).not.toHaveBeenCalled()
advanceClock(delay / 2)
expect(contentsModifiedHandler).toHaveBeenCalled()
it "triggers the contents-modified event with data about whether its contents differ from the contents on disk", ->
delay = buffer.stoppedChangingDelay
contentsModifiedHandler = jasmine.createSpy("contentsModifiedHandler")
buffer.on 'contents-modified', contentsModifiedHandler
buffer.insert([0, 0], 'a')
advanceClock(delay)
expect(contentsModifiedHandler).toHaveBeenCalledWith(differsFromDisk:true)
buffer.delete([[0, 0], [0, 1]], '')
advanceClock(delay)
expect(contentsModifiedHandler).toHaveBeenCalledWith(differsFromDisk:false)

View File

@@ -67,6 +67,7 @@ class Buffer
@file.on "remove", =>
@updateCachedDiskContents()
@trigger "contents-modified", {differsFromDisk: true}
@file.on "move", =>
@trigger "path-change", this
@@ -384,7 +385,7 @@ class Buffer
clearTimeout(@stoppedChangingTimeout) if @stoppedChangingTimeout
stoppedChangingCallback = =>
@stoppedChangingTimeout = null
@trigger 'stopped-changing'
@trigger 'contents-modified', {differsFromDisk: @isModified()}
@stoppedChangingTimeout = setTimeout(stoppedChangingCallback, @stoppedChangingDelay)
fileExists: ->

View File

@@ -42,18 +42,18 @@ class StatusBar extends View
subscribeToBuffer: ->
@buffer?.off '.status-bar'
@buffer = @editor.getBuffer()
@buffer.on 'stopped-changing.status-bar', => @updateBufferModifiedText()
@buffer.on 'contents-modified.status-bar', (e) => @updateBufferHasModifiedText(e.differsFromDisk)
@buffer.on 'after-save.status-bar', => @updateStatusBar()
@buffer.on 'git-status-change.status-bar', => @updateStatusBar()
@updateStatusBar()
updateStatusBar: ->
@updateBranchText()
@updateBufferModifiedText()
@updateBufferHasModifiedText(@buffer.isModified())
@updateStatusText()
updateBufferModifiedText: ->
if @buffer.isModified()
updateBufferHasModifiedText: (differsFromDisk)->
if differsFromDisk
@bufferModified.text('*') unless @isModified
@isModified = true
else