Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: chrome/browser/resources/bookmark_manager/js/main.js

Issue 11411162: Adding new folder/page in selected folder on context menu/organize button (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 /** @const */ var BookmarkList = bmm.BookmarkList; 5 /** @const */ var BookmarkList = bmm.BookmarkList;
6 /** @const */ var BookmarkTree = bmm.BookmarkTree; 6 /** @const */ var BookmarkTree = bmm.BookmarkTree;
7 /** @const */ var Command = cr.ui.Command; 7 /** @const */ var Command = cr.ui.Command;
8 /** @const */ var CommandBinding = cr.ui.CommandBinding; 8 /** @const */ var CommandBinding = cr.ui.CommandBinding;
9 /** @const */ var LinkKind = cr.LinkKind; 9 /** @const */ var LinkKind = cr.LinkKind;
10 /** @const */ var ListItem = cr.ui.ListItem; 10 /** @const */ var ListItem = cr.ui.ListItem;
(...skipping 1469 matching lines...) Expand 10 before | Expand all | Expand 10 after
1480 arr.forEach(restoreTree); 1480 arr.forEach(restoreTree);
1481 }); 1481 });
1482 lastDeletedNodes = null; 1482 lastDeletedNodes = null;
1483 $('undo-delete-command').canExecuteChange(); 1483 $('undo-delete-command').canExecuteChange();
1484 1484
1485 // Only a single level of undo is supported, so disable global undo now. 1485 // Only a single level of undo is supported, so disable global undo now.
1486 performGlobalUndo = null; 1486 performGlobalUndo = null;
1487 } 1487 }
1488 1488
1489 /** 1489 /**
1490 * Computes folder for "Add Page" and "Add Folder".
1491 * @return {string} The id of folder node where we'll create new page/folder.
1492 */
1493 function computeParentFolderForNewItem() {
1494 if (document.activeElement == tree)
1495 return list.parentId;
1496 var selectedItem = list.selectedItem;
1497 return selectedItem && bmm.isFolder(selectedItem) ?
1498 selectedItem.id : list.parentId;
1499 }
1500
1501 /**
1490 * Callback for the new folder command. This creates a new folder and starts 1502 * Callback for the new folder command. This creates a new folder and starts
1491 * a rename of it. 1503 * a rename of it.
1492 */ 1504 */
1493 function newFolder() { 1505 function newFolder() {
1494 var parentId = list.parentId;
1495 var isTree = document.activeElement == tree;
1496 chrome.bookmarks.create({
1497 title: loadTimeData.getString('new_folder_name'),
1498 parentId: parentId
1499 }, function(newNode) {
1500 // This callback happens before the event that triggers the tree/list to
1501 // get updated so delay the work so that the tree/list gets updated first.
1502 setTimeout(function() {
1503 var newItem;
1504 if (isTree) {
1505 newItem = bmm.treeLookup[newNode.id];
1506 tree.selectedItem = newItem;
1507 newItem.editing = true;
1508 } else {
1509 var index = list.dataModel.findIndexById(newNode.id);
1510 var sm = list.selectionModel;
1511 sm.anchorIndex = sm.leadIndex = sm.selectedIndex = index;
1512 scrollIntoViewAndMakeEditable(index);
1513 }
1514 }, 50);
1515 });
1516 performGlobalUndo = null; // This can't be undone, so disable global undo. 1506 performGlobalUndo = null; // This can't be undone, so disable global undo.
1507
1508 var parentId = computeParentFolderForNewItem();
1509
1510 // Callback is called after tree and list data model updated.
1511 function createFolder(callback) {
1512 chrome.bookmarks.create({
1513 title: loadTimeData.getString('new_folder_name'),
1514 parentId: parentId
1515 }, callback);
1516 }
1517
1518 if (document.activeElement == tree) {
1519 createFolder(function(newNode) {
1520 newItem = bmm.treeLookup[newNode.id];
1521 tree.selectedItem = newItem;
1522 newItem.editing = true;
1523 });
1524 return;
1525 }
1526
1527 function editNewFolderInList() {
1528 createFolder(function() {
1529 var index = list.dataModel.length - 1;
1530 var sm = list.selectionModel;
1531 sm.anchorIndex = sm.leadIndex = sm.selectedIndex = index;
1532 scrollIntoViewAndMakeEditable(index);
1533 });
1534 }
1535
1536 if (parentId == list.parentId) {
1537 editNewFolderInList();
1538 return;
1539 }
1540
1541 addOneShotEventListener(list, 'load', editNewFolderInList);
1542 navigateTo(parentId, true);
1517 } 1543 }
1518 1544
1519 /** 1545 /**
1520 * Scrolls the list item into view and makes it editable. 1546 * Scrolls the list item into view and makes it editable.
1521 * @param {number} index The index of the item to make editable. 1547 * @param {number} index The index of the item to make editable.
1522 */ 1548 */
1523 function scrollIntoViewAndMakeEditable(index) { 1549 function scrollIntoViewAndMakeEditable(index) {
1524 list.scrollIndexIntoView(index); 1550 list.scrollIndexIntoView(index);
1525 // onscroll is now dispatched asynchronously so we have to postpone 1551 // onscroll is now dispatched asynchronously so we have to postpone
1526 // the rest. 1552 // the rest.
1527 setTimeout(function() { 1553 setTimeout(function() {
1528 var item = list.getListItemByIndex(index); 1554 var item = list.getListItemByIndex(index);
1529 if (item) 1555 if (item)
1530 item.editing = true; 1556 item.editing = true;
1531 }); 1557 });
1532 } 1558 }
1533 1559
1534 /** 1560 /**
1535 * Adds a page to the current folder. This is called by the 1561 * Adds a page to the current folder. This is called by the
1536 * add-new-bookmark-command handler. 1562 * add-new-bookmark-command handler.
1537 */ 1563 */
1538 function addPage() { 1564 function addPage() {
1539 var parentId = list.parentId; 1565 var parentId = computeParentFolderForNewItem();
1540 var fakeNode = { 1566
1541 title: '', 1567 function editNewBookmark() {
1542 url: '', 1568 var fakeNode = {
1543 parentId: parentId, 1569 title: '',
1544 id: 'new' 1570 url: '',
1571 parentId: parentId,
1572 id: 'new'
1573 };
1574 var dataModel = list.dataModel;
1575 var length = dataModel.length;
1576 dataModel.splice(length, 0, fakeNode);
1577 var sm = list.selectionModel;
1578 sm.anchorIndex = sm.leadIndex = sm.selectedIndex = length;
1579 scrollIntoViewAndMakeEditable(length);
1545 }; 1580 };
1546 1581
1547 var dataModel = list.dataModel; 1582 if (parentId == list.parentId) {
1548 var length = dataModel.length; 1583 editNewBookmark();
1549 dataModel.splice(length, 0, fakeNode); 1584 return;
1550 var sm = list.selectionModel; 1585 }
1551 sm.anchorIndex = sm.leadIndex = sm.selectedIndex = length; 1586
1552 scrollIntoViewAndMakeEditable(length); 1587 addOneShotEventListener(list, 'load', editNewBookmark);
1588 navigateTo(parentId, true);
arv (Not doing code reviews) 2012/11/26 14:50:44 Maybe we should have navigateTo take an optional c
1553 } 1589 }
1554 1590
1555 /** 1591 /**
1556 * This function is used to select items after a user action such as paste, drop 1592 * This function is used to select items after a user action such as paste, drop
1557 * add page etc. 1593 * add page etc.
1558 * @param {BookmarkList|BookmarkTree} target The target of the user action. 1594 * @param {BookmarkList|BookmarkTree} target The target of the user action.
1559 * @param {=string} opt_selectedTreeId If provided, then select that tree id. 1595 * @param {=string} opt_selectedTreeId If provided, then select that tree id.
1560 */ 1596 */
1561 function selectItemsAfterUserAction(target, opt_selectedTreeId) { 1597 function selectItemsAfterUserAction(target, opt_selectedTreeId) {
1562 // We get one onCreated event per item so we delay the handling until we get 1598 // We get one onCreated event per item so we delay the handling until we get
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1709 document.addEventListener('copy', handle('copy-command')); 1745 document.addEventListener('copy', handle('copy-command'));
1710 document.addEventListener('cut', handle('cut-command')); 1746 document.addEventListener('cut', handle('cut-command'));
1711 1747
1712 var pasteHandler = handle('paste-command'); 1748 var pasteHandler = handle('paste-command');
1713 document.addEventListener('paste', function(e) { 1749 document.addEventListener('paste', function(e) {
1714 // Paste is a bit special since we need to do an async call to see if we can 1750 // Paste is a bit special since we need to do an async call to see if we can
1715 // paste because the paste command might not be up to date. 1751 // paste because the paste command might not be up to date.
1716 updatePasteCommand(pasteHandler); 1752 updatePasteCommand(pasteHandler);
1717 }); 1753 });
1718 })(); 1754 })();
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698