2005-01-04 [colin] 0.9.13cvs25.9
authorColin Leroy <colin@colino.net>
Tue, 4 Jan 2005 13:51:22 +0000 (13:51 +0000)
committerColin Leroy <colin@colino.net>
Tue, 4 Jan 2005 13:51:22 +0000 (13:51 +0000)
* src/compose.c
Fix Show Ruler menuitem
* src/prefs_template.c
Convert to GTK2
* src/common/utils.c
Make auto pointer stuff handles NULLs
Patches by Alfons.

ChangeLog-gtk2.claws
PATCHSETS
configure.ac
src/common/utils.c
src/compose.c
src/prefs_template.c

index ad255a67d8e57c8ac003527095e644b33b3e8a60..9d96724e925c8a6a7f6e40abd34c06ba5b8e9bdc 100644 (file)
@@ -1,3 +1,13 @@
+2005-01-04 [colin]     0.9.13cvs25.9
+
+       * src/compose.c
+               Fix Show Ruler menuitem
+       * src/prefs_template.c
+               Convert to GTK2
+       * src/common/utils.c
+               Make auto pointer stuff handles NULLs
+               Patches by Alfons.
+
 2005-01-04 [colin]     0.9.13cvs25.8
 
        * src/compose.c
index ad3f345c8fa5a9d0c6ec4d804a7c078eda594373..524ae7dff68f113aa4f7da069184183afbed2a5c 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.1.4.2 -r 1.1.4.3 src/gtk/gtkshruler.c; ) > 0.9.13cvs25.6.patchset
 ( cvs diff -u -r 1.96.2.38 -r 1.96.2.39 src/textview.c; ) > 0.9.13cvs25.7.patchset
 ( cvs diff -u -r 1.382.2.83 -r 1.382.2.84 src/compose.c; ) > 0.9.13cvs25.8.patchset
+( cvs diff -u -r 1.382.2.84 -r 1.382.2.85 src/compose.c; cvs diff -u -r 1.12.2.5 -r 1.12.2.6 src/prefs_template.c; cvs diff -u -r 1.36.2.19 -r 1.36.2.20 src/common/utils.c; ) > 0.9.13cvs25.9.patchset
index 94ab9d87d694d1de5d56ce9637a176ca83d75c7a..cd895fee9c53bae3c184d1526d88dceb82213705 100644 (file)
@@ -13,7 +13,7 @@ INTERFACE_AGE=0
 BINARY_AGE=0
 EXTRA_VERSION=25
 EXTRA_RELEASE=
-EXTRA_GTK2_VERSION=.8
+EXTRA_GTK2_VERSION=.9
 
 if test \( $EXTRA_VERSION -eq 0 \) -o \( "x$EXTRA_RELEASE" != "x" \); then
     VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}${EXTRA_RELEASE}${EXTRA_GTK2_VERSION}
