| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/bookmarks/bookmark_context_menu_controller.h" | |
| 6 | |
| 7 #include "base/compiler_specific.h" | |
| 8 #include "chrome/app/chrome_command_ids.h" | |
| 9 #include "chrome/browser/api/prefs/pref_service_base.h" | |
| 10 #include "chrome/browser/bookmarks/bookmark_editor.h" | |
| 11 #include "chrome/browser/bookmarks/bookmark_model.h" | |
| 12 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | |
| 13 #include "chrome/browser/bookmarks/bookmark_utils.h" | |
| 14 #include "chrome/browser/prefs/incognito_mode_prefs.h" | |
| 15 #include "chrome/browser/profiles/profile.h" | |
| 16 #include "chrome/browser/ui/browser.h" | |
| 17 #include "chrome/browser/ui/browser_tabstrip.h" | |
| 18 #include "chrome/browser/ui/chrome_pages.h" | |
| 19 #include "chrome/common/pref_names.h" | |
| 20 #include "content/public/browser/page_navigator.h" | |
| 21 #include "content/public/browser/user_metrics.h" | |
| 22 #include "grit/generated_resources.h" | |
| 23 #include "ui/base/l10n/l10n_util.h" | |
| 24 | |
| 25 using content::PageNavigator; | |
| 26 using content::UserMetricsAction; | |
| 27 | |
| 28 BookmarkContextMenuController::BookmarkContextMenuController( | |
| 29 gfx::NativeWindow parent_window, | |
| 30 BookmarkContextMenuControllerDelegate* delegate, | |
| 31 Browser* browser, | |
| 32 Profile* profile, | |
| 33 PageNavigator* navigator, | |
| 34 const BookmarkNode* parent, | |
| 35 const std::vector<const BookmarkNode*>& selection) | |
| 36 : parent_window_(parent_window), | |
| 37 delegate_(delegate), | |
| 38 browser_(browser), | |
| 39 profile_(profile), | |
| 40 navigator_(navigator), | |
| 41 parent_(parent), | |
| 42 selection_(selection), | |
| 43 model_(BookmarkModelFactory::GetForProfile(profile)) { | |
| 44 DCHECK(profile_); | |
| 45 DCHECK(model_->IsLoaded()); | |
| 46 menu_model_.reset(new ui::SimpleMenuModel(this)); | |
| 47 model_->AddObserver(this); | |
| 48 | |
| 49 BuildMenu(); | |
| 50 } | |
| 51 | |
| 52 BookmarkContextMenuController::~BookmarkContextMenuController() { | |
| 53 if (model_) | |
| 54 model_->RemoveObserver(this); | |
| 55 } | |
| 56 | |
| 57 void BookmarkContextMenuController::BuildMenu() { | |
| 58 if (selection_.size() == 1 && selection_[0]->is_url()) { | |
| 59 AddItem(IDC_BOOKMARK_BAR_OPEN_ALL, | |
| 60 IDS_BOOKMARK_BAR_OPEN_IN_NEW_TAB); | |
| 61 AddItem(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW, | |
| 62 IDS_BOOKMARK_BAR_OPEN_IN_NEW_WINDOW); | |
| 63 AddItem(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO, | |
| 64 IDS_BOOKMARK_BAR_OPEN_INCOGNITO); | |
| 65 } else { | |
| 66 AddItem(IDC_BOOKMARK_BAR_OPEN_ALL, IDS_BOOKMARK_BAR_OPEN_ALL); | |
| 67 AddItem(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW, | |
| 68 IDS_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW); | |
| 69 AddItem(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO, | |
| 70 IDS_BOOKMARK_BAR_OPEN_ALL_INCOGNITO); | |
| 71 } | |
| 72 | |
| 73 AddSeparator(); | |
| 74 if (selection_.size() == 1 && selection_[0]->is_folder()) { | |
| 75 AddItem(IDC_BOOKMARK_BAR_RENAME_FOLDER, IDS_BOOKMARK_BAR_RENAME_FOLDER); | |
| 76 } else { | |
| 77 AddItem(IDC_BOOKMARK_BAR_EDIT, IDS_BOOKMARK_BAR_EDIT); | |
| 78 } | |
| 79 | |
| 80 AddSeparator(); | |
| 81 AddItem(IDC_CUT, IDS_CUT); | |
| 82 AddItem(IDC_COPY, IDS_COPY); | |
| 83 AddItem(IDC_PASTE, IDS_PASTE); | |
| 84 | |
| 85 AddSeparator(); | |
| 86 AddItem(IDC_BOOKMARK_BAR_REMOVE, IDS_BOOKMARK_BAR_REMOVE); | |
| 87 | |
| 88 AddSeparator(); | |
| 89 AddItem(IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK, IDS_BOOKMARK_BAR_ADD_NEW_BOOKMARK); | |
| 90 AddItem(IDC_BOOKMARK_BAR_NEW_FOLDER, IDS_BOOKMARK_BAR_NEW_FOLDER); | |
| 91 | |
| 92 AddSeparator(); | |
| 93 AddItem(IDC_BOOKMARK_MANAGER, IDS_BOOKMARK_MANAGER); | |
| 94 AddCheckboxItem(IDC_BOOKMARK_BAR_ALWAYS_SHOW, IDS_SHOW_BOOKMARK_BAR); | |
| 95 } | |
| 96 | |
| 97 void BookmarkContextMenuController::AddItem(int id, int localization_id) { | |
| 98 menu_model_->AddItemWithStringId(id, localization_id); | |
| 99 } | |
| 100 | |
| 101 void BookmarkContextMenuController::AddSeparator() { | |
| 102 menu_model_->AddSeparator(ui::NORMAL_SEPARATOR); | |
| 103 } | |
| 104 | |
| 105 void BookmarkContextMenuController::AddCheckboxItem(int id, | |
| 106 int localization_id) { | |
| 107 menu_model_->AddCheckItemWithStringId(id, localization_id); | |
| 108 } | |
| 109 | |
| 110 void BookmarkContextMenuController::ExecuteCommand(int id) { | |
| 111 if (delegate_) | |
| 112 delegate_->WillExecuteCommand(); | |
| 113 | |
| 114 switch (id) { | |
| 115 case IDC_BOOKMARK_BAR_OPEN_ALL: | |
| 116 case IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO: | |
| 117 case IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW: { | |
| 118 WindowOpenDisposition initial_disposition; | |
| 119 if (id == IDC_BOOKMARK_BAR_OPEN_ALL) { | |
| 120 initial_disposition = NEW_BACKGROUND_TAB; | |
| 121 content::RecordAction( | |
| 122 UserMetricsAction("BookmarkBar_ContextMenu_OpenAll")); | |
| 123 } else if (id == IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW) { | |
| 124 initial_disposition = NEW_WINDOW; | |
| 125 content::RecordAction( | |
| 126 UserMetricsAction("BookmarkBar_ContextMenu_OpenAllInNewWindow")); | |
| 127 } else { | |
| 128 initial_disposition = OFF_THE_RECORD; | |
| 129 content::RecordAction( | |
| 130 UserMetricsAction("BookmarkBar_ContextMenu_OpenAllIncognito")); | |
| 131 } | |
| 132 bookmark_utils::OpenAll(parent_window_, navigator_, selection_, | |
| 133 initial_disposition); | |
| 134 break; | |
| 135 } | |
| 136 | |
| 137 case IDC_BOOKMARK_BAR_RENAME_FOLDER: | |
| 138 case IDC_BOOKMARK_BAR_EDIT: | |
| 139 content::RecordAction( | |
| 140 UserMetricsAction("BookmarkBar_ContextMenu_Edit")); | |
| 141 | |
| 142 if (selection_.size() != 1) { | |
| 143 NOTREACHED(); | |
| 144 break; | |
| 145 } | |
| 146 | |
| 147 BookmarkEditor::Show( | |
| 148 parent_window_, | |
| 149 profile_, | |
| 150 BookmarkEditor::EditDetails::EditNode(selection_[0]), | |
| 151 selection_[0]->is_url() ? BookmarkEditor::SHOW_TREE : | |
| 152 BookmarkEditor::NO_TREE); | |
| 153 break; | |
| 154 | |
| 155 case IDC_BOOKMARK_BAR_REMOVE: { | |
| 156 content::RecordAction( | |
| 157 UserMetricsAction("BookmarkBar_ContextMenu_Remove")); | |
| 158 | |
| 159 for (size_t i = 0; i < selection_.size(); ++i) { | |
| 160 int index = selection_[i]->parent()->GetIndexOf(selection_[i]); | |
| 161 if (index > -1) | |
| 162 model_->Remove(selection_[i]->parent(), index); | |
| 163 } | |
| 164 selection_.clear(); | |
| 165 break; | |
| 166 } | |
| 167 | |
| 168 case IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK: { | |
| 169 content::RecordAction( | |
| 170 UserMetricsAction("BookmarkBar_ContextMenu_Add")); | |
| 171 | |
| 172 int index; | |
| 173 const BookmarkNode* parent = | |
| 174 bookmark_utils::GetParentForNewNodes(parent_, selection_, &index); | |
| 175 GURL url; | |
| 176 string16 title; | |
| 177 bookmark_utils::GetURLAndTitleToBookmark( | |
| 178 chrome::GetActiveWebContents(browser_), &url, &title); | |
| 179 BookmarkEditor::Show( | |
| 180 parent_window_, | |
| 181 profile_, | |
| 182 BookmarkEditor::EditDetails::AddNodeInFolder( | |
| 183 parent, index, url, title), | |
| 184 BookmarkEditor::SHOW_TREE); | |
| 185 break; | |
| 186 } | |
| 187 | |
| 188 case IDC_BOOKMARK_BAR_NEW_FOLDER: { | |
| 189 content::RecordAction( | |
| 190 UserMetricsAction("BookmarkBar_ContextMenu_NewFolder")); | |
| 191 | |
| 192 int index; | |
| 193 const BookmarkNode* parent = | |
| 194 bookmark_utils::GetParentForNewNodes(parent_, selection_, &index); | |
| 195 BookmarkEditor::Show( | |
| 196 parent_window_, | |
| 197 profile_, | |
| 198 BookmarkEditor::EditDetails::AddFolder(parent, index), | |
| 199 BookmarkEditor::SHOW_TREE); | |
| 200 break; | |
| 201 } | |
| 202 | |
| 203 case IDC_BOOKMARK_BAR_ALWAYS_SHOW: | |
| 204 bookmark_utils::ToggleWhenVisible(profile_); | |
| 205 break; | |
| 206 | |
| 207 case IDC_BOOKMARK_MANAGER: { | |
| 208 content::RecordAction(UserMetricsAction("ShowBookmarkManager")); | |
| 209 if (selection_.size() != 1) | |
| 210 chrome::ShowBookmarkManager(browser_); | |
| 211 else if (selection_[0]->is_folder()) | |
| 212 chrome::ShowBookmarkManagerForNode(browser_, selection_[0]->id()); | |
| 213 else if (parent_) | |
| 214 chrome::ShowBookmarkManagerForNode(browser_, parent_->id()); | |
| 215 else | |
| 216 chrome::ShowBookmarkManager(browser_); | |
| 217 break; | |
| 218 } | |
| 219 | |
| 220 | |
| 221 case IDC_CUT: | |
| 222 bookmark_utils::CopyToClipboard(model_, selection_, true); | |
| 223 break; | |
| 224 | |
| 225 case IDC_COPY: | |
| 226 bookmark_utils::CopyToClipboard(model_, selection_, false); | |
| 227 break; | |
| 228 | |
| 229 case IDC_PASTE: { | |
| 230 int index; | |
| 231 const BookmarkNode* paste_target = | |
| 232 bookmark_utils::GetParentForNewNodes(parent_, selection_, &index); | |
| 233 if (!paste_target) | |
| 234 return; | |
| 235 | |
| 236 bookmark_utils::PasteFromClipboard(model_, paste_target, index); | |
| 237 break; | |
| 238 } | |
| 239 | |
| 240 default: | |
| 241 NOTREACHED(); | |
| 242 } | |
| 243 | |
| 244 if (delegate_) | |
| 245 delegate_->DidExecuteCommand(); | |
| 246 } | |
| 247 | |
| 248 bool BookmarkContextMenuController::IsCommandIdChecked(int command_id) const { | |
| 249 DCHECK(command_id == IDC_BOOKMARK_BAR_ALWAYS_SHOW); | |
| 250 PrefServiceBase* prefs = PrefServiceBase::FromBrowserContext(profile_); | |
| 251 return prefs->GetBoolean(prefs::kShowBookmarkBar); | |
| 252 } | |
| 253 | |
| 254 bool BookmarkContextMenuController::IsCommandIdEnabled(int command_id) const { | |
| 255 PrefServiceBase* prefs = PrefServiceBase::FromBrowserContext(profile_); | |
| 256 | |
| 257 bool is_root_node = selection_.size() == 1 && | |
| 258 selection_[0]->parent() == model_->root_node(); | |
| 259 bool can_edit = prefs->GetBoolean(prefs::kEditBookmarksEnabled); | |
| 260 IncognitoModePrefs::Availability incognito_avail = | |
| 261 IncognitoModePrefs::GetAvailability(profile_->GetPrefs()); | |
| 262 switch (command_id) { | |
| 263 case IDC_BOOKMARK_BAR_OPEN_INCOGNITO: | |
| 264 return !profile_->IsOffTheRecord() && | |
| 265 incognito_avail != IncognitoModePrefs::DISABLED; | |
| 266 | |
| 267 case IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO: | |
| 268 return HasURLs() && | |
| 269 !profile_->IsOffTheRecord() && | |
| 270 incognito_avail != IncognitoModePrefs::DISABLED; | |
| 271 | |
| 272 case IDC_BOOKMARK_BAR_OPEN_ALL: | |
| 273 return HasURLs(); | |
| 274 case IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW: | |
| 275 return HasURLs() && | |
| 276 incognito_avail != IncognitoModePrefs::FORCED; | |
| 277 | |
| 278 case IDC_BOOKMARK_BAR_RENAME_FOLDER: | |
| 279 case IDC_BOOKMARK_BAR_EDIT: | |
| 280 return selection_.size() == 1 && !is_root_node && can_edit; | |
| 281 | |
| 282 case IDC_BOOKMARK_BAR_REMOVE: | |
| 283 return !selection_.empty() && !is_root_node && can_edit; | |
| 284 | |
| 285 case IDC_BOOKMARK_BAR_NEW_FOLDER: | |
| 286 case IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK: | |
| 287 return can_edit && bookmark_utils::GetParentForNewNodes( | |
| 288 parent_, selection_, NULL) != NULL; | |
| 289 | |
| 290 case IDC_BOOKMARK_BAR_ALWAYS_SHOW: | |
| 291 return !prefs->IsManagedPreference(prefs::kShowBookmarkBar); | |
| 292 | |
| 293 case IDC_COPY: | |
| 294 case IDC_CUT: | |
| 295 return !selection_.empty() && !is_root_node && | |
| 296 (command_id == IDC_COPY || can_edit); | |
| 297 | |
| 298 case IDC_PASTE: | |
| 299 // Paste to selection from the Bookmark Bar, to parent_ everywhere else | |
| 300 return can_edit && | |
| 301 ((!selection_.empty() && | |
| 302 bookmark_utils::CanPasteFromClipboard(selection_[0])) || | |
| 303 bookmark_utils::CanPasteFromClipboard(parent_)); | |
| 304 } | |
| 305 return true; | |
| 306 } | |
| 307 | |
| 308 bool BookmarkContextMenuController::GetAcceleratorForCommandId( | |
| 309 int command_id, | |
| 310 ui::Accelerator* accelerator) { | |
| 311 return false; | |
| 312 } | |
| 313 | |
| 314 void BookmarkContextMenuController::BookmarkModelChanged() { | |
| 315 if (delegate_) | |
| 316 delegate_->CloseMenu(); | |
| 317 } | |
| 318 | |
| 319 bool BookmarkContextMenuController::HasURLs() const { | |
| 320 for (size_t i = 0; i < selection_.size(); ++i) { | |
| 321 if (bookmark_utils::NodeHasURLs(selection_[i])) | |
| 322 return true; | |
| 323 } | |
| 324 return false; | |
| 325 } | |
| OLD | NEW |