| Index: chrome/browser/ui/views/wrench_menu.cc
|
| ===================================================================
|
| --- chrome/browser/ui/views/wrench_menu.cc (revision 86142)
|
| +++ chrome/browser/ui/views/wrench_menu.cc (working copy)
|
| @@ -9,8 +9,11 @@
|
| #include "base/string_number_conversions.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "chrome/app/chrome_command_ids.h"
|
| +#include "chrome/browser/bookmarks/bookmark_model.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/ui/browser.h"
|
| +#include "chrome/browser/ui/browser_window.h"
|
| +#include "chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h"
|
| #include "content/browser/tab_contents/tab_contents.h"
|
| #include "content/browser/user_metrics.h"
|
| #include "content/common/notification_observer.h"
|
| @@ -564,7 +567,9 @@
|
| WrenchMenu::WrenchMenu(Browser* browser)
|
| : browser_(browser),
|
| selected_menu_model_(NULL),
|
| - selected_index_(0) {
|
| + selected_index_(0),
|
| + bookmark_menu_(NULL),
|
| + first_bookmark_command_id_(0) {
|
| }
|
|
|
| void WrenchMenu::Init(ui::MenuModel* model) {
|
| @@ -574,6 +579,7 @@
|
| // so we get the taller menu style.
|
| int next_id = 1;
|
| PopulateMenu(root_.get(), model, &next_id);
|
| + first_bookmark_command_id_ = next_id + 1;
|
| }
|
|
|
| void WrenchMenu::RunMenu(views::MenuButton* host) {
|
| @@ -589,16 +595,114 @@
|
| root_->RunMenuAt(host->GetWindow()->GetNativeWindow(), host, bounds,
|
| base::i18n::IsRTL() ? MenuItemView::TOPLEFT : MenuItemView::TOPRIGHT,
|
| true);
|
| + if (bookmark_menu_delegate_.get()) {
|
| + BookmarkModel* model = browser_->profile()->GetBookmarkModel();
|
| + if (model)
|
| + model->RemoveObserver(this);
|
| + }
|
| if (selected_menu_model_)
|
| selected_menu_model_->ActivatedAt(selected_index_);
|
| }
|
|
|
| +std::wstring WrenchMenu::GetTooltipText(int id,
|
| + const gfx::Point& p) {
|
| + return is_bookmark_command(id) ?
|
| + bookmark_menu_delegate_->GetTooltipText(id, p) : std::wstring();
|
| +}
|
| +
|
| +bool WrenchMenu::IsTriggerableEvent(views::MenuItemView* menu,
|
| + const views::MouseEvent& e) {
|
| + return is_bookmark_command(menu->GetCommand()) ?
|
| + bookmark_menu_delegate_->IsTriggerableEvent(menu, e) :
|
| + MenuDelegate::IsTriggerableEvent(menu, e);
|
| +}
|
| +
|
| +bool WrenchMenu::GetDropFormats(
|
| + MenuItemView* menu,
|
| + int* formats,
|
| + std::set<ui::OSExchangeData::CustomFormat>* custom_formats) {
|
| + CreateBookmarkMenu();
|
| + return bookmark_menu_delegate_.get() &&
|
| + bookmark_menu_delegate_->GetDropFormats(menu, formats, custom_formats);
|
| +}
|
| +
|
| +bool WrenchMenu::AreDropTypesRequired(MenuItemView* menu) {
|
| + CreateBookmarkMenu();
|
| + return bookmark_menu_delegate_.get() &&
|
| + bookmark_menu_delegate_->AreDropTypesRequired(menu);
|
| +}
|
| +
|
| +bool WrenchMenu::CanDrop(MenuItemView* menu,
|
| + const ui::OSExchangeData& data) {
|
| + CreateBookmarkMenu();
|
| + return bookmark_menu_delegate_.get() &&
|
| + bookmark_menu_delegate_->CanDrop(menu, data);
|
| +}
|
| +
|
| +int WrenchMenu::GetDropOperation(
|
| + MenuItemView* item,
|
| + const views::DropTargetEvent& event,
|
| + DropPosition* position) {
|
| + return is_bookmark_command(item->GetCommand()) ?
|
| + bookmark_menu_delegate_->GetDropOperation(item, event, position) :
|
| + ui::DragDropTypes::DRAG_NONE;
|
| +}
|
| +
|
| +int WrenchMenu::OnPerformDrop(MenuItemView* menu,
|
| + DropPosition position,
|
| + const views::DropTargetEvent& event) {
|
| + if (!is_bookmark_command(menu->GetCommand()))
|
| + return ui::DragDropTypes::DRAG_NONE;
|
| +
|
| + int result = bookmark_menu_delegate_->OnPerformDrop(menu, position, event);
|
| + return result;
|
| +}
|
| +
|
| +bool WrenchMenu::ShowContextMenu(MenuItemView* source,
|
| + int id,
|
| + const gfx::Point& p,
|
| + bool is_mouse_gesture) {
|
| + return is_bookmark_command(id) ?
|
| + bookmark_menu_delegate_->ShowContextMenu(source, id, p,
|
| + is_mouse_gesture) :
|
| + false;
|
| +}
|
| +
|
| +bool WrenchMenu::CanDrag(MenuItemView* menu) {
|
| + return is_bookmark_command(menu->GetCommand()) ?
|
| + bookmark_menu_delegate_->CanDrag(menu) : false;
|
| +}
|
| +
|
| +void WrenchMenu::WriteDragData(MenuItemView* sender,
|
| + ui::OSExchangeData* data) {
|
| + DCHECK(is_bookmark_command(sender->GetCommand()));
|
| + return bookmark_menu_delegate_->WriteDragData(sender, data);
|
| +}
|
| +
|
| +int WrenchMenu::GetDragOperations(MenuItemView* sender) {
|
| + return is_bookmark_command(sender->GetCommand()) ?
|
| + bookmark_menu_delegate_->GetDragOperations(sender) :
|
| + MenuDelegate::GetDragOperations(sender);
|
| +}
|
| +
|
| +int WrenchMenu::GetMaxWidthForMenu(MenuItemView* menu) {
|
| + return is_bookmark_command(menu->GetCommand()) ?
|
| + bookmark_menu_delegate_->GetMaxWidthForMenu(menu) :
|
| + MenuDelegate::GetMaxWidthForMenu(menu);
|
| +}
|
| +
|
| bool WrenchMenu::IsItemChecked(int id) const {
|
| + if (!is_bookmark_command(id))
|
| + return false;
|
| +
|
| const Entry& entry = id_to_entry_.find(id)->second;
|
| return entry.first->IsItemCheckedAt(entry.second);
|
| }
|
|
|
| bool WrenchMenu::IsCommandEnabled(int id) const {
|
| + if (is_bookmark_command(id))
|
| + return true;
|
| +
|
| if (id == 0)
|
| return false; // The root item.
|
|
|
| @@ -611,7 +715,13 @@
|
| entry.first->IsEnabledAt(entry.second);
|
| }
|
|
|
| -void WrenchMenu::ExecuteCommand(int id) {
|
| +void WrenchMenu::ExecuteCommand(int id, int mouse_event_flags) {
|
| + if (is_bookmark_command(id)) {
|
| + bookmark_menu_delegate_->ExecuteCommand(id, mouse_event_flags);
|
| + return;
|
| + }
|
| +
|
| + // Not a bookmark
|
| const Entry& entry = id_to_entry_.find(id)->second;
|
| int command_id = entry.first->GetCommandIdAt(entry.second);
|
|
|
| @@ -626,6 +736,9 @@
|
| }
|
|
|
| bool WrenchMenu::GetAccelerator(int id, views::Accelerator* accelerator) {
|
| + if (is_bookmark_command(id))
|
| + return false;
|
| +
|
| const Entry& entry = id_to_entry_.find(id)->second;
|
| int command_id = entry.first->GetCommandIdAt(entry.second);
|
| if (command_id == IDC_CUT || command_id == IDC_ZOOM_MINUS) {
|
| @@ -642,6 +755,15 @@
|
| return true;
|
| }
|
|
|
| +void WrenchMenu::WillShowMenu(MenuItemView* menu) {
|
| + if (menu == bookmark_menu_)
|
| + CreateBookmarkMenu();
|
| +}
|
| +
|
| +void WrenchMenu::BookmarkModelChanged() {
|
| + root_->Cancel();
|
| +}
|
| +
|
| WrenchMenu::~WrenchMenu() {
|
| }
|
|
|
| @@ -658,23 +780,35 @@
|
| if (model->GetTypeAt(index) == MenuModel::TYPE_SUBMENU)
|
| PopulateMenu(item, model->GetSubmenuModelAt(index), next_id);
|
|
|
| - if (model->GetCommandIdAt(index) == IDC_CUT) {
|
| - DCHECK_EQ(MenuModel::TYPE_COMMAND, model->GetTypeAt(index));
|
| - DCHECK_LT(i + 2, max);
|
| - DCHECK_EQ(IDC_COPY, model->GetCommandIdAt(index + 1));
|
| - DCHECK_EQ(IDC_PASTE, model->GetCommandIdAt(index + 2));
|
| - item->SetTitle(UTF16ToWide(l10n_util::GetStringUTF16(IDS_EDIT2)));
|
| - item->AddChildView(
|
| - new CutCopyPasteView(this, model, index, index + 1, index + 2));
|
| - i += 2;
|
| - } else if (model->GetCommandIdAt(index) == IDC_ZOOM_MINUS) {
|
| - DCHECK_EQ(MenuModel::TYPE_COMMAND, model->GetTypeAt(index));
|
| - DCHECK_EQ(IDC_ZOOM_PLUS, model->GetCommandIdAt(index + 1));
|
| - DCHECK_EQ(IDC_FULLSCREEN, model->GetCommandIdAt(index + 2));
|
| - item->SetTitle(UTF16ToWide(l10n_util::GetStringUTF16(IDS_ZOOM_MENU2)));
|
| - item->AddChildView(
|
| - new ZoomView(this, model, index, index + 1, index + 2));
|
| - i += 2;
|
| + switch (model->GetCommandIdAt(index)) {
|
| + case IDC_CUT:
|
| + DCHECK_EQ(MenuModel::TYPE_COMMAND, model->GetTypeAt(index));
|
| + DCHECK_LT(i + 2, max);
|
| + DCHECK_EQ(IDC_COPY, model->GetCommandIdAt(index + 1));
|
| + DCHECK_EQ(IDC_PASTE, model->GetCommandIdAt(index + 2));
|
| + item->SetTitle(UTF16ToWide(l10n_util::GetStringUTF16(IDS_EDIT2)));
|
| + item->AddChildView(
|
| + new CutCopyPasteView(this, model, index, index + 1, index + 2));
|
| + i += 2;
|
| + break;
|
| +
|
| + case IDC_ZOOM_MINUS:
|
| + DCHECK_EQ(MenuModel::TYPE_COMMAND, model->GetTypeAt(index));
|
| + DCHECK_EQ(IDC_ZOOM_PLUS, model->GetCommandIdAt(index + 1));
|
| + DCHECK_EQ(IDC_FULLSCREEN, model->GetCommandIdAt(index + 2));
|
| + item->SetTitle(UTF16ToWide(l10n_util::GetStringUTF16(IDS_ZOOM_MENU2)));
|
| + item->AddChildView(
|
| + new ZoomView(this, model, index, index + 1, index + 2));
|
| + i += 2;
|
| + break;
|
| +
|
| + case IDC_BOOKMARKS_MENU:
|
| + DCHECK(!bookmark_menu_);
|
| + bookmark_menu_ = item;
|
| + break;
|
| +
|
| + default:
|
| + break;
|
| }
|
| }
|
| }
|
| @@ -708,3 +842,22 @@
|
| selected_index_ = index;
|
| root_->Cancel();
|
| }
|
| +
|
| +void WrenchMenu::CreateBookmarkMenu() {
|
| + if (bookmark_menu_delegate_.get())
|
| + return; // Already created the menu.
|
| +
|
| + BookmarkModel* model = browser_->profile()->GetBookmarkModel();
|
| + if (!model->IsLoaded())
|
| + return;
|
| +
|
| + model->AddObserver(this);
|
| + bookmark_menu_delegate_.reset(
|
| + new BookmarkMenuDelegate(browser_->profile(),
|
| + NULL,
|
| + browser_->window()->GetNativeHandle(),
|
| + first_bookmark_command_id_));
|
| + bookmark_menu_delegate_->Init(
|
| + this, bookmark_menu_, model->GetBookmarkBarNode(), 0,
|
| + BookmarkMenuDelegate::SHOW_OTHER_FOLDER);
|
| +}
|
|
|