mirror of
https://github.com/atom/atom.git
synced 2026-02-07 13:14:55 -05:00
151 lines
4.2 KiB
CoffeeScript
151 lines
4.2 KiB
CoffeeScript
$ = require 'jquery'
|
|
{$$} = require 'space-pen'
|
|
fs = require 'fs'
|
|
_ = require 'underscore'
|
|
|
|
{View} = require 'space-pen'
|
|
Buffer = require 'buffer'
|
|
Editor = require 'editor'
|
|
Project = require 'project'
|
|
VimMode = require 'vim-mode'
|
|
Pane = require 'pane'
|
|
PaneColumn = require 'pane-column'
|
|
PaneRow = require 'pane-row'
|
|
StatusBar = require 'status-bar'
|
|
|
|
module.exports =
|
|
class RootView extends View
|
|
@content: ->
|
|
@div id: 'root-view', tabindex: -1, =>
|
|
@div id: 'horizontal', outlet: 'horizontal', =>
|
|
@div id: 'panes', outlet: 'panes'
|
|
|
|
@deserialize: ({ projectPath, panesViewState, extensionStates }) ->
|
|
rootView = new RootView(projectPath)
|
|
rootView.setRootPane(rootView.deserializeView(panesViewState)) if panesViewState
|
|
rootView.extensionStates = extensionStates if extensionStates
|
|
rootView
|
|
|
|
extensions: null
|
|
extensionStates: null
|
|
fontSize: 20
|
|
|
|
initialize: (pathToOpen) ->
|
|
@extensions = {}
|
|
@extensionStates = {}
|
|
@project = new Project(pathToOpen)
|
|
|
|
@handleEvents()
|
|
@setTitle()
|
|
@open(pathToOpen) if fs.isFile(pathToOpen)
|
|
|
|
serialize: ->
|
|
projectPath: @project?.getPath()
|
|
panesViewState: @panes.children().view()?.serialize()
|
|
extensionStates: @serializeExtensions()
|
|
|
|
handleEvents: ->
|
|
@on 'show-console', => window.showConsole()
|
|
@on 'focus', (e) =>
|
|
if @activeEditor()
|
|
@activeEditor().focus()
|
|
false
|
|
else
|
|
@setTitle(@project?.getPath())
|
|
|
|
@on 'active-editor-path-change', (e, path) =>
|
|
@project.setPath(path) unless @project.getRootDirectory()
|
|
@setTitle(path)
|
|
|
|
@on 'increase-font-size', => @setFontSize(@getFontSize() + 1)
|
|
@on 'decrease-font-size', => @setFontSize(@getFontSize() - 1)
|
|
|
|
afterAttach: (onDom) ->
|
|
@focus() if onDom
|
|
|
|
serializeExtensions: ->
|
|
extensionStates = {}
|
|
for name, extension of @extensions
|
|
extensionStates[name] = extension.serialize?()
|
|
|
|
extensionStates
|
|
|
|
deserializeView: (viewState) ->
|
|
switch viewState.viewClass
|
|
when 'Pane' then Pane.deserialize(viewState, this)
|
|
when 'PaneRow' then PaneRow.deserialize(viewState, this)
|
|
when 'PaneColumn' then PaneColumn.deserialize(viewState, this)
|
|
when 'Editor' then Editor.deserialize(viewState, this)
|
|
|
|
activateExtension: (extension) ->
|
|
@extensions[extension.name] = extension
|
|
extension.activate(this, @extensionStates[extension.name])
|
|
|
|
deactivate: ->
|
|
atom.rootViewStates[$windowNumber] = @serialize()
|
|
extension.deactivate?() for name, extension of @extensions
|
|
@remove()
|
|
|
|
open: (path, changeFocus=true) ->
|
|
buffer = @project.open(path)
|
|
|
|
if @activeEditor()
|
|
@activeEditor().setBuffer(buffer)
|
|
else
|
|
editor = new Editor({ buffer })
|
|
pane = new Pane(editor)
|
|
@panes.append(pane)
|
|
if changeFocus
|
|
editor.focus()
|
|
else
|
|
@makeEditorActive(editor)
|
|
|
|
editorFocused: (editor) ->
|
|
@makeEditorActive(editor) if @panes.containsElement(editor)
|
|
|
|
makeEditorActive: (editor) ->
|
|
previousActiveEditor = @panes.find('.editor.active').view()
|
|
previousActiveEditor?.removeClass('active').off('.root-view')
|
|
editor
|
|
.addClass('active')
|
|
.on 'editor-path-change.root-view', =>
|
|
@trigger 'active-editor-path-change', editor.buffer.path
|
|
|
|
if not previousActiveEditor or editor.buffer.path != previousActiveEditor.buffer.path
|
|
@trigger 'active-editor-path-change', editor.buffer.path
|
|
|
|
activeKeybindings: ->
|
|
keymap.bindingsForElement(document.activeElement)
|
|
|
|
setTitle: (title='untitled') ->
|
|
document.title = title
|
|
|
|
editors: ->
|
|
@panes.find('.editor').map -> $(this).view()
|
|
|
|
activeEditor: ->
|
|
if (editor = @panes.find('.editor.active')).length
|
|
editor.view()
|
|
else
|
|
@panes.find('.editor:first').view()
|
|
|
|
setRootPane: (pane) ->
|
|
@panes.empty()
|
|
@panes.append(pane)
|
|
@adjustPaneDimensions()
|
|
|
|
adjustPaneDimensions: ->
|
|
rootPane = @panes.children().first().view()
|
|
rootPane?.css(width: '100%', height: '100%', top: 0, left: 0)
|
|
rootPane?.adjustDimensions()
|
|
|
|
remove: ->
|
|
editor.remove() for editor in @editors()
|
|
super
|
|
|
|
setFontSize: (newFontSize) ->
|
|
[oldFontSize, @fontSize] = [@fontSize, newFontSize]
|
|
@trigger 'font-size-change' if oldFontSize != newFontSize
|
|
|
|
getFontSize: -> @fontSize
|