From 78b09515e67fdd065d53b98a993671336a30e54b Mon Sep 17 00:00:00 2001 From: Gilles Dartiguelongue Date: Thu, 8 Nov 2007 13:36:03 +0000 Subject: Remove useless GtkVBox, remove the useless popup to have an inline header * imap-headers.c: (imap_headers_abort), (imap_headers_commit), (epif_header_is_valid), (epif_add_sensitivity), (epif_add_header), (epif_remove_header_clicked), (epif_fetch_all_headers_toggled), (epif_entry_changed), (org_gnome_imap_headers): * imap-headers.glade: Remove useless GtkVBox, remove the useless popup to have an inline header entry field, concentrate all UI elements in a structure, added a prefix to relevant functions. svn path=/trunk/; revision=34516 --- plugins/imap-features/ChangeLog | 12 ++ plugins/imap-features/imap-headers.c | 220 ++++++++++++++++++++----------- plugins/imap-features/imap-headers.glade | 115 +++++++++------- 3 files changed, 221 insertions(+), 126 deletions(-) (limited to 'plugins') diff --git a/plugins/imap-features/ChangeLog b/plugins/imap-features/ChangeLog index cdbc0f36c6..f4983906d9 100644 --- a/plugins/imap-features/ChangeLog +++ b/plugins/imap-features/ChangeLog @@ -1,3 +1,15 @@ +2007-11-08 Gilles Dartiguelongue + + * imap-headers.c: (imap_headers_abort), (imap_headers_commit), + (epif_header_is_valid), (epif_add_sensitivity), (epif_add_header), + (epif_remove_header_clicked), (epif_fetch_all_headers_toggled), + (epif_entry_changed), (org_gnome_imap_headers): + * imap-headers.glade: + Remove useless GtkVBox, + remove the useless popup to have an inline header entry field, + concentrate all UI elements in a structure, added a prefix to + relevant functions. + 2007-07-30 Andre Klapper * imap-headers.glade: diff --git a/plugins/imap-features/imap-headers.c b/plugins/imap-features/imap-headers.c index 78556bc122..6c65a61153 100644 --- a/plugins/imap-features/imap-headers.c +++ b/plugins/imap-features/imap-headers.c @@ -43,27 +43,38 @@ #include -GtkWidget *all_headers, *basic_headers, *mailing_list_headers; -GtkWidget *custom_headers_box = NULL; -GtkTreeView *custom_headers_tree; -static GtkTreeStore *store; -GtkTreeIter iter; +typedef struct _epif_data EPImapFeaturesData; +struct _epif_data { + GtkWidget *all_headers; + GtkWidget *basic_headers; + GtkWidget *mailing_list_headers; + GtkWidget *custom_headers_box; -GtkButton *add_header, *remove_header; + GtkEntry *entry_header; -gchar **custom_headers_array = NULL; + GtkButton *add_header; + GtkButton *remove_header; -void imap_headers_abort (GtkWidget *button, EConfigHookItemFactoryData *data); -void imap_headers_commit (GtkWidget *button, EConfigHookItemFactoryData *data); + GtkTreeView *custom_headers_tree; + GtkTreeStore *store; + + gchar **custom_headers_array; +}; + +static EPImapFeaturesData *ui = NULL; + +void imap_headers_abort (EPlugin *efp, EConfigHookItemFactoryData *data); +void imap_headers_commit (EPlugin *efp, EConfigHookItemFactoryData *data); GtkWidget * org_gnome_imap_headers (EPlugin *epl, EConfigHookItemFactoryData *data); void -imap_headers_abort (GtkWidget *button, EConfigHookItemFactoryData *data) +imap_headers_abort (EPlugin *efp, EConfigHookItemFactoryData *data) { + /* Nothing to do here */ } void -imap_headers_commit (GtkWidget *button, EConfigHookItemFactoryData *data) +imap_headers_commit (EPlugin *efp, EConfigHookItemFactoryData *data) { EMConfigTargetAccount *target_account; EAccount *account; @@ -87,7 +98,7 @@ imap_headers_commit (GtkWidget *button, EConfigHookItemFactoryData *data) url = camel_url_new (e_account_get_string(account, E_ACCOUNT_SOURCE_URL), &ex); - model = gtk_tree_view_get_model (custom_headers_tree); + model = gtk_tree_view_get_model (ui->custom_headers_tree); if (gtk_tree_model_get_iter_first(model, &iter)) { do { @@ -103,10 +114,10 @@ imap_headers_commit (GtkWidget *button, EConfigHookItemFactoryData *data) camel_url_set_param (url, "imap_custom_headers", header); g_free (header); - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(all_headers))) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->all_headers))) { camel_url_set_param (url, "all_headers", "1"); camel_url_set_param (url, "basic_headers", NULL); - } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(basic_headers))) { + } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ui->basic_headers))) { camel_url_set_param (url, "basic_headers", "1"); camel_url_set_param (url, "all_headers", NULL); } else { @@ -122,72 +133,118 @@ imap_headers_commit (GtkWidget *button, EConfigHookItemFactoryData *data) } } +/* return true is the header is considered valid */ +static gboolean +epif_header_is_valid (const char *header) +{ + gint len = g_utf8_strlen (header, -1); + + if (header[0] == 0 + || g_utf8_strchr (header, len, ':') != NULL + || g_utf8_strchr (header, len, ' ') != NULL) + return FALSE; + + return TRUE; +} + static void -add_header_clicked (GtkButton *button) +epif_add_sensitivity (EPImapFeaturesData *ui) +{ + const char *entry_contents; + GtkTreeIter iter; + gboolean valid; + + /* the add header button should be sensitive if the text box contains + * a valid header string, that is not a duplicate with something already + * in the list view */ + entry_contents = gtk_entry_get_text (GTK_ENTRY (ui->entry_header)); + if (!epif_header_is_valid (entry_contents)) { + gtk_widget_set_sensitive (GTK_WIDGET (ui->add_header), FALSE); + return; + } + + /* check if this is a duplicate */ + valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (ui->store), &iter); + while (valid) { + char *header_name; + + gtk_tree_model_get (GTK_TREE_MODEL (ui->store), &iter, + 0, &header_name, + -1); + if (g_ascii_strcasecmp (header_name, entry_contents) == 0) { + gtk_widget_set_sensitive (GTK_WIDGET (ui->add_header), FALSE); + return; + } + + valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (ui->store), &iter); + } + + gtk_widget_set_sensitive (GTK_WIDGET (ui->add_header), TRUE); +} + +static void +epif_add_header (GtkButton *button, EPImapFeaturesData *ui) { - GtkDialog *dialog; - GtkEntry *header; GtkTreeModel *model; GtkTreeIter iter, first; - gint result; - - dialog = GTK_DIALOG (gtk_dialog_new_with_buttons (_("Custom Header"), - NULL, - GTK_DIALOG_MODAL, - GTK_STOCK_CANCEL, - GTK_RESPONSE_REJECT, - GTK_STOCK_OK, - GTK_RESPONSE_ACCEPT, - NULL)); - header = GTK_ENTRY(gtk_entry_new ()); - gtk_container_add (GTK_CONTAINER(dialog->vbox), GTK_WIDGET(header)); - gtk_dialog_set_default_response (dialog, GTK_RESPONSE_ACCEPT); - gtk_widget_show_all (GTK_WIDGET(dialog)); - result = gtk_dialog_run (GTK_DIALOG (dialog)); - model = gtk_tree_view_get_model (custom_headers_tree); - - switch (result) - { - case GTK_RESPONSE_ACCEPT: - gtk_tree_store_append (GTK_TREE_STORE(model), &iter, NULL); - gtk_tree_store_set (GTK_TREE_STORE(model), &iter, 0, gtk_entry_get_text (header), -1); - break; - } - gtk_widget_destroy (GTK_WIDGET(dialog)); + model = gtk_tree_view_get_model (ui->custom_headers_tree); + gtk_tree_store_append (GTK_TREE_STORE(model), &iter, NULL); + gtk_tree_store_set (GTK_TREE_STORE(model), &iter, 0, gtk_entry_get_text (ui->entry_header), -1); - if (gtk_tree_model_get_iter_first (model, &first)==FALSE) - gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE); + if (gtk_tree_model_get_iter_first (model, &first)!=FALSE) + gtk_widget_set_sensitive (GTK_WIDGET (ui->remove_header), TRUE); + + gtk_entry_set_text (ui->entry_header, ""); + epif_add_sensitivity (ui); } static void -remove_header_clicked (GtkButton *button) +epif_remove_header_clicked (GtkButton *button, EPImapFeaturesData *ui) { GtkTreeSelection *select; GtkTreeModel *model; GtkTreeIter iter, first; - - select = gtk_tree_view_get_selection (custom_headers_tree); + GtkTreePath *path; + gboolean valid = TRUE; + + select = gtk_tree_view_get_selection (ui->custom_headers_tree); if (gtk_tree_selection_get_selected (select, &model, &iter)) { + path = gtk_tree_model_get_path (model, &iter); gtk_tree_store_remove(GTK_TREE_STORE(model), &iter); - } + + if (gtk_tree_path_prev (path)) { + gtk_tree_model_get_iter (model, &iter, path); + } else { + valid = gtk_tree_model_get_iter_first (model, &iter); + } + if (valid) + gtk_tree_selection_select_iter (select, &iter); + } if (gtk_tree_model_get_iter_first (model, &first)==FALSE) gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE); + + epif_add_sensitivity (ui); } static void -fetch_all_headers_toggled (GtkWidget *all_option) +epif_fetch_all_headers_toggled (GtkWidget *all_option, EPImapFeaturesData *ui) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(all_option))) - gtk_widget_set_sensitive (custom_headers_box, FALSE); + gtk_widget_set_sensitive (ui->custom_headers_box, FALSE); else - gtk_widget_set_sensitive (custom_headers_box, TRUE); + gtk_widget_set_sensitive (ui->custom_headers_box, TRUE); } +static void +epif_entry_changed (GtkWidget *entry, EPImapFeaturesData *ui) +{ + epif_add_sensitivity (ui); +} GtkWidget * org_gnome_imap_headers (EPlugin *epl, EConfigHookItemFactoryData *data) @@ -201,7 +258,9 @@ org_gnome_imap_headers (EPlugin *epl, EConfigHookItemFactoryData *data) GladeXML *gladexml; GtkCellRenderer *renderer; GtkTreeViewColumn *column; - GtkTreeIter first; + GtkTreeIter first, iter; + + ui = g_new0 (EPImapFeaturesData, 1); target_account = (EMConfigTargetAccount *)data->config->target; account = target_account->account; @@ -214,18 +273,19 @@ org_gnome_imap_headers (EPlugin *epl, EConfigHookItemFactoryData *data) g_free (gladefile); vbox = glade_xml_get_widget (gladexml, "vbox2"); - all_headers = glade_xml_get_widget (gladexml, "allHeaders"); - basic_headers = glade_xml_get_widget (gladexml, "basicHeaders"); - mailing_list_headers = glade_xml_get_widget (gladexml, "mailingListHeaders"); - custom_headers_box = glade_xml_get_widget (gladexml, "custHeaderHbox"); - custom_headers_tree = GTK_TREE_VIEW(glade_xml_get_widget (gladexml, "custHeaderTree")); - add_header = GTK_BUTTON(glade_xml_get_widget (gladexml, "addHeader")); - remove_header = GTK_BUTTON(glade_xml_get_widget (gladexml, "removeHeader")); + ui->all_headers = glade_xml_get_widget (gladexml, "allHeaders"); + ui->basic_headers = glade_xml_get_widget (gladexml, "basicHeaders"); + ui->mailing_list_headers = glade_xml_get_widget (gladexml, "mailingListHeaders"); + ui->custom_headers_box = glade_xml_get_widget (gladexml, "custHeaderHbox"); + ui->custom_headers_tree = GTK_TREE_VIEW(glade_xml_get_widget (gladexml, "custHeaderTree")); + ui->add_header = GTK_BUTTON(glade_xml_get_widget (gladexml, "addHeader")); + ui->remove_header = GTK_BUTTON(glade_xml_get_widget (gladexml, "removeHeader")); + ui->entry_header = GTK_ENTRY (glade_xml_get_widget (gladexml, "customHeaderEntry")); url = camel_url_new (e_account_get_string(account, E_ACCOUNT_SOURCE_URL), &ex); - store = gtk_tree_store_new (1, G_TYPE_STRING); - gtk_tree_view_set_model (custom_headers_tree, GTK_TREE_MODEL(store)); + ui->store = gtk_tree_store_new (1, G_TYPE_STRING); + gtk_tree_view_set_model (ui->custom_headers_tree, GTK_TREE_MODEL(ui->store)); if (url) { char *custom_headers; @@ -234,39 +294,43 @@ org_gnome_imap_headers (EPlugin *epl, EConfigHookItemFactoryData *data) if (custom_headers) { int i=0; - custom_headers_array = g_strsplit (custom_headers, " ", -1); - while (custom_headers_array[i] ) { - if (strlen(g_strstrip(custom_headers_array[i]))) { - gtk_tree_store_append (store, &iter, NULL); - gtk_tree_store_set (store, &iter, 0, custom_headers_array[i], -1); + ui->custom_headers_array = g_strsplit (custom_headers, " ", -1); + while (ui->custom_headers_array[i] ) { + if (strlen(g_strstrip(ui->custom_headers_array[i]))) { + gtk_tree_store_append (ui->store, &iter, NULL); + gtk_tree_store_set (ui->store, &iter, 0, ui->custom_headers_array[i], -1); } i++; } - g_strfreev (custom_headers_array); + g_strfreev (ui->custom_headers_array); } g_free (custom_headers); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(mailing_list_headers), TRUE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->mailing_list_headers), TRUE); if (camel_url_get_param (url, "all_headers")) { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(all_headers), TRUE); - gtk_widget_set_sensitive (custom_headers_box, FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->all_headers), TRUE); + gtk_widget_set_sensitive (ui->custom_headers_box, FALSE); } else if (camel_url_get_param (url, "basic_headers")) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(basic_headers), TRUE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->basic_headers), TRUE); camel_url_free (url); } renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Custom Headers"), renderer, "text", 0, NULL); - gtk_tree_view_append_column (custom_headers_tree , column); + gtk_tree_view_append_column (ui->custom_headers_tree , column); - if (gtk_tree_model_get_iter_first (gtk_tree_view_get_model (custom_headers_tree), &first)==FALSE) - gtk_widget_set_sensitive (GTK_WIDGET (remove_header), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET (ui->add_header), FALSE); + if (gtk_tree_model_get_iter_first (gtk_tree_view_get_model (ui->custom_headers_tree), &first)==FALSE) + gtk_widget_set_sensitive (GTK_WIDGET (ui->remove_header), FALSE); - g_signal_connect (all_headers, "toggled", G_CALLBACK(fetch_all_headers_toggled), NULL); - g_signal_connect (add_header, "clicked", G_CALLBACK(add_header_clicked), NULL); - g_signal_connect (remove_header, "clicked", G_CALLBACK(remove_header_clicked), NULL); + g_signal_connect (ui->all_headers, "toggled", G_CALLBACK (epif_fetch_all_headers_toggled), ui); + g_signal_connect (ui->add_header, "clicked", G_CALLBACK (epif_add_header), ui); + g_signal_connect (ui->remove_header, "clicked", G_CALLBACK (epif_remove_header_clicked), ui); + g_signal_connect (ui->entry_header, "changed", G_CALLBACK (epif_entry_changed), ui); + g_signal_connect (ui->entry_header, "activate", G_CALLBACK (epif_add_header), ui); gtk_notebook_append_page ((GtkNotebook *)(data->parent), vbox, gtk_label_new(_("IMAP Headers"))); gtk_widget_show_all (vbox); - return NULL; + + return GTK_WIDGET (vbox); } diff --git a/plugins/imap-features/imap-headers.glade b/plugins/imap-features/imap-headers.glade index 0f910cc535..542decd608 100644 --- a/plugins/imap-features/imap-headers.glade +++ b/plugins/imap-features/imap-headers.glade @@ -234,26 +234,58 @@ You can ignore this if you choose "All Headers". 5 - + True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT + False + 6 - + True True - False - False - False - True - False - False - False + True + True + 0 + + True + * + False + + 0 + False + True + + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + False + False + False + True + False + False + False + + + + + 0 + True + True + @@ -264,50 +296,37 @@ You can ignore this if you choose "All Headers". - + True - False - 0 + GTK_BUTTONBOX_START + 6 - + True - GTK_BUTTONBOX_DEFAULT_STYLE - 6 - - - - True - True - gtk-add - True - GTK_RELIEF_NORMAL - True - - + True + gtk-add + True + GTK_RELIEF_NORMAL + True + + - - - True - True - gtk-remove - True - GTK_RELIEF_NORMAL - True - - + + + True + True + gtk-remove + True + GTK_RELIEF_NORMAL + True - - 4 - False - False - - 0 + 4 False - True + False -- cgit v1.2.3