OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/bookmarks/bookmark_menu_controller.h" | 5 #include "chrome/browser/bookmarks/bookmark_menu_controller.h" |
6 | 6 |
7 #include "chrome/browser/bookmarks/bookmark_drag_data.h" | 7 #include "chrome/browser/bookmarks/bookmark_drag_data.h" |
8 #include "chrome/browser/bookmarks/bookmark_utils.h" | 8 #include "chrome/browser/bookmarks/bookmark_utils.h" |
9 #include "chrome/browser/metrics/user_metrics.h" | 9 #include "chrome/browser/metrics/user_metrics.h" |
10 #include "chrome/browser/profile.h" | 10 #include "chrome/browser/profile.h" |
11 #include "chrome/browser/tab_contents/page_navigator.h" | 11 #include "chrome/browser/tab_contents/page_navigator.h" |
12 #include "chrome/browser/views/event_utils.h" | 12 #include "chrome/browser/views/event_utils.h" |
13 #include "chrome/common/os_exchange_data.h" | 13 #include "chrome/common/os_exchange_data.h" |
| 14 #include "chrome/common/l10n_util.h" |
14 #include "chrome/common/page_transition_types.h" | 15 #include "chrome/common/page_transition_types.h" |
15 #include "chrome/common/resource_bundle.h" | 16 #include "chrome/common/resource_bundle.h" |
| 17 #include "grit/generated_resources.h" |
16 #include "grit/theme_resources.h" | 18 #include "grit/theme_resources.h" |
17 | 19 |
18 BookmarkMenuController::BookmarkMenuController(Browser* browser, | 20 BookmarkMenuController::BookmarkMenuController(Browser* browser, |
19 Profile* profile, | 21 Profile* profile, |
20 PageNavigator* navigator, | 22 PageNavigator* navigator, |
21 HWND hwnd, | 23 HWND hwnd, |
22 BookmarkNode* node, | 24 BookmarkNode* node, |
23 int start_child_index) | 25 int start_child_index, |
| 26 bool show_other_folder) |
24 : browser_(browser), | 27 : browser_(browser), |
25 profile_(profile), | 28 profile_(profile), |
26 page_navigator_(navigator), | 29 page_navigator_(navigator), |
27 hwnd_(hwnd), | 30 hwnd_(hwnd), |
28 node_(node), | 31 node_(node), |
29 observer_(NULL), | 32 observer_(NULL), |
30 for_drop_(false) { | 33 for_drop_(false), |
| 34 show_other_folder_(show_other_folder) { |
31 menu_.reset(new views::MenuItemView(this)); | 35 menu_.reset(new views::MenuItemView(this)); |
32 int next_menu_id = 1; | 36 int next_menu_id = 1; |
33 menu_id_to_node_map_[menu_->GetCommand()] = node; | 37 menu_id_to_node_map_[menu_->GetCommand()] = node; |
34 menu_->set_has_icons(true); | 38 menu_->set_has_icons(true); |
35 BuildMenu(node, start_child_index, menu_.get(), &next_menu_id); | 39 BuildMenu(node, start_child_index, menu_.get(), &next_menu_id); |
| 40 if (show_other_folder) |
| 41 BuildOtherFolderMenu(&next_menu_id); |
36 } | 42 } |
37 | 43 |
38 void BookmarkMenuController::RunMenuAt( | 44 void BookmarkMenuController::RunMenuAt( |
39 const gfx::Rect& bounds, | 45 const gfx::Rect& bounds, |
40 views::MenuItemView::AnchorPosition position, | 46 views::MenuItemView::AnchorPosition position, |
41 bool for_drop) { | 47 bool for_drop) { |
42 for_drop_ = for_drop; | 48 for_drop_ = for_drop; |
43 profile_->GetBookmarkModel()->AddObserver(this); | 49 profile_->GetBookmarkModel()->AddObserver(this); |
44 if (for_drop) { | 50 if (for_drop) { |
45 menu_->RunMenuForDropAt(hwnd_, bounds, position); | 51 menu_->RunMenuForDropAt(hwnd_, bounds, position); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 views::MenuItemView* item, | 103 views::MenuItemView* item, |
98 const views::DropTargetEvent& event, | 104 const views::DropTargetEvent& event, |
99 DropPosition* position) { | 105 DropPosition* position) { |
100 // Should only get here if we have drop data. | 106 // Should only get here if we have drop data. |
101 DCHECK(drop_data_.is_valid()); | 107 DCHECK(drop_data_.is_valid()); |
102 | 108 |
103 BookmarkNode* node = menu_id_to_node_map_[item->GetCommand()]; | 109 BookmarkNode* node = menu_id_to_node_map_[item->GetCommand()]; |
104 BookmarkNode* drop_parent = node->GetParent(); | 110 BookmarkNode* drop_parent = node->GetParent(); |
105 int index_to_drop_at = drop_parent->IndexOfChild(node); | 111 int index_to_drop_at = drop_parent->IndexOfChild(node); |
106 if (*position == DROP_AFTER) { | 112 if (*position == DROP_AFTER) { |
| 113 if (node == profile_->GetBookmarkModel()->other_node()) { |
| 114 // The other folder is shown after all bookmarks on the bookmark bar. |
| 115 // Dropping after the other folder makes no sense. |
| 116 *position = DROP_NONE; |
| 117 } |
107 index_to_drop_at++; | 118 index_to_drop_at++; |
108 } else if (*position == DROP_ON) { | 119 } else if (*position == DROP_ON) { |
109 drop_parent = node; | 120 drop_parent = node; |
110 index_to_drop_at = node->GetChildCount(); | 121 index_to_drop_at = node->GetChildCount(); |
111 } | 122 } |
112 DCHECK(drop_parent); | 123 DCHECK(drop_parent); |
113 return bookmark_utils::BookmarkDropOperation( | 124 return bookmark_utils::BookmarkDropOperation( |
114 profile_, event, drop_data_, drop_parent, index_to_drop_at); | 125 profile_, event, drop_data_, drop_parent, index_to_drop_at); |
115 } | 126 } |
116 | 127 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 context_menu_->RunMenuAt(x, y); | 169 context_menu_->RunMenuAt(x, y); |
159 context_menu_.reset(NULL); | 170 context_menu_.reset(NULL); |
160 return true; | 171 return true; |
161 } | 172 } |
162 | 173 |
163 void BookmarkMenuController::DropMenuClosed(views::MenuItemView* menu) { | 174 void BookmarkMenuController::DropMenuClosed(views::MenuItemView* menu) { |
164 delete this; | 175 delete this; |
165 } | 176 } |
166 | 177 |
167 bool BookmarkMenuController::CanDrag(views::MenuItemView* menu) { | 178 bool BookmarkMenuController::CanDrag(views::MenuItemView* menu) { |
168 return true; | 179 BookmarkNode* node = menu_id_to_node_map_[menu->GetCommand()]; |
| 180 // Don't let users drag the other folder. |
| 181 return node->GetParent() != profile_->GetBookmarkModel()->root_node(); |
169 } | 182 } |
170 | 183 |
171 void BookmarkMenuController::WriteDragData(views::MenuItemView* sender, | 184 void BookmarkMenuController::WriteDragData(views::MenuItemView* sender, |
172 OSExchangeData* data) { | 185 OSExchangeData* data) { |
173 DCHECK(sender && data); | 186 DCHECK(sender && data); |
174 | 187 |
175 UserMetrics::RecordAction(L"BookmarkBar_DragFromFolder", profile_); | 188 UserMetrics::RecordAction(L"BookmarkBar_DragFromFolder", profile_); |
176 | 189 |
177 BookmarkDragData drag_data(menu_id_to_node_map_[sender->GetCommand()]); | 190 BookmarkDragData drag_data(menu_id_to_node_map_[sender->GetCommand()]); |
178 drag_data.Write(profile_, data); | 191 drag_data.Write(profile_, data); |
179 } | 192 } |
180 | 193 |
181 int BookmarkMenuController::GetDragOperations(views::MenuItemView* sender) { | 194 int BookmarkMenuController::GetDragOperations(views::MenuItemView* sender) { |
182 return bookmark_utils::BookmarkDragOperation( | 195 return bookmark_utils::BookmarkDragOperation( |
183 menu_id_to_node_map_[sender->GetCommand()]); | 196 menu_id_to_node_map_[sender->GetCommand()]); |
184 } | 197 } |
185 | 198 |
186 void BookmarkMenuController::BookmarkModelChanged() { | 199 void BookmarkMenuController::BookmarkModelChanged() { |
187 menu_->Cancel(); | 200 menu_->Cancel(); |
188 } | 201 } |
189 | 202 |
190 void BookmarkMenuController::BookmarkNodeFavIconLoaded(BookmarkModel* model, | 203 void BookmarkMenuController::BookmarkNodeFavIconLoaded(BookmarkModel* model, |
191 BookmarkNode* node) { | 204 BookmarkNode* node) { |
192 if (node_to_menu_id_map_.find(node) != node_to_menu_id_map_.end()) | 205 if (node_to_menu_id_map_.find(node) != node_to_menu_id_map_.end()) |
193 menu_->SetIcon(node->GetFavIcon(), node_to_menu_id_map_[node]); | 206 menu_->SetIcon(node->GetFavIcon(), node_to_menu_id_map_[node]); |
194 } | 207 } |
195 | 208 |
| 209 void BookmarkMenuController::BuildOtherFolderMenu(int* next_menu_id) { |
| 210 BookmarkNode* other_folder = profile_->GetBookmarkModel()->other_node(); |
| 211 int id = *next_menu_id; |
| 212 (*next_menu_id)++; |
| 213 SkBitmap* folder_icon = ResourceBundle::GetSharedInstance(). |
| 214 GetBitmapNamed(IDR_BOOKMARK_BAR_FOLDER); |
| 215 views::MenuItemView* submenu = menu_->AppendSubMenuWithIcon( |
| 216 id, l10n_util::GetString(IDS_BOOMARK_BAR_OTHER_BOOKMARKED), *folder_icon); |
| 217 BuildMenu(other_folder, 0, submenu, next_menu_id); |
| 218 menu_id_to_node_map_[id] = other_folder; |
| 219 } |
| 220 |
196 void BookmarkMenuController::BuildMenu(BookmarkNode* parent, | 221 void BookmarkMenuController::BuildMenu(BookmarkNode* parent, |
197 int start_child_index, | 222 int start_child_index, |
198 views::MenuItemView* menu, | 223 views::MenuItemView* menu, |
199 int* next_menu_id) { | 224 int* next_menu_id) { |
200 DCHECK(!parent->GetChildCount() || | 225 DCHECK(!parent->GetChildCount() || |
201 start_child_index < parent->GetChildCount()); | 226 start_child_index < parent->GetChildCount()); |
202 for (int i = start_child_index; i < parent->GetChildCount(); ++i) { | 227 for (int i = start_child_index; i < parent->GetChildCount(); ++i) { |
203 BookmarkNode* node = parent->GetChild(i); | 228 BookmarkNode* node = parent->GetChild(i); |
204 int id = *next_menu_id; | 229 int id = *next_menu_id; |
205 | 230 |
(...skipping 17 matching lines...) Expand all Loading... |
223 } | 248 } |
224 menu_id_to_node_map_[id] = node; | 249 menu_id_to_node_map_[id] = node; |
225 } | 250 } |
226 } | 251 } |
227 | 252 |
228 BookmarkMenuController::~BookmarkMenuController() { | 253 BookmarkMenuController::~BookmarkMenuController() { |
229 profile_->GetBookmarkModel()->RemoveObserver(this); | 254 profile_->GetBookmarkModel()->RemoveObserver(this); |
230 if (observer_) | 255 if (observer_) |
231 observer_->BookmarkMenuDeleted(this); | 256 observer_->BookmarkMenuDeleted(this); |
232 } | 257 } |
OLD | NEW |