OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 (function() { | 5 (function() { |
6 /** @const */ var BookmarkList = bmm.BookmarkList; | 6 /** @const */ var BookmarkList = bmm.BookmarkList; |
7 /** @const */ var BookmarkTree = bmm.BookmarkTree; | 7 /** @const */ var BookmarkTree = bmm.BookmarkTree; |
8 /** @const */ var Command = cr.ui.Command; | 8 /** @const */ var Command = cr.ui.Command; |
9 /** @const */ var CommandBinding = cr.ui.CommandBinding; | 9 /** @const */ var CommandBinding = cr.ui.CommandBinding; |
10 /** @const */ var LinkKind = cr.LinkKind; | 10 /** @const */ var LinkKind = cr.LinkKind; |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 searchTreeItem.label = loadTimeData.getString('search'); | 137 searchTreeItem.label = loadTimeData.getString('search'); |
138 searchTreeItem.icon = isRTL() ? 'images/bookmark_manager_search_rtl.png' : | 138 searchTreeItem.icon = isRTL() ? 'images/bookmark_manager_search_rtl.png' : |
139 'images/bookmark_manager_search.png'; | 139 'images/bookmark_manager_search.png'; |
140 } | 140 } |
141 | 141 |
142 /** | 142 /** |
143 * Updates the location hash to reflect the current state of the application. | 143 * Updates the location hash to reflect the current state of the application. |
144 */ | 144 */ |
145 function updateHash() { | 145 function updateHash() { |
146 window.location.hash = tree.selectedItem.bookmarkId; | 146 window.location.hash = tree.selectedItem.bookmarkId; |
147 updateAllCommands(); | |
148 } | 147 } |
149 | 148 |
150 /** | 149 /** |
151 * Navigates to a bookmark ID. | 150 * Navigates to a bookmark ID. |
152 * @param {string} id The ID to navigate to. | 151 * @param {string} id The ID to navigate to. |
153 * @param {function()} callback Function called when list view loaded or | 152 * @param {function()} callback Function called when list view loaded or |
154 * displayed specified folder. | 153 * displayed specified folder. |
155 */ | 154 */ |
156 function navigateTo(id, callback) { | 155 function navigateTo(id, callback) { |
157 updateHash(id); | 156 updateHash(id); |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 return urlsPromise; | 352 return urlsPromise; |
354 } | 353 } |
355 | 354 |
356 /** | 355 /** |
357 * Returns the nodes (non recursive) to use for the open commands. | 356 * Returns the nodes (non recursive) to use for the open commands. |
358 * @param {HTMLElement} target . | 357 * @param {HTMLElement} target . |
359 * @return {Array.<BookmarkTreeNode>} . | 358 * @return {Array.<BookmarkTreeNode>} . |
360 */ | 359 */ |
361 function getNodesForOpen(target) { | 360 function getNodesForOpen(target) { |
362 if (target == tree) { | 361 if (target == tree) { |
363 if (tree.selectedItem != searchTreeItem) | 362 var folderItem = tree.selectedItem; |
364 return tree.selectedFolders; | 363 return folderItem == searchTreeItem ? |
365 // Fall through to use all nodes in the list. | 364 list.dataModel.slice() : tree.selectedFolders; |
366 } else { | |
367 var items = list.selectedItems; | |
368 if (items.length) | |
369 return items; | |
370 } | 365 } |
371 | 366 var items = list.selectedItems; |
372 // The list starts off with a null dataModel. We can get here during startup. | 367 return items.length ? items : list.dataModel.slice(); |
373 if (!list.dataModel) | |
374 return []; | |
375 | |
376 // Return an array based on the dataModel. | |
377 return list.dataModel.slice(); | |
378 } | 368 } |
379 | 369 |
380 /** | 370 /** |
381 * Returns a promise that will contain all URLs of all the selected bookmarks | 371 * Returns a promise that will contain all URLs of all the selected bookmarks |
382 * and the nested bookmarks for use with the open commands. | 372 * and the nested bookmarks for use with the open commands. |
383 * @param {HTMLElement} target The target list or tree. | 373 * @param {HTMLElement} target The target list or tree. |
384 * @return {Promise} . | 374 * @return {Promise} . |
385 */ | 375 */ |
386 function getUrlsForOpenCommands(target) { | 376 function getUrlsForOpenCommands(target) { |
387 return getAllUrls(getNodesForOpen(target)); | 377 return getAllUrls(getNodesForOpen(target)); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 var command = e.command; | 440 var command = e.command; |
451 switch (command.id) { | 441 switch (command.id) { |
452 case 'import-menu-command': | 442 case 'import-menu-command': |
453 e.canExecute = canEdit; | 443 e.canExecute = canEdit; |
454 break; | 444 break; |
455 case 'export-menu-command': | 445 case 'export-menu-command': |
456 // We can always execute the export-menu command. | 446 // We can always execute the export-menu command. |
457 e.canExecute = true; | 447 e.canExecute = true; |
458 break; | 448 break; |
459 case 'sort-command': | 449 case 'sort-command': |
460 e.canExecute = !list.isSearch() && | 450 e.canExecute = !list.isSearch() && list.dataModel.length > 1; |
461 list.dataModel && list.dataModel.length > 1; | |
462 break; | 451 break; |
463 case 'undo-command': | 452 case 'undo-command': |
464 // The global undo command has no visible UI, so always enable it, and | 453 // The global undo command has no visible UI, so always enable it, and |
465 // just make it a no-op if undo is not possible. | 454 // just make it a no-op if undo is not possible. |
466 e.canExecute = true; | 455 e.canExecute = true; |
467 break; | 456 break; |
468 default: | 457 default: |
469 canExecuteForList(e); | 458 canExecuteForList(e); |
470 break; | 459 break; |
471 } | 460 } |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 case 'copy-command': | 628 case 'copy-command': |
640 e.canExecute = hasSelected() && !isTopLevelItem(); | 629 e.canExecute = hasSelected() && !isTopLevelItem(); |
641 break; | 630 break; |
642 | 631 |
643 default: | 632 default: |
644 canExecuteShared(e, isSearch()); | 633 canExecuteShared(e, isSearch()); |
645 } | 634 } |
646 } | 635 } |
647 | 636 |
648 /** | 637 /** |
649 * Update the canExecute state of all the commands. | 638 * Update the canExecute state of the commands when the selection changes. |
| 639 * @param {Event} e The change event object. |
650 */ | 640 */ |
651 function updateAllCommands() { | 641 function updateCommandsBasedOnSelection(e) { |
652 var commands = document.querySelectorAll('command'); | 642 if (e.target == document.activeElement) { |
653 for (var i = 0; i < commands.length; i++) { | 643 // Paste only needs to be updated when the tree selection changes. |
654 commands[i].canExecuteChange(); | 644 var commandNames = ['copy', 'cut', 'delete', 'rename-folder', 'edit', |
| 645 'add-new-bookmark', 'new-folder', 'open-in-new-tab', |
| 646 'open-in-background-tab', 'open-in-new-window', 'open-incognito-window', |
| 647 'open-in-same-window', 'show-in-folder']; |
| 648 |
| 649 if (e.target == tree) { |
| 650 commandNames.push('paste-from-context-menu', 'paste-from-organize-menu', |
| 651 'sort'); |
| 652 } |
| 653 |
| 654 commandNames.forEach(function(baseId) { |
| 655 $(baseId + '-command').canExecuteChange(); |
| 656 }); |
655 } | 657 } |
656 } | 658 } |
657 | 659 |
658 function updateEditingCommands() { | 660 function updateEditingCommands() { |
659 var editingCommands = ['cut', 'delete', 'rename-folder', 'edit', | 661 var editingCommands = ['cut', 'delete', 'rename-folder', 'edit', |
660 'add-new-bookmark', 'new-folder', 'sort', | 662 'add-new-bookmark', 'new-folder', 'sort', |
661 'paste-from-context-menu', 'paste-from-organize-menu']; | 663 'paste-from-context-menu', 'paste-from-organize-menu']; |
662 | 664 |
663 chrome.bookmarkManagerPrivate.canEdit(function(result) { | 665 chrome.bookmarkManagerPrivate.canEdit(function(result) { |
664 if (result != canEdit) { | 666 if (result != canEdit) { |
665 canEdit = result; | 667 canEdit = result; |
666 editingCommands.forEach(function(baseId) { | 668 editingCommands.forEach(function(baseId) { |
667 $(baseId + '-command').canExecuteChange(); | 669 $(baseId + '-command').canExecuteChange(); |
668 }); | 670 }); |
669 } | 671 } |
670 }); | 672 }); |
671 } | 673 } |
672 | 674 |
673 function handleChangeForTree(e) { | 675 function handleChangeForTree(e) { |
674 updateAllCommands(); | 676 updateCommandsBasedOnSelection(e); |
675 navigateTo(tree.selectedItem.bookmarkId, updateHash); | 677 navigateTo(tree.selectedItem.bookmarkId, updateHash); |
676 } | 678 } |
677 | 679 |
678 function handleOrganizeButtonClick(e) { | 680 function handleOrganizeButtonClick(e) { |
679 updateEditingCommands(); | 681 updateEditingCommands(); |
680 $('add-new-bookmark-command').canExecuteChange(); | 682 $('add-new-bookmark-command').canExecuteChange(); |
681 $('new-folder-command').canExecuteChange(); | 683 $('new-folder-command').canExecuteChange(); |
682 $('sort-command').canExecuteChange(); | 684 $('sort-command').canExecuteChange(); |
683 } | 685 } |
684 | 686 |
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1208 splitter.addEventListener('resize', function(e) { | 1210 splitter.addEventListener('resize', function(e) { |
1209 localStorage['treeWidth'] = splitter.previousElementSibling.style.width; | 1211 localStorage['treeWidth'] = splitter.previousElementSibling.style.width; |
1210 }); | 1212 }); |
1211 } | 1213 } |
1212 | 1214 |
1213 function initializeBookmarkManager() { | 1215 function initializeBookmarkManager() { |
1214 // Sometimes the extension API is not initialized. | 1216 // Sometimes the extension API is not initialized. |
1215 if (!chrome.bookmarks) | 1217 if (!chrome.bookmarks) |
1216 console.error('Bookmarks extension API is not available'); | 1218 console.error('Bookmarks extension API is not available'); |
1217 | 1219 |
1218 chrome.bookmarkManagerPrivate.getStrings(continueInitializeBookmarkManager); | 1220 chrome.bookmarkManagerPrivate.getStrings(loadLocalizedStrings); |
1219 } | |
1220 | |
1221 function continueInitializeBookmarkManager(localizedStrings) { | |
1222 loadLocalizedStrings(localizedStrings); | |
1223 | 1221 |
1224 bmm.treeLookup[searchTreeItem.bookmarkId] = searchTreeItem; | 1222 bmm.treeLookup[searchTreeItem.bookmarkId] = searchTreeItem; |
1225 | 1223 |
1226 cr.ui.decorate('menu', Menu); | 1224 cr.ui.decorate('menu', Menu); |
1227 cr.ui.decorate('button[menu]', MenuButton); | 1225 cr.ui.decorate('button[menu]', MenuButton); |
1228 cr.ui.decorate('command', Command); | 1226 cr.ui.decorate('command', Command); |
1229 BookmarkList.decorate(list); | 1227 BookmarkList.decorate(list); |
1230 BookmarkTree.decorate(tree); | 1228 BookmarkTree.decorate(tree); |
1231 | 1229 |
1232 list.addEventListener('canceledit', handleCancelEdit); | 1230 list.addEventListener('canceledit', handleCancelEdit); |
1233 list.addEventListener('canExecute', handleCanExecuteForList); | 1231 list.addEventListener('canExecute', handleCanExecuteForList); |
1234 list.addEventListener('change', updateAllCommands); | 1232 list.addEventListener('change', updateCommandsBasedOnSelection); |
1235 list.addEventListener('contextmenu', updateEditingCommands); | 1233 list.addEventListener('contextmenu', updateEditingCommands); |
1236 list.addEventListener('dblclick', handleDoubleClickForList); | 1234 list.addEventListener('dblclick', handleDoubleClickForList); |
1237 list.addEventListener('edit', handleEdit); | 1235 list.addEventListener('edit', handleEdit); |
1238 list.addEventListener('rename', handleRename); | 1236 list.addEventListener('rename', handleRename); |
1239 list.addEventListener('urlClicked', handleUrlClickedForList); | 1237 list.addEventListener('urlClicked', handleUrlClickedForList); |
1240 | 1238 |
1241 tree.addEventListener('canExecute', handleCanExecuteForTree); | 1239 tree.addEventListener('canExecute', handleCanExecuteForTree); |
1242 tree.addEventListener('change', handleChangeForTree); | 1240 tree.addEventListener('change', handleChangeForTree); |
1243 tree.addEventListener('contextmenu', updateEditingCommands); | 1241 tree.addEventListener('contextmenu', updateEditingCommands); |
1244 tree.addEventListener('rename', handleRename); | 1242 tree.addEventListener('rename', handleRename); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1303 | 1301 |
1304 cr.ui.FocusOutlineManager.forDocument(document); | 1302 cr.ui.FocusOutlineManager.forDocument(document); |
1305 initializeSplitter(); | 1303 initializeSplitter(); |
1306 bmm.addBookmarkModelListeners(); | 1304 bmm.addBookmarkModelListeners(); |
1307 dnd.init(selectItemsAfterUserAction); | 1305 dnd.init(selectItemsAfterUserAction); |
1308 tree.reload(); | 1306 tree.reload(); |
1309 } | 1307 } |
1310 | 1308 |
1311 initializeBookmarkManager(); | 1309 initializeBookmarkManager(); |
1312 })(); | 1310 })(); |
OLD | NEW |