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