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

Side by Side Diff: chrome/browser/ui/views/extensions/browser_action_overflow_menu_controller.cc

Issue 542493002: Cleanup BrowserActionsContainer a bit (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months 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
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 #include "chrome/browser/ui/views/extensions/browser_action_overflow_menu_contro ller.h" 5 #include "chrome/browser/ui/views/extensions/browser_action_overflow_menu_contro ller.h"
6 6
7 #include "base/message_loop/message_loop.h" 7 #include "base/message_loop/message_loop.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/browser/extensions/extension_action.h" 9 #include "chrome/browser/extensions/extension_action.h"
10 #include "chrome/browser/extensions/extension_action_manager.h"
11 #include "chrome/browser/extensions/extension_context_menu_model.h" 10 #include "chrome/browser/extensions/extension_context_menu_model.h"
11 #include "chrome/browser/extensions/extension_toolbar_model.h"
12 #include "chrome/browser/profiles/profile.h" 12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/ui/browser.h"
13 #include "chrome/browser/ui/browser_list.h" 14 #include "chrome/browser/ui/browser_list.h"
14 #include "chrome/browser/ui/views/extensions/browser_action_drag_data.h" 15 #include "chrome/browser/ui/views/extensions/browser_action_drag_data.h"
15 #include "chrome/browser/ui/views/toolbar/browser_action_view.h" 16 #include "chrome/browser/ui/views/toolbar/browser_action_view.h"
16 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h" 17 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
18 #include "extensions/browser/extension_registry.h"
17 #include "extensions/common/extension.h" 19 #include "extensions/common/extension.h"
18 #include "ui/gfx/canvas.h" 20 #include "extensions/common/extension_set.h"
19 #include "ui/views/controls/menu/menu_item_view.h" 21 #include "ui/views/controls/menu/menu_item_view.h"
20 #include "ui/views/controls/menu/menu_runner.h" 22 #include "ui/views/controls/menu/menu_runner.h"
21 #include "ui/views/controls/menu/submenu_view.h"
22 #include "ui/views/widget/widget.h"
23 23
24 // In the browser actions container's chevron menu, a menu item view's icon 24 // In the browser actions container's chevron menu, a menu item view's icon
25 // comes from BrowserActionView::GetIconWithBadge() when the menu item view is 25 // comes from BrowserActionView::GetIconWithBadge() when the menu item view is
26 // created. But, the browser action's icon may not be loaded in time because it 26 // created. But, the browser action's icon may not be loaded in time because it
27 // is read from file system in another thread. 27 // is read from file system in another thread.
28 // The IconUpdater will update the menu item view's icon when the browser 28 // The IconUpdater will update the menu item view's icon when the browser
29 // action's icon has been updated. 29 // action's icon has been updated.
30 class IconUpdater : public BrowserActionView::IconObserver { 30 class IconUpdater : public BrowserActionView::IconObserver {
31 public: 31 public:
32 IconUpdater(views::MenuItemView* menu_item_view, BrowserActionView* view) 32 IconUpdater(views::MenuItemView* menu_item_view, BrowserActionView* view)
(...skipping 28 matching lines...) Expand all
61 Browser* browser, 61 Browser* browser,
62 views::MenuButton* menu_button, 62 views::MenuButton* menu_button,
63 const std::vector<BrowserActionView*>& views, 63 const std::vector<BrowserActionView*>& views,
64 int start_index, 64 int start_index,
65 bool for_drop) 65 bool for_drop)
66 : owner_(owner), 66 : owner_(owner),
67 browser_(browser), 67 browser_(browser),
68 observer_(NULL), 68 observer_(NULL),
69 menu_button_(menu_button), 69 menu_button_(menu_button),
70 menu_(NULL), 70 menu_(NULL),
71 views_(&views), 71 views_(views),
72 start_index_(start_index), 72 start_index_(start_index),
73 for_drop_(for_drop) { 73 for_drop_(for_drop) {
74 menu_ = new views::MenuItemView(this); 74 menu_ = new views::MenuItemView(this);
75 menu_runner_.reset(new views::MenuRunner( 75 menu_runner_.reset(new views::MenuRunner(
76 menu_, for_drop_ ? views::MenuRunner::FOR_DROP : 0)); 76 menu_, for_drop_ ? views::MenuRunner::FOR_DROP : 0));
77 menu_->set_has_icons(true); 77 menu_->set_has_icons(true);
78 78
79 size_t command_id = 1; // Menu id 0 is reserved, start with 1. 79 size_t command_id = 1; // Menu id 0 is reserved, start with 1.
80 for (size_t i = start_index; i < views_->size(); ++i) { 80 for (size_t i = start_index; i < views_.size(); ++i) {
81 BrowserActionView* view = (*views_)[i]; 81 BrowserActionView* view = views_[i];
82 views::MenuItemView* menu_item = menu_->AppendMenuItemWithIcon( 82 views::MenuItemView* menu_item = menu_->AppendMenuItemWithIcon(
83 command_id, 83 command_id,
84 base::UTF8ToUTF16(view->extension()->name()), 84 base::UTF8ToUTF16(view->extension()->name()),
85 view->GetIconWithBadge()); 85 view->GetIconWithBadge());
86 86
87 // Set the tooltip for this item. 87 // Set the tooltip for this item.
88 base::string16 tooltip = base::UTF8ToUTF16( 88 base::string16 tooltip = base::UTF8ToUTF16(
89 view->extension_action()->GetTitle( 89 view->extension_action()->GetTitle(
90 view->view_controller()->GetCurrentTabId())); 90 view->view_controller()->GetCurrentTabId()));
91 menu_->SetTooltip(tooltip, command_id); 91 menu_->SetTooltip(tooltip, command_id);
(...skipping 30 matching lines...) Expand all
122 122
123 void BrowserActionOverflowMenuController::CancelMenu() { 123 void BrowserActionOverflowMenuController::CancelMenu() {
124 menu_->Cancel(); 124 menu_->Cancel();
125 } 125 }
126 126
127 void BrowserActionOverflowMenuController::NotifyBrowserActionViewsDeleting() { 127 void BrowserActionOverflowMenuController::NotifyBrowserActionViewsDeleting() {
128 icon_updaters_.clear(); 128 icon_updaters_.clear();
129 } 129 }
130 130
131 bool BrowserActionOverflowMenuController::IsCommandEnabled(int id) const { 131 bool BrowserActionOverflowMenuController::IsCommandEnabled(int id) const {
132 BrowserActionView* view = (*views_)[start_index_ + id - 1]; 132 BrowserActionView* view = views_[start_index_ + id - 1];
133 return view->IsEnabled(view->view_controller()->GetCurrentTabId()); 133 return view->IsEnabled(view->view_controller()->GetCurrentTabId());
134 } 134 }
135 135
136 void BrowserActionOverflowMenuController::ExecuteCommand(int id) { 136 void BrowserActionOverflowMenuController::ExecuteCommand(int id) {
137 (*views_)[start_index_ + id - 1]->view_controller()->ExecuteActionByUser(); 137 views_[start_index_ + id - 1]->view_controller()->ExecuteActionByUser();
138 } 138 }
139 139
140 bool BrowserActionOverflowMenuController::ShowContextMenu( 140 bool BrowserActionOverflowMenuController::ShowContextMenu(
141 views::MenuItemView* source, 141 views::MenuItemView* source,
142 int id, 142 int id,
143 const gfx::Point& p, 143 const gfx::Point& p,
144 ui::MenuSourceType source_type) { 144 ui::MenuSourceType source_type) {
145 BrowserActionView* view = (*views_)[start_index_ + id - 1]; 145 BrowserActionView* view = views_[start_index_ + id - 1];
146 if (!view->extension()->ShowConfigureContextMenus()) 146 if (!view->extension()->ShowConfigureContextMenus())
147 return false; 147 return false;
148 148
149 scoped_refptr<ExtensionContextMenuModel> context_menu_contents = 149 scoped_refptr<ExtensionContextMenuModel> context_menu_contents =
150 new ExtensionContextMenuModel( 150 new ExtensionContextMenuModel(
151 view->extension(), browser_, view->view_controller()); 151 view->extension(), browser_, view->view_controller());
152 views::MenuRunner context_menu_runner(context_menu_contents.get(), 152 views::MenuRunner context_menu_runner(context_menu_contents.get(),
153 views::MenuRunner::HAS_MNEMONICS | 153 views::MenuRunner::HAS_MNEMONICS |
154 views::MenuRunner::IS_NESTED | 154 views::MenuRunner::IS_NESTED |
155 views::MenuRunner::CONTEXT_MENU); 155 views::MenuRunner::CONTEXT_MENU);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 } 212 }
213 213
214 int BrowserActionOverflowMenuController::OnPerformDrop( 214 int BrowserActionOverflowMenuController::OnPerformDrop(
215 views::MenuItemView* menu, 215 views::MenuItemView* menu,
216 DropPosition position, 216 DropPosition position,
217 const ui::DropTargetEvent& event) { 217 const ui::DropTargetEvent& event) {
218 BrowserActionDragData drop_data; 218 BrowserActionDragData drop_data;
219 if (!drop_data.Read(event.data())) 219 if (!drop_data.Read(event.data()))
220 return ui::DragDropTypes::DRAG_NONE; 220 return ui::DragDropTypes::DRAG_NONE;
221 221
222 size_t drop_index; 222 size_t drop_index = IndexForId(menu->GetCommand());
223 ViewForId(menu->GetCommand(), &drop_index);
224 223
225 // When not dragging within the overflow menu (dragging an icon into the menu) 224 // When not dragging within the overflow menu (dragging an icon into the menu)
226 // subtract one to get the right index. 225 // subtract one to get the right index.
227 if (position == DROP_BEFORE && 226 if (position == DROP_BEFORE &&
228 drop_data.index() < owner_->VisibleBrowserActions()) 227 drop_data.index() < owner_->VisibleBrowserActions())
229 --drop_index; 228 --drop_index;
230 229
231 owner_->MoveBrowserAction(drop_data.id(), drop_index); 230 const extensions::Extension* extension =
231 extensions::ExtensionRegistry::Get(browser_->profile())->
232 enabled_extensions().GetByID(drop_data.id());
233 extensions::ExtensionToolbarModel::Get(browser_->profile())->
234 MoveExtensionIcon(extension, drop_index);
232 235
233 if (for_drop_) 236 if (for_drop_)
234 delete this; 237 delete this;
235 return ui::DragDropTypes::DRAG_MOVE; 238 return ui::DragDropTypes::DRAG_MOVE;
236 } 239 }
237 240
238 bool BrowserActionOverflowMenuController::CanDrag(views::MenuItemView* menu) { 241 bool BrowserActionOverflowMenuController::CanDrag(views::MenuItemView* menu) {
239 return true; 242 return true;
240 } 243 }
241 244
242 void BrowserActionOverflowMenuController::WriteDragData( 245 void BrowserActionOverflowMenuController::WriteDragData(
243 views::MenuItemView* sender, OSExchangeData* data) { 246 views::MenuItemView* sender, OSExchangeData* data) {
244 size_t drag_index; 247 size_t drag_index = IndexForId(sender->GetCommand());
245 BrowserActionView* view = ViewForId(sender->GetCommand(), &drag_index); 248 const extensions::Extension* extension = views_[drag_index]->extension();
246 BrowserActionDragData drag_data(view->extension()->id(), drag_index); 249 BrowserActionDragData drag_data(extension->id(), drag_index);
247 drag_data.Write(owner_->profile(), data); 250 drag_data.Write(owner_->profile(), data);
248 } 251 }
249 252
250 int BrowserActionOverflowMenuController::GetDragOperations( 253 int BrowserActionOverflowMenuController::GetDragOperations(
251 views::MenuItemView* sender) { 254 views::MenuItemView* sender) {
252 return ui::DragDropTypes::DRAG_MOVE; 255 return ui::DragDropTypes::DRAG_MOVE;
253 } 256 }
254 257
255 BrowserActionView* BrowserActionOverflowMenuController::ViewForId( 258 size_t BrowserActionOverflowMenuController::IndexForId(int id) const {
256 int id, size_t* index) {
257 // The index of the view being dragged (GetCommand gives a 1-based index into 259 // The index of the view being dragged (GetCommand gives a 1-based index into
258 // the overflow menu). 260 // the overflow menu).
259 size_t view_index = owner_->VisibleBrowserActions() + id - 1; 261 return owner_->VisibleBrowserActions() + id - 1;
sky 2014/09/04 17:53:33 DCHECK_GT(owner_->VisibleBrowserActions() + id, 0u
260 if (index)
261 *index = view_index;
262 return owner_->GetBrowserActionViewAt(view_index);
263 } 262 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698