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 /* mark message as seen; _set_flags crashes, bug in tinymail? */
571 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
572 header_flags = tny_header_get_flags (header);
573 tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
574 g_object_unref (G_OBJECT (header));
576 /* Set message on msg view */
577 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg);
581 * This function is a generic handler for the tny_folder_get_msg_async
582 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
583 * contains a user provided function that is called inside this
584 * method. This will allow us to use this callback in many different
585 * places. This callback performs the common actions for the
586 * get_msg_async call, more specific actions will be done by the user
590 get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
592 GetMsgAsyncHelper *helper;
594 helper = (GetMsgAsyncHelper *) user_data;
596 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
597 modest_ui_actions_on_item_not_found (NULL,
598 MODEST_ITEM_TYPE_MESSAGE,
603 /* Call user function */
604 helper->func (msg, user_data);
606 /* Process next element (if exists) */
607 tny_iterator_next (helper->iter);
608 if (tny_iterator_is_done (helper->iter)) {
610 headers = tny_iterator_get_list (helper->iter);
612 g_object_unref (G_OBJECT (headers));
613 g_object_unref (G_OBJECT (helper->iter));
614 g_slice_free (GetMsgAsyncHelper, helper);
617 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
618 tny_folder_get_msg_async (folder, header,
620 g_object_unref (G_OBJECT(header));
625 modest_ui_actions_on_header_selected (ModestHeaderView *folder_view,
627 ModestMainWindow *main_window)
629 GtkWidget *msg_preview;
631 GetMsgAsyncHelper *helper;
634 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
636 msg_preview = modest_main_window_get_child_widget(main_window,
637 MODEST_WIDGET_TYPE_MSG_PREVIEW);
641 /* when there's no header, clear the msgview */
643 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
647 folder = tny_header_get_folder (TNY_HEADER(header));
650 list = tny_simple_list_new ();
651 tny_list_prepend (list, G_OBJECT (header));
653 /* Fill helper data */
654 helper = g_slice_new0 (GetMsgAsyncHelper);
655 helper->window = MODEST_WINDOW (main_window);
656 helper->iter = tny_list_create_iterator (list);
657 helper->func = read_msg_func;
659 tny_folder_get_msg_async (TNY_FOLDER(folder),
664 g_object_unref (G_OBJECT (folder));
670 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
671 ModestMainWindow *main_window)
674 TnyFolder *folder = NULL;
676 gchar *account = NULL;
678 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
683 folder = tny_header_get_folder (header);
685 g_printerr ("modest: cannot get folder for header\n");
689 /* FIXME: make async?; check error */
690 msg = tny_folder_get_msg (folder, header, NULL);
692 g_printerr ("modest: cannot get msg for header\n");
696 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
698 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
700 win = modest_msg_view_window_new (msg, account);
701 gtk_window_set_transient_for (GTK_WINDOW (win),
702 GTK_WINDOW (main_window));
704 gtk_widget_show_all (GTK_WIDGET(win));
710 g_object_unref (G_OBJECT (folder));
712 g_object_unref (G_OBJECT (msg));
716 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
719 ModestMainWindow *main_window)
721 // GtkLabel *folder_info_label;
724 GtkWidget *header_view;
726 /* folder_info_label = */
727 /* GTK_LABEL (modest_widget_factory_get_folder_info_label */
728 /* (modest_runtime_get_widget_factory())); */
731 /* gtk_label_set_label (GTK_LABEL(folder_info_label), ""); */
735 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
737 header_view = modest_main_window_get_child_widget(main_window,
738 MODEST_WIDGET_TYPE_HEADER_VIEW);
742 conf = modest_runtime_get_conf ();
744 if (!selected) { /* the folder was unselected; save it's settings */
745 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
746 gtk_window_set_title (GTK_WINDOW(main_window), "Modest");
747 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
748 } else { /* the folder was selected */
749 if (folder) { /* folder may be NULL */
753 num = tny_folder_get_all_count (folder);
754 unread = tny_folder_get_unread_count (folder);
756 title = g_strdup_printf ("Modest: %s",
757 tny_folder_get_name (folder));
759 gtk_window_set_title (GTK_WINDOW(main_window), title);
762 txt = g_strdup_printf (_("%d %s, %d unread"),
763 num, num==1 ? _("item") : _("items"), unread);
764 //gtk_label_set_label (GTK_LABEL(folder_info_label), txt);
767 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), folder);
768 modest_widget_memory_restore (conf, G_OBJECT(header_view),
774 /****************************************************/
776 * below some stuff to clearup statusbar messages after 1,5 seconds....
779 progress_bar_clean (GtkWidget *bar)
781 if (GTK_IS_PROGRESS_BAR(bar)) {
782 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(bar), "");
783 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(bar), 1.0);
789 statusbar_clean (GtkWidget *bar)
791 if (GTK_IS_STATUSBAR(bar))
792 gtk_statusbar_push (GTK_STATUSBAR(bar), 0, "");
798 statusbar_push (ModestMainWindow *main_window, guint context_id, const gchar *msg)
803 GtkWidget *progress_bar, *status_bar;
805 progress_bar = modest_main_window_get_child_widget (main_window,
806 MODEST_WIDGET_TYPE_PROGRESS_BAR);
807 status_bar = modest_main_window_get_child_widget (main_window,
808 MODEST_WIDGET_TYPE_STATUS_BAR);
810 gtk_widget_show (progress_bar);
811 g_timeout_add (3000, (GSourceFunc)progress_bar_clean, progress_bar);
815 gtk_widget_show (status_bar);
816 gtk_statusbar_push (GTK_STATUSBAR(status_bar), 0, msg);
817 g_timeout_add (2500, (GSourceFunc)statusbar_clean, status_bar);
821 /****************************************************************************/
824 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
831 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
833 if (g_main_depth > 0)
834 gdk_threads_enter ();
835 online = tny_device_is_online (modest_runtime_get_device());
838 /* already online -- the item is simply not there... */
839 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
843 _("The %s you selected cannot be found"),
845 gtk_dialog_run (GTK_DIALOG(dialog));
847 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
855 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
856 "Do you want to get online?"), item);
857 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
858 gtk_label_new (txt), FALSE, FALSE, 0);
859 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
862 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
863 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
864 tny_device_force_online (modest_runtime_get_device());
867 gtk_widget_destroy (dialog);
868 if (g_main_depth > 0)
869 gdk_threads_leave ();
875 modest_ui_actions_on_header_status_update (ModestHeaderView *header_view,
876 const gchar *msg, gint num,
877 gint total, ModestMainWindow *main_window)
880 GtkWidget *progress_bar;
882 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
884 progress_bar = modest_main_window_get_child_widget (main_window,
885 MODEST_WIDGET_TYPE_PROGRESS_BAR);
890 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress_bar),
891 (gdouble)num/(gdouble)total);
893 gtk_progress_bar_pulse (GTK_PROGRESS_BAR(progress_bar));
895 txt = g_strdup_printf (_("Downloading %d of %d"), num, total);
896 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(progress_bar), txt);
899 statusbar_push (main_window, 0, msg);
904 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
907 g_message (__FUNCTION__);
912 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
915 g_message (__FUNCTION__);
919 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, int index,
922 g_message (__FUNCTION__);
927 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
929 TnyTransportAccount *transport_account;
930 ModestMailOperation *mail_operation;
932 gchar *account_name, *from;
933 ModestAccountMgr *account_mgr;
935 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
937 data = modest_msg_edit_window_get_msg_data (edit_window);
939 /* FIXME: Code added just for testing. The final version will
940 use the send queue provided by tinymail and some
942 account_mgr = modest_runtime_get_account_mgr();
943 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
945 account_name = modest_account_mgr_get_default_account (account_mgr);
947 g_printerr ("modest: no account found\n");
948 modest_msg_edit_window_free_msg_data (edit_window, data);
952 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
953 (modest_runtime_get_account_store(),
955 TNY_ACCOUNT_TYPE_TRANSPORT));
956 if (!transport_account) {
957 g_printerr ("modest: no transport account found for '%s'\n", account_name);
958 g_free (account_name);
959 modest_msg_edit_window_free_msg_data (edit_window, data);
962 from = modest_account_mgr_get_from_string (account_mgr, account_name);
964 mail_operation = modest_mail_operation_new ();
965 modest_mail_operation_send_new_mail (mail_operation,
976 g_free (account_name);
977 g_object_unref (G_OBJECT (mail_operation));
978 g_object_unref (G_OBJECT (transport_account));
980 modest_msg_edit_window_free_msg_data (edit_window, data);
982 /* Save settings and close the window */
983 /* save_settings (edit_window) */
984 gtk_widget_destroy (GTK_WIDGET (edit_window));
988 * Shows a dialog with an entry that asks for some text. The returned
989 * value must be freed by the caller. The dialog window title will be
993 ask_for_folder_name (GtkWindow *parent_window,
996 GtkWidget *dialog, *entry;
997 gchar *folder_name = NULL;
999 /* Ask for folder name */
1000 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1004 GTK_RESPONSE_REJECT,
1006 GTK_RESPONSE_ACCEPT,
1008 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1009 gtk_label_new(title),
1012 entry = gtk_entry_new_with_max_length (40);
1013 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1017 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1019 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1020 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1022 gtk_widget_destroy (dialog);
1028 modest_ui_actions_on_new_folder (GtkWidget *widget, ModestMainWindow *main_window)
1030 TnyFolder *parent_folder;
1031 GtkWidget *folder_view;
1033 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1035 folder_view = modest_main_window_get_child_widget (main_window,
1036 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1040 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1042 if (parent_folder) {
1045 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1046 _("Please enter a name for the new folder"));
1048 if (folder_name != NULL && strlen (folder_name) > 0) {
1049 TnyFolder *new_folder;
1050 ModestMailOperation *mail_op;
1052 mail_op = modest_mail_operation_new ();
1053 new_folder = modest_mail_operation_create_folder (mail_op,
1054 TNY_FOLDER_STORE (parent_folder),
1055 (const gchar *) folder_name);
1057 g_object_unref (new_folder);
1059 const GError *error;
1060 error = modest_mail_operation_get_error (mail_op);
1062 g_warning ("Error adding a subfolder: %s\n", error->message);
1064 g_object_unref (mail_op);
1066 g_object_unref (parent_folder);
1071 modest_ui_actions_on_rename_folder (GtkWidget *widget,
1072 ModestMainWindow *main_window)
1075 GtkWidget *folder_view;
1077 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1079 folder_view = modest_main_window_get_child_widget (main_window,
1080 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1084 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1088 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1089 _("Please enter a new name for the folder"));
1091 if (folder_name != NULL && strlen (folder_name) > 0) {
1092 ModestMailOperation *mail_op;
1093 const GError *error;
1095 mail_op = modest_mail_operation_new ();
1096 modest_mail_operation_rename_folder (mail_op,
1098 (const gchar *) folder_name);
1100 error = modest_mail_operation_get_error (mail_op);
1102 /* TODO: notify error ? */
1103 g_warning ("Could not rename a folder: %s\n", error->message);
1105 g_object_unref (mail_op);
1107 g_object_unref (folder);
1112 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1115 ModestMailOperation *mail_op;
1116 GtkWidget *folder_view;
1117 const GError *error;
1119 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1121 folder_view = modest_main_window_get_child_widget (main_window,
1122 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1126 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1128 mail_op = modest_mail_operation_new ();
1129 modest_mail_operation_remove_folder (mail_op, folder, move_to_trash);
1131 error = modest_mail_operation_get_error (mail_op);
1133 g_warning ("%s\n", error->message);
1135 g_object_unref (mail_op);
1139 modest_ui_actions_on_delete_folder (GtkWidget *widget,
1140 ModestMainWindow *main_window)
1142 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1144 delete_folder (main_window, FALSE);
1148 modest_ui_actions_on_move_folder_to_trash_folder (GtkWidget *widget, ModestMainWindow *main_window)
1150 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1152 delete_folder (main_window, TRUE);
1156 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1157 const gchar* account_name,
1161 ModestMainWindow *main_window)
1164 GtkWidget *dialog, *entry, *remember_pass_check;
1166 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1170 GTK_RESPONSE_REJECT,
1172 GTK_RESPONSE_ACCEPT,
1174 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1176 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1177 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1181 entry = gtk_entry_new_with_max_length (40);
1182 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1183 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1185 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1188 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1189 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1192 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1194 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1195 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1202 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1207 gtk_widget_destroy (dialog);