From 513a29d70e8ec38a0a7130633974cd3b37a0f105 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 22 Jan 2013 12:11:22 -0800 Subject: [PATCH] Add deferred package type This package defers loading until specific commands are triggered on the root view. --- src/app/atom-package.coffee | 3 +- src/app/deferred-atom-package.coffee | 26 +++++++++++++ src/packages/command-logger/index.coffee | 11 ++++-- .../spec/command-logger-spec.coffee | 2 +- .../src/command-logger-view.coffee | 1 - src/packages/command-palette/index.coffee | 12 ++++-- .../spec/command-palette-spec.coffee | 2 +- .../src/command-palette-view.coffee | 1 - src/packages/command-panel/index.coffee | 37 ++++++++++++++++--- .../spec/command-panel-spec.coffee | 8 ++-- .../src/command-panel-view.coffee | 27 ++++---------- src/packages/fuzzy-finder/index.coffee | 23 ++++++++++-- .../spec/fuzzy-finder-spec.coffee | 2 +- .../fuzzy-finder/src/fuzzy-finder-view.coffee | 3 -- src/packages/markdown-preview/index.coffee | 11 ++++-- .../spec/markdown-preview-spec.coffee | 2 +- .../src/markdown-preview-view.coffee | 1 - src/packages/outline-view/index.coffee | 23 ++++++++++-- .../spec/outline-view-spec.coffee | 2 +- .../outline-view/src/outline-view.coffee | 3 -- 20 files changed, 136 insertions(+), 64 deletions(-) create mode 100644 src/app/deferred-atom-package.coffee diff --git a/src/app/atom-package.coffee b/src/app/atom-package.coffee index e8a7c90b3..8fc6b4908 100644 --- a/src/app/atom-package.coffee +++ b/src/app/atom-package.coffee @@ -5,6 +5,7 @@ module.exports = class AtomPackage extends Package metadata: null keymapsDirPath: null + autoloadStylesheets: true constructor: (@name) -> super @@ -14,7 +15,7 @@ class AtomPackage extends Package try @loadMetadata() @loadKeymaps() - @loadStylesheets() + @loadStylesheets() if @autoloadStylesheets rootView.activatePackage(@name, this) unless @isDirectory catch e console.warn "Failed to load package named '#{@name}'", e.stack diff --git a/src/app/deferred-atom-package.coffee b/src/app/deferred-atom-package.coffee new file mode 100644 index 000000000..ee6c7b868 --- /dev/null +++ b/src/app/deferred-atom-package.coffee @@ -0,0 +1,26 @@ +AtomPackage = require 'atom-package' + +module.exports = +class DeferredAtomPackage extends AtomPackage + + constructor: -> + super + + @autoloadStylesheets = false + + activate: (@rootView, @state) -> + @instance = null + for event in @attachEvents + @rootView.command event, (e) => @onAttachEvent(e, @getInstance()) + this + + deactivate: -> @instance?.deactivate?() + + serialize: -> @instance?.serialize?() + + getInstance: -> + unless @instance + @loadStylesheets() + InstanceClass = require @instanceClass + @instance = InstanceClass.activate(@rootView, @state) + @instance diff --git a/src/packages/command-logger/index.coffee b/src/packages/command-logger/index.coffee index 22fbe888f..1a46e2079 100644 --- a/src/packages/command-logger/index.coffee +++ b/src/packages/command-logger/index.coffee @@ -1,6 +1,9 @@ -AtomPackage = require 'atom-package' -CommandLoggerView = require './src/command-logger-view' +DeferredAtomPackage = require 'deferred-atom-package' module.exports = -class CommandLogger extends AtomPackage - activate: (rootView) -> CommandLoggerView.activate(rootView) +class CommandLogger extends DeferredAtomPackage + attachEvents: ['command-logger:toggle'] + + instanceClass: 'command-logger/src/command-logger-view' + + onAttachEvent: (event, instance) -> instance.toggle() diff --git a/src/packages/command-logger/spec/command-logger-spec.coffee b/src/packages/command-logger/spec/command-logger-spec.coffee index 1393ee109..c01f24320 100644 --- a/src/packages/command-logger/spec/command-logger-spec.coffee +++ b/src/packages/command-logger/spec/command-logger-spec.coffee @@ -6,7 +6,7 @@ describe "CommandLogger", -> beforeEach -> rootView = new RootView(require.resolve('fixtures/sample.js')) - atom.loadPackage 'command-logger' + atom.loadPackage('command-logger').getInstance() editor = rootView.getActiveEditor() commandLogger = CommandLogger.instance diff --git a/src/packages/command-logger/src/command-logger-view.coffee b/src/packages/command-logger/src/command-logger-view.coffee index 0690d7877..01496a2d0 100644 --- a/src/packages/command-logger/src/command-logger-view.coffee +++ b/src/packages/command-logger/src/command-logger-view.coffee @@ -34,7 +34,6 @@ class CommandLoggerView extends ScrollView initialize: (@rootView, @eventLog={}) -> super - @rootView.command 'command-logger:toggle', => @toggle() @rootView.command 'command-logger:clear-data', => @eventLog = {} @command 'core:cancel', => @detach() diff --git a/src/packages/command-palette/index.coffee b/src/packages/command-palette/index.coffee index 4b656e5d1..22b38b4cc 100644 --- a/src/packages/command-palette/index.coffee +++ b/src/packages/command-palette/index.coffee @@ -1,6 +1,10 @@ -AtomPackage = require 'atom-package' -CommandPaletteView = require './src/command-palette-view' +DeferredAtomPackage = require 'deferred-atom-package' module.exports = -class CommandPalette extends AtomPackage - activate: (rootView) -> CommandPaletteView.activate(rootView) +class CommandPalette extends DeferredAtomPackage + + attachEvents: ['command-palette:toggle'] + + instanceClass: 'command-palette/src/command-palette-view' + + onAttachEvent: (event, instance) -> instance.attach() diff --git a/src/packages/command-palette/spec/command-palette-spec.coffee b/src/packages/command-palette/spec/command-palette-spec.coffee index bfb1e9693..2f62d1b7b 100644 --- a/src/packages/command-palette/spec/command-palette-spec.coffee +++ b/src/packages/command-palette/spec/command-palette-spec.coffee @@ -8,7 +8,7 @@ describe "CommandPalette", -> beforeEach -> rootView = new RootView(require.resolve('fixtures/sample.js')) - atom.loadPackage("command-palette") + atom.loadPackage("command-palette").getInstance() palette = CommandPalette.instance rootView.attachToDom().focus() rootView.trigger 'command-palette:toggle' diff --git a/src/packages/command-palette/src/command-palette-view.coffee b/src/packages/command-palette/src/command-palette-view.coffee index 9f7f4dbbc..34452f7bd 100644 --- a/src/packages/command-palette/src/command-palette-view.coffee +++ b/src/packages/command-palette/src/command-palette-view.coffee @@ -7,7 +7,6 @@ module.exports = class CommandPaletteView extends SelectList @activate: (rootView) -> @instance = new CommandPaletteView(rootView) - rootView.command 'command-palette:toggle', => @instance.attach() @viewClass: -> "#{super} command-palette" diff --git a/src/packages/command-panel/index.coffee b/src/packages/command-panel/index.coffee index bbde12cf0..62b00ff45 100644 --- a/src/packages/command-panel/index.coffee +++ b/src/packages/command-panel/index.coffee @@ -1,8 +1,33 @@ -AtomPackage = require 'atom-package' -CommandPanelView = require './src/command-panel-view' +DeferredAtomPackage = require 'deferred-atom-package' module.exports = -class CommandPanel extends AtomPackage - activate: (rootView, state) -> CommandPanelView.activate(rootView, state) - deactivate: -> CommandPanelView.deactivate() - serialize: -> CommandPanelView.serialize() +class CommandPanel extends DeferredAtomPackage + + attachEvents: [ + 'command-panel:toggle' + 'command-panel:toggle-preview' + 'command-panel:find-in-file' + 'command-panel:find-in-project' + 'command-panel:repeat-relative-address' + 'command-panel:repeat-relative-address-in-reverse' + 'command-panel:set-selection-as-regex-address' + ] + + instanceClass: 'command-panel/src/command-panel-view' + + onAttachEvent: (event, instance) -> + switch event.type + when 'command-panel:toggle' + instance.toggle() + when 'command-panel:toggle-preview' + instance.togglePreview() + when 'command-panel:find-in-file' + instance.attach("/") + when 'command-panel:find-in-project' + instance.attach("Xx/") + when 'command-panel:repeat-relative-address' + instance.repeatRelativeAddress() + when 'command-panel:repeat-relative-address-in-reverse' + instance.repeatRelativeAddressInReverse() + when 'command-panel:set-selection-as-regex-address' + instance.setSelectionAsLastRelativeAddress() diff --git a/src/packages/command-panel/spec/command-panel-spec.coffee b/src/packages/command-panel/spec/command-panel-spec.coffee index 667624693..a96e28e61 100644 --- a/src/packages/command-panel/spec/command-panel-spec.coffee +++ b/src/packages/command-panel/spec/command-panel-spec.coffee @@ -13,7 +13,7 @@ describe "CommandPanel", -> editor = rootView.getActiveEditor() buffer = editor.activeEditSession.buffer CommandPanel = atom.loadPackage('command-panel') - commandPanel = CommandPanelView.instance + commandPanel = CommandPanel.getInstance() commandPanel.history = [] commandPanel.historyIndex = 0 @@ -36,7 +36,7 @@ describe "CommandPanel", -> rootView.deactivate() rootView2.attachToDom() - commandPanel = rootView2.activatePackage('command-panel', CommandPanel) + commandPanel = rootView2.activatePackage('command-panel', CommandPanel).getInstance() expect(rootView2.find('.command-panel')).toExist() expect(commandPanel.miniEditor.getText()).toBe 'abc' expect(commandPanel.miniEditor.isFocused).toBeTruthy() @@ -49,7 +49,7 @@ describe "CommandPanel", -> rootView3 = RootView.deserialize(rootView2.serialize()) rootView2.deactivate() rootView3.attachToDom() - commandPanel = rootView3.activatePackage('command-panel', CommandPanel) + commandPanel = rootView3.activatePackage('command-panel', CommandPanel).getInstance() expect(commandPanel.miniEditor.isFocused).toBeFalsy() rootView3.deactivate() @@ -71,7 +71,7 @@ describe "CommandPanel", -> rootView.deactivate() rootView2.attachToDom() - commandPanel = rootView2.activatePackage('command-panel', CommandPanel) + commandPanel = rootView2.activatePackage('command-panel', CommandPanel).getInstance() expect(commandPanel.history.length).toBe(2) expect(commandPanel.history[0]).toBe('/test2') expect(commandPanel.history[1]).toBe('/test3') diff --git a/src/packages/command-panel/src/command-panel-view.coffee b/src/packages/command-panel/src/command-panel-view.coffee index cbd35d151..5e212440c 100644 --- a/src/packages/command-panel/src/command-panel-view.coffee +++ b/src/packages/command-panel/src/command-panel-view.coffee @@ -16,15 +16,6 @@ class CommandPanelView extends View else @instance = new CommandPanelView(rootView) - @deactivate: -> - @instance.destroy() - - @serialize: -> - text: @instance.miniEditor.getText() - visible: @instance.hasParent() - miniEditorFocused: @instance.miniEditor.isFocused - history: @instance.history[-@instance.maxSerializedHistorySize..] - @deserialize: (state, rootView) -> commandPanel = new CommandPanelView(rootView, state.history) commandPanel.attach(state.text, focus: false) if state.visible @@ -53,15 +44,6 @@ class CommandPanelView extends View @command 'tool-panel:unfocus', => @rootView.focus() @command 'core:close', => @detach(); false @command 'core:confirm', => @execute() - - @rootView.command 'command-panel:toggle', => @toggle() - @rootView.command 'command-panel:toggle-preview', => @togglePreview() - @rootView.command 'command-panel:find-in-file', => @attach("/") - @rootView.command 'command-panel:find-in-project', => @attach("Xx/") - @rootView.command 'command-panel:repeat-relative-address', => @repeatRelativeAddress() - @rootView.command 'command-panel:repeat-relative-address-in-reverse', => @repeatRelativeAddressInReverse() - @rootView.command 'command-panel:set-selection-as-regex-address', => @setSelectionAsLastRelativeAddress() - @command 'core:move-up', => @navigateBackwardInHistory() @command 'core:move-down', => @navigateForwardInHistory() @@ -69,6 +51,14 @@ class CommandPanelView extends View @errorMessages.hide() @prompt.iconSize(@miniEditor.fontSize) + serialize: -> + text: @miniEditor.getText() + visible: @hasParent() + miniEditorFocused: @miniEditor.isFocused + history: @history[-@maxSerializedHistorySize..] + + deactivate: -> @destroy() + destroy: -> @previewList.destroy() @@ -93,7 +83,6 @@ class CommandPanelView extends View @miniEditor.focus() attach: (text='', options={}) -> - console.trace 'attached', @rootView @errorMessages.hide() focus = options.focus ? true diff --git a/src/packages/fuzzy-finder/index.coffee b/src/packages/fuzzy-finder/index.coffee index b5a0cc604..dd605a014 100644 --- a/src/packages/fuzzy-finder/index.coffee +++ b/src/packages/fuzzy-finder/index.coffee @@ -1,6 +1,21 @@ -AtomPackage = require 'atom-package' -FuzzyFinderView = require './src/fuzzy-finder-view' +DeferredAtomPackage = require 'deferred-atom-package' module.exports = -class FuzzyFinder extends AtomPackage - activate: (rootView) -> FuzzyFinderView.activate(rootView) +class FuzzyFinder extends DeferredAtomPackage + + attachEvents: [ + 'fuzzy-finder:toggle-file-finder' + 'fuzzy-finder:toggle-buffer-finder' + 'fuzzy-finder:find-under-cursor' + ] + + instanceClass: 'fuzzy-finder/src/fuzzy-finder-view' + + onAttachEvent: (event, instance) -> + switch event.type + when 'fuzzy-finder:toggle-file-finder' + instance.toggleFileFinder() + when 'fuzzy-finder:toggle-buffer-finder' + instance.toggleBufferFinder() + when 'fuzzy-finder:find-under-cursor' + instance.findUnderCursor() diff --git a/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee b/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee index 392e93d47..5c3340f5e 100644 --- a/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee +++ b/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee @@ -10,7 +10,7 @@ describe 'FuzzyFinder', -> beforeEach -> rootView = new RootView(require.resolve('fixtures/sample.js')) rootView.enableKeymap() - atom.loadPackage("fuzzy-finder") + atom.loadPackage("fuzzy-finder").getInstance() finder = FuzzyFinder.instance afterEach -> diff --git a/src/packages/fuzzy-finder/src/fuzzy-finder-view.coffee b/src/packages/fuzzy-finder/src/fuzzy-finder-view.coffee index 9437de567..2cda4feab 100644 --- a/src/packages/fuzzy-finder/src/fuzzy-finder-view.coffee +++ b/src/packages/fuzzy-finder/src/fuzzy-finder-view.coffee @@ -10,9 +10,6 @@ class FuzzyFinderView extends SelectList @activate: (rootView) -> @instance = new FuzzyFinderView(rootView) - rootView.command 'fuzzy-finder:toggle-file-finder', => @instance.toggleFileFinder() - rootView.command 'fuzzy-finder:toggle-buffer-finder', => @instance.toggleBufferFinder() - rootView.command 'fuzzy-finder:find-under-cursor', => @instance.findUnderCursor() @viewClass: -> [super, 'fuzzy-finder'].join(' ') diff --git a/src/packages/markdown-preview/index.coffee b/src/packages/markdown-preview/index.coffee index c361ee308..b319ae1ea 100644 --- a/src/packages/markdown-preview/index.coffee +++ b/src/packages/markdown-preview/index.coffee @@ -1,6 +1,9 @@ -AtomPackage = require 'atom-package' -MarkdownPreviewView = require './src/markdown-preview-view' +DeferredAtomPackage = require 'deferred-atom-package' module.exports = -class MarkdownPreview extends AtomPackage - activate: (rootView) -> MarkdownPreviewView.activate(rootView) +class MarkdownPreview extends DeferredAtomPackage + attachEvents: ['markdown-preview:toggle'] + + instanceClass: 'markdown-preview/src/markdown-preview-view' + + onAttachEvent: (event, instance) -> instance.toggle() diff --git a/src/packages/markdown-preview/spec/markdown-preview-spec.coffee b/src/packages/markdown-preview/spec/markdown-preview-spec.coffee index 6a0ec0b53..575990c57 100644 --- a/src/packages/markdown-preview/spec/markdown-preview-spec.coffee +++ b/src/packages/markdown-preview/spec/markdown-preview-spec.coffee @@ -7,7 +7,7 @@ describe "MarkdownPreview", -> beforeEach -> rootView = new RootView(require.resolve('fixtures/markdown')) - atom.loadPackage("markdown-preview") + atom.loadPackage("markdown-preview").getInstance() markdownPreview = MarkdownPreview.instance afterEach -> diff --git a/src/packages/markdown-preview/src/markdown-preview-view.coffee b/src/packages/markdown-preview/src/markdown-preview-view.coffee index 4fc84522d..d7fb9fc6c 100644 --- a/src/packages/markdown-preview/src/markdown-preview-view.coffee +++ b/src/packages/markdown-preview/src/markdown-preview-view.coffee @@ -14,7 +14,6 @@ class MarkdownPreviewView extends ScrollView initialize: (@rootView) -> super - @rootView.command 'markdown-preview:toggle', => @toggle() @command 'core:cancel', => @detach() toggle: -> diff --git a/src/packages/outline-view/index.coffee b/src/packages/outline-view/index.coffee index ec026acbb..d55fa7799 100644 --- a/src/packages/outline-view/index.coffee +++ b/src/packages/outline-view/index.coffee @@ -1,6 +1,21 @@ -AtomPackage = require 'atom-package' -OutlineView = require './src/outline-view' +DeferredAtomPackage = require 'deferred-atom-package' module.exports = -class Outline extends AtomPackage - activate: (rootView) -> OutlineView.activate(rootView) +class Outline extends DeferredAtomPackage + + attachEvents: [ + 'outline-view:toggle-file-outline' + 'outline-view:toggle-project-outline' + 'outline-view:jump-to-declaration' + ] + + instanceClass: 'outline-view/src/outline-view' + + onAttachEvent: (event, instance) -> + switch event.type + when 'outline-view:toggle-file-outline' + instance.toggleFileOutline() + when 'outline-view:toggle-project-outline' + instance.toggleProjectOutline() + when 'outline-view:jump-to-declaration' + instance.jumpToDeclaration() diff --git a/src/packages/outline-view/spec/outline-view-spec.coffee b/src/packages/outline-view/spec/outline-view-spec.coffee index 125b46e9c..83bd764e2 100644 --- a/src/packages/outline-view/spec/outline-view-spec.coffee +++ b/src/packages/outline-view/spec/outline-view-spec.coffee @@ -8,7 +8,7 @@ describe "OutlineView", -> beforeEach -> rootView = new RootView(require.resolve('fixtures')) - atom.loadPackage("outline-view") + atom.loadPackage("outline-view").getInstance() outlineView = OutlineView.instance rootView.attachToDom() setArraySpy = spyOn(outlineView, 'setArray').andCallThrough() diff --git a/src/packages/outline-view/src/outline-view.coffee b/src/packages/outline-view/src/outline-view.coffee index ace29b7c6..1f3e30283 100644 --- a/src/packages/outline-view/src/outline-view.coffee +++ b/src/packages/outline-view/src/outline-view.coffee @@ -11,9 +11,6 @@ class OutlineView extends SelectList @activate: (rootView) -> @instance = new OutlineView(rootView) - rootView.command 'outline-view:toggle-file-outline', => @instance.toggleFileOutline() - rootView.command 'outline-view:toggle-project-outline', => @instance.toggleProjectOutline() - rootView.command 'outline-view:jump-to-declaration', => @instance.jumpToDeclaration() @viewClass: -> "#{super} outline-view"