Extract a ViewRegistry that can be shared amongst Workspace objects

This commit is contained in:
Nathan Sobo
2014-09-17 09:53:46 -06:00
parent 53bd1c8958
commit 2b86297a0b
2 changed files with 34 additions and 21 deletions

27
src/view-registry.coffee Normal file
View File

@@ -0,0 +1,27 @@
{jQuery} = require './space-pen-extensions'
module.exports =
class ViewRegistry
constructor: ->
@views = new WeakMap
getView: (object) ->
if view = @views.get(object)
view
else
view = @createView(object)
@views.set(object, view)
view
createView: (object) ->
if object instanceof HTMLElement
object
else if object instanceof jQuery
object[0].__spacePenView ?= object
object[0]
else if viewClass = object?.getViewClass?()
view = new viewClass(object)
view[0].__spacePenView ?= view
view[0]
else
throw new Error("Can't create a view for #{object.constructor.name} instance. Please register a view provider.")

View File

@@ -9,7 +9,7 @@ Delegator = require 'delegato'
Editor = require './editor'
PaneContainer = require './pane-container'
Pane = require './pane'
{jQuery} = require './space-pen-extensions'
ViewRegistry = require './view-registry'
WorkspaceView = null
# Essential: Represents the state of the user interface for the entire window.
@@ -29,7 +29,7 @@ class Workspace extends Model
@delegatesProperty 'activePane', 'activePaneItem', toProperty: 'paneContainer'
@properties
paneContainer: -> new PaneContainer
paneContainer: null
fullScreen: false
destroyedItemUris: -> []
@@ -37,9 +37,10 @@ class Workspace extends Model
super
@emitter = new Emitter
@viewsByModel = new WeakMap
@openers = []
@viewRegistry ?= new ViewRegistry
@paneContainer ?= new PaneContainer({@viewRegistry})
@paneContainer.onDidDestroyPaneItem(@onPaneItemDestroyed)
@registerOpener (filePath) =>
@@ -58,6 +59,8 @@ class Workspace extends Model
for packageName in params.packagesWithActiveGrammars ? []
atom.packages.getLoadedPackage(packageName)?.loadGrammarsSync()
params.viewRegistry = new ViewRegistry
params.paneContainer.viewRegistry = params.viewRegistry
params.paneContainer = PaneContainer.deserialize(params.paneContainer)
params
@@ -496,21 +499,4 @@ class Workspace extends Model
@paneContainer.destroy()
getView: (object) ->
if view = @viewsByModel.get(object)
view
else if object instanceof HTMLElement
object
else if object instanceof jQuery
object[0].__spacePenView ?= object
object[0]
else
@createView(object)
createView: (model) ->
if viewClass = model?.getViewClass?()
view = new viewClass(model)
@viewsByModel.set(model, view[0])
view[0].__spacePenView ?= view
view[0]
else
throw new Error("Can't create a view for #{object.constructor.name} instance. Please register a view provider.")
@viewRegistry.getView(object)