index b0f9e5516ef6c8857ccc2e7160e05b9e7b67dd0e..be25f07b0ef419090ce16586a15e32797d752eec 100644 (file)
@@ -3822,8 +3822,14 @@ typedef struct AutoPointer {
  */
 GAuto *g_auto_pointer_new(gpointer p)
 {
-       AutoPointerRef *ref = g_new0(AutoPointerRef, 1);
-       AutoPointer    *ptr = g_new0(AutoPointer, 1);
+       AutoPointerRef *ref;
+       AutoPointer    *ptr;
+       
+       if (p == NULL) 
+               return NULL;
+
+       ref = g_new0(AutoPointerRef, 1);
+       ptr = g_new0(AutoPointer, 1);
 
        ref->pointer = p;
        ref->free = g_free;
@@ -3842,15 +3848,21 @@ GAuto *g_auto_pointer_new(gpointer p)
  *             free the guarded pointer
  */
 GAuto *g_auto_pointer_new_with_free(gpointer p, GFreeFunc free_)
-{      
-       AutoPointer *aptr = g_auto_pointer_new(p);
+{
+       AutoPointer *aptr;
+       
+       if (p == NULL)
+               return NULL;
 
+       aptr = g_auto_pointer_new(p);
        aptr->ref->free = free_;
        return aptr; 
 }
 
 gpointer g_auto_pointer_get_ptr(GAuto *auto_ptr)
 {
+       if (auto_ptr == NULL) 
+               return NULL;
        return ((AutoPointer *) auto_ptr)->ptr; 
 }
 
@@ -3866,9 +3878,16 @@ gpointer g_auto_pointer_get_ptr(GAuto *auto_ptr)
  */
 GAuto *g_auto_pointer_copy(GAuto *auto_ptr)
 {
-       AutoPointer     *ptr = auto_ptr;
-       AutoPointerRef  *ref = ptr->ref;
-       AutoPointer     *newp = g_new0(AutoPointer, 1);
+       AutoPointer     *ptr;
+       AutoPointerRef  *ref;
+       AutoPointer     *newp;
+
+       if (auto_ptr == NULL) 
+               return NULL;
+
+       ptr = auto_ptr;
+       ref = ptr->ref;
+       newp = g_new0(AutoPointer, 1);
 
        newp->ref = ref;
        newp->ptr = ref->pointer;
@@ -3884,8 +3903,14 @@ GAuto *g_auto_pointer_copy(GAuto *auto_ptr)
  */
 void g_auto_pointer_free(GAuto *auto_ptr)
 {
-       AutoPointer     *ptr = auto_ptr;
-       AutoPointerRef  *ref = ptr->ref;
+       AutoPointer     *ptr;
+       AutoPointerRef  *ref;
+       
+       if (auto_ptr == NULL)
+               return;
+
+       ptr = auto_ptr;
+       ref = ptr->ref;
 
        if (--(ref->cnt) == 0) {
                G_PRINT_REF ("XXXX FREE(%lx) -- REF (%d)\n", ref->pointer, ref->cnt);
index 41acb1262eed3becf94e2f53709aa2300864607b..3bfee2f2fee62814abbb9cad2fcdacdbdbae82bf 100644 (file)
@@ -4793,6 +4793,7 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
        GtkItemFactory *ifactory;
        GtkWidget *tmpl_menu;
        gint n_entries;
+       GtkWidget *menuitem;
 
 #if USE_ASPELL
         GtkAspell * gtkaspell = NULL;
@@ -5127,7 +5128,6 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
        if (mode != COMPOSE_REDIRECT)
                compose_set_template_menu(compose);
        else {
-               GtkWidget *menuitem;
                menuitem = gtk_item_factory_get_item(ifactory, "/Tools/Template");
                menu_set_sensitive(ifactory, "/Tools/Template", FALSE);
        }
@@ -5136,6 +5136,10 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
 
        if (!prefs_common.show_ruler)
                gtk_widget_hide(ruler_hbox);
+               
+       menuitem = gtk_item_factory_get_item(ifactory, "/Tools/Show ruler");
+       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
+                                      prefs_common.show_ruler);
 
        /* Priority */
        compose->priority = PRIORITY_NORMAL;
index bc1ab4daef0cb336d73314bde697c062a285cf3c..30a5b1c77a606432eb8fcdd95249b6b5db6ffbf1 100644 (file)
 #include "addr_compl.h"
 #include "quote_fmt.h"
 
+enum {
+       TEMPL_TEXT,
+       TEMPL_DATA,
+       TEMPL_AUTO_DATA,        /*!< auto pointer */
+       N_TEMPL_COLUMNS
+};
+
 static struct Templates {
        GtkWidget *window;
        GtkWidget *ok_btn;
-       GtkWidget *clist_tmpls;
+       GtkWidget *list_view;
        GtkWidget *entry_name;
        GtkWidget *entry_subject;
        GtkWidget *entry_to;
@@ -67,14 +74,23 @@ static gboolean prefs_template_key_pressed_cb       (GtkWidget      *widget,
                                                 gpointer        data);
 static void prefs_template_cancel_cb           (void);
 static void prefs_template_ok_cb               (void);
-static void prefs_template_select_cb           (GtkCList       *clist,
-                                                gint            row,
-                                                gint            column,
-                                                GdkEvent       *event);
 static void prefs_template_register_cb         (void);
 static void prefs_template_substitute_cb       (void);
 static void prefs_template_delete_cb           (void);
 
+static GtkListStore* prefs_template_create_data_store  (void);
+static void prefs_template_list_view_insert_template   (GtkWidget *list_view,
+                                                        GtkTreeIter *row_iter,
+                                                        const gchar *template,
+                                                        Template *data);
+static GtkWidget *prefs_template_list_view_create      (void);
+static void prefs_template_create_list_view_columns    (GtkWidget *list_view);
+static gboolean prefs_template_selected                        (GtkTreeSelection *selector,
+                                                        GtkTreeModel *model, 
+                                                        GtkTreePath *path,
+                                                        gboolean currently_selected,
+                                                        gpointer data);
+
 /* Called from mainwindow.c */
 void prefs_template_open(void)
 {
@@ -126,13 +142,11 @@ static void prefs_template_window_create(void)
        GtkWidget           *del_btn;
        GtkWidget         *desc_btn;
        GtkWidget       *scroll1;
-       GtkWidget         *clist_tmpls;
+       GtkWidget         *list_view;
        GtkWidget       *confirm_area;
        GtkWidget         *ok_btn;
        GtkWidget         *cancel_btn;
 
-       gchar *title[1];
-
        /* main window */
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
@@ -213,7 +227,7 @@ static void prefs_template_window_create(void)
        gtk_widget_show(hbox3);
        gtk_box_pack_start(GTK_BOX(hbox2), hbox3, FALSE, FALSE, 0);
 
-       reg_btn = gtk_button_new_with_label(_("Add"));
+       reg_btn = gtk_button_new_from_stock(GTK_STOCK_ADD);
        gtk_widget_show(reg_btn);
        gtk_box_pack_start(GTK_BOX(hbox3), reg_btn, FALSE, TRUE, 0);
        g_signal_connect(G_OBJECT (reg_btn), "clicked",
@@ -226,7 +240,7 @@ static void prefs_template_window_create(void)
                         G_CALLBACK(prefs_template_substitute_cb),
                         NULL);
 
-       del_btn = gtk_button_new_with_label(_("Delete"));
+       del_btn = gtk_button_new_from_stock(GTK_STOCK_REMOVE);
        gtk_widget_show(del_btn);
        gtk_box_pack_start(GTK_BOX(hbox3), del_btn, FALSE, TRUE, 0);
        g_signal_connect(G_OBJECT(del_btn), "clicked",
@@ -245,23 +259,15 @@ static void prefs_template_window_create(void)
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll1),
                                       GTK_POLICY_AUTOMATIC,
                                       GTK_POLICY_AUTOMATIC);
-
-       title[0] = _("Current templates");
-       clist_tmpls = gtk_clist_new_with_titles(1, title);
-       gtk_widget_show(clist_tmpls);
+                                      
+       list_view = prefs_template_list_view_create();
+       gtk_widget_show(list_view);
        gtk_widget_set_size_request(scroll1, -1, 140);
-       gtk_container_add(GTK_CONTAINER(scroll1), clist_tmpls);
-       gtk_clist_set_column_width(GTK_CLIST(clist_tmpls), 0, 80);
-       gtk_clist_set_selection_mode(GTK_CLIST(clist_tmpls),
-                                    GTK_SELECTION_BROWSE);
-       GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(clist_tmpls)->column[0].button,
-                              GTK_CAN_FOCUS);
-       g_signal_connect(G_OBJECT (clist_tmpls), "select_row",
-                        G_CALLBACK (prefs_template_select_cb), NULL);
+       gtk_container_add(GTK_CONTAINER(scroll1), list_view);
 
        /* ok | cancel */
-       gtkut_button_set_create(&confirm_area, &ok_btn, _("OK"),
-                               &cancel_btn, _("Cancel"), NULL, NULL);
+       gtkut_button_set_create_stock(&confirm_area, &ok_btn, GTK_STOCK_OK,
+                                     &cancel_btn, GTK_STOCK_CANCEL, NULL, NULL);
        gtk_widget_show(confirm_area);
        gtk_box_pack_end(GTK_BOX(vbox2), confirm_area, FALSE, FALSE, 0);
        gtk_widget_grab_default(ok_btn);
@@ -282,7 +288,7 @@ static void prefs_template_window_create(void)
 
        templates.window = window;
        templates.ok_btn = ok_btn;
-       templates.clist_tmpls = clist_tmpls;
+       templates.list_view = list_view;
        templates.entry_name = entry_name;
        templates.entry_subject = entry_subject;
        templates.entry_to = entry_to;
@@ -293,49 +299,44 @@ static void prefs_template_window_create(void)
 
 static void prefs_template_window_setup(void)
 {
-       GtkCList *clist = GTK_CLIST(templates.clist_tmpls);
        GSList *tmpl_list;
        GSList *cur;
        gchar *title[1];
        gint row;
        Template *tmpl;
+       GtkListStore *store;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW
+                               (templates.list_view)));
 
        manage_window_set_transient(GTK_WINDOW(templates.window));
        gtk_widget_grab_focus(templates.ok_btn);
 
-       gtk_clist_freeze(clist);
-       gtk_clist_clear(clist);
-
-       title[0] = _("(New)");
-       row = gtk_clist_append(clist, title);
-       gtk_clist_set_row_data(clist, row, NULL);
+       gtk_list_store_clear(store);
 
+       prefs_template_list_view_insert_template(templates.list_view,
+                                                NULL, _("(New)"),
+                                                NULL);
+       
        tmpl_list = template_read_config();
 
        for (cur = tmpl_list; cur != NULL; cur = cur->next) {
                tmpl = (Template *)cur->data;
-               title[0] = tmpl->name;
-               row = gtk_clist_append(clist, title);
-               gtk_clist_set_row_data(clist, row, tmpl);
+               prefs_template_list_view_insert_template(templates.list_view,
+                                                        NULL, tmpl->name, 
+                                                        tmpl);
        }
 
        g_slist_free(tmpl_list);
-
-       gtk_clist_thaw(clist);
 }
 
 static void prefs_template_clear(void)
 {
-       Template *tmpl;
-       gint row = 1;
-
-       while ((tmpl = gtk_clist_get_row_data
-               (GTK_CLIST(templates.clist_tmpls), row)) != NULL) {
-               template_free(tmpl);
-               row++;
-       }
+       GtkListStore *store;
 
-       gtk_clist_clear(GTK_CLIST(templates.clist_tmpls));
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW
+                               (templates.list_view)));
+       gtk_list_store_clear(store);
 }
 
 static gint prefs_template_deleted_cb(GtkWidget *widget, GdkEventAny *event,
@@ -360,7 +361,7 @@ static void prefs_template_ok_cb(void)
        tmpl_list = prefs_template_get_list();
        template_set_config(tmpl_list);
        compose_reflect_prefs_all();
-       gtk_clist_clear(GTK_CLIST(templates.clist_tmpls));
+       prefs_template_clear();
        gtk_widget_hide(templates.window);
        inc_unlock();
 }
@@ -372,58 +373,58 @@ static void prefs_template_cancel_cb(void)
        inc_unlock();
 }
 
