| 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 |