diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-03 17:23:36 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-03 17:23:36 +0000 |
commit | 1e7bab7fc3f214061e216722e7879c7e1580059a (patch) | |
tree | 88f2b82fa0d0c2afd3f85b544b650a73a04c5978 /chrome/browser/gtk/bookmark_manager_gtk.cc | |
parent | 0c9ee9904acbfe0766f488edb207ff232635efd3 (diff) | |
download | chromium_src-1e7bab7fc3f214061e216722e7879c7e1580059a.zip chromium_src-1e7bab7fc3f214061e216722e7879c7e1580059a.tar.gz chromium_src-1e7bab7fc3f214061e216722e7879c7e1580059a.tar.bz2 |
Linux bookmark manager first cut.
Also add icons to bookmark tree model.
Review URL: http://codereview.chromium.org/118150
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17489 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/bookmark_manager_gtk.cc')
-rw-r--r-- | chrome/browser/gtk/bookmark_manager_gtk.cc | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/chrome/browser/gtk/bookmark_manager_gtk.cc b/chrome/browser/gtk/bookmark_manager_gtk.cc new file mode 100644 index 0000000..f8f1c15 --- /dev/null +++ b/chrome/browser/gtk/bookmark_manager_gtk.cc @@ -0,0 +1,212 @@ +// 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/gtk/bookmark_manager_gtk.h" + +#include "app/l10n_util.h" +#include "chrome/browser/bookmarks/bookmark_manager.h" +#include "chrome/browser/gtk/bookmark_tree_model.h" +#include "chrome/browser/profile.h" +#include "grit/generated_resources.h" + +namespace { + +// Padding between "Search:" and the entry field, in pixels. +const int kSearchPadding = 5; + +// We only have one manager open at a time. +BookmarkManagerGtk* manager = NULL; + +gboolean OnWindowDelete(GtkWidget* widget, GdkEvent* event, gpointer unused) { + gtk_widget_destroy(widget); + return FALSE; +} + +void OnWindowDestroy(GtkWidget* widget, + BookmarkManagerGtk* bookmark_manager) { + DCHECK_EQ(bookmark_manager, manager); + delete manager; + manager = NULL; +} + +} // namespace + +// BookmarkManager ------------------------------------------------------------- + +void BookmarkManager::SelectInTree(Profile* profile, BookmarkNode* node) { + if (manager && manager->profile() == profile) + BookmarkManagerGtk::SelectInTree(node); +} + +void BookmarkManager::Show(Profile* profile) { + BookmarkManagerGtk::Show(profile); +} + +// BookmarkManagerGtk, public -------------------------------------------------- + +void BookmarkManagerGtk::SelectInTree(BookmarkNode* node) { + // TODO(estade): Implement. +} + +// static +void BookmarkManagerGtk::Show(Profile* profile) { + if (!profile->GetBookmarkModel()) + return; + if (!manager) + manager = new BookmarkManagerGtk(profile); +} + +void BookmarkManagerGtk::BookmarkManagerGtk::Loaded(BookmarkModel* model) { + BuildLeftStore(); + BuildRightStore(); +} + +void BookmarkManagerGtk::BookmarkModelBeingDeleted(BookmarkModel* model) { + gtk_widget_destroy(window_); +} + +// BookmarkManagerGtk, private ------------------------------------------------- + +BookmarkManagerGtk::BookmarkManagerGtk(Profile* profile) + : profile_(profile), + model_(profile->GetBookmarkModel()) { + InitWidgets(); + g_signal_connect(window_, "destroy", + G_CALLBACK(OnWindowDestroy), this); + g_signal_connect(window_, "delete-event", + G_CALLBACK(OnWindowDelete), NULL); + + model_->AddObserver(this); + if (model_->IsLoaded()) + Loaded(model_); + + gtk_widget_show_all(window_); +} + +BookmarkManagerGtk::~BookmarkManagerGtk() { +} + +void BookmarkManagerGtk::InitWidgets() { + GtkToolItem* organize = gtk_tool_button_new(NULL, + l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_ORGANIZE_MENU).c_str()); + GtkToolItem* tools = gtk_tool_button_new(NULL, + l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_TOOLS_MENU).c_str()); + + GtkToolItem* spacer = gtk_separator_tool_item_new(); + gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(spacer), FALSE); + gtk_tool_item_set_expand(spacer, TRUE); + + GtkWidget* search_label = gtk_label_new( + l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_SEARCH_TITLE).c_str()); + GtkWidget* search_entry = gtk_entry_new(); + GtkWidget* search_hbox = gtk_hbox_new(FALSE, kSearchPadding); + gtk_box_pack_start(GTK_BOX(search_hbox), search_label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(search_hbox), search_entry, FALSE, FALSE, 0); + GtkToolItem* search = gtk_tool_item_new(); + gtk_container_add(GTK_CONTAINER(search), search_hbox); + + GtkWidget* toolbar = gtk_toolbar_new(); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), organize, 0); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), tools, 1); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), spacer, 2); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), search, 3); + + GtkWidget* left_pane = MakeLeftPane(); + GtkWidget* right_pane = MakeRightPane(); + + GtkWidget* paned = gtk_hpaned_new(); + // Set the initial position of the pane divider. + // TODO(estade): we should set this to one third of the width of the window + // when it first shows (depending on the WM, this may or may not be the value + // we set below in gtk_window_set_size()). + gtk_paned_set_position(GTK_PANED(paned), 200); + gtk_paned_pack1(GTK_PANED(paned), left_pane, FALSE, FALSE); + gtk_paned_pack2(GTK_PANED(paned), right_pane, TRUE, FALSE); + + GtkWidget* vbox = gtk_vbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), paned, TRUE, TRUE, 0); + + window_ = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(window_), + l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_TITLE).c_str()); + // TODO(estade): use dimensions based on + // IDS_BOOKMARK_MANAGER_DIALOG_WIDTH_CHARS and + // IDS_BOOKMARK_MANAGER_DIALOG_HEIGHT_LINES. + gtk_window_set_default_size(GTK_WINDOW(window_), 640, 480); + gtk_container_add(GTK_CONTAINER(window_), vbox); +} + +GtkWidget* BookmarkManagerGtk::MakeLeftPane() { + left_store_ = bookmark_utils::MakeFolderTreeStore(); + + GtkTreeViewColumn* icon_column = gtk_tree_view_column_new_with_attributes( + "", gtk_cell_renderer_pixbuf_new(), "pixbuf", bookmark_utils::FOLDER_ICON, + NULL); + GtkTreeViewColumn* name_column = gtk_tree_view_column_new_with_attributes( + "", gtk_cell_renderer_text_new(), "text", bookmark_utils::FOLDER_NAME, + NULL); + + GtkWidget* tree_view = + gtk_tree_view_new_with_model(GTK_TREE_MODEL(left_store_)); + // Let |tree_view| own the store. + g_object_unref(left_store_); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), FALSE); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), icon_column); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), name_column); + + GtkWidget* scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(scrolled), tree_view); + + GtkWidget* frame = gtk_frame_new(NULL); + gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN); + gtk_container_add(GTK_CONTAINER(frame), scrolled); + + return frame; +} + +GtkWidget* BookmarkManagerGtk::MakeRightPane() { + right_store_ = gtk_list_store_new(RIGHT_PANE_NUM, + G_TYPE_STRING, G_TYPE_STRING); + + GtkTreeViewColumn* title_column = gtk_tree_view_column_new_with_attributes( + l10n_util::GetStringUTF8(IDS_BOOKMARK_TABLE_TITLE).c_str(), + gtk_cell_renderer_text_new(), "text", RIGHT_PANE_TITLE, NULL); + GtkTreeViewColumn* url_column = gtk_tree_view_column_new_with_attributes( + l10n_util::GetStringUTF8(IDS_BOOKMARK_TABLE_URL).c_str(), + gtk_cell_renderer_text_new(), "text", RIGHT_PANE_URL, NULL); + + GtkWidget* tree_view = + gtk_tree_view_new_with_model(GTK_TREE_MODEL(right_store_)); + // Let |tree_view| own the store. + g_object_unref(right_store_); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), title_column); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), url_column); + + GtkWidget* scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(scrolled), tree_view); + + GtkWidget* frame = gtk_frame_new(NULL); + gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN); + gtk_container_add(GTK_CONTAINER(frame), scrolled); + + return frame; +} + +void BookmarkManagerGtk::BuildLeftStore() { + bookmark_utils::AddToTreeStore(model_, 0, left_store_, NULL); + // TODO(estade): Add recently bookmarked node and search node. +} + +void BookmarkManagerGtk::BuildRightStore() { + // TODO(estade): Implement. + GtkTreeIter iter; + gtk_list_store_append(right_store_, &iter); + gtk_list_store_set(right_store_, &iter, RIGHT_PANE_TITLE, "Not implemented", + -1); +} |