-static void prefs_template_select_cb(GtkCList *clist, gint row, gint column,
-                                    GdkEvent *event)
-{
-       Template *tmpl;
-       Template tmpl_def;
-       GtkTextBuffer *buffer;
-       GtkTextIter iter;
-
-       tmpl_def.name = _("Template");
-       tmpl_def.subject = "";
-       tmpl_def.to = "";
-       tmpl_def.cc = "";
-       tmpl_def.bcc = "";      
-       tmpl_def.value = "";
-
-       if (!(tmpl = gtk_clist_get_row_data(clist, row)))
-               tmpl = &tmpl_def;
-
-       gtk_entry_set_text(GTK_ENTRY(templates.entry_name), tmpl->name);
-       gtk_entry_set_text(GTK_ENTRY(templates.entry_to),
-                          tmpl->to ? tmpl->to : "");
-       gtk_entry_set_text(GTK_ENTRY(templates.entry_cc),
-                          tmpl->cc ? tmpl->cc : "");
-       gtk_entry_set_text(GTK_ENTRY(templates.entry_bcc),
-                          tmpl->bcc ? tmpl->bcc : "");                 
-       gtk_entry_set_text(GTK_ENTRY(templates.entry_subject),
-                          tmpl->subject ? tmpl->subject : "");
-       
-       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(templates.text_value));
-       gtk_text_buffer_set_text(buffer, "", -1);
-       gtk_text_buffer_get_start_iter(buffer, &iter);
-       gtk_text_buffer_insert(buffer, &iter, tmpl->value, -1);
-}
-
+/*!
+ *\brief       Request list for storage. New list is owned
+ *             by template.c...
+ */
 static GSList *prefs_template_get_list(void)
 {
-       gint row = 1;
        GSList *tmpl_list = NULL;
        Template *tmpl;
-
-       while ((tmpl = gtk_clist_get_row_data
-               (GTK_CLIST(templates.clist_tmpls), row)) != NULL) {
-               tmpl_list = g_slist_append(tmpl_list, tmpl);
-               row++;
-       }
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+
+       model = gtk_tree_view_get_model(GTK_TREE_VIEW(templates.list_view));
+       if (!gtk_tree_model_get_iter_first(model, &iter))
+               return NULL;
+
+       do {
+               gtk_tree_model_get(model, &iter,
+                                  TEMPL_DATA, &tmpl,
+                                  -1);
+               
+               if (tmpl) {
+                       Template *ntmpl;
+                       
+                       ntmpl = g_new(Template, 1);
+                       ntmpl->name    = tmpl->name && *(tmpl->name) 
+                                        ? g_strdup(tmpl->name) 
+                                        : NULL;
+                       ntmpl->subject = tmpl->subject && *(tmpl->subject) 
+                                        ? g_strdup(tmpl->subject) 
+                                        : NULL;
+                       ntmpl->to      = tmpl->to && *(tmpl->to)
+                                        ? g_strdup(tmpl->to)
+                                        : NULL;
+                       ntmpl->cc      = tmpl->cc && *(tmpl->cc)
+                                        ? g_strdup(tmpl->cc)
+                                        : NULL;
+                       ntmpl->bcc     = tmpl->bcc && *(tmpl->bcc)
+                                        ? g_strdup(tmpl->bcc)
+                                        : NULL;        
+                       ntmpl->value   = tmpl->value && *(tmpl->value)
+                                        ? g_strdup(tmpl->value)
+                                        : NULL;
+                       tmpl_list = g_slist_append(tmpl_list, ntmpl);
+               }                       
+       
+       } while (gtk_tree_model_iter_next(model, &iter)); 
 
        return tmpl_list;
 }
 
