diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-08 17:26:01 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-08 17:26:01 +0000 |
commit | b71a24d4c87b70586acb34eae882c8532fe86aba (patch) | |
tree | 961c542d97b9c46172e42135822f652fd9c4e6f7 /chrome/browser/gtk/bookmark_manager_gtk.cc | |
parent | c8ad40c6b02751c1cc942abe4ecaffbf68bfa611 (diff) | |
download | chromium_src-b71a24d4c87b70586acb34eae882c8532fe86aba.zip chromium_src-b71a24d4c87b70586acb34eae882c8532fe86aba.tar.gz chromium_src-b71a24d4c87b70586acb34eae882c8532fe86aba.tar.bz2 |
GTK bookmark manager: organize menu and aesthetic improvements.
Review URL: http://codereview.chromium.org/118388
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17868 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 | 131 |
1 files changed, 90 insertions, 41 deletions
diff --git a/chrome/browser/gtk/bookmark_manager_gtk.cc b/chrome/browser/gtk/bookmark_manager_gtk.cc index fb529cf..7c864c6 100644 --- a/chrome/browser/gtk/bookmark_manager_gtk.cc +++ b/chrome/browser/gtk/bookmark_manager_gtk.cc @@ -28,6 +28,20 @@ void OnWindowDestroy(GtkWidget* widget, manager = NULL; } +void SetMenuBarStyle() { + static bool style_was_set = false; + + if (style_was_set) + return; + style_was_set = true; + + gtk_rc_parse_string( + "style \"chrome-bm-menubar\" {" + " GtkMenuBar::shadow-type = GTK_SHADOW_NONE" + "}" + "widget \"*chrome-bm-menubar\" style \"chrome-bm-menubar\""); +} + } // namespace // BookmarkManager ------------------------------------------------------------- @@ -53,6 +67,8 @@ void BookmarkManagerGtk::Show(Profile* profile) { return; if (!manager) manager = new BookmarkManagerGtk(profile); + else + gtk_window_present(GTK_WINDOW(manager->window_)); } void BookmarkManagerGtk::BookmarkManagerGtk::Loaded(BookmarkModel* model) { @@ -87,29 +103,40 @@ BookmarkManagerGtk::~BookmarkManagerGtk() { } void BookmarkManagerGtk::InitWidgets() { - GtkToolItem* organize = gtk_tool_button_new(NULL, + 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); + + std::vector<BookmarkNode*> nodes; + organize_menu_.reset(new BookmarkContextMenu(window_, profile_, NULL, NULL, + NULL, nodes, BookmarkContextMenu::BOOKMARK_MANAGER_ORGANIZE_MENU)); + + GtkWidget* organize = gtk_menu_item_new_with_label( l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_ORGANIZE_MENU).c_str()); - GtkToolItem* tools = gtk_tool_button_new(NULL, + gtk_menu_item_set_submenu(GTK_MENU_ITEM(organize), organize_menu_->menu()); + + GtkWidget* tools = gtk_menu_item_new_with_label( l10n_util::GetStringUTF8(IDS_BOOKMARK_MANAGER_TOOLS_MENU).c_str()); + // TODO(estade): create the tools menu. - 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* menu_bar = gtk_menu_bar_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), organize); + gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), tools); + SetMenuBarStyle(); + gtk_widget_set_name(menu_bar, "chrome-bm-menubar"); 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* hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), menu_bar, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(hbox), search_entry, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(hbox), search_label, FALSE, FALSE, kSearchPadding); GtkWidget* left_pane = MakeLeftPane(); GtkWidget* right_pane = MakeRightPane(); @@ -124,16 +151,8 @@ void BookmarkManagerGtk::InitWidgets() { 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), hbox, 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); } @@ -157,13 +176,11 @@ GtkWidget* BookmarkManagerGtk::MakeLeftPane() { GtkWidget* scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), + GTK_SHADOW_ETCHED_IN); gtk_container_add(GTK_CONTAINER(scrolled), left_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; + return scrolled; } GtkWidget* BookmarkManagerGtk::MakeRightPane() { @@ -191,6 +208,8 @@ GtkWidget* BookmarkManagerGtk::MakeRightPane() { gtk_tree_view_append_column(GTK_TREE_VIEW(right_tree_view_), url_column); g_signal_connect(left_selection(), "changed", G_CALLBACK(OnLeftSelectionChanged), this); + g_signal_connect(right_selection(), "changed", + G_CALLBACK(OnRightSelectionChanged), this); gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(right_tree_view_), GDK_BUTTON1_MASK, @@ -209,13 +228,11 @@ GtkWidget* BookmarkManagerGtk::MakeRightPane() { GtkWidget* scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), + GTK_SHADOW_ETCHED_IN); gtk_container_add(GTK_CONTAINER(scrolled), right_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; + return scrolled; } void BookmarkManagerGtk::BuildLeftStore() { @@ -231,7 +248,7 @@ void BookmarkManagerGtk::BuildRightStore() { if (!update_right_store_) return; - BookmarkNode* node = GetSelectedNode(left_selection()); + BookmarkNode* node = GetFolder(); // TODO(estade): eventually we may hit a fake node here (recently bookmarked // or search), but until then we require that node != NULL. DCHECK(node); @@ -256,13 +273,29 @@ BookmarkNode* BookmarkManagerGtk::GetNodeAt(GtkTreeModel* model, return model_->GetNodeByID(id); } -BookmarkNode* BookmarkManagerGtk::GetSelectedNode(GtkTreeSelection* selection) { +BookmarkNode* BookmarkManagerGtk::GetFolder() { GtkTreeModel* model; GtkTreeIter iter; - gtk_tree_selection_get_selected(selection, &model, &iter); + gtk_tree_selection_get_selected(left_selection(), &model, &iter); return GetNodeAt(model, &iter); } +std::vector<BookmarkNode*> BookmarkManagerGtk::GetRightSelection() { + GtkTreeModel* model; + GList* paths = gtk_tree_selection_get_selected_rows(right_selection(), + &model); + std::vector<BookmarkNode*> nodes; + for (GList* item = paths; item; item = item->next) { + GtkTreeIter iter; + gtk_tree_model_get_iter(model, &iter, + reinterpret_cast<GtkTreePath*>(item->data)); + nodes.push_back(GetNodeAt(model, &iter)); + } + g_list_free(paths); + + return nodes; +} + void BookmarkManagerGtk::AppendNodeToRightStore(BookmarkNode* node, GtkTreeIter* iter) { GdkPixbuf* pixbuf = bookmark_utils::GetPixbufForNode(node, model_); @@ -281,18 +314,34 @@ void BookmarkManagerGtk::ToggleUpdatesToRightStore() { BuildRightStore(); } +// static void BookmarkManagerGtk::OnLeftSelectionChanged(GtkTreeSelection* selection, BookmarkManagerGtk* bookmark_manager) { + // Update the context menu. + BookmarkNode* parent = bookmark_manager->GetFolder(); + bookmark_manager->organize_menu_->set_parent(parent); + std::vector<BookmarkNode*> nodes; + nodes.push_back(parent); + bookmark_manager->organize_menu_->set_selection(nodes); + bookmark_manager->BuildRightStore(); } // static +void BookmarkManagerGtk::OnRightSelectionChanged(GtkTreeSelection* selection, + BookmarkManagerGtk* bookmark_manager) { + // Update the context menu. + bookmark_manager->organize_menu_->set_selection( + bookmark_manager->GetRightSelection()); +} + +// static void BookmarkManagerGtk::OnTreeViewDragGet( GtkWidget* tree_view, GdkDragContext* context, GtkSelectionData* selection_data, guint target_type, guint time, BookmarkManagerGtk* bookmark_manager) { - BookmarkNode* node = - bookmark_manager->GetSelectedNode(bookmark_manager->right_selection()); + // TODO(estade): support multiple target drag. + BookmarkNode* node = bookmark_manager->GetRightSelection().at(0); bookmark_utils::WriteBookmarkToSelection(node, selection_data, target_type, bookmark_manager->profile_); } @@ -350,7 +399,7 @@ void BookmarkManagerGtk::OnTreeViewDragReceived( } int idx = !path ? 0 : gtk_tree_path_get_indices(path)[gtk_tree_path_get_depth(path) - 1]; - BookmarkNode* parent = bm->GetSelectedNode(bm->left_selection()); + BookmarkNode* parent = bm->GetFolder(); bm->ToggleUpdatesToRightStore(); for (std::vector<BookmarkNode*>::iterator it = nodes.begin(); |