* Added a new function to get the folder window
[modest] / src / hildon2 / modest-platform.c
index 26fa4ba..a59415d 100644 (file)
@@ -91,6 +91,8 @@
 
 #define COMMON_FOLDER_DIALOG_ENTRY "entry"
 #define COMMON_FOLDER_DIALOG_ACCOUNT_PICKER "account-picker"
+#define FOLDER_PICKER_CURRENT_FOLDER "current-folder"
+
 
 static void _modest_platform_play_email_tone (void);
 
@@ -630,16 +632,10 @@ on_response (GtkDialog *dialog,
        exists = FALSE;
        
        if (picker != NULL) {
-               const gchar *active_id;
 
-               active_id = modest_selector_picker_get_active_id (MODEST_SELECTOR_PICKER (picker));
-               parent = TNY_FOLDER_STORE (
-                       modest_tny_account_store_get_server_account (modest_runtime_get_account_store (),
-                                                                    active_id,
-                                                                    TNY_ACCOUNT_TYPE_STORE));
-       } else {
-               g_object_ref (parent);
+               parent = g_object_get_data (G_OBJECT (picker), FOLDER_PICKER_CURRENT_FOLDER);
        }
+
        /* Look for another folder with the same name */
        if (modest_tny_folder_has_subfolder_with_name (parent, 
                                                       new_name,
@@ -668,7 +664,6 @@ on_response (GtkDialog *dialog,
                g_signal_stop_emission_by_name (dialog, "response");
        }
 
-       g_object_unref (parent);
 }
 
 typedef struct _FolderChooserData {
@@ -722,8 +717,6 @@ folder_chooser_dialog_run (ModestFolderView *original)
        return userdata.store;
 }
 
-#define FOLDER_PICKER_CURRENT_FOLDER "current-folder"
-
 static gchar *
 folder_store_get_display_name (TnyFolderStore *store)
 {
@@ -760,6 +753,23 @@ folder_store_get_display_name (TnyFolderStore *store)
 }
 
 static void
+folder_picker_set_store (GtkButton *button, TnyFolderStore *store)
+{
+       gchar *name;
+
+       if (store == NULL) {
+               g_object_set_data (G_OBJECT (button), FOLDER_PICKER_CURRENT_FOLDER, NULL);
+       } else {
+               g_object_ref (store);
+               g_object_set_data_full (G_OBJECT (button), FOLDER_PICKER_CURRENT_FOLDER, 
+                                       store, (GDestroyNotify) g_object_unref);
+               name = folder_store_get_display_name (store);
+               hildon_button_set_value (HILDON_BUTTON (button), name);
+               g_free (name);
+       }
+}
+
+static void
 folder_picker_clicked (GtkButton *button,
                       ModestFolderView *folder_view)
 {
@@ -767,16 +777,12 @@ folder_picker_clicked (GtkButton *button,
 
        store = folder_chooser_dialog_run (folder_view);
        if (store) {
-               gchar *name;
-               g_object_set_data (G_OBJECT (button), FOLDER_PICKER_CURRENT_FOLDER, store);
-               name = folder_store_get_display_name (store);
-               hildon_button_set_value (HILDON_BUTTON (button), name);
-               g_free (name);
+               folder_picker_set_store (GTK_BUTTON (button), store);
        }
 }
 
 static GtkWidget *
-folder_picker_new (ModestFolderView *folder_view)
+folder_picker_new (ModestFolderView *folder_view, TnyFolderStore *suggested)
 {
        GtkWidget *button;
        GdkPixbuf *pixbuf;
@@ -790,6 +796,10 @@ folder_picker_new (ModestFolderView *folder_view)
                                 gtk_image_new_from_pixbuf (pixbuf));
        hildon_button_set_alignment (HILDON_BUTTON (button), 0.0, 0.5, 1.0, 1.0);
 
+       if (suggested) {
+               folder_picker_set_store (GTK_BUTTON (button), suggested);
+       }
+
        g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (folder_picker_clicked), folder_view);
 
        return button;
@@ -808,16 +818,20 @@ modest_platform_run_folder_common_dialog (GtkWindow *parent_window,
                                          TnyFolderStore **parent)
 {
        GtkWidget *accept_btn = NULL; 
-       GtkWidget *dialog, *entry, *label_entry, *label_location, *hbox;
-       GtkWidget *account_picker;
+       GtkWidget *dialog, *entry = NULL, *label_entry = NULL,  *label_location = NULL, *hbox;
+       GtkWidget *account_picker = NULL;
        GList *buttons = NULL;
        gint result;
        GtkSizeGroup *sizegroup;
        ModestFolderView *folder_view;
+       ModestWindow *folder_window;
+       ModestHildon2WindowMgr *window_mgr;
 
-       g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW (parent_window), GTK_RESPONSE_NONE);
+       window_mgr = (ModestHildon2WindowMgr *) modest_runtime_get_window_mgr ();
+       folder_window = modest_hildon2_window_mgr_get_folder_window (window_mgr);
+       g_return_val_if_fail (MODEST_IS_FOLDER_WINDOW (folder_window), GTK_RESPONSE_NONE);
 
-       folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (parent_window));
+       folder_view = modest_folder_window_get_folder_view (MODEST_FOLDER_WINDOW (folder_window));
 
        /* Ask the user for the folder name */
        dialog = gtk_dialog_new_with_buttons (dialog_title,
@@ -858,7 +872,7 @@ modest_platform_run_folder_common_dialog (GtkWindow *parent_window,
                gtk_misc_set_alignment (GTK_MISC (label_location), 0.0, 0.5);
                gtk_size_group_add_widget (sizegroup, label_location);
 
-               account_picker = folder_picker_new (folder_view);
+               account_picker = folder_picker_new (folder_view, suggested_parent);
        }
 
        g_object_unref (sizegroup);
@@ -912,13 +926,15 @@ modest_platform_run_folder_common_dialog (GtkWindow *parent_window,
        modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), 
                                     GTK_WINDOW (dialog), parent_window);
        gtk_widget_show_all (GTK_WIDGET(dialog));
-               
+
        result = gtk_dialog_run (GTK_DIALOG(dialog));
        if (result == GTK_RESPONSE_ACCEPT) {
                if (show_name)
                        *folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
                if (show_parent) {
                        *parent = g_object_get_data (G_OBJECT (account_picker), FOLDER_PICKER_CURRENT_FOLDER);
+                       if (*parent)
+                               g_object_ref (*parent);
                }
        }
 
@@ -973,6 +989,12 @@ modest_platform_run_new_folder_dialog (GtkWindow *parent_window,
                real_suggested_name = suggested_name;
        }
 
+       /* In hildon 2.2 we always suggest the archive folder as parent */
+       suggested_folder = TNY_FOLDER_STORE (
+               modest_tny_account_get_special_folder 
+               (modest_tny_account_store_get_local_folders_account (modest_runtime_get_account_store ()),
+                TNY_FOLDER_TYPE_ARCHIVE));
+
        tmp = g_strconcat (_("mcen_fi_new_folder_name"), ":", NULL);
        result = modest_platform_run_folder_common_dialog (parent_window, 
                                                           suggested_folder,
@@ -1868,48 +1890,49 @@ modest_platform_run_certificate_confirmation_dialog (const gchar* server_name,
        g_signal_connect (G_OBJECT(note), "response", 
                          G_CALLBACK(on_cert_dialog_response),
                          (gpointer) certificate);
-       
+
        response = gtk_dialog_run(GTK_DIALOG(note));
 
        on_destroy_dialog (note);
        g_free (question);
-       
+
        return response == GTK_RESPONSE_OK;
 }
 
 gboolean
-modest_platform_run_alert_dialog (const gchar* prompt, 
+modest_platform_run_alert_dialog (const gchar* prompt,
                                  gboolean is_question)
-{      
-       ModestWindow *main_win; 
+{
+       ModestWindow *top_win;
+       HildonWindowStack *stack;
 
-       if (!modest_window_mgr_main_window_exists (modest_runtime_get_window_mgr())) {
-               g_warning ("%s:\n'%s'\ndon't show dialogs if there's no main window;"
-                          " assuming 'Cancel' for questions, 'Ok' otherwise", prompt, __FUNCTION__);
-               return is_question ? FALSE : TRUE;
+       stack = hildon_window_stack_get_default ();
+       top_win = MODEST_WINDOW (hildon_window_stack_peek (stack));
+
+       if (!top_win) {
+               g_warning ("%s: don't show dialogs if there's no window shown; assuming 'Cancel'",
+                          __FUNCTION__);
+               return FALSE;
        }
 
-       main_win = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr (), FALSE);
-       g_return_val_if_fail (main_win, FALSE); /* should not happen */
-       
        gboolean retval = TRUE;
        if (is_question) {
-               /* The Tinymail documentation says that we should show Yes and No buttons, 
+               /* The Tinymail documentation says that we should show Yes and No buttons,
                 * when it is a question.
                 * Obviously, we need tinymail to use more specific error codes instead,
                 * so we know what buttons to show. */
-               GtkWidget *dialog = GTK_WIDGET (hildon_note_new_confirmation (GTK_WINDOW (main_win), 
+               GtkWidget *dialog = GTK_WIDGET (hildon_note_new_confirmation (GTK_WINDOW (top_win), 
                                                                              prompt));
                modest_window_mgr_set_modal (modest_runtime_get_window_mgr (),
-                                            GTK_WINDOW (dialog), GTK_WINDOW (main_win));
-               
+                                            GTK_WINDOW (dialog), GTK_WINDOW (top_win));
+
                const int response = gtk_dialog_run (GTK_DIALOG (dialog));
                retval = (response == GTK_RESPONSE_YES) || (response == GTK_RESPONSE_OK);
-               
-               on_destroy_dialog (dialog);             
+
+               on_destroy_dialog (dialog);
        } else {
                /* Just show the error text and use the default response: */
-               modest_platform_run_information_dialog (GTK_WINDOW (main_win), 
+               modest_platform_run_information_dialog (GTK_WINDOW (top_win), 
                                                        prompt, FALSE);
        }
        return retval;