-static gint prefs_template_clist_set_row(gint row)
+static void prefs_template_list_view_set_row(GtkTreeIter *row)
 {
-       GtkCList *clist = GTK_CLIST(templates.clist_tmpls);
        Template *tmpl;
        Template *tmp_tmpl;
        gchar *name;
@@ -432,11 +433,11 @@ static gint prefs_template_clist_set_row(gint row)
        gchar *cc;
        gchar *bcc;     
        gchar *value;
-       gchar *title[1];
        GtkTextBuffer *buffer;
        GtkTextIter start, end;
+       GtkTreeModel *model;
 
-       g_return_val_if_fail(row != 0, -1);
+       model = gtk_tree_view_get_model(GTK_TREE_VIEW(templates.list_view));
 
        buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(templates.text_value));
        gtk_text_buffer_get_start_iter(buffer, &start);
@@ -455,7 +456,7 @@ static gint prefs_template_clist_set_row(gint row)
                if (!parsed_buf) {
                        alertpanel_error(_("Template format error."));
                        g_free(value);
-                       return -1;
+                       return;
                }
        }
 
@@ -495,59 +496,189 @@ static gint prefs_template_clist_set_row(gint row)
        tmpl->bcc = bcc;        
        tmpl->value = value;
 
-       title[0] = name;
-
-       if (row < 0) {
-               row = gtk_clist_append(clist, title);
-       } else {
-               gtk_clist_set_text(clist, row, 0, name);
-               tmp_tmpl = gtk_clist_get_row_data(clist, row);
-               if (tmp_tmpl)
-                       template_free(tmp_tmpl);
-       }
-
-       gtk_clist_set_row_data(clist, row, tmpl);
-       return row;
+       prefs_template_list_view_insert_template(templates.list_view,
+                                                row, tmpl->name, tmpl);
 }
 
 static void prefs_template_register_cb(void)
 {
-       prefs_template_clist_set_row(-1);
+       prefs_template_list_view_set_row(NULL);
 }
 
 static void prefs_template_substitute_cb(void)
 {
-       GtkCList *clist = GTK_CLIST(templates.clist_tmpls);
        Template *tmpl;
-       gint row;
+       GtkTreeIter row;
+       GtkTreeSelection *selection;
+       GtkTreeModel *model;
 
-       if (!clist->selection) return;
+       selection = gtk_tree_view_get_selection
+                       (GTK_TREE_VIEW(templates.list_view));
+       
+       if (!gtk_tree_selection_get_selected(selection, &model, &row))
+               return;
 
-       row = GPOINTER_TO_INT(clist->selection->data);
-       if (row == 0) return;
+       gtk_tree_model_get(model, &row, 
+                          TEMPL_DATA, &tmpl,
+                          -1);
 
-       tmpl = gtk_clist_get_row_data(clist, row);
        if (!tmpl) return;
 
-       prefs_template_clist_set_row(row);
+       prefs_template_list_view_set_row(&row);
 }
 
 static void prefs_template_delete_cb(void)
 {
-       GtkCList *clist = GTK_CLIST(templates.clist_tmpls);
        Template *tmpl;
-       gint row;
+       GtkTreeIter row;
+       GtkTreeSelection *selection;
+       GtkTreeModel *model;
 
-       if (!clist->selection) return;
-       row = GPOINTER_TO_INT(clist->selection->data);
-       if (row == 0) return;
+       selection = gtk_tree_view_get_selection
+                       (GTK_TREE_VIEW(templates.list_view));
+       
+       if (!gtk_tree_selection_get_selected(selection, &model, &row))
+               return;
+
+       gtk_tree_model_get(model, &row, 
+                          TEMPL_DATA, &tmpl,
+                          -1);
+
+       if (!tmpl) 
+               return;
 
        if (alertpanel(_("Delete template"),
                       _("Do you really want to delete this template?"),
                       _("Yes"), _("No"), NULL) != G_ALERTDEFAULT)
                return;
 
-       tmpl = gtk_clist_get_row_data(clist, row);
-       template_free(tmpl);
-       gtk_clist_remove(clist, row);
+       gtk_list_store_remove(GTK_LIST_STORE(model), &row);             
 }
