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-details-dialog.h>
52 #include "modest-account-mgr-helpers.h"
53 #include "modest-mail-operation.h"
54 #include "modest-text-utils.h"
56 #ifdef MODEST_HAVE_EASYSETUP
57 #include "easysetup/modest-easysetup-wizard.h"
58 #endif /*MODEST_HAVE_EASYSETUP*/
60 #include <modest-widget-memory.h>
61 #include <tny-error.h>
62 #include <tny-simple-list.h>
63 #include <tny-msg-view.h>
64 #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);
92 static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title);
96 modest_ui_actions_on_about (GtkAction *action, ModestWindow *win)
99 const gchar *authors[] = {
100 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
103 about = gtk_about_dialog_new ();
104 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
105 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
106 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
107 _("Copyright (c) 2006, Nokia Corporation\n"
108 "All rights reserved."));
109 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
110 _("a modest e-mail client\n\n"
111 "design and implementation: Dirk-Jan C. Binnema\n"
112 "contributions from the fine people at KernelConcepts and Igalia\n"
113 "uses the tinymail email framework written by Philip van Hoof"));
114 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
115 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
117 gtk_dialog_run (GTK_DIALOG (about));
118 gtk_widget_destroy(about);
123 get_selected_headers (ModestWindow *win)
125 if (MODEST_IS_MAIN_WINDOW(win)) {
126 GtkWidget *header_view;
128 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
129 MODEST_WIDGET_TYPE_HEADER_VIEW);
130 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
132 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
133 /* for MsgViewWindows, we simply return a list with one element */
136 TnyList *list = NULL;
138 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
140 header = tny_msg_get_header (msg);
141 list = tny_simple_list_new ();
142 tny_list_prepend (list, G_OBJECT(header));
143 g_object_unref (G_OBJECT(header));
152 modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
154 TnyList *header_list;
157 g_return_if_fail (MODEST_IS_WINDOW(win));
159 header_list = get_selected_headers (win);
162 iter = tny_list_create_iterator (header_list);
165 ModestMailOperation *mail_op;
167 header = TNY_HEADER (tny_iterator_get_current (iter));
168 /* TODO: thick grain mail operation involving
169 a list of objects. Composite pattern ??? */
170 /* TODO: add confirmation dialog */
171 mail_op = modest_mail_operation_new ();
172 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
175 /* Always delete. TODO: Move to trash still not supported */
176 modest_mail_operation_remove_msg (mail_op, header, FALSE);
179 g_object_unref (G_OBJECT (mail_op));
180 g_object_unref (G_OBJECT (header));
182 tny_iterator_next (iter);
184 } while (!tny_iterator_is_done (iter));
187 g_object_unref (G_OBJECT (iter));
190 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
191 gtk_widget_destroy (GTK_WIDGET(win));
197 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
203 modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win)
205 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
206 gtk_widget_destroy (GTK_WIDGET (win));
207 } else if (MODEST_IS_WINDOW (win)) {
208 gtk_widget_destroy (GTK_WIDGET (win));
210 g_return_if_reached ();
215 modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win)
217 GtkClipboard *clipboard = NULL;
218 gchar *selection = NULL;
220 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
221 selection = gtk_clipboard_wait_for_text (clipboard);
223 modest_address_book_add_address (selection);
228 modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win)
231 /* This is currently only implemented for Maemo,
232 * because it requires a providers preset file which is not publically available.
234 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
235 GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr());
236 gboolean accounts_exist = account_names != NULL;
237 g_slist_free (account_names);
239 /* To test, while modest_account_mgr_account_names() is broken: accounts_exist = TRUE; */
240 if (!accounts_exist) {
241 /* If there are no accounts yet, just show the easy-setup wizard, as per the UI spec: */
242 ModestEasysetupWizardDialog *wizard = modest_easysetup_wizard_dialog_new ();
243 gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
244 gtk_dialog_run (GTK_DIALOG (wizard));
245 gtk_widget_destroy (GTK_WIDGET (wizard));
247 /* Show the list of accounts: */
248 GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ());
249 gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win));
250 gtk_dialog_run (account_win);
251 gtk_widget_destroy (GTK_WIDGET(account_win));
254 GtkWidget *dialog, *label;
256 /* Create the widgets */
258 dialog = gtk_dialog_new_with_buttons ("Message",
260 GTK_DIALOG_DESTROY_WITH_PARENT,
264 label = gtk_label_new ("Hello World!");
266 /* Ensure that the dialog box is destroyed when the user responds. */
268 g_signal_connect_swapped (dialog, "response",
269 G_CALLBACK (gtk_widget_destroy),
272 /* Add the label, and show everything we've added to the dialog. */
274 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
276 gtk_widget_show_all (dialog);
277 #endif /* MODEST_PLATFORM_MAEMO */
281 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
283 ModestWindow *msg_win;
285 TnyFolder *folder = NULL;
286 gchar *account_name = NULL;
287 gchar *from_str = NULL;
289 TnyAccount *account = NULL;
290 ModestWindowMgr *mgr;
292 account_name = g_strdup(modest_window_get_active_account (win));
294 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
296 g_printerr ("modest: no account found\n");
300 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
302 TNY_ACCOUNT_TYPE_STORE);
304 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
308 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
310 g_printerr ("modest: failed get from string for '%s'\n", account_name);
314 msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL);
316 g_printerr ("modest: failed to create new msg\n");
320 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
322 g_printerr ("modest: failed to find Drafts folder\n");
326 tny_folder_add_msg (folder, msg, &err);
328 g_printerr ("modest: error adding msg to Drafts folder: %s",
334 /* Create and register edit window */
335 msg_win = modest_msg_edit_window_new (msg, account_name);
336 mgr = modest_runtime_get_window_mgr ();
337 modest_window_mgr_register_window (mgr, msg_win);
340 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
342 gtk_widget_show_all (GTK_WIDGET (msg_win));
345 g_free (account_name);
348 g_object_unref (G_OBJECT(account));
350 g_object_unref (G_OBJECT(msg));
352 g_object_unref (G_OBJECT(folder));
357 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
359 modest_runtime_not_implemented (GTK_WINDOW(win)); /* FIXME */
365 reply_forward_func (gpointer data, gpointer user_data)
367 TnyMsg *msg, *new_msg;
368 GetMsgAsyncHelper *helper;
369 ReplyForwardHelper *rf_helper;
370 ModestWindow *msg_win;
371 ModestEditType edit_type;
374 TnyFolder *folder = NULL;
375 TnyAccount *account = NULL;
376 ModestWindowMgr *mgr;
378 msg = TNY_MSG (data);
379 helper = (GetMsgAsyncHelper *) user_data;
380 rf_helper = (ReplyForwardHelper *) helper->user_data;
382 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
383 rf_helper->account_name);
384 /* Create reply mail */
385 switch (rf_helper->action) {
388 modest_tny_msg_create_reply_msg (msg, from,
389 rf_helper->reply_forward_type,
390 MODEST_TNY_MSG_REPLY_MODE_SENDER);
392 case ACTION_REPLY_TO_ALL:
394 modest_tny_msg_create_reply_msg (msg, from, rf_helper->reply_forward_type,
395 MODEST_TNY_MSG_REPLY_MODE_ALL);
396 edit_type = MODEST_EDIT_TYPE_REPLY;
400 modest_tny_msg_create_forward_msg (msg, from, rf_helper->reply_forward_type);
401 edit_type = MODEST_EDIT_TYPE_FORWARD;
404 g_return_if_reached ();
409 g_printerr ("modest: failed to create message\n");
413 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
414 rf_helper->account_name,
415 TNY_ACCOUNT_TYPE_STORE);
417 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
421 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
423 g_printerr ("modest: failed to find Drafts folder\n");
427 tny_folder_add_msg (folder, msg, &err);
429 g_printerr ("modest: error adding msg to Drafts folder: %s",
435 /* Create and register the windows */
436 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
437 mgr = modest_runtime_get_window_mgr ();
438 modest_window_mgr_register_window (mgr, msg_win);
440 /* Show edit window */
441 gtk_widget_show_all (GTK_WIDGET (msg_win));
445 g_object_unref (G_OBJECT (new_msg));
447 g_object_unref (G_OBJECT (folder));
449 g_object_unref (G_OBJECT (account));
451 g_free (rf_helper->account_name);
452 g_slice_free (ReplyForwardHelper, rf_helper);
455 * Common code for the reply and forward actions
458 reply_forward (ReplyForwardAction action, ModestWindow *win)
460 TnyList *header_list;
461 guint reply_forward_type;
464 GetMsgAsyncHelper *helper;
465 ReplyForwardHelper *rf_helper;
467 g_return_if_fail (MODEST_IS_WINDOW(win));
469 header_list = get_selected_headers (win);
473 reply_forward_type = modest_conf_get_int (modest_runtime_get_conf (),
474 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
476 /* We assume that we can only select messages of the
477 same folder and that we reply all of them from the
478 same account. In fact the interface currently only
479 allows single selection */
482 rf_helper = g_slice_new0 (ReplyForwardHelper);
483 rf_helper->reply_forward_type = reply_forward_type;
484 rf_helper->action = action;
486 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
487 if (!rf_helper->account_name)
488 rf_helper->account_name =
489 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
491 helper = g_slice_new0 (GetMsgAsyncHelper);
492 helper->window = win;
493 helper->func = reply_forward_func;
494 helper->iter = tny_list_create_iterator (header_list);
495 helper->user_data = rf_helper;
497 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
499 msg = modest_msg_view_window_get_message(MODEST_MSG_VIEW_WINDOW(win));
501 g_printerr ("modest: no message found\n");
504 reply_forward_func (msg, helper);
506 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
507 folder = tny_header_get_folder (header);
509 /* The callback will call it per each header */
510 tny_folder_get_msg_async (folder, header, get_msg_cb, NULL, helper);
511 g_object_unref (G_OBJECT (folder));
513 g_printerr ("modest: no folder for header\n");
516 g_object_unref (G_OBJECT (header));
522 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
524 g_return_if_fail (MODEST_IS_WINDOW(win));
526 reply_forward (ACTION_REPLY, win);
530 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
532 g_return_if_fail (MODEST_IS_WINDOW(win));
534 reply_forward (ACTION_FORWARD, win);
538 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
540 g_return_if_fail (MODEST_IS_WINDOW(win));
542 reply_forward (ACTION_REPLY_TO_ALL, win);
546 modest_ui_actions_on_next (GtkAction *action,
547 ModestWindow *window)
549 if (MODEST_IS_MAIN_WINDOW (window)) {
550 GtkWidget *header_view;
552 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
553 MODEST_WIDGET_TYPE_HEADER_VIEW);
557 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
558 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
559 modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (window));
561 g_return_if_reached ();
566 modest_ui_actions_on_prev (GtkAction *action,
567 ModestWindow *window)
569 g_return_if_fail (MODEST_IS_WINDOW(window));
571 if (MODEST_IS_MAIN_WINDOW (window)) {
572 GtkWidget *header_view;
573 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
574 MODEST_WIDGET_TYPE_HEADER_VIEW);
578 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
579 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
580 modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window));
582 g_return_if_reached ();
587 modest_ui_actions_on_sort (GtkAction *action,
588 ModestWindow *window)
590 ModestWindowMgr *mgr;
592 g_return_if_fail (MODEST_IS_WINDOW(window));
594 /* Show sorting dialog */
595 mgr = modest_runtime_get_window_mgr ();
601 action_send (const gchar* account_name)
603 TnyAccount *tny_account;
604 ModestTnySendQueue *send_queue;
606 g_return_val_if_fail (account_name, FALSE);
609 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
611 TNY_ACCOUNT_TYPE_TRANSPORT);
613 g_printerr ("modest: cannot get tny transport account for %s\n", account_name);
616 send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account));
618 g_object_unref (G_OBJECT(tny_account));
619 g_printerr ("modest: cannot get send queue for %s\n", account_name);
623 //modest_tny_send_queue_flush (send_queue);
625 g_object_unref (G_OBJECT(send_queue));
626 g_object_unref (G_OBJECT(tny_account));
633 action_receive (const gchar* account_name)
635 TnyAccount *tny_account;
636 ModestMailOperation *mail_op;
638 g_return_val_if_fail (account_name, FALSE);
641 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
643 TNY_ACCOUNT_TYPE_STORE);
645 g_printerr ("modest: cannot get tny store account for %s\n", account_name);
649 /* Create the mail operation */
650 mail_op = modest_mail_operation_new ();
651 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
652 modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account));
654 g_object_unref (G_OBJECT(tny_account));
655 g_object_unref (G_OBJECT (mail_op));
663 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
668 g_message ("online? %s",
669 tny_device_is_online(modest_runtime_get_device()) ? "yes":"no");
672 g_strdup(modest_window_get_active_account(MODEST_WINDOW(win)));
674 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
676 g_printerr ("modest: cannot get account\n");
680 if (!action_send(account_name))
681 g_printerr ("modest: failed to send\n");
682 if (!action_receive(account_name))
683 g_printerr ("modest: failed to receive\n");
689 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
692 GtkWidget *header_view;
694 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
696 header_view = modest_main_window_get_child_widget (main_window,
697 MODEST_WIDGET_TYPE_HEADER_VIEW);
701 conf = modest_runtime_get_conf ();
703 /* what is saved/restored is depending on the style; thus; we save with
704 * old style, then update the style, and restore for this new style
706 modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view");
708 if (modest_header_view_get_style
709 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
710 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
711 MODEST_HEADER_VIEW_STYLE_TWOLINES);
713 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
714 MODEST_HEADER_VIEW_STYLE_DETAILS);
716 modest_widget_memory_restore (conf, G_OBJECT(header_view),
723 * Marks a message as read and passes it to the msg preview widget
726 read_msg_func (gpointer data, gpointer user_data)
730 GetMsgAsyncHelper *helper;
731 TnyHeaderFlags header_flags;
732 GtkWidget *msg_preview;
734 msg = TNY_MSG (data);
735 helper = (GetMsgAsyncHelper *) user_data;
737 msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
738 MODEST_WIDGET_TYPE_MSG_PREVIEW);
742 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
743 header_flags = tny_header_get_flags (header);
744 tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
745 g_object_unref (G_OBJECT (header));
747 /* Set message on msg view */
748 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg);
752 * This function is a generic handler for the tny_folder_get_msg_async
753 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
754 * contains a user provided function that is called inside this
755 * method. This will allow us to use this callback in many different
756 * places. This callback performs the common actions for the
757 * get_msg_async call, more specific actions will be done by the user
761 get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
763 GetMsgAsyncHelper *helper;
765 helper = (GetMsgAsyncHelper *) user_data;
767 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
768 modest_ui_actions_on_item_not_found (NULL,
769 MODEST_ITEM_TYPE_MESSAGE,
774 /* Call user function */
775 helper->func (msg, user_data);
777 /* Process next element (if exists) */
778 tny_iterator_next (helper->iter);
779 if (tny_iterator_is_done (helper->iter)) {
781 headers = tny_iterator_get_list (helper->iter);
783 g_object_unref (G_OBJECT (headers));
784 g_object_unref (G_OBJECT (helper->iter));
785 g_slice_free (GetMsgAsyncHelper, helper);
788 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
789 tny_folder_get_msg_async (folder, header,
790 get_msg_cb, NULL, helper);
791 g_object_unref (G_OBJECT(header));
796 modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
798 ModestMainWindow *main_window)
801 GetMsgAsyncHelper *helper;
804 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
806 /* when there's no header, clear the msgview */
808 GtkWidget *msg_preview;
810 /* Clear msg preview if exists */
811 msg_preview = modest_main_window_get_child_widget(main_window,
812 MODEST_WIDGET_TYPE_MSG_PREVIEW);
815 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
819 /* Update Main window title */
820 if (GTK_WIDGET_HAS_FOCUS (header_view)) {
821 const gchar *subject = tny_header_get_subject (header);
822 if (subject && strcmp (subject, ""))
823 gtk_window_set_title (GTK_WINDOW (main_window), subject);
825 gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject"));
829 list = tny_simple_list_new ();
830 tny_list_prepend (list, G_OBJECT (header));
832 /* Fill helper data */
833 helper = g_slice_new0 (GetMsgAsyncHelper);
834 helper->window = MODEST_WINDOW (main_window);
835 helper->iter = tny_list_create_iterator (list);
836 helper->func = read_msg_func;
838 folder = tny_header_get_folder (TNY_HEADER(header));
840 tny_folder_get_msg_async (TNY_FOLDER(folder),
845 g_object_unref (G_OBJECT (folder));
851 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
852 ModestMainWindow *main_window)
854 ModestWindow *win = NULL;
855 TnyFolder *folder = NULL;
857 ModestWindowMgr *mgr;
859 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
864 folder = tny_header_get_folder (header);
866 g_printerr ("modest: cannot get folder for header\n");
870 /* FIXME: make async?; check error */
871 msg = tny_folder_get_msg (folder, header, NULL);
873 g_printerr ("modest: cannot get msg for header\n");
877 /* Look if we already have a message view for that header */
878 mgr = modest_runtime_get_window_mgr ();
879 win = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header));
881 /* If not, create a new window */
885 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
887 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
889 win = modest_msg_view_window_new (msg, account);
890 modest_window_mgr_register_window (mgr, win);
892 gtk_window_set_transient_for (GTK_WINDOW (win),
893 GTK_WINDOW (main_window));
896 gtk_widget_show_all (GTK_WIDGET(win));
898 g_object_unref (G_OBJECT (msg));
901 g_object_unref (G_OBJECT (folder));
905 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
906 TnyFolderStore *folder_store,
908 ModestMainWindow *main_window)
911 GtkWidget *header_view;
913 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
915 header_view = modest_main_window_get_child_widget(main_window,
916 MODEST_WIDGET_TYPE_HEADER_VIEW);
920 conf = modest_runtime_get_conf ();
922 if (TNY_IS_FOLDER (folder_store)) {
924 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
927 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
928 TNY_FOLDER (folder_store));
929 modest_widget_memory_restore (conf, G_OBJECT(header_view),
932 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
933 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
935 } else if (TNY_IS_ACCOUNT (folder_store)) {
937 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
942 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
949 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
951 if (g_main_depth > 0)
952 gdk_threads_enter ();
953 online = tny_device_is_online (modest_runtime_get_device());
956 /* already online -- the item is simply not there... */
957 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
961 _("The %s you selected cannot be found"),
963 gtk_dialog_run (GTK_DIALOG(dialog));
965 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
973 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
974 "Do you want to get online?"), item);
975 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
976 gtk_label_new (txt), FALSE, FALSE, 0);
977 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
980 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
981 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
982 // tny_device_force_online (modest_runtime_get_device());
985 gtk_widget_destroy (dialog);
986 if (g_main_depth > 0)
987 gdk_threads_leave ();
991 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
994 g_message ("%s %s", __FUNCTION__, link);
999 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
1002 modest_platform_activate_uri (link);
1006 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
1009 modest_platform_show_uri_popup (link);
1013 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
1016 g_message (__FUNCTION__);
1021 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
1022 const gchar *address,
1025 g_message ("%s %s", __FUNCTION__, address);
1029 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1031 TnyTransportAccount *transport_account;
1032 ModestMailOperation *mail_operation;
1034 gchar *account_name, *from;
1035 ModestAccountMgr *account_mgr;
1037 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1039 data = modest_msg_edit_window_get_msg_data (edit_window);
1041 /* FIXME: Code added just for testing. The final version will
1042 use the send queue provided by tinymail and some
1044 account_mgr = modest_runtime_get_account_mgr();
1045 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1047 account_name = modest_account_mgr_get_default_account (account_mgr);
1048 if (!account_name) {
1049 g_printerr ("modest: no account found\n");
1050 modest_msg_edit_window_free_msg_data (edit_window, data);
1054 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
1055 (modest_runtime_get_account_store(),
1057 TNY_ACCOUNT_TYPE_TRANSPORT));
1058 if (!transport_account) {
1059 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1060 g_free (account_name);
1061 modest_msg_edit_window_free_msg_data (edit_window, data);
1064 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1066 /* Create the mail operation */
1067 mail_operation = modest_mail_operation_new ();
1068 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1070 modest_mail_operation_send_new_mail (mail_operation,
1080 data->priority_flags);
1083 g_free (account_name);
1084 g_object_unref (G_OBJECT (transport_account));
1085 g_object_unref (G_OBJECT (mail_operation));
1087 modest_msg_edit_window_free_msg_data (edit_window, data);
1089 /* Save settings and close the window */
1090 gtk_widget_destroy (GTK_WIDGET (edit_window));
1094 modest_ui_actions_on_toggle_bold (GtkToggleAction *action,
1095 ModestMsgEditWindow *window)
1097 ModestMsgEditFormatState *format_state = NULL;
1099 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1100 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1102 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1105 format_state = modest_msg_edit_window_get_format_state (window);
1106 g_return_if_fail (format_state != NULL);
1108 format_state->bold = gtk_toggle_action_get_active (action);
1109 modest_msg_edit_window_set_format_state (window, format_state);
1110 g_free (format_state);
1115 modest_ui_actions_on_toggle_italics (GtkToggleAction *action,
1116 ModestMsgEditWindow *window)
1118 ModestMsgEditFormatState *format_state = NULL;
1120 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1121 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1123 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1126 format_state = modest_msg_edit_window_get_format_state (window);
1127 g_return_if_fail (format_state != NULL);
1129 format_state->italics = gtk_toggle_action_get_active (action);
1130 modest_msg_edit_window_set_format_state (window, format_state);
1131 g_free (format_state);
1136 modest_ui_actions_on_toggle_bullets (GtkToggleAction *action,
1137 ModestMsgEditWindow *window)
1139 ModestMsgEditFormatState *format_state = NULL;
1141 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1142 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1144 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1147 format_state = modest_msg_edit_window_get_format_state (window);
1148 g_return_if_fail (format_state != NULL);
1150 format_state->bullet = gtk_toggle_action_get_active (action);
1151 modest_msg_edit_window_set_format_state (window, format_state);
1152 g_free (format_state);
1157 modest_ui_actions_on_change_justify (GtkRadioAction *action,
1158 GtkRadioAction *selected,
1159 ModestMsgEditWindow *window)
1161 ModestMsgEditFormatState *format_state = NULL;
1162 GtkJustification value;
1164 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1166 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1169 value = gtk_radio_action_get_current_value (selected);
1171 format_state = modest_msg_edit_window_get_format_state (window);
1172 g_return_if_fail (format_state != NULL);
1174 format_state->justification = value;
1175 modest_msg_edit_window_set_format_state (window, format_state);
1176 g_free (format_state);
1180 modest_ui_actions_on_select_editor_color (GtkAction *action,
1181 ModestMsgEditWindow *window)
1183 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1184 g_return_if_fail (GTK_IS_ACTION (action));
1186 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1189 modest_msg_edit_window_select_color (window);
1193 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
1194 ModestMsgEditWindow *window)
1196 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1197 g_return_if_fail (GTK_IS_ACTION (action));
1199 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1202 modest_msg_edit_window_select_background_color (window);
1206 modest_ui_actions_on_insert_image (GtkAction *action,
1207 ModestMsgEditWindow *window)
1209 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1210 g_return_if_fail (GTK_IS_ACTION (action));
1212 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1215 modest_msg_edit_window_insert_image (window);
1219 * Shows a dialog with an entry that asks for some text. The returned
1220 * value must be freed by the caller. The dialog window title will be
1224 ask_for_folder_name (GtkWindow *parent_window,
1227 GtkWidget *dialog, *entry;
1228 gchar *folder_name = NULL;
1230 /* Ask for folder name */
1231 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1235 GTK_RESPONSE_REJECT,
1237 GTK_RESPONSE_ACCEPT,
1239 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1240 gtk_label_new(title),
1243 entry = gtk_entry_new_with_max_length (40);
1244 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1248 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1250 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1251 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1253 gtk_widget_destroy (dialog);
1259 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1261 TnyFolderStore *parent_folder;
1262 GtkWidget *folder_view;
1264 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1266 folder_view = modest_main_window_get_child_widget (main_window,
1267 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1271 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1273 if (parent_folder) {
1274 gboolean finished = FALSE;
1276 gchar *folder_name = NULL, *suggested_name = NULL;
1278 /* Run the new folder dialog */
1280 result = modest_platform_run_new_folder_dialog (GTK_WINDOW (main_window),
1285 if (result == GTK_RESPONSE_REJECT) {
1288 ModestMailOperation *mail_op = modest_mail_operation_new ();
1289 TnyFolder *new_folder = NULL;
1291 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1294 new_folder = modest_mail_operation_create_folder (mail_op,
1296 (const gchar *) folder_name);
1298 g_object_unref (new_folder);
1302 /* /\* TODO: check error and follow proper actions *\/ */
1303 /* /\* suggested_name = X; *\/ */
1304 /* /\* Show error to the user *\/ */
1305 /* modest_platform_run_information_dialog (GTK_WINDOW (main_window), */
1306 /* MODEST_INFORMATION_CREATE_FOLDER); */
1308 g_object_unref (mail_op);
1310 g_free (folder_name);
1314 g_object_unref (parent_folder);
1319 modest_ui_actions_on_rename_folder (GtkAction *action,
1320 ModestMainWindow *main_window)
1322 TnyFolderStore *folder;
1323 GtkWidget *folder_view;
1325 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1327 folder_view = modest_main_window_get_child_widget (main_window,
1328 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1332 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1334 if (folder && TNY_IS_FOLDER (folder)) {
1336 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1337 _("Please enter a new name for the folder"));
1339 if (folder_name != NULL && strlen (folder_name) > 0) {
1340 ModestMailOperation *mail_op;
1342 mail_op = modest_mail_operation_new ();
1343 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1346 modest_mail_operation_rename_folder (mail_op,
1347 TNY_FOLDER (folder),
1348 (const gchar *) folder_name);
1350 g_object_unref (mail_op);
1351 g_free (folder_name);
1353 g_object_unref (folder);
1358 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1360 TnyFolderStore *folder;
1361 GtkWidget *folder_view;
1364 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1366 folder_view = modest_main_window_get_child_widget (main_window,
1367 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1371 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1374 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (main_window),
1375 MODEST_CONFIRMATION_DELETE_FOLDER,
1378 if (response == GTK_RESPONSE_OK) {
1379 ModestMailOperation *mail_op = modest_mail_operation_new ();
1381 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1383 modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
1385 /* Show error if happened */
1386 if (modest_mail_operation_get_error (mail_op))
1387 modest_platform_run_information_dialog (GTK_WINDOW (main_window),
1388 MODEST_INFORMATION_DELETE_FOLDER);
1390 g_object_unref (G_OBJECT (mail_op));
1393 g_object_unref (G_OBJECT (folder));
1397 modest_ui_actions_on_delete_folder (GtkAction *action,
1398 ModestMainWindow *main_window)
1400 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1402 delete_folder (main_window, FALSE);
1406 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1408 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1410 delete_folder (main_window, TRUE);
1414 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1415 const gchar* account_name,
1419 ModestMainWindow *main_window)
1422 GtkWidget *dialog, *entry, *remember_pass_check;
1424 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1428 GTK_RESPONSE_REJECT,
1430 GTK_RESPONSE_ACCEPT,
1432 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1434 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1435 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1439 entry = gtk_entry_new_with_max_length (40);
1440 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1441 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1443 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1446 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1447 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1450 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1452 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1453 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1460 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1465 gtk_widget_destroy (dialog);
1469 modest_ui_actions_on_cut (GtkAction *action,
1470 ModestWindow *window)
1472 GtkWidget *focused_widget;
1474 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1475 if (GTK_IS_EDITABLE (focused_widget)) {
1476 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
1477 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1478 GtkTextBuffer *buffer;
1479 GtkClipboard *clipboard;
1481 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1482 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1483 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
1488 modest_ui_actions_on_copy (GtkAction *action,
1489 ModestWindow *window)
1491 GtkClipboard *clipboard;
1492 GtkWidget *focused_widget;
1494 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1495 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1496 if (GTK_IS_LABEL (focused_widget)) {
1497 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
1498 } else if (GTK_IS_EDITABLE (focused_widget)) {
1499 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
1500 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1501 GtkTextBuffer *buffer;
1503 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1504 gtk_text_buffer_copy_clipboard (buffer, clipboard);
1509 modest_ui_actions_on_undo (GtkAction *action,
1510 ModestWindow *window)
1512 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
1513 modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
1515 g_return_if_reached ();
1520 modest_ui_actions_on_paste (GtkAction *action,
1521 ModestWindow *window)
1523 GtkWidget *focused_widget;
1525 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1526 if (GTK_IS_EDITABLE (focused_widget)) {
1527 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
1528 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1529 GtkTextBuffer *buffer;
1530 GtkClipboard *clipboard;
1532 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1533 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1534 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
1539 modest_ui_actions_on_select_all (GtkAction *action,
1540 ModestWindow *window)
1542 GtkWidget *focused_widget;
1544 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1545 if (GTK_IS_LABEL (focused_widget)) {
1546 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
1547 } else if (GTK_IS_EDITABLE (focused_widget)) {
1548 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
1549 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1550 GtkTextBuffer *buffer;
1551 GtkTextIter start, end;
1553 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1554 gtk_text_buffer_get_start_iter (buffer, &start);
1555 gtk_text_buffer_get_end_iter (buffer, &end);
1556 gtk_text_buffer_select_range (buffer, &start, &end);
1561 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
1562 GtkRadioAction *selected,
1563 ModestWindow *window)
1567 value = gtk_radio_action_get_current_value (selected);
1568 if (MODEST_IS_WINDOW (window)) {
1569 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
1573 void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action,
1574 GtkRadioAction *selected,
1575 ModestWindow *window)
1577 TnyHeaderFlags flags;
1578 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1580 flags = gtk_radio_action_get_current_value (selected);
1581 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags);
1584 void modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action,
1585 GtkRadioAction *selected,
1586 ModestWindow *window)
1590 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1592 file_format = gtk_radio_action_get_current_value (selected);
1593 modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (window), file_format);
1598 modest_ui_actions_on_zoom_plus (GtkAction *action,
1599 ModestWindow *window)
1601 g_return_if_fail (MODEST_IS_WINDOW (window));
1603 modest_window_zoom_plus (MODEST_WINDOW (window));
1607 modest_ui_actions_on_zoom_minus (GtkAction *action,
1608 ModestWindow *window)
1610 g_return_if_fail (MODEST_IS_WINDOW (window));
1612 modest_window_zoom_minus (MODEST_WINDOW (window));
1616 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
1617 ModestWindow *window)
1619 ModestWindowMgr *mgr;
1620 gboolean fullscreen, active;
1621 g_return_if_fail (MODEST_IS_WINDOW (window));
1623 mgr = modest_runtime_get_window_mgr ();
1625 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
1626 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1628 if (active != fullscreen) {
1629 modest_window_mgr_set_fullscreen_mode (mgr, active);
1630 gtk_window_present (GTK_WINDOW (window));
1635 modest_ui_actions_on_change_fullscreen (GtkAction *action,
1636 ModestWindow *window)
1638 ModestWindowMgr *mgr;
1639 gboolean fullscreen;
1641 g_return_if_fail (MODEST_IS_WINDOW (window));
1643 mgr = modest_runtime_get_window_mgr ();
1644 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1645 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
1647 gtk_window_present (GTK_WINDOW (window));
1651 * Show the header details in a ModestDetailsDialog widget
1654 show_header_details (TnyHeader *header,
1660 dialog = modest_details_dialog_new_with_header (window, header);
1663 gtk_widget_show_all (dialog);
1664 gtk_dialog_run (GTK_DIALOG (dialog));
1666 gtk_widget_destroy (dialog);
1670 * Show the folder details in a ModestDetailsDialog widget
1673 show_folder_details (TnyFolder *folder,
1679 dialog = modest_details_dialog_new_with_folder (window, folder);
1682 gtk_widget_show_all (dialog);
1683 gtk_dialog_run (GTK_DIALOG (dialog));
1685 gtk_widget_destroy (dialog);
1690 modest_ui_actions_on_details (GtkAction *action,
1693 TnyList * headers_list;
1697 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1700 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1704 headers_list = get_selected_headers (win);
1708 iter = tny_list_create_iterator (headers_list);
1710 header = TNY_HEADER (tny_iterator_get_current (iter));
1711 show_header_details (header, GTK_WINDOW (win));
1712 g_object_unref (header);
1714 g_object_unref (iter);
1716 } else if (MODEST_IS_MAIN_WINDOW (win)) {
1717 GtkWidget *folder_view, *header_view;
1719 /* Check which widget has the focus */
1720 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1721 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1722 if (gtk_widget_is_focus (folder_view)) {
1725 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1727 /* Show only when it's a folder */
1728 if (!folder || !TNY_IS_FOLDER (folder))
1731 show_folder_details (folder, GTK_WINDOW (win));
1734 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1735 MODEST_WIDGET_TYPE_HEADER_VIEW);
1736 if (!gtk_widget_is_focus (header_view))
1739 headers_list = get_selected_headers (win);
1743 iter = tny_list_create_iterator (headers_list);
1744 while (!tny_iterator_is_done (iter)) {
1746 header = TNY_HEADER (tny_iterator_get_current (iter));
1747 show_header_details (header, GTK_WINDOW (win));
1748 g_object_unref (header);
1750 tny_iterator_next (iter);
1752 g_object_unref (iter);
1758 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
1759 ModestMsgEditWindow *window)
1761 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1763 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
1767 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
1768 ModestMsgEditWindow *window)
1770 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1772 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
1776 modest_ui_actions_toggle_folders_view (GtkAction *action,
1777 ModestMainWindow *main_window)
1781 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1783 conf = modest_runtime_get_conf ();
1785 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
1786 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
1788 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
1792 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
1793 ModestWindow *window)
1795 gboolean active, fullscreen = FALSE;
1796 ModestWindowMgr *mgr;
1798 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
1800 /* Check if we want to toggle the toolbar vuew in fullscreen
1802 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
1803 "ViewShowToolbarFullScreen")) {
1807 /* Toggle toolbar */
1808 mgr = modest_runtime_get_window_mgr ();
1809 modest_window_mgr_show_toolbars (mgr, active, fullscreen);
1813 modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
1814 ModestMsgEditWindow *window)
1816 modest_msg_edit_window_select_font (window);
1820 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
1821 const gchar *display_name,
1824 /* Do not change the application name if the widget has not
1825 the focus. This callback could be called even if the folder
1826 view has not the focus, because the handled signal could be
1827 emitted when the folder view is redrawn */
1828 if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) {
1830 gtk_window_set_title (window, display_name);
1832 gtk_window_set_title (window, " ");
1837 modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *window)
1839 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1840 modest_msg_edit_window_select_contacts (window);