[balsa/gtk3] Improve path checking in the first-time assistant



commit e03905e99fe8d9f539ae29ab756cfbdd608ca4de
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Thu Apr 25 18:41:13 2013 -0400

    Improve path checking in the first-time assistant
    
        * libinit_balsa/assistant_helper.c (balsa_init_add_grid_entry):
        return the GtkEntry.
        * libinit_balsa/assistant_helper.h: modified API.
        * libinit_balsa/assistant_page_directory.c
        (unconditional_mailbox): report NULL mailbox error;
        (verify_mailbox_entry), (verify_button_clicked_cb),
        (verify_button): add a button for the user to verify paths.
        (entry_changed_cb), (balsa_druid_page_directory_init):
        desensitize the "next" button when any entry is changed, to make
        the user verify the new path;
        (balsa_druid_page_directory): set row spacing for vbox;
        (balsa_druid_page_directory_prepare): desensitize the "next"
        button initially;
        (balsa_druid_page_directory_back): declare as void, not
        gboolean.
        (balsa_druid_page_directory_next): ditto; move path verification
        to verify_mailbox_entry.
        * libinit_balsa/assistant_page_directory.h: remove
        Entry{Data,Master} members, and for convenience add GtkAssistant
        *druid; balsa_druid_page_directory_later is conditional on
        ENABLE_TOUCH_UI.

 ChangeLog                                |   26 +++++
 libinit_balsa/assistant_helper.c         |    3 +-
 libinit_balsa/assistant_helper.h         |    9 +-
 libinit_balsa/assistant_page_directory.c |  173 ++++++++++++++++++------------
 libinit_balsa/assistant_page_directory.h |    5 +-
 5 files changed, 140 insertions(+), 76 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 1bc631a..e58be63 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2013-04-25  Peter Bloomfield  <peter w500 bellsouth net>
+
+       Improve path checking in the first-time assistant
+
+       * libinit_balsa/assistant_helper.c (balsa_init_add_grid_entry):
+       return the GtkEntry.
+       * libinit_balsa/assistant_helper.h: modified API.
+       * libinit_balsa/assistant_page_directory.c
+       (unconditional_mailbox): report NULL mailbox error;
+       (verify_mailbox_entry), (verify_button_clicked_cb),
+       (verify_button): add a button for the user to verify paths.
+       (entry_changed_cb), (balsa_druid_page_directory_init):
+       desensitize the "next" button when any entry is changed, to make
+       the user verify the new path;
+       (balsa_druid_page_directory): set row spacing for vbox;
+       (balsa_druid_page_directory_prepare): desensitize the "next"
+       button initially;
+       (balsa_druid_page_directory_back): declare as void, not
+       gboolean.
+       (balsa_druid_page_directory_next): ditto; move path verification
+       to verify_mailbox_entry.
+       * libinit_balsa/assistant_page_directory.h: remove
+       Entry{Data,Master} members, and for convenience add GtkAssistant
+       *druid; balsa_druid_page_directory_later is conditional on
+       ENABLE_TOUCH_UI.
+
 2013-04-25  Peter Bloomfield
 
        * configure.ac: detect _FILE_OFFSET_BITS in configure.ac;
diff --git a/libinit_balsa/assistant_helper.c b/libinit_balsa/assistant_helper.c
index 6d15fba..96fad12 100644
--- a/libinit_balsa/assistant_helper.c
+++ b/libinit_balsa/assistant_helper.c
@@ -73,7 +73,7 @@ balsa_init_get_png(const gchar * fname)
     return img;
 }
 
-void
+GtkWidget *
 balsa_init_add_grid_entry(GtkGrid * grid, guint num, const gchar * ltext,
                           const gchar * etext, EntryData * ed,
                           GtkAssistant * druid, GtkWidget *page,
@@ -104,6 +104,7 @@ balsa_init_add_grid_entry(GtkGrid * grid, guint num, const gchar * ltext,
         ed->master->donemask = (ed->master->donemask << 1) | 1;
     }
     gtk_entry_set_text(GTK_ENTRY(e), etext);
+    return e;
 }
 
 static void
