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 (ReplyForwardAction action, ModestWindow *win);
82 static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title);
86 modest_ui_actions_on_about (GtkAction *action, ModestWindow *win)
89 const gchar *authors[] = {
90 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
93 about = gtk_about_dialog_new ();
94 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
95 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
96 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
97 _("Copyright (c) 2006, Nokia Corporation\n"
98 "All rights reserved."));
99 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
100 _("a modest e-mail client\n\n"
101 "design and implementation: Dirk-Jan C. Binnema\n"
102 "contributions from the fine people at KernelConcepts and Igalia\n"
103 "uses the tinymail email framework written by Philip van Hoof"));
104 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
105 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
107 gtk_dialog_run (GTK_DIALOG (about));
108 gtk_widget_destroy(about);
113 get_selected_headers (ModestWindow *win)
115 if (MODEST_IS_MAIN_WINDOW(win)) {
116 GtkWidget *header_view;
118 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
119 MODEST_WIDGET_TYPE_HEADER_VIEW);
120 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
122 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
123 /* for MsgViewWindows, we simply return a list with one element */
126 TnyList *list = NULL;
128 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
130 header = tny_msg_get_header (msg);
131 list = tny_simple_list_new ();
132 tny_list_prepend (list, G_OBJECT(header));
133 g_object_unref (G_OBJECT(header));
142 modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
144 TnyList *header_list;
147 g_return_if_fail (MODEST_IS_WINDOW(win));
149 header_list = get_selected_headers (win);
152 iter = tny_list_create_iterator (header_list);
155 ModestMailOperation *mail_op;
157 header = TNY_HEADER (tny_iterator_get_current (iter));
158 /* TODO: thick grain mail operation involving
159 a list of objects. Composite pattern ??? */
160 mail_op = modest_mail_operation_new ();
162 /* TODO: add confirmation dialog */
164 /* Move to trash. TODO: Still not supported */
165 modest_mail_operation_remove_msg (mail_op, header, FALSE);
167 if (modest_mail_operation_get_status (mail_op) !=
168 MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
170 error = modest_mail_operation_get_error (mail_op);
172 g_warning (error->message);
175 g_object_unref (G_OBJECT (mail_op));
176 g_object_unref (header);
177 tny_iterator_next (iter);
179 } while (!tny_iterator_is_done (iter));
185 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
187 /* FIXME: save size of main window */
188 /* save_sizes (main_window); */
189 gtk_widget_destroy (GTK_WIDGET (win));
193 modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win)
195 /* GtkDialog *account_win; */
196 /* account_win = GTK_DIALOG(modest_account_view_window_new ()); */
199 /* gtk_dialog_run (account_win); */
200 //gtk_widget_destroy (GTK_WIDGET(account_win));
201 GtkWidget *dialog, *label;
203 /* Create the widgets */
205 dialog = gtk_dialog_new_with_buttons ("Message",
207 GTK_DIALOG_DESTROY_WITH_PARENT,
211 label = gtk_label_new ("Hello World!");
213 /* Ensure that the dialog box is destroyed when the user responds. */
215 g_signal_connect_swapped (dialog, "response",
216 G_CALLBACK (gtk_widget_destroy),
219 /* Add the label, and show everything we've added to the dialog. */
221 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
223 gtk_widget_show_all (dialog);
227 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
229 ModestWindow *msg_win;
231 TnyFolder *folder = NULL;
232 gchar *account_name = NULL;
233 gchar *from_str = NULL;
237 account_name = g_strdup(modest_window_get_active_account (win));
239 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
241 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
243 TNY_ACCOUNT_TYPE_STORE);
245 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
249 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
251 msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL);
253 g_printerr ("modest: failed to create new msg\n");
257 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
259 g_printerr ("modest: failed to find Drafts folder\n");
263 tny_folder_add_msg (folder, msg, &err);
265 g_printerr ("modest: error adding msg to Drafts folder: %s",
271 msg_win = modest_msg_edit_window_new (msg, account_name);
273 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
275 gtk_widget_show_all (GTK_WIDGET (msg_win));
278 g_free (account_name);
281 g_object_unref (G_OBJECT(account));
283 g_object_unref (G_OBJECT(msg));
285 g_object_unref (G_OBJECT(folder));
290 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
292 modest_runtime_not_implemented (GTK_WINDOW(win)); /* FIXME */
298 reply_forward_func (gpointer data, gpointer user_data)
300 TnyMsg *msg, *new_msg;
301 GetMsgAsyncHelper *helper;
302 ReplyForwardHelper *rf_helper;
303 ModestWindow *msg_win;
304 ModestEditType edit_type;
307 TnyFolder *folder = NULL;
308 TnyAccount *account = NULL;
310 msg = TNY_MSG (data);
311 helper = (GetMsgAsyncHelper *) user_data;
312 rf_helper = (ReplyForwardHelper *) helper->user_data;
314 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
315 rf_helper->account_name);
316 /* Create reply mail */
317 switch (rf_helper->action) {
320 modest_mail_operation_create_reply_mail (msg, from,
321 rf_helper->reply_forward_type,
322 MODEST_MAIL_OPERATION_REPLY_MODE_SENDER);
324 case ACTION_REPLY_TO_ALL:
326 modest_mail_operation_create_reply_mail (msg, from, rf_helper->reply_forward_type,
327 MODEST_MAIL_OPERATION_REPLY_MODE_ALL);
328 edit_type = MODEST_EDIT_TYPE_REPLY;
332 modest_mail_operation_create_forward_mail (msg, from, rf_helper->reply_forward_type);
333 edit_type = MODEST_EDIT_TYPE_FORWARD;
336 g_return_if_reached ();
341 g_printerr ("modest: failed to create message\n");
345 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
346 rf_helper->account_name,
347 TNY_ACCOUNT_TYPE_STORE);
349 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
353 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
355 g_printerr ("modest: failed to find Drafts folder\n");
359 tny_folder_add_msg (folder, msg, &err);
361 g_printerr ("modest: error adding msg to Drafts folder: %s",
367 /* Show edit window */
368 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
369 gtk_widget_show_all (GTK_WIDGET (msg_win));
373 g_object_unref (G_OBJECT (new_msg));
375 g_object_unref (G_OBJECT (folder));
377 g_object_unref (G_OBJECT (account));
379 g_free (rf_helper->account_name);
380 g_slice_free (ReplyForwardHelper, rf_helper);
383 * Common code for the reply and forward actions
386 reply_forward (ReplyForwardAction action, ModestWindow *win)
388 TnyList *header_list;
389 guint reply_forward_type;
392 GetMsgAsyncHelper *helper;
393 ReplyForwardHelper *rf_helper;
395 g_return_if_fail (MODEST_IS_WINDOW(win));
397 header_list = get_selected_headers (win);
401 reply_forward_type = modest_conf_get_int (modest_runtime_get_conf (),
402 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
404 /* We assume that we can only select messages of the
405 same folder and that we reply all of them from the
406 same account. In fact the interface currently only
407 allows single selection */
410 rf_helper = g_slice_new0 (ReplyForwardHelper);
411 rf_helper->reply_forward_type = reply_forward_type;
412 rf_helper->action = action;
414 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
415 if (!rf_helper->account_name)
416 rf_helper->account_name =
417 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
419 helper = g_slice_new0 (GetMsgAsyncHelper);
420 helper->window = win;
421 helper->func = reply_forward_func;
422 helper->iter = tny_list_create_iterator (header_list);
423 helper->user_data = rf_helper;
425 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
427 msg = modest_msg_view_window_get_message(MODEST_MSG_VIEW_WINDOW(win));
429 g_printerr ("modest: no message found\n");
432 reply_forward_func (msg, helper);
434 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
435 folder = tny_header_get_folder (header);
437 /* The callback will call it per each header */
438 tny_folder_get_msg_async (folder, header, get_msg_cb, helper);
439 g_object_unref (G_OBJECT (folder));
441 g_printerr ("modest: no folder for header\n");
444 g_object_unref (G_OBJECT (header));
450 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
452 g_return_if_fail (MODEST_IS_WINDOW(win));
454 reply_forward (ACTION_REPLY, win);
458 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
460 g_return_if_fail (MODEST_IS_WINDOW(win));
462 reply_forward (ACTION_FORWARD, win);
466 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
468 g_return_if_fail (MODEST_IS_WINDOW(win));
470 reply_forward (ACTION_REPLY_TO_ALL, win);
474 modest_ui_actions_on_next (GtkAction *action,
475 ModestMainWindow *main_window)
477 GtkWidget *header_view;
478 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
480 header_view = modest_main_window_get_child_widget (main_window,
481 MODEST_WIDGET_TYPE_HEADER_VIEW);
485 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
489 modest_ui_actions_on_prev (GtkAction *action,
490 ModestMainWindow *main_window)
492 GtkWidget *header_view;
493 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
495 header_view = modest_main_window_get_child_widget (main_window,
496 MODEST_WIDGET_TYPE_HEADER_VIEW);
500 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
505 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
508 TnyAccount *tny_account;
509 //ModestTnySendQueue *send_queue;
510 ModestMailOperation *mail_op;
513 g_strdup(modest_window_get_active_account(MODEST_WINDOW(win)));
515 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
517 g_printerr ("modest: cannot get account\n");
523 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
525 TNY_ACCOUNT_TYPE_TRANSPORT);
527 g_printerr ("modest: cannot get tny transport account for %s\n", account_name);
531 send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account));
533 g_object_unref (G_OBJECT(tny_account));
534 g_printerr ("modest: cannot get send queue for %s\n", account_name);
537 modest_tny_send_queue_flush (send_queue);
539 g_object_unref (G_OBJECT(send_queue));
540 g_object_unref (G_OBJECT(tny_account));
543 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
545 TNY_ACCOUNT_TYPE_STORE);
547 g_printerr ("modest: cannot get tny store account for %s\n", account_name);
551 mail_op = modest_mail_operation_new ();
552 modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account));
554 g_object_unref (G_OBJECT(tny_account));
555 /* g_object_unref (G_OBJECT(mail_op)); FIXME: this is still in use... */
561 modest_ui_actions_toggle_view (GtkAction *action, ModestMainWindow *main_window)
564 GtkWidget *header_view;
566 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
568 header_view = modest_main_window_get_child_widget (main_window,
569 MODEST_WIDGET_TYPE_HEADER_VIEW);
573 conf = modest_runtime_get_conf ();
575 /* what is saved/restored is depending on the style; thus; we save with
576 * old style, then update the style, and restore for this new style*/
577 modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view");
579 if (modest_header_view_get_style
580 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
581 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
582 MODEST_HEADER_VIEW_STYLE_TWOLINES);
584 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
585 MODEST_HEADER_VIEW_STYLE_DETAILS);
587 modest_widget_memory_restore (conf, G_OBJECT(header_view),
594 * Marks a message as read and passes it to the msg preview widget
597 read_msg_func (gpointer data, gpointer user_data)
601 GetMsgAsyncHelper *helper;
602 TnyHeaderFlags header_flags;
603 GtkWidget *msg_preview;
605 msg = TNY_MSG (data);
606 helper = (GetMsgAsyncHelper *) user_data;
608 msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
609 MODEST_WIDGET_TYPE_MSG_PREVIEW);
613 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
614 header_flags = tny_header_get_flags (header);
615 tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
616 g_object_unref (G_OBJECT (header));
618 /* Set message on msg view */
619 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg);
623 * This function is a generic handler for the tny_folder_get_msg_async
624 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
625 * contains a user provided function that is called inside this
626 * method. This will allow us to use this callback in many different
627 * places. This callback performs the common actions for the
628 * get_msg_async call, more specific actions will be done by the user
632 get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
634 GetMsgAsyncHelper *helper;
636 helper = (GetMsgAsyncHelper *) user_data;
638 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
639 modest_ui_actions_on_item_not_found (NULL,
640 MODEST_ITEM_TYPE_MESSAGE,
645 /* Call user function */
646 helper->func (msg, user_data);
648 /* Process next element (if exists) */
649 tny_iterator_next (helper->iter);
650 if (tny_iterator_is_done (helper->iter)) {
652 headers = tny_iterator_get_list (helper->iter);
654 g_object_unref (G_OBJECT (headers));
655 g_object_unref (G_OBJECT (helper->iter));
656 g_slice_free (GetMsgAsyncHelper, helper);
659 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
660 tny_folder_get_msg_async (folder, header,
662 g_object_unref (G_OBJECT(header));
667 modest_ui_actions_on_header_selected (ModestHeaderView *folder_view,
669 ModestMainWindow *main_window)
671 GtkWidget *msg_preview;
673 GetMsgAsyncHelper *helper;
676 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
678 msg_preview = modest_main_window_get_child_widget(main_window,
679 MODEST_WIDGET_TYPE_MSG_PREVIEW);
683 /* when there's no header, clear the msgview */
685 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
689 folder = tny_header_get_folder (TNY_HEADER(header));
692 list = tny_simple_list_new ();
693 tny_list_prepend (list, G_OBJECT (header));
695 /* Fill helper data */
696 helper = g_slice_new0 (GetMsgAsyncHelper);
697 helper->window = MODEST_WINDOW (main_window);
698 helper->iter = tny_list_create_iterator (list);
699 helper->func = read_msg_func;
701 tny_folder_get_msg_async (TNY_FOLDER(folder),
706 g_object_unref (G_OBJECT (folder));
712 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
713 ModestMainWindow *main_window)
716 TnyFolder *folder = NULL;
718 gchar *account = NULL;
720 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
725 folder = tny_header_get_folder (header);
727 g_printerr ("modest: cannot get folder for header\n");
731 /* FIXME: make async?; check error */
732 msg = tny_folder_get_msg (folder, header, NULL);
734 g_printerr ("modest: cannot get msg for header\n");
738 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
740 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
742 win = modest_msg_view_window_new (msg, account);
743 gtk_window_set_transient_for (GTK_WINDOW (win),
744 GTK_WINDOW (main_window));
746 gtk_widget_show_all (GTK_WIDGET(win));
752 g_object_unref (G_OBJECT (folder));
754 g_object_unref (G_OBJECT (msg));
758 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
761 ModestMainWindow *main_window)
765 GtkWidget *header_view;
767 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
769 header_view = modest_main_window_get_child_widget(main_window,
770 MODEST_WIDGET_TYPE_HEADER_VIEW);
774 conf = modest_runtime_get_conf ();
776 if (!selected) { /* the folder was unselected; save it's settings */
777 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
778 gtk_window_set_title (GTK_WINDOW(main_window), "Modest");
779 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
780 } else { /* the folder was selected */
781 if (folder) { /* folder may be NULL */
785 num = tny_folder_get_all_count (folder);
786 unread = tny_folder_get_unread_count (folder);
788 title = g_strdup_printf ("Modest: %s",
789 tny_folder_get_name (folder));
791 gtk_window_set_title (GTK_WINDOW(main_window), title);
794 txt = g_strdup_printf (_("%d %s, %d unread"),
795 num, num==1 ? _("item") : _("items"), unread);
796 //gtk_label_set_label (GTK_LABEL(folder_info_label), txt);
799 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), folder);
800 modest_widget_memory_restore (conf, G_OBJECT(header_view),
806 /****************************************************/
808 * below some stuff to clearup statusbar messages after 1,5 seconds....
811 progress_bar_clean (GtkWidget *bar)
813 if (GTK_IS_PROGRESS_BAR(bar)) {
814 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(bar), "");
815 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(bar), 1.0);
821 statusbar_clean (GtkWidget *bar)
823 if (GTK_IS_STATUSBAR(bar))
824 gtk_statusbar_push (GTK_STATUSBAR(bar), 0, "");
830 statusbar_push (ModestMainWindow *main_window, guint context_id, const gchar *msg)
835 GtkWidget *progress_bar, *status_bar;
837 progress_bar = modest_main_window_get_child_widget (main_window,
838 MODEST_WIDGET_TYPE_PROGRESS_BAR);
839 status_bar = modest_main_window_get_child_widget (main_window,
840 MODEST_WIDGET_TYPE_STATUS_BAR);
842 gtk_widget_show (progress_bar);
843 g_timeout_add (3000, (GSourceFunc)progress_bar_clean, progress_bar);
847 gtk_widget_show (status_bar);
848 gtk_statusbar_push (GTK_STATUSBAR(status_bar), 0, msg);
849 g_timeout_add (2500, (GSourceFunc)statusbar_clean, status_bar);
853 /****************************************************************************/
856 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
863 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
865 if (g_main_depth > 0)
866 gdk_threads_enter ();
867 online = tny_device_is_online (modest_runtime_get_device());
870 /* already online -- the item is simply not there... */
871 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
875 _("The %s you selected cannot be found"),
877 gtk_dialog_run (GTK_DIALOG(dialog));
879 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
887 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
888 "Do you want to get online?"), item);
889 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
890 gtk_label_new (txt), FALSE, FALSE, 0);
891 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
894 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
895 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
896 tny_device_force_online (modest_runtime_get_device());
899 gtk_widget_destroy (dialog);
900 if (g_main_depth > 0)
901 gdk_threads_leave ();
907 modest_ui_actions_on_header_status_update (ModestHeaderView *header_view,
908 const gchar *msg, gint num,
909 gint total, ModestMainWindow *main_window)
912 GtkWidget *progress_bar;
914 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
916 progress_bar = modest_main_window_get_child_widget (main_window,
917 MODEST_WIDGET_TYPE_PROGRESS_BAR);
922 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress_bar),
923 (gdouble)num/(gdouble)total);
925 gtk_progress_bar_pulse (GTK_PROGRESS_BAR(progress_bar));
927 txt = g_strdup_printf (_("Downloading %d of %d"), num, total);
928 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(progress_bar), txt);
931 statusbar_push (main_window, 0, msg);
936 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
939 g_message (__FUNCTION__);
944 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
947 g_message (__FUNCTION__);
951 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, int index,
954 g_message (__FUNCTION__);
959 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
960 ModestRecptView *recpt_view,
964 gchar *utf_start, *utf_end;
965 gchar *full_string = NULL;
968 gtk_label_get_selection_bounds (GTK_LABEL (recpt_view), &start, &end);
969 full_string = (gchar *) gtk_label_get_text (GTK_LABEL (recpt_view));
970 utf_start = g_utf8_offset_to_pointer (full_string, start);
971 utf_end = g_utf8_offset_to_pointer (full_string, end);
972 substring = g_strndup (utf_start, utf_end - utf_start);
973 g_message ("%s %s", __FUNCTION__, substring);
980 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
982 TnyTransportAccount *transport_account;
983 ModestMailOperation *mail_operation;
985 gchar *account_name, *from;
986 ModestAccountMgr *account_mgr;
988 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
990 data = modest_msg_edit_window_get_msg_data (edit_window);
992 /* FIXME: Code added just for testing. The final version will
993 use the send queue provided by tinymail and some
995 account_mgr = modest_runtime_get_account_mgr();
996 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
998 account_name = modest_account_mgr_get_default_account (account_mgr);
1000 g_printerr ("modest: no account found\n");
1001 modest_msg_edit_window_free_msg_data (edit_window, data);
1005 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
1006 (modest_runtime_get_account_store(),
1008 TNY_ACCOUNT_TYPE_TRANSPORT));
1009 if (!transport_account) {
1010 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1011 g_free (account_name);
1012 modest_msg_edit_window_free_msg_data (edit_window, data);
1015 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1017 mail_operation = modest_mail_operation_new ();
1018 modest_mail_operation_send_new_mail (mail_operation,
1029 g_free (account_name);
1030 g_object_unref (G_OBJECT (mail_operation));
1031 g_object_unref (G_OBJECT (transport_account));
1033 modest_msg_edit_window_free_msg_data (edit_window, data);
1035 /* Save settings and close the window */
1036 /* save_settings (edit_window) */
1037 gtk_widget_destroy (GTK_WIDGET (edit_window));
1041 * Shows a dialog with an entry that asks for some text. The returned
1042 * value must be freed by the caller. The dialog window title will be
1046 ask_for_folder_name (GtkWindow *parent_window,
1049 GtkWidget *dialog, *entry;
1050 gchar *folder_name = NULL;
1052 /* Ask for folder name */
1053 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1057 GTK_RESPONSE_REJECT,
1059 GTK_RESPONSE_ACCEPT,
1061 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1062 gtk_label_new(title),
1065 entry = gtk_entry_new_with_max_length (40);
1066 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1070 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1072 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1073 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1075 gtk_widget_destroy (dialog);
1081 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1083 TnyFolder *parent_folder;
1084 GtkWidget *folder_view;
1086 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1088 folder_view = modest_main_window_get_child_widget (main_window,
1089 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1093 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1095 if (parent_folder) {
1098 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1099 _("Please enter a name for the new folder"));
1101 if (folder_name != NULL && strlen (folder_name) > 0) {
1102 TnyFolder *new_folder;
1103 ModestMailOperation *mail_op;
1105 mail_op = modest_mail_operation_new ();
1106 new_folder = modest_mail_operation_create_folder (mail_op,
1107 TNY_FOLDER_STORE (parent_folder),
1108 (const gchar *) folder_name);
1110 g_object_unref (new_folder);
1112 const GError *error;
1113 error = modest_mail_operation_get_error (mail_op);
1115 g_warning ("Error adding a subfolder: %s\n", error->message);
1117 g_object_unref (mail_op);
1119 g_object_unref (parent_folder);
1124 modest_ui_actions_on_rename_folder (GtkAction *action,
1125 ModestMainWindow *main_window)
1128 GtkWidget *folder_view;
1130 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1132 folder_view = modest_main_window_get_child_widget (main_window,
1133 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1137 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1141 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1142 _("Please enter a new name for the folder"));
1144 if (folder_name != NULL && strlen (folder_name) > 0) {
1145 ModestMailOperation *mail_op;
1146 const GError *error;
1148 mail_op = modest_mail_operation_new ();
1149 modest_mail_operation_rename_folder (mail_op,
1151 (const gchar *) folder_name);
1153 error = modest_mail_operation_get_error (mail_op);
1155 /* TODO: notify error ? */
1156 g_warning ("Could not rename a folder: %s\n", error->message);
1158 g_object_unref (mail_op);
1160 g_object_unref (folder);
1165 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1168 ModestMailOperation *mail_op;
1169 GtkWidget *folder_view;
1170 const GError *error;
1172 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1174 folder_view = modest_main_window_get_child_widget (main_window,
1175 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1179 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1181 mail_op = modest_mail_operation_new ();
1182 modest_mail_operation_remove_folder (mail_op, folder, move_to_trash);
1184 error = modest_mail_operation_get_error (mail_op);
1186 g_warning ("%s\n", error->message);
1188 g_object_unref (G_OBJECT (mail_op));
1189 g_object_unref (G_OBJECT (folder));
1193 modest_ui_actions_on_delete_folder (GtkAction *action,
1194 ModestMainWindow *main_window)
1196 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1198 delete_folder (main_window, FALSE);
1202 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1204 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1206 delete_folder (main_window, TRUE);
1210 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1211 const gchar* account_name,
1215 ModestMainWindow *main_window)
1218 GtkWidget *dialog, *entry, *remember_pass_check;
1220 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1224 GTK_RESPONSE_REJECT,
1226 GTK_RESPONSE_ACCEPT,
1228 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1230 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1231 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1235 entry = gtk_entry_new_with_max_length (40);
1236 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1237 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1239 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1242 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1243 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1246 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1248 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1249 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1256 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1261 gtk_widget_destroy (dialog);