* Renamed a function
[modest] / src / maemo / modest-platform.c
index cc577d1..9338c34 100644 (file)
@@ -51,6 +51,7 @@
 #include <gtk/gtkmenuitem.h>
 #include <gtk/gtkmain.h>
 #include <modest-text-utils.h>
+#include "modest-tny-folder.h"
 #include <string.h>
 
 
@@ -525,6 +526,12 @@ modest_platform_get_icon (const gchar *name)
 
        g_return_val_if_fail (name, NULL);
 
+       /* strlen == 0 is not really an error; it just
+        * means the icon is not available
+        */
+       if (!name || strlen(name) == 0)
+               return NULL;
+       
 #if 0 /* do we still need this? */
        if (g_str_has_suffix (name, ".png")) { /*FIXME: hack*/
                pixbuf = gdk_pixbuf_new_from_file (name, &err);
@@ -573,22 +580,25 @@ entry_insert_text (GtkEditable *editable,
                hildon_banner_show_information  (gtk_widget_get_parent (GTK_WIDGET (data)), NULL,
                                                 _CS("ckdg_ib_maximum_characters_reached"));
        } else {
-               GtkWidget *ok_button;
-               GList *buttons;
-               
-               buttons = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (data)->action_area));
-               ok_button = GTK_WIDGET (buttons->next->data);
-               
-               gtk_widget_set_sensitive (ok_button,
-                                         modest_text_utils_validate_folder_name (chars));      
-               g_list_free (buttons);
-               
-               /* Write the text in the entry */
-               g_signal_handlers_block_by_func (editable,
-                                                (gpointer) entry_insert_text, data);
-               gtk_editable_insert_text (editable, text, length, position);
-               g_signal_handlers_unblock_by_func (editable,
-                                                  (gpointer) entry_insert_text, data);
+               if (modest_text_utils_is_forbidden_char (*text, FOLDER_NAME_FORBIDDEN_CHARS)) {
+                       /* Show an error */
+                       gchar *tmp, *msg;
+                       
+                       tmp = g_strndup (folder_name_forbidden_chars, 
+                                        FOLDER_NAME_FORBIDDEN_CHARS_LENGTH);
+                       msg = g_strdup_printf (_CS("ckdg_ib_illegal_characters_entered"), tmp);
+                       hildon_banner_show_information  (gtk_widget_get_parent (GTK_WIDGET (data)), 
+                                                        NULL, msg);
+                       g_free (msg);
+                       g_free (tmp);
+               } else {        
+                       /* Write the text in the entry if it's valid */
+                       g_signal_handlers_block_by_func (editable,
+                                                        (gpointer) entry_insert_text, data);
+                       gtk_editable_insert_text (editable, text, length, position);
+                       g_signal_handlers_unblock_by_func (editable,
+                                                          (gpointer) entry_insert_text, data);
+               }
        }
        /* Do not allow further processing */
        g_signal_stop_emission_by_name (editable, "insert_text");
@@ -744,15 +754,53 @@ launch_sort_headers_dialog (GtkWindow *parent_window,
        modest_widget_memory_save (modest_runtime_get_conf (),
                                   G_OBJECT (header_view), MODEST_CONF_HEADER_VIEW_KEY);
        
-       while (gtk_events_pending ())
-               gtk_main_iteration ();
+/*     while (gtk_events_pending ()) */
+/*             gtk_main_iteration (); */
 
        /* free */
        g_list_free(cols);      
 }
 
