From eb2ace37b4ed05fd8d24a35fdfac18423340dcd7 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 2 Oct 2015 21:13:42 -0600 Subject: [PATCH] Move TextEditor construction to Workspace Signed-off-by: Max Brunsfeld --- spec/project-spec.coffee | 22 +++++++-------- spec/text-editor-component-spec.coffee | 4 +-- spec/text-editor-spec.coffee | 27 ++++++++++-------- spec/tokenized-buffer-spec.coffee | 8 +++--- spec/tokenized-line-spec.coffee | 2 +- spec/workspace-spec.coffee | 10 +++---- src/atom.coffee | 12 ++++---- src/project.coffee | 39 -------------------------- src/workspace.coffee | 31 +++++++++++++++++++- 9 files changed, 74 insertions(+), 81 deletions(-) diff --git a/spec/project-spec.coffee b/spec/project-spec.coffee index ce93a791e..7e7925904 100644 --- a/spec/project-spec.coffee +++ b/spec/project-spec.coffee @@ -73,7 +73,7 @@ describe "Project", -> it "listens for destroyed events on deserialized buffers and removes them when they are destroyed", -> waitsForPromise -> - atom.project.open('a') + atom.workspace.open('a') runs -> expect(atom.project.getBuffers().length).toBe 1 @@ -89,7 +89,7 @@ describe "Project", -> pathToOpen = path.join(temp.mkdirSync(), 'file.txt') waitsForPromise -> - atom.project.open(pathToOpen) + atom.workspace.open(pathToOpen) runs -> expect(atom.project.getBuffers().length).toBe 1 @@ -103,7 +103,7 @@ describe "Project", -> fs.writeFileSync(pathToOpen, '') waitsForPromise -> - atom.project.open(pathToOpen) + atom.workspace.open(pathToOpen) runs -> expect(atom.project.getBuffers().length).toBe 1 @@ -120,7 +120,7 @@ describe "Project", -> editor = null waitsForPromise -> - atom.project.open().then (o) -> editor = o + atom.workspace.open().then (o) -> editor = o runs -> editor.saveAs(tempFile) @@ -130,7 +130,7 @@ describe "Project", -> editor = null beforeEach -> waitsForPromise -> - atom.project.open(require.resolve('./fixtures/dir/a')).then (o) -> editor = o + atom.workspace.open(require.resolve('./fixtures/dir/a')).then (o) -> editor = o it "creates a warning notification", -> atom.notifications.onDidAddNotification noteSpy = jasmine.createSpy() @@ -161,7 +161,7 @@ describe "Project", -> it "returns a new edit session for the given path and emits 'buffer-created'", -> editor = null waitsForPromise -> - atom.project.open(absolutePath).then (o) -> editor = o + atom.workspace.open(absolutePath).then (o) -> editor = o runs -> expect(editor.buffer.getPath()).toBe absolutePath @@ -171,7 +171,7 @@ describe "Project", -> it "returns a new edit session for the given path (relative to the project root) and emits 'buffer-created'", -> editor = null waitsForPromise -> - atom.project.open(absolutePath).then (o) -> editor = o + atom.workspace.open(absolutePath).then (o) -> editor = o runs -> expect(editor.buffer.getPath()).toBe absolutePath @@ -182,17 +182,17 @@ describe "Project", -> editor = null waitsForPromise -> - atom.project.open(absolutePath).then (o) -> editor = o + atom.workspace.open(absolutePath).then (o) -> editor = o runs -> newBufferHandler.reset() waitsForPromise -> - atom.project.open(absolutePath).then ({buffer}) -> + atom.workspace.open(absolutePath).then ({buffer}) -> expect(buffer).toBe editor.buffer waitsForPromise -> - atom.project.open('a').then ({buffer}) -> + atom.workspace.open('a').then ({buffer}) -> expect(buffer).toBe editor.buffer expect(newBufferHandler).not.toHaveBeenCalled() @@ -200,7 +200,7 @@ describe "Project", -> it "returns a new edit session and emits 'buffer-created'", -> editor = null waitsForPromise -> - atom.project.open().then (o) -> editor = o + atom.workspace.open().then (o) -> editor = o runs -> expect(editor.buffer.getPath()).toBeUndefined() diff --git a/spec/text-editor-component-spec.coffee b/spec/text-editor-component-spec.coffee index 27e9864aa..836516759 100644 --- a/spec/text-editor-component-spec.coffee +++ b/spec/text-editor-component-spec.coffee @@ -27,7 +27,7 @@ describe "TextEditorComponent", -> fn() waitsForPromise -> - atom.project.open('sample.js').then (o) -> editor = o + atom.workspace.open('sample.js').then (o) -> editor = o runs -> contentNode = document.querySelector('#jasmine-content') @@ -3194,7 +3194,7 @@ describe "TextEditorComponent", -> waitsForPromise -> atom.packages.activatePackage('language-coffee-script') waitsForPromise -> - atom.project.open('coffee.coffee', autoIndent: false).then (o) -> coffeeEditor = o + atom.workspace.open('coffee.coffee', autoIndent: false).then (o) -> coffeeEditor = o afterEach: -> atom.packages.deactivatePackages() diff --git a/spec/text-editor-spec.coffee b/spec/text-editor-spec.coffee index e95818900..6d29073e1 100644 --- a/spec/text-editor-spec.coffee +++ b/spec/text-editor-spec.coffee @@ -12,7 +12,7 @@ describe "TextEditor", -> beforeEach -> waitsForPromise -> - atom.project.open('sample.js', autoIndent: false).then (o) -> editor = o + atom.workspace.open('sample.js', autoIndent: false).then (o) -> editor = o runs -> buffer = editor.buffer @@ -27,7 +27,7 @@ describe "TextEditor", -> editor1 = null waitsForPromise -> - atom.project.open(pathToOpen).then (o) -> editor1 = o + atom.workspace.open(pathToOpen).then (o) -> editor1 = o runs -> fs.mkdirSync(pathToOpen) @@ -71,7 +71,7 @@ describe "TextEditor", -> editor = null waitsForPromise -> - atom.workspace.open('sample.js', largeFileMode: true).then (o) -> editor = o + atom.workspace.openTextFile('sample.js', largeFileMode: true).then (o) -> editor = o runs -> buffer = editor.getBuffer() @@ -1331,7 +1331,7 @@ describe "TextEditor", -> waitsForPromise -> atom.packages.activatePackage('language-coffee-script') waitsForPromise -> - atom.project.open('coffee.coffee', autoIndent: false).then (o) -> coffeeEditor = o + atom.workspace.open('coffee.coffee', autoIndent: false).then (o) -> coffeeEditor = o it 'selects the correct surrounding word for the given scoped setting', -> coffeeEditor.setCursorBufferPosition [0, 9] # in the middle of quicksort @@ -1533,7 +1533,7 @@ describe "TextEditor", -> it "takes atomic tokens into account", -> waitsForPromise -> - atom.project.open('sample-with-tabs-and-leading-comment.coffee', autoIndent: false).then (o) -> editor = o + atom.workspace.open('sample-with-tabs-and-leading-comment.coffee', autoIndent: false).then (o) -> editor = o runs -> editor.setSelectedBufferRange([[2, 1], [2, 3]]) @@ -1644,7 +1644,7 @@ describe "TextEditor", -> it "takes atomic tokens into account", -> waitsForPromise -> - atom.project.open('sample-with-tabs-and-leading-comment.coffee', autoIndent: false).then (o) -> editor = o + atom.workspace.open('sample-with-tabs-and-leading-comment.coffee', autoIndent: false).then (o) -> editor = o runs -> editor.setSelectedBufferRange([[3, 1], [3, 2]]) @@ -1769,9 +1769,11 @@ describe "TextEditor", -> it "does not share selections between different edit sessions for the same buffer", -> editor2 = null waitsForPromise -> - atom.project.open('sample.js').then (o) -> editor2 = o + atom.workspace.getActivePane().splitRight() + atom.workspace.open(editor.getPath()).then (o) => editor2 = o runs -> + expect(editor2.getText()).toBe(editor.getText()) editor.setSelectedBufferRanges([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) editor2.setSelectedBufferRanges([[[8, 7], [6, 5]], [[4, 3], [2, 1]]]) expect(editor2.getSelectedBufferRanges()).not.toEqual editor.getSelectedBufferRanges() @@ -3673,7 +3675,7 @@ describe "TextEditor", -> editor.destroy() waitsForPromise -> - atom.project.open('sample-with-tabs-and-leading-comment.coffee').then (o) -> editor = o + atom.workspace.open('sample-with-tabs-and-leading-comment.coffee').then (o) -> editor = o runs -> expect(editor.softTabs).toBe true @@ -3746,7 +3748,7 @@ describe "TextEditor", -> editor.destroy() waitsForPromise -> - atom.project.open('sample-with-tabs-and-leading-comment.coffee').then (o) -> editor = o + atom.workspace.open('sample-with-tabs-and-leading-comment.coffee').then (o) -> editor = o runs -> expect(editor.softTabs).toBe true @@ -3801,7 +3803,7 @@ describe "TextEditor", -> waitsForPromise -> atom.packages.activatePackage('language-coffee-script') waitsForPromise -> - atom.project.open('coffee.coffee', autoIndent: false).then (o) -> coffeeEditor = o + atom.workspace.open('coffee.coffee', autoIndent: false).then (o) -> coffeeEditor = o afterEach: -> atom.packages.deactivatePackages() @@ -4004,7 +4006,7 @@ describe "TextEditor", -> waitsForPromise -> atom.packages.activatePackage('language-coffee-script') waitsForPromise -> - atom.project.open('coffee.coffee', autoIndent: false).then (o) -> coffeeEditor = o + atom.workspace.open('coffee.coffee', autoIndent: false).then (o) -> coffeeEditor = o runs -> atom.config.set('editor.autoIndent', true, scopeSelector: '.source.js') @@ -4154,7 +4156,8 @@ describe "TextEditor", -> editor2 = null waitsForPromise -> - atom.project.open('sample.js', autoIndent: false).then (o) -> editor2 = o + atom.workspace.getActivePane().splitRight() + atom.workspace.open('sample.js', autoIndent: false).then (o) -> editor2 = o runs -> expect(editor.shouldPromptToSave()).toBeFalsy() diff --git a/spec/tokenized-buffer-spec.coffee b/spec/tokenized-buffer-spec.coffee index 4945b37ec..601064887 100644 --- a/spec/tokenized-buffer-spec.coffee +++ b/spec/tokenized-buffer-spec.coffee @@ -487,7 +487,7 @@ describe "TokenizedBuffer", -> tokenizedHandler = jasmine.createSpy("tokenized handler") waitsForPromise -> - atom.project.open('sample.js').then (o) -> editor = o + atom.workspace.open('sample.js').then (o) -> editor = o runs -> tokenizedBuffer = editor.displayBuffer.tokenizedBuffer @@ -500,7 +500,7 @@ describe "TokenizedBuffer", -> tokenizedHandler = jasmine.createSpy("tokenized handler") waitsForPromise -> - atom.project.open('sample.js').then (o) -> editor = o + atom.workspace.open('sample.js').then (o) -> editor = o runs -> tokenizedBuffer = editor.displayBuffer.tokenizedBuffer @@ -518,7 +518,7 @@ describe "TokenizedBuffer", -> tokenizedHandler = jasmine.createSpy("tokenized handler") waitsForPromise -> - atom.project.open('coffee.coffee').then (o) -> editor = o + atom.workspace.open('coffee.coffee').then (o) -> editor = o runs -> tokenizedBuffer = editor.displayBuffer.tokenizedBuffer @@ -905,7 +905,7 @@ describe "TokenizedBuffer", -> registration = atom.packages.onDidTriggerActivationHook('language-javascript:grammar-used', -> called = true) waitsForPromise -> - atom.project.open('sample.js', autoIndent: false).then (o) -> + atom.workspace.open('sample.js', autoIndent: false).then (o) -> editor = o waitsForPromise -> diff --git a/spec/tokenized-line-spec.coffee b/spec/tokenized-line-spec.coffee index 2914ec089..f1dce7b9e 100644 --- a/spec/tokenized-line-spec.coffee +++ b/spec/tokenized-line-spec.coffee @@ -7,7 +7,7 @@ describe "TokenizedLine", -> describe "::isOnlyWhitespace()", -> beforeEach -> waitsForPromise -> - atom.project.open('coffee.coffee').then (o) -> editor = o + atom.workspace.open('coffee.coffee').then (o) -> editor = o it "returns true when the line is only whitespace", -> expect(editor.tokenizedLineForScreenRow(3).isOnlyWhitespace()).toBe true diff --git a/spec/workspace-spec.coffee b/spec/workspace-spec.coffee index 6b93e1eea..8341e011a 100644 --- a/spec/workspace-spec.coffee +++ b/spec/workspace-spec.coffee @@ -981,7 +981,7 @@ describe "Workspace", -> results = [] waitsForPromise -> - atom.project.open('a').then (o) -> + atom.workspace.open('a').then (o) -> editor = o editor.setText("Elephant") @@ -999,7 +999,7 @@ describe "Workspace", -> results = [] waitsForPromise -> - atom.project.open(temp.openSync().path).then (o) -> + atom.workspace.open(temp.openSync().path).then (o) -> editor = o editor.setText("Elephant") @@ -1221,7 +1221,7 @@ describe "Workspace", -> results = [] waitsForPromise -> - atom.project.open('sample.js').then (o) -> editor = o + atom.workspace.open('sample.js').then (o) -> editor = o runs -> expect(editor.isModified()).toBeFalsy() @@ -1242,7 +1242,7 @@ describe "Workspace", -> results = [] waitsForPromise -> - atom.project.open('sample-with-comments.js').then (o) -> editor = o + atom.workspace.open('sample-with-comments.js').then (o) -> editor = o waitsForPromise -> atom.workspace.replace /items/gi, 'items', [commentFilePath], (result) -> @@ -1257,7 +1257,7 @@ describe "Workspace", -> results = [] waitsForPromise -> - atom.project.open('sample.js').then (o) -> editor = o + atom.workspace.open('sample.js').then (o) -> editor = o runs -> editor.buffer.setTextInRange([[0, 0], [0, 0]], 'omg') diff --git a/src/atom.coffee b/src/atom.coffee index 242cb4960..712477fa2 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -211,16 +211,16 @@ class Atom extends Model @views.addViewProvider(Gutter, createGutterView) registerDefaultOpeners: -> - @workspace.addOpener (filePath) -> - switch filePath + @workspace.addOpener (uri) -> + switch uri when 'atom://.atom/stylesheet' - @project.open(@styles.getUserStyleSheetPath()) + @workspace.open(@styles.getUserStyleSheetPath()) when 'atom://.atom/keymap' - @project.open(@keymaps.getUserKeymapPath()) + @workspace.open(@keymaps.getUserKeymapPath()) when 'atom://.atom/config' - @project.open(@config.getUserConfigPath()) + @workspace.open(@config.getUserConfigPath()) when 'atom://.atom/init-script' - @project.open(@getUserInitScriptPath()) + @workspace.open(@getUserInitScriptPath()) reset: -> @config.reset() diff --git a/src/project.coffee b/src/project.coffee index 2a60ff7d5..6532b4aa5 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -287,40 +287,6 @@ class Project extends Model Section: Private ### - # Given a path to a file, this constructs and associates a new - # {TextEditor}, showing the file. - # - # * `filePath` The {String} path of the file to associate with. - # * `options` Options that you can pass to the {TextEditor} constructor. - # - # Returns a promise that resolves to an {TextEditor}. - open: (filePath, options={}) -> - filePath = @resolvePath(filePath) - - if filePath? - try - fs.closeSync(fs.openSync(filePath, 'r')) - catch error - # allow ENOENT errors to create an editor for paths that dont exist - throw error unless error.code is 'ENOENT' - - absoluteFilePath = @resolvePath(filePath) - - fileSize = fs.getSizeSync(absoluteFilePath) - - if fileSize >= 20 * 1048576 # 20MB - choice = atom.confirm - message: 'Atom will be unresponsive during the loading of very large files.' - detailedMessage: "Do you still want to load this file?" - buttons: ["Proceed", "Cancel"] - if choice is 1 - error = new Error - error.code = 'CANCELLED' - throw error - - @bufferForPath(absoluteFilePath).then (buffer) => - @buildEditorForBuffer(buffer, _.extend({fileSize}, options)) - # Retrieves all the {TextBuffer}s in the project; that is, the # buffers for all open files. # @@ -400,11 +366,6 @@ class Project extends Model [buffer] = @buffers.splice(index, 1) buffer?.destroy() - buildEditorForBuffer: (buffer, editorOptions) -> - largeFileMode = editorOptions.fileSize >= 2 * 1048576 # 2MB - editor = new TextEditor(_.extend({buffer, largeFileMode, registerEditor: true}, editorOptions)) - editor - eachBuffer: (args...) -> subscriber = args.shift() if args.length > 1 callback = args.shift() diff --git a/src/workspace.coffee b/src/workspace.coffee index b7c46f0d4..51910f90f 100644 --- a/src/workspace.coffee +++ b/src/workspace.coffee @@ -396,7 +396,7 @@ class Workspace extends Model item ?= opener(uri, options) for opener in @getOpeners() when not item try - item ?= @project.open(uri, options) + item ?= @openTextFile(uri, options) catch error switch error.code when 'CANCELLED' @@ -431,6 +431,35 @@ class Workspace extends Model @emitter.emit 'did-open', {uri, pane, item, index} item + openTextFile: (uri, options) -> + filePath = @project.resolvePath(uri) + + if filePath? + try + fs.closeSync(fs.openSync(filePath, 'r')) + catch error + # allow ENOENT errors to create an editor for paths that dont exist + throw error unless error.code is 'ENOENT' + + fileSize = fs.getSizeSync(filePath) + + largeFileMode = fileSize >= 2 * 1048576 # 2MB + if fileSize >= 20 * 1048576 # 20MB + choice = atom.confirm + message: 'Atom will be unresponsive during the loading of very large files.' + detailedMessage: "Do you still want to load this file?" + buttons: ["Proceed", "Cancel"] + if choice is 1 + error = new Error + error.code = 'CANCELLED' + throw error + + @project.bufferForPath(filePath, options).then (buffer) => + @buildTextEditor(_.extend({buffer, largeFileMode}, options)) + + buildTextEditor: (params) -> + new TextEditor(params) + # Public: Asynchronously reopens the last-closed item's URI if it hasn't already been # reopened. #