15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)'use strict'; 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/** 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * TODO(dzvorygin): Here we use this hack, since 'hidden' is standard 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * attribute and we can't use it's setter as usual. 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {boolean} value New value of hidden property. 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)cr.ui.Command.prototype.setHidden = function(value) { 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) this.__lookupSetter__('hidden').call(this, value); 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/** 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * A command. 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @interface 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)var Command = function() {}; 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/** 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Handles the execute event. 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {Event} event Command event. 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {FileManager} fileManager FileManager. 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Command.prototype.execute = function(event, fileManager) {}; 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/** 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Handles the can execute event. 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {Event} event Can execute event. 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {FileManager} fileManager FileManager. 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Command.prototype.canExecute = function(event, fileManager) {}; 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/** 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Utility for commands. 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var CommandUtil = {}; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * Extracts entry on which command event was dispatched. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch * @param {DirectoryTree|DirectoryItem|NavigationList|HTMLLIElement|cr.ui.List} 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * element Directory to extract a path from. 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * @return {Entry} Entry of the found node. 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) */ 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)CommandUtil.getCommandEntry = function(element) { 493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (element instanceof NavigationList) { 503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // element is a NavigationList. 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /** @type {NavigationModelItem} */ 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var selectedItem = element.selectedItem; 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return selectedItem && selectedItem.getCachedEntry(); 553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } else if (element instanceof NavigationListItem) { 563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // element is a subitem of NavigationList. 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /** @type {NavigationList} */ 583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch var navigationList = element.parentElement; 593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch var index = navigationList.getIndexOfListItem(element); 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /** @type {NavigationModelItem} */ 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var item = (index != -1) ? navigationList.dataModel.item(index) : null; 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return item && item.getCachedEntry(); 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else if (element instanceof DirectoryTree) { 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // element is a DirectoryTree. 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return element.selectedItem; 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else if (element instanceof DirectoryItem) { 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // element is a sub item in DirectoryTree. 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // DirectoryItem.fullPath is set on initialization, but entry is lazily. 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // We may use fullPath just in case that the entry has not been set yet. 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return element.entry; 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else if (element instanceof cr.ui.List) { 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // element is a normal List (eg. the file list on the right panel). 74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) var entry = element.selectedItem; 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Check if it is Entry or not by referring the fullPath member variable. 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return entry && entry.fullPath ? entry : null; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) console.warn('Unsupported element'); 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return null; 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch * @param {NavigationList} navigationList navigation list to extract root node. 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @return {?RootType} Type of the found root. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochCommandUtil.getCommandRootType = function(navigationList) { 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var root = CommandUtil.getCommandEntry(navigationList); 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return root && 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PathUtil.isRootPath(root.fullPath) && 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PathUtil.getRootType(root.fullPath); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Checks if command can be executed on drive. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Event} event Command event to mark. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {FileManager} fileManager FileManager to use. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CommandUtil.canExecuteEnabledOnDriveOnly = function(event, fileManager) { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.canExecute = fileManager.isOnDrive(); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Checks if command should be visible on drive. 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Event} event Command event to mark. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {FileManager} fileManager FileManager to use. 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CommandUtil.canExecuteVisibleOnDriveOnly = function(event, fileManager) { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.canExecute = fileManager.isOnDrive(); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.command.setHidden(!fileManager.isOnDrive()); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Sets as the command as always enabled. 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * @param {Event} event Command event to mark. 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochCommandUtil.canExecuteAlways = function(event) { 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch event.canExecute = true; 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/** 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Returns a single selected/passed entry or null. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Event} event Command event. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {FileManager} fileManager FileManager to use. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return {FileEntry} The entry or null. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CommandUtil.getSingleEntry = function(event, fileManager) { 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event.target.entry) { 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return event.target.entry; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var selection = fileManager.getSelection(); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (selection.totalCount == 1) { 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return selection.entries[0]; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return null; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Obtains target entries that can be pinned from the selection. 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * If directories are included in the selection, it just returns an empty 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * array to avoid confusing because pinning directory is not supported 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * currently. 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return {Array.<Entry>} Target entries. 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandUtil.getPinTargetEntries = function() { 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var hasDirectory = false; 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var results = fileManager.getSelection().entries.filter(function(entry) { 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) hasDirectory = hasDirectory || entry.isDirectory; 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!entry || hasDirectory) 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var metadata = fileManager.metadataCache_.getCached(entry, 'drive'); 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!metadata || metadata.hosted) 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) entry.pinned = metadata.pinned; 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return hasDirectory ? [] : results; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Sets the default handler for the commandId and prevents handling 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the keydown events for this command. Not doing that breaks relationship 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of original keyboard event and the command. WebKit would handle it 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * differently in some cases. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {Node} node to register command handler on. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param {string} commandId Command id to respond to. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CommandUtil.forceDefaultHandler = function(node, commandId) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var doc = node.ownerDocument; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var command = doc.querySelector('command[id="' + commandId + '"]'); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.addEventListener('keydown', function(e) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command.matchesEvent(e)) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prevent cr.ui.CommandManager of handling it and leave it 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the default handler. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) e.stopPropagation(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) node.addEventListener('command', function(event) { 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (event.command.id !== commandId) 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) document.execCommand(event.command.id); 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event.cancelBubble = true; 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }); 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) node.addEventListener('canExecute', function(event) { 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (event.command.id === commandId) 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event.canExecute = document.queryCommandEnabled(event.command.id); 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }); 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/** 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Default command. 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandUtil.defaultCommand = { 1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) execute: function(event, fileManager) { 1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fileManager.document.execCommand(event.command.id); 1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }, 1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) canExecute: function(event, fileManager) { 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event.canExecute = fileManager.document.queryCommandEnabled( 2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event.command.id); 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/** 2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Creates the volume switch command with index. 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {number} index Volume index from 1 to 9. 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return {Command} Volume switch command. 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandUtil.createVolumeSwitchCommand = function(index) { 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return { 2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) execute: function(event, fileManager) { 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fileManager.navigationList.selectByIndex(index - 1); 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }, 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) canExecute: function(event, fileManager) { 2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event.canExecute = index > 0 && 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) index <= fileManager.navigationList.dataModel.length; 2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/** 22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Handle of the command events. 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {FileManager} fileManager FileManager. 22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * @constructor 22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */ 2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)var CommandHandler = function(fileManager) { 2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * FileManager. 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {FileManager} 2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @private 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) this.fileManager_ = fileManager; 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Command elements. 2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Object.<string, cr.ui.Command>} 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @private 2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) this.commands_ = {}; 24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Whether the ctrl key is pressed or not. 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {boolean} 2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @private 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) this.ctrlKeyPressed_ = false; 2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Object.seal(this); 2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Decorate command tags in the document. 2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var commands = fileManager.document.querySelectorAll('command'); 25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (var i = 0; i < commands.length; i++) { 25468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) cr.ui.Command.decorate(commands[i]); 2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) this.commands_[commands[i].id] = commands[i]; 25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Register events. 2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fileManager.document.addEventListener('command', this.onCommand_.bind(this)); 2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fileManager.document.addEventListener('canExecute', 2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) this.onCanExecute_.bind(this)); 2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fileManager.document.addEventListener('keydown', this.onKeyDown_.bind(this)); 2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fileManager.document.addEventListener('keyup', this.onKeyUp_.bind(this)); 26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/** 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Updates the availability of all commands. 26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */ 2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.prototype.updateAvailability = function() { 2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (var id in this.commands_) { 2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) this.commands_[id].canExecuteChange(); 2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/** 2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * Checks if the handler should ignore the current event, eg. since there is 2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * a popup dialog currently opened. 2781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * 2791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * @return {boolean} True if the event should be ignored, false otherwise. 2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * @private 2811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) */ 2821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)CommandHandler.prototype.shouldIgnoreEvents_ = function() { 2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Do not handle commands, when a dialog is shown. 2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (this.fileManager_.document.querySelector('.cr-dialog-container.shown')) 2851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return true; 2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return false; // Do not ignore. 2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 2891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)/** 29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Handles command events. 29268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * @param {Event} event Command event. 29368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * @private 29468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */ 29568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)CommandHandler.prototype.onCommand_ = function(event) { 2961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (this.shouldIgnoreEvents_()) 2971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var handler = CommandHandler.COMMANDS_[event.command.id]; 2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) handler.execute.call(this, event, this.fileManager_); 30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/** 30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Handles canExecute events. 30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * @param {Event} event Can execute event. 30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * @private 30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */ 30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)CommandHandler.prototype.onCanExecute_ = function(event) { 3081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (this.shouldIgnoreEvents_()) 3091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return; 3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var handler = CommandHandler.COMMANDS_[event.command.id]; 3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) handler.canExecute.call(this, event, this.fileManager_); 31268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 31368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 31468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/** 3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Handle key down event. 3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {Event} event Key down event. 3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @private 31868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */ 3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.prototype.onKeyDown_ = function(event) { 3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // 17 is the keycode of Ctrl key and it means the event is not for other keys 3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // with Ctrl modifier but for ctrl key itself. 3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (util.getKeyModifiers(event) + event.keyCode == 'Ctrl-17') { 3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) this.ctrlKeyPressed_ = true; 3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) this.updateAvailability(); 3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 32768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 32868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/** 3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Handle key up event. 3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param {Event} event Key up event. 3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @private 33268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */ 3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.prototype.onKeyUp_ = function(event) { 3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // 17 is the keycode of Ctrl key and it means the event is not for other keys 3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // with Ctrl modifier but for ctrl key itself. 3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (util.getKeyModifiers(event) + event.keyCode == '17') { 3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) this.ctrlKeyPressed_ = false; 3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) this.updateAvailability(); 3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Commands. 3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Object.<string, Command>} 3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @const 3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @private 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_ = {}; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unmounts external drive. 3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['unmount'] = { 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Event} event Command event. 357bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch * @param {FileManager} fileManager The file manager instance. 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 359bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch execute: function(event, fileManager) { 3603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var root = CommandUtil.getCommandEntry(event.target); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root) 3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) fileManager.unmountVolume(PathUtil.getRootPath(root.fullPath)); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Event} event Command event. 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) canExecute: function(event, fileManager) { 368bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch var rootType = CommandUtil.getCommandRootType(event.target); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.canExecute = (rootType == RootType.ARCHIVE || 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rootType == RootType.REMOVABLE); 372bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch event.command.setHidden(!event.canExecute); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.command.label = rootType == RootType.ARCHIVE ? 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) str('CLOSE_ARCHIVE_BUTTON_LABEL') : 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) str('UNMOUNT_DEVICE_BUTTON_LABEL'); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Formats external drive. 3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['format'] = { 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Event} event Command event. 386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @param {FileManager} fileManager The file manager instance. 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 388bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch execute: function(event, fileManager) { 389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) var directoryModel = fileManager.directoryModel; 3903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var root = CommandUtil.getCommandEntry(event.target); 391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If an entry is not found from the event target, use the current 392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // directory. This can happen for the format button for unsupported and 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // unrecognized volumes. 394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!root) 395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root = directoryModel.getCurrentDirEntry(); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(satorux): Stop assuming fullPath to be unique. crbug.com/320967 398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) var mountPath = root.fullPath; 399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) var volumeInfo = fileManager.volumeManager.getVolumeInfo(mountPath); 400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (volumeInfo) { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fileManager.confirm.show( 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loadTimeData.getString('FORMATTING_WARNING'), 403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome.fileBrowserPrivate.formatVolume.bind(null, 404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) volumeInfo.volumeId)); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param {Event} event Command event. 409a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) * @param {FileManager} fileManager The file manager instance. 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) canExecute: function(event, fileManager) { 4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var directoryModel = fileManager.directoryModel; 4133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var root = CommandUtil.getCommandEntry(event.target); 414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // See the comment in execute() for why doing this. 415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!root) 416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root = directoryModel.getCurrentDirEntry(); 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var removable = root && 4183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PathUtil.getRootType(root.fullPath) == RootType.REMOVABLE; 419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Don't check if the volume is read-only. Unformatted volume is 420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // considered read-only per directoryModel.isPathReadOnly(), but can be 421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // formatted. An error will be raised if formatting failed anyway. 422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event.canExecute = removable; 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.command.setHidden(!removable); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initiates new folder creation. 4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['new-folder'] = { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) execute: function(event, fileManager) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fileManager.createNewFolder(); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) canExecute: function(event, fileManager) { 4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var directoryModel = fileManager.directoryModel; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.canExecute = !fileManager.isOnReadonlyDirectory() && 438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !fileManager.isRenamingInProgress() && 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !directoryModel.isSearching() && 440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !directoryModel.isScanning(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Initiates new window creation. 4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['new-window'] = { 4494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) execute: function(event, fileManager) { 4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fileManager.backgroundPage.launchFileManager({ 4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) defaultPath: fileManager.getCurrentDirectory() 452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canExecute: function(event, fileManager) { 4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event.canExecute = 4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fileManager.getCurrentDirectoryEntry() && 4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) (fileManager.dialogType === DialogType.FULL_PAGE); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Deletes selected files. 4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['delete'] = { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) execute: function(event, fileManager) { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fileManager.deleteSelection(); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canExecute: function(event, fileManager) { 470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) var allowDeletingWhileOffline = 471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) fileManager.directoryModel.getCurrentRootType() === RootType.DRIVE; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var selection = fileManager.getSelection(); 473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event.canExecute = (!fileManager.isOnReadonlyDirectory() || 474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) allowDeletingWhileOffline) && 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection && 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection.totalCount > 0; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pastes files from clipboard. 4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['paste'] = { 4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) execute: function() { 4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) document.execCommand(event.command.id); 4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }, 4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) canExecute: function(event, fileManager) { 4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var document = fileManager.document; 4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var fileTransferController = fileManager.fileTransferController; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.canExecute = (fileTransferController && 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fileTransferController.queryPasteCommandEnabled()); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['cut'] = CommandUtil.defaultCommand; 4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['copy'] = CommandUtil.defaultCommand; 4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initiates file renaming. 5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['rename'] = { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) execute: function(event, fileManager) { 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fileManager.initiateRename(); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canExecute: function(event, fileManager) { 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var allowRenamingWhileOffline = 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fileManager.directoryModel.getCurrentRootType() === RootType.DRIVE; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var selection = fileManager.getSelection(); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.canExecute = 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !fileManager.isRenamingInProgress() && 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (!fileManager.isOnReadonlyDirectory() || allowRenamingWhileOffline) && 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection && 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection.totalCount == 1; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Opens drive help. 5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-help'] = { 5244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) execute: function(event, fileManager) { 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (fileManager.isOnDrive()) 526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) util.visitURL(str('GOOGLE_DRIVE_HELP_URL')); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) util.visitURL(str('FILES_APP_HELP_URL')); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch canExecute: CommandUtil.canExecuteAlways 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Opens drive buy-more-space url. 5354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['drive-buy-more-space'] = { 5384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) execute: function(event, fileManager) { 539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) util.visitURL(str('GOOGLE_DRIVE_BUY_STORAGE_URL')); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canExecute: CommandUtil.canExecuteVisibleOnDriveOnly 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Opens drive.google.com. 5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['drive-go-to-drive'] = { 5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) execute: function(event, fileManager) { 550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) util.visitURL(str('GOOGLE_DRIVE_ROOT_URL')); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canExecute: CommandUtil.canExecuteVisibleOnDriveOnly 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Displays open with dialog for current selection. 5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['open-with'] = { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) execute: function(event, fileManager) { 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var tasks = fileManager.getSelection().tasks; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tasks) { 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tasks.showTaskPicker(fileManager.defaultTaskPicker, 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str('OPEN_WITH_BUTTON_LABEL'), 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) null, 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function(task) { 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tasks.execute(task.taskId); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canExecute: function(event, fileManager) { 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var tasks = fileManager.getSelection().tasks; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.canExecute = tasks && tasks.size() > 1; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Focuses search input box. 5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['search'] = { 5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) execute: function(event, fileManager) { 5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var element = fileManager.document.querySelector('#search-box input'); 584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) element.focus(); 5855e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) element.select(); 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canExecute: function(event, fileManager) { 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.canExecute = !fileManager.isRenamingInProgress(); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 593868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * Activates the n-th volume. 5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 5954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 5964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-1'] = 5974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CommandUtil.createVolumeSwitchCommand(1); 5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-2'] = 5994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CommandUtil.createVolumeSwitchCommand(2); 6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-3'] = 6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CommandUtil.createVolumeSwitchCommand(3); 6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-4'] = 6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CommandUtil.createVolumeSwitchCommand(4); 6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-5'] = 6054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CommandUtil.createVolumeSwitchCommand(5); 6064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-6'] = 6074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CommandUtil.createVolumeSwitchCommand(6); 6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-7'] = 6094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CommandUtil.createVolumeSwitchCommand(7); 6104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-8'] = 6114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CommandUtil.createVolumeSwitchCommand(8); 6124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['volume-switch-9'] = 6134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CommandUtil.createVolumeSwitchCommand(9); 614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/** 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Flips 'available offline' flag on the file. 6174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 6194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['toggle-pinned'] = { 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) execute: function(event, fileManager) { 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var pin = !event.command.checked; 622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch event.command.checked = pin; 6234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var entries = CommandUtil.getPinTargetEntries(); 624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch var currentEntry; 625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch var error = false; 626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch var steps = { 627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Pick an entry and pin it. 628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch start: function() { 629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Check if all the entries are pinned or not. 630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (entries.length == 0) 631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch currentEntry = entries.shift(); 633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome.fileBrowserPrivate.pinDriveFile( 634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch currentEntry.toURL(), 635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pin, 636eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch steps.entryPinned); 637eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, 638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Check the result of pinning 640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch entryPinned: function() { 641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Convert to boolean. 642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch error = !!chrome.runtime.lastError; 643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (error && pin) { 644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fileManager.metadataCache_.get( 645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch currentEntry, 'filesystem', steps.showError); 646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fileManager.metadataCache_.clear(currentEntry, 'drive'); 648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fileManager.metadataCache_.get( 649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch currentEntry, 'drive', steps.updateUI.bind(this)); 650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, 651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 652eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Update the user interface accoding to the cache state. 653eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch updateUI: function(drive) { 654eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fileManager.updateMetadataInUI_( 655eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 'drive', [currentEntry.toURL()], [drive]); 656eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!error) 657eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch steps.start(); 658eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, 659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Show the error 661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch showError: function(filesystem) { 662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fileManager.alert.showHtml(str('DRIVE_OUT_OF_SPACE_HEADER'), 663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch strf('DRIVE_OUT_OF_SPACE_MESSAGE', 664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unescape(currentEntry.name), 665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch util.bytesToString(filesystem.size))); 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch steps.start(); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch canExecute: function(event, fileManager) { 6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var entries = CommandUtil.getPinTargetEntries(); 673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch var checked = true; 674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (var i = 0; i < entries.length; i++) { 675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch checked = checked && entries[i].pinned; 676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (entries.length > 0) { 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.canExecute = true; 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.command.setHidden(false); 680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch event.command.checked = checked; 681eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch event.canExecute = false; 683eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch event.command.setHidden(true); 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Creates zip file for current selection. 6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 6924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['zip-selection'] = { 6934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) execute: function(event, fileManager) { 6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var dirEntry = fileManager.getCurrentDirectoryEntry(); 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var selectionEntries = fileManager.getSelection().entries; 696424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) fileManager.fileOperationManager_.zipSelection(dirEntry, selectionEntries); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canExecute: function(event, fileManager) { 6994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) var dirEntry = fileManager.getCurrentDirectoryEntry(); 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var selection = fileManager.getSelection(); 7014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event.canExecute = 7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dirEntry && 7034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) !fileManager.isOnReadonlyDirectory() && 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !fileManager.isOnDrive() && 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) selection && selection.totalCount > 0; 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 708eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 709eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/** 710eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Shows the share dialog for the current selection (single only). 7114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 712eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['share'] = { 714eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch execute: function(event, fileManager) { 715eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fileManager.shareSelection(); 716eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, 717eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch canExecute: function(event, fileManager) { 718eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch var selection = fileManager.getSelection(); 719eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch event.canExecute = fileManager.isOnDrive() && 720eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch !fileManager.isDriveOffline() && 721bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch selection && selection.totalCount == 1; 722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch event.command.setHidden(!fileManager.isOnDrive()); 723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/** 727bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch * Creates a shortcut of the selected folder (single only). 7284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 7297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */ 7304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['create-folder-shortcut'] = { 7317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch /** 7327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @param {Event} event Command event. 7337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @param {FileManager} fileManager The file manager instance. 7347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */ 7357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch execute: function(event, fileManager) { 7363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var entry = CommandUtil.getCommandEntry(event.target); 7373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (entry) 7383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) fileManager.createFolderShortcut(entry.fullPath); 7397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }, 740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch /** 7427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @param {Event} event Command event. 7437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @param {FileManager} fileManager The file manager instance. 7447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */ 7457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch canExecute: function(event, fileManager) { 7463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var entry = CommandUtil.getCommandEntry(event.target); 7473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var folderShortcutExists = entry && 7483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) fileManager.folderShortcutExists(entry.fullPath); 749a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 750a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) var onlyOneFolderSelected = true; 751a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Only on list, user can select multiple files. The command is enabled only 752a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // when a single file is selected. 7533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (event.target instanceof cr.ui.List && 7543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) !(event.target instanceof NavigationList)) { 755a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) var items = event.target.selectedItems; 756a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) onlyOneFolderSelected = (items.length == 1 && items[0].isDirectory); 757a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 758a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var eligible = entry && 7603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PathUtil.isEligibleForFolderShortcut(entry.fullPath); 761a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) event.canExecute = 762a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) eligible && onlyOneFolderSelected && !folderShortcutExists; 763bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch event.command.setHidden(!eligible || !onlyOneFolderSelected); 7647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 7657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 7667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/** 768bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch * Removes the folder shortcut. 7694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 7707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */ 7714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['remove-folder-shortcut'] = { 7727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch /** 7737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @param {Event} event Command event. 7747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @param {FileManager} fileManager The file manager instance. 7757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */ 776a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) execute: function(event, fileManager) { 7773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var entry = CommandUtil.getCommandEntry(event.target); 77858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (entry && entry.fullPath) 77958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fileManager.removeFolderShortcut(entry.fullPath); 7807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }, 781a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch /** 7837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @param {Event} event Command event. 7847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @param {FileManager} fileManager The file manager instance. 7857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */ 786a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) canExecute: function(event, fileManager) { 787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) var entry = CommandUtil.getCommandEntry(event.target); 78858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) var path = entry && entry.fullPath; 789424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 790424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) var eligible = path && PathUtil.isEligibleForFolderShortcut(path); 791424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) var isShortcut = path && fileManager.folderShortcutExists(path); 792a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) event.canExecute = isShortcut && eligible; 793bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch event.command.setHidden(!event.canExecute); 7947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 7957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 7967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/** 798eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Zoom in to the Files.app. 7994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 800eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 8014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['zoom-in'] = { 8024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) execute: function(event, fileManager) { 803eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome.fileBrowserPrivate.zoom('in'); 804eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, 805eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch canExecute: CommandUtil.canExecuteAlways 806eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 807eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 808eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/** 809eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Zoom out from the Files.app. 8104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 811eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 8124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['zoom-out'] = { 8134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) execute: function(event, fileManager) { 814eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome.fileBrowserPrivate.zoom('out'); 815eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, 816eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch canExecute: CommandUtil.canExecuteAlways 817eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 818eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 819eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/** 820eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Reset the zoom factor. 8214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {Command} 822eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 8234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CommandHandler.COMMANDS_['zoom-reset'] = { 8244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) execute: function(event, fileManager) { 825eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch chrome.fileBrowserPrivate.zoom('reset'); 826eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }, 827eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch canExecute: CommandUtil.canExecuteAlways 828eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 829