OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2009 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/gtk/bookmark_manager_gtk.h" |
| 6 |
| 7 #include "app/l10n_util.h" |
| 8 #include "chrome/browser/bookmarks/bookmark_manager.h" |
| 9 #include "chrome/browser/gtk/bookmark_tree_model.h" |
| 10 #include "chrome/browser/profile.h" |
| 11 #include "grit/generated_resources.h" |
| 12 |
| 13 namespace { |
| 14 |
| 15 // Padding between "Search:" and the entry field, in pixels. |
| 16 const int kSearchPadding = 5; |
| 17 |
| 18 // We only have one manager open at a time. |
| 19 BookmarkManagerGtk* manager = NULL; |
| 20 |
| 21 gboolean OnWindowDelete(GtkWidget* widget, GdkEvent* event, gpointer unused) { |
| 22 gtk_widget_destroy(widget); |
| 23 return FALSE; |
| 24 } |
| 25 |
| 26 void OnWindowDestroy(GtkWidget* widget, |
| 27 BookmarkManagerGtk* bookmark_manager) { |
| 28 DCHECK_EQ(bookmark_manager, manager); |
| 29 delete manager; |
| 30 manager = NULL; |
| 31 } |
| 32 |
| 33 } // namespace |
| 34 |
| 35 // BookmarkManager ------------------------------------------------------------- |
| 36 |
| 37 void BookmarkManager::SelectInTree(Profile* profile, BookmarkNode* node) { |
| 38 if (manager && manager->profile() == profile) |
| 39 BookmarkManagerGtk::SelectInTree(node); |
| 40 } |
| 41 |
| 42 void BookmarkManager::Show(Profile* profile) { |
| 43 BookmarkManagerGtk::Show(profile); |
| 44 } |
| 45 |
| 46 // BookmarkManagerGtk, public -------------------------------------------------- |
| 47 |
| 48 void BookmarkManagerGtk::SelectInTree(BookmarkNode* node) { |
| 49 // TODO(estade): Implement. |
| 50 } |
| 51 |
| 52 // static |
| 53 void BookmarkManagerGtk::Show(Profile* profile) { |
| 54 if (!profile->GetBookmarkModel()) |
| 55 return; |
| 56 if (!manager) |
| 57 manager = new BookmarkManagerGtk(profile); |
| 58 } |
| 59 |
| 60 void BookmarkManagerGtk::BookmarkManagerGtk::Loaded(BookmarkModel* model) { |
| 61 BuildLeftStore(); |
| 62 BuildRightStore(); |
| 63 } |
| 64 |
| 65 void BookmarkManagerGtk::BookmarkModelBeingDeleted(BookmarkModel* model) { |
| 66 gtk_widget_destroy(window_); |
| 67 } |
| 68 |
| 69 // BookmarkManagerGtk, private ------------------------------------------------- |
| 70 |
| 71 BookmarkManagerGtk::BookmarkManagerGtk(Profile* profile) |
| 72 : profile_(profile), |
| 73 model_(profile->GetBookmarkModel()) { |
| 74 InitWidgets(); |
| 75 g_signal_connect(window_, "destroy", |
| 76 G_CALLBACK(OnWindowDestroy), this); |
| 77 g_signal_connect(window_, "delete-event", |
| 78 G_CALLBACK(OnWindowDelete), NULL); |
| 79 |
| 80 model_->AddObserver(this); |
| 81 if (model_->IsLoaded()) |
| 82 Loaded(model_); |
| 83 |
| 84 gtk_widget_show_all(window_); |
| 85 } |
| 86 |
| 87 BookmarkManagerGtk::~BookmarkManagerGtk() { |
| 88 } |
| 89 |
| 90 void BookmarkManagerGtk::InitWidgets() { |
| 91 GtkToolItem* organize = gtk_tool_button_new(NULL, |
| 92 l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_ORGANIZE_MENU).c_str()); |
| 93 GtkToolItem* tools = gtk_tool_button_new(NULL, |
| 94 l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_TOOLS_MENU).c_str()); |
| 95 |
| 96 GtkToolItem* spacer = gtk_separator_tool_item_new(); |
| 97 gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(spacer), FALSE); |
| 98 gtk_tool_item_set_expand(spacer, TRUE); |
| 99 |
| 100 GtkWidget* search_label = gtk_label_new( |
| 101 l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_SEARCH_TITLE).c_str()); |
| 102 GtkWidget* search_entry = gtk_entry_new(); |
| 103 GtkWidget* search_hbox = gtk_hbox_new(FALSE, kSearchPadding); |
| 104 gtk_box_pack_start(GTK_BOX(search_hbox), search_label, FALSE, FALSE, 0); |
| 105 gtk_box_pack_start(GTK_BOX(search_hbox), search_entry, FALSE, FALSE, 0); |
| 106 GtkToolItem* search = gtk_tool_item_new(); |
| 107 gtk_container_add(GTK_CONTAINER(search), search_hbox); |
| 108 |
| 109 GtkWidget* toolbar = gtk_toolbar_new(); |
| 110 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), organize, 0); |
| 111 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), tools, 1); |
| 112 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), spacer, 2); |
| 113 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), search, 3); |
| 114 |
| 115 GtkWidget* left_pane = MakeLeftPane(); |
| 116 GtkWidget* right_pane = MakeRightPane(); |
| 117 |
| 118 GtkWidget* paned = gtk_hpaned_new(); |
| 119 // Set the initial position of the pane divider. |
| 120 // TODO(estade): we should set this to one third of the width of the window |
| 121 // when it first shows (depending on the WM, this may or may not be the value |
| 122 // we set below in gtk_window_set_size()). |
| 123 gtk_paned_set_position(GTK_PANED(paned), 200); |
| 124 gtk_paned_pack1(GTK_PANED(paned), left_pane, FALSE, FALSE); |
| 125 gtk_paned_pack2(GTK_PANED(paned), right_pane, TRUE, FALSE); |
| 126 |
| 127 GtkWidget* vbox = gtk_vbox_new(FALSE, 0); |
| 128 gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); |
| 129 gtk_box_pack_start(GTK_BOX(vbox), paned, TRUE, TRUE, 0); |
| 130 |
| 131 window_ = gtk_window_new(GTK_WINDOW_TOPLEVEL); |
| 132 gtk_window_set_title(GTK_WINDOW(window_), |
| 133 l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_TITLE).c_str()); |
| 134 // TODO(estade): use dimensions based on |
| 135 // IDS_BOOKMARK_MANAGER_DIALOG_WIDTH_CHARS and |
| 136 // IDS_BOOKMARK_MANAGER_DIALOG_HEIGHT_LINES. |
| 137 gtk_window_set_default_size(GTK_WINDOW(window_), 640, 480); |
| 138 gtk_container_add(GTK_CONTAINER(window_), vbox); |
| 139 } |
| 140 |
| 141 GtkWidget* BookmarkManagerGtk::MakeLeftPane() { |
| 142 left_store_ = bookmark_utils::MakeFolderTreeStore(); |
| 143 |
| 144 GtkTreeViewColumn* icon_column = gtk_tree_view_column_new_with_attributes( |
| 145 "", gtk_cell_renderer_pixbuf_new(), "pixbuf", bookmark_utils::FOLDER_ICON, |
| 146 NULL); |
| 147 GtkTreeViewColumn* name_column = gtk_tree_view_column_new_with_attributes( |
| 148 "", gtk_cell_renderer_text_new(), "text", bookmark_utils::FOLDER_NAME, |
| 149 NULL); |
| 150 |
| 151 GtkWidget* tree_view = |
| 152 gtk_tree_view_new_with_model(GTK_TREE_MODEL(left_store_)); |
| 153 // Let |tree_view| own the store. |
| 154 g_object_unref(left_store_); |
| 155 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), FALSE); |
| 156 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), icon_column); |
| 157 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), name_column); |
| 158 |
| 159 GtkWidget* scrolled = gtk_scrolled_window_new(NULL, NULL); |
| 160 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), |
| 161 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
| 162 gtk_container_add(GTK_CONTAINER(scrolled), tree_view); |
| 163 |
| 164 GtkWidget* frame = gtk_frame_new(NULL); |
| 165 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN); |
| 166 gtk_container_add(GTK_CONTAINER(frame), scrolled); |
| 167 |
| 168 return frame; |
| 169 } |
| 170 |
| 171 GtkWidget* BookmarkManagerGtk::MakeRightPane() { |
| 172 right_store_ = gtk_list_store_new(RIGHT_PANE_NUM, |
| 173 G_TYPE_STRING, G_TYPE_STRING); |
| 174 |
| 175 GtkTreeViewColumn* title_column = gtk_tree_view_column_new_with_attributes( |
| 176 l10n_util::GetStringUTF8(IDS_BOOKMARK_TABLE_TITLE).c_str(), |
| 177 gtk_cell_renderer_text_new(), "text", RIGHT_PANE_TITLE, NULL); |
| 178 GtkTreeViewColumn* url_column = gtk_tree_view_column_new_with_attributes( |
| 179 l10n_util::GetStringUTF8(IDS_BOOKMARK_TABLE_URL).c_str(), |
| 180 gtk_cell_renderer_text_new(), "text", RIGHT_PANE_URL, NULL); |
| 181 |
| 182 GtkWidget* tree_view = |
| 183 gtk_tree_view_new_with_model(GTK_TREE_MODEL(right_store_)); |
| 184 // Let |tree_view| own the store. |
| 185 g_object_unref(right_store_); |
| 186 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), title_column); |
| 187 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), url_column); |
| 188 |
| 189 GtkWidget* scrolled = gtk_scrolled_window_new(NULL, NULL); |
| 190 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), |
| 191 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); |
| 192 gtk_container_add(GTK_CONTAINER(scrolled), tree_view); |
| 193 |
| 194 GtkWidget* frame = gtk_frame_new(NULL); |
| 195 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN); |
| 196 gtk_container_add(GTK_CONTAINER(frame), scrolled); |
| 197 |
| 198 return frame; |
| 199 } |
| 200 |
| 201 void BookmarkManagerGtk::BuildLeftStore() { |
| 202 bookmark_utils::AddToTreeStore(model_, 0, left_store_, NULL); |
| 203 // TODO(estade): Add recently bookmarked node and search node. |
| 204 } |
| 205 |
| 206 void BookmarkManagerGtk::BuildRightStore() { |
| 207 // TODO(estade): Implement. |
| 208 GtkTreeIter iter; |
| 209 gtk_list_store_append(right_store_, &iter); |
| 210 gtk_list_store_set(right_store_, &iter, RIGHT_PANE_TITLE, "Not implemented", |
| 211 -1); |
| 212 } |
OLD | NEW |