OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/bookmarks/bookmark_menu_controller_views.h" | 5 #include "chrome/browser/ui/views/bookmarks/bookmark_menu_controller_views.h" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
9 #include "chrome/browser/bookmarks/bookmark_model.h" | 9 #include "chrome/browser/bookmarks/bookmark_model.h" |
10 #include "chrome/browser/bookmarks/bookmark_node_data.h" | 10 #include "chrome/browser/bookmarks/bookmark_node_data.h" |
11 #include "chrome/browser/bookmarks/bookmark_utils.h" | 11 #include "chrome/browser/bookmarks/bookmark_utils.h" |
12 #include "chrome/browser/prefs/pref_service.h" | 12 #include "chrome/browser/prefs/pref_service.h" |
13 #include "chrome/browser/profiles/profile.h" | 13 #include "chrome/browser/profiles/profile.h" |
14 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" | 14 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" |
15 #include "chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h" | 15 #include "chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h" |
16 #include "chrome/browser/ui/views/event_utils.h" | 16 #include "chrome/browser/ui/views/event_utils.h" |
17 #include "chrome/common/pref_names.h" | 17 #include "chrome/common/pref_names.h" |
18 #include "content/browser/tab_contents/page_navigator.h" | 18 #include "content/browser/tab_contents/page_navigator.h" |
19 #include "content/browser/user_metrics.h" | 19 #include "content/browser/user_metrics.h" |
20 #include "content/common/page_transition_types.h" | 20 #include "content/common/page_transition_types.h" |
21 #include "grit/generated_resources.h" | 21 #include "grit/generated_resources.h" |
22 #include "grit/theme_resources.h" | 22 #include "grit/theme_resources.h" |
23 #include "grit/ui_resources.h" | 23 #include "grit/ui_resources.h" |
24 #include "ui/base/dragdrop/os_exchange_data.h" | 24 #include "ui/base/dragdrop/os_exchange_data.h" |
25 #include "ui/base/resource/resource_bundle.h" | 25 #include "ui/base/resource/resource_bundle.h" |
26 #include "views/controls/button/menu_button.h" | 26 #include "views/controls/button/menu_button.h" |
| 27 #include "views/controls/menu/menu_runner.h" |
27 #include "views/widget/widget.h" | 28 #include "views/widget/widget.h" |
28 | 29 |
29 using views::MenuItemView; | 30 using views::MenuItemView; |
30 | 31 |
31 BookmarkMenuController::BookmarkMenuController(Profile* profile, | 32 BookmarkMenuController::BookmarkMenuController(Profile* profile, |
32 PageNavigator* navigator, | 33 PageNavigator* navigator, |
33 views::Widget* parent, | 34 views::Widget* parent, |
34 const BookmarkNode* node, | 35 const BookmarkNode* node, |
35 int start_child_index) | 36 int start_child_index) |
36 : menu_delegate_(new BookmarkMenuDelegate(profile, navigator, parent, 1)), | 37 : menu_delegate_(new BookmarkMenuDelegate(profile, navigator, parent, 1)), |
37 node_(node), | 38 node_(node), |
38 observer_(NULL), | 39 observer_(NULL), |
39 for_drop_(false), | 40 for_drop_(false), |
40 bookmark_bar_(NULL) { | 41 bookmark_bar_(NULL) { |
41 menu_delegate_->Init(this, NULL, node, start_child_index, | 42 menu_delegate_->Init(this, NULL, node, start_child_index, |
42 BookmarkMenuDelegate::HIDE_OTHER_FOLDER); | 43 BookmarkMenuDelegate::HIDE_OTHER_FOLDER); |
| 44 menu_runner_.reset(new views::MenuRunner(menu_delegate_->menu())); |
43 } | 45 } |
44 | 46 |
45 void BookmarkMenuController::RunMenuAt(BookmarkBarView* bookmark_bar, | 47 void BookmarkMenuController::RunMenuAt(BookmarkBarView* bookmark_bar, |
46 bool for_drop) { | 48 bool for_drop) { |
47 bookmark_bar_ = bookmark_bar; | 49 bookmark_bar_ = bookmark_bar; |
48 views::MenuButton* menu_button = bookmark_bar_->GetMenuButtonForNode(node_); | 50 views::MenuButton* menu_button = bookmark_bar_->GetMenuButtonForNode(node_); |
49 DCHECK(menu_button); | 51 DCHECK(menu_button); |
50 MenuItemView::AnchorPosition anchor; | 52 MenuItemView::AnchorPosition anchor; |
51 bookmark_bar_->GetAnchorPositionForButton(menu_button, &anchor); | 53 bookmark_bar_->GetAnchorPositionForButton(menu_button, &anchor); |
52 RunMenuAt(menu_button, anchor, for_drop); | |
53 } | |
54 | |
55 void BookmarkMenuController::RunMenuAt( | |
56 views::MenuButton* button, | |
57 MenuItemView::AnchorPosition position, | |
58 bool for_drop) { | |
59 gfx::Point screen_loc; | 54 gfx::Point screen_loc; |
60 views::View::ConvertPointToScreen(button, &screen_loc); | 55 views::View::ConvertPointToScreen(menu_button, &screen_loc); |
61 // Subtract 1 from the height to make the popup flush with the button border. | 56 // Subtract 1 from the height to make the popup flush with the button border. |
62 gfx::Rect bounds(screen_loc.x(), screen_loc.y(), button->width(), | 57 gfx::Rect bounds(screen_loc.x(), screen_loc.y(), menu_button->width(), |
63 button->height() - 1); | 58 menu_button->height() - 1); |
64 for_drop_ = for_drop; | 59 for_drop_ = for_drop; |
65 menu_delegate_->profile()->GetBookmarkModel()->AddObserver(this); | 60 menu_delegate_->profile()->GetBookmarkModel()->AddObserver(this); |
66 if (for_drop) { | 61 // We only delete ourself after the menu completes, so we can safely ignore |
67 menu()->RunMenuForDropAt(menu_delegate_->parent(), bounds, position); | 62 // the return value. |
68 } else { | 63 ignore_result(menu_runner_->RunMenuAt(menu_delegate_->parent(), menu_button, |
69 menu()->RunMenuAt(menu_delegate_->parent(), button, bounds, position, | 64 bounds, anchor, for_drop ? views::MenuRunner::FOR_DROP : 0)); |
70 false); | 65 if (!for_drop) |
71 delete this; | 66 delete this; |
72 } | |
73 } | 67 } |
74 | 68 |
75 void BookmarkMenuController::Cancel() { | 69 void BookmarkMenuController::Cancel() { |
76 menu_delegate_->menu()->Cancel(); | 70 menu_delegate_->menu()->Cancel(); |
77 } | 71 } |
78 | 72 |
79 MenuItemView* BookmarkMenuController::menu() const { | 73 MenuItemView* BookmarkMenuController::menu() const { |
80 return menu_delegate_->menu(); | 74 return menu_delegate_->menu(); |
81 } | 75 } |
82 | 76 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 void BookmarkMenuController::BookmarkModelChanged() { | 178 void BookmarkMenuController::BookmarkModelChanged() { |
185 if (!menu_delegate_->is_mutating_model()) | 179 if (!menu_delegate_->is_mutating_model()) |
186 menu()->Cancel(); | 180 menu()->Cancel(); |
187 } | 181 } |
188 | 182 |
189 BookmarkMenuController::~BookmarkMenuController() { | 183 BookmarkMenuController::~BookmarkMenuController() { |
190 menu_delegate_->profile()->GetBookmarkModel()->RemoveObserver(this); | 184 menu_delegate_->profile()->GetBookmarkModel()->RemoveObserver(this); |
191 if (observer_) | 185 if (observer_) |
192 observer_->BookmarkMenuDeleted(this); | 186 observer_->BookmarkMenuDeleted(this); |
193 } | 187 } |
OLD | NEW |