1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the Nokia Corporation nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #endif /*HAVE_CONFIG_H*/
34 #include <glib/gi18n.h>
36 #include <modest-runtime.h>
37 #include <modest-tny-msg.h>
38 #include <modest-tny-account.h>
40 #include "modest-ui-actions.h"
42 #include "modest-tny-platform-factory.h"
44 #include <widgets/modest-main-window.h>
45 #include <widgets/modest-msg-view-window.h>
46 #include <widgets/modest-account-view-window.h>
48 #include "modest-account-mgr-helpers.h"
49 #include "modest-mail-operation.h"
50 #include <modest-widget-memory.h>
51 #include <tny-error.h>
52 #include <tny-simple-list.h>
53 #include <tny-msg-view.h>
54 #include <tny-device.h>
57 typedef struct _GetMsgAsyncHelper {
64 typedef enum _ReplyForwardAction {
70 typedef struct _ReplyForwardHelper {
71 guint reply_forward_type;
72 ReplyForwardAction action;
77 static void reply_forward_func (gpointer data, gpointer user_data);
78 static void read_msg_func (gpointer data, gpointer user_data);
79 static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err,
81 static void reply_forward (GtkWidget *widget, ReplyForwardAction action,
83 static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title);
87 modest_ui_actions_on_about (GtkWidget *widget, ModestWindow *win)
90 const gchar *authors[] = {
91 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
94 about = gtk_about_dialog_new ();
95 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
96 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
97 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
98 _("Copyright (c) 2006, Nokia Corporation\n"
99 "All rights reserved."));
100 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
101 _("a modest e-mail client\n\n"
102 "design and implementation: Dirk-Jan C. Binnema\n"
103 "contributions from the fine people at KernelConcepts and Igalia\n"
104 "uses the tinymail email framework written by Philip van Hoof"));
105 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
106 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
108 gtk_dialog_run (GTK_DIALOG (about));
109 gtk_widget_destroy(about);
114 get_selected_headers (ModestWindow *win)
116 if (MODEST_IS_MAIN_WINDOW(win)) {
117 GtkWidget *header_view;
119 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
120 MODEST_WIDGET_TYPE_HEADER_VIEW);
121 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
123 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
124 /* for MsgViewWindows, we simply return a list with one element */
127 TnyList *list = NULL;
129 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
131 header = tny_msg_get_header (msg);
132 list = tny_simple_list_new ();
133 tny_list_prepend (list, G_OBJECT(header));
134 g_object_unref (G_OBJECT(header));
143 modest_ui_actions_on_delete (GtkWidget *widget, ModestWindow *win)
145 TnyList *header_list;
147 // GtkTreeModel *model;
149 g_return_if_fail (MODEST_IS_WINDOW(win));
151 header_list = get_selected_headers (win);
154 iter = tny_list_create_iterator (header_list);
155 /* model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)); */
156 /* if (GTK_IS_TREE_MODEL_SORT (model)) */
157 /* model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model)); */
160 ModestMailOperation *mail_op;
162 header = TNY_HEADER (tny_iterator_get_current (iter));
163 /* TODO: thick grain mail operation involving
164 a list of objects. Composite pattern ??? */
165 mail_op = modest_mail_operation_new ();
167 /* TODO: add confirmation dialog */
170 modest_mail_operation_remove_msg (mail_op, header, TRUE);
172 /* Remove from tree model */
173 if (modest_mail_operation_get_status (mail_op) ==
174 MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
175 /* tny_list_remove (TNY_LIST (model), G_OBJECT (header)); */
177 /* TODO: error handling management */
179 error = modest_mail_operation_get_error (mail_op);
181 g_warning (error->message);
184 g_object_unref (G_OBJECT (mail_op));
185 g_object_unref (header);
186 tny_iterator_next (iter);
188 } while (!tny_iterator_is_done (iter));
194 modest_ui_actions_on_quit (GtkWidget *widget, ModestWindow *win)
196 /* FIXME: save size of main window */
197 /* save_sizes (main_window); */
198 gtk_widget_destroy (GTK_WIDGET (win));
202 modest_ui_actions_on_accounts (GtkWidget *widget, ModestWindow *win)
204 GtkWidget *account_win;
205 account_win = modest_account_view_window_new ();
208 gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW (win));
210 gtk_widget_show (account_win);
214 modest_ui_actions_on_new_msg (GtkWidget *widget, ModestWindow *win)
216 ModestWindow *msg_win;
218 TnyFolder *folder = NULL;
219 gchar *account_name = NULL;
220 gchar *from_str = NULL;
224 account_name = g_strdup(modest_window_get_active_account (win));
226 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
228 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
230 TNY_ACCOUNT_TYPE_STORE);
232 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
236 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
238 msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL);
240 g_printerr ("modest: failed to create new msg\n");
244 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
246 g_printerr ("modest: failed to find Drafts folder\n");
250 tny_folder_add_msg (folder, msg, &err);
252 g_printerr ("modest: error adding msg to Drafts folder: %s",
258 msg_win = modest_msg_edit_window_new (msg, account_name);
260 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
262 gtk_widget_show_all (GTK_WIDGET (msg_win));
265 g_free (account_name);
268 g_object_unref (G_OBJECT(account));
270 g_object_unref (G_OBJECT(msg));
272 g_object_unref (G_OBJECT(folder));
277 modest_ui_actions_on_open (GtkWidget *widget, ModestWindow *win)
287 reply_forward_func (gpointer data, gpointer user_data)
289 TnyMsg *msg, *new_msg;
290 GetMsgAsyncHelper *helper;
291 ReplyForwardHelper *rf_helper;
292 ModestWindow *msg_win;
293 ModestEditType edit_type;
296 TnyFolder *folder = NULL;
297 TnyAccount *account = NULL;
299 msg = TNY_MSG (data);
300 helper = (GetMsgAsyncHelper *) user_data;
301 rf_helper = (ReplyForwardHelper *) helper->user_data;
303 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
304 rf_helper->account_name);
305 /* Create reply mail */
306 switch (rf_helper->action) {
309 modest_mail_operation_create_reply_mail (msg, from,
310 rf_helper->reply_forward_type,
311 MODEST_MAIL_OPERATION_REPLY_MODE_SENDER);
313 case ACTION_REPLY_TO_ALL:
315 modest_mail_operation_create_reply_mail (msg, from, rf_helper->reply_forward_type,
316 MODEST_MAIL_OPERATION_REPLY_MODE_ALL);
317 edit_type = MODEST_EDIT_TYPE_REPLY;
321 modest_mail_operation_create_forward_mail (msg, from, rf_helper->reply_forward_type);
322 edit_type = MODEST_EDIT_TYPE_FORWARD;
325 g_return_if_reached ();
330 g_printerr ("modest: failed to create message\n");
334 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
335 rf_helper->account_name,
336 TNY_ACCOUNT_TYPE_STORE);
338 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
342 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
344 g_printerr ("modest: failed to find Drafts folder\n");
348 tny_folder_add_msg (folder, msg, &err);
350 g_printerr ("modest: error adding msg to Drafts folder: %s",
356 /* Show edit window */
357 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
358 gtk_widget_show_all (GTK_WIDGET (msg_win));
362 g_object_unref (G_OBJECT (new_msg));
364 g_object_unref (G_OBJECT (folder));
366 g_object_unref (G_OBJECT (account));
368 g_free (rf_helper->account_name);
369 g_slice_free (ReplyForwardHelper, rf_helper);
372 * Common code for the reply and forward actions
375 reply_forward (GtkWidget *widget, ReplyForwardAction action, ModestWindow *win)
377 TnyList *header_list;
378 guint reply_forward_type;
381 GetMsgAsyncHelper *helper;
382 ReplyForwardHelper *rf_helper;
384 g_return_if_fail (MODEST_IS_WINDOW(win));
386 header_list = get_selected_headers (win);
390 reply_forward_type = modest_conf_get_int (modest_runtime_get_conf (),
391 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
393 /* We assume that we can only select messages of the
394 same folder and that we reply all of them from the
395 same account. In fact the interface currently only
396 allows single selection */
399 rf_helper = g_slice_new0 (ReplyForwardHelper);
400 rf_helper->reply_forward_type = reply_forward_type;
401 rf_helper->action = action;
403 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
404 if (!rf_helper->account_name)
405 rf_helper->account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
407 helper = g_slice_new0 (GetMsgAsyncHelper);
408 helper->window = win;
409 helper->func = reply_forward_func;
410 helper->iter = tny_list_create_iterator (header_list);
411 helper->user_data = rf_helper;
413 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
414 folder = tny_header_get_folder (header);
416 /* The callback will call it per each header */
417 tny_folder_get_msg_async (folder, header, get_msg_cb, helper);
418 g_object_unref (G_OBJECT (folder));
420 g_printerr ("modest: no folder for header\n");
423 g_object_unref (G_OBJECT (header));
427 modest_ui_actions_on_reply (GtkWidget *widget, ModestWindow *win)
429 g_return_if_fail (MODEST_IS_WINDOW(win));
431 reply_forward (widget, ACTION_REPLY, win);
435 modest_ui_actions_on_forward (GtkWidget *widget, ModestWindow *win)
437 g_return_if_fail (MODEST_IS_WINDOW(win));
439 reply_forward (widget, ACTION_FORWARD, win);
443 modest_ui_actions_on_reply_all (GtkWidget *widget,ModestWindow *win)
445 g_return_if_fail (MODEST_IS_WINDOW(win));
447 reply_forward (widget, ACTION_REPLY_TO_ALL, win);
451 modest_ui_actions_on_next (GtkWidget *widget,
452 ModestMainWindow *main_window)
454 GtkWidget *header_view;
455 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
457 header_view = modest_main_window_get_child_widget (main_window,
458 MODEST_WIDGET_TYPE_HEADER_VIEW);
462 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
466 modest_ui_actions_on_prev (GtkWidget *widget,
467 ModestMainWindow *main_window)
469 GtkWidget *header_view;
470 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
472 header_view = modest_main_window_get_child_widget (main_window,
473 MODEST_WIDGET_TYPE_HEADER_VIEW);
477 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
482 modest_ui_actions_on_send_receive (GtkWidget *widget, ModestWindow *win)
485 TnyAccount *tny_account;
486 ModestTnySendQueue *send_queue;
489 g_strdup(modest_window_get_active_account(MODEST_WINDOW(win)));
491 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
493 g_printerr ("modest: cannot get account\n");
498 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
500 TNY_ACCOUNT_TYPE_TRANSPORT);
502 g_printerr ("modest: cannot get tny transport account\n");
506 send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account));
507 modest_tny_send_queue_flush (send_queue);
509 g_object_unref (G_OBJECT(send_queue));
510 g_object_unref (G_OBJECT(tny_account));
516 modest_ui_actions_toggle_view (GtkWidget *widget, ModestMainWindow *main_window)
519 GtkWidget *header_view;
521 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
523 header_view = modest_main_window_get_child_widget (main_window,
524 MODEST_WIDGET_TYPE_HEADER_VIEW);
528 conf = modest_runtime_get_conf ();
530 /* what is saved/restored is depending on the style; thus; we save with
531 * old style, then update the style, and restore for this new style*/
532 modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view");
534 if (modest_header_view_get_style
535 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
536 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
537 MODEST_HEADER_VIEW_STYLE_TWOLINES);
539 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
540 MODEST_HEADER_VIEW_STYLE_DETAILS);
542 modest_widget_memory_restore (conf, G_OBJECT(header_view),
549 * Marks a message as read and passes it to the msg preview widget
552 read_msg_func (gpointer data, gpointer user_data)
556 GetMsgAsyncHelper *helper;
557 TnyHeaderFlags header_flags;
558 GtkWidget *msg_preview;
560 msg = TNY_MSG (data);
561 helper = (GetMsgAsyncHelper *) user_data;
563 msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
564 MODEST_WIDGET_TYPE_MSG_PREVIEW);
568 /* mark message as seen; _set_flags crashes, bug in tinymail? */
569 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
570 header_flags = tny_header_get_flags (header);
571 tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
572 g_object_unref (G_OBJECT (header));
574 /* Set message on msg view */
575 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg);
579 * This function is a generic handler for the tny_folder_get_msg_async
580 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
581 * contains a user provided function that is called inside this
582 * method. This will allow us to use this callback in many different
583 * places. This callback performs the common actions for the
584 * get_msg_async call, more specific actions will be done by the user
588 get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
590 GetMsgAsyncHelper *helper;
592 helper = (GetMsgAsyncHelper *) user_data;
594 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
595 modest_ui_actions_on_item_not_found (NULL,
596 MODEST_ITEM_TYPE_MESSAGE,
601 /* Call user function */
602 helper->func (msg, user_data);
604 /* Process next element (if exists) */
605 tny_iterator_next (helper->iter);
606 if (tny_iterator_is_done (helper->iter)) {
608 headers = tny_iterator_get_list (helper->iter);
610 g_object_unref (G_OBJECT (headers));
611 g_object_unref (G_OBJECT (helper->iter));
612 g_slice_free (GetMsgAsyncHelper, helper);
615 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
616 tny_folder_get_msg_async (folder, header,
618 g_object_unref (G_OBJECT(header));
623 modest_ui_actions_on_header_selected (ModestHeaderView *folder_view,
625 ModestMainWindow *main_window)
627 GtkWidget *msg_preview;
629 GetMsgAsyncHelper *helper;
632 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
634 msg_preview = modest_main_window_get_child_widget(main_window,
635 MODEST_WIDGET_TYPE_MSG_PREVIEW);
639 /* when there's no header, clear the msgview */
641 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
645 folder = tny_header_get_folder (TNY_HEADER(header));
648 list = tny_simple_list_new ();
649 tny_list_prepend (list, G_OBJECT (header));
651 /* Fill helper data */
652 helper = g_slice_new0 (GetMsgAsyncHelper);
653 helper->window = MODEST_WINDOW (main_window);
654 helper->iter = tny_list_create_iterator (list);
655 helper->func = read_msg_func;
657 tny_folder_get_msg_async (TNY_FOLDER(folder),
662 g_object_unref (G_OBJECT (folder));
668 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
669 ModestMainWindow *main_window)
672 TnyFolder *folder = NULL;
674 gchar *account = NULL;
676 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
681 folder = tny_header_get_folder (header);
683 g_printerr ("modest: cannot get folder for header\n");
687 /* FIXME: make async?; check error */
688 msg = tny_folder_get_msg (folder, header, NULL);
690 g_printerr ("modest: cannot get msg for header\n");
694 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
696 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
698 win = modest_msg_view_window_new (msg, account);
699 gtk_window_set_transient_for (GTK_WINDOW (win),
700 GTK_WINDOW (main_window));
702 gtk_widget_show_all (GTK_WIDGET(win));
708 g_object_unref (G_OBJECT (folder));
710 g_object_unref (G_OBJECT (msg));
718 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
721 ModestMainWindow *main_window)
723 // GtkLabel *folder_info_label;
726 GtkWidget *header_view;
728 /* folder_info_label = */
729 /* GTK_LABEL (modest_widget_factory_get_folder_info_label */
730 /* (modest_runtime_get_widget_factory())); */
733 /* gtk_label_set_label (GTK_LABEL(folder_info_label), ""); */
737 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
739 header_view = modest_main_window_get_child_widget(main_window,
740 MODEST_WIDGET_TYPE_HEADER_VIEW);
744 conf = modest_runtime_get_conf ();
746 if (!selected) { /* the folder was unselected; save it's settings */
747 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
748 gtk_window_set_title (GTK_WINDOW(main_window), "Modest");
749 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
750 } else { /* the folder was selected */
751 if (folder) { /* folder may be NULL */
755 num = tny_folder_get_all_count (folder);
756 unread = tny_folder_get_unread_count (folder);
758 title = g_strdup_printf ("Modest: %s",
759 tny_folder_get_name (folder));
761 gtk_window_set_title (GTK_WINDOW(main_window), title);
764 txt = g_strdup_printf (_("%d %s, %d unread"),
765 num, num==1 ? _("item") : _("items"), unread);
766 //gtk_label_set_label (GTK_LABEL(folder_info_label), txt);
769 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), folder);
770 modest_widget_memory_restore (conf, G_OBJECT(header_view),
776 /****************************************************/
778 * below some stuff to clearup statusbar messages after 1,5 seconds....
781 progress_bar_clean (GtkWidget *bar)
783 if (GTK_IS_PROGRESS_BAR(bar)) {
784 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(bar), "");
785 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(bar), 1.0);
791 statusbar_clean (GtkWidget *bar)
793 if (GTK_IS_STATUSBAR(bar))
794 gtk_statusbar_push (GTK_STATUSBAR(bar), 0, "");
800 statusbar_push (ModestMainWindow *main_window, guint context_id, const gchar *msg)
805 GtkWidget *progress_bar, *status_bar;
807 progress_bar = modest_main_window_get_child_widget (main_window,
808 MODEST_WIDGET_TYPE_PROGRESS_BAR);
809 status_bar = modest_main_window_get_child_widget (main_window,
810 MODEST_WIDGET_TYPE_STATUS_BAR);
812 gtk_widget_show (progress_bar);
813 g_timeout_add (3000, (GSourceFunc)progress_bar_clean, progress_bar);
817 gtk_widget_show (status_bar);
818 gtk_statusbar_push (GTK_STATUSBAR(status_bar), 0, msg);
819 g_timeout_add (1500, (GSourceFunc)statusbar_clean, status_bar);
823 /****************************************************************************/
826 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
833 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
835 if (g_main_depth > 0)
836 gdk_threads_enter ();
837 online = tny_device_is_online (modest_runtime_get_device());
840 /* already online -- the item is simply not there... */
841 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
845 _("The %s you selected cannot be found"),
847 gtk_dialog_run (GTK_DIALOG(dialog));
849 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
857 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
858 "Do you want to get online?"), item);
859 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
860 gtk_label_new (txt), FALSE, FALSE, 0);
861 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
864 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
865 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
866 tny_device_force_online (modest_runtime_get_device());
869 gtk_widget_destroy (dialog);
870 if (g_main_depth > 0)
871 gdk_threads_leave ();
877 modest_ui_actions_on_header_status_update (ModestHeaderView *header_view,
878 const gchar *msg, gint num,
879 gint total, ModestMainWindow *main_window)
882 GtkWidget *progress_bar;
884 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
886 progress_bar = modest_main_window_get_child_widget (main_window,
887 MODEST_WIDGET_TYPE_PROGRESS_BAR);
892 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress_bar),
893 (gdouble)num/(gdouble)total);
895 gtk_progress_bar_pulse (GTK_PROGRESS_BAR(progress_bar));
897 txt = g_strdup_printf (_("Downloading %d of %d"), num, total);
898 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(progress_bar), txt);
901 statusbar_push (main_window, 0, msg);
906 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
909 g_message (__FUNCTION__);
914 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
917 g_message (__FUNCTION__);
921 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, int index,
924 g_message (__FUNCTION__);
929 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
931 TnyTransportAccount *transport_account;
932 ModestMailOperation *mail_operation;
934 gchar *account_name, *from;
935 ModestAccountMgr *account_mgr;
937 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
939 data = modest_msg_edit_window_get_msg_data (edit_window);
941 /* FIXME: Code added just for testing. The final version will
942 use the send queue provided by tinymail and some
944 account_mgr = modest_runtime_get_account_mgr();
945 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
947 account_name = modest_account_mgr_get_default_account (account_mgr);
949 g_printerr ("modest: no account found\n");
950 modest_msg_edit_window_free_msg_data (edit_window, data);
954 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
955 (modest_runtime_get_account_store(),
957 TNY_ACCOUNT_TYPE_TRANSPORT));
958 if (!transport_account) {
959 g_printerr ("modest: no transport account found for '%s'\n", account_name);
960 g_free (account_name);
961 modest_msg_edit_window_free_msg_data (edit_window, data);
964 from = modest_account_mgr_get_from_string (account_mgr, account_name);
966 mail_operation = modest_mail_operation_new ();
967 modest_mail_operation_send_new_mail (mail_operation,
978 g_free (account_name);
979 g_object_unref (G_OBJECT (mail_operation));
980 g_object_unref (G_OBJECT (transport_account));
982 modest_msg_edit_window_free_msg_data (edit_window, data);
984 /* Save settings and close the window */
985 /* save_settings (edit_window) */
986 gtk_widget_destroy (GTK_WIDGET (edit_window));
990 * Shows a dialog with an entry that asks for some text. The returned
991 * value must be freed by the caller. The dialog window title will be
995 ask_for_folder_name (GtkWindow *parent_window,
998 GtkWidget *dialog, *entry;
999 gchar *folder_name = NULL;
1001 /* Ask for folder name */
1002 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1006 GTK_RESPONSE_REJECT,
1008 GTK_RESPONSE_ACCEPT,
1010 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1011 gtk_label_new(title),
1014 entry = gtk_entry_new_with_max_length (40);
1015 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1019 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1021 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1022 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1024 gtk_widget_destroy (dialog);
1030 modest_ui_actions_on_new_folder (GtkWidget *widget, ModestMainWindow *main_window)
1032 TnyFolder *parent_folder;
1033 GtkWidget *folder_view;
1035 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1037 folder_view = modest_main_window_get_child_widget (main_window,
1038 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1042 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1044 if (parent_folder) {
1047 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1048 _("Please enter a name for the new folder"));
1050 if (folder_name != NULL && strlen (folder_name) > 0) {
1051 TnyFolder *new_folder;
1052 ModestMailOperation *mail_op;
1054 mail_op = modest_mail_operation_new ();
1055 new_folder = modest_mail_operation_create_folder (mail_op,
1056 TNY_FOLDER_STORE (parent_folder),
1057 (const gchar *) folder_name);
1059 /* TODO: tinymail should do this.
1061 modest_folder_view_add_subfolder (MODEST_FOLDER_VIEW(folder_view),
1064 /* Free new folder */
1065 g_object_unref (new_folder);
1067 g_object_unref (mail_op);
1069 g_object_unref (parent_folder);
1074 modest_ui_actions_on_rename_folder (GtkWidget *widget,
1075 ModestMainWindow *main_window)
1078 GtkWidget *folder_view;
1080 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1082 folder_view = modest_main_window_get_child_widget (main_window,
1083 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1087 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1091 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1092 _("Please enter a new name for the folder"));
1094 if (folder_name != NULL && strlen (folder_name) > 0) {
1095 ModestMailOperation *mail_op;
1096 const GError *error;
1098 mail_op = modest_mail_operation_new ();
1099 modest_mail_operation_rename_folder (mail_op,
1101 (const gchar *) folder_name);
1103 error = modest_mail_operation_get_error (mail_op);
1105 /* TODO: tinymail should do this.
1107 modest_folder_view_rename (MODEST_FOLDER_VIEW(folder_view));
1109 /* TODO: notify error ? */
1110 g_warning ("Could not rename a folder: %s\n", error->message);
1112 g_object_unref (mail_op);
1114 g_object_unref (folder);
1119 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1122 ModestMailOperation *mail_op;
1123 GtkWidget *folder_view;
1124 const GError *error;
1126 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1128 folder_view = modest_main_window_get_child_widget (main_window,
1129 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1133 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1135 mail_op = modest_mail_operation_new ();
1136 modest_mail_operation_remove_folder (mail_op, folder, move_to_trash);
1138 error = modest_mail_operation_get_error (mail_op);
1140 g_warning ("%s\n", error->message);
1142 g_object_unref (mail_op);
1146 modest_ui_actions_on_delete_folder (GtkWidget *widget,
1147 ModestMainWindow *main_window)
1149 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1151 delete_folder (main_window, FALSE);
1155 modest_ui_actions_on_move_folder_to_trash_folder (GtkWidget *widget, ModestMainWindow *main_window)
1157 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1159 delete_folder (main_window, TRUE);
1163 modest_ui_actions_on_folder_xfer (ModestFolderView *folder_view,
1165 TnyFolderStore *parent,
1166 gboolean delete_source,
1167 TnyFolder **new_folder,
1170 ModestMailOperation *mail_op;
1171 const GError *error;
1173 /* Try to move the folder */
1174 mail_op = modest_mail_operation_new ();
1175 *new_folder = modest_mail_operation_xfer_folder (mail_op, folder, parent, delete_source);
1177 error = modest_mail_operation_get_error (mail_op);
1179 g_warning ("Error transferring folder: %s\n", error->message);
1181 g_object_unref (G_OBJECT (mail_op));
1187 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1188 const gchar* account_name,
1192 ModestMainWindow *main_window)
1195 GtkWidget *dialog, *entry, *remember_pass_check;
1197 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1201 GTK_RESPONSE_REJECT,
1203 GTK_RESPONSE_ACCEPT,
1205 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1207 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1208 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1212 entry = gtk_entry_new_with_max_length (40);
1213 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1214 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1216 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1219 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1220 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1223 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1225 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1226 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1233 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1238 gtk_widget_destroy (dialog);