summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfukino@chromium.org <fukino@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-02 05:33:02 +0000
committerfukino@chromium.org <fukino@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-02 05:33:02 +0000
commit01c9e98c700ce61cb779548416770a8c0ec454a1 (patch)
tree849da81b09805e7ba00979c3b5109708deeaa3cf
parent9ed48ca50c98ad40e5b42e086634d0ebad83cab8 (diff)
downloadchromium_src-01c9e98c700ce61cb779548416770a8c0ec454a1.zip
chromium_src-01c9e98c700ce61cb779548416770a8c0ec454a1.tar.gz
chromium_src-01c9e98c700ce61cb779548416770a8c0ec454a1.tar.bz2
Add context menu 'Paste into folder'.
The context menu named 'Paste' is changed to 'Paste into folder' when only one folder is selected. If this menu is selected, files in clipboard will be pasted into the selected folder. Note that even when only one folder is selected, if users press Ctrl+V, files in clipboard will be pasted into current(not selected) folder. BUG=301542 TEST=run browser_tests --gtest_filter=*FileManager* Review URL: https://codereview.chromium.org/268623004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@267759 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/app/chromeos_strings.grdp3
-rw-r--r--chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc2
-rw-r--r--ui/file_manager/file_manager/foreground/js/file_manager_commands.js54
-rw-r--r--ui/file_manager/file_manager/foreground/js/file_transfer_controller.js9
-rw-r--r--ui/file_manager/file_manager/main.html3
5 files changed, 65 insertions, 6 deletions
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index bcff7a7..ec99e95 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -429,6 +429,9 @@ Press any key to continue exploring.
<message name="IDS_FILE_BROWSER_PASTE_BUTTON_LABEL" desc="Button Label.">
Paste
</message>
+ <message name="IDS_FILE_BROWSER_PASTE_INTO_FOLDER_BUTTON_LABEL" desc="Menu item label, pasting files into the selected folder.">
+ Paste into folder
+ </message>
<message name="IDS_FILE_BROWSER_COPY_BUTTON_LABEL" desc="Button Label.">
Copy
</message>
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc
index 3b84c16..95ccaf0 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc
@@ -226,6 +226,8 @@ bool FileBrowserPrivateGetStringsFunction::RunSync() {
SET_STRING("RENAME_BUTTON_LABEL", IDS_FILE_BROWSER_RENAME_BUTTON_LABEL);
SET_STRING("DELETE_BUTTON_LABEL", IDS_FILE_BROWSER_DELETE_BUTTON_LABEL);
SET_STRING("PASTE_BUTTON_LABEL", IDS_FILE_BROWSER_PASTE_BUTTON_LABEL);
+ SET_STRING("PASTE_INTO_FOLDER_BUTTON_LABEL",
+ IDS_FILE_BROWSER_PASTE_INTO_FOLDER_BUTTON_LABEL);
SET_STRING("COPY_BUTTON_LABEL", IDS_FILE_BROWSER_COPY_BUTTON_LABEL);
SET_STRING("CUT_BUTTON_LABEL", IDS_FILE_BROWSER_CUT_BUTTON_LABEL);
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
index c59b96e..732aa9b 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
@@ -224,6 +224,22 @@ CommandUtil.createVolumeSwitchCommand = function(index) {
};
/**
+ * Returns a directory entry when only one entry is selected and it is
+ * directory. Otherwise, returns null.
+ * @param {FileSelection} selection Instance of FileSelection.
+ * @return {?DirectoryEntry} Directory entry which is selected alone.
+ */
+CommandUtil.getOnlyOneSelectedDirectory = function(selection) {
+ if (!selection)
+ return null;
+ if (selection.totalCount !== 1)
+ return null;
+ if (!selection.entries[0].isDirectory)
+ return null;
+ return selection.entries[0];
+};
+
+/**
* Handle of the command events.
* @param {FileManager} fileManager FileManager.
* @constructor
@@ -495,14 +511,46 @@ CommandHandler.COMMANDS_['delete'] = {
* @type {Command}
*/
CommandHandler.COMMANDS_['paste'] = {
- execute: function() {
- document.execCommand(event.command.id);
+ execute: function(event, fileManager) {
+ fileManager.document.execCommand(event.command.id);
+ },
+ canExecute: function(event, fileManager) {
+ var fileTransferController = fileManager.fileTransferController;
+ event.canExecute = (fileTransferController &&
+ fileTransferController.queryPasteCommandEnabled());
+ // Hide this command if only one folder is selected.
+ event.command.setHidden(!!CommandUtil.getOnlyOneSelectedDirectory(
+ fileManager.getSelection()));
+ }
+};
+
+/**
+ * Pastes files from clipboard into the selected folder.
+ * @type {Command}
+ */
+CommandHandler.COMMANDS_['paste-into-folder'] = {
+ execute: function(event, fileManager) {
+ var selection = fileManager.getSelection();
+ var dest = CommandUtil.getOnlyOneSelectedDirectory(selection);
+ if (!dest) return;
+
+ // This handler tweaks the Event object for 'paste' event so that
+ // the FileTransferController can distinguish this 'paste-into-folder'
+ // command and know the destination directory.
+ var handler = function(inEvent) {
+ inEvent.destDirectory = dest;
+ };
+ fileManager.document.addEventListener('paste', handler, true);
+ fileManager.document.execCommand('paste');
+ fileManager.document.removeEventListener('paste', handler, true);
},
canExecute: function(event, fileManager) {
- var document = fileManager.document;
var fileTransferController = fileManager.fileTransferController;
event.canExecute = (fileTransferController &&
fileTransferController.queryPasteCommandEnabled());
+ // Hide this command unless only one folder is selected.
+ event.command.setHidden(!CommandUtil.getOnlyOneSelectedDirectory(
+ fileManager.getSelection()));
}
};
diff --git a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
index f39f76b..bfff1f2 100644
--- a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
+++ b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
@@ -817,14 +817,17 @@ FileTransferController.prototype = {
* @this {FileTransferController}
*/
onPaste_: function(event) {
+ // If the event has destDirectory property, paste files into the directory.
+ // This occurs when the command fires from menu item 'Paste into folder'.
+ var destination = event.destDirectory || this.currentDirectoryContentEntry;
+
// Need to update here since 'beforepaste' doesn't fire.
if (!this.isDocumentWideEvent_() ||
- !this.canPasteOrDrop_(event.clipboardData,
- this.currentDirectoryContentEntry)) {
+ !this.canPasteOrDrop_(event.clipboardData, destination)) {
return;
}
event.preventDefault();
- var effect = this.paste(event.clipboardData);
+ var effect = this.paste(event.clipboardData, destination);
// On cut, we clear the clipboard after the file is pasted/moved so we don't
// try to move/delete the original file again.
diff --git a/ui/file_manager/file_manager/main.html b/ui/file_manager/file_manager/main.html
index 2263125..772b8a4 100644
--- a/ui/file_manager/file_manager/main.html
+++ b/ui/file_manager/file_manager/main.html
@@ -147,6 +147,8 @@
shortcut="U+0043-Ctrl">
<command id="paste" i18n-values="label:PASTE_BUTTON_LABEL"
shortcut="U+0056-Ctrl">
+ <command id="paste-into-folder"
+ i18n-values="label:PASTE_INTO_FOLDER_BUTTON_LABEL">
<command id="rename" i18n-values="label:RENAME_BUTTON_LABEL"
shortcut="Enter-Ctrl">
<command id="delete" shortcut="U+007F">
@@ -211,6 +213,7 @@
<menuitem command="#cut" visibleif="full-page"></menuitem>
<menuitem command="#copy" visibleif="full-page"></menuitem>
<menuitem command="#paste" visibleif="full-page"></menuitem>
+ <menuitem command="#paste-into-folder" visibleif="full-page"></menuitem>
<hr visibleif="full-page">
<menuitem command="#rename"></menuitem>
<menuitem command="#delete" i18n-content="DELETE_BUTTON_LABEL"></menuitem>