172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/views/bookmarks/bookmark_context_menu_controller_views.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/compiler_specific.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/app/chrome_command_ids.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_editor.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/bookmarks/bookmark_folder_editor_controller.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_model.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_utils.h"
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/metrics/user_metrics.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/prefs/pref_service.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/profiles/profile.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/browser_list.h"
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/pref_names.h"
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/page_navigator.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBookmarkContextMenuControllerViews::BookmarkContextMenuControllerViews(
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    gfx::NativeWindow parent_window,
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    BookmarkContextMenuControllerViewsDelegate* delegate,
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    Profile* profile,
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PageNavigator* navigator,
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const BookmarkNode* parent,
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::vector<const BookmarkNode*>& selection)
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : parent_window_(parent_window),
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delegate_(delegate),
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_(profile),
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      navigator_(navigator),
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      parent_(parent),
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      selection_(selection),
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      model_(profile->GetBookmarkModel()) {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(profile_);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(model_->IsLoaded());
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model_->AddObserver(this);
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBookmarkContextMenuControllerViews::~BookmarkContextMenuControllerViews() {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (model_)
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    model_->RemoveObserver(this);
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BookmarkContextMenuControllerViews::BuildMenu() {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (selection_.size() == 1 && selection_[0]->is_url()) {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->AddItemWithStringId(IDC_BOOKMARK_BAR_OPEN_ALL,
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   IDS_BOOMARK_BAR_OPEN_IN_NEW_TAB);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->AddItemWithStringId(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW,
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   IDS_BOOMARK_BAR_OPEN_IN_NEW_WINDOW);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->AddItemWithStringId(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO,
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   IDS_BOOMARK_BAR_OPEN_INCOGNITO);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->AddItemWithStringId(IDC_BOOKMARK_BAR_OPEN_ALL,
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   IDS_BOOMARK_BAR_OPEN_ALL);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->AddItemWithStringId(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW,
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW);
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->AddItemWithStringId(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO,
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddSeparator();
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (selection_.size() == 1 && selection_[0]->is_folder()) {
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->AddItemWithStringId(IDC_BOOKMARK_BAR_RENAME_FOLDER,
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   IDS_BOOKMARK_BAR_RENAME_FOLDER);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delegate_->AddItemWithStringId(IDC_BOOKMARK_BAR_EDIT,
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   IDS_BOOKMARK_BAR_EDIT);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddSeparator();
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddItemWithStringId(IDC_CUT, IDS_CUT);
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddItemWithStringId(IDC_COPY, IDS_COPY);
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddItemWithStringId(IDC_PASTE, IDS_PASTE);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddSeparator();
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddItemWithStringId(IDC_BOOKMARK_BAR_REMOVE,
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 IDS_BOOKMARK_BAR_REMOVE);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddSeparator();
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddItemWithStringId(IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK,
834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                 IDS_BOOMARK_BAR_ADD_NEW_BOOKMARK);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddItemWithStringId(IDC_BOOKMARK_BAR_NEW_FOLDER,
854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                 IDS_BOOMARK_BAR_NEW_FOLDER);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddSeparator();
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddItemWithStringId(IDC_BOOKMARK_MANAGER, IDS_BOOKMARK_MANAGER);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_->AddCheckboxItem(IDC_BOOKMARK_BAR_ALWAYS_SHOW,
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             IDS_BOOMARK_BAR_ALWAYS_SHOW);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkContextMenuControllerViews::ExecuteCommand(int id) {
944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  BookmarkModel* model = RemoveModelObserver();
954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (id) {
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_OPEN_ALL:
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO:
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW: {
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WindowOpenDisposition initial_disposition;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (id == IDC_BOOKMARK_BAR_OPEN_ALL) {
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        initial_disposition = NEW_FOREGROUND_TAB;
1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        UserMetrics::RecordAction(
1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch            UserMetricsAction("BookmarkBar_ContextMenu_OpenAll"),
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            profile_);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      } else if (id == IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW) {
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        initial_disposition = NEW_WINDOW;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        UserMetrics::RecordAction(
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            UserMetricsAction("BookmarkBar_ContextMenu_OpenAllInNewWindow"),
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            profile_);
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      } else {
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        initial_disposition = OFF_THE_RECORD;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        UserMetrics::RecordAction(
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            UserMetricsAction("BookmarkBar_ContextMenu_OpenAllIncognito"),
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            profile_);
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bookmark_utils::OpenAll(parent_window_, profile_, navigator_, selection_,
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              initial_disposition);
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_RENAME_FOLDER:
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_EDIT:
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      UserMetrics::RecordAction(
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          UserMetricsAction("BookmarkBar_ContextMenu_Edit"), profile_);
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (selection_.size() != 1) {
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        NOTREACHED();
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (selection_[0]->is_url()) {
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        BookmarkEditor::Show(parent_window_, profile_, parent_,
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             BookmarkEditor::EditDetails(selection_[0]),
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             BookmarkEditor::SHOW_TREE);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      } else {
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        BookmarkFolderEditorController::Show(profile_, parent_window_,
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            selection_[0], -1,
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            BookmarkFolderEditorController::EXISTING_BOOKMARK);
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_REMOVE: {
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      UserMetrics::RecordAction(
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          UserMetricsAction("BookmarkBar_ContextMenu_Remove"), profile_);
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delegate_->WillRemoveBookmarks(selection_);
1484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      for (size_t i = 0; i < selection_.size(); ++i) {
149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        model->Remove(selection_[i]->parent(),
1504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                      selection_[i]->parent()->GetIndexOf(selection_[i]));
151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delegate_->DidRemoveBookmarks();
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      selection_.clear();
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK: {
15821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      UserMetrics::RecordAction(
15921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          UserMetricsAction("BookmarkBar_ContextMenu_Add"), profile_);
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      // TODO: this should honor the index from GetParentForNewNodes.
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      BookmarkEditor::Show(
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          parent_window_, profile_,
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          bookmark_utils::GetParentForNewNodes(parent_, selection_, NULL),
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          BookmarkEditor::EditDetails(), BookmarkEditor::SHOW_TREE);
1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      break;
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case IDC_BOOKMARK_BAR_NEW_FOLDER: {
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      UserMetrics::RecordAction(
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          UserMetricsAction("BookmarkBar_ContextMenu_NewFolder"),
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          profile_);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int index;
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const BookmarkNode* parent =
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          bookmark_utils::GetParentForNewNodes(parent_, selection_, &index);
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      BookmarkFolderEditorController::Show(profile_, parent_window_, parent,
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          index, BookmarkFolderEditorController::NEW_BOOKMARK);
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case IDC_BOOKMARK_BAR_ALWAYS_SHOW:
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bookmark_utils::ToggleWhenVisible(profile_);
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case IDC_BOOKMARK_MANAGER:
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      UserMetrics::RecordAction(UserMetricsAction("ShowBookmarkManager"),
1874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                profile_);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      {
1894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        Browser* browser = BrowserList::GetLastActiveWithProfile(profile_);
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        if (browser)
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          browser->OpenBookmarkManager();
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        else
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          NOTREACHED();
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
1964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_CUT:
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delegate_->WillRemoveBookmarks(selection_);
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bookmark_utils::CopyToClipboard(model, selection_, true);
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delegate_->DidRemoveBookmarks();
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_COPY:
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      bookmark_utils::CopyToClipboard(model, selection_, false);
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_PASTE: {
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int index;
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const BookmarkNode* paste_target =
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          bookmark_utils::GetParentForNewNodes(parent_, selection_, &index);
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (!paste_target)
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return;
213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bookmark_utils::PasteFromClipboard(model, paste_target, index);
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
217513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
218513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    default:
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BookmarkContextMenuControllerViews::IsItemChecked(int id) const {
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(id == IDC_BOOKMARK_BAR_ALWAYS_SHOW);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar);
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
227513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
228513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool BookmarkContextMenuControllerViews::IsCommandEnabled(int id) const {
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_root_node =
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      (selection_.size() == 1 &&
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       selection_[0]->parent() == model_->root_node());
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool can_edit =
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_->GetPrefs()->GetBoolean(prefs::kEditBookmarksEnabled);
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (id) {
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_OPEN_INCOGNITO:
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return !profile_->IsOffTheRecord() &&
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch             profile_->GetPrefs()->GetBoolean(prefs::kIncognitoEnabled);
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO:
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return HasURLs() && !profile_->IsOffTheRecord() &&
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch             profile_->GetPrefs()->GetBoolean(prefs::kIncognitoEnabled);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_OPEN_ALL:
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW:
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return HasURLs();
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_RENAME_FOLDER:
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_EDIT:
249513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return selection_.size() == 1 && !is_root_node && can_edit;
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_REMOVE:
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return !selection_.empty() && !is_root_node && can_edit;
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_NEW_FOLDER:
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK:
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return can_edit && bookmark_utils::GetParentForNewNodes(
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          parent_, selection_, NULL) != NULL;
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_BOOKMARK_BAR_ALWAYS_SHOW:
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return !profile_->GetPrefs()->IsManagedPreference(
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          prefs::kEnableBookmarkBar);
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_COPY:
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_CUT:
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return !selection_.empty() && !is_root_node &&
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch             (id == IDC_COPY || can_edit);
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case IDC_PASTE:
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // Paste to selection from the Bookmark Bar, to parent_ everywhere else
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return can_edit &&
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch             ((!selection_.empty() &&
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               bookmark_utils::CanPasteFromClipboard(selection_[0])) ||
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              bookmark_utils::CanPasteFromClipboard(parent_));
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
2754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return true;
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid BookmarkContextMenuControllerViews::BookmarkModelChanged() {
27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delegate_->CloseMenu();
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBookmarkModel* BookmarkContextMenuControllerViews::RemoveModelObserver() {
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkModel* model = model_;
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model_->RemoveObserver(this);
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model_ = NULL;
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return model;
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BookmarkContextMenuControllerViews::HasURLs() const {
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < selection_.size(); ++i) {
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (bookmark_utils::NodeHasURLs(selection_[i]))
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch