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

Unified Diff: chrome/browser/ui/gtk/bookmark_sub_menu_model_gtk.cc

Issue 8286018: Reland r105450: Linux: add basic bookmark menu support. More features can be added later. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/gtk/bookmark_sub_menu_model_gtk.cc
===================================================================
--- chrome/browser/ui/gtk/bookmark_sub_menu_model_gtk.cc (revision 105454)
+++ chrome/browser/ui/gtk/bookmark_sub_menu_model_gtk.cc (working copy)
@@ -0,0 +1,173 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/gtk/bookmark_sub_menu_model_gtk.h"
+
+#include "base/stl_util.h"
+#include "base/string16.h"
+#include "base/utf_string_conversions.h"
+#include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/bookmarks/bookmark_model.h"
+#include "chrome/browser/event_disposition.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.h"
+#include "chrome/browser/ui/gtk/menu_gtk.h"
+#include "grit/generated_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+
+BookmarkNodeMenuModel::BookmarkNodeMenuModel(
+ ui::SimpleMenuModel::Delegate* delegate,
+ BookmarkModel* model,
+ const BookmarkNode* node,
+ PageNavigator* page_navigator)
+ : SimpleMenuModel(delegate),
+ model_(model),
+ node_(node),
+ page_navigator_(page_navigator) {
+ DCHECK(page_navigator_);
+}
+
+BookmarkNodeMenuModel::~BookmarkNodeMenuModel() {
+ Clear();
+}
+
+void BookmarkNodeMenuModel::Clear() {
+ SimpleMenuModel::Clear();
+ STLDeleteElements(&submenus_);
+}
+
+void BookmarkNodeMenuModel::MenuWillShow() {
+ Clear();
+ PopulateMenu();
+}
+
+void BookmarkNodeMenuModel::MenuClosed() {
+ Clear();
+}
+
+void BookmarkNodeMenuModel::ActivatedAt(int index) {
+ NavigateToMenuItem(index, CURRENT_TAB);
+}
+
+void BookmarkNodeMenuModel::ActivatedAt(int index, int event_flags) {
+ NavigateToMenuItem(index, browser::DispositionFromEventFlags(event_flags));
+}
+
+void BookmarkNodeMenuModel::PopulateMenu() {
+ DCHECK(submenus_.empty());
+ for (int i = 0; i < node_->child_count(); ++i) {
+ const BookmarkNode* child = node_->GetChild(i);
+ // Ironically the label will end up getting converted back to UTF8 later...
+ const string16 label =
+ UTF8ToUTF16(bookmark_utils::BuildMenuLabelFor(child));
+ if (child->is_folder()) {
+ // Don't pass in the delegate, if any. Bookmark submenus don't need one.
+ BookmarkNodeMenuModel* submenu =
+ new BookmarkNodeMenuModel(NULL, model_, child, page_navigator_);
+ // No command id. Nothing happens if you click on the submenu itself.
+ AddSubMenu(0, label, submenu);
+ submenus_.push_back(submenu);
+ } else {
+ // No command id. We override ActivatedAt below to handle activations.
+ AddItem(0, label);
+ const SkBitmap& node_icon = model_->GetFavicon(child);
+ if (node_icon.width() > 0)
+ SetIcon(GetItemCount() - 1, node_icon);
+ // TODO(mdm): set up an observer to watch for icon load events and set
+ // the icons in response.
+ }
+ }
+}
+
+void BookmarkNodeMenuModel::NavigateToMenuItem(
+ int index,
+ WindowOpenDisposition disposition) {
+ const BookmarkNode* node = node_->GetChild(index);
+ DCHECK(node);
+ page_navigator_->OpenURL(OpenURLParams(
+ node->url(), GURL(), disposition,
+ content::PAGE_TRANSITION_AUTO_BOOKMARK,
+ false)); // is_renderer_initiated
+}
+
+BookmarkSubMenuModel::BookmarkSubMenuModel(
+ ui::SimpleMenuModel::Delegate* delegate,
+ Browser* browser)
+ : BookmarkNodeMenuModel(delegate, NULL, NULL, browser),
+ browser_(browser),
+ fixed_items_(0),
+ menu_(NULL) {
+}
+
+BookmarkSubMenuModel::~BookmarkSubMenuModel() {
+ if (model())
+ model()->RemoveObserver(this);
+}
+
+void BookmarkSubMenuModel::BookmarkModelChanged() {
+ if (menu_)
+ menu_->Cancel();
+}
+
+void BookmarkSubMenuModel::BookmarkModelBeingDeleted(
+ BookmarkModel* model) {
+ set_model(NULL);
+ // All our submenus will still have pointers to the model, but this call
+ // should force the menu to close, which will cause them to be deleted.
+ BookmarkModelChanged();
+}
+
+void BookmarkSubMenuModel::MenuWillShow() {
+ Clear();
+ AddCheckItemWithStringId(IDC_SHOW_BOOKMARK_BAR, IDS_SHOW_BOOKMARK_BAR);
+ AddItemWithStringId(IDC_SHOW_BOOKMARK_MANAGER, IDS_BOOKMARK_MANAGER);
+ AddItemWithStringId(IDC_IMPORT_SETTINGS, IDS_IMPORT_SETTINGS_MENU_LABEL);
+ if (!model()) {
+ set_model(browser_->profile()->GetBookmarkModel());
+ if (model())
+ model()->AddObserver(this);
+ }
+ if (!model() ||
+ (model()->bookmark_bar_node()->GetTotalNodeCount() == 0 &&
+ model()->other_node()->GetTotalNodeCount() == 0)) {
+ fixed_items_ = GetItemCount();
+ return;
+ }
+ AddSeparator();
+ fixed_items_ = GetItemCount();
+ if (!node())
+ set_node(model()->bookmark_bar_node());
+ // PopulateMenu() won't clear the items we added above.
+ PopulateMenu();
+ // TODO(mdm): add a separator and the "other bookmarks" node here.
+}
+
+void BookmarkSubMenuModel::ActivatedAt(int index) {
+ // Because this is also overridden in BookmarkNodeMenuModel which doesn't know
+ // we might be prepending items, we have to adjust the index for it.
+ if (index >= fixed_items_)
+ BookmarkNodeMenuModel::ActivatedAt(index - fixed_items_);
+ else
+ SimpleMenuModel::ActivatedAt(index);
+}
+
+void BookmarkSubMenuModel::ActivatedAt(int index, int event_flags) {
+ // Because this is also overridden in BookmarkNodeMenuModel which doesn't know
+ // we might be prepending items, we have to adjust the index for it.
+ if (index >= fixed_items_)
+ BookmarkNodeMenuModel::ActivatedAt(index - fixed_items_, event_flags);
+ else
+ SimpleMenuModel::ActivatedAt(index, event_flags);
+}
+
+bool BookmarkSubMenuModel::IsEnabledAt(int index) const {
+ // We don't want the delegate interfering with bookmark items.
+ return index >= fixed_items_ || SimpleMenuModel::IsEnabledAt(index);
+}
+
+bool BookmarkSubMenuModel::IsVisibleAt(int index) const {
+ // We don't want the delegate interfering with bookmark items.
+ return index >= fixed_items_ || SimpleMenuModel::IsVisibleAt(index);
+}
« no previous file with comments | « chrome/browser/ui/gtk/bookmark_sub_menu_model_gtk.h ('k') | chrome/browser/ui/gtk/bookmarks/bookmark_menu_controller_gtk.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698