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 {
58 ModestMainWindow *main_window;
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);
373 * Common code for the reply and forward actions
376 reply_forward (GtkWidget *widget, ReplyForwardAction action, ModestWindow *win)
378 TnyList *header_list;
379 guint reply_forward_type;
382 GetMsgAsyncHelper *helper;
383 ReplyForwardHelper *rf_helper;
385 g_return_if_fail (MODEST_IS_WINDOW(win));
387 header_list = get_selected_headers (win);
391 reply_forward_type = modest_conf_get_int (modest_runtime_get_conf (),
392 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
394 /* We assume that we can only select messages of the
395 same folder and that we reply all of them from the
396 same account. In fact the interface currently only
397 allows single selection */
400 rf_helper = g_slice_new0 (ReplyForwardHelper);
401 rf_helper->reply_forward_type = reply_forward_type;
402 rf_helper->action = action;
404 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
405 if (!rf_helper->account_name)
406 rf_helper->account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
408 helper = g_slice_new0 (GetMsgAsyncHelper);
409 //helper->main_window = NULL;
410 helper->func = reply_forward_func;
411 helper->iter = tny_list_create_iterator (header_list);
412 helper->user_data = rf_helper;
414 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
415 folder = tny_header_get_folder (header);
417 /* The callback will call it per each header */
418 tny_folder_get_msg_async (folder, header, get_msg_cb, helper);
419 g_object_unref (G_OBJECT (folder));
421 g_printerr ("modest: no folder for header\n");
424 g_object_unref (G_OBJECT (header));
428 modest_ui_actions_on_reply (GtkWidget *widget, ModestWindow *win)
430 g_return_if_fail (MODEST_IS_WINDOW(win));
432 reply_forward (widget, ACTION_REPLY, win);
436 modest_ui_actions_on_forward (GtkWidget *widget, ModestWindow *win)
438 g_return_if_fail (MODEST_IS_WINDOW(win));
440 reply_forward (widget, ACTION_FORWARD, win);
444 modest_ui_actions_on_reply_all (GtkWidget *widget,ModestWindow *win)
446 g_return_if_fail (MODEST_IS_WINDOW(win));
448 reply_forward (widget, ACTION_REPLY_TO_ALL, win);
452 modest_ui_actions_on_next (GtkWidget *widget,
453 ModestMainWindow *main_window)
455 GtkWidget *header_view;
456 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
458 header_view = modest_main_window_get_child_widget (main_window,
459 MODEST_WIDGET_TYPE_HEADER_VIEW);
463 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
467 modest_ui_actions_on_prev (GtkWidget *widget,
468 ModestMainWindow *main_window)
470 GtkWidget *header_view;
471 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
473 header_view = modest_main_window_get_child_widget (main_window,
474 MODEST_WIDGET_TYPE_HEADER_VIEW);
478 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
483 modest_ui_actions_on_send_receive (GtkWidget *widget, ModestWindow *win)
486 TnyAccount *tny_account;
487 ModestTnySendQueue *send_queue;
490 g_strdup(modest_window_get_active_account(MODEST_WINDOW(win)));
492 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
494 g_printerr ("modest: cannot get account\n");
499 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
501 TNY_ACCOUNT_TYPE_TRANSPORT);
503 g_printerr ("modest: cannot get tny transport account\n");
507 send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account));
508 modest_tny_send_queue_flush (send_queue);
510 g_object_unref (G_OBJECT(send_queue));
511 g_object_unref (G_OBJECT(tny_account));
517 modest_ui_actions_toggle_view (GtkWidget *widget, ModestMainWindow *main_window)
520 GtkWidget *header_view;
522 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
524 header_view = modest_main_window_get_child_widget (main_window,
525 MODEST_WIDGET_TYPE_HEADER_VIEW);
529 conf = modest_runtime_get_conf ();
531 /* what is saved/restored is depending on the style; thus; we save with
532 * old style, then update the style, and restore for this new style*/
533 modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view");
535 if (modest_header_view_get_style
536 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
537 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
538 MODEST_HEADER_VIEW_STYLE_TWOLINES);
540 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
541 MODEST_HEADER_VIEW_STYLE_DETAILS);
543 modest_widget_memory_restore (conf, G_OBJECT(header_view),
550 * Marks a message as read and passes it to the msg preview widget
553 read_msg_func (gpointer data, gpointer user_data)
557 GetMsgAsyncHelper *helper;
558 TnyHeaderFlags header_flags;
559 GtkWidget *msg_preview;
561 msg = TNY_MSG (data);
562 helper = (GetMsgAsyncHelper *) user_data;
564 msg_preview = modest_main_window_get_child_widget (helper->main_window,
565 MODEST_WIDGET_TYPE_MSG_PREVIEW);
569 /* mark message as seen; _set_flags crashes, bug in tinymail? */
570 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
571 header_flags = tny_header_get_flags (header);
572 tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
573 g_object_unref (G_OBJECT (header));
575 /* Set message on msg view */
576 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg);
580 * This function is a generic handler for the tny_folder_get_msg_async
581 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
582 * contains a user provided function that is called inside this
583 * method. This will allow us to use this callback in many different
584 * places. This callback performs the common actions for the
585 * get_msg_async call, more specific actions will be done by the user
589 get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
591 GetMsgAsyncHelper *helper;
593 helper = (GetMsgAsyncHelper *) user_data;
595 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
596 GtkWidget *header_view =
597 modest_main_window_get_child_widget(helper->main_window,
598 MODEST_WIDGET_TYPE_HEADER_VIEW);
600 modest_ui_actions_on_item_not_found (MODEST_HEADER_VIEW(header_view),
601 MODEST_ITEM_TYPE_MESSAGE,
602 MODEST_WINDOW(helper->main_window));
606 /* Call user function */
607 helper->func (msg, user_data);
609 /* Process next element (if exists) */
610 tny_iterator_next (helper->iter);
611 if (tny_iterator_is_done (helper->iter)) {
613 headers = tny_iterator_get_list (helper->iter);
615 g_object_unref (G_OBJECT (headers));
616 g_object_unref (G_OBJECT (helper->iter));
617 g_slice_free (GetMsgAsyncHelper, helper);
620 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
621 tny_folder_get_msg_async (folder, header,
623 g_object_unref (G_OBJECT(header));
628 modest_ui_actions_on_header_selected (ModestHeaderView *folder_view,
630 ModestMainWindow *main_window)
632 GtkWidget *msg_preview;
634 GetMsgAsyncHelper *helper;
637 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
639 msg_preview = modest_main_window_get_child_widget(main_window,
640 MODEST_WIDGET_TYPE_MSG_PREVIEW);
644 /* when there's no header, clear the msgview */
646 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
650 folder = tny_header_get_folder (TNY_HEADER(header));
653 list = tny_simple_list_new ();
654 tny_list_prepend (list, G_OBJECT (header));
656 /* Fill helper data */
657 helper = g_slice_new0 (GetMsgAsyncHelper);
658 helper->main_window = main_window;
659 helper->iter = tny_list_create_iterator (list);
660 helper->func = read_msg_func;
662 tny_folder_get_msg_async (TNY_FOLDER(folder),
667 g_object_unref (G_OBJECT (folder));
673 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
674 ModestMainWindow *main_window)
677 TnyFolder *folder = NULL;
679 gchar *account = NULL;
681 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
686 folder = tny_header_get_folder (header);
688 g_printerr ("modest: cannot get folder for header\n");
692 /* FIXME: make async?; check error */
693 msg = tny_folder_get_msg (folder, header, NULL);
695 g_printerr ("modest: cannot get msg for header\n");
699 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
701 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
703 win = modest_msg_view_window_new (msg, account);
704 gtk_window_set_transient_for (GTK_WINDOW (win),
705 GTK_WINDOW (main_window));
707 gtk_widget_show_all (GTK_WIDGET(win));
713 g_object_unref (G_OBJECT (folder));
715 g_object_unref (G_OBJECT (folder));
723 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
726 ModestMainWindow *main_window)
728 // GtkLabel *folder_info_label;
731 GtkWidget *header_view;
733 /* folder_info_label = */
734 /* GTK_LABEL (modest_widget_factory_get_folder_info_label */
735 /* (modest_runtime_get_widget_factory())); */
738 /* gtk_label_set_label (GTK_LABEL(folder_info_label), ""); */
742 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
744 header_view = modest_main_window_get_child_widget(main_window,
745 MODEST_WIDGET_TYPE_HEADER_VIEW);
749 conf = modest_runtime_get_conf ();
751 if (!selected) { /* the folder was unselected; save it's settings */
752 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
753 gtk_window_set_title (GTK_WINDOW(main_window), "Modest");
754 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
755 } else { /* the folder was selected */
756 if (folder) { /* folder may be NULL */
760 num = tny_folder_get_all_count (folder);
761 unread = tny_folder_get_unread_count (folder);
763 title = g_strdup_printf ("Modest: %s",
764 tny_folder_get_name (folder));
766 gtk_window_set_title (GTK_WINDOW(main_window), title);
769 txt = g_strdup_printf (_("%d %s, %d unread"),
770 num, num==1 ? _("item") : _("items"), unread);
771 //gtk_label_set_label (GTK_LABEL(folder_info_label), txt);
774 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), folder);
775 modest_widget_memory_restore (conf, G_OBJECT(header_view),
781 /****************************************************/
783 * below some stuff to clearup statusbar messages after 1,5 seconds....
786 progress_bar_clean (GtkWidget *bar)
788 if (GTK_IS_PROGRESS_BAR(bar)) {
789 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(bar), "");
790 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(bar), 1.0);
796 statusbar_clean (GtkWidget *bar)
798 if (GTK_IS_STATUSBAR(bar))
799 gtk_statusbar_push (GTK_STATUSBAR(bar), 0, "");
805 statusbar_push (ModestMainWindow *main_window, guint context_id, const gchar *msg)
810 GtkWidget *progress_bar, *status_bar;
812 progress_bar = modest_main_window_get_child_widget (main_window,
813 MODEST_WIDGET_TYPE_PROGRESS_BAR);
814 status_bar = modest_main_window_get_child_widget (main_window,
815 MODEST_WIDGET_TYPE_STATUS_BAR);
817 gtk_widget_show (progress_bar);
818 g_timeout_add (3000, (GSourceFunc)progress_bar_clean, progress_bar);
822 gtk_widget_show (status_bar);
823 gtk_statusbar_push (GTK_STATUSBAR(status_bar), 0, msg);
824 g_timeout_add (1500, (GSourceFunc)statusbar_clean, status_bar);
828 /****************************************************************************/
831 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
838 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
840 if (g_main_depth > 0)
841 gdk_threads_enter ();
842 online = tny_device_is_online (modest_runtime_get_device());
845 /* already online -- the item is simply not there... */
846 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
850 _("The %s you selected cannot be found"),
852 gtk_dialog_run (GTK_DIALOG(dialog));
854 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
862 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
863 "Do you want to get online?"), item);
864 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
865 gtk_label_new (txt), FALSE, FALSE, 0);
866 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
869 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
870 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
871 tny_device_force_online (modest_runtime_get_device());
874 gtk_widget_destroy (dialog);
875 if (g_main_depth > 0)
876 gdk_threads_leave ();
882 modest_ui_actions_on_header_status_update (ModestHeaderView *header_view,
883 const gchar *msg, gint num,
884 gint total, ModestMainWindow *main_window)
887 GtkWidget *progress_bar;
889 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
891 progress_bar = modest_main_window_get_child_widget (main_window,
892 MODEST_WIDGET_TYPE_PROGRESS_BAR);
897 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress_bar),
898 (gdouble)num/(gdouble)total);
900 gtk_progress_bar_pulse (GTK_PROGRESS_BAR(progress_bar));
902 txt = g_strdup_printf (_("Downloading %d of %d"), num, total);
903 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(progress_bar), txt);
906 statusbar_push (main_window, 0, msg);
911 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
914 g_message (__FUNCTION__);
919 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
922 g_message (__FUNCTION__);
926 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, int index,
929 g_message (__FUNCTION__);
934 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
936 TnyTransportAccount *transport_account;
937 ModestMailOperation *mail_operation;
939 gchar *account_name, *from;
940 ModestAccountMgr *account_mgr;
942 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
944 data = modest_msg_edit_window_get_msg_data (edit_window);
946 /* FIXME: Code added just for testing. The final version will
947 use the send queue provided by tinymail and some
949 account_mgr = modest_runtime_get_account_mgr();
950 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
952 account_name = modest_account_mgr_get_default_account (account_mgr);
954 g_printerr ("modest: no account found\n");
955 modest_msg_edit_window_free_msg_data (edit_window, data);
959 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
960 (modest_runtime_get_account_store(),
962 TNY_ACCOUNT_TYPE_TRANSPORT));
963 if (!transport_account) {
964 g_printerr ("modest: no transport account found for '%s'\n", account_name);
965 g_free (account_name);
966 modest_msg_edit_window_free_msg_data (edit_window, data);
969 from = modest_account_mgr_get_from_string (account_mgr, account_name);
971 mail_operation = modest_mail_operation_new ();
972 modest_mail_operation_send_new_mail (mail_operation,
983 g_free (account_name);
984 g_object_unref (G_OBJECT (mail_operation));
985 g_object_unref (G_OBJECT (transport_account));
987 modest_msg_edit_window_free_msg_data (edit_window, data);
989 /* Save settings and close the window */
990 /* save_settings (edit_window) */
991 gtk_widget_destroy (GTK_WIDGET (edit_window));
995 * Shows a dialog with an entry that asks for some text. The returned
996 * value must be freed by the caller. The dialog window title will be
1000 ask_for_folder_name (GtkWindow *parent_window,
1003 GtkWidget *dialog, *entry;
1004 gchar *folder_name = NULL;
1006 /* Ask for folder name */
1007 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1011 GTK_RESPONSE_REJECT,
1013 GTK_RESPONSE_ACCEPT,
1015 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1016 gtk_label_new(title),
1019 entry = gtk_entry_new_with_max_length (40);
1020 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1024 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1026 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1027 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1029 gtk_widget_destroy (dialog);
1035 modest_ui_actions_on_new_folder (GtkWidget *widget, ModestMainWindow *main_window)
1037 TnyFolder *parent_folder;
1038 GtkWidget *folder_view;
1040 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1042 folder_view = modest_main_window_get_child_widget (main_window,
1043 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1047 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1049 if (parent_folder) {
1052 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1053 _("Please enter a name for the new folder"));
1055 if (folder_name != NULL && strlen (folder_name) > 0) {
1056 TnyFolder *new_folder;
1057 ModestMailOperation *mail_op;
1059 mail_op = modest_mail_operation_new ();
1060 new_folder = modest_mail_operation_create_folder (mail_op,
1061 TNY_FOLDER_STORE (parent_folder),
1062 (const gchar *) folder_name);
1064 /* TODO: tinymail should do this.
1066 modest_folder_view_add_subfolder (MODEST_FOLDER_VIEW(folder_view),
1069 /* Free new folder */
1070 g_object_unref (new_folder);
1072 g_object_unref (mail_op);
1074 g_object_unref (parent_folder);
1079 modest_ui_actions_on_rename_folder (GtkWidget *widget,
1080 ModestMainWindow *main_window)
1083 GtkWidget *folder_view;
1085 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1087 folder_view = modest_main_window_get_child_widget (main_window,
1088 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1092 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1096 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1097 _("Please enter a new name for the folder"));
1099 if (folder_name != NULL && strlen (folder_name) > 0) {
1100 ModestMailOperation *mail_op;
1101 const GError *error;
1103 mail_op = modest_mail_operation_new ();
1104 modest_mail_operation_rename_folder (mail_op,
1106 (const gchar *) folder_name);
1108 error = modest_mail_operation_get_error (mail_op);
1110 /* TODO: tinymail should do this.
1112 modest_folder_view_rename (MODEST_FOLDER_VIEW(folder_view));
1114 /* TODO: else ? notify error ? */
1116 g_object_unref (mail_op);
1118 g_object_unref (folder);
1123 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1126 ModestMailOperation *mail_op;
1127 GtkWidget *folder_view;
1129 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1131 folder_view = modest_main_window_get_child_widget (main_window,
1132 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1136 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1138 mail_op = modest_mail_operation_new ();
1139 modest_mail_operation_remove_folder (mail_op, folder, move_to_trash);
1140 g_object_unref (mail_op);
1144 modest_ui_actions_on_delete_folder (GtkWidget *widget,
1145 ModestMainWindow *main_window)
1147 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1149 delete_folder (main_window, FALSE);
1153 modest_ui_actions_on_move_folder_to_trash_folder (GtkWidget *widget, ModestMainWindow *main_window)
1155 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1157 delete_folder (main_window, TRUE);
1161 modest_ui_actions_on_accounts_reloaded (TnyAccountStore *store, gpointer user_data)
1164 /* ModestFolderView *folder_view; */
1166 /* folder_view = modest_widget_factory_get_folder_view (modest_runtime_get_widget_factory()); */
1167 /* modest_folder_view_update_model (folder_view, store); */
1171 modest_ui_actions_on_folder_moved (ModestFolderView *folder_view, TnyFolder *folder,
1172 TnyFolderStore *parent, gboolean *done,
1175 ModestMailOperation *mail_op;
1176 const GError *error;
1180 /* Try to move the folder */
1181 mail_op = modest_mail_operation_new ();
1182 modest_mail_operation_move_folder (mail_op, folder, parent);
1184 error = modest_mail_operation_get_error (mail_op);
1188 g_object_unref (G_OBJECT (mail_op));
1194 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1195 const gchar* account_name,
1199 ModestMainWindow *main_window)
1202 GtkWidget *dialog, *entry, *remember_pass_check;
1204 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1208 GTK_RESPONSE_REJECT,
1210 GTK_RESPONSE_ACCEPT,
1212 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1214 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1215 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1219 entry = gtk_entry_new_with_max_length (40);
1220 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1221 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1223 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1226 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1227 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1230 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1232 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1233 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1240 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1245 gtk_widget_destroy (dialog);