12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)'use strict';
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// DirectoryTreeUtil
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Utility methods. They are intended for use only in this file.
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var DirectoryTreeUtil = {};
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Updates sub-elements of {@code parentElement} reading {@code DirectoryEntry}
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * with calling {@code iterator}.
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} changedDirectryPath The path of the changed directory.
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {DirectoryItem|DirectoryTree} currentDirectoryItem An item to be
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *     started traversal from.
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryTreeUtil.updateChangedDirectoryItem = function(
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    changedDirectryPath, currentDirectoryItem) {
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (changedDirectryPath === currentDirectoryItem.entry.fullPath) {
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    currentDirectoryItem.updateSubDirectories(false /* recursive */);
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (var i = 0; i < currentDirectoryItem.items.length; i++) {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var item = currentDirectoryItem.items[i];
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (PathUtil.isParentPath(item.entry.fullPath, changedDirectryPath)) {
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      DirectoryTreeUtil.updateChangedDirectoryItem(changedDirectryPath, item);
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Updates sub-elements of {@code parentElement} reading {@code DirectoryEntry}
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * with calling {@code iterator}.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {DirectoryItem|DirectoryTree} parentElement Parent element of newly
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *     created items.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {function(number): DirectoryEntry} iterator Function which returns
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *     the n-th Entry in the directory.
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @param {DirectoryTree} tree Current directory tree, which contains this item.
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {boolean} recursive True if the all visible sub-directories are
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *     updated recursively including left arrows. If false, the update walks
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *     only immediate child directories without arrows.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryTreeUtil.updateSubElementsFromList = function(
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    parentElement, iterator, tree, recursive) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var index = 0;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (iterator(index)) {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var currentEntry = iterator(index);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    var currentElement = parentElement.items[index];
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (index >= parentElement.items.length) {
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      var item = new DirectoryItem(currentEntry, parentElement, tree);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parentElement.add(item);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      index++;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (currentEntry.fullPath == currentElement.fullPath) {
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (recursive && parentElement.expanded)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        currentElement.updateSubDirectories(true /* recursive */);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      index++;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (currentEntry.fullPath < currentElement.fullPath) {
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      var item = new DirectoryItem(currentEntry, parentElement, tree);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parentElement.addAt(item, index);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      index++;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (currentEntry.fullPath > currentElement.fullPath) {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parentElement.remove(currentElement);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var removedChild;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (removedChild = parentElement.items[index]) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parentElement.remove(removedChild);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (index == 0) {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parentElement.hasChildren = false;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parentElement.expanded = false;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parentElement.hasChildren = true;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
91bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch * Finds a parent directory of the {@code entry} from the {@code items}, and
92bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch * invokes the DirectoryItem.selectByEntry() of the found directory.
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {Array.<DirectoryItem>} items Items to be searched.
95bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch * @param {DirectoryEntry|Object} entry The entry to be searched for. Can be
96bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *     a fake.
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return {boolean} True if the parent item is found.
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
99bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDirectoryTreeUtil.searchAndSelectByEntry = function(items, entry) {
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (var i = 0; i < items.length; i++) {
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var item = items[i];
102bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if (util.isParentEntry(item.entry, entry)) {
103bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      item.selectByEntry(entry);
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return false;
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
1114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch * Generate a list of the directory entries for the top level on the tree.
1124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch * @return {Array.<DirectoryEntry>} Entries for the top level on the tree.
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
1144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochDirectoryTreeUtil.generateTopLevelEntries = function() {
1154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  var entries = [
1164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    DirectoryModel.fakeDriveEntry_,
1174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    DirectoryModel.fakeDriveOfflineEntry_,
1184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    DirectoryModel.fakeDriveSharedWithMeEntry_,
1194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    DirectoryModel.fakeDriveRecentEntry_,
1204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ];
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  for (var i in entries) {
1234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    entries[i]['label'] = PathUtil.getRootLabel(entries[i].fullPath);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  return entries;
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Retrieves the file list with the latest information.
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {DirectoryTree|DirectoryItem} item Parent to be reloaded.
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {DirectoryModel} dm The directory model.
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {function(Array.<Entry>)} successCallback Callback on success.
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {function()=} opt_errorCallback Callback on failure.
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryTreeUtil.updateSubDirectories = function(
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    item, dm, successCallback, opt_errorCallback) {
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Tries to retrieve new entry if the cached entry is dummy.
1402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  if (util.isFakeDirectoryEntry(item.entry)) {
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Fake Drive root.
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dm.resolveDirectory(
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        item.fullPath,
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        function(entry) {
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          item.dirEntry_ = entry;
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          // If the retrieved entry is dummy again, returns with an error.
1482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch          if (util.isFakeDirectoryEntry(entry)) {
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            if (opt_errorCallback)
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              opt_errorCallback();
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            return;
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          DirectoryTreeUtil.updateSubDirectories(
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              item, dm, successCallback, opt_errorCallback);
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        },
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        opt_errorCallback || function() {});
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var reader = item.entry.createReader();
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var entries = [];
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var readEntry = function() {
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    reader.readEntries(function(results) {
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!results.length) {
1664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        successCallback(
1674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch            DirectoryTreeUtil.sortEntries(item.fileFilter_, entries));
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      for (var i = 0; i < results.length; i++) {
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        var entry = results[i];
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (entry.isDirectory)
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          entries.push(entry);
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      readEntry();
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    });
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  readEntry();
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Sorts a list of entries.
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {FileFilter} fileFilter The file filter.
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {Array.<Entries>} entries Entries to be sorted.
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return {Array.<Entries>} Sorted entries.
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryTreeUtil.sortEntries = function(fileFilter, entries) {
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entries.sort(function(a, b) {
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return (a.name.toLowerCase() > b.name.toLowerCase()) ? 1 : -1;
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  });
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return entries.filter(fileFilter.filter.bind(fileFilter));
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
1974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch * Checks if the given directory can be on the tree or not.
198b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) *
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {string} path Path to be checked.
2004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch * @return {boolean} True if the path is eligible for the directory tree.
2014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch *     Otherwise, false.
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
2034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochDirectoryTreeUtil.isEligiblePathForDirectoryTree = function(path) {
2044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  return PathUtil.isDriveBasedPath(path);
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// DirectoryItem
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * A directory in the tree. Each element represents one directory.
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {DirectoryEntry} dirEntry DirectoryEntry of this item.
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {DirectoryItem|DirectoryTree} parentDirItem Parent of this item.
215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @param {DirectoryTree} tree Current tree, which contains this item.
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @extends {cr.ui.TreeItem}
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @constructor
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)function DirectoryItem(dirEntry, parentDirItem, tree) {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var item = cr.doc.createElement('div');
221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DirectoryItem.decorate(item, dirEntry, parentDirItem, tree);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return item;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {HTMLElement} el Element to be DirectoryItem.
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {DirectoryEntry} dirEntry DirectoryEntry of this item.
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {DirectoryItem|DirectoryTree} parentDirItem Parent of this item.
229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @param {DirectoryTree} tree Current tree, which contains this item.
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DirectoryItem.decorate =
232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    function(el, dirEntry, parentDirItem, tree) {
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  el.__proto__ = DirectoryItem.prototype;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (/** @type {DirectoryItem} */ el).decorate(
235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      dirEntry, parentDirItem, tree);
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DirectoryItem.prototype = {
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  __proto__: cr.ui.TreeItem.prototype,
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * The DirectoryEntry corresponding to this DirectoryItem. This may be
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * a dummy DirectoryEntry.
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @type {DirectoryEntry|Object}
245bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch   */
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  get entry() {
247bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return this.dirEntry_;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * The element containing the label text and the icon.
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @type {!HTMLElement}
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @override
254bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch   */
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  get labelElement() {
256bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return this.firstElementChild.querySelector('.label');
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {DirectoryEntry} dirEntry DirectoryEntry of this item.
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {DirectoryItem|DirectoryTree} parentDirItem Parent of this item.
263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @param {DirectoryTree} tree Current tree, which contains this item.
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DirectoryItem.prototype.decorate = function(
266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    dirEntry, parentDirItem, tree) {
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var path = dirEntry.fullPath;
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  var label;
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  label = dirEntry.label ? dirEntry.label : dirEntry.name;
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.className = 'tree-item';
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.innerHTML =
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '<div class="tree-row">' +
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ' <span class="expand-icon"></span>' +
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ' <span class="icon"></span>' +
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ' <span class="label"></span>' +
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ' <div class="root-eject"></div>' +
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '</div>' +
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '<div class="tree-children"></div>';
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.setAttribute('role', 'treeitem');
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  this.parentTree_ = tree;
283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  this.directoryModel_ = tree.directoryModel;
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.parent_ = parentDirItem;
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.label = label;
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.fullPath = path;
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.dirEntry_ = dirEntry;
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.fileFilter_ = this.directoryModel_.getFileFilter();
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Sets hasChildren=false tentatively. This will be overridden after
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // scanning sub-directories in DirectoryTreeUtil.updateSubElementsFromList.
292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  this.hasChildren = false;
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.addEventListener('expand', this.onExpand_.bind(this), false);
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var volumeManager = VolumeManager.getInstance();
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var icon = this.querySelector('.icon');
2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  icon.classList.add('volume-icon');
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  var iconType = PathUtil.getRootType(path);
2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (iconType && PathUtil.isRootPath(path))
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    icon.setAttribute('volume-type-icon', iconType);
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  else
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    icon.setAttribute('file-type-icon', 'folder');
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  var eject = this.querySelector('.root-eject');
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  eject.hidden = !PathUtil.isUnmountableByUser(path);
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  eject.addEventListener('click',
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      function(event) {
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        event.stopPropagation();
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!PathUtil.isUnmountableByUser(path))
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          return;
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        volumeManager.unmount(path, function() {}, function() {});
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }.bind(this));
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (this.parentTree_.contextMenuForSubitems)
316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    this.setContextMenu(this.parentTree_.contextMenuForSubitems);
317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Adds handler for future change.
318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  this.parentTree_.addEventListener(
319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      'contextMenuForSubitemsChange',
320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      function(e) { this.setContextMenu(e.newValue); }.bind(this));
321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (parentDirItem.expanded)
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.updateSubDirectories(false /* recursive */);
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Overrides WebKit's scrollIntoViewIfNeeded, which doesn't work well with
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * a complex layout. This call is not necessary, so we are ignoring it.
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {boolean} unused Unused.
331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * @override
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryItem.prototype.scrollIntoViewIfNeeded = function(unused) {
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
337868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * Removes the child node, but without selecting the parent item, to avoid
338868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * unintended changing of directories. Removing is done externally, and other
339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * code will navigate to another directory.
340868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) *
341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * @param {!cr.ui.TreeItem} child The tree item child to remove.
342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * @override
343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) */
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DirectoryItem.prototype.remove = function(child) {
345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  this.lastElementChild.removeChild(child);
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (this.items.length == 0)
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    this.hasChildren = false;
348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/**
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Invoked when the item is being expanded.
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {!UIEvent} e Event.
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @private
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) **/
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DirectoryItem.prototype.onExpand_ = function(e) {
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.updateSubDirectories(
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      true /* recursive */,
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      function() {},
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      function() {
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.expanded = false;
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }.bind(this));
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  e.stopPropagation();
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Retrieves the latest subdirectories and update them on the tree.
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {boolean} recursive True if the update is recursively.
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {function()=} opt_successCallback Callback called on success.
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {function()=} opt_errorCallback Callback called on error.
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryItem.prototype.updateSubDirectories = function(
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    recursive, opt_successCallback, opt_errorCallback) {
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DirectoryTreeUtil.updateSubDirectories(
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this,
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this.directoryModel_,
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      function(entries) {
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.entries_ = entries;
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.redrawSubDirectoryList_(recursive);
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        opt_successCallback && opt_successCallback();
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }.bind(this),
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      opt_errorCallback);
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Redraw subitems with the latest information. The items are sorted in
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * alphabetical order, case insensitive.
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {boolean} recursive True if the update is recursively.
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @private
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryItem.prototype.redrawSubDirectoryList_ = function(recursive) {
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DirectoryTreeUtil.updateSubElementsFromList(
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this,
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      function(i) { return this.entries_[i]; }.bind(this),
395a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      this.parentTree_,
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      recursive);
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
400bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch * Select the item corresponding to the given {@code entry}.
401bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch * @param {DirectoryEntry|Object} entry The entry to be selected. Can be a fake.
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
403bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDirectoryItem.prototype.selectByEntry = function(entry) {
404bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if (util.isSameEntry(entry, this.entry)) {
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.selected = true;
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
409bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if (DirectoryTreeUtil.searchAndSelectByEntry(this.items, entry))
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If the path doesn't exist, updates sub directories and tryes again.
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.updateSubDirectories(
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false /* recursive */,
415bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      DirectoryTreeUtil.searchAndSelectByEntry.bind(null, this.items, entry));
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Executes the assigned action as a drop target.
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryItem.prototype.doDropTargetAction = function() {
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.expanded = true;
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Executes the assigned action. DirectoryItem performs changeDirectory.
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DirectoryItem.prototype.doAction = function() {
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (this.fullPath != this.directoryModel_.getCurrentDirPath())
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.directoryModel_.changeDirectory(this.fullPath);
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
433a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)/**
434a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * Sets the context menu for directory tree.
435a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @param {cr.ui.Menu} menu Menu to be set.
436a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */
437a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)DirectoryItem.prototype.setContextMenu = function(menu) {
438a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (this.entry && PathUtil.isEligibleForFolderShortcut(this.entry.fullPath))
439a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    cr.ui.contextMenuHandler.setContextMenu(this, menu);
440a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
441a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// DirectoryTree
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Tree of directories on the sidebar. This element is also the root of items,
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * in other words, this is the parent of the top-level items.
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @constructor
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @extends {cr.ui.Tree}
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function DirectoryTree() {}
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Decorates an element.
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {HTMLElement} el Element to be DirectoryTree.
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {DirectoryModel} directoryModel Current DirectoryModel.
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DirectoryTree.decorate = function(el, directoryModel) {
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  el.__proto__ = DirectoryTree.prototype;
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  (/** @type {DirectoryTree} */ el).decorate(directoryModel);
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DirectoryTree.prototype = {
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  __proto__: cr.ui.Tree.prototype,
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DirectoryTree is always expanded.
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  get expanded() { return true; },
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /**
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   * @param {boolean} value Not used.
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   */
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  set expanded(value) {},
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
474a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  get directoryModel() {
475a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return this.directoryModel_;
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
479a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)cr.defineProperty(DirectoryTree, 'contextMenuForSubitems', cr.PropertyKind.JS);
480a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Decorates an element.
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {DirectoryModel} directoryModel Current DirectoryModel.
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DirectoryTree.prototype.decorate = function(directoryModel) {
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cr.ui.Tree.prototype.decorate.call(this);
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.directoryModel_ = directoryModel;
4894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  this.entries_ = DirectoryTreeUtil.generateTopLevelEntries();
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.fileFilter_ = this.directoryModel_.getFileFilter();
492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.fileFilter_.addEventListener('changed',
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    this.onFilterChanged_.bind(this));
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.directoryModel_.addEventListener('directory-changed',
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this.onCurrentDirectoryChanged_.bind(this));
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add a handler for directory change.
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  this.addEventListener('change', function() {
500bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if (this.selectedItem &&
501bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch        (!this.currentEntry_ ||
502bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch         !util.isSameEntry(this.currentEntry_, this.selectedItem.entry))) {
503bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      this.currentEntry_ = this.selectedItem.entry;
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this.selectedItem.doAction();
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }.bind(this));
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.privateOnDirectoryChangedBound_ =
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this.onDirectoryContentChanged_.bind(this);
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chrome.fileBrowserPrivate.onDirectoryChanged.addListener(
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this.privateOnDirectoryChangedBound_);
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  this.scrollBar_ = MainPanelScrollBar();
5157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  this.scrollBar_.initialize(this.parentNode, this);
5164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
5174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  this.redraw(false /* recursive */);
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
521bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch * Select the item corresponding to the given entry.
522bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch * @param {DirectoryEntry|Object} entry The directory entry to be selected. Can
523bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *     be a fake.
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
525bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochDirectoryTree.prototype.selectByEntry = function(entry) {
5264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // If the target directory is not in the tree, do nothing.
5274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  if (!DirectoryTreeUtil.isEligiblePathForDirectoryTree(entry.fullPath))
528bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return;
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
530bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if (this.selectedItem && util.isSameEntry(entry, this.selectedItem.entry))
531bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return;
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
533bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  if (DirectoryTreeUtil.searchAndSelectByEntry(this.items, entry))
534bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    return;
535bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
536bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  this.selectedItem = null;
537bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  this.updateSubDirectories(
538bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      false /* recursive */,
5394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      // Success callback, failure is not handled.
540bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      function() {
5414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        if (!DirectoryTreeUtil.searchAndSelectByEntry(this.items, entry))
542bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch          this.selectedItem = null;
5434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      }.bind(this));
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Retrieves the latest subdirectories and update them on the tree.
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {boolean} recursive True if the update is recursively.
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {function()=} opt_successCallback Callback called on success.
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {function()=} opt_errorCallback Callback called on error.
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryTree.prototype.updateSubDirectories = function(
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    recursive, opt_successCallback, opt_errorCallback) {
5544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  var myDriveItem = this.items[0];
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DirectoryTreeUtil.updateSubDirectories(
5564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      myDriveItem,
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      this.directoryModel_,
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      function(entries) {
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.entries_ = entries;
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        this.redraw(recursive);
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (opt_successCallback)
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          opt_successCallback();
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }.bind(this),
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      opt_errorCallback);
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Redraw the list.
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {boolean} recursive True if the update is recursively. False if the
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *     only root items are updated.
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryTree.prototype.redraw = function(recursive) {
5737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DirectoryTreeUtil.updateSubElementsFromList(
5747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      this,
5757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      function(i) { return this.entries_[i]; }.bind(this),
576a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      this,
5777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      recursive);
578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Invoked when the filter is changed.
582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @private
583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryTree.prototype.onFilterChanged_ = function() {
585b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Returns immediately, if the tree is hidden.
5864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  if (this.hidden)
587b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return;
588b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  this.redraw(true /* recursive */);
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Invoked when a directory is changed.
594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {!UIEvent} event Event.
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @private
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryTree.prototype.onDirectoryContentChanged_ = function(event) {
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (event.eventType == 'changed') {
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    var path = util.extractFilePath(event.directoryUrl);
6004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    if (!DirectoryTreeUtil.isEligiblePathForDirectoryTree(path))
6014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      return;
6024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
6034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    var myDriveItem = this.items[0];
6044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    DirectoryTreeUtil.updateChangedDirectoryItem(path, myDriveItem);
605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Invoked when the current directory is changed.
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {!UIEvent} event Event.
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @private
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DirectoryTree.prototype.onCurrentDirectoryChanged_ = function(event) {
614bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  this.selectByEntry(event.newDirEntry);
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * Sets the margin height for the transparent preview panel at the bottom.
619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * @param {number} margin Margin to be set in px.
620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) */
621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DirectoryTree.prototype.setBottomMarginForPanel = function(margin) {
622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  this.style.paddingBottom = margin + 'px';
623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  this.scrollBar_.setBottomMarginForPanel(margin);
624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/**
627868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * Updates the UI after the layout has changed.
628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) */
629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DirectoryTree.prototype.relayout = function() {
630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  cr.dispatchSimpleEvent(this, 'relayout');
631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
632