mirror of
https://github.com/atom/atom.git
synced 2026-02-04 19:54:59 -05:00
137 lines
3.3 KiB
CoffeeScript
137 lines
3.3 KiB
CoffeeScript
{View} = require 'space-pen'
|
|
Pane = require 'pane'
|
|
$ = require 'jquery'
|
|
|
|
module.exports =
|
|
class PaneContainer extends View
|
|
registerDeserializer(this)
|
|
|
|
### Internal ###
|
|
|
|
@deserialize: ({root}) ->
|
|
container = new PaneContainer
|
|
container.append(deserialize(root)) if root
|
|
container.removeEmptyPanes()
|
|
container
|
|
|
|
@content: ->
|
|
@div id: 'panes'
|
|
|
|
initialize: ->
|
|
@destroyedItemStates = []
|
|
|
|
serialize: ->
|
|
deserializer: 'PaneContainer'
|
|
root: @getRoot()?.serialize()
|
|
|
|
### Public ###
|
|
|
|
focusNextPane: ->
|
|
panes = @getPanes()
|
|
if panes.length > 1
|
|
currentIndex = panes.indexOf(@getFocusedPane())
|
|
nextIndex = (currentIndex + 1) % panes.length
|
|
panes[nextIndex].focus()
|
|
true
|
|
else
|
|
false
|
|
|
|
focusPreviousPane: ->
|
|
panes = @getPanes()
|
|
if panes.length > 1
|
|
currentIndex = panes.indexOf(@getFocusedPane())
|
|
previousIndex = currentIndex - 1
|
|
previousIndex = panes.length - 1 if previousIndex < 0
|
|
panes[previousIndex].focus()
|
|
true
|
|
else
|
|
false
|
|
|
|
makeNextPaneActive: ->
|
|
panes = @getPanes()
|
|
currentIndex = panes.indexOf(@getActivePane())
|
|
nextIndex = (currentIndex + 1) % panes.length
|
|
panes[nextIndex].makeActive()
|
|
|
|
reopenItem: ->
|
|
if lastItemState = @destroyedItemStates.pop()
|
|
if activePane = @getActivePane()
|
|
activePane.showItem(deserialize(lastItemState))
|
|
true
|
|
else
|
|
newPane = new Pane(deserialize(lastItemState))
|
|
@append(newPane)
|
|
newPane.focus()
|
|
|
|
itemDestroyed: (item) ->
|
|
state = item.serialize?()
|
|
state.uri ?= item.getUri?()
|
|
@destroyedItemStates.push(state) if state?
|
|
|
|
itemAdded: (item) ->
|
|
itemUri = item.getUri?()
|
|
@destroyedItemStates = @destroyedItemStates.filter (itemState) ->
|
|
itemState.uri isnt itemUri
|
|
|
|
getRoot: ->
|
|
@children().first().view()
|
|
|
|
saveAll: ->
|
|
pane.saveItems() for pane in @getPanes()
|
|
|
|
confirmClose: ->
|
|
deferred = $.Deferred()
|
|
modifiedItems = []
|
|
for pane in @getPanes()
|
|
modifiedItems.push(item) for item in pane.getItems() when item.isModified?()
|
|
|
|
cancel = => deferred.reject()
|
|
saveNextModifiedItem = =>
|
|
if modifiedItems.length == 0
|
|
deferred.resolve()
|
|
else
|
|
item = modifiedItems.pop()
|
|
@paneAtIndex(0).promptToSaveItem item, saveNextModifiedItem, cancel
|
|
|
|
saveNextModifiedItem()
|
|
deferred.promise()
|
|
|
|
getPanes: ->
|
|
@find('.pane').views()
|
|
|
|
indexOfPane: (pane) ->
|
|
@getPanes().indexOf(pane.view())
|
|
|
|
paneAtIndex: (index) ->
|
|
@getPanes()[index]
|
|
|
|
eachPane: (callback) ->
|
|
callback(pane) for pane in @getPanes()
|
|
paneAttached = (e) -> callback($(e.target).view())
|
|
@on 'pane:attached', paneAttached
|
|
cancel: => @off 'pane:attached', paneAttached
|
|
|
|
getFocusedPane: ->
|
|
@find('.pane:has(:focus)').view()
|
|
|
|
getActivePane: ->
|
|
@find('.pane.active').view() ? @find('.pane:first').view()
|
|
|
|
getActivePaneItem: ->
|
|
@getActivePane()?.activeItem
|
|
|
|
getActiveView: ->
|
|
@getActivePane()?.activeView
|
|
|
|
adjustPaneDimensions: ->
|
|
if root = @getRoot()
|
|
root.css(width: '100%', height: '100%', top: 0, left: 0)
|
|
root.adjustDimensions()
|
|
|
|
removeEmptyPanes: ->
|
|
for pane in @getPanes() when pane.getItems().length == 0
|
|
pane.remove()
|
|
|
|
afterAttach: ->
|
|
@adjustPaneDimensions()
|