2005-02-25 [paul] 1.0.1cvs19.1
[claws.git] / src / gtk / prefswindow.c
index 5149036c62d3beba1a35705ea39ce77fcd2fd51b..345f2368337bbc9209326375ff0666efa9025399 100644 (file)
 #  include "config.h"
 #endif
 
+#include <glib.h>
+#include <glib/gi18n.h>
 #include <string.h>
 #include <gtk/gtk.h>
 #include <gtk/gtktext.h>
 #include <gdk/gdkkeysyms.h>
 
-#include "intl.h"
 #include "utils.h"
 #include "prefswindow.h"
 #include "gtkutils.h"
@@ -72,21 +73,6 @@ struct _PrefsTreeNode
        gfloat     treeweight; /* GTK2: not used */
 };
 
-static GType G_TYPE_AUTO_POINTER;
-
-typedef struct AutoPointerRef {
-       gpointer        pointer;
-       glong           cnt;
-} AutoPointerRef;
-
-typedef struct AutoPointer {
-       AutoPointerRef *ref;
-} AutoPointer;
-
-static gpointer g_auto_pointer_new                     (gpointer pointer);
-static gpointer g_auto_pointer_copy                    (gpointer p);
-static void g_auto_pointer_free                                (gpointer p);
-
 static GtkTreeStore *prefswindow_create_data_store     (void);
 static GtkWidget *prefswindow_tree_view_create         (PrefsWindow* prefswindow);
 static void prefs_filtering_create_tree_view_columns   (GtkWidget *tree_view);
@@ -109,6 +95,20 @@ static void save_all_pages(GSList *prefs_pages)
        }
 }
 
+static gboolean query_can_close_all_pages(GSList *prefs_pages)
+{
+       GSList *cur;
+
+       for (cur = prefs_pages; cur != NULL; cur = g_slist_next(cur)) {
+               PrefsPage *page = (PrefsPage *) cur->data;
+
+               if (page->can_close)
+                       if (!page->can_close(page))
+                               return FALSE;
+       }
+       return TRUE;
+}
+
 static void close_all_pages(GSList *prefs_pages)
 {
        GSList *cur;
@@ -147,8 +147,10 @@ static void ok_button_released(GtkButton *button, gpointer user_data)
 {
        PrefsWindow *prefswindow = (PrefsWindow *) user_data;
 
-       save_all_pages(prefswindow->prefs_pages);
-       close_prefs_window(prefswindow);
+       if (query_can_close_all_pages(prefswindow->prefs_pages)) {
+               save_all_pages(prefswindow->prefs_pages);
+               close_prefs_window(prefswindow);
+       }               
 }
 
 static void cancel_button_released(GtkButton *button, gpointer user_data)
@@ -272,7 +274,7 @@ static void prefswindow_build_tree(GtkWidget *tree_view, GSList *prefs_pages)
                                                   PREFS_PAGE_DATA, &prefs_node,
                                                   -1);
                        } else {
-                               gpointer autoptr; 
+                               GAuto *autoptr; 
                        
                                /* create a new top level */
                                gtk_tree_store_append(store, &child, i == 0 ? NULL : &node);
@@ -397,7 +399,7 @@ void prefswindow_open_full(const gchar *title, GSList *prefs_pages, gpointer dat
 
        gtk_widget_grab_focus(prefswindow->tree_view);
 
-       gtkut_button_set_create_stock(&prefswindow->confirm_area,
+       gtkut_stock_button_set_create(&prefswindow->confirm_area,
                                      &prefswindow->ok_btn,     GTK_STOCK_OK,
                                      &prefswindow->cancel_btn, GTK_STOCK_CANCEL,
                                      &prefswindow->apply_btn,  GTK_STOCK_APPLY);
@@ -425,59 +427,8 @@ void prefswindow_open(const gchar *title, GSList *prefs_pages, gpointer data)
        prefswindow_open_full(title, prefs_pages, data, NULL);
 }
 
-/* NOTE: auto pointer could be made more generic, but this works
- * fine for now. */
-
-static gpointer g_auto_pointer_new(gpointer p)
-{      
-       AutoPointerRef *ref = g_new0(AutoPointerRef, 1);
-       AutoPointer    *ptr = g_new0(AutoPointer, 1);
-
-       ref->pointer = p;
-       ref->cnt = 1;
-
-       ptr->ref = ref;
-
-       return ptr;
-}
-
-static gpointer g_auto_pointer_copy(gpointer p)
-{
-       AutoPointer     *ptr = p;
-       AutoPointerRef  *ref = ptr->ref;
-       AutoPointer     *newp = g_new0(AutoPointer, 1);
-       newp->ref = ref;
-
-       ++(ref->cnt);
-       return newp;
-}
-
-static void g_auto_pointer_free(gpointer p)
-{
-       AutoPointer     *ptr = p;
-       AutoPointerRef  *ref = ptr->ref;
-
-       if (--(ref->cnt) == 0) {
-               g_free(ref->pointer);
-               g_free(ref);
-       }
-       g_free(ptr);            
-}
-
-static void prefswindow_static_init(void)
-{
-       if (!G_TYPE_AUTO_POINTER)
-               G_TYPE_AUTO_POINTER = 
-                       g_boxed_type_register_static("G_TYPE_AUTO_POINTER",
-                                                    g_auto_pointer_copy,
-                                                    g_auto_pointer_free);
-}
-
 static GtkTreeStore *prefswindow_create_data_store(void)
 {
-       /* should always be called before using auto pointer type */
-       prefswindow_static_init();
-       
        return gtk_tree_store_new(N_PREFS_PAGE_COLUMNS,
                                  G_TYPE_STRING,
                                  G_TYPE_POINTER,