diff options
Diffstat (limited to 'chrome/browser/gtk/options/cookies_view.cc')
-rw-r--r-- | chrome/browser/gtk/options/cookies_view.cc | 254 |
1 files changed, 82 insertions, 172 deletions
diff --git a/chrome/browser/gtk/options/cookies_view.cc b/chrome/browser/gtk/options/cookies_view.cc index ee0d213..69ac82c 100644 --- a/chrome/browser/gtk/options/cookies_view.cc +++ b/chrome/browser/gtk/options/cookies_view.cc @@ -4,6 +4,7 @@ #include "chrome/browser/gtk/options/cookies_view.h" +#include <gdk/gdkkeysyms.h> #include <set> #include <string> @@ -12,7 +13,7 @@ #include "base/i18n/time_formatting.h" #include "base/message_loop.h" #include "base/string_util.h" -#include "chrome/browser/cookies_table_model.h" +#include "chrome/browser/cookies_tree_model.h" #include "chrome/common/gtk_util.h" #include "grit/generated_resources.h" @@ -21,10 +22,6 @@ namespace { // Initial size for dialog. const int kDialogDefaultWidth = 550; const int kDialogDefaultHeight = 550; -const int kSiteColumnInitialSize = 300; - -// Delay after entering filter text before filtering occurs. -const int kSearchFilterDelayMs = 100; // Response ids for our custom buttons. enum { @@ -70,8 +67,7 @@ void CookiesView::Show(Profile* profile) { } CookiesView::CookiesView(Profile* profile) - : profile_(profile), - filter_update_factory_(this) { + : profile_(profile) { Init(); } @@ -115,29 +111,6 @@ void CookiesView::Init() { g_signal_connect(dialog_, "response", G_CALLBACK(OnResponse), this); g_signal_connect(dialog_, "destroy", G_CALLBACK(OnWindowDestroy), this); - // Filtering controls. - GtkWidget* filter_hbox = gtk_hbox_new(FALSE, gtk_util::kControlSpacing); - filter_entry_ = gtk_entry_new(); - g_signal_connect(G_OBJECT(filter_entry_), "activate", - G_CALLBACK(OnFilterEntryActivated), this); - g_signal_connect(G_OBJECT(filter_entry_), "changed", - G_CALLBACK(OnFilterEntryChanged), this); - gtk_box_pack_start(GTK_BOX(filter_hbox), filter_entry_, - TRUE, TRUE, 0); - filter_clear_button_ = gtk_button_new_with_mnemonic( - gtk_util::ConvertAcceleratorsFromWindowsStyle( - l10n_util::GetStringUTF8(IDS_COOKIES_CLEAR_SEARCH_LABEL)).c_str()); - g_signal_connect(G_OBJECT(filter_clear_button_), "clicked", - G_CALLBACK(OnFilterClearButtonClicked), this); - gtk_box_pack_start(GTK_BOX(filter_hbox), filter_clear_button_, - FALSE, FALSE, 0); - - GtkWidget* filter_controls = gtk_util::CreateLabeledControlsGroup(NULL, - l10n_util::GetStringUTF8(IDS_COOKIES_SEARCH_LABEL).c_str(), filter_hbox, - NULL); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), filter_controls, - FALSE, FALSE, 0); - // Cookie list. GtkWidget* cookie_list_vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), cookie_list_vbox, @@ -157,48 +130,32 @@ void CookiesView::Init() { GTK_SHADOW_ETCHED_IN); gtk_box_pack_start(GTK_BOX(cookie_list_vbox), scroll_window, TRUE, TRUE, 0); - list_store_ = gtk_list_store_new(COL_COUNT, - G_TYPE_STRING, - G_TYPE_STRING); - list_sort_ = gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(list_store_)); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(list_sort_), - COL_SITE, CompareSite, this, NULL); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(list_sort_), - COL_COOKIE_NAME, CompareCookieName, this, - NULL); - gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(list_sort_), - COL_SITE, GTK_SORT_ASCENDING); - tree_ = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_sort_)); - g_object_unref(list_store_); - g_object_unref(list_sort_); + cookies_tree_model_.reset(new CookiesTreeModel(profile_)); + cookies_tree_adapter_.reset( + new gtk_tree::TreeAdapter(this, cookies_tree_model_.get())); + tree_ = gtk_tree_view_new_with_model( + GTK_TREE_MODEL(cookies_tree_adapter_->tree_store())); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_), TRUE); gtk_container_add(GTK_CONTAINER(scroll_window), tree_); - GtkTreeViewColumn* site_column = gtk_tree_view_column_new(); - GtkCellRenderer* site_renderer = gtk_cell_renderer_text_new(); - gtk_tree_view_column_pack_start(site_column, site_renderer, TRUE); - gtk_tree_view_column_add_attribute(site_column, site_renderer, "text", - COL_SITE); + GtkTreeViewColumn* title_column = gtk_tree_view_column_new(); + GtkCellRenderer* pixbuf_renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(title_column, pixbuf_renderer, FALSE); + gtk_tree_view_column_add_attribute(title_column, pixbuf_renderer, "pixbuf", + gtk_tree::TreeAdapter::COL_ICON); + GtkCellRenderer* title_renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(title_column, title_renderer, TRUE); + gtk_tree_view_column_add_attribute(title_column, title_renderer, "text", + gtk_tree::TreeAdapter::COL_TITLE); gtk_tree_view_column_set_title( - site_column, l10n_util::GetStringUTF8( + title_column, l10n_util::GetStringUTF8( IDS_COOKIES_DOMAIN_COLUMN_HEADER).c_str()); - gtk_tree_view_column_set_sort_column_id(site_column, COL_SITE); - gtk_tree_view_column_set_sizing(site_column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_resizable(site_column, TRUE); - gtk_tree_view_column_set_fixed_width(site_column, kSiteColumnInitialSize); - gtk_tree_view_append_column(GTK_TREE_VIEW(tree_), site_column); - - GtkTreeViewColumn* name_column = gtk_tree_view_column_new_with_attributes( - l10n_util::GetStringUTF8( - IDS_COOKIES_NAME_COLUMN_HEADER).c_str(), - gtk_cell_renderer_text_new(), - "text", COL_COOKIE_NAME, - NULL); - gtk_tree_view_column_set_sort_column_id(name_column, COL_COOKIE_NAME); - gtk_tree_view_append_column(GTK_TREE_VIEW(tree_), name_column); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree_), title_column); + g_signal_connect(G_OBJECT(tree_), "key-press-event", + G_CALLBACK(OnTreeViewKeyPress), this); selection_ = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_)); - gtk_tree_selection_set_mode(selection_, GTK_SELECTION_MULTIPLE); + gtk_tree_selection_set_mode(selection_, GTK_SELECTION_SINGLE); g_signal_connect(G_OBJECT(selection_), "changed", G_CALLBACK(OnSelectionChanged), this); @@ -228,14 +185,12 @@ void CookiesView::Init() { InitCookieDetailRow(row++, IDS_COOKIES_COOKIE_EXPIRES_LABEL, &cookie_expires_entry_); - // Initialize model. - cookies_table_model_.reset(new CookiesTableModel(profile_)); - cookies_table_adapter_.reset( - new gtk_tree::TableAdapter(this, list_store_, - cookies_table_model_.get())); - cookies_table_adapter_->OnModelChanged(); + // Populate the view. + cookies_tree_adapter_->Init(); + gtk_tree_view_expand_all(GTK_TREE_VIEW(tree_)); + EnableControls(); - if (cookies_table_model_->RowCount() > 0) + if (cookies_tree_model_->GetChildCount(cookies_tree_model_->GetRoot())) gtk_tree::SelectAndFocusRowNum(0, GTK_TREE_VIEW(tree_)); } @@ -274,18 +229,26 @@ void CookiesView::InitCookieDetailRow(int row, int label_id, } void CookiesView::EnableControls() { - int num_selected = gtk_tree_selection_count_selected_rows(selection_); - gtk_widget_set_sensitive(remove_button_, num_selected > 0); + GtkTreeIter iter; + bool selected = gtk_tree_selection_get_selected(selection_, NULL, &iter); + gtk_widget_set_sensitive(remove_button_, selected); gtk_widget_set_sensitive( - remove_all_button_, cookies_table_model_->RowCount() > 0); - - const gchar* filter_text = gtk_entry_get_text(GTK_ENTRY(filter_entry_)); - gtk_widget_set_sensitive(filter_clear_button_, filter_text && *filter_text); - - if (num_selected == 1) - PopulateCookieDetails(); - else + remove_all_button_, + cookies_tree_model_->GetChildCount(cookies_tree_model_->GetRoot())); + + if (selected) { + CookieTreeNode::DetailedInfo detailed_info = + static_cast<CookieTreeNode*>( + cookies_tree_adapter_->GetNode(&iter))->GetDetailedInfo(); + if (detailed_info.node_type == CookieTreeNode::DetailedInfo::TYPE_COOKIE) { + PopulateCookieDetails(detailed_info.cookie->first, + detailed_info.cookie->second); + } else { + ClearCookieDetails(); + } + } else { ClearCookieDetails(); + } } void CookiesView::SetCookieDetailsSensitivity(gboolean enabled) { @@ -298,20 +261,9 @@ void CookiesView::SetCookieDetailsSensitivity(gboolean enabled) { gtk_widget_set_sensitive(cookie_expires_entry_, enabled); } -void CookiesView::PopulateCookieDetails() { - GList* list = gtk_tree_selection_get_selected_rows(selection_, NULL); - if (!list) { - NOTREACHED(); - return; - } - int selected_index = gtk_tree::GetTreeSortChildRowNumForPath( - list_sort_, static_cast<GtkTreePath*>(list->data)); - g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL); - g_list_free(list); - - const std::string& domain = cookies_table_model_->GetDomainAt(selected_index); - const net::CookieMonster::CanonicalCookie& cookie = - cookies_table_model_->GetCookieAt(selected_index); +void CookiesView::PopulateCookieDetails( + const std::string& domain, + const net::CookieMonster::CanonicalCookie& cookie) { gtk_entry_set_text(GTK_ENTRY(cookie_name_entry_), cookie.Name().c_str()); gtk_entry_set_text(GTK_ENTRY(cookie_content_entry_), cookie.Value().c_str()); gtk_entry_set_text(GTK_ENTRY(cookie_domain_entry_), domain.c_str()); @@ -349,20 +301,31 @@ void CookiesView::ClearCookieDetails() { SetCookieDetailsSensitivity(FALSE); } -void CookiesView::RemoveSelectedCookies() { - GList* list = gtk_tree_selection_get_selected_rows(selection_, NULL); - std::set<int> selected_rows; - GList* node; - for (node = list; node != NULL; node = node->next) { - selected_rows.insert(gtk_tree::GetTreeSortChildRowNumForPath( - list_sort_, static_cast<GtkTreePath*>(node->data))); - } - g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL); - g_list_free(list); - - for (std::set<int>::reverse_iterator selected = selected_rows.rbegin(); - selected != selected_rows.rend(); ++selected) { - cookies_table_model_->RemoveCookies(*selected, 1); +void CookiesView::RemoveSelectedItems() { + GtkTreeIter iter; + bool selected = gtk_tree_selection_get_selected(selection_, NULL, &iter); + if (selected) { + GtkTreePath* path = gtk_tree_model_get_path( + GTK_TREE_MODEL(cookies_tree_adapter_->tree_store()), + &iter); + CookieTreeNode* node = static_cast<CookieTreeNode*>( + cookies_tree_adapter_->GetNode(&iter)); + cookies_tree_model_->DeleteCookieNode(node); + // After removing a node, try to select the "next" node. + // We call gtk_tree_model_get_iter to check if there is still a node at the + // pointed to by path. If not, we try to select the previous node in that + // subtree. If that subtree is empty, we then try to select the parent. + if (gtk_tree_model_get_iter( + GTK_TREE_MODEL(cookies_tree_adapter_->tree_store()), + &iter, + path)) { + gtk_tree_selection_select_iter(selection_, &iter); + } else if (gtk_tree_path_prev(path)) { + gtk_tree_selection_select_path(selection_, path); + } else if (gtk_tree_path_up(path)) { + gtk_tree_selection_select_path(selection_, path); + } + gtk_tree_path_free(path); } } @@ -379,46 +342,13 @@ void CookiesView::OnAnyModelUpdate() { EnableControls(); } -void CookiesView::SetColumnValues(int row, GtkTreeIter* iter) { - std::wstring site = cookies_table_model_->GetText( - row, IDS_COOKIES_DOMAIN_COLUMN_HEADER); - std::wstring name = cookies_table_model_->GetText( - row, IDS_COOKIES_NAME_COLUMN_HEADER); - gtk_list_store_set(list_store_, iter, - COL_SITE, WideToUTF8(site).c_str(), - COL_COOKIE_NAME, WideToUTF8(name).c_str(), - -1); -} - -// Compare the value of the given column at the given rows. -gint CookiesView::CompareRows(GtkTreeModel* model, GtkTreeIter* a, - GtkTreeIter* b, int column_id) { - int row1 = gtk_tree::GetRowNumForIter(model, a); - int row2 = gtk_tree::GetRowNumForIter(model, b); - return cookies_table_model_->CompareValues(row1, row2, column_id); -} - -// static -gint CookiesView::CompareSite(GtkTreeModel* model, GtkTreeIter* a, - GtkTreeIter* b, gpointer window) { - return static_cast<CookiesView*>(window)->CompareRows( - model, a, b, IDS_COOKIES_DOMAIN_COLUMN_HEADER); -} - -// static -gint CookiesView::CompareCookieName(GtkTreeModel* model, GtkTreeIter* a, - GtkTreeIter* b, gpointer window) { - return static_cast<CookiesView*>(window)->CompareRows( - model, a, b, IDS_COOKIES_NAME_COLUMN_HEADER); -} - // static void CookiesView::OnResponse(GtkDialog* dialog, int response_id, CookiesView* window) { if (response_id == RESPONSE_REMOVE) { - window->RemoveSelectedCookies(); + window->RemoveSelectedItems(); } else if (response_id == RESPONSE_REMOVE_ALL) { - window->cookies_table_model_->RemoveAllShownCookies(); + window->cookies_tree_model_->DeleteAllCookies(); } else { gtk_widget_destroy(window->dialog_); } @@ -436,32 +366,12 @@ void CookiesView::OnSelectionChanged(GtkTreeSelection *selection, window->EnableControls(); } -void CookiesView::UpdateFilterResults() { - const gchar* text = gtk_entry_get_text(GTK_ENTRY(filter_entry_)); - if (text) - cookies_table_model_->UpdateSearchResults(UTF8ToWide(text)); -} - // static -void CookiesView::OnFilterEntryActivated(GtkEntry* entry, CookiesView* window) { - window->filter_update_factory_.RevokeAll(); - window->UpdateFilterResults(); -} - -// static -void CookiesView::OnFilterEntryChanged(GtkEditable* editable, - CookiesView* window) { - window->filter_update_factory_.RevokeAll(); - MessageLoop::current()->PostDelayedTask(FROM_HERE, - window->filter_update_factory_.NewRunnableMethod( - &CookiesView::UpdateFilterResults), kSearchFilterDelayMs); - window->EnableControls(); -} - -// static -void CookiesView::OnFilterClearButtonClicked(GtkButton* button, - CookiesView* window) { - gtk_entry_set_text(GTK_ENTRY(window->filter_entry_), ""); - window->filter_update_factory_.RevokeAll(); - window->UpdateFilterResults(); +gboolean CookiesView::OnTreeViewKeyPress( + GtkWidget* tree_view, GdkEventKey* key, CookiesView* window) { + if (key->keyval == GDK_Delete) { + window->RemoveSelectedItems(); + return TRUE; + } + return FALSE; } |