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;
148 g_return_if_fail (MODEST_IS_WINDOW(win));
150 header_list = get_selected_headers (win);
153 iter = tny_list_create_iterator (header_list);
156 ModestMailOperation *mail_op;
158 header = TNY_HEADER (tny_iterator_get_current (iter));
159 /* TODO: thick grain mail operation involving
160 a list of objects. Composite pattern ??? */
161 mail_op = modest_mail_operation_new ();
163 /* TODO: add confirmation dialog */
165 /* Move to trash. TODO: Still not supported */
166 modest_mail_operation_remove_msg (mail_op, header, FALSE);
168 if (modest_mail_operation_get_status (mail_op) !=
169 MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
171 error = modest_mail_operation_get_error (mail_op);
173 g_warning (error->message);
176 g_object_unref (G_OBJECT (mail_op));
177 g_object_unref (header);
178 tny_iterator_next (iter);
180 } while (!tny_iterator_is_done (iter));
186 modest_ui_actions_on_quit (GtkWidget *widget, ModestWindow *win)
188 /* FIXME: save size of main window */
189 /* save_sizes (main_window); */
190 gtk_widget_destroy (GTK_WIDGET (win));
194 modest_ui_actions_on_accounts (GtkWidget *widget, ModestWindow *win)
196 GtkWidget *account_win;
197 account_win = modest_account_view_window_new ();
200 gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW (win));
202 gtk_widget_show (account_win);
206 modest_ui_actions_on_new_msg (GtkWidget *widget, ModestWindow *win)
208 ModestWindow *msg_win;
210 TnyFolder *folder = NULL;
211 gchar *account_name = NULL;
212 gchar *from_str = NULL;
216 account_name = g_strdup(modest_window_get_active_account (win));
218 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
220 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
222 TNY_ACCOUNT_TYPE_STORE);
224 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
228 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
230 msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL);
232 g_printerr ("modest: failed to create new msg\n");
236 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
238 g_printerr ("modest: failed to find Drafts folder\n");
242 tny_folder_add_msg (folder, msg, &err);
244 g_printerr ("modest: error adding msg to Drafts folder: %s",
250 msg_win = modest_msg_edit_window_new (msg, account_name);
252 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
254 gtk_widget_show_all (GTK_WIDGET (msg_win));
257 g_free (account_name);
260 g_object_unref (G_OBJECT(account));
262 g_object_unref (G_OBJECT(msg));
264 g_object_unref (G_OBJECT(folder));
269 modest_ui_actions_on_open (GtkWidget *widget, ModestWindow *win)
271 modest_runtime_not_implemented (GTK_WINDOW(win)); /* FIXME */
277 reply_forward_func (gpointer data, gpointer user_data)
279 TnyMsg *msg, *new_msg;
280 GetMsgAsyncHelper *helper;
281 ReplyForwardHelper *rf_helper;
282 ModestWindow *msg_win;
283 ModestEditType edit_type;
286 TnyFolder *folder = NULL;
287 TnyAccount *account = NULL;
289 msg = TNY_MSG (data);
290 helper = (GetMsgAsyncHelper *) user_data;
291 rf_helper = (ReplyForwardHelper *) helper->user_data;
293 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
294 rf_helper->account_name);
295 /* Create reply mail */
296 switch (rf_helper->action) {
299 modest_mail_operation_create_reply_mail (msg, from,
300 rf_helper->reply_forward_type,
301 MODEST_MAIL_OPERATION_REPLY_MODE_SENDER);
303 case ACTION_REPLY_TO_ALL:
305 modest_mail_operation_create_reply_mail (msg, from, rf_helper->reply_forward_type,
306 MODEST_MAIL_OPERATION_REPLY_MODE_ALL);
307 edit_type = MODEST_EDIT_TYPE_REPLY;
311 modest_mail_operation_create_forward_mail (msg, from, rf_helper->reply_forward_type);
312 edit_type = MODEST_EDIT_TYPE_FORWARD;
315 g_return_if_reached ();
320 g_printerr ("modest: failed to create message\n");
324 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
325 rf_helper->account_name,
326 TNY_ACCOUNT_TYPE_STORE);
328 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
332 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
334 g_printerr ("modest: failed to find Drafts folder\n");
338 tny_folder_add_msg (folder, msg, &err);
340 g_printerr ("modest: error adding msg to Drafts folder: %s",
346 /* Show edit window */
347 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
348 gtk_widget_show_all (GTK_WIDGET (msg_win));
352 g_object_unref (G_OBJECT (new_msg));
354 g_object_unref (G_OBJECT (folder));
356 g_object_unref (G_OBJECT (account));
358 g_free (rf_helper->account_name);
359 g_slice_free (ReplyForwardHelper, rf_helper);
362 * Common code for the reply and forward actions
365 reply_forward (GtkWidget *widget, ReplyForwardAction action, ModestWindow *win)
367 TnyList *header_list;
368 guint reply_forward_type;
371 GetMsgAsyncHelper *helper;
372 ReplyForwardHelper *rf_helper;
374 g_return_if_fail (MODEST_IS_WINDOW(win));
376 header_list = get_selected_headers (win);
380 reply_forward_type = modest_conf_get_int (modest_runtime_get_conf (),
381 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
383 /* We assume that we can only select messages of the
384 same folder and that we reply all of them from the
385 same account. In fact the interface currently only
386 allows single selection */
389 rf_helper = g_slice_new0 (ReplyForwardHelper);
390 rf_helper->reply_forward_type = reply_forward_type;
391 rf_helper->action = action;
393 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
394 if (!rf_helper->account_name)
395 rf_helper->account_name =
396 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
398 helper = g_slice_new0 (GetMsgAsyncHelper);
399 helper->window = win;
400 helper->func = reply_forward_func;
401 helper->iter = tny_list_create_iterator (header_list);
402 helper->user_data = rf_helper;
404 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
406 msg = modest_msg_view_window_get_message(MODEST_MSG_VIEW_WINDOW(win));
408 g_printerr ("modest: no message found\n");
411 reply_forward_func (msg, 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));
429 modest_ui_actions_on_reply (GtkWidget *widget, ModestWindow *win)
431 g_return_if_fail (MODEST_IS_WINDOW(win));
433 reply_forward (widget, ACTION_REPLY, win);
437 modest_ui_actions_on_forward (GtkWidget *widget, ModestWindow *win)
439 g_return_if_fail (MODEST_IS_WINDOW(win));
441 reply_forward (widget, ACTION_FORWARD, win);
445 modest_ui_actions_on_reply_all (GtkWidget *widget,ModestWindow *win)
447 g_return_if_fail (MODEST_IS_WINDOW(win));
449 reply_forward (widget, ACTION_REPLY_TO_ALL, win);
453 modest_ui_actions_on_next (GtkWidget *widget,
454 ModestMainWindow *main_window)
456 GtkWidget *header_view;
457 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
459 header_view = modest_main_window_get_child_widget (main_window,
460 MODEST_WIDGET_TYPE_HEADER_VIEW);
464 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
468 modest_ui_actions_on_prev (GtkWidget *widget,
469 ModestMainWindow *main_window)
471 GtkWidget *header_view;
472 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
474 header_view = modest_main_window_get_child_widget (main_window,
475 MODEST_WIDGET_TYPE_HEADER_VIEW);
479 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
484 modest_ui_actions_on_send_receive (GtkWidget *widget, ModestWindow *win)
487 TnyAccount *tny_account;
488 ModestTnySendQueue *send_queue;
491 g_strdup(modest_window_get_active_account(MODEST_WINDOW(win)));
493 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
495 g_printerr ("modest: cannot get account\n");
500 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
502 TNY_ACCOUNT_TYPE_TRANSPORT);
504 g_printerr ("modest: cannot get tny transport account\n");
508 send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account));
509 modest_tny_send_queue_flush (send_queue);
511 g_object_unref (G_OBJECT(send_queue));
512 g_object_unref (G_OBJECT(tny_account));
518 modest_ui_actions_toggle_view (GtkWidget *widget, ModestMainWindow *main_window)
521 GtkWidget *header_view;
523 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
525 header_view = modest_main_window_get_child_widget (main_window,
526 MODEST_WIDGET_TYPE_HEADER_VIEW);
530 conf = modest_runtime_get_conf ();
532 /* what is saved/restored is depending on the style; thus; we save with
533 * old style, then update the style, and restore for this new style*/
534 modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view");
536 if (modest_header_view_get_style
537 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
538 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
539 MODEST_HEADER_VIEW_STYLE_TWOLINES);
541 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
542 MODEST_HEADER_VIEW_STYLE_DETAILS);
544 modest_widget_memory_restore (conf, G_OBJECT(header_view),
551 * Marks a message as read and passes it to the msg preview widget
554 read_msg_func (gpointer data, gpointer user_data)
558 GetMsgAsyncHelper *helper;
559 TnyHeaderFlags header_flags;
560 GtkWidget *msg_preview;
562 msg = TNY_MSG (data);
563 helper = (GetMsgAsyncHelper *) user_data;
565 msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
566 MODEST_WIDGET_TYPE_MSG_PREVIEW);
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 modest_ui_actions_on_item_not_found (NULL,
597 MODEST_ITEM_TYPE_MESSAGE,
602 /* Call user function */
603 helper->func (msg, user_data);
605 /* Process next element (if exists) */
606 tny_iterator_next (helper->iter);
607 if (tny_iterator_is_done (helper->iter)) {
609 headers = tny_iterator_get_list (helper->iter);
611 g_object_unref (G_OBJECT (headers));
612 g_object_unref (G_OBJECT (helper->iter));
613 g_slice_free (GetMsgAsyncHelper, helper);
616 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
617 tny_folder_get_msg_async (folder, header,
619 g_object_unref (G_OBJECT(header));
624 modest_ui_actions_on_header_selected (ModestHeaderView *folder_view,
626 ModestMainWindow *main_window)
628 GtkWidget *msg_preview;
630 GetMsgAsyncHelper *helper;
633 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
635 msg_preview = modest_main_window_get_child_widget(main_window,
636 MODEST_WIDGET_TYPE_MSG_PREVIEW);
640 /* when there's no header, clear the msgview */
642 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
646 folder = tny_header_get_folder (TNY_HEADER(header));
649 list = tny_simple_list_new ();
650 tny_list_prepend (list, G_OBJECT (header));
652 /* Fill helper data */
653 helper = g_slice_new0 (GetMsgAsyncHelper);
654 helper->window = MODEST_WINDOW (main_window);
655 helper->iter = tny_list_create_iterator (list);
656 helper->func = read_msg_func;
658 tny_folder_get_msg_async (TNY_FOLDER(folder),
663 g_object_unref (G_OBJECT (folder));
669 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
670 ModestMainWindow *main_window)
673 TnyFolder *folder = NULL;
675 gchar *account = NULL;
677 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
682 folder = tny_header_get_folder (header);
684 g_printerr ("modest: cannot get folder for header\n");
688 /* FIXME: make async?; check error */
689 msg = tny_folder_get_msg (folder, header, NULL);
691 g_printerr ("modest: cannot get msg for header\n");
695 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
697 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
699 win = modest_msg_view_window_new (msg, account);
700 gtk_window_set_transient_for (GTK_WINDOW (win),
701 GTK_WINDOW (main_window));
703 gtk_widget_show_all (GTK_WIDGET(win));
709 g_object_unref (G_OBJECT (folder));
711 g_object_unref (G_OBJECT (msg));
715 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
718 ModestMainWindow *main_window)
720 // GtkLabel *folder_info_label;
723 GtkWidget *header_view;
725 /* folder_info_label = */
726 /* GTK_LABEL (modest_widget_factory_get_folder_info_label */
727 /* (modest_runtime_get_widget_factory())); */
730 /* gtk_label_set_label (GTK_LABEL(folder_info_label), ""); */
734 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
736 header_view = modest_main_window_get_child_widget(main_window,
737 MODEST_WIDGET_TYPE_HEADER_VIEW);
741 conf = modest_runtime_get_conf ();
743 if (!selected) { /* the folder was unselected; save it's settings */
744 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
745 gtk_window_set_title (GTK_WINDOW(main_window), "Modest");
746 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
747 } else { /* the folder was selected */
748 if (folder) { /* folder may be NULL */
752 num = tny_folder_get_all_count (folder);
753 unread = tny_folder_get_unread_count (folder);
755 title = g_strdup_printf ("Modest: %s",
756 tny_folder_get_name (folder));
758 gtk_window_set_title (GTK_WINDOW(main_window), title);
761 txt = g_strdup_printf (_("%d %s, %d unread"),
762 num, num==1 ? _("item") : _("items"), unread);
763 //gtk_label_set_label (GTK_LABEL(folder_info_label), txt);
766 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), folder);
767 modest_widget_memory_restore (conf, G_OBJECT(header_view),
773 /****************************************************/
775 * below some stuff to clearup statusbar messages after 1,5 seconds....
778 progress_bar_clean (GtkWidget *bar)
780 if (GTK_IS_PROGRESS_BAR(bar)) {
781 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(bar), "");
782 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(bar), 1.0);
788 statusbar_clean (GtkWidget *bar)
790 if (GTK_IS_STATUSBAR(bar))
791 gtk_statusbar_push (GTK_STATUSBAR(bar), 0, "");
797 statusbar_push (ModestMainWindow *main_window, guint context_id, const gchar *msg)
802 GtkWidget *progress_bar, *status_bar;
804 progress_bar = modest_main_window_get_child_widget (main_window,
805 MODEST_WIDGET_TYPE_PROGRESS_BAR);
806 status_bar = modest_main_window_get_child_widget (main_window,
807 MODEST_WIDGET_TYPE_STATUS_BAR);
809 gtk_widget_show (progress_bar);
810 g_timeout_add (3000, (GSourceFunc)progress_bar_clean, progress_bar);
814 gtk_widget_show (status_bar);
815 gtk_statusbar_push (GTK_STATUSBAR(status_bar), 0, msg);
816 g_timeout_add (2500, (GSourceFunc)statusbar_clean, status_bar);
820 /****************************************************************************/
823 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
830 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
832 if (g_main_depth > 0)
833 gdk_threads_enter ();
834 online = tny_device_is_online (modest_runtime_get_device());
837 /* already online -- the item is simply not there... */
838 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
842 _("The %s you selected cannot be found"),
844 gtk_dialog_run (GTK_DIALOG(dialog));
846 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
854 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
855 "Do you want to get online?"), item);
856 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
857 gtk_label_new (txt), FALSE, FALSE, 0);
858 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
861 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
862 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
863 tny_device_force_online (modest_runtime_get_device());
866 gtk_widget_destroy (dialog);
867 if (g_main_depth > 0)
868 gdk_threads_leave ();
874 modest_ui_actions_on_header_status_update (ModestHeaderView *header_view,
875 const gchar *msg, gint num,
876 gint total, ModestMainWindow *main_window)
879 GtkWidget *progress_bar;
881 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
883 progress_bar = modest_main_window_get_child_widget (main_window,
884 MODEST_WIDGET_TYPE_PROGRESS_BAR);
889 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress_bar),
890 (gdouble)num/(gdouble)total);
892 gtk_progress_bar_pulse (GTK_PROGRESS_BAR(progress_bar));
894 txt = g_strdup_printf (_("Downloading %d of %d"), num, total);
895 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(progress_bar), txt);
898 statusbar_push (main_window, 0, msg);
903 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
906 g_message (__FUNCTION__);
911 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
914 g_message (__FUNCTION__);
918 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, int index,
921 g_message (__FUNCTION__);
926 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
928 TnyTransportAccount *transport_account;
929 ModestMailOperation *mail_operation;
931 gchar *account_name, *from;
932 ModestAccountMgr *account_mgr;
934 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
936 data = modest_msg_edit_window_get_msg_data (edit_window);
938 /* FIXME: Code added just for testing. The final version will
939 use the send queue provided by tinymail and some
941 account_mgr = modest_runtime_get_account_mgr();
942 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
944 account_name = modest_account_mgr_get_default_account (account_mgr);
946 g_printerr ("modest: no account found\n");
947 modest_msg_edit_window_free_msg_data (edit_window, data);
951 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
952 (modest_runtime_get_account_store(),
954 TNY_ACCOUNT_TYPE_TRANSPORT));
955 if (!transport_account) {
956 g_printerr ("modest: no transport account found for '%s'\n", account_name);
957 g_free (account_name);
958 modest_msg_edit_window_free_msg_data (edit_window, data);
961 from = modest_account_mgr_get_from_string (account_mgr, account_name);
963 mail_operation = modest_mail_operation_new ();
964 modest_mail_operation_send_new_mail (mail_operation,
975 g_free (account_name);
976 g_object_unref (G_OBJECT (mail_operation));
977 g_object_unref (G_OBJECT (transport_account));
979 modest_msg_edit_window_free_msg_data (edit_window, data);
981 /* Save settings and close the window */
982 /* save_settings (edit_window) */
983 gtk_widget_destroy (GTK_WIDGET (edit_window));
987 * Shows a dialog with an entry that asks for some text. The returned
988 * value must be freed by the caller. The dialog window title will be
992 ask_for_folder_name (GtkWindow *parent_window,
995 GtkWidget *dialog, *entry;
996 gchar *folder_name = NULL;
998 /* Ask for folder name */
999 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1003 GTK_RESPONSE_REJECT,
1005 GTK_RESPONSE_ACCEPT,
1007 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1008 gtk_label_new(title),
1011 entry = gtk_entry_new_with_max_length (40);
1012 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1016 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1018 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1019 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1021 gtk_widget_destroy (dialog);
1027 modest_ui_actions_on_new_folder (GtkWidget *widget, ModestMainWindow *main_window)
1029 TnyFolder *parent_folder;
1030 GtkWidget *folder_view;
1032 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1034 folder_view = modest_main_window_get_child_widget (main_window,
1035 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1039 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1041 if (parent_folder) {
1044 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1045 _("Please enter a name for the new folder"));
1047 if (folder_name != NULL && strlen (folder_name) > 0) {
1048 TnyFolder *new_folder;
1049 ModestMailOperation *mail_op;
1051 mail_op = modest_mail_operation_new ();
1052 new_folder = modest_mail_operation_create_folder (mail_op,
1053 TNY_FOLDER_STORE (parent_folder),
1054 (const gchar *) folder_name);
1056 g_object_unref (new_folder);
1058 const GError *error;
1059 error = modest_mail_operation_get_error (mail_op);
1061 g_warning ("Error adding a subfolder: %s\n", error->message);
1063 g_object_unref (mail_op);
1065 g_object_unref (parent_folder);
1070 modest_ui_actions_on_rename_folder (GtkWidget *widget,
1071 ModestMainWindow *main_window)
1074 GtkWidget *folder_view;
1076 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1078 folder_view = modest_main_window_get_child_widget (main_window,
1079 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1083 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1087 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1088 _("Please enter a new name for the folder"));
1090 if (folder_name != NULL && strlen (folder_name) > 0) {
1091 ModestMailOperation *mail_op;
1092 const GError *error;
1094 mail_op = modest_mail_operation_new ();
1095 modest_mail_operation_rename_folder (mail_op,
1097 (const gchar *) folder_name);
1099 error = modest_mail_operation_get_error (mail_op);
1101 /* TODO: notify error ? */
1102 g_warning ("Could not rename a folder: %s\n", error->message);
1104 g_object_unref (mail_op);
1106 g_object_unref (folder);
1111 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1114 ModestMailOperation *mail_op;
1115 GtkWidget *folder_view;
1116 const GError *error;
1118 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1120 folder_view = modest_main_window_get_child_widget (main_window,
1121 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1125 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1127 mail_op = modest_mail_operation_new ();
1128 modest_mail_operation_remove_folder (mail_op, folder, move_to_trash);
1130 error = modest_mail_operation_get_error (mail_op);
1132 g_warning ("%s\n", error->message);
1134 g_object_unref (mail_op);
1138 modest_ui_actions_on_delete_folder (GtkWidget *widget,
1139 ModestMainWindow *main_window)
1141 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1143 delete_folder (main_window, FALSE);
1147 modest_ui_actions_on_move_folder_to_trash_folder (GtkWidget *widget, ModestMainWindow *main_window)
1149 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1151 delete_folder (main_window, TRUE);
1155 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1156 const gchar* account_name,
1160 ModestMainWindow *main_window)
1163 GtkWidget *dialog, *entry, *remember_pass_check;
1165 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1169 GTK_RESPONSE_REJECT,
1171 GTK_RESPONSE_ACCEPT,
1173 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1175 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1176 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1180 entry = gtk_entry_new_with_max_length (40);
1181 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1182 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1184 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1187 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1188 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1191 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1193 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1194 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1201 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1206 gtk_widget_destroy (dialog);