+
+static GtkListStore* prefs_template_create_data_store(void)
+{
+       return gtk_list_store_new(N_TEMPL_COLUMNS,
+                                 G_TYPE_STRING,        
+                                 G_TYPE_POINTER,
+                                 G_TYPE_AUTO_POINTER,
+                                 -1);
+}
+
+static void prefs_template_list_view_insert_template(GtkWidget *list_view,
+                                                    GtkTreeIter *row_iter,
+                                                    const gchar *template,
+                                                    Template *data)
+{
+       GtkTreeIter iter;
+       GtkListStore *list_store = GTK_LIST_STORE(gtk_tree_view_get_model
+                                       (GTK_TREE_VIEW(list_view)));
+       GAuto *auto_data;                                       
+
+       if (row_iter == NULL) {
+               /* append new */
+               gtk_list_store_append(list_store, &iter);
+       } else {
+               iter = *row_iter;
+       }
+
+       auto_data = g_auto_pointer_new_with_free(data, (GFreeFunc) template_free);  
+
+       /* if replacing data in an existing row, the auto pointer takes care
+        * of destroying the Template data */
+       gtk_list_store_set(list_store, &iter,
+                          TEMPL_TEXT, template,
+                          TEMPL_DATA, data,
+                          TEMPL_AUTO_DATA, auto_data,
+                          -1);
+
+       g_auto_pointer_free(auto_data);                    
+}
+
+static GtkWidget *prefs_template_list_view_create(void)
+{
+       GtkTreeView *list_view;
+       GtkTreeSelection *selector;
+       GtkTreeModel *model;
+
+       model = GTK_TREE_MODEL(prefs_template_create_data_store());
+       list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(model));
+       g_object_unref(model);  
+       
+       gtk_tree_view_set_rules_hint(list_view, TRUE);
+       
+       selector = gtk_tree_view_get_selection(list_view);
+       gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE);
+       gtk_tree_selection_set_select_function(selector, prefs_template_selected,
+                                              NULL, NULL);
+
+       /* create the columns */
+       prefs_template_create_list_view_columns(GTK_WIDGET(list_view));
+
+       return GTK_WIDGET(list_view);
+}
+
+static void prefs_template_create_list_view_columns(GtkWidget *list_view)
+{
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       renderer = gtk_cell_renderer_text_new();
+       column = gtk_tree_view_column_new_with_attributes
+                       (_("Current templates"),
+                        renderer,
+                        "text", TEMPL_TEXT,
+                        NULL);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);          
+}
+
+static gboolean prefs_template_selected(GtkTreeSelection *selector,
+                                       GtkTreeModel *model, 
+                                       GtkTreePath *path,
+                                       gboolean currently_selected,
+                                       gpointer data)
+{
+       Template *tmpl;
+       Template tmpl_def;
+       GtkTextBuffer *buffer;
+       GtkTextIter iter;
+       GtkTreeIter titer;
+
+       if (currently_selected)
+               return TRUE;
+
+       if (!gtk_tree_model_get_iter(model, &titer, path))
+               return TRUE;
+
+       tmpl_def.name = _("Template");
+       tmpl_def.subject = "";
+       tmpl_def.to = "";
+       tmpl_def.cc = "";
+       tmpl_def.bcc = "";      
+       tmpl_def.value = "";
+
+       gtk_tree_model_get(model, &titer,
+                          TEMPL_DATA, &tmpl,
+                          -1);
+
+       if (!tmpl) 
+               tmpl = &tmpl_def;
+
+       gtk_entry_set_text(GTK_ENTRY(templates.entry_name), tmpl->name);
+       gtk_entry_set_text(GTK_ENTRY(templates.entry_to),
+                          tmpl->to ? tmpl->to : "");
+       gtk_entry_set_text(GTK_ENTRY(templates.entry_cc),
+                          tmpl->cc ? tmpl->cc : "");
+       gtk_entry_set_text(GTK_ENTRY(templates.entry_bcc),
+                          tmpl->bcc ? tmpl->bcc : "");                 
+       gtk_entry_set_text(GTK_ENTRY(templates.entry_subject),
+                          tmpl->subject ? tmpl->subject : "");
+       
+       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(templates.text_value));
+       gtk_text_buffer_set_text(buffer, "", -1);
+       gtk_text_buffer_get_start_iter(buffer, &iter);
+       gtk_text_buffer_insert(buffer, &iter, tmpl->value, -1);
+
+       return TRUE;
+}
+
+