Files
atom/src/extensions/tree-view/directory-view.coffee

85 lines
2.3 KiB
CoffeeScript

{View, $$} = require 'space-pen'
FileView = require 'tree-view/file-view'
Directory = require 'directory'
$ = require 'jquery'
module.exports =
class DirectoryView extends View
@content: ({directory, isExpanded} = {}) ->
@li class: 'directory entry', =>
@div outlet: 'header', class: 'header', =>
@span '', class: 'disclosure-arrow', outlet: 'disclosureArrow'
@span directory.getName(), class: 'name'
directory: null
entries: null
header: null
initialize: ({@directory, isExpanded} = {}) ->
@expand() if isExpanded
@disclosureArrow.on 'click', => @toggleExpansion()
getPath: ->
@directory.path
buildEntries: ->
@unwatchDescendantEntries()
@entries?.remove()
@entries = $$ -> @ol class: 'entries'
for entry in @directory.getEntries()
if entry instanceof Directory
@entries.append(new DirectoryView(directory: entry, isExpanded: false))
else
@entries.append(new FileView(entry))
@append(@entries)
toggleExpansion: ->
if @isExpanded then @collapse() else @expand()
expand: ->
return if @isExpanded
@addClass('expanded')
@disclosureArrow.text('')
@buildEntries()
@watchEntries()
@deserializeEntryExpansionStates(@entryStates) if @entryStates?
@isExpanded = true
false
collapse: ->
@entryStates = @serializeEntryExpansionStates()
@removeClass('expanded')
@disclosureArrow.text('')
@unwatchEntries()
@entries.remove()
@entries = null
@isExpanded = false
watchEntries: ->
@directory.on "contents-change.#{@directory.path}", =>
@buildEntries()
@trigger "tree-view:directory-modified"
unwatchEntries: ->
@unwatchDescendantEntries()
@directory.off ".#{@directory.path}"
unwatchDescendantEntries: ->
@find('.expanded.directory').each ->
$(this).view().unwatchEntries()
serializeEntryExpansionStates: ->
entryStates = {}
@entries.find('> .directory.expanded').each ->
view = $(this).view()
entryStates[view.directory.getName()] = view.serializeEntryExpansionStates()
entryStates
deserializeEntryExpansionStates: (entryStates) ->
for directoryName, childEntryStates of entryStates
@entries.find("> .directory:contains('#{directoryName}')").each ->
view = $(this).view()
view.entryStates = childEntryStates
view.expand()