OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |