From ee09eee374144587c61ac35af3ef7c8b052152a8 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Wed, 12 Feb 2014 16:56:00 -0800 Subject: [PATCH 01/12] Move (un)registerOpener to Workspace --- spec/project-spec.coffee | 171 +++++++++++++++---------------------- spec/workspace-spec.coffee | 16 ++++ src/project.coffee | 43 +++------- src/workspace.coffee | 68 ++++++++++----- 4 files changed, 139 insertions(+), 159 deletions(-) diff --git a/spec/project-spec.coffee b/spec/project-spec.coffee index 1ac76e204..e33413f97 100644 --- a/spec/project-spec.coffee +++ b/spec/project-spec.coffee @@ -72,7 +72,7 @@ describe "Project", -> expect(atom.project.getEditors()[1]).toBe editor2 describe ".openSync(path)", -> - [fooOpener, barOpener, absolutePath, newBufferHandler, newEditorHandler] = [] + [absolutePath, newBufferHandler, newEditorHandler] = [] beforeEach -> absolutePath = require.resolve('./fixtures/dir/a') newBufferHandler = jasmine.createSpy('newBufferHandler') @@ -80,129 +80,92 @@ describe "Project", -> newEditorHandler = jasmine.createSpy('newEditorHandler') atom.project.on 'editor-created', newEditorHandler - fooOpener = (pathToOpen, options) -> { foo: pathToOpen, options } if pathToOpen?.match(/\.foo/) - barOpener = (pathToOpen) -> { bar: pathToOpen } if pathToOpen?.match(/^bar:\/\//) - atom.project.registerOpener(fooOpener) - atom.project.registerOpener(barOpener) + describe "when given an absolute path that hasn't been opened previously", -> + it "returns a new edit session for the given path and emits 'buffer-created' and 'editor-created' events", -> + editor = atom.project.openSync(absolutePath) + expect(editor.buffer.getPath()).toBe absolutePath + expect(newBufferHandler).toHaveBeenCalledWith editor.buffer + expect(newEditorHandler).toHaveBeenCalledWith editor - afterEach -> - atom.project.unregisterOpener(fooOpener) - atom.project.unregisterOpener(barOpener) + describe "when given a relative path that hasn't been opened previously", -> + it "returns a new edit session for the given path (relative to the project root) and emits 'buffer-created' and 'editor-created' events", -> + editor = atom.project.openSync('a') + expect(editor.buffer.getPath()).toBe absolutePath + expect(newBufferHandler).toHaveBeenCalledWith editor.buffer + expect(newEditorHandler).toHaveBeenCalledWith editor - describe "when passed a path that doesn't match a custom opener", -> - describe "when given an absolute path that hasn't been opened previously", -> - it "returns a new edit session for the given path and emits 'buffer-created' and 'editor-created' events", -> - editor = atom.project.openSync(absolutePath) + describe "when passed the path to a buffer that has already been opened", -> + it "returns a new edit session containing previously opened buffer and emits a 'editor-created' event", -> + editor = atom.project.openSync(absolutePath) + newBufferHandler.reset() + expect(atom.project.openSync(absolutePath).buffer).toBe editor.buffer + expect(atom.project.openSync('a').buffer).toBe editor.buffer + expect(newBufferHandler).not.toHaveBeenCalled() + expect(newEditorHandler).toHaveBeenCalledWith editor + + describe "when not passed a path", -> + it "returns a new edit session and emits 'buffer-created' and 'editor-created' events", -> + editor = atom.project.openSync() + expect(editor.buffer.getPath()).toBeUndefined() + expect(newBufferHandler).toHaveBeenCalledWith(editor.buffer) + expect(newEditorHandler).toHaveBeenCalledWith editor + + describe ".open(path)", -> + [absolutePath, newBufferHandler, newEditorHandler] = [] + + beforeEach -> + absolutePath = require.resolve('./fixtures/dir/a') + newBufferHandler = jasmine.createSpy('newBufferHandler') + atom.project.on 'buffer-created', newBufferHandler + newEditorHandler = jasmine.createSpy('newEditorHandler') + atom.project.on 'editor-created', newEditorHandler + + describe "when given an absolute path that isn't currently open", -> + it "returns a new edit session for the given path and emits 'buffer-created' and 'editor-created' events", -> + editor = null + waitsForPromise -> + atom.project.open(absolutePath).then (o) -> editor = o + + runs -> expect(editor.buffer.getPath()).toBe absolutePath expect(newBufferHandler).toHaveBeenCalledWith editor.buffer expect(newEditorHandler).toHaveBeenCalledWith editor - describe "when given a relative path that hasn't been opened previously", -> - it "returns a new edit session for the given path (relative to the project root) and emits 'buffer-created' and 'editor-created' events", -> - editor = atom.project.openSync('a') + describe "when given a relative path that isn't currently opened", -> + it "returns a new edit session for the given path (relative to the project root) and emits 'buffer-created' and 'editor-created' events", -> + editor = null + waitsForPromise -> + atom.project.open(absolutePath).then (o) -> editor = o + + runs -> expect(editor.buffer.getPath()).toBe absolutePath expect(newBufferHandler).toHaveBeenCalledWith editor.buffer expect(newEditorHandler).toHaveBeenCalledWith editor - describe "when passed the path to a buffer that has already been opened", -> - it "returns a new edit session containing previously opened buffer and emits a 'editor-created' event", -> - editor = atom.project.openSync(absolutePath) + describe "when passed the path to a buffer that is currently opened", -> + it "returns a new edit session containing currently opened buffer and emits a 'editor-created' event", -> + editor = null + waitsForPromise -> + atom.project.open(absolutePath).then (o) -> editor = o + + runs -> newBufferHandler.reset() expect(atom.project.openSync(absolutePath).buffer).toBe editor.buffer expect(atom.project.openSync('a').buffer).toBe editor.buffer expect(newBufferHandler).not.toHaveBeenCalled() expect(newEditorHandler).toHaveBeenCalledWith editor - describe "when not passed a path", -> - it "returns a new edit session and emits 'buffer-created' and 'editor-created' events", -> - editor = atom.project.openSync() + describe "when not passed a path", -> + it "returns a new edit session and emits 'buffer-created' and 'editor-created' events", -> + editor = null + waitsForPromise -> + atom.project.open().then (o) -> editor = o + + runs -> expect(editor.buffer.getPath()).toBeUndefined() expect(newBufferHandler).toHaveBeenCalledWith(editor.buffer) expect(newEditorHandler).toHaveBeenCalledWith editor - describe "when passed a path that matches a custom opener", -> - it "returns the resource returned by the custom opener", -> - pathToOpen = atom.project.resolve('a.foo') - expect(atom.project.openSync(pathToOpen, hey: "there")).toEqual { foo: pathToOpen, options: {hey: "there"} } - expect(atom.project.openSync("bar://baz")).toEqual { bar: "bar://baz" } - - describe ".open(path)", -> - [fooOpener, barOpener, absolutePath, newBufferHandler, newEditorHandler] = [] - - beforeEach -> - absolutePath = require.resolve('./fixtures/dir/a') - newBufferHandler = jasmine.createSpy('newBufferHandler') - atom.project.on 'buffer-created', newBufferHandler - newEditorHandler = jasmine.createSpy('newEditorHandler') - atom.project.on 'editor-created', newEditorHandler - - fooOpener = (pathToOpen, options) -> { foo: pathToOpen, options } if pathToOpen?.match(/\.foo/) - barOpener = (pathToOpen) -> { bar: pathToOpen } if pathToOpen?.match(/^bar:\/\//) - atom.project.registerOpener(fooOpener) - atom.project.registerOpener(barOpener) - - afterEach -> - atom.project.unregisterOpener(fooOpener) - atom.project.unregisterOpener(barOpener) - - describe "when passed a path that doesn't match a custom opener", -> - describe "when given an absolute path that isn't currently open", -> - it "returns a new edit session for the given path and emits 'buffer-created' and 'editor-created' events", -> - editor = null - waitsForPromise -> - atom.project.open(absolutePath).then (o) -> editor = o - - runs -> - expect(editor.buffer.getPath()).toBe absolutePath - expect(newBufferHandler).toHaveBeenCalledWith editor.buffer - expect(newEditorHandler).toHaveBeenCalledWith editor - - describe "when given a relative path that isn't currently opened", -> - it "returns a new edit session for the given path (relative to the project root) and emits 'buffer-created' and 'editor-created' events", -> - editor = null - waitsForPromise -> - atom.project.open(absolutePath).then (o) -> editor = o - - runs -> - expect(editor.buffer.getPath()).toBe absolutePath - expect(newBufferHandler).toHaveBeenCalledWith editor.buffer - expect(newEditorHandler).toHaveBeenCalledWith editor - - describe "when passed the path to a buffer that is currently opened", -> - it "returns a new edit session containing currently opened buffer and emits a 'editor-created' event", -> - editor = null - waitsForPromise -> - atom.project.open(absolutePath).then (o) -> editor = o - - runs -> - newBufferHandler.reset() - expect(atom.project.openSync(absolutePath).buffer).toBe editor.buffer - expect(atom.project.openSync('a').buffer).toBe editor.buffer - expect(newBufferHandler).not.toHaveBeenCalled() - expect(newEditorHandler).toHaveBeenCalledWith editor - - describe "when not passed a path", -> - it "returns a new edit session and emits 'buffer-created' and 'editor-created' events", -> - editor = null - waitsForPromise -> - atom.project.open().then (o) -> editor = o - - runs -> - expect(editor.buffer.getPath()).toBeUndefined() - expect(newBufferHandler).toHaveBeenCalledWith(editor.buffer) - expect(newEditorHandler).toHaveBeenCalledWith editor - - describe "when passed a path that matches a custom opener", -> - it "returns the resource returned by the custom opener", -> - waitsForPromise -> - pathToOpen = atom.project.resolve('a.foo') - atom.project.open(pathToOpen, hey: "there").then (item) -> - expect(item).toEqual { foo: pathToOpen, options: {hey: "there"} } - - waitsForPromise -> - atom.project.open("bar://baz").then (item) -> - expect(item).toEqual { bar: "bar://baz" } - it "returns number of read bytes as progress indicator", -> filePath = atom.project.resolve 'a' totalBytes = 0 diff --git a/spec/workspace-spec.coffee b/spec/workspace-spec.coffee index fd99c3d74..3f3a04698 100644 --- a/spec/workspace-spec.coffee +++ b/spec/workspace-spec.coffee @@ -126,6 +126,22 @@ describe "Workspace", -> expect(pane1.items).toEqual [] expect(pane2.items).toEqual [editor] + describe "when passed a path that matches a custom opener", -> + it "returns the resource returned by the custom opener", -> + fooOpener = (pathToOpen, options) -> { foo: pathToOpen, options } if pathToOpen?.match(/\.foo/) + barOpener = (pathToOpen) -> { bar: pathToOpen } if pathToOpen?.match(/^bar:\/\//) + workspace.registerOpener(fooOpener) + workspace.registerOpener(barOpener) + + waitsForPromise -> + pathToOpen = atom.project.relativize('a.foo') + workspace.open(pathToOpen, hey: "there").then (item) -> + expect(item).toEqual { foo: pathToOpen, options: {hey: "there"} } + + waitsForPromise -> + workspace.open("bar://baz").then (item) -> + expect(item).toEqual { bar: "bar://baz" } + describe "::openSync(uri, options)", -> [activePane, initialItemCount] = [] diff --git a/src/project.coffee b/src/project.coffee index f69af88f5..0f93bb520 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -34,7 +34,6 @@ class Project extends Model do (buffer) => buffer.once 'destroyed', => @removeBuffer(buffer) - @openers = [] @editors = [] @setPath(path) @@ -46,23 +45,6 @@ class Project extends Model params.buffers = params.buffers.map (bufferState) -> atom.deserializers.deserialize(bufferState) params - # Public: Register an opener for project files. - # - # An {Editor} will be used if no openers return a value. - # - # ## Example - # ```coffeescript - # atom.project.registerOpener (filePath) -> - # if path.extname(filePath) is '.toml' - # return new TomlEditor(filePath) - # ``` - # - # opener - A {Function} to be called when a path is being opened. - registerOpener: (opener) -> @openers.push(opener) - - # Public: Remove a previously registered opener. - unregisterOpener: (opener) -> _.remove(@openers, opener) - destroyed: -> editor.destroy() for editor in @getEditors() buffer.destroy() for buffer in @getBuffers() @@ -129,7 +111,7 @@ class Project extends Model contains: (pathToCheck) -> @rootDirectory?.contains(pathToCheck) ? false - # Public: Given a path to a file, this constructs and associates a new + # Given a path to a file, this constructs and associates a new # {Editor}, showing the file. # # filePath - The {String} path of the file to associate with. @@ -137,21 +119,14 @@ class Project extends Model # # Returns a promise that resolves to an {Editor}. open: (filePath, options={}) -> - filePath = @resolve(filePath) ? '' - resource = opener(filePath, options) for opener in @openers when !resource + filePath = @resolve(filePath) + @bufferForPath(filePath).then (buffer) => + @buildEditorForBuffer(buffer, options) - if resource - Q(resource) - else - @bufferForPath(filePath).then (buffer) => - @buildEditorForBuffer(buffer, options) - - # Only be used in specs + # Deprecated openSync: (filePath, options={}) -> - filePath = @resolve(filePath) ? '' - resource = opener(filePath, options) for opener in @openers when !resource - - resource or @buildEditorForBuffer(@bufferForPathSync(filePath), options) + filePath = @resolve(filePath) + @buildEditorForBuffer(@bufferForPathSync(filePath), options) # Public: Retrieves all {Editor}s for all open files. # @@ -343,3 +318,7 @@ class Project extends Model subscriber.subscribe this, 'buffer-created', (buffer) -> callback(buffer) else @on 'buffer-created', (buffer) -> callback(buffer) + + # Deprecated delegates + registerOpener: -> atom.workspaceView.model.registerOpener(arguments) + unregisterOpener: -> atom.workspaceView.model.unregisterOpener(arguments) diff --git a/src/workspace.coffee b/src/workspace.coffee index 4409ed95d..13df95c6b 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -26,8 +26,9 @@ class Workspace extends Model constructor: -> super + @openers = [] @subscribe @paneContainer, 'item-destroyed', @onPaneItemDestroyed - atom.project.registerOpener (filePath) => + @registerOpener (filePath) => switch filePath when 'atom://.atom/stylesheet' @open(atom.themes.getUserStylesheetPath()) @@ -50,7 +51,7 @@ class Workspace extends Model # Public: Asynchronously opens a given a filepath in Atom. # - # filePath - A {String} file path. + # uri - A {String} uri. # options - An options {Object} (default: {}). # :initialLine - A {Number} indicating which line number to open to. # :split - A {String} ('left' or 'right') that opens the filePath in a new @@ -58,16 +59,13 @@ class Workspace extends Model # :changeFocus - A {Boolean} that allows the filePath to be opened without # changing focus. # :searchAllPanes - A {Boolean} that will open existing editors from any pane - # if the filePath is already open (default: false) + # if the uri is already open (default: false) # # Returns a promise that resolves to the {Editor} for the file URI. - open: (filePath, options={}) -> - changeFocus = options.changeFocus ? true - filePath = atom.project.resolve(filePath) - initialLine = options.initialLine + open: (uri, options={}) -> searchAllPanes = options.searchAllPanes split = options.split - uri = atom.project.relativize(filePath) + uri = atom.project.relativize(uri) ? '' pane = switch split when 'left' @@ -80,29 +78,18 @@ class Workspace extends Model else @activePane - Q(pane.itemForUri(uri) ? atom.project.open(filePath, options)) - .then (editor) => - if not pane - pane = new Pane(items: [editor]) - @paneContainer.root = pane - - @itemOpened(editor) - pane.activateItem(editor) - pane.activate() if changeFocus - @emit "uri-opened" - editor - .catch (error) -> - console.error(error.stack ? error) + @openUriInPane(uri, pane, options) # Only used in specs openSync: (uri, options={}) -> {initialLine} = options # TODO: Remove deprecated changeFocus option activatePane = options.activatePane ? options.changeFocus ? true - uri = atom.project.relativize(uri) + uri = atom.project.relativize(uri) ? '' if uri? - editor = @activePane.itemForUri(uri) ? atom.project.openSync(uri, {initialLine}) + item = opener(uri, options) for opener in @openers when !item + editor = item ? @activePane.itemForUri(uri) ? atom.project.openSync(uri, {initialLine}) else editor = atom.project.openSync() @@ -111,11 +98,46 @@ class Workspace extends Model @activePane.activate() if activatePane editor + openUriInPane: (uri, pane, options={}) -> + changeFocus = options.changeFocus ? true + item = opener(uri, options) for opener in @openers when !item + promise = Q(item ? pane.itemForUri(uri) ? atom.project.open(uri, options)) + + promise + .then (editor) => + if not pane + pane = new Pane(items: [editor]) + @paneContainer.root = pane + @itemOpened(editor) + pane.activateItem(editor) + pane.activate() if changeFocus + @emit "uri-opened" + editor + .catch (error) -> + console.error(error.stack ? error) + # Public: Reopens the last-closed item uri if it hasn't already been reopened. reopenItemSync: -> if uri = @destroyedItemUris.pop() @openSync(uri) + # Public: Register an opener for a uri. + # + # An {Editor} will be used if no openers return a value. + # + # ## Example + # ```coffeescript + # atom.project.registerOpener (uri) -> + # if path.extname(uri) is '.toml' + # return new TomlEditor(uri) + # ``` + # + # opener - A {Function} to be called when a path is being opened. + registerOpener: (opener) -> @openers.push(opener) + + # Public: Remove a registered opener. + unregisterOpener: (opener) -> _.remove(@openers, opener) + # Public: save the active item. saveActivePaneItem: -> @activePane?.saveActiveItem() From 41761ffbcf2950f74314ee93e9f228cbeb88830d Mon Sep 17 00:00:00 2001 From: probablycorey Date: Wed, 12 Feb 2014 17:19:25 -0800 Subject: [PATCH 02/12] Move eachEditor and getEditors to Workspace --- src/project.coffee | 11 ++--------- src/workspace.coffee | 12 ++++++++++++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/project.coffee b/src/project.coffee index 0f93bb520..8ba75352f 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -128,11 +128,6 @@ class Project extends Model filePath = @resolve(filePath) @buildEditorForBuffer(@bufferForPathSync(filePath), options) - # Public: Retrieves all {Editor}s for all open files. - # - # Returns an {Array} of {Editor}s. - getEditors: -> - new Array(@editors...) # Public: Add the given {Editor}. addEditor: (editor) -> @@ -305,10 +300,6 @@ class Project extends Model @addEditor(editor) editor - eachEditor: (callback) -> - callback(editor) for editor in @getEditors() - @on 'editor-created', (editor) -> callback(editor) - eachBuffer: (args...) -> subscriber = args.shift() if args.length > 1 callback = args.shift() @@ -322,3 +313,5 @@ class Project extends Model # Deprecated delegates registerOpener: -> atom.workspaceView.model.registerOpener(arguments) unregisterOpener: -> atom.workspaceView.model.unregisterOpener(arguments) + eachEditor: -> atom.workspaceView.model.eachEditor(arguments) + getEditors: -> atom.workspaceView.model.getEditors(arguments) diff --git a/src/workspace.coffee b/src/workspace.coffee index 13df95c6b..edfdc4e1c 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -49,6 +49,18 @@ class Workspace extends Model paneContainer: @paneContainer.serialize() fullScreen: atom.isFullScreen() + # Public: Calls callback for every existing {Editor} and for all new {Editors} + # that are created. + # + # callback - A {Function} with an {Editor} as its only argument + eachEditor: (callback) -> + callback(editor) for editor in @getEditors() + @on 'editor-created', (editor) -> callback(editor) + + # Public: Returns an {Array} of all open {Editor}s. + getEditors: -> + new Array(atom.project.editors...) + # Public: Asynchronously opens a given a filepath in Atom. # # uri - A {String} uri. From 410f5730954117a10ccda316bdb79f5526e0b67b Mon Sep 17 00:00:00 2001 From: probablycorey Date: Wed, 12 Feb 2014 17:19:50 -0800 Subject: [PATCH 03/12] Make addEditor and removeEditor private methods on project --- src/project.coffee | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/project.coffee b/src/project.coffee index 8ba75352f..1b0060d20 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -128,13 +128,12 @@ class Project extends Model filePath = @resolve(filePath) @buildEditorForBuffer(@bufferForPathSync(filePath), options) - - # Public: Add the given {Editor}. + # Add the given {Editor}. addEditor: (editor) -> @editors.push editor @emit 'editor-created', editor - # Public: Return and removes the given {Editor}. + # Return and removes the given {Editor}. removeEditor: (editor) -> _.remove(@editors, editor) From 9e9cdaecc0b9411d3101e24966f2a52156285ab5 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Wed, 12 Feb 2014 17:24:27 -0800 Subject: [PATCH 04/12] Delegate methods correctly --- src/project.coffee | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/project.coffee b/src/project.coffee index 1b0060d20..a08f40c7e 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -310,7 +310,7 @@ class Project extends Model @on 'buffer-created', (buffer) -> callback(buffer) # Deprecated delegates - registerOpener: -> atom.workspaceView.model.registerOpener(arguments) - unregisterOpener: -> atom.workspaceView.model.unregisterOpener(arguments) - eachEditor: -> atom.workspaceView.model.eachEditor(arguments) - getEditors: -> atom.workspaceView.model.getEditors(arguments) + registerOpener: -> atom.workspaceView.model.registerOpener(arguments...) + unregisterOpener: -> atom.workspaceView.model.unregisterOpener(arguments...) + eachEditor: -> atom.workspaceView.model.eachEditor(arguments...) + getEditors: -> atom.workspaceView.model.getEditors(arguments...) From 6b4e68f127bf345a81c805e53fbfd6edc5ef496f Mon Sep 17 00:00:00 2001 From: probablycorey Date: Wed, 12 Feb 2014 17:24:47 -0800 Subject: [PATCH 05/12] :lipstick: --- src/project.coffee | 2 +- src/workspace.coffee | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/project.coffee b/src/project.coffee index a08f40c7e..048222f4b 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -309,7 +309,7 @@ class Project extends Model else @on 'buffer-created', (buffer) -> callback(buffer) - # Deprecated delegates + # Deprecated: delegates registerOpener: -> atom.workspaceView.model.registerOpener(arguments...) unregisterOpener: -> atom.workspaceView.model.unregisterOpener(arguments...) eachEditor: -> atom.workspaceView.model.eachEditor(arguments...) diff --git a/src/workspace.coffee b/src/workspace.coffee index edfdc4e1c..14396531e 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -145,10 +145,12 @@ class Workspace extends Model # ``` # # opener - A {Function} to be called when a path is being opened. - registerOpener: (opener) -> @openers.push(opener) + registerOpener: (opener) -> + @openers.push(opener) # Public: Remove a registered opener. - unregisterOpener: (opener) -> _.remove(@openers, opener) + unregisterOpener: (opener) -> + _.remove(@openers, opener) # Public: save the active item. saveActivePaneItem: -> From 6428d1cb60ad29f1fca3c85e98ad892867609c93 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Wed, 12 Feb 2014 17:26:48 -0800 Subject: [PATCH 06/12] Upgrade to markdown-preview@0.29.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 84b0a6de5..88d142eaa 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "image-view": "0.19.0", "keybinding-resolver": "0.10.0", "link": "0.17.0", - "markdown-preview": "0.28.0", + "markdown-preview": "0.29.0", "metrics": "0.26.0", "package-generator": "0.26.0", "release-notes": "0.20.0", From f473bfdb951820a965b305041874e24ecd0608bd Mon Sep 17 00:00:00 2001 From: probablycorey Date: Thu, 13 Feb 2014 10:52:07 -0800 Subject: [PATCH 07/12] Move actual opener logic back to project. Not all specs create a workspace and workspaceView, so there were failures. They probably SHOULD all have workspace and workspaceView but that is beyond the scope of this PR. --- src/project.coffee | 23 ++++++++++++++++++----- src/workspace.coffee | 17 +++++++++-------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/project.coffee b/src/project.coffee index 048222f4b..435ed994b 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -30,6 +30,8 @@ class Project extends Model constructor: ({path, @buffers}={}) -> @buffers ?= [] + @openers = [] + for buffer in @buffers do (buffer) => buffer.once 'destroyed', => @removeBuffer(buffer) @@ -309,8 +311,19 @@ class Project extends Model else @on 'buffer-created', (buffer) -> callback(buffer) - # Deprecated: delegates - registerOpener: -> atom.workspaceView.model.registerOpener(arguments...) - unregisterOpener: -> atom.workspaceView.model.unregisterOpener(arguments...) - eachEditor: -> atom.workspaceView.model.eachEditor(arguments...) - getEditors: -> atom.workspaceView.model.getEditors(arguments...) + # Deprecated: delegate + registerOpener: (opener) -> + @openers.push(opener) + + # Deprecated: delegate + unregisterOpener: (opener) -> + _.remove(@openers, opener) + + # Deprecated: delegate + eachEditor: (callback) -> + callback(editor) for editor in @getEditors() + @on 'editor-created', (editor) -> callback(editor) + + # Deprecated: delegate + getEditors: -> + new Array(@editors...) diff --git a/src/workspace.coffee b/src/workspace.coffee index 14396531e..79b0df1ad 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -26,7 +26,6 @@ class Workspace extends Model constructor: -> super - @openers = [] @subscribe @paneContainer, 'item-destroyed', @onPaneItemDestroyed @registerOpener (filePath) => switch filePath @@ -54,12 +53,11 @@ class Workspace extends Model # # callback - A {Function} with an {Editor} as its only argument eachEditor: (callback) -> - callback(editor) for editor in @getEditors() - @on 'editor-created', (editor) -> callback(editor) + atom.project.eachEditor(callback) # Public: Returns an {Array} of all open {Editor}s. getEditors: -> - new Array(atom.project.editors...) + atom.project.getEditors() # Public: Asynchronously opens a given a filepath in Atom. # @@ -100,7 +98,7 @@ class Workspace extends Model uri = atom.project.relativize(uri) ? '' if uri? - item = opener(uri, options) for opener in @openers when !item + item = opener(atom.project.resolve(uri), options) for opener in @getOpeners() when !item editor = item ? @activePane.itemForUri(uri) ? atom.project.openSync(uri, {initialLine}) else editor = atom.project.openSync() @@ -112,7 +110,7 @@ class Workspace extends Model openUriInPane: (uri, pane, options={}) -> changeFocus = options.changeFocus ? true - item = opener(uri, options) for opener in @openers when !item + item = opener(atom.project.resolve(uri), options) for opener in @getOpeners() when !item promise = Q(item ? pane.itemForUri(uri) ? atom.project.open(uri, options)) promise @@ -146,11 +144,14 @@ class Workspace extends Model # # opener - A {Function} to be called when a path is being opened. registerOpener: (opener) -> - @openers.push(opener) + atom.project.registerOpener(opener) # Public: Remove a registered opener. unregisterOpener: (opener) -> - _.remove(@openers, opener) + atom.project.unregisterOpener(opener) + + getOpeners: -> + atom.project.openers # Public: save the active item. saveActivePaneItem: -> From 93bd0c8412c5c3242c7da51258c054a5f43fba55 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Thu, 13 Feb 2014 11:00:29 -0800 Subject: [PATCH 08/12] :fire: whitespace --- src/project.coffee | 6 +++--- src/workspace.coffee | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/project.coffee b/src/project.coffee index 435ed994b..d93ef4e4c 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -314,13 +314,13 @@ class Project extends Model # Deprecated: delegate registerOpener: (opener) -> @openers.push(opener) - + # Deprecated: delegate unregisterOpener: (opener) -> _.remove(@openers, opener) - + # Deprecated: delegate - eachEditor: (callback) -> + eachEditor: (callback) -> callback(editor) for editor in @getEditors() @on 'editor-created', (editor) -> callback(editor) diff --git a/src/workspace.coffee b/src/workspace.coffee index 79b0df1ad..1188354f4 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -96,7 +96,7 @@ class Workspace extends Model # TODO: Remove deprecated changeFocus option activatePane = options.activatePane ? options.changeFocus ? true uri = atom.project.relativize(uri) ? '' - + if uri? item = opener(atom.project.resolve(uri), options) for opener in @getOpeners() when !item editor = item ? @activePane.itemForUri(uri) ? atom.project.openSync(uri, {initialLine}) From 75745bccc7fc5af37391c96917803bfe417c66b7 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Thu, 13 Feb 2014 11:03:58 -0800 Subject: [PATCH 09/12] :fire: moar whitespace --- src/workspace.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/workspace.coffee b/src/workspace.coffee index 1188354f4..2b7755576 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -57,7 +57,7 @@ class Workspace extends Model # Public: Returns an {Array} of all open {Editor}s. getEditors: -> - atom.project.getEditors() + atom.project.getEditors() # Public: Asynchronously opens a given a filepath in Atom. # @@ -96,7 +96,7 @@ class Workspace extends Model # TODO: Remove deprecated changeFocus option activatePane = options.activatePane ? options.changeFocus ? true uri = atom.project.relativize(uri) ? '' - + if uri? item = opener(atom.project.resolve(uri), options) for opener in @getOpeners() when !item editor = item ? @activePane.itemForUri(uri) ? atom.project.openSync(uri, {initialLine}) @@ -149,7 +149,7 @@ class Workspace extends Model # Public: Remove a registered opener. unregisterOpener: (opener) -> atom.project.unregisterOpener(opener) - + getOpeners: -> atom.project.openers From b3550c652652222f998e7e532c51f9fa390c07e6 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Thu, 13 Feb 2014 13:55:37 -0800 Subject: [PATCH 10/12] Use full url when opening uri --- spec/workspace-spec.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/workspace-spec.coffee b/spec/workspace-spec.coffee index 3f3a04698..312e3ea4e 100644 --- a/spec/workspace-spec.coffee +++ b/spec/workspace-spec.coffee @@ -134,7 +134,7 @@ describe "Workspace", -> workspace.registerOpener(barOpener) waitsForPromise -> - pathToOpen = atom.project.relativize('a.foo') + pathToOpen = atom.project.resolve('a.foo') workspace.open(pathToOpen, hey: "there").then (item) -> expect(item).toEqual { foo: pathToOpen, options: {hey: "there"} } From 9e0436d10e999a2e77ccc08e0756a9351951b09a Mon Sep 17 00:00:00 2001 From: probablycorey Date: Thu, 13 Feb 2014 13:57:59 -0800 Subject: [PATCH 11/12] Always check existing active for uri first --- src/workspace.coffee | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/workspace.coffee b/src/workspace.coffee index 2b7755576..efc99728e 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -97,11 +97,10 @@ class Workspace extends Model activatePane = options.activatePane ? options.changeFocus ? true uri = atom.project.relativize(uri) ? '' - if uri? - item = opener(atom.project.resolve(uri), options) for opener in @getOpeners() when !item - editor = item ? @activePane.itemForUri(uri) ? atom.project.openSync(uri, {initialLine}) - else - editor = atom.project.openSync() + editor = @activePane.itemForUri(uri) + if uri + editor ?= opener(atom.project.resolve(uri), options) for opener in @getOpeners() when !editor + editor ?= atom.project.openSync(uri, {initialLine}) @activePane.activateItem(editor) @itemOpened(editor) @@ -110,10 +109,13 @@ class Workspace extends Model openUriInPane: (uri, pane, options={}) -> changeFocus = options.changeFocus ? true - item = opener(atom.project.resolve(uri), options) for opener in @getOpeners() when !item - promise = Q(item ? pane.itemForUri(uri) ? atom.project.open(uri, options)) - promise + editor = pane.itemForUri(uri) + if uri + editor ?= opener(atom.project.resolve(uri), options) for opener in @getOpeners() when !editor + editor ?= atom.project.open(uri, options) + + Q(editor) .then (editor) => if not pane pane = new Pane(items: [editor]) From c2fe0b7aa1a4de2267b9ba451f9b4761559de7f0 Mon Sep 17 00:00:00 2001 From: probablycorey Date: Thu, 13 Feb 2014 13:58:23 -0800 Subject: [PATCH 12/12] Replace `editor` with `item` --- src/workspace.coffee | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/workspace.coffee b/src/workspace.coffee index efc99728e..8b8138b67 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -97,34 +97,34 @@ class Workspace extends Model activatePane = options.activatePane ? options.changeFocus ? true uri = atom.project.relativize(uri) ? '' - editor = @activePane.itemForUri(uri) + item = @activePane.itemForUri(uri) if uri - editor ?= opener(atom.project.resolve(uri), options) for opener in @getOpeners() when !editor - editor ?= atom.project.openSync(uri, {initialLine}) + item ?= opener(atom.project.resolve(uri), options) for opener in @getOpeners() when !item + item ?= atom.project.openSync(uri, {initialLine}) - @activePane.activateItem(editor) - @itemOpened(editor) + @activePane.activateItem(item) + @itemOpened(item) @activePane.activate() if activatePane - editor + item openUriInPane: (uri, pane, options={}) -> changeFocus = options.changeFocus ? true - editor = pane.itemForUri(uri) + item = pane.itemForUri(uri) if uri - editor ?= opener(atom.project.resolve(uri), options) for opener in @getOpeners() when !editor - editor ?= atom.project.open(uri, options) + item ?= opener(atom.project.resolve(uri), options) for opener in @getOpeners() when !item + item ?= atom.project.open(uri, options) - Q(editor) - .then (editor) => + Q(item) + .then (item) => if not pane - pane = new Pane(items: [editor]) + pane = new Pane(items: [item]) @paneContainer.root = pane - @itemOpened(editor) - pane.activateItem(editor) + @itemOpened(item) + pane.activateItem(item) pane.activate() if changeFocus @emit "uri-opened" - editor + item .catch (error) -> console.error(error.stack ? error)