Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / bookmarks / bookmark_menu_delegate.cc
index f3f0712..68b0f32 100644 (file)
@@ -7,6 +7,8 @@
 #include "base/prefs/pref_service.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
+#include "chrome/browser/bookmarks/chrome_bookmark_client.h"
+#include "chrome/browser/bookmarks/chrome_bookmark_client_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/bookmarks/bookmark_drag_drop.h"
 #include "chrome/browser/ui/bookmarks/bookmark_utils.h"
 #include "chrome/browser/ui/views/bookmarks/bookmark_drag_drop_views.h"
 #include "chrome/browser/ui/views/event_utils.h"
 #include "chrome/common/pref_names.h"
-#include "components/bookmarks/core/browser/bookmark_model.h"
+#include "components/bookmarks/browser/bookmark_model.h"
 #include "content/public/browser/page_navigator.h"
 #include "content/public/browser/user_metrics.h"
 #include "grit/generated_resources.h"
 #include "grit/theme_resources.h"
 #include "grit/ui_resources.h"
 #include "ui/base/dragdrop/os_exchange_data.h"
-#include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/window_open_disposition.h"
 #include "ui/views/controls/button/menu_button.h"
@@ -31,6 +32,7 @@
 #include "ui/views/widget/widget.h"
 
 using base::UserMetricsAction;
+using bookmarks::BookmarkNodeData;
 using content::PageNavigator;
 using views::MenuItemView;
 
@@ -71,12 +73,23 @@ void BookmarkMenuDelegate::Init(views::MenuDelegate* real_delegate,
   location_ = location;
   if (parent) {
     parent_menu_item_ = parent;
+
+    // Add a separator if there are existing items in the menu, and if the
+    // current node has children. If |node| is the bookmark bar then the
+    // managed node is shown as its first child, if it's not empty.
+    BookmarkModel* model = GetBookmarkModel();
+    ChromeBookmarkClient* client = GetChromeBookmarkClient();
+    bool show_managed = show_options == SHOW_PERMANENT_FOLDERS &&
+                        node == model->bookmark_bar_node() &&
+                        !client->managed_node()->empty();
+    bool has_children =
+        (start_child_index < node->child_count()) || show_managed;
     int initial_count = parent->GetSubmenu() ?
         parent->GetSubmenu()->GetMenuItemCount() : 0;
-    if ((start_child_index < node->child_count()) &&
-        (initial_count > 0)) {
+    if (has_children && initial_count > 0)
       parent->AppendSeparator();
-    }
+    if (show_managed)
+      BuildMenuForManagedNode(parent, &next_menu_id_);
     BuildMenu(node, start_child_index, parent, &next_menu_id_);
     if (show_options == SHOW_PERMANENT_FOLDERS)
       BuildMenusForPermanentNodes(parent, &next_menu_id_);
@@ -95,6 +108,10 @@ BookmarkModel* BookmarkMenuDelegate::GetBookmarkModel() {
   return BookmarkModelFactory::GetForProfile(profile_);
 }
 
+ChromeBookmarkClient* BookmarkMenuDelegate::GetChromeBookmarkClient() {
+  return ChromeBookmarkClientFactory::GetForProfile(profile_);
+}
+
 void BookmarkMenuDelegate::SetActiveMenu(const BookmarkNode* node,
                                          int start_index) {
   DCHECK(!parent_menu_item_);
@@ -270,8 +287,9 @@ int BookmarkMenuDelegate::OnPerformDrop(
       break;
   }
 
+  bool copy = event.source_operations() == ui::DragDropTypes::DRAG_COPY;
   return chrome::DropBookmarks(profile_, drop_data_,
-                               drop_parent, index_to_drop_at);
+                               drop_parent, index_to_drop_at, copy);
 }
 
 bool BookmarkMenuDelegate::ShowContextMenu(MenuItemView* source,
@@ -409,8 +427,11 @@ MenuItemView* BookmarkMenuDelegate::CreateMenu(const BookmarkNode* parent,
   menu->SetCommand(next_menu_id_++);
   menu_id_to_node_map_[menu->GetCommand()] = parent;
   menu->set_has_icons(true);
+  bool show_permanent = show_options == SHOW_PERMANENT_FOLDERS;
+  if (show_permanent && parent == GetBookmarkModel()->bookmark_bar_node())
+    BuildMenuForManagedNode(menu, &next_menu_id_);
   BuildMenu(parent, start_child_index, menu, &next_menu_id_);
-  if (show_options == SHOW_PERMANENT_FOLDERS)
+  if (show_permanent)
     BuildMenusForPermanentNodes(menu, &next_menu_id_);
   return menu;
 }
@@ -420,14 +441,15 @@ void BookmarkMenuDelegate::BuildMenusForPermanentNodes(
     int* next_menu_id) {
   BookmarkModel* model = GetBookmarkModel();
   bool added_separator = false;
-  BuildMenuForPermanentNode(model->other_node(), menu, next_menu_id,
-                            &added_separator);
-  BuildMenuForPermanentNode(model->mobile_node(), menu, next_menu_id,
-                            &added_separator);
+  BuildMenuForPermanentNode(model->other_node(), IDR_BOOKMARK_BAR_FOLDER, menu,
+                            next_menu_id, &added_separator);
+  BuildMenuForPermanentNode(model->mobile_node(), IDR_BOOKMARK_BAR_FOLDER, menu,
+                            next_menu_id, &added_separator);
 }
 
 void BookmarkMenuDelegate::BuildMenuForPermanentNode(
     const BookmarkNode* node,
+    int icon_resource_id,
     MenuItemView* menu,
     int* next_menu_id,
     bool* added_separator) {
@@ -446,13 +468,23 @@ void BookmarkMenuDelegate::BuildMenuForPermanentNode(
   }
 
   ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
-  gfx::ImageSkia* folder_icon = rb->GetImageSkiaNamed(IDR_BOOKMARK_BAR_FOLDER);
+  gfx::ImageSkia* folder_icon = rb->GetImageSkiaNamed(icon_resource_id);
   MenuItemView* submenu = menu->AppendSubMenuWithIcon(
       id, node->GetTitle(), *folder_icon);
   BuildMenu(node, 0, submenu, next_menu_id);
   menu_id_to_node_map_[id] = node;
 }
 
+void BookmarkMenuDelegate::BuildMenuForManagedNode(
+    MenuItemView* menu,
+    int* next_menu_id) {
+  // Don't add a separator for this menu.
+  bool added_separator = true;
+  const BookmarkNode* node = GetChromeBookmarkClient()->managed_node();
+  BuildMenuForPermanentNode(node, IDR_BOOKMARK_BAR_FOLDER_MANAGED, menu,
+                            next_menu_id, &added_separator);
+}
+
 void BookmarkMenuDelegate::BuildMenu(const BookmarkNode* parent,
                                      int start_child_index,
                                      MenuItemView* menu,