aboutsummaryrefslogtreecommitdiffstats
path: root/src/pdm-dialog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdm-dialog.c')
-rw-r--r--src/pdm-dialog.c446
1 files changed, 275 insertions, 171 deletions
diff --git a/src/pdm-dialog.c b/src/pdm-dialog.c
index 8f481055b..e4b7dd04d 100644
--- a/src/pdm-dialog.c
+++ b/src/pdm-dialog.c
@@ -33,6 +33,9 @@
#include "ephy-stock-icons.h"
#include "ephy-debug.h"
#include "ephy-time-helpers.h"
+#include "ephy-embed-single.h"
+#include "ephy-favicon-cache.h"
+#include "ephy-history.h"
#include <gtk/gtklabel.h>
#include <gtk/gtkbox.h>
@@ -45,6 +48,10 @@
#include <gtk/gtkcellrenderertext.h>
#include <gtk/gtknotebook.h>
#include <gtk/gtktogglebutton.h>
+#include <gtk/gtkvbox.h>
+#include <gtk/gtkcheckbutton.h>
+#include <gtk/gtkalignment.h>
+#include <gtk/gtkhseparator.h>
#include <glib/gi18n.h>
#include <string.h>
@@ -61,7 +68,6 @@ struct PdmActionInfo
gpointer data);
void (* remove) (PdmActionInfo *info,
gpointer data);
- void (* remove_all) (PdmActionInfo *info);
void (* scroll_to) (PdmActionInfo *info);
/* Data */
@@ -70,7 +76,6 @@ struct PdmActionInfo
GtkTreeSelection *selection;
GtkTreeModel *model;
int remove_id;
- int remove_all_id;
int data_col;
char *scroll_to_host;
gboolean filled;
@@ -115,14 +120,17 @@ enum
PROP_NOTEBOOK,
PROP_COOKIES_TREEVIEW,
PROP_COOKIES_REMOVE,
- PROP_COOKIES_REMOVE_ALL,
PROP_COOKIES_PROPERTIES,
PROP_PASSWORDS_TREEVIEW,
PROP_PASSWORDS_REMOVE,
- PROP_PASSWORDS_REMOVE_ALL,
PROP_PASSWORDS_SHOW
};
+enum
+{
+ PDM_DIALOG_RESPONSE_CLEAR = 1
+};
+
static const
EphyDialogProperty properties [] =
{
@@ -131,11 +139,9 @@ EphyDialogProperty properties [] =
{ "cookies_treeview", NULL, PT_NORMAL, 0 },
{ "cookies_remove_button", NULL, PT_NORMAL, 0 },
- { "cookies_remove_all_button", NULL, PT_NORMAL, 0 },
{ "cookies_properties_button", NULL, PT_NORMAL, 0 },
{ "passwords_treeview", NULL, PT_NORMAL, 0 },
{ "passwords_remove_button", NULL, PT_NORMAL, 0 },
- { "passwords_remove_all_button",NULL, PT_NORMAL, 0 },
{ "passwords_show_button", NULL, PT_NORMAL, 0 },
{ NULL }
@@ -145,9 +151,8 @@ static void pdm_dialog_class_init (PdmDialogClass *klass);
static void pdm_dialog_init (PdmDialog *dialog);
static void pdm_dialog_finalize (GObject *object);
-static void pdm_dialog_remove_all_confirmation_cb (GtkWidget *dialog,
- int response,
- PdmActionInfo *info);
+static void passwords_changed_cb (EphyPasswordManager *manager,
+ PdmDialog *dialog);
static GObjectClass *parent_class = NULL;
@@ -215,49 +220,260 @@ pdm_dialog_show_help (PdmDialog *pd)
ephy_gui_help (GTK_WINDOW (window), "epiphany", help_preferences[id]);
}
-static void
-action_treeview_selection_changed_cb (GtkTreeSelection *selection,
- PdmActionInfo *action)
+typedef struct
{
- GtkWidget *widget;
- EphyDialog *d = EPHY_DIALOG(action->dialog);
- gboolean has_selection;
-
- has_selection = gtk_tree_selection_count_selected_rows (selection) > 0;
-
- widget = ephy_dialog_get_control (d, properties[action->remove_id].id);
- gtk_widget_set_sensitive (widget, has_selection);
+ EphyDialog *dialog;
+ GtkWidget *checkbutton_history;
+ GtkWidget *checkbutton_cookies;
+ GtkWidget *checkbutton_passwords;
+ GtkWidget *checkbutton_cache;
+ guint num_checked;
+} PdmClearAllDialogButtons;
+static void
+clear_all_dialog_release_cb (PdmClearAllDialogButtons *data)
+{
+ g_slice_free (PdmClearAllDialogButtons, data);
}
static void
-update_remove_all_sensitivity (PdmActionInfo *action)
+clear_all_dialog_response_cb (GtkDialog *dialog,
+ int response,
+ PdmClearAllDialogButtons *checkbuttons)
{
- GtkWidget *widget;
- EphyDialog *d = EPHY_DIALOG(action->dialog);
- gint has_rows;
+ if (response == GTK_RESPONSE_HELP)
+ {
+ /* Show help and return early */
+
+ ephy_gui_help (GTK_WINDOW (dialog), "epiphany", "clearing-personal-data");
+ return;
+ }
+
+ if (response == GTK_RESPONSE_OK)
+ {
+ if (gtk_toggle_button_get_active
+ (GTK_TOGGLE_BUTTON (checkbuttons->checkbutton_history)))
+ {
+ EphyEmbedShell *shell;
+ EphyHistory *history;
+
+ shell = ephy_embed_shell_get_default ();
+ history = EPHY_HISTORY (ephy_embed_shell_get_global_history (shell));
+ ephy_history_clear (history);
+ }
+ if (gtk_toggle_button_get_active
+ (GTK_TOGGLE_BUTTON (checkbuttons->checkbutton_cookies)))
+ {
+ EphyCookieManager *manager;
- has_rows = gtk_tree_model_iter_n_children (action->model, NULL) > 0;
+ manager = EPHY_COOKIE_MANAGER (ephy_embed_shell_get_embed_single
+ (EPHY_EMBED_SHELL (ephy_shell)));
- widget = ephy_dialog_get_control (d, properties[action->remove_all_id].id);
- gtk_widget_set_sensitive (widget, has_rows);
+ ephy_cookie_manager_clear (manager);
+ }
+ if (gtk_toggle_button_get_active
+ (GTK_TOGGLE_BUTTON (checkbuttons->checkbutton_passwords)))
+ {
+ EphyPasswordManager *manager;
+
+ manager = EPHY_PASSWORD_MANAGER (ephy_embed_shell_get_embed_single
+ (EPHY_EMBED_SHELL (ephy_shell)));
+
+ /* we don't remove the password from the liststore in the callback
+ * like we do for cookies, since the callback doesn't carry that
+ * information, and we'd have to reload the whole list, losing the
+ * selection in the process.
+ */
+
+ if (EPHY_IS_PDM_DIALOG (checkbuttons->dialog))
+ {
+ g_signal_handlers_block_by_func
+ (manager, G_CALLBACK (passwords_changed_cb),
+ EPHY_PDM_DIALOG (checkbuttons->dialog));
+ }
+
+ /* Flush the list */
+ ephy_password_manager_remove_all_passwords (manager);
+
+ if (EPHY_IS_PDM_DIALOG (checkbuttons->dialog))
+ {
+ g_signal_handlers_unblock_by_func
+ (manager, G_CALLBACK (passwords_changed_cb),
+ EPHY_PDM_DIALOG (checkbuttons->dialog));
+
+ /* And now refresh explicitly */
+ passwords_changed_cb (manager, EPHY_PDM_DIALOG (checkbuttons->dialog));
+ }
+ }
+ if (gtk_toggle_button_get_active
+ (GTK_TOGGLE_BUTTON (checkbuttons->checkbutton_cache)))
+ {
+ EphyEmbedShell *shell;
+ EphyEmbedSingle *single;
+ EphyFaviconCache *cache;
+
+ shell = ephy_embed_shell_get_default ();
+
+ single = EPHY_EMBED_SINGLE (ephy_embed_shell_get_embed_single (shell));
+
+ ephy_embed_single_clear_cache (single);
+
+ cache = EPHY_FAVICON_CACHE (ephy_embed_shell_get_favicon_cache (shell));
+ ephy_favicon_cache_clear (cache);
+ }
+ }
+ gtk_widget_destroy (GTK_WIDGET (dialog));
}
static void
-action_treemodel_row_deleted_cb (GtkTreeModel *model,
- GtkTreePath *path,
- PdmActionInfo *action)
+clear_all_dialog_checkbutton_toggled_cb (GtkToggleButton *toggle,
+ PdmClearAllDialogButtons *data)
{
- update_remove_all_sensitivity (action);
+ GtkWidget *dialog;
+ dialog = gtk_widget_get_toplevel (GTK_WIDGET (toggle));
+
+ if (gtk_toggle_button_get_active (toggle) == TRUE)
+ {
+ data->num_checked++;
+ }
+ else
+ {
+ data->num_checked--;
+ }
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK,
+ data->num_checked != 0);
+}
+void
+pdm_dialog_show_clear_all_dialog (EphyDialog *edialog,
+ GtkWidget *parent,
+ PdmClearAllDialogFlags flags)
+{
+ GtkWidget *dialog, *vbox;
+ GtkWidget *check, *label;
+ PdmClearAllDialogButtons *checkbuttons;
+
+ dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (parent),
+ GTK_DIALOG_DESTROY_WITH_PARENT |
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_NONE,
+ _("<b>Select the personal data "
+ "you want to clear</b>"));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ _("You are about to clear personal data "
+ "that is stored about the web pages "
+ "you have visited. Before proceeding, "
+ "check the types of information that you "
+ "want to remove:"));
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Clear All Personal Data"));
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+ GTK_STOCK_HELP,
+ GTK_RESPONSE_HELP,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL,
+ GTK_STOCK_CLEAR,
+ GTK_RESPONSE_OK,
+ NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog),
+ GTK_RESPONSE_CANCEL);
+ gtk_label_set_selectable (GTK_LABEL (GTK_MESSAGE_DIALOG (dialog)->label),
+ FALSE);
+
+ vbox = gtk_vbox_new (FALSE, 6);
+ gtk_box_pack_start (GTK_BOX (GTK_MESSAGE_DIALOG (dialog)->label->parent),
+ vbox, FALSE, FALSE, 0);
+
+ checkbuttons = g_slice_new0 (PdmClearAllDialogButtons);
+ checkbuttons->dialog = edialog;
+ checkbuttons->num_checked = 0;
+
+ /* Cookies */
+ check = gtk_check_button_new_with_mnemonic (_("C_ookies"));
+ checkbuttons->checkbutton_cookies = check;
+ gtk_box_pack_start (GTK_BOX (vbox), check,
+ FALSE, FALSE, 0);
+ g_signal_connect (check, "toggled",
+ G_CALLBACK (clear_all_dialog_checkbutton_toggled_cb), checkbuttons);
+ if (flags & CLEAR_ALL_COOKIES)
+ {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
+ }
+
+ /* Passwords */
+ check = gtk_check_button_new_with_mnemonic (_("Saved _passwords"));
+ checkbuttons->checkbutton_passwords = check;
+ gtk_box_pack_start (GTK_BOX (vbox), check,
+ FALSE, FALSE, 0);
+ g_signal_connect (check, "toggled",
+ G_CALLBACK (clear_all_dialog_checkbutton_toggled_cb), checkbuttons);
+ if (flags & CLEAR_ALL_PASSWORDS)
+ {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
+ }
+
+ /* History */
+ check = gtk_check_button_new_with_mnemonic (_("_History"));
+ checkbuttons->checkbutton_history = check;
+ gtk_box_pack_start (GTK_BOX (vbox), check,
+ FALSE, FALSE, 0);
+ g_signal_connect (check, "toggled",
+ G_CALLBACK (clear_all_dialog_checkbutton_toggled_cb), checkbuttons);
+ if (flags & CLEAR_ALL_HISTORY)
+ {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
+ }
+
+ /* Cache */
+ check = gtk_check_button_new_with_mnemonic (_("_Temporary files"));
+ checkbuttons->checkbutton_cache = check;
+ gtk_box_pack_start (GTK_BOX (vbox), check,
+ FALSE, FALSE, 0);
+ g_signal_connect (check, "toggled",
+ G_CALLBACK (clear_all_dialog_checkbutton_toggled_cb), checkbuttons);
+ if (flags & CLEAR_ALL_CACHE)
+ {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
+ }
+
+ /* Show vbox and all checkbuttons */
+ gtk_widget_show_all (vbox);
+
+ label = gtk_label_new (NULL);
+ gtk_label_set_markup (GTK_LABEL (label),
+ _("<small><i><b>Note:</b> You cannot undo this action. "
+ "The data you are choosing to clear "
+ "will be deleted forever.</i></small>"));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+ label, FALSE, FALSE, 0);
+ /* Need to do this or the label will wrap too early */
+ gtk_widget_set_size_request (label, 330, -1);
+ gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+ gtk_misc_set_alignment (GTK_MISC (label),
+ 0, 0);
+ gtk_misc_set_padding (GTK_MISC (label),
+ 6, 0);
+ gtk_widget_show (label);
+
+ gtk_window_present (GTK_WINDOW (dialog));
+ g_signal_connect_data (dialog, "response",
+ G_CALLBACK (clear_all_dialog_response_cb),
+ checkbuttons, (GClosureNotify) clear_all_dialog_release_cb,
+ (GConnectFlags) 0);
}
static void
-action_treemodel_row_inserted_cb (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- PdmActionInfo *action)
+action_treeview_selection_changed_cb (GtkTreeSelection *selection,
+ PdmActionInfo *action)
{
- update_remove_all_sensitivity (action);
+ GtkWidget *widget;
+ EphyDialog *d = EPHY_DIALOG(action->dialog);
+ gboolean has_selection;
+
+ has_selection = gtk_tree_selection_count_selected_rows (selection) > 0;
+
+ widget = ephy_dialog_get_control (d, properties[action->remove_id].id);
+ gtk_widget_set_sensitive (widget, has_selection);
+
}
static void
@@ -355,13 +571,6 @@ pdm_cmd_delete_selection (PdmActionInfo *action)
}
}
-static void
-pdm_cmd_delete_all (PdmActionInfo *action)
-{
- /* No selection to handle here, unconditional call */
- action->remove_all (action);
-}
-
static gboolean
pdm_key_pressed_cb (GtkTreeView *treeview,
GdkEventKey *event,
@@ -385,64 +594,10 @@ pdm_dialog_remove_button_clicked_cb (GtkWidget *button,
}
static void
-pdm_dialog_remove_all_button_clicked_cb (GtkWidget *button,
- PdmActionInfo *action)
-{
- GtkWidget *dialog, *dialog_button, *image, *parent;
- gchar *message, *secondary_text;
-
- switch (action->remove_all_id)
- {
- case PROP_PASSWORDS_REMOVE_ALL:
- message = _("Delete all passwords?");
- secondary_text = _("Removing all passwords means that the web "
- "browser will forget all username and password "
- "combinations that you asked it to remember in the past.");
- break;
- case PROP_COOKIES_REMOVE_ALL:
- message = _("Delete all cookies?");
- secondary_text = _("Web sites that stored a cookie will no longer "
- "be able to track you. However, you may have "
- "to re-enter your username and password on several sites.");
- break;
- default:
- return;
- }
-
- parent = ephy_dialog_get_control (EPHY_DIALOG (action->dialog),
- properties[PROP_WINDOW].id);
-
- dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_WARNING,
- GTK_BUTTONS_CANCEL,
- "%s",
- message);
-
- image = gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_BUTTON);
- dialog_button = gtk_dialog_add_button (GTK_DIALOG (dialog), _("Remove _All"), GTK_RESPONSE_ACCEPT);
- gtk_button_set_image (GTK_BUTTON (dialog_button), image);
- gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
- "%s", secondary_text);
-
- gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
-
- gtk_window_set_title (GTK_WINDOW (dialog), "");
- gtk_window_set_icon_name (GTK_WINDOW (dialog), EPHY_STOCK_EPHY);
-
- g_signal_connect (GTK_WIDGET (dialog), "response",
- G_CALLBACK (pdm_dialog_remove_all_confirmation_cb),
- action);
-
- gtk_window_present (GTK_WINDOW (dialog));
-}
-
-static void
setup_action (PdmActionInfo *action)
{
GtkWidget *widget;
GtkTreeSelection *selection;
- GtkTreeModel *model;
widget = ephy_dialog_get_control (EPHY_DIALOG(action->dialog),
properties[action->remove_id].id);
@@ -450,12 +605,6 @@ setup_action (PdmActionInfo *action)
G_CALLBACK (pdm_dialog_remove_button_clicked_cb),
action);
- widget = ephy_dialog_get_control (EPHY_DIALOG(action->dialog),
- properties[action->remove_all_id].id);
- g_signal_connect (widget, "clicked",
- G_CALLBACK (pdm_dialog_remove_all_button_clicked_cb),
- action);
-
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(action->treeview));
g_signal_connect (selection, "changed",
G_CALLBACK (action_treeview_selection_changed_cb),
@@ -465,16 +614,6 @@ setup_action (PdmActionInfo *action)
"key_press_event",
G_CALLBACK (pdm_key_pressed_cb),
action);
-
- model = action->model;
-
- g_signal_connect (model, "row-deleted",
- G_CALLBACK (action_treemodel_row_deleted_cb),
- action);
-
- g_signal_connect (model, "row-inserted",
- G_CALLBACK (action_treemodel_row_inserted_cb),
- action);
}
/* "Cookies" tab */
@@ -1032,32 +1171,6 @@ pdm_dialog_cookie_remove (PdmActionInfo *info,
ephy_cookie_manager_remove_cookie (manager, cookie);
}
-
-static void
-pdm_dialog_remove_all_confirmation_cb (GtkWidget *dialog,
- gint response,
- PdmActionInfo *action)
-{
- gtk_widget_destroy (dialog);
-
- /* Don't do anything by default */
- if (response != GTK_RESPONSE_ACCEPT)
- return;
-
- pdm_cmd_delete_all (action);
-}
-
-static void
-pdm_dialog_cookie_remove_all (PdmActionInfo *info)
-{
- EphyCookieManager *manager;
-
- manager = EPHY_COOKIE_MANAGER (ephy_embed_shell_get_embed_single
- (EPHY_EMBED_SHELL (ephy_shell)));
-
- ephy_cookie_manager_clear (manager);
-}
-
static void
pdm_dialog_cookie_scroll_to (PdmActionInfo *info)
{
@@ -1288,32 +1401,6 @@ pdm_dialog_password_remove (PdmActionInfo *info,
(manager, G_CALLBACK (passwords_changed_cb), info->dialog);
}
-static void
-pdm_dialog_password_remove_all (PdmActionInfo *info)
-{
- EphyPasswordManager *manager;
-
- manager = EPHY_PASSWORD_MANAGER (ephy_embed_shell_get_embed_single
- (EPHY_EMBED_SHELL (ephy_shell)));
-
- /* we don't remove the password from the liststore in the callback
- * like we do for cookies, since the callback doesn't carry that
- * information, and we'd have to reload the whole list, losing the
- * selection in the process.
- */
- g_signal_handlers_block_by_func
- (manager, G_CALLBACK (passwords_changed_cb), info->dialog);
-
- /* Flush the list */
- ephy_password_manager_remove_all_passwords (manager);
-
- g_signal_handlers_unblock_by_func
- (manager, G_CALLBACK (passwords_changed_cb), info->dialog);
-
- /* And now refresh explicitly */
- passwords_changed_cb (manager, info->dialog);
-}
-
/* common routines */
static void
@@ -1347,6 +1434,29 @@ pdm_dialog_response_cb (GtkDialog *widget,
pdm_dialog_show_help (dialog);
return;
}
+ if (response == PDM_DIALOG_RESPONSE_CLEAR)
+ {
+ int page;
+ GtkWidget *parent;
+
+ parent = ephy_dialog_get_control (EPHY_DIALOG (dialog),
+ properties[PROP_WINDOW].id);
+
+ page = gtk_notebook_get_current_page (GTK_NOTEBOOK (dialog->priv->notebook));
+ if (page == 0)
+ {
+ /* Cookies */
+ pdm_dialog_show_clear_all_dialog (EPHY_DIALOG (dialog),
+ parent, CLEAR_ALL_COOKIES);
+ }
+ if (page == 1)
+ {
+ /* Passwords */
+ pdm_dialog_show_clear_all_dialog (EPHY_DIALOG (dialog),
+ parent, CLEAR_ALL_PASSWORDS);
+ }
+ return;
+ }
g_object_unref (dialog);
}
@@ -1384,10 +1494,8 @@ pdm_dialog_init (PdmDialog *dialog)
*/
ephy_dialog_set_size_group (EPHY_DIALOG (dialog),
properties[PROP_COOKIES_REMOVE].id,
- properties[PROP_COOKIES_REMOVE_ALL].id,
properties[PROP_COOKIES_PROPERTIES].id,
properties[PROP_PASSWORDS_REMOVE].id,
- properties[PROP_PASSWORDS_REMOVE_ALL].id,
NULL);
cookies = g_new0 (PdmActionInfo, 1);
@@ -1396,11 +1504,9 @@ pdm_dialog_init (PdmDialog *dialog)
cookies->fill = pdm_dialog_fill_cookies_list;
cookies->add = pdm_dialog_cookie_add;
cookies->remove = pdm_dialog_cookie_remove;
- cookies->remove_all = pdm_dialog_cookie_remove_all;
cookies->scroll_to = pdm_dialog_cookie_scroll_to;
cookies->dialog = dialog;
cookies->remove_id = PROP_COOKIES_REMOVE;
- cookies->remove_all_id = PROP_COOKIES_REMOVE_ALL;
cookies->data_col = COL_COOKIES_DATA;
cookies->scroll_to_host = NULL;
cookies->filled = FALSE;
@@ -1412,10 +1518,8 @@ pdm_dialog_init (PdmDialog *dialog)
passwords->fill = pdm_dialog_fill_passwords_list;
passwords->add = pdm_dialog_password_add;
passwords->remove = pdm_dialog_password_remove;
- passwords->remove_all = pdm_dialog_password_remove_all;
passwords->dialog = dialog;
passwords->remove_id = PROP_PASSWORDS_REMOVE;
- passwords->remove_all_id = PROP_PASSWORDS_REMOVE_ALL;
passwords->data_col = COL_PASSWORDS_DATA;
passwords->scroll_to_host = NULL;
passwords->filled = FALSE;