+
+
+static void
+on_response (GtkDialog *dialog,
+            gint response,
+            gpointer user_data)
+{
+       GList *child_vbox, *child_hbox;
+       GtkWidget *hbox, *entry;
+       TnyFolderStore *parent;
+
+       if (response != GTK_RESPONSE_ACCEPT)
+               return;
+
+       /* Get entry */
+       child_vbox = gtk_container_get_children (GTK_CONTAINER (dialog->vbox));
+       hbox = child_vbox->data;
+       child_hbox = gtk_container_get_children (GTK_CONTAINER (hbox));
+       entry = child_hbox->next->data;
+
+       parent = TNY_FOLDER_STORE (user_data);
+
+       /* Look for another folder with the same name */
+       if (modest_tny_folder_has_subfolder_with_name (parent, 
+                                                      gtk_entry_get_text (GTK_ENTRY (entry)))) {
+               /* Show an error */
+               hildon_banner_show_information (gtk_widget_get_parent (GTK_WIDGET (dialog)), 
+                                               NULL, _CS("ckdg_ib_folder_already_exists"));
+               /* Select the text */
+               gtk_entry_select_region (GTK_ENTRY (entry), 0, -1);
+               gtk_widget_grab_focus (entry);
+               /* Do not close the dialog */
+               g_signal_stop_emission_by_name (dialog, "response");
+       }
+}
+
+
 static gint
 modest_platform_run_folder_name_dialog (GtkWindow *parent_window,
+                                       TnyFolderStore *parent,
                                        const gchar *dialog_title,
                                        const gchar *label_text,
                                        const gchar *suggested_name,
@@ -788,6 +836,13 @@ modest_platform_run_folder_name_dialog (GtkWindow *parent_window,
                gtk_entry_set_text (GTK_ENTRY (entry), _("mcen_ia_default_folder_name"));
        gtk_entry_select_region (GTK_ENTRY (entry), 0, -1);
 
+       /* Connect to the response method to avoid closing the dialog
+          when an invalid name is selected*/
+       g_signal_connect (dialog,
+                         "response",
+                         G_CALLBACK (on_response),
+                         parent);
+
        /* Track entry changes */
        g_signal_connect (entry,
                          "insert-text",
@@ -810,6 +865,9 @@ modest_platform_run_folder_name_dialog (GtkWindow *parent_window,
        gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
        
        gtk_window_set_transient_for (GTK_WINDOW (dialog), parent_window);
+
+
+
        result = gtk_dialog_run (GTK_DIALOG(dialog));
        if (result == GTK_RESPONSE_ACCEPT)
                *folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
@@ -837,11 +895,8 @@ modest_platform_run_new_folder_dialog (GtkWindow *parent_window,
                unsigned int i;
                gchar num_str[3];
 
-               for(i = 0; i < 100; ++ i)
-               {
-                       TnyList *list = tny_simple_list_new ();
-                       TnyFolderStoreQuery *query = tny_folder_store_query_new ();
-                       guint length;
+               for(i = 0; i < 100; ++ i) {
+                       gboolean exists = FALSE;
 
                        sprintf(num_str, "%.2u", i);
 
@@ -851,16 +906,10 @@ modest_platform_run_new_folder_dialog (GtkWindow *parent_window,
                                real_suggested_name = g_strdup_printf (_("mcen_ia_default_folder_name_s"),
                                                                       num_str);
 
-                       tny_folder_store_query_add_item (query, real_suggested_name,
-                                                        TNY_FOLDER_STORE_QUERY_OPTION_MATCH_ON_NAME);
+                       exists = modest_tny_folder_has_subfolder_with_name (parent_folder,
+                                                                           real_suggested_name);
 
-                       tny_folder_store_get_folders (parent_folder, list, query, NULL);
-
-                       length = tny_list_get_length (list);
-                       g_object_unref (query);
-                       g_object_unref (list);
-
-                       if (length == 0)
+                       if (!exists)
                                break;
 
                        g_free (real_suggested_name);
@@ -869,13 +918,12 @@ modest_platform_run_new_folder_dialog (GtkWindow *parent_window,
                /* Didn't find a free number */
                if (i == 100)
                        real_suggested_name = g_strdup (default_name);
-       }
-       else
-       {
+       } else {
                real_suggested_name = suggested_name;
        }
 
        result = modest_platform_run_folder_name_dialog (parent_window, 
+                                                        parent_folder,
                                                         _("mcen_ti_new_folder"),
                                                         _("mcen_fi_new_folder_name"),
                                                         real_suggested_name,
@@ -888,13 +936,16 @@ modest_platform_run_new_folder_dialog (GtkWindow *parent_window,
 
 gint
 modest_platform_run_rename_folder_dialog (GtkWindow *parent_window,
-                                         TnyFolderStore *parent_folder,
-                                         const gchar *suggested_name,
-                                         gchar **folder_name)
+                                          TnyFolderStore *parent_folder,
+                                          const gchar *suggested_name,
+                                          gchar **folder_name)
 {
+       g_return_val_if_fail (TNY_IS_FOLDER_STORE (parent_folder), GTK_RESPONSE_REJECT);
+
        return modest_platform_run_folder_name_dialog (parent_window, 
-                                                      _("New folder name"),
-                                                      _("Enter new folder name:"),
+                                                      parent_folder,
+                                                      _HL("ckdg_ti_rename_folder"),
+                                                      _HL("ckdg_fi_rename_name"),
                                                       suggested_name,
                                                       folder_name);
 }
@@ -1198,17 +1249,18 @@ gboolean modest_platform_set_update_interval (guint minutes)
        /* Specify what should happen when the alarm happens:
         * It should call this D-Bus method: */
         
-       /* Note: I am surpised that alarmd can't just use the modest.service file
-        * for this. murrayc. */
-       event->dbus_path = g_strdup(PREFIX "/bin/modest");
-       
+       event->dbus_path = g_strdup(MODEST_DBUS_OBJECT);
        event->dbus_interface = g_strdup (MODEST_DBUS_IFACE);
        event->dbus_service = g_strdup (MODEST_DBUS_SERVICE);
        event->dbus_name = g_strdup (MODEST_DBUS_METHOD_SEND_RECEIVE);
 
-       /* Otherwise, a dialog will be shown if exect_name or dbus_path is NULL,
-       even though we have specified no dialog text: */
-       event->flags = ALARM_EVENT_NO_DIALOG;
+       /* Use ALARM_EVENT_NO_DIALOG: Otherwise, a dialog will be shown if 
+        * exec_name or dbus_path is NULL, even though we have specified no dialog text.
+        * Also use ALARM_EVENT_ACTIVATION so that modest is started (without UI) to get emails 
+        * This is why we want to use the Alarm API instead of just g_timeout_add().
+        * (The old maemo email-client did this, though it isn't specified in the UI spec.)
+         */
+       event->flags = ALARM_EVENT_NO_DIALOG | ALARM_EVENT_ACTIVATION;
        
        alarm_cookie = alarm_event_add (event);
 
@@ -1222,20 +1274,22 @@ gboolean modest_platform_set_update_interval (guint minutes)
        if (!alarm_cookie) {
            /* Error */
            const alarm_error_t alarm_error = alarmd_get_error ();
-           printf ("Error setting alarm event. Error code: '%d'\n", alarm_error);
+           g_debug ("Error setting alarm event. Error code: '%d'\n", alarm_error);
            
            /* Give people some clue: */
            /* The alarm API should have a function for this: */
            if (alarm_error == ALARMD_ERROR_DBUS) {
-               printf ("  ALARMD_ERROR_DBUS: An error with D-Bus occurred, probably coudn't get a D-Bus connection.\n");
+               g_debug ("  ALARMD_ERROR_DBUS: An error with D-Bus occurred, probably coudn't get a D-Bus connection.\n");
            } else if (alarm_error == ALARMD_ERROR_CONNECTION) {
-               printf ("  ALARMD_ERROR_CONNECTION: Could not contact alarmd via D-Bus.\n");
+               g_debug ("  ALARMD_ERROR_CONNECTION: Could not contact alarmd via D-Bus.\n");
            } else if (alarm_error == ALARMD_ERROR_INTERNAL) {
-               printf ("  ALARMD_ERROR_INTERNAL: Some alarmd or libalarm internal error, possibly a version mismatch.\n");
+               g_debug ("  ALARMD_ERROR_INTERNAL: Some alarmd or libalarm internal error, possibly a version mismatch.\n");
            } else if (alarm_error == ALARMD_ERROR_MEMORY) {
-               printf ("  ALARMD_ERROR_MEMORY: A memory allocation failed.\n");
+               g_debug ("  ALARMD_ERROR_MEMORY: A memory allocation failed.\n");
            } else if (alarm_error == ALARMD_ERROR_ARGUMENT) {
-               printf ("  ALARMD_ERROR_ARGUMENT: An argument given by caller was invalid.\n");
+               g_debug ("  ALARMD_ERROR_ARGUMENT: An argument given by caller was invalid.\n");
+           } else if (alarm_error == ALARMD_ERROR_NOT_RUNNING) {
+               g_debug ("  ALARMD_ERROR_NOT_RUNNING: alarmd is not running.\n");
            }
            
            return FALSE;