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");
522 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
524 TNY_ACCOUNT_TYPE_TRANSPORT);
526 g_printerr ("modest: cannot get tny transport account for %s\n", account_name);
529 send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account));
531 g_object_unref (G_OBJECT(tny_account));
532 g_printerr ("modest: cannot get send queue for %s\n", account_name);
535 //modest_tny_send_queue_flush (send_queue);
537 g_object_unref (G_OBJECT(send_queue));
538 g_object_unref (G_OBJECT(tny_account));
541 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
543 TNY_ACCOUNT_TYPE_STORE);
545 g_printerr ("modest: cannot get tny store account for %s\n", account_name);
549 mail_op = modest_mail_operation_new ();
550 modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account));
552 g_object_unref (G_OBJECT(tny_account));
553 /* g_object_unref (G_OBJECT(mail_op)); FIXME: this is still in use... */
559 modest_ui_actions_toggle_view (GtkAction *action, ModestMainWindow *main_window)
562 GtkWidget *header_view;
564 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
566 header_view = modest_main_window_get_child_widget (main_window,
567 MODEST_WIDGET_TYPE_HEADER_VIEW);
571 conf = modest_runtime_get_conf ();
573 /* what is saved/restored is depending on the style; thus; we save with
574 * old style, then update the style, and restore for this new style*/
575 modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view");
577 if (modest_header_view_get_style
578 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
579 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
580 MODEST_HEADER_VIEW_STYLE_TWOLINES);
582 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
583 MODEST_HEADER_VIEW_STYLE_DETAILS);
585 modest_widget_memory_restore (conf, G_OBJECT(header_view),
592 * Marks a message as read and passes it to the msg preview widget
595 read_msg_func (gpointer data, gpointer user_data)
599 GetMsgAsyncHelper *helper;
600 TnyHeaderFlags header_flags;
601 GtkWidget *msg_preview;
603 msg = TNY_MSG (data);
604 helper = (GetMsgAsyncHelper *) user_data;
606 msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
607 MODEST_WIDGET_TYPE_MSG_PREVIEW);
611 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
612 header_flags = tny_header_get_flags (header);
613 tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
614 g_object_unref (G_OBJECT (header));
616 /* Set message on msg view */
617 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg);
621 * This function is a generic handler for the tny_folder_get_msg_async
622 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
623 * contains a user provided function that is called inside this
624 * method. This will allow us to use this callback in many different
625 * places. This callback performs the common actions for the
626 * get_msg_async call, more specific actions will be done by the user
630 get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
632 GetMsgAsyncHelper *helper;
634 helper = (GetMsgAsyncHelper *) user_data;
636 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
637 modest_ui_actions_on_item_not_found (NULL,
638 MODEST_ITEM_TYPE_MESSAGE,
643 /* Call user function */
644 helper->func (msg, user_data);
646 /* Process next element (if exists) */
647 tny_iterator_next (helper->iter);
648 if (tny_iterator_is_done (helper->iter)) {
650 headers = tny_iterator_get_list (helper->iter);
652 g_object_unref (G_OBJECT (headers));
653 g_object_unref (G_OBJECT (helper->iter));
654 g_slice_free (GetMsgAsyncHelper, helper);
657 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
658 tny_folder_get_msg_async (folder, header,
660 g_object_unref (G_OBJECT(header));
665 modest_ui_actions_on_header_selected (ModestHeaderView *folder_view,
667 ModestMainWindow *main_window)
669 GtkWidget *msg_preview;
671 GetMsgAsyncHelper *helper;
674 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
676 msg_preview = modest_main_window_get_child_widget(main_window,
677 MODEST_WIDGET_TYPE_MSG_PREVIEW);
681 /* when there's no header, clear the msgview */
683 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
687 folder = tny_header_get_folder (TNY_HEADER(header));
690 list = tny_simple_list_new ();
691 tny_list_prepend (list, G_OBJECT (header));
693 /* Fill helper data */
694 helper = g_slice_new0 (GetMsgAsyncHelper);
695 helper->window = MODEST_WINDOW (main_window);
696 helper->iter = tny_list_create_iterator (list);
697 helper->func = read_msg_func;
699 tny_folder_get_msg_async (TNY_FOLDER(folder),
704 g_object_unref (G_OBJECT (folder));
710 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
711 ModestMainWindow *main_window)
714 TnyFolder *folder = NULL;
716 gchar *account = NULL;
718 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
723 folder = tny_header_get_folder (header);
725 g_printerr ("modest: cannot get folder for header\n");
729 /* FIXME: make async?; check error */
730 msg = tny_folder_get_msg (folder, header, NULL);
732 g_printerr ("modest: cannot get msg for header\n");
736 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
738 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
740 win = modest_msg_view_window_new (msg, account);
741 gtk_window_set_transient_for (GTK_WINDOW (win),
742 GTK_WINDOW (main_window));
744 gtk_widget_show_all (GTK_WIDGET(win));
750 g_object_unref (G_OBJECT (folder));
752 g_object_unref (G_OBJECT (msg));
756 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
759 ModestMainWindow *main_window)
763 GtkWidget *header_view;
765 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
767 header_view = modest_main_window_get_child_widget(main_window,
768 MODEST_WIDGET_TYPE_HEADER_VIEW);
772 conf = modest_runtime_get_conf ();
774 if (!selected) { /* the folder was unselected; save it's settings */
775 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
776 gtk_window_set_title (GTK_WINDOW(main_window), "Modest");
777 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
778 } else { /* the folder was selected */
779 if (folder) { /* folder may be NULL */
783 num = tny_folder_get_all_count (folder);
784 unread = tny_folder_get_unread_count (folder);
786 title = g_strdup_printf ("Modest: %s",
787 tny_folder_get_name (folder));
789 gtk_window_set_title (GTK_WINDOW(main_window), title);
792 txt = g_strdup_printf (_("%d %s, %d unread"),
793 num, num==1 ? _("item") : _("items"), unread);
794 //gtk_label_set_label (GTK_LABEL(folder_info_label), txt);
797 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), folder);
798 modest_widget_memory_restore (conf, G_OBJECT(header_view),
804 /****************************************************/
806 * below some stuff to clearup statusbar messages after 1,5 seconds....
809 progress_bar_clean (GtkWidget *bar)
811 if (GTK_IS_PROGRESS_BAR(bar)) {
812 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(bar), "");
813 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(bar), 1.0);
819 statusbar_clean (GtkWidget *bar)
821 if (GTK_IS_STATUSBAR(bar))
822 gtk_statusbar_push (GTK_STATUSBAR(bar), 0, "");
828 statusbar_push (ModestMainWindow *main_window, guint context_id, const gchar *msg)
833 GtkWidget *progress_bar, *status_bar;
835 progress_bar = modest_main_window_get_child_widget (main_window,
836 MODEST_WIDGET_TYPE_PROGRESS_BAR);
837 status_bar = modest_main_window_get_child_widget (main_window,
838 MODEST_WIDGET_TYPE_STATUS_BAR);
840 gtk_widget_show (progress_bar);
841 g_timeout_add (3000, (GSourceFunc)progress_bar_clean, progress_bar);
845 gtk_widget_show (status_bar);
846 gtk_statusbar_push (GTK_STATUSBAR(status_bar), 0, msg);
847 g_timeout_add (2500, (GSourceFunc)statusbar_clean, status_bar);
851 /****************************************************************************/
854 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
861 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
863 if (g_main_depth > 0)
864 gdk_threads_enter ();
865 online = tny_device_is_online (modest_runtime_get_device());
868 /* already online -- the item is simply not there... */
869 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
873 _("The %s you selected cannot be found"),
875 gtk_dialog_run (GTK_DIALOG(dialog));
877 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
885 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
886 "Do you want to get online?"), item);
887 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
888 gtk_label_new (txt), FALSE, FALSE, 0);
889 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
892 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
893 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
894 tny_device_force_online (modest_runtime_get_device());
897 gtk_widget_destroy (dialog);
898 if (g_main_depth > 0)
899 gdk_threads_leave ();
905 modest_ui_actions_on_header_status_update (ModestHeaderView *header_view,
906 const gchar *msg, gint num,
907 gint total, ModestMainWindow *main_window)
910 GtkWidget *progress_bar;
912 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
914 progress_bar = modest_main_window_get_child_widget (main_window,
915 MODEST_WIDGET_TYPE_PROGRESS_BAR);
920 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress_bar),
921 (gdouble)num/(gdouble)total);
923 gtk_progress_bar_pulse (GTK_PROGRESS_BAR(progress_bar));
925 txt = g_strdup_printf (_("Downloading %d of %d"), num, total);
926 gtk_progress_bar_set_text (GTK_PROGRESS_BAR(progress_bar), txt);
929 statusbar_push (main_window, 0, msg);
934 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
937 g_message (__FUNCTION__);
942 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
945 g_message (__FUNCTION__);
949 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, int index,
952 g_message (__FUNCTION__);
957 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
958 ModestRecptView *recpt_view,
962 gchar *utf_start, *utf_end;
963 gchar *full_string = NULL;
966 gtk_label_get_selection_bounds (GTK_LABEL (recpt_view), &start, &end);
967 full_string = (gchar *) gtk_label_get_text (GTK_LABEL (recpt_view));
968 utf_start = g_utf8_offset_to_pointer (full_string, start);
969 utf_end = g_utf8_offset_to_pointer (full_string, end);
970 substring = g_strndup (utf_start, utf_end - utf_start);
971 g_message ("%s %s", __FUNCTION__, substring);
978 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
980 TnyTransportAccount *transport_account;
981 ModestMailOperation *mail_operation;
983 gchar *account_name, *from;
984 ModestAccountMgr *account_mgr;
986 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
988 data = modest_msg_edit_window_get_msg_data (edit_window);
990 /* FIXME: Code added just for testing. The final version will
991 use the send queue provided by tinymail and some
993 account_mgr = modest_runtime_get_account_mgr();
994 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
996 account_name = modest_account_mgr_get_default_account (account_mgr);
998 g_printerr ("modest: no account found\n");
999 modest_msg_edit_window_free_msg_data (edit_window, data);
1003 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
1004 (modest_runtime_get_account_store(),
1006 TNY_ACCOUNT_TYPE_TRANSPORT));
1007 if (!transport_account) {
1008 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1009 g_free (account_name);
1010 modest_msg_edit_window_free_msg_data (edit_window, data);
1013 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1015 mail_operation = modest_mail_operation_new ();
1016 modest_mail_operation_send_new_mail (mail_operation,
1027 g_free (account_name);
1028 g_object_unref (G_OBJECT (mail_operation));
1029 g_object_unref (G_OBJECT (transport_account));
1031 modest_msg_edit_window_free_msg_data (edit_window, data);
1033 /* Save settings and close the window */
1034 /* save_settings (edit_window) */
1035 gtk_widget_destroy (GTK_WIDGET (edit_window));
1039 * Shows a dialog with an entry that asks for some text. The returned
1040 * value must be freed by the caller. The dialog window title will be
1044 ask_for_folder_name (GtkWindow *parent_window,
1047 GtkWidget *dialog, *entry;
1048 gchar *folder_name = NULL;
1050 /* Ask for folder name */
1051 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1055 GTK_RESPONSE_REJECT,
1057 GTK_RESPONSE_ACCEPT,
1059 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1060 gtk_label_new(title),
1063 entry = gtk_entry_new_with_max_length (40);
1064 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1068 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1070 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1071 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1073 gtk_widget_destroy (dialog);
1079 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1081 TnyFolder *parent_folder;
1082 GtkWidget *folder_view;
1084 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1086 folder_view = modest_main_window_get_child_widget (main_window,
1087 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1091 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1093 if (parent_folder) {
1096 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1097 _("Please enter a name for the new folder"));
1099 if (folder_name != NULL && strlen (folder_name) > 0) {
1100 TnyFolder *new_folder;
1101 ModestMailOperation *mail_op;
1103 mail_op = modest_mail_operation_new ();
1104 new_folder = modest_mail_operation_create_folder (mail_op,
1105 TNY_FOLDER_STORE (parent_folder),
1106 (const gchar *) folder_name);
1108 g_object_unref (new_folder);
1110 const GError *error;
1111 error = modest_mail_operation_get_error (mail_op);
1113 g_warning ("Error adding a subfolder: %s\n", error->message);
1115 g_object_unref (mail_op);
1117 g_object_unref (parent_folder);
1122 modest_ui_actions_on_rename_folder (GtkAction *action,
1123 ModestMainWindow *main_window)
1126 GtkWidget *folder_view;
1128 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1130 folder_view = modest_main_window_get_child_widget (main_window,
1131 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1135 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1139 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1140 _("Please enter a new name for the folder"));
1142 if (folder_name != NULL && strlen (folder_name) > 0) {
1143 ModestMailOperation *mail_op;
1144 const GError *error;
1146 mail_op = modest_mail_operation_new ();
1147 modest_mail_operation_rename_folder (mail_op,
1149 (const gchar *) folder_name);
1151 error = modest_mail_operation_get_error (mail_op);
1153 /* TODO: notify error ? */
1154 g_warning ("Could not rename a folder: %s\n", error->message);
1156 g_object_unref (mail_op);
1158 g_object_unref (folder);
1163 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1166 ModestMailOperation *mail_op;
1167 GtkWidget *folder_view;
1168 const GError *error;
1170 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1172 folder_view = modest_main_window_get_child_widget (main_window,
1173 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1177 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1179 mail_op = modest_mail_operation_new ();
1180 modest_mail_operation_remove_folder (mail_op, folder, move_to_trash);
1182 error = modest_mail_operation_get_error (mail_op);
1184 g_warning ("%s\n", error->message);
1186 g_object_unref (G_OBJECT (mail_op));
1187 g_object_unref (G_OBJECT (folder));
1191 modest_ui_actions_on_delete_folder (GtkAction *action,
1192 ModestMainWindow *main_window)
1194 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1196 delete_folder (main_window, FALSE);
1200 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1202 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1204 delete_folder (main_window, TRUE);
1208 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1209 const gchar* account_name,
1213 ModestMainWindow *main_window)
1216 GtkWidget *dialog, *entry, *remember_pass_check;
1218 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1222 GTK_RESPONSE_REJECT,
1224 GTK_RESPONSE_ACCEPT,
1226 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1228 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1229 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1233 entry = gtk_entry_new_with_max_length (40);
1234 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1235 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1237 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1240 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1241 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1244 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1246 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1247 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1254 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1259 gtk_widget_destroy (dialog);