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)
279 modest_runtime_not_implemented (GTK_WINDOW(win)); /* FIXME */
285 reply_forward_func (gpointer data, gpointer user_data)
287 TnyMsg *msg, *new_msg;
288 GetMsgAsyncHelper *helper;
289 ReplyForwardHelper *rf_helper;
290 ModestWindow *msg_win;
291 ModestEditType edit_type;
294 TnyFolder *folder = NULL;
295 TnyAccount *account = NULL;
297 msg = TNY_MSG (data);
298 helper = (GetMsgAsyncHelper *) user_data;
299 rf_helper = (ReplyForwardHelper *) helper->user_data;
301 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
302 rf_helper->account_name);
303 /* Create reply mail */
304 switch (rf_helper->action) {
307 modest_mail_operation_create_reply_mail (msg, from,
308 rf_helper->reply_forward_type,
309 MODEST_MAIL_OPERATION_REPLY_MODE_SENDER);
311 case ACTION_REPLY_TO_ALL:
313 modest_mail_operation_create_reply_mail (msg, from, rf_helper->reply_forward_type,
314 MODEST_MAIL_OPERATION_REPLY_MODE_ALL);
315 edit_type = MODEST_EDIT_TYPE_REPLY;
319 modest_mail_operation_create_forward_mail (msg, from, rf_helper->reply_forward_type);
320 edit_type = MODEST_EDIT_TYPE_FORWARD;
323 g_return_if_reached ();
328 g_printerr ("modest: failed to create message\n");
332 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
333 rf_helper->account_name,
334 TNY_ACCOUNT_TYPE_STORE);
336 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
340 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
342 g_printerr ("modest: failed to find Drafts folder\n");
346 tny_folder_add_msg (folder, msg, &err);
348 g_printerr ("modest: error adding msg to Drafts folder: %s",
354 /* Show edit window */
355 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
356 gtk_widget_show_all (GTK_WIDGET (msg_win));
360 g_object_unref (G_OBJECT (new_msg));
362 g_object_unref (G_OBJECT (folder));
364 g_object_unref (G_OBJECT (account));
366 g_free (rf_helper->account_name);
367 g_slice_free (ReplyForwardHelper, rf_helper);
370 * Common code for the reply and forward actions
373 reply_forward (GtkWidget *widget, ReplyForwardAction action, ModestWindow *win)
375 TnyList *header_list;
376 guint reply_forward_type;
379 GetMsgAsyncHelper *helper;
380 ReplyForwardHelper *rf_helper;
382 g_return_if_fail (MODEST_IS_WINDOW(win));
384 header_list = get_selected_headers (win);
388 reply_forward_type = modest_conf_get_int (modest_runtime_get_conf (),
389 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
391 /* We assume that we can only select messages of the
392 same folder and that we reply all of them from the
393 same account. In fact the interface currently only
394 allows single selection */
397 rf_helper = g_slice_new0 (ReplyForwardHelper);
398 rf_helper->reply_forward_type = reply_forward_type;
399 rf_helper->action = action;
401 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
402 if (!rf_helper->account_name)
403 rf_helper->account_name =
404 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
406 helper = g_slice_new0 (GetMsgAsyncHelper);
407 helper->window = win;
408 helper->func = reply_forward_func;
409 helper->iter = tny_list_create_iterator (header_list);
410 helper->user_data = rf_helper;
412 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
414 msg = modest_msg_view_window_get_message(MODEST_MSG_VIEW_WINDOW(win));
416 g_printerr ("modest: no message found\n");
419 reply_forward_func (msg, helper);
421 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
422 folder = tny_header_get_folder (header);
424 /* The callback will call it per each header */
425 tny_folder_get_msg_async (folder, header, get_msg_cb, helper);
426 g_object_unref (G_OBJECT (folder));
428 g_printerr ("modest: no folder for header\n");
431 g_object_unref (G_OBJECT (header));
437 modest_ui_actions_on_reply (GtkWidget *widget, ModestWindow *win)
439 g_return_if_fail (MODEST_IS_WINDOW(win));
441 reply_forward (widget, ACTION_REPLY, win);
445 modest_ui_actions_on_forward (GtkWidget *widget, ModestWindow *win)
447 g_return_if_fail (MODEST_IS_WINDOW(win));
449 reply_forward (widget, ACTION_FORWARD, win);
453 modest_ui_actions_on_reply_all (GtkWidget *widget,ModestWindow *win)
455 g_return_if_fail (MODEST_IS_WINDOW(win));
457 reply_forward (widget, ACTION_REPLY_TO_ALL, win);
461 modest_ui_actions_on_next (GtkWidget *widget,
462 ModestMainWindow *main_window)
464 GtkWidget *header_view;
465 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
467 header_view = modest_main_window_get_child_widget (main_window,
468 MODEST_WIDGET_TYPE_HEADER_VIEW);
472 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
476 modest_ui_actions_on_prev (GtkWidget *widget,
477 ModestMainWindow *main_window)
479 GtkWidget *header_view;
480 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
482 header_view = modest_main_window_get_child_widget (main_window,
483 MODEST_WIDGET_TYPE_HEADER_VIEW);
487 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
492 modest_ui_actions_on_send_receive (GtkWidget *widget, ModestWindow *win)
495 TnyAccount *tny_account;
496 ModestTnySendQueue *send_queue;
499 g_strdup(modest_window_get_active_account(MODEST_WINDOW(win)));
501 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
503 g_printerr ("modest: cannot get account\n");
508 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
510 TNY_ACCOUNT_TYPE_TRANSPORT);
512 g_printerr ("modest: cannot get tny transport account\n");
516 send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account));
517 modest_tny_send_queue_flush (send_queue);
519 g_object_unref (G_OBJECT(send_queue));
520 g_object_unref (G_OBJECT(tny_account));
526 modest_ui_actions_toggle_view (GtkWidget *widget, ModestMainWindow *main_window)
529 GtkWidget *header_view;
531 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
533 header_view = modest_main_window_get_child_widget (main_window,
534 MODEST_WIDGET_TYPE_HEADER_VIEW);
538 conf = modest_runtime_get_conf ();
540 /* what is saved/restored is depending on the style; thus; we save with
541 * old style, then update the style, and restore for this new style*/
542 modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view");
544 if (modest_header_view_get_style
545 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
546 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
547 MODEST_HEADER_VIEW_STYLE_TWOLINES);
549 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
550 MODEST_HEADER_VIEW_STYLE_DETAILS);
552 modest_widget_memory_restore (conf, G_OBJECT(header_view),
559 * Marks a message as read and passes it to the msg preview widget
562 read_msg_func (gpointer data, gpointer user_data)
566 GetMsgAsyncHelper *helper;
567 TnyHeaderFlags header_flags;
568 GtkWidget *msg_preview;
570 msg = TNY_MSG (data);
571 helper = (GetMsgAsyncHelper *) user_data;
573 msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
574 MODEST_WIDGET_TYPE_MSG_PREVIEW);
578 /* mark message as seen; _set_flags crashes, bug in tinymail? */
579 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
580 header_flags = tny_header_get_flags (header);
581 tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
582 g_object_unref (G_OBJECT (header));
584 /* Set message on msg view */
585 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg);
589 * This function is a generic handler for the tny_folder_get_msg_async
590 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
591 * contains a user provided function that is called inside this
592 * method. This will allow us to use this callback in many different
593 * places. This callback performs the common actions for the
594 * get_msg_async call, more specific actions will be done by the user
598 get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
600 GetMsgAsyncHelper *helper;
602 helper = (GetMsgAsyncHelper *) user_data;
604 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
605 modest_ui_actions_on_item_not_found (NULL,
606 MODEST_ITEM_TYPE_MESSAGE,
611 /* Call user function */
612 helper->func (msg, user_data);
614 /* Process next element (if exists) */
615 tny_iterator_next (helper->iter);
616 if (tny_iterator_is_done (helper->iter)) {
618 headers = tny_iterator_get_list (helper->iter);
620 g_object_unref (G_OBJECT (headers));
621 g_object_unref (G_OBJECT (helper->iter));
622 g_slice_free (GetMsgAsyncHelper, helper);
625 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
626 tny_folder_get_msg_async (folder, header,
628 g_object_unref (G_OBJECT(header));
633 modest_ui_actions_on_header_selected (ModestHeaderView *folder_view,
635 ModestMainWindow *main_window)
637 GtkWidget *msg_preview;
639 GetMsgAsyncHelper *helper;
642 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
644 msg_preview = modest_main_window_get_child_widget(main_window,
645 MODEST_WIDGET_TYPE_MSG_PREVIEW);
649 /* when there's no header, clear the msgview */
651 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
655 folder = tny_header_get_folder (TNY_HEADER(header));
658 list = tny_simple_list_new ();
659 tny_list_prepend (list, G_OBJECT (header));
661 /* Fill helper data */
662 helper = g_slice_new0 (GetMsgAsyncHelper);
663 helper->window = MODEST_WINDOW (main_window);
664 helper->iter = tny_list_create_iterator (list);
665 helper->func = read_msg_func;
667 tny_folder_get_msg_async (TNY_FOLDER(folder),
672 g_object_unref (G_OBJECT (folder));
678 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
679 ModestMainWindow *main_window)
682 TnyFolder *folder = NULL;
684 gchar *account = NULL;
686 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
691 folder = tny_header_get_folder (header);
693 g_printerr ("modest: cannot get folder for header\n");
697 /* FIXME: make async?; check error */
698 msg = tny_folder_get_msg (folder, header, NULL);
700 g_printerr ("modest: cannot get msg for header\n");
704 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
706 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
708 win = modest_msg_view_window_new (msg, account);
709 gtk_window_set_transient_for (GTK_WINDOW (win),
710 GTK_WINDOW (main_window));
712 gtk_widget_show_all (GTK_WIDGET(win));
718 g_object_unref (G_OBJECT (folder));
720 g_object_unref (G_OBJECT (msg));
724 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
727 ModestMainWindow *main_window)
729 // GtkLabel *folder_info_label;
732 GtkWidget *header_view;
734 /* folder_info_label = */
735 /* GTK_LABEL (modest_widget_factory_get_folder_info_label */
736 /* (modest_runtime_get_widget_factory())); */
739 /* gtk_label_set_label (GTK_LABEL(folder_info_label), ""); */
743 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
745 header_view = modest_main_window_get_child_widget(main_window,
746 MODEST_WIDGET_TYPE_HEADER_VIEW);
750 conf = modest_runtime_get_conf ();
752 if (!selected) { /* the folder was unselected; save it's settings */
753 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
754 gtk_window_set_title (GTK_WINDOW(main_window), "Modest");
755 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
756 } else { /* the folder was selected */
757 if (folder) { /* folder may be NULL */
761 num = tny_folder_get_all_count (folder);
762 unread = tny_folder_get_unread_count (folder);
764 title = g_strdup_printf ("Modest: %s",
765 tny_folder_get_name (folder));
767 gtk_window_set_title (GTK_WINDOW(main_window), title);
770 txt = g_strdup_printf (_("%d %s, %d unread"),
771 num, num==1 ? _("item") : _("items"), unread);
772 //gtk_label_set_label (GTK_LABEL(folder_info_label), txt);
775 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), folder);
776 modest_widget_memory_restore (conf, G_OBJECT(header_view),
782 /****************************************************/
784 * below some stuff to clearup statusbar messages after 1,5 seconds....
787 progress_bar_clean (GtkWidget *bar)
789 if (GTK_IS_PROGRESS_BAR(bar)) {
790 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(bar), "");
791 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(bar), 1.0);
797 statusbar_clean (GtkWidget *bar)
799 if (GTK_IS_STATUSBAR(bar))
800 gtk_statusbar_push (GTK_STATUSBAR(bar), 0, "");
806 statusbar_push (ModestMainWindow *main_window, guint context_id, const gchar *msg)
811 GtkWidget *progress_bar, *status_bar;
813 progress_bar = modest_main_window_get_child_widget (main_window,
814 MODEST_WIDGET_TYPE_PROGRESS_BAR);
815 status_bar = modest_main_window_get_child_widget (main_window,
816 MODEST_WIDGET_TYPE_STATUS_BAR);
818 gtk_widget_show (progress_bar);
819 g_timeout_add (3000, (GSourceFunc)progress_bar_clean, progress_bar);
823 gtk_widget_show (status_bar);
824 gtk_statusbar_push (GTK_STATUSBAR(status_bar), 0, msg);
825 g_timeout_add (2500, (GSourceFunc)statusbar_clean, status_bar);
829 /****************************************************************************/
832 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
839 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
841 if (g_main_depth > 0)
842 gdk_threads_enter ();
843 online = tny_device_is_online (modest_runtime_get_device());
846 /* already online -- the item is simply not there... */
847 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
851 _("The %s you selected cannot be found"),
853 gtk_dialog_run (GTK_DIALOG(dialog));
855 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
863 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
864 "Do you want to get online?"), item);
865 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
866 gtk_label_new (txt), FALSE, FALSE, 0);
867 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
870 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
871 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
872 tny_device_force_online (modest_runtime_get_device());
875 gtk_widget_destroy (dialog);
876 if (g_main_depth > 0)
877 gdk_threads_leave ();
883 modest_ui_actions_on_header_status_update (ModestHeaderView *header_view,
884 const gchar *msg, gint num,
885 gint total, ModestMainWindow *main_window)
888 GtkWidget *progress_bar;
890 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
892 progress_bar = modest_main_window_get_child_widget (main_window,
893 MODEST_WIDGET_TYPE_PROGRESS_BAR);
898 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress_bar),
899 (gdouble)num/(gdouble)total);
901 gtk_progress_bar_pulse (GTK_PROGRESS_BAR(progress_bar));
903 txt = g_strdup_printf (_("Downloading %d of %d"), num, total);
904 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(progress_bar), txt);
907 statusbar_push (main_window, 0, msg);
912 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
915 g_message (__FUNCTION__);
920 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
923 g_message (__FUNCTION__);
927 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, int index,
930 g_message (__FUNCTION__);
935 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
937 TnyTransportAccount *transport_account;
938 ModestMailOperation *mail_operation;
940 gchar *account_name, *from;
941 ModestAccountMgr *account_mgr;
943 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
945 data = modest_msg_edit_window_get_msg_data (edit_window);
947 /* FIXME: Code added just for testing. The final version will
948 use the send queue provided by tinymail and some
950 account_mgr = modest_runtime_get_account_mgr();
951 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
953 account_name = modest_account_mgr_get_default_account (account_mgr);
955 g_printerr ("modest: no account found\n");
956 modest_msg_edit_window_free_msg_data (edit_window, data);
960 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
961 (modest_runtime_get_account_store(),
963 TNY_ACCOUNT_TYPE_TRANSPORT));
964 if (!transport_account) {
965 g_printerr ("modest: no transport account found for '%s'\n", account_name);
966 g_free (account_name);
967 modest_msg_edit_window_free_msg_data (edit_window, data);
970 from = modest_account_mgr_get_from_string (account_mgr, account_name);
972 mail_operation = modest_mail_operation_new ();
973 modest_mail_operation_send_new_mail (mail_operation,
984 g_free (account_name);
985 g_object_unref (G_OBJECT (mail_operation));
986 g_object_unref (G_OBJECT (transport_account));
988 modest_msg_edit_window_free_msg_data (edit_window, data);
990 /* Save settings and close the window */
991 /* save_settings (edit_window) */
992 gtk_widget_destroy (GTK_WIDGET (edit_window));
996 * Shows a dialog with an entry that asks for some text. The returned
997 * value must be freed by the caller. The dialog window title will be
1001 ask_for_folder_name (GtkWindow *parent_window,
1004 GtkWidget *dialog, *entry;
1005 gchar *folder_name = NULL;
1007 /* Ask for folder name */
1008 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1012 GTK_RESPONSE_REJECT,
1014 GTK_RESPONSE_ACCEPT,
1016 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1017 gtk_label_new(title),
1020 entry = gtk_entry_new_with_max_length (40);
1021 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1025 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1027 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1028 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1030 gtk_widget_destroy (dialog);
1036 modest_ui_actions_on_new_folder (GtkWidget *widget, ModestMainWindow *main_window)
1038 TnyFolder *parent_folder;
1039 GtkWidget *folder_view;
1041 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1043 folder_view = modest_main_window_get_child_widget (main_window,
1044 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1048 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1050 if (parent_folder) {
1053 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1054 _("Please enter a name for the new folder"));
1056 if (folder_name != NULL && strlen (folder_name) > 0) {
1057 TnyFolder *new_folder;
1058 ModestMailOperation *mail_op;
1060 mail_op = modest_mail_operation_new ();
1061 new_folder = modest_mail_operation_create_folder (mail_op,
1062 TNY_FOLDER_STORE (parent_folder),
1063 (const gchar *) folder_name);
1065 g_object_unref (new_folder);
1067 const GError *error;
1068 error = modest_mail_operation_get_error (mail_op);
1070 g_warning ("Error adding a subfolder: %s\n", error->message);
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: notify error ? */
1111 g_warning ("Could not rename a folder: %s\n", error->message);
1113 g_object_unref (mail_op);
1115 g_object_unref (folder);
1120 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1123 ModestMailOperation *mail_op;
1124 GtkWidget *folder_view;
1125 const GError *error;
1127 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1129 folder_view = modest_main_window_get_child_widget (main_window,
1130 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1134 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1136 mail_op = modest_mail_operation_new ();
1137 modest_mail_operation_remove_folder (mail_op, folder, move_to_trash);
1139 error = modest_mail_operation_get_error (mail_op);
1141 g_warning ("%s\n", error->message);
1143 g_object_unref (mail_op);
1147 modest_ui_actions_on_delete_folder (GtkWidget *widget,
1148 ModestMainWindow *main_window)
1150 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1152 delete_folder (main_window, FALSE);
1156 modest_ui_actions_on_move_folder_to_trash_folder (GtkWidget *widget, ModestMainWindow *main_window)
1158 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1160 delete_folder (main_window, TRUE);
1164 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1165 const gchar* account_name,
1169 ModestMainWindow *main_window)
1172 GtkWidget *dialog, *entry, *remember_pass_check;
1174 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1178 GTK_RESPONSE_REJECT,
1180 GTK_RESPONSE_ACCEPT,
1182 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1184 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1185 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1189 entry = gtk_entry_new_with_max_length (40);
1190 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1191 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1193 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1196 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1197 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1200 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1202 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1203 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1210 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1215 gtk_widget_destroy (dialog);