diff options
Diffstat (limited to 'chrome/browser/bookmarks/bookmark_menu_controller_gtk.cc')
-rw-r--r-- | chrome/browser/bookmarks/bookmark_menu_controller_gtk.cc | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/chrome/browser/bookmarks/bookmark_menu_controller_gtk.cc b/chrome/browser/bookmarks/bookmark_menu_controller_gtk.cc new file mode 100644 index 0000000..f94ba58 --- /dev/null +++ b/chrome/browser/bookmarks/bookmark_menu_controller_gtk.cc @@ -0,0 +1,107 @@ +// Copyright (c) 2009 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/bookmarks/bookmark_menu_controller_gtk.h" + +#include "base/string_util.h" +#include "chrome/browser/bookmarks/bookmark_context_menu.h" +#include "chrome/browser/profile.h" +#include "chrome/browser/tab_contents/page_navigator.h" +#include "app/resource_bundle.h" +#include "grit/theme_resources.h" +#include "webkit/glue/window_open_disposition.h" + +BookmarkMenuController::BookmarkMenuController(Browser* browser, + Profile* profile, + PageNavigator* navigator, + GtkWindow* window, + BookmarkNode* node, + int start_child_index, + bool show_other_folder) + : browser_(browser), + profile_(profile), + page_navigator_(navigator), + parent_window_(window), + node_(node) { + menu_.reset(new MenuGtk(this, false)); + int next_menu_id = 1; + BuildMenu(node, start_child_index, menu_.get(), &next_menu_id); + + // TODO(erg): Add the BuildOtherFolderMenu() to handle the overflow case from + // the chevron on the bookmark bar. + // + // if (show_other_folder) + // BuildOtherFolderMenu(&next_menu_id); +} + +BookmarkMenuController::~BookmarkMenuController() { + profile_->GetBookmarkModel()->RemoveObserver(this); +} + +void BookmarkMenuController::Popup(GtkWidget* widget, gint button_type, + guint32 timestamp) { + profile_->GetBookmarkModel()->AddObserver(this); + menu_->Popup(widget, button_type, timestamp); +} + +void BookmarkMenuController::BookmarkModelChanged() { + menu_->Cancel(); +} + +void BookmarkMenuController::BookmarkNodeFavIconLoaded(BookmarkModel* model, + BookmarkNode* node) { + if (node_to_menu_id_map_.find(node) != node_to_menu_id_map_.end()) + menu_->SetIcon(node->GetFavIcon(), node_to_menu_id_map_[node]); +} + +bool BookmarkMenuController::IsCommandEnabled(int id) const { + return true; +} + +void BookmarkMenuController::ExecuteCommand(int id) { + DCHECK(page_navigator_); + DCHECK(menu_id_to_node_map_.find(id) != menu_id_to_node_map_.end()); + GURL url = menu_id_to_node_map_[id]->GetURL(); + page_navigator_->OpenURL( + url, GURL(), + // TODO(erg): Plumb mouse events here so things like shift-click or + // ctrl-click do the right things. + // + // event_utils::DispositionFromEventFlags(mouse_event_flags), + CURRENT_TAB, + PageTransition::AUTO_BOOKMARK); +} + +void BookmarkMenuController::BuildMenu(BookmarkNode* parent, + int start_child_index, + MenuGtk* menu, + int* next_menu_id) { + DCHECK(!parent->GetChildCount() || + start_child_index < parent->GetChildCount()); + for (int i = start_child_index; i < parent->GetChildCount(); ++i) { + BookmarkNode* node = parent->GetChild(i); + int id = *next_menu_id; + + (*next_menu_id)++; + if (node->is_url()) { + SkBitmap icon = node->GetFavIcon(); + if (icon.width() == 0) { + icon = *ResourceBundle::GetSharedInstance(). + GetBitmapNamed(IDR_DEFAULT_FAVICON); + } + menu->AppendMenuItemWithIcon(id, WideToUTF8(node->GetTitle()), icon); + node_to_menu_id_map_[node] = id; + } else if (node->is_folder()) { + SkBitmap* folder_icon = ResourceBundle::GetSharedInstance(). + GetBitmapNamed(IDR_BOOKMARK_BAR_FOLDER); + MenuGtk* submenu = + menu->AppendSubMenuWithIcon(id, WideToUTF8(node->GetTitle()), + *folder_icon); + BuildMenu(node, 0, submenu, next_menu_id); + } else { + NOTREACHED(); + } + menu_id_to_node_map_[id] = node; + } +} |