/* * Copyright (C) 2000, 2001, 2002 Marco Pesenti Gritti * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "prefs-dialog.h" #include "general-prefs.h" #include "appearance-prefs.h" #include "ephy-dialog.h" #include "ephy-prefs.h" #include "ephy-embed-prefs.h" #include "ephy-shell.h" #include "ephy-state.h" #include #include #include #include #include #include #include #include #include #include #include static void prefs_dialog_class_init (PrefsDialogClass *klass); static void prefs_dialog_init (PrefsDialog *pd); static void prefs_dialog_finalize (GObject *object); /* Glade callbacks */ void prefs_proxy_auto_url_reload_cb (GtkWidget *button, EphyDialog *dialog); void prefs_clear_memory_cache_button_clicked_cb (GtkWidget *button, gpointer data); void prefs_clear_disk_cache_button_clicked_cb (GtkWidget *button, gpointer data); /* Proxy page */ enum { CACHE_COMPARE_PROP, DISK_CACHE_PROP, MEMORY_CACHE_PROP }; static const EphyDialogProperty network_properties [] = { { CACHE_COMPARE_PROP, "cache_compare_radiobutton", CONF_NETWORK_CACHE_COMPARE, PT_AUTOAPPLY, NULL }, { DISK_CACHE_PROP, "disk_cache_spin", CONF_NETWORK_DISK_CACHE, PT_AUTOAPPLY, NULL }, { MEMORY_CACHE_PROP, "memory_cache_spin", CONF_NETWORK_MEMORY_CACHE, PT_AUTOAPPLY, NULL }, { -1, NULL, NULL } }; enum { OPEN_IN_TABS_PROP, JUMP_TO_PROP, POPUPS_PROP }; static const EphyDialogProperty ui_properties [] = { { OPEN_IN_TABS_PROP, "open_in_tabs_checkbutton", CONF_TABS_TABBED, PT_AUTOAPPLY, NULL }, { JUMP_TO_PROP, "jump_to_checkbutton", CONF_TABS_TABBED_AUTOJUMP, PT_AUTOAPPLY, NULL }, { POPUPS_PROP, "popups_checkbutton", CONF_TABS_TABBED_POPUPS, PT_AUTOAPPLY, NULL }, { -1, NULL, NULL } }; struct PrefsDialogPrivate { GtkWidget *notebook; }; static GObjectClass *parent_class = NULL; GType prefs_dialog_get_type (void) { static GType prefs_dialog_type = 0; if (prefs_dialog_type == 0) { static const GTypeInfo our_info = { sizeof (PrefsDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) prefs_dialog_class_init, NULL, NULL, /* class_data */ sizeof (PrefsDialog), 0, /* n_preallocs */ (GInstanceInitFunc) prefs_dialog_init }; prefs_dialog_type = g_type_register_static (GTK_TYPE_DIALOG, "PrefsDialog", &our_info, 0); } return prefs_dialog_type; } GtkDialog * prefs_dialog_new (void) { GtkDialog *dialog; dialog = GTK_DIALOG (g_object_new (PREFS_DIALOG_TYPE, NULL)); return dialog; } static void prefs_dialog_class_init (PrefsDialogClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); object_class->finalize = prefs_dialog_finalize; } static void prefs_dialog_finalize (GObject *object) { PrefsDialog *pd; g_return_if_fail (object != NULL); g_return_if_fail (IS_PREFS_DIALOG (object)); pd = PREFS_DIALOG (object); g_return_if_fail (pd->priv != NULL); g_free (pd->priv); G_OBJECT_CLASS (parent_class)->finalize (object); } static EphyDialog * create_page (PrefsPageID id, const char *page_widget, const EphyDialogProperty *prop) { EphyDialog *page = NULL; switch (id) { case PREFS_PAGE_GENERAL: page = general_prefs_new (); break; case PREFS_PAGE_APPEARANCE: page = appearance_prefs_new (); break; case PREFS_PAGE_UI: case PREFS_PAGE_ADVANCED: page = ephy_dialog_new (); ephy_dialog_construct (EPHY_DIALOG(page), prop, "prefs-dialog.glade", page_widget); break; } return page; } static EphyDialog * prefs_dialog_get_page (PrefsDialog *pd, PrefsPageID id) { const char *page_widget = NULL; EphyDialog *page; const EphyDialogProperty *prop = NULL; switch (id) { case PREFS_PAGE_APPEARANCE: page_widget = "appearance_page_box"; break; case PREFS_PAGE_GENERAL: page_widget = "general_page_box"; break; case PREFS_PAGE_UI: page_widget = "ui_page_box"; prop = ui_properties; break; case PREFS_PAGE_ADVANCED: page_widget = "network_page_box"; prop = network_properties; break; } g_assert (page_widget != NULL); page = create_page (id, page_widget, prop); g_assert (page != NULL); return page; } void prefs_dialog_show_page (PrefsDialog *pd, PrefsPageID id) { gtk_notebook_set_current_page (GTK_NOTEBOOK (pd->priv->notebook), id); } static void prefs_dialog_show_help (PrefsDialog *pd) { GError *err; gint id; err = NULL; gchar *help_preferences[] = { "ephy-preferences-appearance", "ephy-preferences-general", "ephy-preferences-ui", "ephy-preferences-advanced" }; id = gtk_notebook_get_current_page (GTK_NOTEBOOK (pd->priv->notebook)); gnome_help_display ("epiphany", help_preferences [id], &err); if (err != NULL) { GtkWidget *err_dialog; err_dialog = gtk_message_dialog_new ( GTK_WINDOW (pd), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not display help: %s"), err->message); g_signal_connect (G_OBJECT (err_dialog), "response", G_CALLBACK (gtk_widget_destroy), NULL); gtk_window_set_resizable (GTK_WINDOW (err_dialog), FALSE); gtk_widget_show (err_dialog); g_error_free (err); } } static void prefs_dialog_response_cb (GtkDialog *dialog, gint response_id, gpointer data) { GError *err; if (response_id == GTK_RESPONSE_CLOSE) { gtk_widget_destroy (GTK_WIDGET(dialog)); } else if (response_id == GTK_RESPONSE_HELP) { PrefsDialog *pd = (PrefsDialog *)data; prefs_dialog_show_help (pd); } } static void prefs_build_notebook (PrefsDialog *pd) { int i; GtkWidget *nb; struct { char *name; int id; } pages[] = { { _("General"), PREFS_PAGE_GENERAL }, { _("Appearance"), PREFS_PAGE_APPEARANCE }, { _("User Interface"), PREFS_PAGE_UI }, { _("Advanced"), PREFS_PAGE_ADVANCED }, { NULL, 0 } }; gtk_dialog_add_button (GTK_DIALOG (pd), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); gtk_dialog_add_button (GTK_DIALOG (pd), GTK_STOCK_HELP, GTK_RESPONSE_HELP); g_signal_connect (pd, "response", G_CALLBACK (prefs_dialog_response_cb), pd); gtk_container_set_border_width (GTK_CONTAINER (pd), 5); nb = gtk_notebook_new (); gtk_container_set_border_width (GTK_CONTAINER (nb), 5); gtk_widget_show (nb); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (pd)->vbox), nb); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (nb), TRUE); pd->priv->notebook = nb; for (i = 0; pages[i].name != NULL; i++) { GtkWidget *label, *child; EphyDialog *page; page = prefs_dialog_get_page (pd, pages[i].id); child = gtk_hbox_new (FALSE, 0); gtk_widget_show (child); label = gtk_label_new (pages[i].name); gtk_notebook_append_page (GTK_NOTEBOOK (nb), child, label); ephy_dialog_show_embedded (page, child); } } static void prefs_dialog_init (PrefsDialog *pd) { GdkPixbuf *icon; pd->priv = g_new0 (PrefsDialogPrivate, 1); gtk_window_set_title (GTK_WINDOW(pd), _("Preferences")); gtk_dialog_set_has_separator (GTK_DIALOG(pd), FALSE); ephy_state_add_window (GTK_WIDGET(pd), "prefs_dialog", -1, -1); icon = gtk_widget_render_icon (GTK_WIDGET(pd), GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU, "prefs_dialog"); gtk_window_set_icon (GTK_WINDOW(pd), icon); g_object_unref(icon); prefs_build_notebook (pd); } /* Network page callbacks */ void prefs_clear_memory_cache_button_clicked_cb (GtkWidget *button, gpointer data) { EphyEmbedSingle *single; single = ephy_embed_shell_get_embed_single (EPHY_EMBED_SHELL (ephy_shell)); ephy_embed_single_clear_cache (single, MEMORY_CACHE); } void prefs_clear_disk_cache_button_clicked_cb (GtkWidget *button, gpointer data) { EphyEmbedSingle *single; single = ephy_embed_shell_get_embed_single (EPHY_EMBED_SHELL (ephy_shell)); ephy_embed_single_clear_cache (single, DISK_CACHE); }