#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"
#include "ui/views/widget/widget.h"
using base::UserMetricsAction;
+using bookmarks::BookmarkNodeData;
using content::PageNavigator;
using views::MenuItemView;
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_);
return BookmarkModelFactory::GetForProfile(profile_);
}
+ChromeBookmarkClient* BookmarkMenuDelegate::GetChromeBookmarkClient() {
+ return ChromeBookmarkClientFactory::GetForProfile(profile_);
+}
+
void BookmarkMenuDelegate::SetActiveMenu(const BookmarkNode* node,
int start_index) {
DCHECK(!parent_menu_item_);
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,
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;
}
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) {
}
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,