Index: chrome/browser/resources/md_bookmarks/command_manager.js |
diff --git a/chrome/browser/resources/md_bookmarks/command_manager.js b/chrome/browser/resources/md_bookmarks/command_manager.js |
index f0b37bf7c7c1157d3f385e5842f8d67729da42e6..fefe8a6628c8c4562e768983afc2fad6ed5cb831 100644 |
--- a/chrome/browser/resources/md_bookmarks/command_manager.js |
+++ b/chrome/browser/resources/md_bookmarks/command_manager.js |
@@ -22,7 +22,7 @@ cr.define('bookmarks', function() { |
value: function() { |
return [ |
Command.EDIT, |
- Command.COPY, |
+ Command.COPY_URL, |
Command.DELETE, |
// <hr> |
Command.OPEN_NEW_TAB, |
@@ -78,7 +78,6 @@ cr.define('bookmarks', function() { |
this.shortcuts_ = {}; |
this.addShortcut_(Command.EDIT, 'F2', 'Enter'); |
- this.addShortcut_(Command.COPY, 'Ctrl|c', 'Meta|c'); |
this.addShortcut_(Command.DELETE, 'Delete', 'Delete Backspace'); |
this.addShortcut_(Command.OPEN, 'Enter', 'Meta|ArrowDown Meta|o'); |
@@ -90,6 +89,10 @@ cr.define('bookmarks', function() { |
this.addShortcut_(Command.SELECT_ALL, 'Ctrl|a', 'Meta|a'); |
this.addShortcut_(Command.DESELECT_ALL, 'Escape'); |
+ |
+ this.addShortcut_(Command.CUT, 'Ctrl|x', 'Meta|x'); |
+ this.addShortcut_(Command.COPY, 'Ctrl|c', 'Meta|c'); |
+ this.addShortcut_(Command.PASTE, 'Ctrl|v', 'Meta|v'); |
}, |
detached: function() { |
@@ -155,6 +158,7 @@ cr.define('bookmarks', function() { |
* @return {boolean} |
*/ |
canExecute: function(command, itemIds) { |
+ var state = this.getState(); |
switch (command) { |
case Command.OPEN: |
return itemIds.size > 0; |
@@ -164,6 +168,16 @@ cr.define('bookmarks', function() { |
case Command.SELECT_ALL: |
case Command.DESELECT_ALL: |
return true; |
+ case Command.COPY: |
+ return itemIds.size > 0; |
+ case Command.CUT: |
+ return itemIds.size > 0 && |
+ !this.containsMatchingNode_(itemIds, function(node) { |
+ return !bookmarks.util.canEditNode(state, node.id); |
+ }); |
+ case Command.PASTE: |
+ return state.search.term == '' && |
+ bookmarks.util.canReorderChildren(state, state.selectedFolder); |
default: |
return this.isCommandVisible_(command, itemIds) && |
this.isCommandEnabled_(command, itemIds); |
@@ -180,7 +194,7 @@ cr.define('bookmarks', function() { |
switch (command) { |
case Command.EDIT: |
return itemIds.size == 1 && this.globalCanEdit_; |
- case Command.COPY: |
+ case Command.COPY_URL: |
return this.isSingleBookmark_(itemIds); |
case Command.DELETE: |
return itemIds.size > 0 && this.globalCanEdit_; |
@@ -231,12 +245,22 @@ cr.define('bookmarks', function() { |
/** @type {!BookmarksEditDialogElement} */ (this.$.editDialog.get()) |
.showEditDialog(state.nodes[id]); |
break; |
+ case Command.COPY_URL: |
case Command.COPY: |
var idList = Array.from(itemIds); |
chrome.bookmarkManagerPrivate.copy(idList, function() { |
- bookmarks.ToastManager.getInstance().show( |
- loadTimeData.getString('toastUrlCopied'), false); |
- }); |
+ var labelPromise; |
+ if (command == Command.COPY_URL) { |
+ labelPromise = |
+ Promise.resolve(loadTimeData.getString('toastUrlCopied')); |
+ } else { |
+ labelPromise = cr.sendWithPromise( |
+ 'getPluralString', 'toastItemsCopied', idList.length); |
+ } |
+ |
+ this.showTitleToast_( |
+ labelPromise, state.nodes[idList[0]].title, false); |
+ }.bind(this)); |
break; |
case Command.DELETE: |
var idList = Array.from(this.minimizeDeletionSet_(itemIds)); |
@@ -244,16 +268,7 @@ cr.define('bookmarks', function() { |
var labelPromise = cr.sendWithPromise( |
'getPluralString', 'toastItemsDeleted', idList.length); |
chrome.bookmarkManagerPrivate.removeTrees(idList, function() { |
- labelPromise.then(function(label) { |
- var pieces = loadTimeData.getSubstitutedStringPieces(label, title) |
- .map(function(p) { |
- // Make the bookmark name collapsible. |
- p.collapsible = !!p.arg; |
- return p; |
- }); |
- bookmarks.ToastManager.getInstance().showForStringPieces( |
- pieces, true); |
- }.bind(this)); |
+ this.showTitleToast_(labelPromise, title, true); |
}.bind(this)); |
break; |
case Command.UNDO: |
@@ -288,6 +303,15 @@ cr.define('bookmarks', function() { |
case Command.DESELECT_ALL: |
this.dispatch(bookmarks.actions.deselectItems()); |
break; |
+ case Command.CUT: |
+ chrome.bookmarkManagerPrivate.cut(Array.from(itemIds)); |
+ break; |
+ case Command.PASTE: |
+ var selectedFolder = state.selectedFolder; |
+ var selectedItems = state.selection.items; |
+ chrome.bookmarkManagerPrivate.paste( |
+ selectedFolder, Array.from(selectedItems)); |
+ break; |
default: |
assert(false); |
} |
@@ -452,63 +476,6 @@ cr.define('bookmarks', function() { |
}); |
}, |
- /** |
- * @param {Event} e |
- * @private |
- */ |
- onOpenItemMenu_: function(e) { |
- if (e.detail.targetElement) { |
- this.openCommandMenuAtElement(e.detail.targetElement); |
- } else { |
- this.openCommandMenuAtPosition(e.detail.x, e.detail.y); |
- } |
- }, |
- |
- /** |
- * @param {Event} e |
- * @private |
- */ |
- onCommandClick_: function(e) { |
- this.handle( |
- e.currentTarget.getAttribute('command'), assert(this.menuIds_)); |
- this.closeCommandMenu(); |
- }, |
- |
- /** |
- * @param {!Event} e |
- * @private |
- */ |
- onKeydown_: function(e) { |
- var selection = this.getState().selection.items; |
- if (e.target == document.body) |
- this.handleKeyEvent(e, selection); |
- }, |
- |
- /** |
- * Close the menu on mousedown so clicks can propagate to the underlying UI. |
- * This allows the user to right click the list while a context menu is |
- * showing and get another context menu. |
- * @param {Event} e |
- * @private |
- */ |
- onMenuMousedown_: function(e) { |
- if (e.path[0] != this.$.dropdown.getIfExists()) |
- return; |
- |
- this.closeCommandMenu(); |
- }, |
- |
- /** @private */ |
- onOpenCancelTap_: function() { |
- this.$.openDialog.get().cancel(); |
- }, |
- |
- /** @private */ |
- onOpenConfirmTap_: function() { |
- this.confirmOpenCallback_(); |
- this.$.openDialog.get().close(); |
- }, |
- |
/** |
* @param {Command} command |
* @return {string} |
@@ -529,7 +496,7 @@ cr.define('bookmarks', function() { |
var itemUrl = this.getState().nodes[id].url; |
label = itemUrl ? 'menuEdit' : 'menuRename'; |
break; |
- case Command.COPY: |
+ case Command.COPY_URL: |
label = 'menuCopyURL'; |
break; |
case Command.DELETE: |
@@ -587,6 +554,89 @@ cr.define('bookmarks', function() { |
return command == Command.DELETE && |
(this.globalCanEdit_ || this.isSingleBookmark_(itemIds)); |
}, |
+ |
+ /** |
+ * Show a toast with a bookmark |title| inserted into a label, with the |
+ * title ellipsised if necessary. |
+ * @param {!Promise<string>} labelPromise Promise which resolves with the |
+ * label for the toast. |
+ * @param {string} title Bookmark title to insert. |
+ * @param {boolean} canUndo If true, shows an undo button in the toast. |
+ * @private |
+ */ |
+ showTitleToast_: function(labelPromise, title, canUndo) { |
+ labelPromise.then(function(label) { |
+ var pieces = loadTimeData.getSubstitutedStringPieces(label, title) |
+ .map(function(p) { |
+ // Make the bookmark name collapsible. |
+ p.collapsible = !!p.arg; |
+ return p; |
+ }); |
+ |
+ bookmarks.ToastManager.getInstance().showForStringPieces( |
+ pieces, canUndo); |
+ }); |
+ }, |
+ |
+ //////////////////////////////////////////////////////////////////////////// |
+ // Event handlers: |
+ |
+ /** |
+ * @param {Event} e |
+ * @private |
+ */ |
+ onOpenItemMenu_: function(e) { |
+ if (e.detail.targetElement) { |
+ this.openCommandMenuAtElement(e.detail.targetElement); |
+ } else { |
+ this.openCommandMenuAtPosition(e.detail.x, e.detail.y); |
+ } |
+ }, |
+ |
+ /** |
+ * @param {Event} e |
+ * @private |
+ */ |
+ onCommandClick_: function(e) { |
+ this.handle( |
+ e.currentTarget.getAttribute('command'), assert(this.menuIds_)); |
+ this.closeCommandMenu(); |
+ }, |
+ |
+ /** |
+ * @param {!Event} e |
+ * @private |
+ */ |
+ onKeydown_: function(e) { |
+ var selection = this.getState().selection.items; |
+ if (e.target == document.body) |
+ this.handleKeyEvent(e, selection); |
+ }, |
+ |
+ /** |
+ * Close the menu on mousedown so clicks can propagate to the underlying UI. |
+ * This allows the user to right click the list while a context menu is |
+ * showing and get another context menu. |
+ * @param {Event} e |
+ * @private |
+ */ |
+ onMenuMousedown_: function(e) { |
+ if (e.path[0] != this.$.dropdown.getIfExists()) |
+ return; |
+ |
+ this.closeCommandMenu(); |
+ }, |
+ |
+ /** @private */ |
+ onOpenCancelTap_: function() { |
+ this.$.openDialog.get().cancel(); |
+ }, |
+ |
+ /** @private */ |
+ onOpenConfirmTap_: function() { |
+ this.confirmOpenCallback_(); |
+ this.$.openDialog.get().close(); |
+ }, |
}); |
/** @private {bookmarks.CommandManager} */ |