mirror of
https://github.com/atom/atom.git
synced 2026-01-22 21:38:10 -05:00
@@ -10,7 +10,6 @@ module.exports =
|
||||
BufferedProcess: require '../src/buffered-process'
|
||||
Directory: require '../src/directory'
|
||||
Document: Document
|
||||
EventEmitter: require '../src/event-emitter'
|
||||
File: require '../src/file'
|
||||
fs: require '../src/fs-utils'
|
||||
Git: require '../src/git'
|
||||
@@ -19,7 +18,6 @@ module.exports =
|
||||
ScrollView: require '../src/scroll-view'
|
||||
Site: Site
|
||||
stringscore: require '../vendor/stringscore'
|
||||
Subscriber: require '../src/subscriber'
|
||||
View: View
|
||||
|
||||
# The following classes can't be used from a Task handler and should therefore
|
||||
|
||||
13
package.json
13
package.json
@@ -15,6 +15,7 @@
|
||||
"bootstrap": "git://github.com/twbs/bootstrap.git#v3.0.0",
|
||||
"coffee-script": "1.6.2",
|
||||
"coffeestack": "0.6.0",
|
||||
"emissary": "0.6.0",
|
||||
"first-mate": "0.4.0",
|
||||
"git-utils": "0.26.0",
|
||||
"guid": "0.0.10",
|
||||
@@ -51,15 +52,15 @@
|
||||
"autoflow": "0.3.0",
|
||||
"bookmarks": "0.6.0",
|
||||
"bracket-matcher": "0.6.0",
|
||||
"collaboration": "0.23.0",
|
||||
"collaboration": "0.24.0",
|
||||
"command-logger": "0.4.0",
|
||||
"command-palette": "0.4.0",
|
||||
"editor-stats": "0.3.0",
|
||||
"exception-reporting": "0.4.0",
|
||||
"find-and-replace": "0.25.0",
|
||||
"find-and-replace": "0.26.0",
|
||||
"fuzzy-finder": "0.12.0",
|
||||
"gfm": "0.5.0",
|
||||
"git-diff": "0.9.0",
|
||||
"git-diff": "0.10.0",
|
||||
"gists": "0.3.0",
|
||||
"github-sign-in": "0.7.0",
|
||||
"go-to-line": "0.5.0",
|
||||
@@ -70,13 +71,13 @@
|
||||
"metrics": "0.8.0",
|
||||
"package-generator": "0.10.0",
|
||||
"release-notes": "0.3.0",
|
||||
"settings-view": "0.27.0",
|
||||
"snippets": "0.7.0",
|
||||
"settings-view": "0.28.0",
|
||||
"snippets": "0.8.0",
|
||||
"spell-check": "0.6.0",
|
||||
"status-bar": "0.12.0",
|
||||
"symbols-view": "0.10.0",
|
||||
"tabs": "0.6.0",
|
||||
"terminal": "0.10.0",
|
||||
"terminal": "0.11.0",
|
||||
"timecop": "0.5.0",
|
||||
"to-the-hubs": "0.6.0",
|
||||
"toml": "0.3.0",
|
||||
|
||||
@@ -1,208 +0,0 @@
|
||||
{_} = require 'atom'
|
||||
EventEmitter = require '../src/event-emitter'
|
||||
|
||||
describe "EventEmitter mixin", ->
|
||||
[object, fooHandler1, fooHandler2, barHandler] = []
|
||||
|
||||
beforeEach ->
|
||||
object = {}
|
||||
_.extend(object, EventEmitter)
|
||||
|
||||
fooHandler1 = jasmine.createSpy('fooHandler1')
|
||||
fooHandler2 = jasmine.createSpy('fooHandler2')
|
||||
barHandler = jasmine.createSpy('barHandler')
|
||||
|
||||
object.on 'foo', fooHandler1
|
||||
object.on 'foo', fooHandler2
|
||||
object.on 'bar', barHandler
|
||||
|
||||
describe ".on", ->
|
||||
describe "when called with multiple space-separated event names", ->
|
||||
it "subscribes to each event names", ->
|
||||
object.on ' a.b c.d\te ', fooHandler1
|
||||
|
||||
object.trigger 'a'
|
||||
expect(fooHandler1).toHaveBeenCalled()
|
||||
|
||||
fooHandler1.reset()
|
||||
object.trigger 'c'
|
||||
expect(fooHandler1).toHaveBeenCalled()
|
||||
|
||||
fooHandler1.reset()
|
||||
object.trigger 'e'
|
||||
expect(fooHandler1).toHaveBeenCalled()
|
||||
|
||||
fooHandler1.reset()
|
||||
object.trigger ''
|
||||
expect(fooHandler1).not.toHaveBeenCalled()
|
||||
|
||||
describe ".trigger", ->
|
||||
describe "when called with a non-namespaced event name", ->
|
||||
it "triggers all handlers registered for the given event name", ->
|
||||
object.trigger 'foo', 'data'
|
||||
expect(fooHandler1).toHaveBeenCalledWith('data')
|
||||
expect(fooHandler2).toHaveBeenCalledWith('data')
|
||||
expect(barHandler).not.toHaveBeenCalled()
|
||||
|
||||
fooHandler1.reset()
|
||||
fooHandler2.reset()
|
||||
|
||||
object.trigger 'bar', 'stuff'
|
||||
expect(barHandler).toHaveBeenCalledWith('stuff')
|
||||
|
||||
describe "when there are namespaced handlers", ->
|
||||
it "triggers only handlers registered with the given namespace / event combination", ->
|
||||
barHandler2 = jasmine.createSpy('barHandler2')
|
||||
object.on('bar.ns1', barHandler2)
|
||||
|
||||
object.trigger('bar')
|
||||
|
||||
expect(barHandler).toHaveBeenCalled()
|
||||
expect(barHandler2).toHaveBeenCalled()
|
||||
barHandler.reset()
|
||||
barHandler2.reset()
|
||||
|
||||
object.trigger('bar.ns1')
|
||||
|
||||
expect(barHandler).not.toHaveBeenCalled()
|
||||
expect(barHandler2).toHaveBeenCalled()
|
||||
|
||||
it "does not raise exceptions when called with non-existent events / namespaces", ->
|
||||
object.trigger('junk')
|
||||
object.trigger('junk.garbage')
|
||||
|
||||
describe ".off", ->
|
||||
describe "when called with no arguments", ->
|
||||
it "removes all subscriptions", ->
|
||||
object.off()
|
||||
object.trigger 'foo'
|
||||
expect(fooHandler1).not.toHaveBeenCalled()
|
||||
expect(fooHandler2).not.toHaveBeenCalled()
|
||||
|
||||
describe "when called with multiple space-separated event names", ->
|
||||
it "unsubscribes from each event name", ->
|
||||
object.on 'a.b c.d e', fooHandler1
|
||||
object.off ' a.b\te '
|
||||
|
||||
object.trigger 'a'
|
||||
expect(fooHandler1).not.toHaveBeenCalled()
|
||||
|
||||
fooHandler1.reset()
|
||||
object.trigger 'e'
|
||||
expect(fooHandler1).not.toHaveBeenCalled()
|
||||
|
||||
fooHandler1.reset()
|
||||
object.trigger 'c.d'
|
||||
expect(fooHandler1).toHaveBeenCalled()
|
||||
|
||||
describe "when called with a non-namespaced event name", ->
|
||||
it "removes all handlers for that event name", ->
|
||||
object.off 'foo'
|
||||
object.trigger 'foo'
|
||||
expect(fooHandler1).not.toHaveBeenCalled()
|
||||
expect(fooHandler2).not.toHaveBeenCalled()
|
||||
|
||||
describe "when called with a non-namespaced event name and a handler function", ->
|
||||
it "removes the specific handler", ->
|
||||
object.off 'foo', fooHandler1
|
||||
object.trigger 'foo'
|
||||
expect(fooHandler1).not.toHaveBeenCalled()
|
||||
expect(fooHandler2).toHaveBeenCalled()
|
||||
|
||||
it "does not throw an exception if there was not matching `on` call", ->
|
||||
expect(-> object.off 'marco', -> "nothing").not.toThrow()
|
||||
|
||||
describe "when there are namespaced event handlers", ->
|
||||
[barHandler2, bazHandler1, bazHandler2, bazHandler3] = []
|
||||
|
||||
beforeEach ->
|
||||
barHandler2 = jasmine.createSpy('barHandler2')
|
||||
bazHandler1 = jasmine.createSpy('bazHandler1')
|
||||
bazHandler2 = jasmine.createSpy('bazHandler2')
|
||||
bazHandler3 = jasmine.createSpy('bazHandler3')
|
||||
|
||||
object.on 'bar.ns1', barHandler2
|
||||
object.on 'baz.ns1', bazHandler1
|
||||
object.on 'baz.ns1', bazHandler2
|
||||
object.on 'baz.ns2', bazHandler3
|
||||
|
||||
describe "when called with a namespaced event name", ->
|
||||
it "removes all handlers in that namespace", ->
|
||||
object.trigger 'baz'
|
||||
|
||||
expect(bazHandler1).toHaveBeenCalled()
|
||||
expect(bazHandler2).toHaveBeenCalled()
|
||||
expect(bazHandler3).toHaveBeenCalled()
|
||||
|
||||
bazHandler1.reset()
|
||||
bazHandler2.reset()
|
||||
bazHandler3.reset()
|
||||
|
||||
object.off 'baz.ns1'
|
||||
object.trigger 'baz'
|
||||
object.trigger 'baz.ns1'
|
||||
|
||||
expect(bazHandler1).not.toHaveBeenCalled()
|
||||
expect(bazHandler2).not.toHaveBeenCalled()
|
||||
expect(bazHandler3).toHaveBeenCalled()
|
||||
|
||||
describe "when called with just a namespace", ->
|
||||
it "removes all handlers for all events on that namespace", ->
|
||||
object.trigger 'bar'
|
||||
expect(barHandler).toHaveBeenCalled()
|
||||
expect(barHandler2).toHaveBeenCalled()
|
||||
|
||||
barHandler.reset()
|
||||
barHandler2.reset()
|
||||
|
||||
object.trigger 'baz'
|
||||
expect(bazHandler1).toHaveBeenCalled()
|
||||
expect(bazHandler2).toHaveBeenCalled()
|
||||
expect(bazHandler3).toHaveBeenCalled()
|
||||
|
||||
bazHandler1.reset()
|
||||
bazHandler2.reset()
|
||||
bazHandler3.reset()
|
||||
|
||||
object.off '.ns1'
|
||||
|
||||
object.trigger 'bar'
|
||||
object.trigger 'bar.ns1'
|
||||
expect(barHandler).toHaveBeenCalled()
|
||||
expect(barHandler2).not.toHaveBeenCalled()
|
||||
|
||||
object.trigger 'baz'
|
||||
object.trigger 'baz.ns1'
|
||||
|
||||
expect(bazHandler1).not.toHaveBeenCalled()
|
||||
expect(bazHandler2).not.toHaveBeenCalled()
|
||||
expect(bazHandler3).toHaveBeenCalled()
|
||||
|
||||
describe "when called with event names and namespaces that don't exist", ->
|
||||
it "does not raise an exception", ->
|
||||
object.off 'junk'
|
||||
object.off '.garbage'
|
||||
object.off 'junk.garbage'
|
||||
|
||||
|
||||
describe ".one(event, callback)", ->
|
||||
it "triggers the given callback once, then removes the subscription", ->
|
||||
oneHandler = jasmine.createSpy('oneHandler')
|
||||
object.one 'event', oneHandler
|
||||
|
||||
object.trigger('event')
|
||||
expect(oneHandler).toHaveBeenCalled()
|
||||
oneHandler.reset()
|
||||
|
||||
object.trigger('event')
|
||||
expect(oneHandler).not.toHaveBeenCalled()
|
||||
|
||||
describe ".subscriptionCount()", ->
|
||||
it "returns the total number of subscriptions on the object", ->
|
||||
expect(object.subscriptionCount()).toBe 3
|
||||
|
||||
object.on 'baz', ->
|
||||
expect(object.subscriptionCount()).toBe 4
|
||||
|
||||
object.off 'foo'
|
||||
expect(object.subscriptionCount()).toBe 2
|
||||
@@ -1,54 +0,0 @@
|
||||
Subscriber = require '../src/subscriber'
|
||||
EventEmitter = require '../src/event-emitter'
|
||||
{_, $$} = require 'atom'
|
||||
|
||||
describe "Subscriber", ->
|
||||
[emitter1, emitter2, emitter3, event1Handler, event2Handler, event3Handler, subscriber] = []
|
||||
|
||||
class TestEventEmitter
|
||||
_.extend TestEventEmitter.prototype, EventEmitter
|
||||
|
||||
class TestSubscriber
|
||||
_.extend TestSubscriber.prototype, Subscriber
|
||||
|
||||
beforeEach ->
|
||||
emitter1 = new TestEventEmitter
|
||||
emitter2 = new TestEventEmitter
|
||||
emitter3 = $$ ->
|
||||
@div =>
|
||||
@a()
|
||||
@span()
|
||||
subscriber = new TestSubscriber
|
||||
event1Handler = jasmine.createSpy("event1Handler")
|
||||
event2Handler = jasmine.createSpy("event2Handler")
|
||||
event3Handler = jasmine.createSpy("event3Handler")
|
||||
subscriber.subscribe emitter1, 'event1', event1Handler
|
||||
subscriber.subscribe emitter2, 'event2', event2Handler
|
||||
subscriber.subscribe emitter3, 'event3', 'a', event3Handler
|
||||
|
||||
it "subscribes to events on the specified object", ->
|
||||
emitter1.trigger 'event1', 'foo'
|
||||
expect(event1Handler).toHaveBeenCalledWith('foo')
|
||||
|
||||
emitter2.trigger 'event2', 'bar'
|
||||
expect(event2Handler).toHaveBeenCalledWith('bar')
|
||||
|
||||
emitter3.find('span').trigger 'event3'
|
||||
expect(event3Handler).not.toHaveBeenCalledWith()
|
||||
|
||||
emitter3.find('a').trigger 'event3'
|
||||
expect(event3Handler).toHaveBeenCalled()
|
||||
|
||||
it "allows an object to unsubscribe en-masse", ->
|
||||
subscriber.unsubscribe()
|
||||
emitter1.trigger 'event1', 'foo'
|
||||
emitter2.trigger 'event2', 'bar'
|
||||
expect(event1Handler).not.toHaveBeenCalled()
|
||||
expect(event2Handler).not.toHaveBeenCalled()
|
||||
|
||||
it "allows an object to unsubscribe from a specific object", ->
|
||||
subscriber.unsubscribe(emitter1)
|
||||
emitter1.trigger 'event1', 'foo'
|
||||
emitter2.trigger 'event2', 'bar'
|
||||
expect(event1Handler).not.toHaveBeenCalled()
|
||||
expect(event2Handler).toHaveBeenCalledWith('bar')
|
||||
@@ -5,13 +5,13 @@ path = require 'path'
|
||||
_ = require './underscore-extensions'
|
||||
$ = require './jquery-extensions'
|
||||
CSON = require 'season'
|
||||
EventEmitter = require './event-emitter'
|
||||
{Emitter} = require 'emissary'
|
||||
|
||||
### Internal: Loads and resolves packages. ###
|
||||
|
||||
module.exports =
|
||||
class AtomPackage extends Package
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
@stylesheetsDir: 'stylesheets'
|
||||
|
||||
@@ -163,7 +163,7 @@ class AtomPackage extends Package
|
||||
@deactivateResources()
|
||||
@deactivateConfig()
|
||||
@mainModule?.deactivate?() if @mainActivated
|
||||
@trigger('deactivated')
|
||||
@emit('deactivated')
|
||||
|
||||
deactivateConfig: ->
|
||||
@mainModule?.deactivateConfig?()
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
#TODO remove once all packages have been updated
|
||||
{Emitter} = require 'emissary'
|
||||
Emitter::one = (args...) -> @once(args...)
|
||||
Emitter::trigger = (args...) -> @emit(args...)
|
||||
Emitter::subscriptionCount = (args...) -> @getSubscriptionCount(args...)
|
||||
|
||||
fsUtils = require './fs-utils'
|
||||
$ = require './jquery-extensions'
|
||||
_ = require './underscore-extensions'
|
||||
@@ -11,14 +17,14 @@ dialog = remote.require 'dialog'
|
||||
app = remote.require 'app'
|
||||
{Document} = require 'telepath'
|
||||
DeserializerManager = require './deserializer-manager'
|
||||
Subscriber = require './subscriber'
|
||||
{Subscriber} = require 'emissary'
|
||||
|
||||
# Public: Atom global for dealing with packages, themes, menus, and the window.
|
||||
#
|
||||
# An instance of this class is always available as the `atom` global.
|
||||
module.exports =
|
||||
class Atom
|
||||
_.extend @prototype, Subscriber
|
||||
Subscriber.includeInto(this)
|
||||
|
||||
constructor: ->
|
||||
@rootViewParentSelector = 'body'
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
fsUtils = require './fs-utils'
|
||||
_ = require './underscore-extensions'
|
||||
EventEmitter = require './event-emitter'
|
||||
{Emitter} = require 'emissary'
|
||||
CSON = require 'season'
|
||||
fs = require 'fs'
|
||||
path = require 'path'
|
||||
@@ -26,7 +26,7 @@ pathWatcher = require 'pathwatcher'
|
||||
# ```
|
||||
module.exports =
|
||||
class Config
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
defaultSettings: null
|
||||
settings: null
|
||||
@@ -88,7 +88,7 @@ class Config
|
||||
userConfig = CSON.readFileSync(@configFilePath)
|
||||
_.extend(@settings, userConfig)
|
||||
@configFileHasErrors = false
|
||||
@trigger 'updated'
|
||||
@emit 'updated'
|
||||
catch e
|
||||
@configFileHasErrors = true
|
||||
console.error "Failed to load user config '#{@configFilePath}'", e.message
|
||||
@@ -219,7 +219,7 @@ class Config
|
||||
update: ->
|
||||
return if @configFileHasErrors
|
||||
@save()
|
||||
@trigger 'updated'
|
||||
@emit 'updated'
|
||||
|
||||
# Private:
|
||||
save: ->
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{Point, Range} = require 'telepath'
|
||||
EventEmitter = require './event-emitter'
|
||||
{Emitter} = require 'emissary'
|
||||
_ = require './underscore-extensions'
|
||||
|
||||
# Public: The `Cursor` class represents the little blinking line identifying
|
||||
@@ -9,7 +9,7 @@ _ = require './underscore-extensions'
|
||||
# of a {StringMarker}.
|
||||
module.exports =
|
||||
class Cursor
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
screenPosition: null
|
||||
bufferPosition: null
|
||||
@@ -36,12 +36,12 @@ class Cursor
|
||||
newScreenPosition: newHeadScreenPosition
|
||||
textChanged: textChanged
|
||||
|
||||
@trigger 'moved', movedEvent
|
||||
@editSession.trigger 'cursor-moved', movedEvent
|
||||
@emit 'moved', movedEvent
|
||||
@editSession.emit 'cursor-moved', movedEvent
|
||||
@marker.on 'destroyed', =>
|
||||
@destroyed = true
|
||||
@editSession.removeCursor(this)
|
||||
@trigger 'destroyed'
|
||||
@emit 'destroyed'
|
||||
@needsAutoscroll = true
|
||||
|
||||
# Private:
|
||||
@@ -54,7 +54,7 @@ class Cursor
|
||||
@clearSelection()
|
||||
@needsAutoscroll = options.autoscroll ? @isLastCursor()
|
||||
unless fn()
|
||||
@trigger 'autoscrolled' if @needsAutoscroll
|
||||
@emit 'autoscrolled' if @needsAutoscroll
|
||||
|
||||
# Public: Moves a cursor to a given screen position.
|
||||
#
|
||||
@@ -97,7 +97,7 @@ class Cursor
|
||||
if @visible != visible
|
||||
@visible = visible
|
||||
@needsAutoscroll ?= true if @visible and @isLastCursor()
|
||||
@trigger 'visibility-changed', @visible
|
||||
@emit 'visibility-changed', @visible
|
||||
|
||||
# Public: Returns the visibility of the cursor.
|
||||
isVisible: -> @visible
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
_ = require './underscore-extensions'
|
||||
fs = require 'fs'
|
||||
path = require 'path'
|
||||
fsUtils = require './fs-utils'
|
||||
pathWatcher = require 'pathwatcher'
|
||||
File = require './file'
|
||||
EventEmitter = require './event-emitter'
|
||||
{Emitter} = require 'emissary'
|
||||
|
||||
# Public: Represents a directory using {File}s
|
||||
module.exports =
|
||||
class Directory
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
path: null
|
||||
realPath: null
|
||||
@@ -21,6 +20,11 @@ class Directory
|
||||
# + symlink:
|
||||
# A {Boolean} indicating if the path is a symlink
|
||||
constructor: (@path, @symlink=false) ->
|
||||
@on 'first-contents-changed-subscription-will-be-added', =>
|
||||
@subscribeToNativeChangeEvents()
|
||||
|
||||
@on 'last-contents-changed-subscription-removed', =>
|
||||
@unsubscribeFromNativeChangeEvents()
|
||||
|
||||
# Public: Returns the basename of the directory.
|
||||
getBaseName: ->
|
||||
@@ -90,18 +94,11 @@ class Directory
|
||||
|
||||
directories.concat(files)
|
||||
|
||||
# Private:
|
||||
afterSubscribe: ->
|
||||
@subscribeToNativeChangeEvents() if @subscriptionCount() == 1
|
||||
|
||||
# Private:
|
||||
afterUnsubscribe: ->
|
||||
@unsubscribeFromNativeChangeEvents() if @subscriptionCount() == 0
|
||||
|
||||
# Private:
|
||||
subscribeToNativeChangeEvents: ->
|
||||
@watchSubscription = pathWatcher.watch @path, (eventType) =>
|
||||
@trigger "contents-changed" if eventType is "change"
|
||||
unless @watchSubscription?
|
||||
@watchSubscription = pathWatcher.watch @path, (eventType) =>
|
||||
@emit "contents-changed" if eventType is "change"
|
||||
|
||||
# Private:
|
||||
unsubscribeFromNativeChangeEvents: ->
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
{Range} = require 'telepath'
|
||||
_ = require './underscore-extensions'
|
||||
EventEmitter = require './event-emitter'
|
||||
Subscriber = require './subscriber'
|
||||
{Emitter, Subscriber} = require 'emissary'
|
||||
|
||||
# Private:
|
||||
module.exports =
|
||||
class DisplayBufferMarker
|
||||
_.extend @prototype, EventEmitter
|
||||
_.extend @prototype, Subscriber
|
||||
Emitter.includeInto(this)
|
||||
Subscriber.includeInto(this)
|
||||
|
||||
bufferMarkerSubscription: null
|
||||
oldHeadBufferPosition: null
|
||||
@@ -184,7 +183,7 @@ class DisplayBufferMarker
|
||||
|
||||
destroyed: ->
|
||||
delete @displayBuffer.markers[@id]
|
||||
@trigger 'destroyed'
|
||||
@emit 'destroyed'
|
||||
|
||||
notifyObservers: ({textChanged}) ->
|
||||
textChanged ?= false
|
||||
@@ -203,7 +202,7 @@ class DisplayBufferMarker
|
||||
changed = true unless _.isEqual(isValid, @wasValid)
|
||||
return unless changed
|
||||
|
||||
@trigger 'changed', {
|
||||
@emit 'changed', {
|
||||
@oldHeadScreenPosition, newHeadScreenPosition,
|
||||
@oldTailScreenPosition, newTailScreenPosition,
|
||||
@oldHeadBufferPosition, newHeadBufferPosition,
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
_ = require './underscore-extensions'
|
||||
{Emitter, Subscriber} = require 'emissary'
|
||||
guid = require 'guid'
|
||||
telepath = require 'telepath'
|
||||
{Point, Range} = telepath
|
||||
TokenizedBuffer = require './tokenized-buffer'
|
||||
RowMap = require './row-map'
|
||||
EventEmitter = require './event-emitter'
|
||||
Fold = require './fold'
|
||||
Token = require './token'
|
||||
DisplayBufferMarker = require './display-buffer-marker'
|
||||
Subscriber = require './subscriber'
|
||||
ConfigObserver = require './config-observer'
|
||||
|
||||
# Private:
|
||||
module.exports =
|
||||
class DisplayBuffer
|
||||
_.extend @prototype, EventEmitter
|
||||
_.extend @prototype, Subscriber
|
||||
Emitter.includeInto(this)
|
||||
Subscriber.includeInto(this)
|
||||
_.extend @prototype, ConfigObserver
|
||||
|
||||
@acceptsDocuments: true
|
||||
@@ -46,7 +45,7 @@ class DisplayBuffer
|
||||
@foldsByMarkerId = {}
|
||||
@updateAllScreenLines()
|
||||
@createFoldForMarker(marker) for marker in @buffer.findMarkers(@getFoldMarkerAttributes())
|
||||
@subscribe @tokenizedBuffer, 'grammar-changed', (grammar) => @trigger 'grammar-changed', grammar
|
||||
@subscribe @tokenizedBuffer, 'grammar-changed', (grammar) => @emit 'grammar-changed', grammar
|
||||
@subscribe @tokenizedBuffer, 'changed', @handleTokenizedBufferChange
|
||||
@subscribe @buffer, 'markers-updated', @handleBufferMarkersUpdated
|
||||
@subscribe @buffer, 'marker-created', @handleBufferMarkerCreated
|
||||
@@ -54,7 +53,7 @@ class DisplayBuffer
|
||||
@subscribe @state, 'changed', ({key, newValue}) =>
|
||||
switch key
|
||||
when 'softWrap'
|
||||
@trigger 'soft-wrap-changed', newValue
|
||||
@emit 'soft-wrap-changed', newValue
|
||||
@updateWrappedScreenLines()
|
||||
|
||||
@observeConfig 'editor.preferredLineLength', callNow: false, =>
|
||||
@@ -78,11 +77,11 @@ class DisplayBuffer
|
||||
@rowMap = new RowMap
|
||||
@updateScreenLines(0, @buffer.getLineCount(), null, suppressChangeEvent: true)
|
||||
|
||||
triggerChanged: (eventProperties, refreshMarkers=true) ->
|
||||
emitChanged: (eventProperties, refreshMarkers=true) ->
|
||||
if refreshMarkers
|
||||
@pauseMarkerObservers()
|
||||
@refreshMarkerScreenPositions()
|
||||
@trigger 'changed', eventProperties
|
||||
@emit 'changed', eventProperties
|
||||
@resumeMarkerObservers()
|
||||
|
||||
updateWrappedScreenLines: ->
|
||||
@@ -91,7 +90,7 @@ class DisplayBuffer
|
||||
@updateAllScreenLines()
|
||||
screenDelta = @getLastRow() - end
|
||||
bufferDelta = 0
|
||||
@triggerChanged({ start, end, screenDelta, bufferDelta })
|
||||
@emitChanged({ start, end, screenDelta, bufferDelta })
|
||||
|
||||
### Public ###
|
||||
|
||||
@@ -565,7 +564,7 @@ class DisplayBuffer
|
||||
|
||||
resumeMarkerObservers: ->
|
||||
marker.resumeEvents() for marker in @getMarkers()
|
||||
@trigger 'markers-updated'
|
||||
@emit 'markers-updated'
|
||||
|
||||
refreshMarkerScreenPositions: ->
|
||||
for marker in @getMarkers()
|
||||
@@ -620,7 +619,7 @@ class DisplayBuffer
|
||||
@pauseMarkerObservers()
|
||||
@pendingChangeEvent = changeEvent
|
||||
else
|
||||
@triggerChanged(changeEvent, options.refreshMarkers)
|
||||
@emitChanged(changeEvent, options.refreshMarkers)
|
||||
|
||||
buildScreenLines: (startBufferRow, endBufferRow) ->
|
||||
newScreenLines = []
|
||||
@@ -686,11 +685,11 @@ class DisplayBuffer
|
||||
handleBufferMarkersUpdated: =>
|
||||
if event = @pendingChangeEvent
|
||||
@pendingChangeEvent = null
|
||||
@triggerChanged(event, false)
|
||||
@emitChanged(event, false)
|
||||
|
||||
handleBufferMarkerCreated: (marker) =>
|
||||
@createFoldForMarker(marker) if marker.matchesAttributes(@getFoldMarkerAttributes())
|
||||
@trigger 'marker-created', @getMarker(marker.id)
|
||||
@emit 'marker-created', @getMarker(marker.id)
|
||||
|
||||
createFoldForMarker: (marker) ->
|
||||
new Fold(this, marker)
|
||||
|
||||
@@ -8,8 +8,7 @@ LanguageMode = require './language-mode'
|
||||
DisplayBuffer = require './display-buffer'
|
||||
Cursor = require './cursor'
|
||||
Selection = require './selection'
|
||||
EventEmitter = require './event-emitter'
|
||||
Subscriber = require './subscriber'
|
||||
{Emitter, Subscriber} = require 'emissary'
|
||||
TextMateScopeSelector = require('first-mate').ScopeSelector
|
||||
|
||||
# Public: The core model of Atom.
|
||||
@@ -39,8 +38,8 @@ TextMateScopeSelector = require('first-mate').ScopeSelector
|
||||
# why that is.
|
||||
module.exports =
|
||||
class EditSession
|
||||
_.extend @prototype, EventEmitter
|
||||
_.extend @prototype, Subscriber
|
||||
Emitter.includeInto(this)
|
||||
Subscriber.includeInto(this)
|
||||
|
||||
@acceptsDocuments: true
|
||||
|
||||
@@ -104,9 +103,9 @@ class EditSession
|
||||
@subscribe @state, 'changed', ({key, newValue}) =>
|
||||
switch key
|
||||
when 'scrollTop'
|
||||
@trigger 'scroll-top-changed', newValue
|
||||
@emit 'scroll-top-changed', newValue
|
||||
when 'scrollLeft'
|
||||
@trigger 'scroll-left-changed', newValue
|
||||
@emit 'scroll-left-changed', newValue
|
||||
|
||||
project.addEditSession(this) if registerEditSession
|
||||
|
||||
@@ -115,20 +114,20 @@ class EditSession
|
||||
@buffer.retain()
|
||||
@subscribe @buffer, "path-changed", =>
|
||||
project.setPath(path.dirname(@getPath())) unless project.getPath()?
|
||||
@trigger "title-changed"
|
||||
@trigger "path-changed"
|
||||
@subscribe @buffer, "contents-modified", => @trigger "contents-modified"
|
||||
@subscribe @buffer, "contents-conflicted", => @trigger "contents-conflicted"
|
||||
@subscribe @buffer, "modified-status-changed", => @trigger "modified-status-changed"
|
||||
@emit "title-changed"
|
||||
@emit "path-changed"
|
||||
@subscribe @buffer, "contents-modified", => @emit "contents-modified"
|
||||
@subscribe @buffer, "contents-conflicted", => @emit "contents-conflicted"
|
||||
@subscribe @buffer, "modified-status-changed", => @emit "modified-status-changed"
|
||||
@preserveCursorPositionOnBufferReload()
|
||||
|
||||
# Private:
|
||||
setDisplayBuffer: (@displayBuffer) ->
|
||||
@subscribe @displayBuffer, 'marker-created', @handleMarkerCreated
|
||||
@subscribe @displayBuffer, "changed", (e) => @trigger 'screen-lines-changed', e
|
||||
@subscribe @displayBuffer, "changed", (e) => @emit 'screen-lines-changed', e
|
||||
@subscribe @displayBuffer, "markers-updated", => @mergeIntersectingSelections()
|
||||
@subscribe @displayBuffer, 'grammar-changed', => @handleGrammarChange()
|
||||
@subscribe @displayBuffer, 'soft-wrap-changed', (args...) => @trigger 'soft-wrap-changed', args...
|
||||
@subscribe @displayBuffer, 'soft-wrap-changed', (args...) => @emit 'soft-wrap-changed', args...
|
||||
|
||||
# Private:
|
||||
getViewClass: ->
|
||||
@@ -144,7 +143,7 @@ class EditSession
|
||||
@displayBuffer.destroy()
|
||||
@languageMode.destroy()
|
||||
project?.removeEditSession(this)
|
||||
@trigger 'destroyed'
|
||||
@emit 'destroyed'
|
||||
@off()
|
||||
|
||||
# Private:
|
||||
@@ -871,7 +870,7 @@ class EditSession
|
||||
@cursors.push(cursor)
|
||||
else
|
||||
@remoteCursors.push(cursor)
|
||||
@trigger 'cursor-added', cursor
|
||||
@emit 'cursor-added', cursor
|
||||
cursor
|
||||
|
||||
# Public: Removes and returns a cursor from the `EditSession`.
|
||||
@@ -904,7 +903,7 @@ class EditSession
|
||||
if selection.intersectsBufferRange(selectionBufferRange)
|
||||
return selection
|
||||
else
|
||||
@trigger 'selection-added', selection
|
||||
@emit 'selection-added', selection
|
||||
selection
|
||||
|
||||
# Public: Given a buffer range, this adds a new selection for it.
|
||||
@@ -1424,7 +1423,7 @@ class EditSession
|
||||
# Private:
|
||||
handleGrammarChange: ->
|
||||
@unfoldAll()
|
||||
@trigger 'grammar-changed'
|
||||
@emit 'grammar-changed'
|
||||
|
||||
# Private:
|
||||
handleMarkerCreated: (marker) =>
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
_ = require './underscore-extensions'
|
||||
|
||||
# Public: Provides a list of functions that can be used in Atom for event management.
|
||||
#
|
||||
# Each event can have more than one handler; that is, an event can trigger multiple functions.
|
||||
module.exports =
|
||||
# Associates an event name with a function to perform.
|
||||
#
|
||||
# This is called endlessly, until the event is turned {.off}.
|
||||
#
|
||||
# eventNames - A {String} containing one or more space-separated events.
|
||||
# handler - A {Function} that's executed when the event is triggered.
|
||||
on: (eventNames, handler) ->
|
||||
for eventName in eventNames.split(/\s+/) when eventName isnt ''
|
||||
[eventName, namespace] = eventName.split('.')
|
||||
|
||||
@eventHandlersByEventName ?= {}
|
||||
@eventHandlersByEventName[eventName] ?= []
|
||||
@eventHandlersByEventName[eventName].push(handler)
|
||||
|
||||
if namespace
|
||||
@eventHandlersByNamespace ?= {}
|
||||
@eventHandlersByNamespace[namespace] ?= {}
|
||||
@eventHandlersByNamespace[namespace][eventName] ?= []
|
||||
@eventHandlersByNamespace[namespace][eventName].push(handler)
|
||||
|
||||
@afterSubscribe?()
|
||||
|
||||
# Associates an event name with a function to perform only once.
|
||||
#
|
||||
# eventName - A {String} name identifying an event
|
||||
# handler - A {Function} that's executed when the event is triggered
|
||||
one: (eventName, handler) ->
|
||||
oneShotHandler = (args...) =>
|
||||
@off(eventName, oneShotHandler)
|
||||
handler(args...)
|
||||
|
||||
@on eventName, oneShotHandler
|
||||
|
||||
# Triggers a registered event.
|
||||
#
|
||||
# eventName - A {String} name identifying an event
|
||||
# args - Any additional arguments to pass over to the event `handler`
|
||||
trigger: (eventName, args...) ->
|
||||
if @queuedEvents
|
||||
@queuedEvents.push [eventName, args...]
|
||||
else
|
||||
[eventName, namespace] = eventName.split('.')
|
||||
|
||||
if namespace
|
||||
if handlers = @eventHandlersByNamespace?[namespace]?[eventName]
|
||||
new Array(handlers...).forEach (handler) -> handler(args...)
|
||||
else
|
||||
if handlers = @eventHandlersByEventName?[eventName]
|
||||
handlers.forEach (handler) -> handler(args...)
|
||||
|
||||
# Stops executing handlers for a registered event.
|
||||
#
|
||||
# eventNames - A {String} containing one or more space-separated events.
|
||||
# handler - The {Function} to remove from the event. If not provided, all handlers are removed.
|
||||
off: (eventNames, handler) ->
|
||||
if eventNames
|
||||
for eventName in eventNames.split(/\s+/) when eventName isnt ''
|
||||
[eventName, namespace] = eventName.split('.')
|
||||
eventName = undefined if eventName == ''
|
||||
|
||||
if namespace
|
||||
if eventName
|
||||
handlers = @eventHandlersByNamespace?[namespace]?[eventName] ? []
|
||||
for handler in new Array(handlers...)
|
||||
_.remove(handlers, handler)
|
||||
@off eventName, handler
|
||||
else
|
||||
for eventName, handlers of @eventHandlersByNamespace?[namespace] ? {}
|
||||
for handler in new Array(handlers...)
|
||||
_.remove(handlers, handler)
|
||||
@off eventName, handler
|
||||
else
|
||||
subscriptionCountBefore = @subscriptionCount()
|
||||
if handler
|
||||
eventHandlers = @eventHandlersByEventName[eventName]
|
||||
_.remove(eventHandlers, handler) if eventHandlers
|
||||
else
|
||||
delete @eventHandlersByEventName?[eventName]
|
||||
@afterUnsubscribe?() if @subscriptionCount() < subscriptionCountBefore
|
||||
else
|
||||
subscriptionCountBefore = @subscriptionCount()
|
||||
@eventHandlersByEventName = {}
|
||||
@eventHandlersByNamespace = {}
|
||||
@afterUnsubscribe?() if @subscriptionCount() < subscriptionCountBefore
|
||||
|
||||
# When called, stops triggering any events.
|
||||
pauseEvents: ->
|
||||
@pauseCount ?= 0
|
||||
if @pauseCount++ == 0
|
||||
@queuedEvents ?= []
|
||||
|
||||
# When called, resumes triggering events.
|
||||
resumeEvents: ->
|
||||
if --@pauseCount == 0
|
||||
queuedEvents = @queuedEvents
|
||||
@queuedEvents = null
|
||||
@trigger(event...) for event in queuedEvents
|
||||
|
||||
# Identifies how many events are registered.
|
||||
#
|
||||
# Returns a {Number}.
|
||||
getSubscriptionCount: ->
|
||||
count = 0
|
||||
for name, handlers of @eventHandlersByEventName
|
||||
count += handlers.length
|
||||
count
|
||||
|
||||
# Deprecated
|
||||
subscriptionCount: -> @getSubscriptionCount()
|
||||
@@ -1,5 +1,5 @@
|
||||
Q = require 'q'
|
||||
EventEmitter = require './event-emitter'
|
||||
{Emitter} = require 'emissary'
|
||||
path = require 'path'
|
||||
fsUtils = require './fs-utils'
|
||||
pathWatcher = require 'pathwatcher'
|
||||
@@ -11,7 +11,7 @@ _ = require './underscore-extensions'
|
||||
# {Directory} and access the {File} objects that it creates.
|
||||
module.exports =
|
||||
class File
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
path: null
|
||||
cachedContents: null
|
||||
@@ -25,6 +25,20 @@ class File
|
||||
constructor: (@path, @symlink=false) ->
|
||||
throw new Error("#{@path} is a directory") if fsUtils.isDirectorySync(@path)
|
||||
|
||||
@handleEventSubscriptions()
|
||||
|
||||
handleEventSubscriptions: ->
|
||||
eventNames = ['contents-changed', 'moved', 'removed']
|
||||
|
||||
subscriptionsAdded = eventNames.map (eventName) -> "first-#{eventName}-subscription-will-be-added"
|
||||
@on subscriptionsAdded.join(' '), =>
|
||||
@subscribeToNativeChangeEvents() if @exists()
|
||||
|
||||
subscriptionsRemoved = eventNames.map (eventName) -> "last-#{eventName}-subscription-removed"
|
||||
@on subscriptionsRemoved.join(' '), =>
|
||||
subscriptionsEmpty = _.every eventNames, (eventName) => @getSubscriptionCount(eventName) is 0
|
||||
@unsubscribeFromNativeChangeEvents() if subscriptionsEmpty
|
||||
|
||||
# Private: Sets the path for the file.
|
||||
setPath: (@path) ->
|
||||
|
||||
@@ -88,14 +102,6 @@ class File
|
||||
exists: ->
|
||||
fsUtils.exists(@getPath())
|
||||
|
||||
# Private:
|
||||
afterSubscribe: ->
|
||||
@subscribeToNativeChangeEvents() if @exists() and @subscriptionCount() == 1
|
||||
|
||||
# Private:
|
||||
afterUnsubscribe: ->
|
||||
@unsubscribeFromNativeChangeEvents() if @subscriptionCount() == 0
|
||||
|
||||
# Private:
|
||||
handleNativeChangeEvent: (eventType, path) ->
|
||||
if eventType is "delete"
|
||||
@@ -103,12 +109,12 @@ class File
|
||||
@detectResurrectionAfterDelay()
|
||||
else if eventType is "rename"
|
||||
@setPath(path)
|
||||
@trigger "moved"
|
||||
@emit "moved"
|
||||
else if eventType is "change"
|
||||
oldContents = @cachedContents
|
||||
newContents = @read(true)
|
||||
return if oldContents == newContents
|
||||
@trigger 'contents-changed'
|
||||
@emit 'contents-changed'
|
||||
|
||||
# Private:
|
||||
detectResurrectionAfterDelay: ->
|
||||
@@ -121,15 +127,16 @@ class File
|
||||
@handleNativeChangeEvent("change", @getPath())
|
||||
else
|
||||
@cachedContents = null
|
||||
@trigger "removed"
|
||||
@emit "removed"
|
||||
|
||||
# Private:
|
||||
subscribeToNativeChangeEvents: ->
|
||||
@watchSubscription = pathWatcher.watch @path, (eventType, path) =>
|
||||
@handleNativeChangeEvent(eventType, path)
|
||||
unless @watchSubscription?
|
||||
@watchSubscription = pathWatcher.watch @path, (eventType, path) =>
|
||||
@handleNativeChangeEvent(eventType, path)
|
||||
|
||||
# Private:
|
||||
unsubscribeFromNativeChangeEvents: ->
|
||||
if @watchSubscription
|
||||
if @watchSubscription?
|
||||
@watchSubscription.close()
|
||||
@watchSubscription = null
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
_ = require './underscore-extensions'
|
||||
fsUtils = require './fs-utils'
|
||||
Subscriber = require './subscriber'
|
||||
EventEmitter = require './event-emitter'
|
||||
Task = require './task'
|
||||
{Emitter, Subscriber} = require 'emissary'
|
||||
GitUtils = require 'git-utils'
|
||||
|
||||
# Public: Represents the underlying git operations performed by Atom.
|
||||
@@ -18,8 +17,8 @@ GitUtils = require 'git-utils'
|
||||
# ```
|
||||
module.exports =
|
||||
class Git
|
||||
_.extend @prototype, Subscriber
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
Subscriber.includeInto(this)
|
||||
|
||||
# Private: Creates a new `Git` instance.
|
||||
#
|
||||
@@ -81,6 +80,7 @@ class Git
|
||||
@getPathStatus(path)
|
||||
@subscribe buffer, 'saved', bufferStatusHandler
|
||||
@subscribe buffer, 'reloaded', bufferStatusHandler
|
||||
@subscribe buffer, 'destroyed', => @unsubscribe(buffer)
|
||||
|
||||
# Public: Destroy this `Git` object. This destroys any tasks and
|
||||
# subscriptions and releases the underlying libgit2 repository handle.
|
||||
@@ -125,7 +125,7 @@ class Git
|
||||
else
|
||||
delete @statuses[path]
|
||||
if currentPathStatus isnt pathStatus
|
||||
@trigger 'status-changed', path, pathStatus
|
||||
@emit 'status-changed', path, pathStatus
|
||||
pathStatus
|
||||
|
||||
# Public: Determines if the given path is ignored.
|
||||
@@ -274,4 +274,4 @@ class Git
|
||||
@statuses = statuses
|
||||
@upstream = upstream
|
||||
@branch = branch
|
||||
@trigger 'statuses-changed' unless statusesUnchanged
|
||||
@emit 'statuses-changed' unless statusesUnchanged
|
||||
|
||||
@@ -4,7 +4,7 @@ fsUtils = require './fs-utils'
|
||||
path = require 'path'
|
||||
CSON = require 'season'
|
||||
BindingSet = require './binding-set'
|
||||
EventEmitter = require './event-emitter'
|
||||
{Emitter} = require 'emissary'
|
||||
|
||||
# Internal: Associates keymaps with actions.
|
||||
#
|
||||
@@ -21,7 +21,7 @@ EventEmitter = require './event-emitter'
|
||||
# key, you define one or more key:value pairs, associating keystrokes with a command to execute.
|
||||
module.exports =
|
||||
class Keymap
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
bindingSets: null
|
||||
nextBindingSetIndex: 0
|
||||
@@ -34,7 +34,7 @@ class Keymap
|
||||
|
||||
loadBundledKeymaps: ->
|
||||
@loadDirectory(config.bundledKeymapsDirPath)
|
||||
@trigger('bundled-keymaps-loaded')
|
||||
@emit('bundled-keymaps-loaded')
|
||||
|
||||
loadUserKeymaps: ->
|
||||
@loadDirectory(path.join(config.configDirPath, 'keymaps'))
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
{Range} = require 'telepath'
|
||||
_ = require './underscore-extensions'
|
||||
{OnigRegExp} = require 'oniguruma'
|
||||
EventEmitter = require './event-emitter'
|
||||
Subscriber = require './subscriber'
|
||||
{Emitter, Subscriber} = require 'emissary'
|
||||
|
||||
### Internal ###
|
||||
|
||||
module.exports =
|
||||
class LanguageMode
|
||||
_.extend @prototype, EventEmitter
|
||||
_.extend @prototype, Subscriber
|
||||
Emitter.includeInto(this)
|
||||
Subscriber.includeInto(this)
|
||||
|
||||
buffer: null
|
||||
grammar: null
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
path = require 'path'
|
||||
|
||||
_ = require './underscore-extensions'
|
||||
LessCache = require 'less-cache'
|
||||
{Subscriber} = require 'emissary'
|
||||
|
||||
module.exports =
|
||||
class LessCompileCache
|
||||
_.extend @prototype, require('./subscriber')
|
||||
Subscriber.includeInto(this)
|
||||
|
||||
@cacheDir: '/tmp/atom-compile-cache/less'
|
||||
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
Token = require './token'
|
||||
EventEmitter = require './event-emitter'
|
||||
_ = require './underscore-extensions'
|
||||
{Emitter} = require 'emissary'
|
||||
|
||||
### Internal ###
|
||||
module.exports =
|
||||
class NullGrammar
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
name: 'Null Grammar'
|
||||
scopeName: 'text.plain.null-grammar'
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
EventEmitter = require './event-emitter'
|
||||
{Emitter} = require 'emissary'
|
||||
fsUtils = require './fs-utils'
|
||||
_ = require './underscore-extensions'
|
||||
Package = require './package'
|
||||
@@ -6,7 +6,7 @@ path = require 'path'
|
||||
|
||||
module.exports =
|
||||
class PackageManager
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
constructor: ({configDirPath, devMode, @resourcePath}) ->
|
||||
@packageDirPaths = [path.join(configDirPath, "packages")]
|
||||
@@ -58,7 +58,7 @@ class PackageManager
|
||||
require '../exports/atom'
|
||||
|
||||
@loadPackage(name) for name in @getAvailablePackageNames() when not @isPackageDisabled(name)
|
||||
@trigger 'loaded'
|
||||
@emit 'loaded'
|
||||
|
||||
loadPackage: (name, options) ->
|
||||
if @isPackageDisabled(name)
|
||||
|
||||
@@ -8,7 +8,7 @@ telepath = require 'telepath'
|
||||
{Range} = telepath
|
||||
TextBuffer = require './text-buffer'
|
||||
EditSession = require './edit-session'
|
||||
EventEmitter = require './event-emitter'
|
||||
{Emitter} = require 'emissary'
|
||||
Directory = require './directory'
|
||||
Task = require './task'
|
||||
Git = require './git'
|
||||
@@ -19,7 +19,7 @@ Git = require './git'
|
||||
# of directories and files that you can operate on.
|
||||
module.exports =
|
||||
class Project
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
@acceptsDocuments: true
|
||||
@version: 1
|
||||
@@ -125,7 +125,7 @@ class Project
|
||||
if originUrl = @repo?.getOriginUrl()
|
||||
@state.set('repoUrl', originUrl)
|
||||
|
||||
@trigger "path-changed"
|
||||
@emit "path-changed"
|
||||
|
||||
# Public: Returns the name of the root directory.
|
||||
getRootDirectory: ->
|
||||
@@ -205,7 +205,7 @@ class Project
|
||||
# Public: Add the given {EditSession}.
|
||||
addEditSession: (editSession) ->
|
||||
@editSessions.push editSession
|
||||
@trigger 'edit-session-created', editSession
|
||||
@emit 'edit-session-created', editSession
|
||||
|
||||
# Public: Return and removes the given {EditSession}.
|
||||
removeEditSession: (editSession) ->
|
||||
@@ -274,7 +274,7 @@ class Project
|
||||
addBufferAtIndex: (buffer, index, options={}) ->
|
||||
@buffers[index] = buffer
|
||||
@state.get('buffers').insert(index, buffer.getState()) if options.updateState ? true
|
||||
@trigger 'buffer-created', buffer
|
||||
@emit 'buffer-created', buffer
|
||||
|
||||
# Private: Removes a {TextBuffer} association from the project.
|
||||
#
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
{Range} = require 'telepath'
|
||||
EventEmitter = require './event-emitter'
|
||||
_ = require './underscore-extensions'
|
||||
{Emitter} = require 'emissary'
|
||||
|
||||
# Public: Represents a selection in the {EditSession}.
|
||||
module.exports =
|
||||
class Selection
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
cursor: null
|
||||
marker: null
|
||||
@@ -22,7 +21,7 @@ class Selection
|
||||
@marker.on 'destroyed', =>
|
||||
@destroyed = true
|
||||
@editSession.removeSelection(this)
|
||||
@trigger 'destroyed' unless @editSession.destroyed
|
||||
@emit 'destroyed' unless @editSession.destroyed
|
||||
|
||||
# Private:
|
||||
destroy: ->
|
||||
@@ -607,4 +606,4 @@ class Selection
|
||||
# Private:
|
||||
screenRangeChanged: ->
|
||||
screenRange = @getScreenRange()
|
||||
@trigger 'screen-range-changed', screenRange
|
||||
@emit 'screen-range-changed', screenRange
|
||||
|
||||
@@ -2,10 +2,10 @@ _ = require './underscore-extensions'
|
||||
spacePen = require 'space-pen'
|
||||
jQuery = require './jquery-extensions'
|
||||
ConfigObserver = require './config-observer'
|
||||
Subscriber = require './subscriber'
|
||||
{Subscriber} = require 'emissary'
|
||||
|
||||
_.extend spacePen.View.prototype, ConfigObserver
|
||||
_.extend spacePen.View.prototype, Subscriber
|
||||
Subscriber.includeInto(spacePen.View)
|
||||
|
||||
originalCleanData = jQuery.cleanData
|
||||
jQuery.cleanData = (elements) ->
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
_ = require './underscore-extensions'
|
||||
|
||||
# Public: Mixin for managing subscriptions of event listeners to different objects.
|
||||
#
|
||||
# Support unsubscribe from all register event listeners or just the listeners
|
||||
# registered on a given object.
|
||||
module.exports =
|
||||
subscribeWith: (eventEmitter, methodName, args) ->
|
||||
eventEmitter[methodName](args...)
|
||||
|
||||
@subscriptions ?= []
|
||||
@subscriptionsByObject ?= new WeakMap
|
||||
@subscriptionsByObject.set(eventEmitter, []) unless @subscriptionsByObject.has(eventEmitter)
|
||||
|
||||
eventName = _.first(args)
|
||||
callback = _.last(args)
|
||||
subscription = cancel: ->
|
||||
# node's EventEmitter doesn't have 'off' method.
|
||||
removeListener = eventEmitter.off ? eventEmitter.removeListener
|
||||
removeListener.call eventEmitter, eventName, callback
|
||||
@subscriptions.push(subscription)
|
||||
@subscriptionsByObject.get(eventEmitter).push(subscription)
|
||||
|
||||
subscribe: (eventEmitter, args...) ->
|
||||
@subscribeWith(eventEmitter, 'on', args)
|
||||
|
||||
subscribeToCommand: (eventEmitter, args...) ->
|
||||
@subscribeWith(eventEmitter, 'command', args)
|
||||
|
||||
unsubscribe: (object) ->
|
||||
if object?
|
||||
for subscription in @subscriptionsByObject?.get(object) ? []
|
||||
subscription.cancel()
|
||||
_.remove(@subscriptions, subscription)
|
||||
@subscriptionsByObject?.delete(object)
|
||||
else
|
||||
subscription.cancel() for subscription in @subscriptions ? []
|
||||
@subscriptions = null
|
||||
@subscriptionsByObject = null
|
||||
@@ -3,7 +3,7 @@ jQuery = require './jquery-extensions'
|
||||
Specificity = require '../vendor/specificity'
|
||||
{$$} = require './space-pen-extensions'
|
||||
fsUtils = require './fs-utils'
|
||||
EventEmitter = require './event-emitter'
|
||||
{Emitter} = require 'emissary'
|
||||
NullGrammar = require './null-grammar'
|
||||
TextMateScopeSelector = require('first-mate').ScopeSelector
|
||||
|
||||
@@ -11,7 +11,7 @@ TextMateScopeSelector = require('first-mate').ScopeSelector
|
||||
|
||||
module.exports =
|
||||
class Syntax
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
registerDeserializer(this)
|
||||
|
||||
@@ -38,7 +38,7 @@ class Syntax
|
||||
@grammarsByScopeName[grammar.scopeName] = grammar
|
||||
@injectionGrammars.push(grammar) if grammar.injectionSelector?
|
||||
@grammarUpdated(grammar.scopeName)
|
||||
@trigger 'grammar-added', grammar
|
||||
@emit 'grammar-added', grammar
|
||||
|
||||
removeGrammar: (grammar) ->
|
||||
_.remove(@grammars, grammar)
|
||||
@@ -48,7 +48,7 @@ class Syntax
|
||||
|
||||
grammarUpdated: (scopeName) ->
|
||||
for grammar in @grammars when grammar.scopeName isnt scopeName
|
||||
@trigger 'grammar-updated', grammar if grammar.grammarUpdated(scopeName)
|
||||
@emit 'grammar-updated', grammar if grammar.grammarUpdated(scopeName)
|
||||
|
||||
setGrammarOverrideForPath: (path, scopeName) ->
|
||||
@grammarOverridesByPath[path] = scopeName
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
_ = require './underscore-extensions'
|
||||
child_process = require 'child_process'
|
||||
EventEmitter = require './event-emitter'
|
||||
{Emitter} = require 'emissary'
|
||||
|
||||
# Public: Run a node script in a separate process.
|
||||
#
|
||||
@@ -14,7 +14,8 @@ EventEmitter = require './event-emitter'
|
||||
# * task:completed - Emitted when the task has succeeded or failed.
|
||||
module.exports =
|
||||
class Task
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
_.extend @prototype, Emitter
|
||||
|
||||
# Public: A helper method to easily launch and run a task once.
|
||||
#
|
||||
@@ -25,7 +26,7 @@ class Task
|
||||
# The Array of arguments to pass to the exported function.
|
||||
@once: (taskPath, args...) ->
|
||||
task = new Task(taskPath)
|
||||
task.one 'task:completed', -> task.terminate()
|
||||
task.once 'task:completed', -> task.terminate()
|
||||
task.start(args...)
|
||||
task
|
||||
|
||||
@@ -69,7 +70,7 @@ class Task
|
||||
handleEvents: ->
|
||||
@childProcess.removeAllListeners()
|
||||
@childProcess.on 'message', ({event, args}) =>
|
||||
@trigger(event, args...)
|
||||
@emit(event, args...)
|
||||
|
||||
# Public: Starts the task.
|
||||
#
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{Emitter, Subscriber} = require 'emissary'
|
||||
guid = require 'guid'
|
||||
Q = require 'q'
|
||||
{P} = require 'scandal'
|
||||
@@ -5,9 +6,7 @@ telepath = require 'telepath'
|
||||
|
||||
_ = require './underscore-extensions'
|
||||
fsUtils = require './fs-utils'
|
||||
EventEmitter = require './event-emitter'
|
||||
File = require './file'
|
||||
Subscriber = require './subscriber'
|
||||
|
||||
{Point, Range} = telepath
|
||||
|
||||
@@ -17,8 +16,8 @@ Subscriber = require './subscriber'
|
||||
# the case, as a `Buffer` could be an unsaved chunk of text.
|
||||
module.exports =
|
||||
class TextBuffer
|
||||
_.extend @prototype, EventEmitter
|
||||
_.extend @prototype, Subscriber
|
||||
Emitter.includeInto(this)
|
||||
Subscriber.includeInto(this)
|
||||
|
||||
@acceptsDocuments: true
|
||||
@version: 2
|
||||
@@ -61,8 +60,8 @@ class TextBuffer
|
||||
@loadFromDisk = not initialText
|
||||
|
||||
@subscribe @text, 'changed', @handleTextChange
|
||||
@subscribe @text, 'marker-created', (marker) => @trigger 'marker-created', marker
|
||||
@subscribe @text, 'markers-updated', => @trigger 'markers-updated'
|
||||
@subscribe @text, 'marker-created', (marker) => @emit 'marker-created', marker
|
||||
@subscribe @text, 'markers-updated', => @emit 'markers-updated'
|
||||
|
||||
@setPath(@project.resolve(filePath)) if @project
|
||||
|
||||
@@ -83,7 +82,7 @@ class TextBuffer
|
||||
@cachedMemoryContents = null
|
||||
@conflict = false if @conflict and !@isModified()
|
||||
bufferChangeEvent = _.pick(event, 'oldRange', 'newRange', 'oldText', 'newText')
|
||||
@trigger 'changed', bufferChangeEvent
|
||||
@emit 'changed', bufferChangeEvent
|
||||
@scheduleModifiedEvents()
|
||||
|
||||
destroy: ->
|
||||
@@ -92,7 +91,7 @@ class TextBuffer
|
||||
@unsubscribe()
|
||||
@destroyed = true
|
||||
@project?.removeBuffer(this)
|
||||
@trigger 'destroyed'
|
||||
@emit 'destroyed'
|
||||
|
||||
isRetained: -> @refcount > 0
|
||||
|
||||
@@ -119,17 +118,17 @@ class TextBuffer
|
||||
@conflict = true if @isModified()
|
||||
@updateCachedDiskContentsAsync().done =>
|
||||
if @conflict
|
||||
@trigger "contents-conflicted"
|
||||
@emit "contents-conflicted"
|
||||
else
|
||||
@reload()
|
||||
|
||||
@file.on "removed", =>
|
||||
@updateCachedDiskContentsAsync().done =>
|
||||
@triggerModifiedStatusChanged(@isModified())
|
||||
@emitModifiedStatusChanged(@isModified())
|
||||
|
||||
@file.on "moved", =>
|
||||
@state.set('relativePath', @project.relativize(@getPath()))
|
||||
@trigger "path-changed", this
|
||||
@emit "path-changed", this
|
||||
|
||||
### Public ###
|
||||
|
||||
@@ -144,10 +143,10 @@ class TextBuffer
|
||||
#
|
||||
# Sets the buffer's content to the cached disk contents
|
||||
reload: ->
|
||||
@trigger 'will-reload'
|
||||
@emit 'will-reload'
|
||||
@setText(@cachedDiskContents)
|
||||
@triggerModifiedStatusChanged(false)
|
||||
@trigger 'reloaded'
|
||||
@emitModifiedStatusChanged(false)
|
||||
@emit 'reloaded'
|
||||
|
||||
# Private: Rereads the contents of the file, and stores them in the cache.
|
||||
updateCachedDiskContents: ->
|
||||
@@ -191,7 +190,7 @@ class TextBuffer
|
||||
@file = null
|
||||
|
||||
@state.set('relativePath', @project.relativize(path))
|
||||
@trigger "path-changed", this
|
||||
@emit "path-changed", this
|
||||
|
||||
# Retrieves the current buffer's file extension.
|
||||
#
|
||||
@@ -399,12 +398,12 @@ class TextBuffer
|
||||
saveAs: (path) ->
|
||||
unless path then throw new Error("Can't save buffer with no file path")
|
||||
|
||||
@trigger 'will-be-saved'
|
||||
@emit 'will-be-saved'
|
||||
@setPath(path)
|
||||
@cachedDiskContents = @getText()
|
||||
@file.write(@getText())
|
||||
@triggerModifiedStatusChanged(false)
|
||||
@trigger 'saved'
|
||||
@emitModifiedStatusChanged(false)
|
||||
@emit 'saved'
|
||||
|
||||
# Identifies if the buffer was modified.
|
||||
#
|
||||
@@ -653,14 +652,14 @@ class TextBuffer
|
||||
stoppedChangingCallback = =>
|
||||
@stoppedChangingTimeout = null
|
||||
modifiedStatus = @isModified()
|
||||
@trigger 'contents-modified', modifiedStatus
|
||||
@triggerModifiedStatusChanged(modifiedStatus)
|
||||
@emit 'contents-modified', modifiedStatus
|
||||
@emitModifiedStatusChanged(modifiedStatus)
|
||||
@stoppedChangingTimeout = setTimeout(stoppedChangingCallback, @stoppedChangingDelay)
|
||||
|
||||
triggerModifiedStatusChanged: (modifiedStatus) ->
|
||||
emitModifiedStatusChanged: (modifiedStatus) ->
|
||||
return if modifiedStatus is @previousModifiedStatus
|
||||
@previousModifiedStatus = modifiedStatus
|
||||
@trigger 'modified-status-changed', modifiedStatus
|
||||
@emit 'modified-status-changed', modifiedStatus
|
||||
|
||||
logLines: (start=0, end=@getLastRow())->
|
||||
for row in [start..end]
|
||||
|
||||
@@ -4,7 +4,7 @@ plist = require 'plist'
|
||||
Token = require './token'
|
||||
{OnigRegExp, OnigScanner} = require 'oniguruma'
|
||||
path = require 'path'
|
||||
EventEmitter = require './event-emitter'
|
||||
{Emitter} = require 'emissary'
|
||||
{ScopeSelector} = require 'first-mate'
|
||||
|
||||
pathSplitRegex = new RegExp("[#{path.sep}.]")
|
||||
@@ -13,7 +13,7 @@ pathSplitRegex = new RegExp("[#{path.sep}.]")
|
||||
|
||||
module.exports =
|
||||
class TextMateGrammar
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
@load: (grammarPath, done) ->
|
||||
fsUtils.readObject grammarPath, (error, object) ->
|
||||
@@ -70,7 +70,7 @@ class TextMateGrammar
|
||||
return false unless _.include(@includedGrammarScopes, scopeName)
|
||||
@clearRules()
|
||||
syntax.grammarUpdated(@scopeName)
|
||||
@trigger 'grammar-updated'
|
||||
@emit 'grammar-updated'
|
||||
true
|
||||
|
||||
getScore: (filePath, contents) ->
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
path = require 'path'
|
||||
EventEmitter = require './event-emitter'
|
||||
{Emitter} = require 'emissary'
|
||||
Package = require './package'
|
||||
AtomPackage = require './atom-package'
|
||||
|
||||
@@ -10,7 +10,7 @@ fsUtils = require './fs-utils'
|
||||
# Private: Handles discovering and loading available themes.
|
||||
module.exports =
|
||||
class ThemeManager
|
||||
_.extend @prototype, EventEmitter
|
||||
Emitter.includeInto(this)
|
||||
|
||||
constructor: ->
|
||||
@loadedThemes = []
|
||||
@@ -128,7 +128,7 @@ class ThemeManager
|
||||
@activateTheme(themeName) for themeName in themeNames
|
||||
@loadUserStylesheet()
|
||||
@reloadBaseStylesheets()
|
||||
@trigger('reloaded')
|
||||
@emit('reloaded')
|
||||
|
||||
# Private:
|
||||
loadTheme: (name, options) ->
|
||||
@@ -167,7 +167,7 @@ class ThemeManager
|
||||
theme = @loadTheme(name)
|
||||
theme.activate()
|
||||
@activeThemes.push(theme)
|
||||
@trigger('theme-activated', theme)
|
||||
@emit('theme-activated', theme)
|
||||
catch error
|
||||
console.warn("Failed to load theme #{name}", error.stack ? error)
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
_ = require './underscore-extensions'
|
||||
TokenizedLine = require './tokenized-line'
|
||||
EventEmitter = require './event-emitter'
|
||||
Subscriber = require './subscriber'
|
||||
{Emitter, Subscriber} = require 'emissary'
|
||||
Token = require './token'
|
||||
telepath = require 'telepath'
|
||||
{Point, Range} = telepath
|
||||
@@ -10,8 +9,8 @@ telepath = require 'telepath'
|
||||
|
||||
module.exports =
|
||||
class TokenizedBuffer
|
||||
_.extend @prototype, EventEmitter
|
||||
_.extend @prototype, Subscriber
|
||||
Emitter.includeInto(this)
|
||||
Subscriber.includeInto(this)
|
||||
|
||||
grammar: null
|
||||
currentGrammarScore: null
|
||||
@@ -62,7 +61,7 @@ class TokenizedBuffer
|
||||
@grammar = grammar
|
||||
@currentGrammarScore = score ? grammar.getScore(@buffer.getPath(), @buffer.getText())
|
||||
@subscribe @grammar, 'grammar-updated', => @resetTokenizedLines()
|
||||
@trigger 'grammar-changed', grammar
|
||||
@emit 'grammar-changed', grammar
|
||||
|
||||
reloadGrammar: ->
|
||||
if grammar = syntax.selectGrammar(@buffer.getPath(), @buffer.getText())
|
||||
@@ -98,7 +97,7 @@ class TokenizedBuffer
|
||||
lastRow = @buffer.getLastRow()
|
||||
@tokenizedLines = @buildPlaceholderTokenizedLinesForRows(0, lastRow)
|
||||
@invalidateRow(0)
|
||||
@trigger "changed", { start: 0, end: lastRow, delta: 0 }
|
||||
@emit "changed", { start: 0, end: lastRow, delta: 0 }
|
||||
|
||||
tokenizeInBackground: ->
|
||||
return if not @visible or @pendingChunk or @destroyed
|
||||
@@ -129,7 +128,7 @@ class TokenizedBuffer
|
||||
|
||||
@validateRow(row)
|
||||
@invalidateRow(row + 1) unless filledRegion
|
||||
@trigger "changed", { start: invalidRow, end: row, delta: 0 }
|
||||
@emit "changed", { start: invalidRow, end: row, delta: 0 }
|
||||
|
||||
@tokenizeInBackground() if @firstInvalidRow()?
|
||||
|
||||
@@ -168,7 +167,7 @@ class TokenizedBuffer
|
||||
if newEndStack and not _.isEqual(newEndStack, previousEndStack)
|
||||
@invalidateRow(end + delta + 1)
|
||||
|
||||
@trigger "changed", { start, end, delta, bufferChange: e }
|
||||
@emit "changed", { start, end, delta, bufferChange: e }
|
||||
|
||||
buildTokenizedLinesForRows: (startRow, endRow, startingStack) ->
|
||||
ruleStack = startingStack
|
||||
|
||||
@@ -2,13 +2,13 @@ $ = require './jquery-extensions'
|
||||
_ = require './underscore-extensions'
|
||||
ipc = require 'ipc'
|
||||
shell = require 'shell'
|
||||
Subscriber = require './subscriber'
|
||||
{Subscriber} = require 'emissary'
|
||||
fsUtils = require './fs-utils'
|
||||
|
||||
# Private: Handles low-level events related to the window.
|
||||
module.exports =
|
||||
class WindowEventHandler
|
||||
_.extend @prototype, Subscriber
|
||||
Subscriber.includeInto(this)
|
||||
|
||||
constructor: ->
|
||||
@reloadRequested = false
|
||||
|
||||
Reference in New Issue
Block a user