| Index: chrome/browser/resources/file_manager/js/navigation_list.js
|
| diff --git a/chrome/browser/resources/file_manager/js/navigation_list.js b/chrome/browser/resources/file_manager/js/navigation_list.js
|
| deleted file mode 100644
|
| index 0c5714fc2a5b937e488bccd7e90e2f39f2d30ab4..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/resources/file_manager/js/navigation_list.js
|
| +++ /dev/null
|
| @@ -1,729 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -'use strict';
|
| -
|
| -/**
|
| - * Entry of NavigationListModel. This constructor should be called only from
|
| - * the helper methods (NavigationModelItem.createFromPath/createFromEntry).
|
| - *
|
| - * @param {string} path Path.
|
| - * @param {DirectoryEntry} entry Entry. Can be null.
|
| - * @constructor
|
| - */
|
| -function NavigationModelItem(path, entry) {
|
| - this.path_ = path;
|
| - this.entry_ = entry;
|
| - this.resolvingQueue_ = new AsyncUtil.Queue();
|
| -
|
| - Object.seal(this);
|
| -}
|
| -
|
| -NavigationModelItem.prototype = {
|
| - get path() { return this.path_; },
|
| -};
|
| -
|
| -/**
|
| - * Returns the cached entry of the item. This may return NULL if the target is
|
| - * not available on the filesystem, is not resolved or is under resolving the
|
| - * entry.
|
| - *
|
| - * @return {Entry} Cached entry.
|
| - */
|
| -NavigationModelItem.prototype.getCachedEntry = function() {
|
| - return this.entry_;
|
| -};
|
| -
|
| -/**
|
| - * @param {VolumeManagerWrapper} volumeManager VolumeManagerWrapper instance.
|
| - * @param {string} path Path.
|
| - * @param {function(FileError)} errorCallback Called when the resolving is
|
| - * failed with the error.
|
| - * @return {NavigationModelItem} Created NavigationModelItem.
|
| - */
|
| -NavigationModelItem.createFromPath = function(
|
| - volumeManager, path, errorCallback) {
|
| - var item = new NavigationModelItem(path, null);
|
| - item.resolvingQueue_.run(function(continueCallback) {
|
| - volumeManager.resolvePath(
|
| - path,
|
| - function(entry) {
|
| - if (entry.isDirectory)
|
| - item.entry_ = entry;
|
| - else
|
| - errorCallback(util.createFileError(FileError.TYPE_MISMATCH_ERR));
|
| - continueCallback();
|
| - },
|
| - function(error) {
|
| - errorCallback(error);
|
| - continueCallback();
|
| - });
|
| - });
|
| - return item;
|
| -};
|
| -
|
| -/**
|
| - * @param {DirectoryEntry} entry Entry. Can be null.
|
| - * @return {NavigationModelItem} Created NavigationModelItem.
|
| - */
|
| -NavigationModelItem.createFromEntry = function(entry) {
|
| - if (!entry)
|
| - return null;
|
| - return new NavigationModelItem(entry.fullPath, entry);
|
| -};
|
| -
|
| -/**
|
| - * Retrieves the entry. If the entry is being retrieved, waits until it
|
| - * finishes.
|
| - * @param {function(Entry)} callback Called with the resolved entry. The entry
|
| - * may be NULL if resolving is failed.
|
| - */
|
| -NavigationModelItem.prototype.getEntryAsync = function(callback) {
|
| - // If resolving the entry is running, wait until it finishes.
|
| - this.resolvingQueue_.run(function(continueCallback) {
|
| - callback(this.entry_);
|
| - continueCallback();
|
| - }.bind(this));
|
| -};
|
| -
|
| -/**
|
| - * Returns if this item is a shortcut or a volume root.
|
| - * @return {boolean} True if a shortcut, false if a volume root.
|
| - */
|
| -NavigationModelItem.prototype.isShortcut = function() {
|
| - return !PathUtil.isRootPath(this.path_);
|
| -};
|
| -
|
| -/**
|
| - * A navigation list model. This model combines the 2 lists.
|
| - * @param {VolumeManagerWrapper} volumeManager VolumeManagerWrapper instance.
|
| - * @param {cr.ui.ArrayDataModel} shortcutListModel The list of folder shortcut.
|
| - * @constructor
|
| - * @extends {cr.EventTarget}
|
| - */
|
| -function NavigationListModel(volumeManager, shortcutListModel) {
|
| - cr.EventTarget.call(this);
|
| -
|
| - this.volumeManager_ = volumeManager;
|
| - this.shortcutListModel_ = shortcutListModel;
|
| -
|
| - var volumeInfoToModelItem = function(volumeInfo) {
|
| - if (volumeInfo.volumeType == util.VolumeType.DRIVE) {
|
| - // For drive volume, we assign the path to "My Drive".
|
| - return NavigationModelItem.createFromPath(
|
| - this.volumeManager_,
|
| - volumeInfo.mountPath + '/root',
|
| - function() {});
|
| - } else {
|
| - return NavigationModelItem.createFromEntry(volumeInfo.root);
|
| - }
|
| - }.bind(this);
|
| -
|
| - var pathToModelItem = function(path) {
|
| - var item = NavigationModelItem.createFromPath(
|
| - this.volumeManager_,
|
| - path,
|
| - function(error) {
|
| - if (error.code == FileError.NOT_FOUND_ERR)
|
| - this.onItemNotFoundError(item);
|
| - }.bind(this));
|
| - return item;
|
| - }.bind(this);
|
| -
|
| - /**
|
| - * Type of updated list.
|
| - * @enum {number}
|
| - * @const
|
| - */
|
| - var ListType = {
|
| - VOLUME_LIST: 1,
|
| - SHORTCUT_LIST: 2
|
| - };
|
| - Object.freeze(ListType);
|
| -
|
| - // Generates this.volumeList_ and this.shortcutList_ from the models.
|
| - this.volumeList_ =
|
| - this.volumeManager_.volumeInfoList.slice().map(volumeInfoToModelItem);
|
| -
|
| - this.shortcutList_ = [];
|
| - for (var i = 0; i < this.shortcutListModel_.length; i++) {
|
| - var shortcutPath = this.shortcutListModel_.item(i);
|
| - var mountPath = PathUtil.isDriveBasedPath(shortcutPath) ?
|
| - RootDirectory.DRIVE :
|
| - PathUtil.getRootPath(shortcutPath);
|
| - var volumeInfo = this.volumeManager_.getVolumeInfo(mountPath);
|
| - var isMounted = volumeInfo && !volumeInfo.error;
|
| - if (isMounted)
|
| - this.shortcutList_.push(pathToModelItem(shortcutPath));
|
| - }
|
| -
|
| - // Generates a combined 'permuted' event from an event of either list.
|
| - var permutedHandler = function(listType, event) {
|
| - var permutation;
|
| -
|
| - // Build the volumeList.
|
| - if (listType == ListType.VOLUME_LIST) {
|
| - // The volume is mounted or unmounted.
|
| - var newList = [];
|
| -
|
| - // Use the old instances if they just move.
|
| - for (var i = 0; i < event.permutation.length; i++) {
|
| - if (event.permutation[i] >= 0)
|
| - newList[event.permutation[i]] = this.volumeList_[i];
|
| - }
|
| -
|
| - // Create missing instances.
|
| - for (var i = 0; i < event.newLength; i++) {
|
| - if (!newList[i]) {
|
| - newList[i] = volumeInfoToModelItem(
|
| - this.volumeManager_.volumeInfoList.item(i));
|
| - }
|
| - }
|
| - this.volumeList_ = newList;
|
| -
|
| - permutation = event.permutation.slice();
|
| - } else {
|
| - // volumeList part has not been changed, so the permutation should be
|
| - // idenetity mapping.
|
| - permutation = [];
|
| - for (var i = 0; i < this.volumeList_.length; i++)
|
| - permutation[i] = i;
|
| - }
|
| -
|
| - // Build the shortcutList. Even if the event is for the volumeInfoList
|
| - // update, the short cut path may be unmounted or newly mounted. So, here
|
| - // shortcutList will always be re-built.
|
| - // Currently this code may be redundant, as shortcut folder is supported
|
| - // only on Drive File System and we can assume single-profile, but
|
| - // multi-profile will be supported later.
|
| - // The shortcut list is sorted in case-insensitive lexicographical order.
|
| - // So we just can traverse the two list linearly.
|
| - var modelIndex = 0;
|
| - var oldListIndex = 0;
|
| - var newList = [];
|
| - while (modelIndex < this.shortcutListModel_.length &&
|
| - oldListIndex < this.shortcutList_.length) {
|
| - var shortcutPath = this.shortcutListModel_.item(modelIndex);
|
| - var cmp = this.shortcutListModel_.compare(
|
| - shortcutPath, this.shortcutList_[oldListIndex].path);
|
| - if (cmp > 0) {
|
| - // The shortcut at shortcutList_[oldListIndex] is removed.
|
| - permutation.push(-1);
|
| - oldListIndex++;
|
| - continue;
|
| - }
|
| -
|
| - // Check if the volume where the shortcutPath is is mounted or not.
|
| - var mountPath = PathUtil.isDriveBasedPath(shortcutPath) ?
|
| - RootDirectory.DRIVE :
|
| - PathUtil.getRootPath(shortcutPath);
|
| - var volumeInfo = this.volumeManager_.getVolumeInfo(mountPath);
|
| - var isMounted = volumeInfo && !volumeInfo.error;
|
| - if (cmp == 0) {
|
| - // There exists an old NavigationModelItem instance.
|
| - if (isMounted) {
|
| - // Reuse the old instance.
|
| - permutation.push(newList.length + this.volumeList_.length);
|
| - newList.push(this.shortcutList_[oldListIndex]);
|
| - } else {
|
| - permutation.push(-1);
|
| - }
|
| - oldListIndex++;
|
| - } else {
|
| - // We needs to create a new instance for the shortcut path.
|
| - if (isMounted)
|
| - newList.push(pathToModelItem(shortcutPath));
|
| - }
|
| - modelIndex++;
|
| - }
|
| -
|
| - // Add remaining (new) shortcuts if necessary.
|
| - for (; modelIndex < this.shortcutListModel_.length; modelIndex++) {
|
| - var shortcutPath = this.shortcutListModel_.item(modelIndex);
|
| - var mountPath = PathUtil.isDriveBasedPath(shortcutPath) ?
|
| - RootDirectory.DRIVE :
|
| - PathUtil.getRootPath(shortcutPath);
|
| - var volumeInfo = this.volumeManager_.getVolumeInfo(mountPath);
|
| - var isMounted = volumeInfo && !volumeInfo.error;
|
| - if (isMounted)
|
| - newList.push(pathToModelItem(shortcutPath));
|
| - }
|
| -
|
| - // Fill remaining permutation if necessary.
|
| - for (; oldListIndex < this.shortcutList_.length; oldListIndex++)
|
| - permutation.push(-1);
|
| -
|
| - this.shortcutList_ = newList;
|
| -
|
| - // Dispatch permuted event.
|
| - var permutedEvent = new Event('permuted');
|
| - permutedEvent.newLength =
|
| - this.volumeList_.length + this.shortcutList_.length;
|
| - permutedEvent.permutation = permutation;
|
| - this.dispatchEvent(permutedEvent);
|
| - };
|
| -
|
| - this.volumeManager_.volumeInfoList.addEventListener(
|
| - 'permuted', permutedHandler.bind(this, ListType.VOLUME_LIST));
|
| - this.shortcutListModel_.addEventListener(
|
| - 'permuted', permutedHandler.bind(this, ListType.SHORTCUT_LIST));
|
| -
|
| - // 'change' event is just ignored, because it is not fired neither in
|
| - // the folder shortcut list nor in the volume info list.
|
| - // 'splice' and 'sorted' events are not implemented, since they are not used
|
| - // in list.js.
|
| -}
|
| -
|
| -/**
|
| - * NavigationList inherits cr.EventTarget.
|
| - */
|
| -NavigationListModel.prototype = {
|
| - __proto__: cr.EventTarget.prototype,
|
| - get length() { return this.length_(); },
|
| - get folderShortcutList() { return this.shortcutList_; }
|
| -};
|
| -
|
| -/**
|
| - * Returns the item at the given index.
|
| - * @param {number} index The index of the entry to get.
|
| - * @return {?string} The path at the given index.
|
| - */
|
| -NavigationListModel.prototype.item = function(index) {
|
| - var offset = this.volumeList_.length;
|
| - if (index < offset)
|
| - return this.volumeList_[index];
|
| - return this.shortcutList_[index - offset];
|
| -};
|
| -
|
| -/**
|
| - * Returns the number of items in the model.
|
| - * @return {number} The length of the model.
|
| - * @private
|
| - */
|
| -NavigationListModel.prototype.length_ = function() {
|
| - return this.volumeList_.length + this.shortcutList_.length;
|
| -};
|
| -
|
| -/**
|
| - * Returns the first matching item.
|
| - * @param {NavigationModelItem} modelItem The entry to find.
|
| - * @param {number=} opt_fromIndex If provided, then the searching start at
|
| - * the {@code opt_fromIndex}.
|
| - * @return {number} The index of the first found element or -1 if not found.
|
| - */
|
| -NavigationListModel.prototype.indexOf = function(modelItem, opt_fromIndex) {
|
| - for (var i = opt_fromIndex || 0; i < this.length; i++) {
|
| - if (modelItem === this.item(i))
|
| - return i;
|
| - }
|
| - return -1;
|
| -};
|
| -
|
| -/**
|
| - * Called when one od the items is not found on the filesystem.
|
| - * @param {NavigationModelItem} modelItem The entry which is not found.
|
| - */
|
| -NavigationListModel.prototype.onItemNotFoundError = function(modelItem) {
|
| - var index = this.indexOf(modelItem);
|
| - if (index === -1) {
|
| - // Invalid modelItem.
|
| - } else if (index < this.volumeList_.length) {
|
| - // The item is in the volume list.
|
| - // Not implemented.
|
| - // TODO(yoshiki): Implement it when necessary.
|
| - } else {
|
| - // The item is in the folder shortcut list.
|
| - if (this.isDriveMounted())
|
| - this.shortcutListModel_.remove(modelItem.path);
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Returns if the drive is mounted or not.
|
| - * @return {boolean} True if the drive is mounted, false otherwise.
|
| - */
|
| -NavigationListModel.prototype.isDriveMounted = function() {
|
| - return !!this.volumeManager_.getVolumeInfo(RootDirectory.DRIVE);
|
| -};
|
| -
|
| -/**
|
| - * A navigation list item.
|
| - * @constructor
|
| - * @extends {HTMLLIElement}
|
| - */
|
| -var NavigationListItem = cr.ui.define('li');
|
| -
|
| -NavigationListItem.prototype = {
|
| - __proto__: HTMLLIElement.prototype,
|
| - get modelItem() { return this.modelItem_; }
|
| -};
|
| -
|
| -/**
|
| - * Decorate the item.
|
| - */
|
| -NavigationListItem.prototype.decorate = function() {
|
| - // decorate() may be called twice: from the constructor and from
|
| - // List.createItem(). This check prevents double-decorating.
|
| - if (this.className)
|
| - return;
|
| -
|
| - this.className = 'root-item';
|
| - this.setAttribute('role', 'option');
|
| -
|
| - this.iconDiv_ = cr.doc.createElement('div');
|
| - this.iconDiv_.className = 'volume-icon';
|
| - this.appendChild(this.iconDiv_);
|
| -
|
| - this.label_ = cr.doc.createElement('div');
|
| - this.label_.className = 'root-label';
|
| - this.appendChild(this.label_);
|
| -
|
| - cr.defineProperty(this, 'lead', cr.PropertyKind.BOOL_ATTR);
|
| - cr.defineProperty(this, 'selected', cr.PropertyKind.BOOL_ATTR);
|
| -};
|
| -
|
| -/**
|
| - * Associate a path with this item.
|
| - * @param {NavigationModelItem} modelItem NavigationModelItem of this item.
|
| - * @param {string=} opt_deviceType The type of the device. Available iff the
|
| - * path represents removable storage.
|
| - */
|
| -NavigationListItem.prototype.setModelItem =
|
| - function(modelItem, opt_deviceType) {
|
| - if (this.modelItem_)
|
| - console.warn('NavigationListItem.setModelItem should be called only once.');
|
| -
|
| - this.modelItem_ = modelItem;
|
| -
|
| - var rootType = PathUtil.getRootType(modelItem.path);
|
| - this.iconDiv_.setAttribute('volume-type-icon', rootType);
|
| - if (opt_deviceType) {
|
| - this.iconDiv_.setAttribute('volume-subtype', opt_deviceType);
|
| - }
|
| -
|
| - this.label_.textContent = PathUtil.getFolderLabel(modelItem.path);
|
| -
|
| - if (rootType === RootType.ARCHIVE || rootType === RootType.REMOVABLE) {
|
| - this.eject_ = cr.doc.createElement('div');
|
| - // Block other mouse handlers.
|
| - this.eject_.addEventListener(
|
| - 'mouseup', function(event) { event.stopPropagation() });
|
| - this.eject_.addEventListener(
|
| - 'mousedown', function(event) { event.stopPropagation() });
|
| -
|
| - this.eject_.className = 'root-eject';
|
| - this.eject_.addEventListener('click', function(event) {
|
| - event.stopPropagation();
|
| - cr.dispatchSimpleEvent(this, 'eject');
|
| - }.bind(this));
|
| -
|
| - this.appendChild(this.eject_);
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Associate a context menu with this item.
|
| - * @param {cr.ui.Menu} menu Menu this item.
|
| - */
|
| -NavigationListItem.prototype.maybeSetContextMenu = function(menu) {
|
| - if (!this.modelItem_.path) {
|
| - console.error('NavigationListItem.maybeSetContextMenu must be called ' +
|
| - 'after setModelItem().');
|
| - return;
|
| - }
|
| -
|
| - var isRoot = PathUtil.isRootPath(this.modelItem_.path);
|
| - var rootType = PathUtil.getRootType(this.modelItem_.path);
|
| - // The context menu is shown on the following items:
|
| - // - Removable and Archive volumes
|
| - // - Folder shortcuts
|
| - if (!isRoot ||
|
| - (rootType != RootType.DRIVE && rootType != RootType.DOWNLOADS))
|
| - cr.ui.contextMenuHandler.setContextMenu(this, menu);
|
| -};
|
| -
|
| -/**
|
| - * A navigation list.
|
| - * @constructor
|
| - * @extends {cr.ui.List}
|
| - */
|
| -function NavigationList() {
|
| -}
|
| -
|
| -/**
|
| - * NavigationList inherits cr.ui.List.
|
| - */
|
| -NavigationList.prototype = {
|
| - __proto__: cr.ui.List.prototype,
|
| -
|
| - set dataModel(dataModel) {
|
| - if (!this.onListContentChangedBound_)
|
| - this.onListContentChangedBound_ = this.onListContentChanged_.bind(this);
|
| -
|
| - if (this.dataModel_) {
|
| - this.dataModel_.removeEventListener(
|
| - 'change', this.onListContentChangedBound_);
|
| - this.dataModel_.removeEventListener(
|
| - 'permuted', this.onListContentChangedBound_);
|
| - }
|
| -
|
| - var parentSetter = cr.ui.List.prototype.__lookupSetter__('dataModel');
|
| - parentSetter.call(this, dataModel);
|
| -
|
| - // This must be placed after the parent method is called, in order to make
|
| - // it sure that the list was changed.
|
| - dataModel.addEventListener('change', this.onListContentChangedBound_);
|
| - dataModel.addEventListener('permuted', this.onListContentChangedBound_);
|
| - },
|
| -
|
| - get dataModel() {
|
| - return this.dataModel_;
|
| - },
|
| -
|
| - // TODO(yoshiki): Add a setter of 'directoryModel'.
|
| -};
|
| -
|
| -/**
|
| - * @param {HTMLElement} el Element to be DirectoryItem.
|
| - * @param {VolumeManagerWrapper} volumeManager The VolumeManager of the system.
|
| - * @param {DirectoryModel} directoryModel Current DirectoryModel.
|
| - * folders.
|
| - */
|
| -NavigationList.decorate = function(el, volumeManager, directoryModel) {
|
| - el.__proto__ = NavigationList.prototype;
|
| - el.decorate(volumeManager, directoryModel);
|
| -};
|
| -
|
| -/**
|
| - * @param {VolumeManagerWrapper} volumeManager The VolumeManager of the system.
|
| - * @param {DirectoryModel} directoryModel Current DirectoryModel.
|
| - */
|
| -NavigationList.prototype.decorate = function(volumeManager, directoryModel) {
|
| - cr.ui.List.decorate(this);
|
| - this.__proto__ = NavigationList.prototype;
|
| -
|
| - this.directoryModel_ = directoryModel;
|
| - this.volumeManager_ = volumeManager;
|
| - this.selectionModel = new cr.ui.ListSingleSelectionModel();
|
| -
|
| - this.directoryModel_.addEventListener('directory-changed',
|
| - this.onCurrentDirectoryChanged_.bind(this));
|
| - this.selectionModel.addEventListener(
|
| - 'change', this.onSelectionChange_.bind(this));
|
| - this.selectionModel.addEventListener(
|
| - 'beforeChange', this.onBeforeSelectionChange_.bind(this));
|
| -
|
| - this.scrollBar_ = new ScrollBar();
|
| - this.scrollBar_.initialize(this.parentNode, this);
|
| -
|
| - // Overriding default role 'list' set by cr.ui.List.decorate() to 'listbox'
|
| - // role for better accessibility on ChromeOS.
|
| - this.setAttribute('role', 'listbox');
|
| -
|
| - var self = this;
|
| - this.itemConstructor = function(modelItem) {
|
| - return self.renderRoot_(modelItem);
|
| - };
|
| -};
|
| -
|
| -/**
|
| - * This overrides cr.ui.List.measureItem().
|
| - * In the method, a temporary element is added/removed from the list, and we
|
| - * need to omit animations for such temporary items.
|
| - *
|
| - * @param {ListItem=} opt_item The list item to be measured.
|
| - * @return {{height: number, marginTop: number, marginBottom:number,
|
| - * width: number, marginLeft: number, marginRight:number}} Size.
|
| - * @override
|
| - */
|
| -NavigationList.prototype.measureItem = function(opt_item) {
|
| - this.measuringTemporaryItemNow_ = true;
|
| - var result = cr.ui.List.prototype.measureItem.call(this, opt_item);
|
| - this.measuringTemporaryItemNow_ = false;
|
| - return result;
|
| -};
|
| -
|
| -/**
|
| - * Creates an element of a navigation list. This method is called from
|
| - * cr.ui.List internally.
|
| - *
|
| - * @param {NavigationModelItem} modelItem NavigationModelItem to be rendered.
|
| - * @return {NavigationListItem} Rendered element.
|
| - * @private
|
| - */
|
| -NavigationList.prototype.renderRoot_ = function(modelItem) {
|
| - var item = new NavigationListItem();
|
| - var volumeInfo =
|
| - PathUtil.isRootPath(modelItem.path) &&
|
| - this.volumeManager_.getVolumeInfo(modelItem.path);
|
| - item.setModelItem(modelItem, volumeInfo && volumeInfo.deviceType);
|
| -
|
| - var handleClick = function() {
|
| - if (item.selected &&
|
| - modelItem.path !== this.directoryModel_.getCurrentDirPath()) {
|
| - metrics.recordUserAction('FolderShortcut.Navigate');
|
| - this.changeDirectory_(modelItem);
|
| - }
|
| - }.bind(this);
|
| - item.addEventListener('click', handleClick);
|
| -
|
| - var handleEject = function() {
|
| - var unmountCommand = cr.doc.querySelector('command#unmount');
|
| - // Let's make sure 'canExecute' state of the command is properly set for
|
| - // the root before executing it.
|
| - unmountCommand.canExecuteChange(item);
|
| - unmountCommand.execute(item);
|
| - };
|
| - item.addEventListener('eject', handleEject);
|
| -
|
| - if (this.contextMenu_)
|
| - item.maybeSetContextMenu(this.contextMenu_);
|
| -
|
| - return item;
|
| -};
|
| -
|
| -/**
|
| - * Changes the current directory to the given path.
|
| - * If the given path is not found, a 'shortcut-target-not-found' event is
|
| - * fired.
|
| - *
|
| - * @param {NavigationModelItem} modelItem Directory to be chagned to.
|
| - * @private
|
| - */
|
| -NavigationList.prototype.changeDirectory_ = function(modelItem) {
|
| - var onErrorCallback = function(error) {
|
| - if (error.code === FileError.NOT_FOUND_ERR)
|
| - this.dataModel.onItemNotFoundError(modelItem);
|
| - }.bind(this);
|
| -
|
| - this.directoryModel_.changeDirectory(modelItem.path, onErrorCallback);
|
| -};
|
| -
|
| -/**
|
| - * Sets a context menu. Context menu is enabled only on archive and removable
|
| - * volumes as of now.
|
| - *
|
| - * @param {cr.ui.Menu} menu Context menu.
|
| - */
|
| -NavigationList.prototype.setContextMenu = function(menu) {
|
| - this.contextMenu_ = menu;
|
| -
|
| - for (var i = 0; i < this.dataModel.length; i++) {
|
| - this.getListItemByIndex(i).maybeSetContextMenu(this.contextMenu_);
|
| - }
|
| -};
|
| -
|
| -/**
|
| - * Selects the n-th item from the list.
|
| - *
|
| - * @param {number} index Item index.
|
| - * @return {boolean} True for success, otherwise false.
|
| - */
|
| -NavigationList.prototype.selectByIndex = function(index) {
|
| - if (index < 0 || index > this.dataModel.length - 1)
|
| - return false;
|
| -
|
| - var newModelItem = this.dataModel.item(index);
|
| - var newPath = newModelItem.path;
|
| - if (!newPath)
|
| - return false;
|
| -
|
| - // Prevents double-moving to the current directory.
|
| - // eg. When user clicks the item, changing directory has already been done in
|
| - // click handler.
|
| - var entry = this.directoryModel_.getCurrentDirEntry();
|
| - if (entry && entry.fullPath == newPath)
|
| - return false;
|
| -
|
| - metrics.recordUserAction('FolderShortcut.Navigate');
|
| - this.changeDirectory_(newModelItem);
|
| - return true;
|
| -};
|
| -
|
| -/**
|
| - * Handler before root item change.
|
| - * @param {Event} event The event.
|
| - * @private
|
| - */
|
| -NavigationList.prototype.onBeforeSelectionChange_ = function(event) {
|
| - if (event.changes.length == 1 && !event.changes[0].selected)
|
| - event.preventDefault();
|
| -};
|
| -
|
| -/**
|
| - * Handler for root item being clicked.
|
| - * @param {Event} event The event.
|
| - * @private
|
| - */
|
| -NavigationList.prototype.onSelectionChange_ = function(event) {
|
| - // This handler is invoked even when the navigation list itself changes the
|
| - // selection. In such case, we shouldn't handle the event.
|
| - if (this.dontHandleSelectionEvent_)
|
| - return;
|
| -
|
| - this.selectByIndex(this.selectionModel.selectedIndex);
|
| -};
|
| -
|
| -/**
|
| - * Invoked when the current directory is changed.
|
| - * @param {Event} event The event.
|
| - * @private
|
| - */
|
| -NavigationList.prototype.onCurrentDirectoryChanged_ = function(event) {
|
| - this.selectBestMatchItem_();
|
| -};
|
| -
|
| -/**
|
| - * Invoked when the content in the data model is changed.
|
| - * @param {Event} event The event.
|
| - * @private
|
| - */
|
| -NavigationList.prototype.onListContentChanged_ = function(event) {
|
| - this.selectBestMatchItem_();
|
| -};
|
| -
|
| -/**
|
| - * Synchronizes the volume list selection with the current directory, after
|
| - * it is changed outside of the volume list.
|
| - * @private
|
| - */
|
| -NavigationList.prototype.selectBestMatchItem_ = function() {
|
| - var entry = this.directoryModel_.getCurrentDirEntry();
|
| - var path = entry && entry.fullPath;
|
| - if (!path)
|
| - return;
|
| -
|
| - // (1) Select the nearest parent directory (including the shortcut folders).
|
| - var bestMatchIndex = -1;
|
| - var bestMatchSubStringLen = 0;
|
| - for (var i = 0; i < this.dataModel.length; i++) {
|
| - var itemPath = this.dataModel.item(i).path;
|
| - if (path.indexOf(itemPath) == 0) {
|
| - if (bestMatchSubStringLen < itemPath.length) {
|
| - bestMatchIndex = i;
|
| - bestMatchSubStringLen = itemPath.length;
|
| - }
|
| - }
|
| - }
|
| - if (bestMatchIndex != -1) {
|
| - // Not to invoke the handler of this instance, sets the guard.
|
| - this.dontHandleSelectionEvent_ = true;
|
| - this.selectionModel.selectedIndex = bestMatchIndex;
|
| - this.dontHandleSelectionEvent_ = false;
|
| - return;
|
| - }
|
| -
|
| - // (2) Selects the volume of the current directory.
|
| - var newRootPath = PathUtil.getRootPath(path);
|
| - for (var i = 0; i < this.dataModel.length; i++) {
|
| - var itemPath = this.dataModel.item(i).path;
|
| - if (PathUtil.getRootPath(itemPath) == newRootPath) {
|
| - // Not to invoke the handler of this instance, sets the guard.
|
| - this.dontHandleSelectionEvent_ = true;
|
| - this.selectionModel.selectedIndex = i;
|
| - this.dontHandleSelectionEvent_ = false;
|
| - return;
|
| - }
|
| - }
|
| -};
|
|
|