diff --git a/libinit_balsa/assistant_helper.h b/libinit_balsa/assistant_helper.h
index 322289c..17a1cbc 100644
--- a/libinit_balsa/assistant_helper.h
+++ b/libinit_balsa/assistant_helper.h
@@ -48,10 +48,11 @@ struct EntryMaster_s {
 
 GdkPixbuf *balsa_init_get_png(const gchar * fname);
 
-void balsa_init_add_grid_entry(GtkGrid * grid, guint num, const gchar * ltext,
-                               const gchar * etext, EntryData * ed,
-                               GtkAssistant * druid, GtkWidget *page,
-                               GtkWidget ** dest);
+GtkWidget *balsa_init_add_grid_entry(GtkGrid * grid, guint num,
+                                     const gchar * ltext,
+                                     const gchar * etext, EntryData * ed,
+                                     GtkAssistant * druid,
+                                     GtkWidget * page, GtkWidget ** dest);
 void balsa_init_add_grid_option(GtkGrid *grid, guint num,
                                 const gchar *ltext, const gchar **optns,
                                 GtkAssistant *druid, GtkWidget **dest);
diff --git a/libinit_balsa/assistant_page_directory.c b/libinit_balsa/assistant_page_directory.c
index 95767cc..f38e1ac 100644
--- a/libinit_balsa/assistant_page_directory.c
+++ b/libinit_balsa/assistant_page_directory.c
@@ -65,10 +65,12 @@ static const gchar * const init_mbnames[NUM_EDs] = {
 static void balsa_druid_page_directory_prepare(GtkAssistant * druid,
                                                GtkWidget * page,
                                                BalsaDruidPageDirectory * dir);
-static gboolean balsa_druid_page_directory_next(GtkAssistant * druid,
-                                                GtkWidget * page,
-                                                BalsaDruidPageDirectory *
-                                                dir);
+static void balsa_druid_page_directory_back(GtkAssistant * druid,
+                                            GtkWidget * page,
+                                            BalsaDruidPageDirectory * dir);
+static void balsa_druid_page_directory_next(GtkAssistant * druid,
+                                            GtkWidget * page,
+                                            BalsaDruidPageDirectory * dir);
 static void unconditional_mailbox(const gchar * path,
                                   const gchar * prettyname,
                                   LibBalsaMailbox ** box, gchar ** error);
@@ -131,6 +133,12 @@ unconditional_mailbox(const gchar * path, const gchar * prettyname,
         break;
     default:
         *box = (LibBalsaMailbox *) libbalsa_mailbox_local_new(path, TRUE);
+        if (!*box) {
+            *error = g_strdup_printf(_("Could not create mailbox"
+                                       " at path \"%s\"\n"), path);
+            g_free(dup);
+            return;
+        }
     }
 
     if (is_remote) {
@@ -170,14 +178,76 @@ unconditional_mailbox(const gchar * path, const gchar * prettyname,
         (*box)->no_reassemble = TRUE;
 }
 
-/* here are local prototypes */
-static void balsa_druid_page_directory_init(BalsaDruidPageDirectory * dir,
-                                            GtkWidget * page,
-                                            GtkAssistant * druid);
-static gboolean balsa_druid_page_directory_back(GtkAssistant * druid,
-                                                GtkWidget * page,
-                                                BalsaDruidPageDirectory *
-                                                dir);
+static void
+verify_mailbox_entry(GtkWidget * entry, const gchar * name,
+                     LibBalsaMailbox ** mailbox, gboolean * verify)
+{
+    const gchar *text;
+    gchar *error;
+
+    if (!*verify)
+        return;
+
+    text = gtk_entry_get_text(GTK_ENTRY(entry));
+    error = NULL;
+    unconditional_mailbox(text, name, mailbox, &error);
+
+    if (error) {
+        GtkWidget *dlg =
+            gtk_message_dialog_new(GTK_WINDOW(gtk_widget_get_ancestor
+                                              (GTK_WIDGET(entry),
+                                               GTK_TYPE_WINDOW)),
+                                   GTK_DIALOG_MODAL,
+                                   GTK_MESSAGE_ERROR,
+                                   GTK_BUTTONS_OK,
+                                   _("Problem verifying path \"%s\":\n%s"),
+                                   text, error);
+        g_free(error);
+        gtk_dialog_run(GTK_DIALOG(dlg));
+        gtk_widget_destroy(dlg);
+        *verify = FALSE;
+    }
+}
+
+static void
+verify_button_clicked_cb(GtkWidget * button, gpointer data)
+{
+    BalsaDruidPageDirectory *dir = data;
+    gboolean verify = TRUE;
+
+    verify_mailbox_entry(dir->inbox, INBOX_NAME, &balsa_app.inbox,
+                         &verify);
+    verify_mailbox_entry(dir->outbox, OUTBOX_NAME, &balsa_app.outbox,
+                         &verify);
+    verify_mailbox_entry(dir->sentbox, SENTBOX_NAME, &balsa_app.sentbox,
+                         &verify);
+    verify_mailbox_entry(dir->draftbox, DRAFTBOX_NAME, &balsa_app.draftbox,
+                         &verify);
+    verify_mailbox_entry(dir->trash, TRASH_NAME, &balsa_app.trash,
+                         &verify);
+    gtk_assistant_set_page_complete(dir->druid, dir->page, verify);
+}
+
+static GtkWidget *
+verify_button(BalsaDruidPageDirectory * dir)
+{
+    GtkWidget *button;
+
+    button = gtk_button_new_with_mnemonic(_("_Verify locations"));
+    g_signal_connect(button, "clicked",
+                     G_CALLBACK(verify_button_clicked_cb), dir);
+    gtk_widget_show(button);
+    return button;
+}
+
+static void
+entry_changed_cb(GtkEditable * editable, gpointer data)
+{
+    BalsaDruidPageDirectory *dir = data;
+
+    gtk_assistant_set_page_complete(dir->druid, dir->page, FALSE);
+}
+
 static void
 balsa_druid_page_directory_init(BalsaDruidPageDirectory * dir,
                                 GtkWidget * page,
@@ -191,12 +261,9 @@ balsa_druid_page_directory_init(BalsaDruidPageDirectory * dir,
     gchar *imap_inbox = libbalsa_guess_imap_inbox();
     gchar *init_presets[NUM_EDs] = { NULL, NULL, NULL, NULL, NULL };
 
+    dir->druid = druid;
     dir->paths_locked = FALSE;
 
-    dir->emaster.setbits = 0;
-    dir->emaster.numentries = 0;
-    dir->emaster.donemask = 0;
-
     grid = GTK_GRID(gtk_grid_new());
     gtk_grid_set_column_spacing(grid, 6);
 
@@ -226,8 +293,7 @@ balsa_druid_page_directory_init(BalsaDruidPageDirectory * dir,
 
     for (i = 0; i < NUM_EDs; i++) {
         gchar *preset;
-
-        dir->ed[i].master = &(dir->emaster);
+        GtkWidget *entry;
 
         if (init_presets[i])
             preset = init_presets[i];
@@ -238,17 +304,22 @@ balsa_druid_page_directory_init(BalsaDruidPageDirectory * dir,
         balsa_init_add_grid_entry(grid, i, init_mbnames[i], preset,
                                    &(dir->ed[i]), druid, page, init_widgets[i]);
 #else
-        balsa_init_add_grid_entry(grid, i, _(init_mbnames[i]), preset,
-                                   &(dir->ed[i]), druid, page, init_widgets[i]);
+        entry = balsa_init_add_grid_entry(grid, i, _(init_mbnames[i]),
+                                          preset, NULL, NULL, NULL,
+                                          init_widgets[i]);
+        g_signal_connect(entry, "changed",
+                         G_CALLBACK(entry_changed_cb), dir);
 #endif
 
         g_free(preset);
     }
 
     gtk_box_pack_start(GTK_BOX(page), GTK_WIDGET(grid), FALSE, TRUE,
-                       8);
+                       0);
     gtk_widget_show_all(GTK_WIDGET(grid));
 
+    gtk_box_pack_end(GTK_BOX(page), verify_button(dir), FALSE, FALSE, 0);
+
     g_signal_connect(G_OBJECT(druid), "prepare",
                      G_CALLBACK(balsa_druid_page_directory_prepare),
                      dir);
@@ -263,7 +334,7 @@ balsa_druid_page_directory(GtkAssistant * druid)
     BalsaDruidPageDirectory *dir;
 
     dir = g_new0(BalsaDruidPageDirectory, 1);
-    dir->page = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+    dir->page = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8);
     gtk_assistant_append_page(druid, dir->page);
     gtk_assistant_set_page_title(druid, dir->page, _("Mail Files"));
     balsa_druid_page_directory_init(dir, dir->page, druid);
@@ -321,56 +392,27 @@ balsa_druid_page_directory_prepare(GtkAssistant * druid,
     }
 
     /* Don't let them continue unless all entries have something. */
-    gtk_assistant_set_page_complete(druid, page,
-                                    ENTRY_MASTER_DONE(dir->emaster));
+    gtk_assistant_set_page_complete(druid, page, FALSE);
 
     dir->need_set = TRUE;
 }
 
 
-static gboolean
-balsa_druid_page_directory_next(GtkAssistant * page, GtkWidget * druid,
+static void
+balsa_druid_page_directory_back(GtkAssistant *druid, GtkWidget *page,
                                 BalsaDruidPageDirectory * dir)
 {
-    gchar *error = NULL;
-
-    unconditional_mailbox(gtk_entry_get_text
-                          (GTK_ENTRY(dir->inbox)), INBOX_NAME,
-                          &balsa_app.inbox, &error);
-    unconditional_mailbox(gtk_entry_get_text
-                          (GTK_ENTRY(dir->outbox)), OUTBOX_NAME,
-                          &balsa_app.outbox, &error);
-    unconditional_mailbox(gtk_entry_get_text
-                          (GTK_ENTRY(dir->sentbox)), SENTBOX_NAME,
-                          &balsa_app.sentbox, &error);
-    unconditional_mailbox(gtk_entry_get_text
-                          (GTK_ENTRY(dir->draftbox)), DRAFTBOX_NAME,
-                          &balsa_app.draftbox, &error);
-    unconditional_mailbox(gtk_entry_get_text
-                          (GTK_ENTRY(dir->trash)), TRASH_NAME,
-                          &balsa_app.trash, &error);
+    dir->paths_locked = FALSE;
+}
 
+static void
+balsa_druid_page_directory_next(GtkAssistant * page, GtkWidget * druid,
+                                BalsaDruidPageDirectory * dir)
+{
     dir->paths_locked = TRUE;
-
-    if (error) {
-        GtkWidget *dlg =
-            gtk_message_dialog_new(GTK_WINDOW(gtk_widget_get_ancestor
-                                          (GTK_WIDGET(druid), 
-                                           GTK_TYPE_WINDOW)),
-                                   GTK_DIALOG_MODAL,
-                                   GTK_MESSAGE_ERROR,
-                                   GTK_BUTTONS_OK,
-                                   _("Problem Creating Mailboxes\n%s"),
-                                   error);
-        g_free(error);
-        gtk_dialog_run(GTK_DIALOG(dlg));
-        gtk_widget_destroy(dlg);
-        return TRUE;
-    }
-
-    return FALSE;
 }
 
+#if defined(ENABLE_TOUCH_UI)
 #define SET_MAILBOX(fname, config, mbx) \
 do { gchar *t=g_build_filename(balsa_app.local_mail_directory,(fname),NULL);\
  unconditional_mailbox(t, config, (mbx), &error); g_free(t);}while(0)
@@ -401,11 +443,4 @@ balsa_druid_page_directory_later(GtkWidget *druid)
         gtk_widget_destroy(dlg);
     }
 }
-
-static gboolean
-balsa_druid_page_directory_back(GtkAssistant *druid, GtkWidget *page,
-                                BalsaDruidPageDirectory * dir)
-{
-    dir->paths_locked = FALSE;
-    return FALSE;
-}
+#endif                          /* defined(ENABLE_TOUCH_UI) */
diff --git a/libinit_balsa/assistant_page_directory.h b/libinit_balsa/assistant_page_directory.h
index d10310f..1e5ed09 100644
--- a/libinit_balsa/assistant_page_directory.h
+++ b/libinit_balsa/assistant_page_directory.h
@@ -58,15 +58,16 @@ extern "C" {
         GtkWidget *trash;
         gint my_num;
         gboolean paths_locked, need_set;
-        EntryMaster emaster;
-        EntryData ed[NUM_EDs];
+        GtkAssistant *druid;
     };
 
 /*
  * Public methods
  */
     void balsa_druid_page_directory(GtkAssistant * druid);
+#if defined(ENABLE_TOUCH_UI)
     void balsa_druid_page_directory_later(GtkWidget *druid);
+#endif                          /* defined(ENABLE_TOUCH_UI) */
 
 
 #ifdef __cplusplus


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]