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_delegate.h" | 5 #include "chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h" |
6 | 6 |
7 #include "base/stl_util-inl.h" | 7 #include "base/stl_util-inl.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" |
(...skipping 23 matching lines...) Expand all Loading... |
34 | 34 |
35 BookmarkMenuDelegate::BookmarkMenuDelegate(Profile* profile, | 35 BookmarkMenuDelegate::BookmarkMenuDelegate(Profile* profile, |
36 PageNavigator* navigator, | 36 PageNavigator* navigator, |
37 gfx::NativeWindow parent, | 37 gfx::NativeWindow parent, |
38 int first_menu_id) | 38 int first_menu_id) |
39 : profile_(profile), | 39 : profile_(profile), |
40 page_navigator_(navigator), | 40 page_navigator_(navigator), |
41 parent_(parent), | 41 parent_(parent), |
42 menu_(NULL), | 42 menu_(NULL), |
43 for_drop_(false), | 43 for_drop_(false), |
| 44 parent_menu_item_(NULL), |
44 next_menu_id_(first_menu_id), | 45 next_menu_id_(first_menu_id), |
45 real_delegate_(NULL), | 46 real_delegate_(NULL), |
46 is_mutating_model_(false) { | 47 is_mutating_model_(false) { |
47 } | 48 } |
48 | 49 |
49 BookmarkMenuDelegate::~BookmarkMenuDelegate() { | 50 BookmarkMenuDelegate::~BookmarkMenuDelegate() { |
50 profile_->GetBookmarkModel()->RemoveObserver(this); | 51 profile_->GetBookmarkModel()->RemoveObserver(this); |
51 STLDeleteValues(&node_to_menu_map_); | 52 STLDeleteValues(&node_to_menu_map_); |
52 } | 53 } |
53 | 54 |
54 void BookmarkMenuDelegate::Init(views::MenuDelegate* real_delegate, | 55 void BookmarkMenuDelegate::Init(views::MenuDelegate* real_delegate, |
55 MenuItemView* parent, | 56 MenuItemView* parent, |
56 const BookmarkNode* node, | 57 const BookmarkNode* node, |
57 int start_child_index, | 58 int start_child_index, |
58 ShowOptions show_options) { | 59 ShowOptions show_options) { |
59 profile_->GetBookmarkModel()->AddObserver(this); | 60 profile_->GetBookmarkModel()->AddObserver(this); |
60 real_delegate_ = real_delegate; | 61 real_delegate_ = real_delegate; |
61 if (parent) { | 62 if (parent) { |
| 63 parent_menu_item_ = parent; |
62 BuildMenu(node, start_child_index, parent, &next_menu_id_); | 64 BuildMenu(node, start_child_index, parent, &next_menu_id_); |
63 if (show_options == SHOW_OTHER_FOLDER) | 65 if (show_options == SHOW_OTHER_FOLDER) |
64 BuildOtherFolderMenu(parent, &next_menu_id_); | 66 BuildOtherFolderMenu(parent, &next_menu_id_); |
65 } else { | 67 } else { |
66 menu_ = CreateMenu(node, start_child_index, show_options); | 68 menu_ = CreateMenu(node, start_child_index, show_options); |
67 } | 69 } |
68 } | 70 } |
69 | 71 |
70 void BookmarkMenuDelegate::SetActiveMenu(const BookmarkNode* node, | 72 void BookmarkMenuDelegate::SetActiveMenu(const BookmarkNode* node, |
71 int start_index) { | 73 int start_index) { |
| 74 DCHECK(!parent_menu_item_); |
72 if (!node_to_menu_map_[node]) | 75 if (!node_to_menu_map_[node]) |
73 CreateMenu(node, start_index, HIDE_OTHER_FOLDER); | 76 CreateMenu(node, start_index, HIDE_OTHER_FOLDER); |
74 menu_ = node_to_menu_map_[node]; | 77 menu_ = node_to_menu_map_[node]; |
75 } | 78 } |
76 | 79 |
77 std::wstring BookmarkMenuDelegate::GetTooltipText( | 80 std::wstring BookmarkMenuDelegate::GetTooltipText( |
78 int id, | 81 int id, |
79 const gfx::Point& screen_loc) { | 82 const gfx::Point& screen_loc) { |
80 DCHECK(menu_id_to_node_map_.find(id) != menu_id_to_node_map_.end()); | 83 DCHECK(menu_id_to_node_map_.find(id) != menu_id_to_node_map_.end()); |
81 | 84 |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 | 275 |
273 // Iterate through the menus looking for the menu containing node. | 276 // Iterate through the menus looking for the menu containing node. |
274 for (NodeToMenuMap::iterator i = node_to_menu_map_.begin(); | 277 for (NodeToMenuMap::iterator i = node_to_menu_map_.begin(); |
275 i != node_to_menu_map_.end(); ++i) { | 278 i != node_to_menu_map_.end(); ++i) { |
276 MenuItemView* menu_item = i->second->GetMenuItemByID(menu_pair->second); | 279 MenuItemView* menu_item = i->second->GetMenuItemByID(menu_pair->second); |
277 if (menu_item) { | 280 if (menu_item) { |
278 menu_item->SetIcon(model->GetFavicon(node)); | 281 menu_item->SetIcon(model->GetFavicon(node)); |
279 return; | 282 return; |
280 } | 283 } |
281 } | 284 } |
| 285 |
| 286 if (parent_menu_item_) { |
| 287 MenuItemView* menu_item = parent_menu_item_->GetMenuItemByID( |
| 288 menu_pair->second); |
| 289 if (menu_item) |
| 290 menu_item->SetIcon(model->GetFavicon(node)); |
| 291 } |
282 } | 292 } |
283 | 293 |
284 void BookmarkMenuDelegate::WillRemoveBookmarks( | 294 void BookmarkMenuDelegate::WillRemoveBookmarks( |
285 const std::vector<const BookmarkNode*>& bookmarks) { | 295 const std::vector<const BookmarkNode*>& bookmarks) { |
286 DCHECK(!is_mutating_model_); | 296 DCHECK(!is_mutating_model_); |
287 is_mutating_model_ = true; | 297 is_mutating_model_ = true; |
288 std::set<MenuItemView*> removed_menus; | 298 std::set<MenuItemView*> removed_menus; |
289 WillRemoveBookmarksImpl(bookmarks, &removed_menus); | 299 WillRemoveBookmarksImpl(bookmarks, &removed_menus); |
290 STLDeleteElements(&removed_menus); | 300 STLDeleteElements(&removed_menus); |
291 } | 301 } |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 } | 369 } |
360 } | 370 } |
361 | 371 |
362 MenuItemView* BookmarkMenuDelegate::GetMenuByID(int id) { | 372 MenuItemView* BookmarkMenuDelegate::GetMenuByID(int id) { |
363 for (NodeToMenuMap::const_iterator i = node_to_menu_map_.begin(); | 373 for (NodeToMenuMap::const_iterator i = node_to_menu_map_.begin(); |
364 i != node_to_menu_map_.end(); ++i) { | 374 i != node_to_menu_map_.end(); ++i) { |
365 MenuItemView* menu = i->second->GetMenuItemByID(id); | 375 MenuItemView* menu = i->second->GetMenuItemByID(id); |
366 if (menu) | 376 if (menu) |
367 return menu; | 377 return menu; |
368 } | 378 } |
369 return NULL; | 379 |
| 380 return parent_menu_item_ ? parent_menu_item_->GetMenuItemByID(id) : NULL; |
370 } | 381 } |
371 | 382 |
372 void BookmarkMenuDelegate::WillRemoveBookmarksImpl( | 383 void BookmarkMenuDelegate::WillRemoveBookmarksImpl( |
373 const std::vector<const BookmarkNode*>& bookmarks, | 384 const std::vector<const BookmarkNode*>& bookmarks, |
374 std::set<views::MenuItemView*>* removed_menus) { | 385 std::set<views::MenuItemView*>* removed_menus) { |
375 // Remove the observer so that when the remove happens we don't prematurely | 386 // Remove the observer so that when the remove happens we don't prematurely |
376 // cancel the menu. The observer ias added back in DidRemoveBookmarks. | 387 // cancel the menu. The observer ias added back in DidRemoveBookmarks. |
377 profile_->GetBookmarkModel()->RemoveObserver(this); | 388 profile_->GetBookmarkModel()->RemoveObserver(this); |
378 | 389 |
379 // Remove the menu items. | 390 // Remove the menu items. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 break; | 425 break; |
415 } | 426 } |
416 } | 427 } |
417 if (ancestor_removed) { | 428 if (ancestor_removed) { |
418 node_to_menu_id_map_.erase(i++); | 429 node_to_menu_id_map_.erase(i++); |
419 } else { | 430 } else { |
420 ++i; | 431 ++i; |
421 } | 432 } |
422 } | 433 } |
423 } | 434 } |
OLD | NEW |