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-folder.h>
38 #include <modest-tny-msg.h>
39 #include <modest-tny-account.h>
40 #include <modest-address-book.h>
42 #include "modest-ui-actions.h"
44 #include "modest-tny-platform-factory.h"
45 #include "modest-platform.h"
47 #include <widgets/modest-main-window.h>
48 #include <widgets/modest-msg-view-window.h>
49 #include <widgets/modest-account-view-window.h>
50 #include <widgets/modest-msg-view-details-dialog.h>
52 #include "modest-account-mgr-helpers.h"
53 #include "modest-mail-operation.h"
55 #ifdef MODEST_HAVE_EASYSETUP
56 #include "easysetup/modest-easysetup-wizard.h"
57 #endif /*MODEST_HAVE_EASYSETUP*/
59 #include <modest-widget-memory.h>
60 #include <tny-error.h>
61 #include <tny-simple-list.h>
62 #include <tny-msg-view.h>
63 #include <tny-device.h>
66 typedef struct _GetMsgAsyncHelper {
73 typedef enum _ReplyForwardAction {
79 typedef struct _ReplyForwardHelper {
80 guint reply_forward_type;
81 ReplyForwardAction action;
86 static void reply_forward_func (gpointer data, gpointer user_data);
87 static void read_msg_func (gpointer data, gpointer user_data);
88 static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err,
90 static void reply_forward (ReplyForwardAction action, ModestWindow *win);
91 static void modest_ui_actions_message_details_cb (gpointer msg_data,
92 gpointer helper_data);
93 static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title);
97 modest_ui_actions_on_about (GtkAction *action, ModestWindow *win)
100 const gchar *authors[] = {
101 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
104 about = gtk_about_dialog_new ();
105 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
106 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
107 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
108 _("Copyright (c) 2006, Nokia Corporation\n"
109 "All rights reserved."));
110 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
111 _("a modest e-mail client\n\n"
112 "design and implementation: Dirk-Jan C. Binnema\n"
113 "contributions from the fine people at KernelConcepts and Igalia\n"
114 "uses the tinymail email framework written by Philip van Hoof"));
115 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
116 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
118 gtk_dialog_run (GTK_DIALOG (about));
119 gtk_widget_destroy(about);
124 get_selected_headers (ModestWindow *win)
126 if (MODEST_IS_MAIN_WINDOW(win)) {
127 GtkWidget *header_view;
129 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
130 MODEST_WIDGET_TYPE_HEADER_VIEW);
131 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
133 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
134 /* for MsgViewWindows, we simply return a list with one element */
137 TnyList *list = NULL;
139 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
141 header = tny_msg_get_header (msg);
142 list = tny_simple_list_new ();
143 tny_list_prepend (list, G_OBJECT(header));
144 g_object_unref (G_OBJECT(header));
153 modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
155 TnyList *header_list;
158 g_return_if_fail (MODEST_IS_WINDOW(win));
160 header_list = get_selected_headers (win);
163 iter = tny_list_create_iterator (header_list);
166 ModestMailOperation *mail_op;
168 header = TNY_HEADER (tny_iterator_get_current (iter));
169 /* TODO: thick grain mail operation involving
170 a list of objects. Composite pattern ??? */
171 /* TODO: add confirmation dialog */
172 mail_op = modest_mail_operation_new ();
173 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
176 /* Always delete. TODO: Move to trash still not supported */
177 modest_mail_operation_remove_msg (mail_op, header, FALSE);
180 g_object_unref (G_OBJECT (mail_op));
181 g_object_unref (G_OBJECT (header));
183 tny_iterator_next (iter);
185 } while (!tny_iterator_is_done (iter));
188 g_object_unref (G_OBJECT (iter));
191 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
192 gtk_widget_destroy (GTK_WIDGET(win));
198 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
204 modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win)
206 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
207 gtk_widget_destroy (GTK_WIDGET (win));
208 } else if (MODEST_IS_WINDOW (win)) {
209 gtk_widget_destroy (GTK_WIDGET (win));
211 g_return_if_reached ();
216 modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win)
218 GtkClipboard *clipboard = NULL;
219 gchar *selection = NULL;
221 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
222 selection = gtk_clipboard_wait_for_text (clipboard);
224 modest_address_book_add_address (selection);
229 modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win)
232 /* This is currently only implemented for Maemo,
233 * because it requires a providers preset file which is not publically available.
235 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
236 GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr());
237 gboolean accounts_exist = account_names != NULL;
238 g_slist_free (account_names);
240 /* To test, while modest_account_mgr_account_names() is broken: accounts_exist = TRUE; */
241 if (!accounts_exist) {
242 /* If there are no accounts yet, just show the easy-setup wizard, as per the UI spec: */
243 ModestEasysetupWizardDialog *wizard = modest_easysetup_wizard_dialog_new ();
244 gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
245 gtk_dialog_run (GTK_DIALOG (wizard));
246 gtk_widget_destroy (GTK_WIDGET (wizard));
248 /* Show the list of accounts: */
249 GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ());
250 gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win));
251 gtk_dialog_run (account_win);
252 gtk_widget_destroy (GTK_WIDGET(account_win));
255 GtkWidget *dialog, *label;
257 /* Create the widgets */
259 dialog = gtk_dialog_new_with_buttons ("Message",
261 GTK_DIALOG_DESTROY_WITH_PARENT,
265 label = gtk_label_new ("Hello World!");
267 /* Ensure that the dialog box is destroyed when the user responds. */
269 g_signal_connect_swapped (dialog, "response",
270 G_CALLBACK (gtk_widget_destroy),
273 /* Add the label, and show everything we've added to the dialog. */
275 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
277 gtk_widget_show_all (dialog);
278 #endif /* MODEST_PLATFORM_MAEMO */
282 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
284 ModestWindow *msg_win;
286 TnyFolder *folder = NULL;
287 gchar *account_name = NULL;
288 gchar *from_str = NULL;
290 TnyAccount *account = NULL;
291 ModestWindowMgr *mgr;
293 account_name = g_strdup(modest_window_get_active_account (win));
295 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
297 g_printerr ("modest: no account found\n");
301 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
303 TNY_ACCOUNT_TYPE_STORE);
305 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
309 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
311 msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL);
313 g_printerr ("modest: failed to create new msg\n");
317 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
319 g_printerr ("modest: failed to find Drafts folder\n");
323 tny_folder_add_msg (folder, msg, &err);
325 g_printerr ("modest: error adding msg to Drafts folder: %s",
331 /* Create and register edit window */
332 msg_win = modest_msg_edit_window_new (msg, account_name);
333 mgr = modest_runtime_get_window_mgr ();
334 modest_window_mgr_register_window (mgr, msg_win);
337 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
339 gtk_widget_show_all (GTK_WIDGET (msg_win));
342 g_free (account_name);
345 g_object_unref (G_OBJECT(account));
347 g_object_unref (G_OBJECT(msg));
349 g_object_unref (G_OBJECT(folder));
354 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
356 modest_runtime_not_implemented (GTK_WINDOW(win)); /* FIXME */
362 reply_forward_func (gpointer data, gpointer user_data)
364 TnyMsg *msg, *new_msg;
365 GetMsgAsyncHelper *helper;
366 ReplyForwardHelper *rf_helper;
367 ModestWindow *msg_win;
368 ModestEditType edit_type;
371 TnyFolder *folder = NULL;
372 TnyAccount *account = NULL;
373 ModestWindowMgr *mgr;
375 msg = TNY_MSG (data);
376 helper = (GetMsgAsyncHelper *) user_data;
377 rf_helper = (ReplyForwardHelper *) helper->user_data;
379 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
380 rf_helper->account_name);
381 /* Create reply mail */
382 switch (rf_helper->action) {
385 modest_tny_msg_create_reply_msg (msg, from,
386 rf_helper->reply_forward_type,
387 MODEST_TNY_MSG_REPLY_MODE_SENDER);
389 case ACTION_REPLY_TO_ALL:
391 modest_tny_msg_create_reply_msg (msg, from, rf_helper->reply_forward_type,
392 MODEST_TNY_MSG_REPLY_MODE_ALL);
393 edit_type = MODEST_EDIT_TYPE_REPLY;
397 modest_tny_msg_create_forward_msg (msg, from, rf_helper->reply_forward_type);
398 edit_type = MODEST_EDIT_TYPE_FORWARD;
401 g_return_if_reached ();
406 g_printerr ("modest: failed to create message\n");
410 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
411 rf_helper->account_name,
412 TNY_ACCOUNT_TYPE_STORE);
414 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
418 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
420 g_printerr ("modest: failed to find Drafts folder\n");
424 tny_folder_add_msg (folder, msg, &err);
426 g_printerr ("modest: error adding msg to Drafts folder: %s",
432 /* Create and register the windows */
433 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
434 mgr = modest_runtime_get_window_mgr ();
435 modest_window_mgr_register_window (mgr, msg_win);
437 /* Show edit window */
438 gtk_widget_show_all (GTK_WIDGET (msg_win));
442 g_object_unref (G_OBJECT (new_msg));
444 g_object_unref (G_OBJECT (folder));
446 g_object_unref (G_OBJECT (account));
448 g_free (rf_helper->account_name);
449 g_slice_free (ReplyForwardHelper, rf_helper);
452 * Common code for the reply and forward actions
455 reply_forward (ReplyForwardAction action, ModestWindow *win)
457 TnyList *header_list;
458 guint reply_forward_type;
461 GetMsgAsyncHelper *helper;
462 ReplyForwardHelper *rf_helper;
464 g_return_if_fail (MODEST_IS_WINDOW(win));
466 header_list = get_selected_headers (win);
470 reply_forward_type = modest_conf_get_int (modest_runtime_get_conf (),
471 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
473 /* We assume that we can only select messages of the
474 same folder and that we reply all of them from the
475 same account. In fact the interface currently only
476 allows single selection */
479 rf_helper = g_slice_new0 (ReplyForwardHelper);
480 rf_helper->reply_forward_type = reply_forward_type;
481 rf_helper->action = action;
483 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
484 if (!rf_helper->account_name)
485 rf_helper->account_name =
486 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
488 helper = g_slice_new0 (GetMsgAsyncHelper);
489 helper->window = win;
490 helper->func = reply_forward_func;
491 helper->iter = tny_list_create_iterator (header_list);
492 helper->user_data = rf_helper;
494 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
496 msg = modest_msg_view_window_get_message(MODEST_MSG_VIEW_WINDOW(win));
498 g_printerr ("modest: no message found\n");
501 reply_forward_func (msg, helper);
503 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
504 folder = tny_header_get_folder (header);
506 /* The callback will call it per each header */
507 tny_folder_get_msg_async (folder, header, get_msg_cb, helper);
508 g_object_unref (G_OBJECT (folder));
510 g_printerr ("modest: no folder for header\n");
513 g_object_unref (G_OBJECT (header));
519 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
521 g_return_if_fail (MODEST_IS_WINDOW(win));
523 reply_forward (ACTION_REPLY, win);
527 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
529 g_return_if_fail (MODEST_IS_WINDOW(win));
531 reply_forward (ACTION_FORWARD, win);
535 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
537 g_return_if_fail (MODEST_IS_WINDOW(win));
539 reply_forward (ACTION_REPLY_TO_ALL, win);
543 modest_ui_actions_on_next (GtkAction *action,
544 ModestWindow *window)
546 if (MODEST_IS_MAIN_WINDOW (window)) {
547 GtkWidget *header_view;
549 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
550 MODEST_WIDGET_TYPE_HEADER_VIEW);
554 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
555 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
556 modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (window));
558 g_return_if_reached ();
563 modest_ui_actions_on_prev (GtkAction *action,
564 ModestWindow *window)
566 g_return_if_fail (MODEST_IS_WINDOW(window));
568 if (MODEST_IS_MAIN_WINDOW (window)) {
569 GtkWidget *header_view;
570 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
571 MODEST_WIDGET_TYPE_HEADER_VIEW);
575 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
576 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
577 modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window));
579 g_return_if_reached ();
585 action_send (const gchar* account_name)
587 TnyAccount *tny_account;
588 ModestTnySendQueue *send_queue;
590 g_return_val_if_fail (account_name, FALSE);
593 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
595 TNY_ACCOUNT_TYPE_TRANSPORT);
597 g_printerr ("modest: cannot get tny transport account for %s\n", account_name);
600 send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account));
602 g_object_unref (G_OBJECT(tny_account));
603 g_printerr ("modest: cannot get send queue for %s\n", account_name);
607 //modest_tny_send_queue_flush (send_queue);
609 g_object_unref (G_OBJECT(send_queue));
610 g_object_unref (G_OBJECT(tny_account));
617 action_receive (const gchar* account_name)
619 TnyAccount *tny_account;
620 ModestMailOperation *mail_op;
622 g_return_val_if_fail (account_name, FALSE);
625 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
627 TNY_ACCOUNT_TYPE_STORE);
629 g_printerr ("modest: cannot get tny store account for %s\n", account_name);
633 /* Create the mail operation */
634 mail_op = modest_mail_operation_new ();
635 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
636 modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account));
638 g_object_unref (G_OBJECT(tny_account));
639 g_object_unref (G_OBJECT (mail_op));
647 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
652 g_strdup(modest_window_get_active_account(MODEST_WINDOW(win)));
654 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
656 g_printerr ("modest: cannot get account\n");
660 if (!action_send(account_name))
661 g_printerr ("modest: failed to send\n");
662 if (!action_receive(account_name))
663 g_printerr ("modest: failed to receive\n");
669 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
672 GtkWidget *header_view;
674 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
676 header_view = modest_main_window_get_child_widget (main_window,
677 MODEST_WIDGET_TYPE_HEADER_VIEW);
681 conf = modest_runtime_get_conf ();
683 /* what is saved/restored is depending on the style; thus; we save with
684 * old style, then update the style, and restore for this new style
686 modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view");
688 if (modest_header_view_get_style
689 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
690 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
691 MODEST_HEADER_VIEW_STYLE_TWOLINES);
693 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
694 MODEST_HEADER_VIEW_STYLE_DETAILS);
696 modest_widget_memory_restore (conf, G_OBJECT(header_view),
703 * Marks a message as read and passes it to the msg preview widget
706 read_msg_func (gpointer data, gpointer user_data)
710 GetMsgAsyncHelper *helper;
711 TnyHeaderFlags header_flags;
712 GtkWidget *msg_preview;
714 msg = TNY_MSG (data);
715 helper = (GetMsgAsyncHelper *) user_data;
717 msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
718 MODEST_WIDGET_TYPE_MSG_PREVIEW);
722 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
723 header_flags = tny_header_get_flags (header);
724 tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
725 g_object_unref (G_OBJECT (header));
727 /* Set message on msg view */
728 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg);
732 * This function is a generic handler for the tny_folder_get_msg_async
733 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
734 * contains a user provided function that is called inside this
735 * method. This will allow us to use this callback in many different
736 * places. This callback performs the common actions for the
737 * get_msg_async call, more specific actions will be done by the user
741 get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
743 GetMsgAsyncHelper *helper;
745 helper = (GetMsgAsyncHelper *) user_data;
747 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
748 modest_ui_actions_on_item_not_found (NULL,
749 MODEST_ITEM_TYPE_MESSAGE,
754 /* Call user function */
755 helper->func (msg, user_data);
757 /* Process next element (if exists) */
758 tny_iterator_next (helper->iter);
759 if (tny_iterator_is_done (helper->iter)) {
761 headers = tny_iterator_get_list (helper->iter);
763 g_object_unref (G_OBJECT (headers));
764 g_object_unref (G_OBJECT (helper->iter));
765 g_slice_free (GetMsgAsyncHelper, helper);
768 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
769 tny_folder_get_msg_async (folder, header,
771 g_object_unref (G_OBJECT(header));
776 modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
778 ModestMainWindow *main_window)
781 GetMsgAsyncHelper *helper;
784 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
786 /* when there's no header, clear the msgview */
788 GtkWidget *msg_preview;
790 /* Clear msg preview if exists */
791 msg_preview = modest_main_window_get_child_widget(main_window,
792 MODEST_WIDGET_TYPE_MSG_PREVIEW);
795 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
799 /* Update Main window title */
800 if (GTK_WIDGET_HAS_FOCUS (header_view)) {
801 const gchar *subject = tny_header_get_subject (header);
802 if (subject && strcmp (subject, ""))
803 gtk_window_set_title (GTK_WINDOW (main_window), subject);
805 gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject"));
809 list = tny_simple_list_new ();
810 tny_list_prepend (list, G_OBJECT (header));
812 /* Fill helper data */
813 helper = g_slice_new0 (GetMsgAsyncHelper);
814 helper->window = MODEST_WINDOW (main_window);
815 helper->iter = tny_list_create_iterator (list);
816 helper->func = read_msg_func;
818 folder = tny_header_get_folder (TNY_HEADER(header));
820 tny_folder_get_msg_async (TNY_FOLDER(folder),
825 g_object_unref (G_OBJECT (folder));
831 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
832 ModestMainWindow *main_window)
834 ModestWindow *win = NULL;
835 TnyFolder *folder = NULL;
837 ModestWindowMgr *mgr;
839 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
844 folder = tny_header_get_folder (header);
846 g_printerr ("modest: cannot get folder for header\n");
850 /* FIXME: make async?; check error */
851 msg = tny_folder_get_msg (folder, header, NULL);
853 g_printerr ("modest: cannot get msg for header\n");
857 /* Look if we already have a message view for that header */
858 mgr = modest_runtime_get_window_mgr ();
859 win = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header));
861 /* If not, create a new window */
865 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
867 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
869 win = modest_msg_view_window_new (msg, account);
870 modest_window_mgr_register_window (mgr, win);
872 gtk_window_set_transient_for (GTK_WINDOW (win),
873 GTK_WINDOW (main_window));
876 gtk_widget_show_all (GTK_WIDGET(win));
878 g_object_unref (G_OBJECT (msg));
881 g_object_unref (G_OBJECT (folder));
885 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
888 ModestMainWindow *main_window)
891 GtkWidget *header_view;
893 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
895 header_view = modest_main_window_get_child_widget(main_window,
896 MODEST_WIDGET_TYPE_HEADER_VIEW);
900 conf = modest_runtime_get_conf ();
902 if (TNY_IS_FOLDER (folder)) {
903 if (!selected) { /* the folder was unselected; save it's settings */
904 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
905 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
907 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), folder);
908 modest_widget_memory_restore (conf, G_OBJECT(header_view),
915 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
922 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
924 if (g_main_depth > 0)
925 gdk_threads_enter ();
926 online = tny_device_is_online (modest_runtime_get_device());
929 /* already online -- the item is simply not there... */
930 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
934 _("The %s you selected cannot be found"),
936 gtk_dialog_run (GTK_DIALOG(dialog));
938 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
946 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
947 "Do you want to get online?"), item);
948 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
949 gtk_label_new (txt), FALSE, FALSE, 0);
950 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
953 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
954 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
955 // tny_device_force_online (modest_runtime_get_device());
958 gtk_widget_destroy (dialog);
959 if (g_main_depth > 0)
960 gdk_threads_leave ();
964 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
967 g_message ("%s %s", __FUNCTION__, link);
972 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
975 modest_platform_activate_uri (link);
979 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
982 modest_platform_show_uri_popup (link);
986 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
989 g_message (__FUNCTION__);
994 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
995 const gchar *address,
998 g_message ("%s %s", __FUNCTION__, address);
1002 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1004 TnyTransportAccount *transport_account;
1005 ModestMailOperation *mail_operation;
1007 gchar *account_name, *from;
1008 ModestAccountMgr *account_mgr;
1010 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1012 data = modest_msg_edit_window_get_msg_data (edit_window);
1014 /* FIXME: Code added just for testing. The final version will
1015 use the send queue provided by tinymail and some
1017 account_mgr = modest_runtime_get_account_mgr();
1018 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1020 account_name = modest_account_mgr_get_default_account (account_mgr);
1021 if (!account_name) {
1022 g_printerr ("modest: no account found\n");
1023 modest_msg_edit_window_free_msg_data (edit_window, data);
1027 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
1028 (modest_runtime_get_account_store(),
1030 TNY_ACCOUNT_TYPE_TRANSPORT));
1031 if (!transport_account) {
1032 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1033 g_free (account_name);
1034 modest_msg_edit_window_free_msg_data (edit_window, data);
1037 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1039 /* Create the mail operation */
1040 mail_operation = modest_mail_operation_new ();
1041 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1043 modest_mail_operation_send_new_mail (mail_operation,
1053 data->priority_flags);
1056 g_free (account_name);
1057 g_object_unref (G_OBJECT (transport_account));
1058 g_object_unref (G_OBJECT (mail_operation));
1060 modest_msg_edit_window_free_msg_data (edit_window, data);
1062 /* Save settings and close the window */
1063 gtk_widget_destroy (GTK_WIDGET (edit_window));
1067 modest_ui_actions_on_toggle_bold (GtkToggleAction *action,
1068 ModestMsgEditWindow *window)
1070 ModestMsgEditFormatState *format_state = NULL;
1072 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1073 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1075 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1078 format_state = modest_msg_edit_window_get_format_state (window);
1079 g_return_if_fail (format_state != NULL);
1081 format_state->bold = gtk_toggle_action_get_active (action);
1082 modest_msg_edit_window_set_format_state (window, format_state);
1083 g_free (format_state);
1088 modest_ui_actions_on_toggle_italics (GtkToggleAction *action,
1089 ModestMsgEditWindow *window)
1091 ModestMsgEditFormatState *format_state = NULL;
1093 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1094 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1096 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1099 format_state = modest_msg_edit_window_get_format_state (window);
1100 g_return_if_fail (format_state != NULL);
1102 format_state->italics = gtk_toggle_action_get_active (action);
1103 modest_msg_edit_window_set_format_state (window, format_state);
1104 g_free (format_state);
1109 modest_ui_actions_on_toggle_bullets (GtkToggleAction *action,
1110 ModestMsgEditWindow *window)
1112 ModestMsgEditFormatState *format_state = NULL;
1114 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1115 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1117 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1120 format_state = modest_msg_edit_window_get_format_state (window);
1121 g_return_if_fail (format_state != NULL);
1123 format_state->bullet = gtk_toggle_action_get_active (action);
1124 modest_msg_edit_window_set_format_state (window, format_state);
1125 g_free (format_state);
1130 modest_ui_actions_on_change_justify (GtkRadioAction *action,
1131 GtkRadioAction *selected,
1132 ModestMsgEditWindow *window)
1134 ModestMsgEditFormatState *format_state = NULL;
1135 GtkJustification value;
1137 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1139 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1142 value = gtk_radio_action_get_current_value (selected);
1144 format_state = modest_msg_edit_window_get_format_state (window);
1145 g_return_if_fail (format_state != NULL);
1147 format_state->justification = value;
1148 modest_msg_edit_window_set_format_state (window, format_state);
1149 g_free (format_state);
1153 modest_ui_actions_on_select_editor_color (GtkAction *action,
1154 ModestMsgEditWindow *window)
1156 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1157 g_return_if_fail (GTK_IS_ACTION (action));
1159 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1162 modest_msg_edit_window_select_color (window);
1166 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
1167 ModestMsgEditWindow *window)
1169 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1170 g_return_if_fail (GTK_IS_ACTION (action));
1172 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1175 modest_msg_edit_window_select_background_color (window);
1179 modest_ui_actions_on_insert_image (GtkAction *action,
1180 ModestMsgEditWindow *window)
1182 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1183 g_return_if_fail (GTK_IS_ACTION (action));
1185 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1188 modest_msg_edit_window_insert_image (window);
1192 * Shows a dialog with an entry that asks for some text. The returned
1193 * value must be freed by the caller. The dialog window title will be
1197 ask_for_folder_name (GtkWindow *parent_window,
1200 GtkWidget *dialog, *entry;
1201 gchar *folder_name = NULL;
1203 /* Ask for folder name */
1204 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1208 GTK_RESPONSE_REJECT,
1210 GTK_RESPONSE_ACCEPT,
1212 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1213 gtk_label_new(title),
1216 entry = gtk_entry_new_with_max_length (40);
1217 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1221 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1223 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1224 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1226 gtk_widget_destroy (dialog);
1232 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1234 TnyFolderStore *parent_folder;
1235 GtkWidget *folder_view;
1237 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1239 folder_view = modest_main_window_get_child_widget (main_window,
1240 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1244 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1246 if (parent_folder) {
1249 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1250 _("Please enter a name for the new folder"));
1252 if (folder_name != NULL && strlen (folder_name) > 0) {
1253 TnyFolder *new_folder;
1254 ModestMailOperation *mail_op;
1256 mail_op = modest_mail_operation_new ();
1257 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1260 new_folder = modest_mail_operation_create_folder (mail_op,
1262 (const gchar *) folder_name);
1264 g_object_unref (new_folder);
1265 g_object_unref (mail_op);
1266 g_free (folder_name);
1268 g_object_unref (parent_folder);
1273 modest_ui_actions_on_rename_folder (GtkAction *action,
1274 ModestMainWindow *main_window)
1276 TnyFolderStore *folder;
1277 GtkWidget *folder_view;
1279 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1281 folder_view = modest_main_window_get_child_widget (main_window,
1282 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1286 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1288 if (folder && TNY_IS_FOLDER (folder)) {
1290 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1291 _("Please enter a new name for the folder"));
1293 if (folder_name != NULL && strlen (folder_name) > 0) {
1294 ModestMailOperation *mail_op;
1296 mail_op = modest_mail_operation_new ();
1297 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1300 modest_mail_operation_rename_folder (mail_op,
1301 TNY_FOLDER (folder),
1302 (const gchar *) folder_name);
1304 g_object_unref (mail_op);
1305 g_free (folder_name);
1307 g_object_unref (folder);
1312 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1314 TnyFolderStore *folder;
1315 ModestMailOperation *mail_op;
1316 GtkWidget *folder_view;
1318 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1320 folder_view = modest_main_window_get_child_widget (main_window,
1321 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1325 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1327 mail_op = modest_mail_operation_new ();
1328 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1330 modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
1332 g_object_unref (G_OBJECT (mail_op));
1333 g_object_unref (G_OBJECT (folder));
1337 modest_ui_actions_on_delete_folder (GtkAction *action,
1338 ModestMainWindow *main_window)
1340 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1342 delete_folder (main_window, FALSE);
1346 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1348 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1350 delete_folder (main_window, TRUE);
1354 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1355 const gchar* account_name,
1359 ModestMainWindow *main_window)
1362 GtkWidget *dialog, *entry, *remember_pass_check;
1364 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1368 GTK_RESPONSE_REJECT,
1370 GTK_RESPONSE_ACCEPT,
1372 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1374 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1375 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1379 entry = gtk_entry_new_with_max_length (40);
1380 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1381 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1383 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1386 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1387 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1390 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1392 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1393 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1400 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1405 gtk_widget_destroy (dialog);
1409 modest_ui_actions_on_cut (GtkAction *action,
1410 ModestWindow *window)
1412 GtkWidget *focused_widget;
1414 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1415 if (GTK_IS_EDITABLE (focused_widget)) {
1416 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
1417 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1418 GtkTextBuffer *buffer;
1419 GtkClipboard *clipboard;
1421 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1422 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1423 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
1428 modest_ui_actions_on_copy (GtkAction *action,
1429 ModestWindow *window)
1431 GtkClipboard *clipboard;
1432 GtkWidget *focused_widget;
1434 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1435 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1436 if (GTK_IS_LABEL (focused_widget)) {
1437 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
1438 } else if (GTK_IS_EDITABLE (focused_widget)) {
1439 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
1440 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1441 GtkTextBuffer *buffer;
1443 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1444 gtk_text_buffer_copy_clipboard (buffer, clipboard);
1449 modest_ui_actions_on_paste (GtkAction *action,
1450 ModestWindow *window)
1452 GtkWidget *focused_widget;
1454 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1455 if (GTK_IS_EDITABLE (focused_widget)) {
1456 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
1457 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1458 GtkTextBuffer *buffer;
1459 GtkClipboard *clipboard;
1461 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1462 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1463 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
1468 modest_ui_actions_on_select_all (GtkAction *action,
1469 ModestWindow *window)
1471 GtkWidget *focused_widget;
1473 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1474 if (GTK_IS_LABEL (focused_widget)) {
1475 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
1476 } else if (GTK_IS_EDITABLE (focused_widget)) {
1477 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
1478 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1479 GtkTextBuffer *buffer;
1480 GtkTextIter start, end;
1482 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1483 gtk_text_buffer_get_start_iter (buffer, &start);
1484 gtk_text_buffer_get_end_iter (buffer, &end);
1485 gtk_text_buffer_select_range (buffer, &start, &end);
1490 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
1491 GtkRadioAction *selected,
1492 ModestWindow *window)
1496 value = gtk_radio_action_get_current_value (selected);
1497 if (MODEST_IS_WINDOW (window)) {
1498 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
1502 void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action,
1503 GtkRadioAction *selected,
1504 ModestWindow *window)
1506 TnyHeaderFlags flags;
1507 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1509 flags = gtk_radio_action_get_current_value (selected);
1510 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags);
1515 modest_ui_actions_on_zoom_plus (GtkAction *action,
1516 ModestWindow *window)
1518 g_return_if_fail (MODEST_IS_WINDOW (window));
1520 modest_window_zoom_plus (MODEST_WINDOW (window));
1524 modest_ui_actions_on_zoom_minus (GtkAction *action,
1525 ModestWindow *window)
1527 g_return_if_fail (MODEST_IS_WINDOW (window));
1529 modest_window_zoom_minus (MODEST_WINDOW (window));
1533 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
1534 ModestWindow *window)
1536 ModestWindowMgr *mgr;
1537 gboolean fullscreen, active;
1538 g_return_if_fail (MODEST_IS_WINDOW (window));
1540 mgr = modest_runtime_get_window_mgr ();
1542 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
1543 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1545 if (active != fullscreen) {
1546 modest_window_mgr_set_fullscreen_mode (mgr, active);
1547 gtk_window_present (GTK_WINDOW (window));
1552 modest_ui_actions_on_change_fullscreen (GtkAction *action,
1553 ModestWindow *window)
1555 ModestWindowMgr *mgr;
1556 gboolean fullscreen;
1558 g_return_if_fail (MODEST_IS_WINDOW (window));
1560 mgr = modest_runtime_get_window_mgr ();
1561 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1562 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
1564 gtk_window_present (GTK_WINDOW (window));
1568 modest_ui_actions_message_details_cb (gpointer msg_data,
1569 gpointer helper_data)
1572 TnyMsg *msg = (TnyMsg *) msg_data;
1574 GetMsgAsyncHelper *helper = (GetMsgAsyncHelper *) helper_data;
1576 header = tny_msg_get_header (msg);
1578 dialog = modest_msg_view_details_dialog_new (GTK_WINDOW (helper->window), header);
1579 g_object_unref (header);
1580 gtk_widget_show_all (dialog);
1582 gtk_dialog_run (GTK_DIALOG (dialog));
1584 gtk_widget_destroy (dialog);
1588 modest_ui_actions_on_message_details (GtkAction *action,
1591 TnyList * headers_list;
1592 GetMsgAsyncHelper *helper;
1594 headers_list = get_selected_headers (win);
1598 helper = g_slice_new0 (GetMsgAsyncHelper);
1599 helper->window = win;
1600 helper->func = modest_ui_actions_message_details_cb;
1601 helper->iter = tny_list_create_iterator (headers_list);
1602 helper->user_data = NULL;
1604 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1607 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1611 modest_ui_actions_message_details_cb (msg, helper);
1614 /* here we should add an implementation to run the message details dialog
1615 from the main window */
1616 g_return_if_reached ();
1621 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
1622 ModestMsgEditWindow *window)
1624 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1626 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
1630 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
1631 ModestMsgEditWindow *window)
1633 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1635 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
1639 modest_ui_actions_toggle_folders_view (GtkAction *action,
1640 ModestMainWindow *main_window)
1644 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1646 conf = modest_runtime_get_conf ();
1648 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
1649 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
1651 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
1655 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
1656 ModestWindow *window)
1658 gboolean active, fullscreen = FALSE;
1659 ModestWindowMgr *mgr;
1661 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
1663 /* Check if we want to toggle the toolbar vuew in fullscreen
1665 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
1666 "ViewShowToolbarFullScreen")) {
1670 /* Toggle toolbar */
1671 mgr = modest_runtime_get_window_mgr ();
1672 modest_window_mgr_show_toolbars (mgr, active, fullscreen);
1676 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
1677 const gchar *display_name,
1680 /* Do not change the application name if the widget has not
1681 the focus. This callback could be called even if the folder
1682 view has not the focus, because the handled signal could be
1683 emitted when the folder view is redrawn */
1684 if (GTK_WIDGET_HAS_FOCUS (folder_view)) {
1686 gtk_window_set_title (window, display_name);
1688 gtk_window_set_title (window, " ");