X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=e44c0c630c115ad6e17fb71c50aaafd55a4a19a0;hp=7f859ba545ea2981d5d04cc52390f2b1e41bc072;hb=bb790bd8b50e81a1e965341d010864d6000c5b38;hpb=98df4aae51f0f37b7fd1158e86f132d528aaf3b3 diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 7f859ba..e44c0c6 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -35,6 +35,9 @@ #include #include #include +#include +#include + #include "modest-ui-actions.h" #include "modest-tny-platform-factory.h" @@ -45,6 +48,11 @@ #include "modest-account-mgr-helpers.h" #include "modest-mail-operation.h" + +#ifdef MODEST_HAVE_EASYSETUP +#include "easysetup/modest-easysetup-wizard.h" +#endif /*MODEST_HAVE_EASYSETUP*/ + #include #include #include @@ -53,7 +61,7 @@ typedef struct _GetMsgAsyncHelper { - ModestMainWindow *main_window; + ModestWindow *window; TnyIterator *iter; GFunc func; gpointer user_data; @@ -68,7 +76,7 @@ typedef enum _ReplyForwardAction { typedef struct _ReplyForwardHelper { guint reply_forward_type; ReplyForwardAction action; - gchar *account; + gchar *account_name; } ReplyForwardHelper; @@ -76,13 +84,12 @@ static void reply_forward_func (gpointer data, gpointer user_data); static void read_msg_func (gpointer data, gpointer user_data); static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data); -static void reply_forward (GtkWidget *widget, ReplyForwardAction action, - ModestWindow *win); +static void reply_forward (ReplyForwardAction action, ModestWindow *win); static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title); void -modest_ui_actions_on_about (GtkWidget *widget, ModestWindow *win) +modest_ui_actions_on_about (GtkAction *action, ModestWindow *win) { GtkWidget *about; const gchar *authors[] = { @@ -135,14 +142,13 @@ get_selected_headers (ModestWindow *win) } else return NULL; - } + void -modest_ui_actions_on_delete (GtkWidget *widget, ModestWindow *win) +modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) { TnyList *header_list; TnyIterator *iter; -// GtkTreeModel *model; g_return_if_fail (MODEST_IS_WINDOW(win)); @@ -150,9 +156,6 @@ modest_ui_actions_on_delete (GtkWidget *widget, ModestWindow *win) if (header_list) { iter = tny_list_create_iterator (header_list); -/* model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)); */ -/* if (GTK_IS_TREE_MODEL_SORT (model)) */ -/* model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model)); */ do { TnyHeader *header; ModestMailOperation *mail_op; @@ -160,35 +163,30 @@ modest_ui_actions_on_delete (GtkWidget *widget, ModestWindow *win) header = TNY_HEADER (tny_iterator_get_current (iter)); /* TODO: thick grain mail operation involving a list of objects. Composite pattern ??? */ - mail_op = modest_mail_operation_new (); - /* TODO: add confirmation dialog */ + mail_op = modest_mail_operation_new (); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); - /* Move to trash */ - modest_mail_operation_remove_msg (mail_op, header, TRUE); - - /* Remove from tree model */ - if (modest_mail_operation_get_status (mail_op) == - MODEST_MAIL_OPERATION_STATUS_SUCCESS) { -/* tny_list_remove (TNY_LIST (model), G_OBJECT (header)); */ - } else { - /* TODO: error handling management */ - const GError *error; - error = modest_mail_operation_get_error (mail_op); - g_warning (error->message); - } + /* Always delete. TODO: Move to trash still not supported */ + modest_mail_operation_remove_msg (mail_op, header, FALSE); + /* Frees */ g_object_unref (G_OBJECT (mail_op)); - g_object_unref (header); + g_object_unref (G_OBJECT (header)); + tny_iterator_next (iter); } while (!tny_iterator_is_done (iter)); + + /* Free iter */ + g_object_unref (G_OBJECT (iter)); } } void -modest_ui_actions_on_quit (GtkWidget *widget, ModestWindow *win) +modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win) { /* FIXME: save size of main window */ /* save_sizes (main_window); */ @@ -196,55 +194,144 @@ modest_ui_actions_on_quit (GtkWidget *widget, ModestWindow *win) } void -modest_ui_actions_on_accounts (GtkWidget *widget, ModestWindow *win) +modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win) { - GtkWidget *account_win; - account_win = modest_account_view_window_new (); + GtkClipboard *clipboard = NULL; + gchar *selection = NULL; - if (win) - gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW (win)); + clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + selection = gtk_clipboard_wait_for_text (clipboard); - gtk_widget_show (account_win); + modest_address_book_add_address (selection); + g_free (selection); +} + +void +modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win) +{ + GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr()); + + gboolean accounts_exist = account_names != NULL; + g_slist_free (account_names); + + /* This is currently only implemented for Maemo, + * because it requires a providers preset file which is not publically available. + */ +#ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */ + /* To test, while modest_account_mgr_account_names() is broken: accounts_exist = TRUE; */ + if (!accounts_exist) { + /* If there are no accounts yet, just show the easy-setup wizard, as per the UI spec: */ + ModestEasysetupWizardDialog *wizard = modest_easysetup_wizard_dialog_new (); + gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win)); + gtk_dialog_run (GTK_DIALOG (wizard)); + gtk_widget_destroy (GTK_WIDGET (wizard)); + } + else + { + /* Show the list of accounts: */ + GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ()); + gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win)); + gtk_dialog_run (account_win); + gtk_widget_destroy (GTK_WIDGET(account_win)); + } +#else + GtkWidget *dialog, *label; + + /* Create the widgets */ + + dialog = gtk_dialog_new_with_buttons ("Message", + GTK_WINDOW(win), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, + GTK_RESPONSE_NONE, + NULL); + label = gtk_label_new ("Hello World!"); + + /* Ensure that the dialog box is destroyed when the user responds. */ + + g_signal_connect_swapped (dialog, "response", + G_CALLBACK (gtk_widget_destroy), + dialog); + + /* Add the label, and show everything we've added to the dialog. */ + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), + label); + gtk_widget_show_all (dialog); +#endif /* MODEST_PLATFORM_MAEMO */ } void -modest_ui_actions_on_new_msg (GtkWidget *widget, ModestWindow *win) +modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) { ModestWindow *msg_win; - TnyMsg *msg; - gchar *account; - gchar *from_str; + TnyMsg *msg = NULL; + TnyFolder *folder = NULL; + gchar *account_name = NULL; + gchar *from_str = NULL; + GError *err = NULL; + TnyAccount *account; + + account_name = g_strdup(modest_window_get_active_account (win)); + if (!account_name) + account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); + + account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), + account_name, + TNY_ACCOUNT_TYPE_STORE); + if (!account) { + g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name); + goto cleanup; + } - account = g_strdup(modest_window_get_active_account (win)); - if (!account) - account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); + from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name); + + msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL); + if (!msg) { + g_printerr ("modest: failed to create new msg\n"); + goto cleanup; + } - from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), - account); + folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS); + if (!folder) { + g_printerr ("modest: failed to find Drafts folder\n"); + goto cleanup; + } - msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL); - msg_win = modest_msg_edit_window_new (msg, account); + tny_folder_add_msg (folder, msg, &err); + if (err) { + g_printerr ("modest: error adding msg to Drafts folder: %s", + err->message); + g_error_free (err); + goto cleanup; + } + + msg_win = modest_msg_edit_window_new (msg, account_name); if (win) gtk_window_set_transient_for (GTK_WINDOW (msg_win), GTK_WINDOW (win)); - g_free (account); - g_free (from_str); - g_object_unref (G_OBJECT(msg)); - gtk_widget_show_all (GTK_WIDGET (msg_win)); + +cleanup: + g_free (account_name); + g_free (from_str); + if (account) + g_object_unref (G_OBJECT(account)); + if (msg) + g_object_unref (G_OBJECT(msg)); + if (folder) + g_object_unref (G_OBJECT(folder)); } void -modest_ui_actions_on_open (GtkWidget *widget, ModestWindow *win) +modest_ui_actions_on_open (GtkAction *action, ModestWindow *win) { - /* FIXME */ - + modest_runtime_not_implemented (GTK_WINDOW(win)); /* FIXME */ } - static void reply_forward_func (gpointer data, gpointer user_data) { @@ -254,59 +341,87 @@ reply_forward_func (gpointer data, gpointer user_data) ModestWindow *msg_win; ModestEditType edit_type; gchar *from; + GError *err = NULL; + TnyFolder *folder = NULL; + TnyAccount *account = NULL; msg = TNY_MSG (data); helper = (GetMsgAsyncHelper *) user_data; rf_helper = (ReplyForwardHelper *) helper->user_data; from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), - rf_helper->account); + rf_helper->account_name); /* Create reply mail */ switch (rf_helper->action) { case ACTION_REPLY: new_msg = - modest_mail_operation_create_reply_mail (msg, - from, - rf_helper->reply_forward_type, - MODEST_MAIL_OPERATION_REPLY_MODE_SENDER); + modest_tny_msg_create_reply_msg (msg, from, + rf_helper->reply_forward_type, + MODEST_TNY_MSG_REPLY_MODE_SENDER); break; case ACTION_REPLY_TO_ALL: new_msg = - modest_mail_operation_create_reply_mail (msg, from, rf_helper->reply_forward_type, - MODEST_MAIL_OPERATION_REPLY_MODE_ALL); + modest_tny_msg_create_reply_msg (msg, from, rf_helper->reply_forward_type, + MODEST_TNY_MSG_REPLY_MODE_ALL); edit_type = MODEST_EDIT_TYPE_REPLY; break; case ACTION_FORWARD: new_msg = - modest_mail_operation_create_forward_mail (msg, from, rf_helper->reply_forward_type); + modest_tny_msg_create_forward_msg (msg, from, rf_helper->reply_forward_type); edit_type = MODEST_EDIT_TYPE_FORWARD; break; default: g_return_if_reached (); + return; } if (!new_msg) { - g_warning ("Unable to create a message"); + g_printerr ("modest: failed to create message\n"); goto cleanup; } - + + account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), + rf_helper->account_name, + TNY_ACCOUNT_TYPE_STORE); + if (!account) { + g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name); + goto cleanup; + } + + folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS); + if (!folder) { + g_printerr ("modest: failed to find Drafts folder\n"); + goto cleanup; + } + + tny_folder_add_msg (folder, msg, &err); + if (err) { + g_printerr ("modest: error adding msg to Drafts folder: %s", + err->message); + g_error_free (err); + goto cleanup; + } + /* Show edit window */ - msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account); + msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name); gtk_widget_show_all (GTK_WIDGET (msg_win)); - - /* Clean */ - g_object_unref (G_OBJECT (new_msg)); - cleanup: - g_free (rf_helper->account); +cleanup: + if (new_msg) + g_object_unref (G_OBJECT (new_msg)); + if (folder) + g_object_unref (G_OBJECT (folder)); + if (account) + g_object_unref (G_OBJECT (account)); + + g_free (rf_helper->account_name); g_slice_free (ReplyForwardHelper, rf_helper); } - /* * Common code for the reply and forward actions */ static void -reply_forward (GtkWidget *widget, ReplyForwardAction action, ModestWindow *win) +reply_forward (ReplyForwardAction action, ModestWindow *win) { TnyList *header_list; guint reply_forward_type; @@ -314,17 +429,16 @@ reply_forward (GtkWidget *widget, ReplyForwardAction action, ModestWindow *win) TnyFolder *folder; GetMsgAsyncHelper *helper; ReplyForwardHelper *rf_helper; - + g_return_if_fail (MODEST_IS_WINDOW(win)); - header_list = get_selected_headers (win); + header_list = get_selected_headers (win); if (!header_list) return; reply_forward_type = modest_conf_get_int (modest_runtime_get_conf (), (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE, NULL); - /* We assume that we can only select messages of the same folder and that we reply all of them from the same account. In fact the interface currently only @@ -334,53 +448,68 @@ reply_forward (GtkWidget *widget, ReplyForwardAction action, ModestWindow *win) rf_helper = g_slice_new0 (ReplyForwardHelper); rf_helper->reply_forward_type = reply_forward_type; rf_helper->action = action; - rf_helper->account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());; + + rf_helper->account_name = g_strdup (modest_window_get_active_account (win)); + if (!rf_helper->account_name) + rf_helper->account_name = + modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); helper = g_slice_new0 (GetMsgAsyncHelper); - //helper->main_window = NULL; + helper->window = win; helper->func = reply_forward_func; helper->iter = tny_list_create_iterator (header_list); helper->user_data = rf_helper; - - header = TNY_HEADER (tny_iterator_get_current (helper->iter)); - folder = tny_header_get_folder (header); - if (folder) { - /* The callback will call it per each header */ - tny_folder_get_msg_async (folder, header, get_msg_cb, helper); - g_object_unref (G_OBJECT (folder)); - } else - g_printerr ("modest: no folder for header\n"); - - /* Clean */ - g_object_unref (G_OBJECT (header)); + + if (MODEST_IS_MSG_VIEW_WINDOW(win)) { + TnyMsg *msg; + msg = modest_msg_view_window_get_message(MODEST_MSG_VIEW_WINDOW(win)); + if (!msg) { + g_printerr ("modest: no message found\n"); + return; + } else + reply_forward_func (msg, helper); + } else { + header = TNY_HEADER (tny_iterator_get_current (helper->iter)); + folder = tny_header_get_folder (header); + if (folder) { + /* The callback will call it per each header */ + tny_folder_get_msg_async (folder, header, get_msg_cb, helper); + g_object_unref (G_OBJECT (folder)); + } else + g_printerr ("modest: no folder for header\n"); + + /* Clean */ + g_object_unref (G_OBJECT (header)); + } } + void -modest_ui_actions_on_reply (GtkWidget *widget, ModestWindow *win) +modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win) { g_return_if_fail (MODEST_IS_WINDOW(win)); - reply_forward (widget, ACTION_REPLY, win); + reply_forward (ACTION_REPLY, win); } void -modest_ui_actions_on_forward (GtkWidget *widget, ModestWindow *win) +modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win) { g_return_if_fail (MODEST_IS_WINDOW(win)); - reply_forward (widget, ACTION_FORWARD, win); + reply_forward (ACTION_FORWARD, win); } void -modest_ui_actions_on_reply_all (GtkWidget *widget,ModestWindow *win) +modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win) { g_return_if_fail (MODEST_IS_WINDOW(win)); - reply_forward (widget, ACTION_REPLY_TO_ALL, win); + reply_forward (ACTION_REPLY_TO_ALL, win); } void -modest_ui_actions_on_next (GtkWidget *widget, +modest_ui_actions_on_next (GtkAction *action, ModestMainWindow *main_window) { GtkWidget *header_view; @@ -395,7 +524,7 @@ modest_ui_actions_on_next (GtkWidget *widget, } void -modest_ui_actions_on_prev (GtkWidget *widget, +modest_ui_actions_on_prev (GtkAction *action, ModestMainWindow *main_window) { GtkWidget *header_view; @@ -411,19 +540,13 @@ modest_ui_actions_on_prev (GtkWidget *widget, void -modest_ui_actions_on_send_receive (GtkWidget *widget, ModestWindow *win) +modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) { - TnyDevice *device; - TnyAccountStore *account_store; gchar *account_name; TnyAccount *tny_account; ModestTnySendQueue *send_queue; + ModestMailOperation *mail_op; - /* Get device. Do not ask the platform factory for it, because - it returns always a new one */ - account_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()); - device = tny_account_store_get_device (account_store); - account_name = g_strdup(modest_window_get_active_account(MODEST_WINDOW(win))); if (!account_name) @@ -435,23 +558,46 @@ modest_ui_actions_on_send_receive (GtkWidget *widget, ModestWindow *win) tny_account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), - account_name, TNY_ACCOUNT_TYPE_TRANSPORT); + account_name, + TNY_ACCOUNT_TYPE_TRANSPORT); if (!tny_account) { - g_printerr ("modest: cannot get tny transport account\n"); + g_printerr ("modest: cannot get tny transport account for %s\n", account_name); return; } - send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account)); - modest_tny_send_queue_flush (send_queue); + if (!send_queue) { + g_object_unref (G_OBJECT(tny_account)); + g_printerr ("modest: cannot get send queue for %s\n", account_name); + return; + } + //modest_tny_send_queue_flush (send_queue); g_object_unref (G_OBJECT(send_queue)); g_object_unref (G_OBJECT(tny_account)); + + tny_account = + modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), + account_name, + TNY_ACCOUNT_TYPE_STORE); + if (!tny_account) { + g_printerr ("modest: cannot get tny store account for %s\n", account_name); + return; + } + + /* Create the mail operation */ + mail_op = modest_mail_operation_new (); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); + modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account)); + + /* Frees */ + g_object_unref (G_OBJECT (tny_account)); + g_object_unref (G_OBJECT (mail_op)); } void -modest_ui_actions_toggle_view (GtkWidget *widget, ModestMainWindow *main_window) +modest_ui_actions_toggle_view (GtkAction *action, ModestMainWindow *main_window) { ModestConf *conf; GtkWidget *header_view; @@ -466,7 +612,8 @@ modest_ui_actions_toggle_view (GtkWidget *widget, ModestMainWindow *main_window) conf = modest_runtime_get_conf (); /* what is saved/restored is depending on the style; thus; we save with - * old style, then update the style, and restore for this new style*/ + * old style, then update the style, and restore for this new style + */ modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view"); if (modest_header_view_get_style @@ -498,12 +645,11 @@ read_msg_func (gpointer data, gpointer user_data) msg = TNY_MSG (data); helper = (GetMsgAsyncHelper *) user_data; - msg_preview = modest_main_window_get_child_widget (helper->main_window, + msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window), MODEST_WIDGET_TYPE_MSG_PREVIEW); if (!msg_preview) return; - /* mark message as seen; _set_flags crashes, bug in tinymail? */ header = TNY_HEADER (tny_iterator_get_current (helper->iter)); header_flags = tny_header_get_flags (header); tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN); @@ -530,13 +676,9 @@ get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data) helper = (GetMsgAsyncHelper *) user_data; if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) { - GtkWidget *header_view = - modest_main_window_get_child_widget(helper->main_window, - MODEST_WIDGET_TYPE_HEADER_VIEW); - if (header_view) - modest_ui_actions_on_item_not_found (MODEST_HEADER_VIEW(header_view), - MODEST_ITEM_TYPE_MESSAGE, - MODEST_WINDOW(helper->main_window)); + modest_ui_actions_on_item_not_found (NULL, + MODEST_ITEM_TYPE_MESSAGE, + helper->window); return; } @@ -592,7 +734,7 @@ modest_ui_actions_on_header_selected (ModestHeaderView *folder_view, /* Fill helper data */ helper = g_slice_new0 (GetMsgAsyncHelper); - helper->main_window = main_window; + helper->window = MODEST_WINDOW (main_window); helper->iter = tny_list_create_iterator (list); helper->func = read_msg_func; @@ -649,33 +791,19 @@ cleanup: if (folder) g_object_unref (G_OBJECT (folder)); if (msg) - g_object_unref (G_OBJECT (folder)); + g_object_unref (G_OBJECT (msg)); } - - - - void modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, TnyFolder *folder, gboolean selected, ModestMainWindow *main_window) { -// GtkLabel *folder_info_label; - gchar *txt; + gchar *txt; ModestConf *conf; GtkWidget *header_view; -/* folder_info_label = */ -/* GTK_LABEL (modest_widget_factory_get_folder_info_label */ -/* (modest_runtime_get_widget_factory())); */ - -/* if (!folder) { */ -/* gtk_label_set_label (GTK_LABEL(folder_info_label), ""); */ -/* return; */ -/* } */ - g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); header_view = modest_main_window_get_child_widget(main_window, @@ -714,56 +842,6 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, } } - -/****************************************************/ -/* - * below some stuff to clearup statusbar messages after 1,5 seconds.... - */ -static gboolean -progress_bar_clean (GtkWidget *bar) -{ - if (GTK_IS_PROGRESS_BAR(bar)) { - gtk_progress_bar_set_text (GTK_PROGRESS_BAR(bar), ""); - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(bar), 1.0); - } - return FALSE; -} - -static gboolean -statusbar_clean (GtkWidget *bar) -{ - if (GTK_IS_STATUSBAR(bar)) - gtk_statusbar_push (GTK_STATUSBAR(bar), 0, ""); - return FALSE; -} - - -static void -statusbar_push (ModestMainWindow *main_window, guint context_id, const gchar *msg) -{ - if (!msg) - return; - - GtkWidget *progress_bar, *status_bar; - - progress_bar = modest_main_window_get_child_widget (main_window, - MODEST_WIDGET_TYPE_PROGRESS_BAR); - status_bar = modest_main_window_get_child_widget (main_window, - MODEST_WIDGET_TYPE_STATUS_BAR); - if (progress_bar) { - gtk_widget_show (progress_bar); - g_timeout_add (3000, (GSourceFunc)progress_bar_clean, progress_bar); - } - - if (status_bar) { - gtk_widget_show (status_bar); - gtk_statusbar_push (GTK_STATUSBAR(status_bar), 0, msg); - g_timeout_add (1500, (GSourceFunc)statusbar_clean, status_bar); - } - -} -/****************************************************************************/ - void modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type, ModestWindow *win) @@ -771,19 +849,12 @@ modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemTyp GtkWidget *dialog; gchar *txt, *item; gboolean online; - TnyDevice *device; - TnyAccountStore *account_store; item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message"; - /* Get device. Do not ask the platform factory for it, because - it returns always a new one */ - account_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()); - device = tny_account_store_get_device (account_store); - if (g_main_depth > 0) gdk_threads_enter (); - online = tny_device_is_online (device); + online = tny_device_is_online (modest_runtime_get_device()); if (online) { /* already online -- the item is simply not there... */ @@ -812,7 +883,7 @@ modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemTyp gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300); if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - tny_device_force_online (device); +// tny_device_force_online (modest_runtime_get_device()); } } gtk_widget_destroy (dialog); @@ -820,37 +891,6 @@ modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemTyp gdk_threads_leave (); } - - -void -modest_ui_actions_on_header_status_update (ModestHeaderView *header_view, - const gchar *msg, gint num, - gint total, ModestMainWindow *main_window) -{ - char* txt; - GtkWidget *progress_bar; - - g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); - - progress_bar = modest_main_window_get_child_widget (main_window, - MODEST_WIDGET_TYPE_PROGRESS_BAR); - if (!progress_bar) - return; - - if (total != 0) - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress_bar), - (gdouble)num/(gdouble)total); - else - gtk_progress_bar_pulse (GTK_PROGRESS_BAR(progress_bar)); - - txt = g_strdup_printf (_("Downloading %d of %d"), num, total); - gtk_progress_bar_set_text (GTK_PROGRESS_BAR(progress_bar), txt); - g_free (txt); - - statusbar_push (main_window, 0, msg); -} - - void modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link, ModestWindow *win) @@ -867,7 +907,7 @@ modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link } void -modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, int index, +modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part, ModestWindow *win) { g_message (__FUNCTION__); @@ -875,6 +915,14 @@ modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, int index, } void +modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview, + const gchar *address, + ModestWindow *win) +{ + g_message ("%s %s", __FUNCTION__, address); +} + +void modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) { TnyTransportAccount *transport_account; @@ -911,8 +959,11 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) return; } from = modest_account_mgr_get_from_string (account_mgr, account_name); - + + /* Create the mail operation */ mail_operation = modest_mail_operation_new (); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation); + modest_mail_operation_send_new_mail (mail_operation, transport_account, from, @@ -920,21 +971,146 @@ modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window) data->cc, data->bcc, data->subject, - data->body, - NULL); + data->plain_body, + data->html_body, + data->attachments); /* Frees */ g_free (from); g_free (account_name); - g_object_unref (G_OBJECT (mail_operation)); g_object_unref (G_OBJECT (transport_account)); + g_object_unref (G_OBJECT (mail_operation)); modest_msg_edit_window_free_msg_data (edit_window, data); /* Save settings and close the window */ - /* save_settings (edit_window) */ gtk_widget_destroy (GTK_WIDGET (edit_window)); } +void +modest_ui_actions_on_toggle_bold (GtkToggleAction *action, + ModestMsgEditWindow *window) +{ + ModestMsgEditFormatState *format_state = NULL; + + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + g_return_if_fail (GTK_IS_TOGGLE_ACTION (action)); + + if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT) + return; + + format_state = modest_msg_edit_window_get_format_state (window); + g_return_if_fail (format_state != NULL); + + format_state->bold = gtk_toggle_action_get_active (action); + modest_msg_edit_window_set_format_state (window, format_state); + g_free (format_state); + +} + +void +modest_ui_actions_on_toggle_italics (GtkToggleAction *action, + ModestMsgEditWindow *window) +{ + ModestMsgEditFormatState *format_state = NULL; + + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + g_return_if_fail (GTK_IS_TOGGLE_ACTION (action)); + + if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT) + return; + + format_state = modest_msg_edit_window_get_format_state (window); + g_return_if_fail (format_state != NULL); + + format_state->italics = gtk_toggle_action_get_active (action); + modest_msg_edit_window_set_format_state (window, format_state); + g_free (format_state); + +} + +void +modest_ui_actions_on_toggle_bullets (GtkToggleAction *action, + ModestMsgEditWindow *window) +{ + ModestMsgEditFormatState *format_state = NULL; + + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + g_return_if_fail (GTK_IS_TOGGLE_ACTION (action)); + + if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT) + return; + + format_state = modest_msg_edit_window_get_format_state (window); + g_return_if_fail (format_state != NULL); + + format_state->bullet = gtk_toggle_action_get_active (action); + modest_msg_edit_window_set_format_state (window, format_state); + g_free (format_state); + +} + +void +modest_ui_actions_on_change_justify (GtkRadioAction *action, + GtkRadioAction *selected, + ModestMsgEditWindow *window) +{ + ModestMsgEditFormatState *format_state = NULL; + GtkJustification value; + + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + + if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT) + return; + + value = gtk_radio_action_get_current_value (selected); + + format_state = modest_msg_edit_window_get_format_state (window); + g_return_if_fail (format_state != NULL); + + format_state->justification = value; + modest_msg_edit_window_set_format_state (window, format_state); + g_free (format_state); +} + +void +modest_ui_actions_on_select_editor_color (GtkAction *action, + ModestMsgEditWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + g_return_if_fail (GTK_IS_ACTION (action)); + + if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT) + return; + + modest_msg_edit_window_select_color (window); +} + +void +modest_ui_actions_on_select_editor_background_color (GtkAction *action, + ModestMsgEditWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + g_return_if_fail (GTK_IS_ACTION (action)); + + if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT) + return; + + modest_msg_edit_window_select_background_color (window); +} + +void +modest_ui_actions_on_insert_image (GtkAction *action, + ModestMsgEditWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + g_return_if_fail (GTK_IS_ACTION (action)); + + if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT) + return; + + modest_msg_edit_window_insert_image (window); +} + /* * Shows a dialog with an entry that asks for some text. The returned * value must be freed by the caller. The dialog window title will be @@ -976,7 +1152,7 @@ ask_for_folder_name (GtkWindow *parent_window, } void -modest_ui_actions_on_new_folder (GtkWidget *widget, ModestMainWindow *main_window) +modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window) { TnyFolder *parent_folder; GtkWidget *folder_view; @@ -1001,26 +1177,23 @@ modest_ui_actions_on_new_folder (GtkWidget *widget, ModestMainWindow *main_windo ModestMailOperation *mail_op; mail_op = modest_mail_operation_new (); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + new_folder = modest_mail_operation_create_folder (mail_op, TNY_FOLDER_STORE (parent_folder), (const gchar *) folder_name); - if (new_folder) { - /* TODO: tinymail should do this. - Update view */ - modest_folder_view_add_subfolder (MODEST_FOLDER_VIEW(folder_view), - new_folder); - - /* Free new folder */ + if (new_folder) g_object_unref (new_folder); - } g_object_unref (mail_op); + g_free (folder_name); } g_object_unref (parent_folder); } } void -modest_ui_actions_on_rename_folder (GtkWidget *widget, +modest_ui_actions_on_rename_folder (GtkAction *action, ModestMainWindow *main_window) { TnyFolder *folder; @@ -1042,22 +1215,17 @@ modest_ui_actions_on_rename_folder (GtkWidget *widget, if (folder_name != NULL && strlen (folder_name) > 0) { ModestMailOperation *mail_op; - const GError *error; mail_op = modest_mail_operation_new (); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + modest_mail_operation_rename_folder (mail_op, folder, (const gchar *) folder_name); - error = modest_mail_operation_get_error (mail_op); - if (!error) - /* TODO: tinymail should do this. - Update view */ - modest_folder_view_rename (MODEST_FOLDER_VIEW(folder_view)); - - /* TODO: else ? notify error ? */ - g_object_unref (mail_op); + g_free (folder_name); } g_object_unref (folder); } @@ -1077,15 +1245,19 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash) if (!folder_view) return; - folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view)); + folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)); mail_op = modest_mail_operation_new (); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); modest_mail_operation_remove_folder (mail_op, folder, move_to_trash); - g_object_unref (mail_op); + + g_object_unref (G_OBJECT (mail_op)); + g_object_unref (G_OBJECT (folder)); } void -modest_ui_actions_on_delete_folder (GtkWidget *widget, +modest_ui_actions_on_delete_folder (GtkAction *action, ModestMainWindow *main_window) { g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); @@ -1094,7 +1266,7 @@ modest_ui_actions_on_delete_folder (GtkWidget *widget, } void -modest_ui_actions_on_move_folder_to_trash_folder (GtkWidget *widget, ModestMainWindow *main_window) +modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window) { g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); @@ -1102,39 +1274,6 @@ modest_ui_actions_on_move_folder_to_trash_folder (GtkWidget *widget, ModestMainW } void -modest_ui_actions_on_accounts_reloaded (TnyAccountStore *store, gpointer user_data) -{ - /* FIXME */ - /* ModestFolderView *folder_view; */ - -/* folder_view = modest_widget_factory_get_folder_view (modest_runtime_get_widget_factory()); */ -/* modest_folder_view_update_model (folder_view, store); */ -} - -void -modest_ui_actions_on_folder_moved (ModestFolderView *folder_view, TnyFolder *folder, - TnyFolderStore *parent, gboolean *done, - gpointer user_data) -{ - ModestMailOperation *mail_op; - const GError *error; - - *done = TRUE; - - /* Try to move the folder */ - mail_op = modest_mail_operation_new (); - modest_mail_operation_move_folder (mail_op, folder, parent); - - error = modest_mail_operation_get_error (mail_op); - if (error) - *done = FALSE; - - g_object_unref (G_OBJECT (mail_op)); -} - - - -void modest_ui_actions_on_password_requested (TnyAccountStore *account_store, const gchar* account_name, gchar **password, @@ -1188,3 +1327,84 @@ modest_ui_actions_on_password_requested (TnyAccountStore *account_store, gtk_widget_destroy (dialog); } + +void +modest_ui_actions_on_cut (GtkAction *action, + ModestWindow *window) +{ + GtkWidget *focused_widget; + + focused_widget = gtk_window_get_focus (GTK_WINDOW (window)); + if (GTK_IS_EDITABLE (focused_widget)) { + gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget)); + } else if (GTK_IS_TEXT_VIEW (focused_widget)) { + GtkTextBuffer *buffer; + GtkClipboard *clipboard; + + clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget)); + gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE); + } +} + +void +modest_ui_actions_on_copy (GtkAction *action, + ModestWindow *window) +{ + GtkClipboard *clipboard; + GtkWidget *focused_widget; + + clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + focused_widget = gtk_window_get_focus (GTK_WINDOW (window)); + if (GTK_IS_LABEL (focused_widget)) { + gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1); + } else if (GTK_IS_EDITABLE (focused_widget)) { + gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget)); + } else if (GTK_IS_TEXT_VIEW (focused_widget)) { + GtkTextBuffer *buffer; + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget)); + gtk_text_buffer_copy_clipboard (buffer, clipboard); + } +} + +void +modest_ui_actions_on_paste (GtkAction *action, + ModestWindow *window) +{ + GtkWidget *focused_widget; + + focused_widget = gtk_window_get_focus (GTK_WINDOW (window)); + if (GTK_IS_EDITABLE (focused_widget)) { + gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget)); + } else if (GTK_IS_TEXT_VIEW (focused_widget)) { + GtkTextBuffer *buffer; + GtkClipboard *clipboard; + + clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget)); + gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE); + } +} + +void +modest_ui_actions_on_select_all (GtkAction *action, + ModestWindow *window) +{ + GtkWidget *focused_widget; + + focused_widget = gtk_window_get_focus (GTK_WINDOW (window)); + if (GTK_IS_LABEL (focused_widget)) { + gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1); + } else if (GTK_IS_EDITABLE (focused_widget)) { + gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1); + } else if (GTK_IS_TEXT_VIEW (focused_widget)) { + GtkTextBuffer *buffer; + GtkTextIter start, end; + + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget)); + gtk_text_buffer_get_start_iter (buffer, &start); + gtk_text_buffer_get_end_iter (buffer, &end); + gtk_text_buffer_select_range (buffer, &start, &end); + } +}