| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/gtk/bookmark_tree_model.h" | 5 #include "chrome/browser/gtk/bookmark_tree_model.h" |
| 6 | 6 |
| 7 #include <gtk/gtk.h> | 7 #include <gtk/gtk.h> |
| 8 | 8 |
| 9 #include "app/resource_bundle.h" | 9 #include "app/resource_bundle.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| 11 #include "chrome/browser/bookmarks/bookmark_model.h" | 11 #include "chrome/browser/bookmarks/bookmark_model.h" |
| 12 #include "chrome/browser/gtk/bookmark_utils_gtk.h" | 12 #include "chrome/browser/gtk/bookmark_utils_gtk.h" |
| 13 #include "chrome/browser/gtk/gtk_theme_provider.h" | 13 #include "chrome/browser/gtk/gtk_theme_provider.h" |
| 14 | 14 |
| 15 namespace { | 15 namespace { |
| 16 | 16 |
| 17 const char* kCellRendererTextKey = "__CELL_RENDERER_TEXT__"; |
| 18 |
| 17 void AddSingleNodeToTreeStore(GtkTreeStore* store, const BookmarkNode* node, | 19 void AddSingleNodeToTreeStore(GtkTreeStore* store, const BookmarkNode* node, |
| 18 GtkTreeIter *iter, GtkTreeIter* parent) { | 20 GtkTreeIter *iter, GtkTreeIter* parent) { |
| 19 gtk_tree_store_append(store, iter, parent); | 21 gtk_tree_store_append(store, iter, parent); |
| 20 // It would be easy to show a different icon when the folder is open (as they | 22 // It would be easy to show a different icon when the folder is open (as they |
| 21 // do on Windows, for example), using pixbuf-expander-closed and | 23 // do on Windows, for example), using pixbuf-expander-closed and |
| 22 // pixbuf-expander-open. Unfortunately there is no GTK_STOCK_OPEN_DIRECTORY | 24 // pixbuf-expander-open. Unfortunately there is no GTK_STOCK_OPEN_DIRECTORY |
| 23 // (and indeed, Nautilus does not render an expanded directory any | 25 // (and indeed, Nautilus does not render an expanded directory any |
| 24 // differently). | 26 // differently). |
| 25 gtk_tree_store_set(store, iter, | 27 gtk_tree_store_set(store, iter, |
| 26 bookmark_utils::FOLDER_ICON, | 28 bookmark_utils::FOLDER_ICON, GtkThemeProvider::GetFolderIcon(true), |
| 27 GtkThemeProvider::GetFolderIcon(true), | 29 bookmark_utils::FOLDER_NAME, WideToUTF8(node->GetTitle()).c_str(), |
| 28 bookmark_utils::FOLDER_NAME, | 30 bookmark_utils::ITEM_ID, node->id(), |
| 29 WideToUTF8(node->GetTitle()).c_str(), | 31 bookmark_utils::IS_EDITABLE, node->is_folder(), |
| 30 bookmark_utils::ITEM_ID, node->id(), | 32 -1); |
| 31 -1); | |
| 32 } | 33 } |
| 33 | 34 |
| 34 // Helper function for CommitTreeStoreDifferencesBetween() which recursively | 35 // Helper function for CommitTreeStoreDifferencesBetween() which recursively |
| 35 // merges changes back from a GtkTreeStore into a tree of BookmarkNodes. This | 36 // merges changes back from a GtkTreeStore into a tree of BookmarkNodes. This |
| 36 // function only works on non-root nodes; our caller handles that special case. | 37 // function only works on non-root nodes; our caller handles that special case. |
| 37 void RecursiveResolve(BookmarkModel* bb_model, const BookmarkNode* bb_node, | 38 void RecursiveResolve(BookmarkModel* bb_model, const BookmarkNode* bb_node, |
| 38 GtkTreeModel* tree_model, GtkTreeIter* parent_iter, | 39 GtkTreeModel* tree_model, GtkTreeIter* parent_iter, |
| 39 GtkTreePath* selected_path, | 40 GtkTreePath* selected_path, |
| 40 const BookmarkNode** selected_node) { | 41 const BookmarkNode** selected_node) { |
| 41 GtkTreePath* current_path = gtk_tree_model_get_path(tree_model, parent_iter); | 42 GtkTreePath* current_path = gtk_tree_model_get_path(tree_model, parent_iter); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 66 DCHECK(child_bb_node); | 67 DCHECK(child_bb_node); |
| 67 bb_model->SetTitle(child_bb_node, title); | 68 bb_model->SetTitle(child_bb_node, title); |
| 68 } | 69 } |
| 69 RecursiveResolve(bb_model, child_bb_node, | 70 RecursiveResolve(bb_model, child_bb_node, |
| 70 tree_model, &child_iter, | 71 tree_model, &child_iter, |
| 71 selected_path, selected_node); | 72 selected_path, selected_node); |
| 72 } while (gtk_tree_model_iter_next(tree_model, &child_iter)); | 73 } while (gtk_tree_model_iter_next(tree_model, &child_iter)); |
| 73 } | 74 } |
| 74 } | 75 } |
| 75 | 76 |
| 77 // Update the folder name in the GtkTreeStore. |
| 78 void OnFolderNameEdited(GtkCellRendererText* render, |
| 79 gchar* path, gchar* new_folder_name, GtkTreeStore* tree_store) { |
| 80 GtkTreeIter folder_iter; |
| 81 GtkTreePath* tree_path = gtk_tree_path_new_from_string(path); |
| 82 gboolean rv = gtk_tree_model_get_iter(GTK_TREE_MODEL(tree_store), |
| 83 &folder_iter, tree_path); |
| 84 DCHECK(rv); |
| 85 gtk_tree_store_set(tree_store, &folder_iter, |
| 86 bookmark_utils::FOLDER_NAME, new_folder_name, |
| 87 -1); |
| 88 gtk_tree_path_free(tree_path); |
| 89 } |
| 90 |
| 76 } // namespace | 91 } // namespace |
| 77 | 92 |
| 78 namespace bookmark_utils { | 93 namespace bookmark_utils { |
| 79 | 94 |
| 80 GtkTreeStore* MakeFolderTreeStore() { | 95 GtkTreeStore* MakeFolderTreeStore() { |
| 81 return gtk_tree_store_new(FOLDER_STORE_NUM_COLUMNS, GDK_TYPE_PIXBUF, | 96 return gtk_tree_store_new(FOLDER_STORE_NUM_COLUMNS, GDK_TYPE_PIXBUF, |
| 82 G_TYPE_STRING, G_TYPE_INT64); | 97 G_TYPE_STRING, G_TYPE_INT64, G_TYPE_BOOLEAN); |
| 83 } | 98 } |
| 84 | 99 |
| 85 void AddToTreeStore(BookmarkModel* model, int64 selected_id, | 100 void AddToTreeStore(BookmarkModel* model, int64 selected_id, |
| 86 GtkTreeStore* store, GtkTreeIter* selected_iter) { | 101 GtkTreeStore* store, GtkTreeIter* selected_iter) { |
| 87 const BookmarkNode* root_node = model->root_node(); | 102 const BookmarkNode* root_node = model->root_node(); |
| 88 for (int i = 0; i < root_node->GetChildCount(); ++i) { | 103 for (int i = 0; i < root_node->GetChildCount(); ++i) { |
| 89 AddToTreeStoreAt(root_node->GetChild(i), selected_id, store, | 104 AddToTreeStoreAt(root_node->GetChild(i), selected_id, store, |
| 90 selected_iter, NULL); | 105 selected_iter, NULL); |
| 91 } | 106 } |
| 92 } | 107 } |
| 93 | 108 |
| 94 GtkWidget* MakeTreeViewForStore(GtkTreeStore* store) { | 109 GtkWidget* MakeTreeViewForStore(GtkTreeStore* store) { |
| 95 GtkTreeViewColumn* column = gtk_tree_view_column_new(); | 110 GtkTreeViewColumn* column = gtk_tree_view_column_new(); |
| 96 GtkCellRenderer* image_renderer = gtk_cell_renderer_pixbuf_new(); | 111 GtkCellRenderer* image_renderer = gtk_cell_renderer_pixbuf_new(); |
| 97 gtk_tree_view_column_pack_start(column, image_renderer, FALSE); | 112 gtk_tree_view_column_pack_start(column, image_renderer, FALSE); |
| 98 gtk_tree_view_column_add_attribute(column, image_renderer, | 113 gtk_tree_view_column_add_attribute(column, image_renderer, |
| 99 "pixbuf", FOLDER_ICON); | 114 "pixbuf", FOLDER_ICON); |
| 100 GtkCellRenderer* text_renderer = gtk_cell_renderer_text_new(); | 115 GtkCellRenderer* text_renderer = gtk_cell_renderer_text_new(); |
| 101 g_object_set(text_renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL); | 116 g_object_set(text_renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL); |
| 117 g_signal_connect(text_renderer, "edited", G_CALLBACK(OnFolderNameEdited), |
| 118 store); |
| 102 gtk_tree_view_column_pack_start(column, text_renderer, TRUE); | 119 gtk_tree_view_column_pack_start(column, text_renderer, TRUE); |
| 103 gtk_tree_view_column_add_attribute(column, text_renderer, | 120 gtk_tree_view_column_set_attributes(column, text_renderer, |
| 104 "text", FOLDER_NAME); | 121 "text", FOLDER_NAME, |
| 122 "editable", IS_EDITABLE, |
| 123 NULL); |
| 105 | 124 |
| 106 GtkWidget* tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); | 125 GtkWidget* tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); |
| 107 // Let |tree_view| own the store. | 126 // Let |tree_view| own the store. |
| 108 g_object_unref(store); | 127 g_object_unref(store); |
| 109 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), FALSE); | 128 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), FALSE); |
| 110 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); | 129 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); |
| 130 g_object_set_data(G_OBJECT(tree_view), kCellRendererTextKey, text_renderer); |
| 111 return tree_view; | 131 return tree_view; |
| 112 } | 132 } |
| 113 | 133 |
| 134 GtkCellRenderer* GetCellRendererText(GtkTreeView* tree_view) { |
| 135 return static_cast<GtkCellRenderer*>( |
| 136 g_object_get_data(G_OBJECT(tree_view), kCellRendererTextKey)); |
| 137 } |
| 138 |
| 114 void AddToTreeStoreAt(const BookmarkNode* node, int64 selected_id, | 139 void AddToTreeStoreAt(const BookmarkNode* node, int64 selected_id, |
| 115 GtkTreeStore* store, GtkTreeIter* selected_iter, | 140 GtkTreeStore* store, GtkTreeIter* selected_iter, |
| 116 GtkTreeIter* parent) { | 141 GtkTreeIter* parent) { |
| 117 if (!node->is_folder()) | 142 if (!node->is_folder()) |
| 118 return; | 143 return; |
| 119 | 144 |
| 120 GtkTreeIter iter; | 145 GtkTreeIter iter; |
| 121 AddSingleNodeToTreeStore(store, node, &iter, parent); | 146 AddSingleNodeToTreeStore(store, node, &iter, parent); |
| 122 if (selected_iter && node->id() == selected_id) { | 147 if (selected_iter && node->id() == selected_id) { |
| 123 // Save the iterator. Since we're using a GtkTreeStore, we're | 148 // Save the iterator. Since we're using a GtkTreeStore, we're |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 ret_val = UTF8ToWide(utf8str); | 219 ret_val = UTF8ToWide(utf8str); |
| 195 g_value_unset(&value); | 220 g_value_unset(&value); |
| 196 } else { | 221 } else { |
| 197 NOTREACHED() << "Impossible type mismatch"; | 222 NOTREACHED() << "Impossible type mismatch"; |
| 198 } | 223 } |
| 199 | 224 |
| 200 return ret_val; | 225 return ret_val; |
| 201 } | 226 } |
| 202 | 227 |
| 203 } // namespace bookmark_utils | 228 } // namespace bookmark_utils |
| OLD | NEW |