Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(454)

Side by Side Diff: chrome/browser/bookmarks/bookmark_menu_controller.cc

Issue 42460: Adds a bookmark menu. This is experimental. To turn on you need... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698