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>
65 typedef struct _GetMsgAsyncHelper {
72 typedef enum _ReplyForwardAction {
78 typedef struct _ReplyForwardHelper {
79 guint reply_forward_type;
80 ReplyForwardAction action;
85 static void reply_forward_func (gpointer data, gpointer user_data);
86 static void read_msg_func (gpointer data, gpointer user_data);
87 static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err,
89 static void reply_forward (ReplyForwardAction action, ModestWindow *win);
91 static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title);
95 modest_ui_actions_on_about (GtkAction *action, ModestWindow *win)
98 const gchar *authors[] = {
99 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
102 about = gtk_about_dialog_new ();
103 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
104 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
105 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
106 _("Copyright (c) 2006, Nokia Corporation\n"
107 "All rights reserved."));
108 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
109 _("a modest e-mail client\n\n"
110 "design and implementation: Dirk-Jan C. Binnema\n"
111 "contributions from the fine people at KernelConcepts and Igalia\n"
112 "uses the tinymail email framework written by Philip van Hoof"));
113 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
114 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
116 gtk_dialog_run (GTK_DIALOG (about));
117 gtk_widget_destroy(about);
122 get_selected_headers (ModestWindow *win)
124 if (MODEST_IS_MAIN_WINDOW(win)) {
125 GtkWidget *header_view;
127 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
128 MODEST_WIDGET_TYPE_HEADER_VIEW);
129 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
131 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
132 /* for MsgViewWindows, we simply return a list with one element */
135 TnyList *list = NULL;
137 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
139 header = tny_msg_get_header (msg);
140 list = tny_simple_list_new ();
141 tny_list_prepend (list, G_OBJECT(header));
142 g_object_unref (G_OBJECT(header));
151 modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
153 TnyList *header_list;
156 g_return_if_fail (MODEST_IS_WINDOW(win));
158 header_list = get_selected_headers (win);
161 iter = tny_list_create_iterator (header_list);
164 ModestMailOperation *mail_op;
166 header = TNY_HEADER (tny_iterator_get_current (iter));
167 /* TODO: thick grain mail operation involving
168 a list of objects. Composite pattern ??? */
169 /* TODO: add confirmation dialog */
170 mail_op = modest_mail_operation_new ();
171 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
174 /* Always delete. TODO: Move to trash still not supported */
175 modest_mail_operation_remove_msg (mail_op, header, FALSE);
178 g_object_unref (G_OBJECT (mail_op));
179 g_object_unref (G_OBJECT (header));
181 tny_iterator_next (iter);
183 } while (!tny_iterator_is_done (iter));
186 g_object_unref (G_OBJECT (iter));
189 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
190 gtk_widget_destroy (GTK_WIDGET(win));
196 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
202 modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win)
204 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
205 gtk_widget_destroy (GTK_WIDGET (win));
206 } else if (MODEST_IS_WINDOW (win)) {
207 gtk_widget_destroy (GTK_WIDGET (win));
209 g_return_if_reached ();
214 modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win)
216 GtkClipboard *clipboard = NULL;
217 gchar *selection = NULL;
219 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
220 selection = gtk_clipboard_wait_for_text (clipboard);
222 modest_address_book_add_address (selection);
227 modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win)
230 /* This is currently only implemented for Maemo,
231 * because it requires a providers preset file which is not publically available.
233 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
234 GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr());
235 gboolean accounts_exist = account_names != NULL;
236 g_slist_free (account_names);
238 /* To test, while modest_account_mgr_account_names() is broken: accounts_exist = TRUE; */
239 if (!accounts_exist) {
240 /* If there are no accounts yet, just show the easy-setup wizard, as per the UI spec: */
241 ModestEasysetupWizardDialog *wizard = modest_easysetup_wizard_dialog_new ();
242 gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
243 gtk_dialog_run (GTK_DIALOG (wizard));
244 gtk_widget_destroy (GTK_WIDGET (wizard));
246 /* Show the list of accounts: */
247 GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ());
248 gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win));
249 gtk_dialog_run (account_win);
250 gtk_widget_destroy (GTK_WIDGET(account_win));
253 GtkWidget *dialog, *label;
255 /* Create the widgets */
257 dialog = gtk_dialog_new_with_buttons ("Message",
259 GTK_DIALOG_DESTROY_WITH_PARENT,
263 label = gtk_label_new ("Hello World!");
265 /* Ensure that the dialog box is destroyed when the user responds. */
267 g_signal_connect_swapped (dialog, "response",
268 G_CALLBACK (gtk_widget_destroy),
271 /* Add the label, and show everything we've added to the dialog. */
273 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
275 gtk_widget_show_all (dialog);
276 #endif /* MODEST_PLATFORM_MAEMO */
280 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
282 ModestWindow *msg_win;
284 TnyFolder *folder = NULL;
285 gchar *account_name = NULL;
286 gchar *from_str = NULL;
288 TnyAccount *account = NULL;
289 ModestWindowMgr *mgr;
291 account_name = g_strdup(modest_window_get_active_account (win));
293 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
295 g_printerr ("modest: no account found\n");
299 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
301 TNY_ACCOUNT_TYPE_STORE);
303 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
307 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
309 g_printerr ("modest: failed get from string for '%s'\n", account_name);
313 msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL);
315 g_printerr ("modest: failed to create new msg\n");
319 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
321 g_printerr ("modest: failed to find Drafts folder\n");
325 tny_folder_add_msg (folder, msg, &err);
327 g_printerr ("modest: error adding msg to Drafts folder: %s",
333 /* Create and register edit window */
334 msg_win = modest_msg_edit_window_new (msg, account_name);
335 mgr = modest_runtime_get_window_mgr ();
336 modest_window_mgr_register_window (mgr, msg_win);
339 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
341 gtk_widget_show_all (GTK_WIDGET (msg_win));
344 g_free (account_name);
347 g_object_unref (G_OBJECT(account));
349 g_object_unref (G_OBJECT(msg));
351 g_object_unref (G_OBJECT(folder));
356 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
358 modest_runtime_not_implemented (GTK_WINDOW(win)); /* FIXME */
364 reply_forward_func (gpointer data, gpointer user_data)
366 TnyMsg *msg, *new_msg;
367 GetMsgAsyncHelper *helper;
368 ReplyForwardHelper *rf_helper;
369 ModestWindow *msg_win;
370 ModestEditType edit_type;
373 TnyFolder *folder = NULL;
374 TnyAccount *account = NULL;
375 ModestWindowMgr *mgr;
377 msg = TNY_MSG (data);
378 helper = (GetMsgAsyncHelper *) user_data;
379 rf_helper = (ReplyForwardHelper *) helper->user_data;
381 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
382 rf_helper->account_name);
383 /* Create reply mail */
384 switch (rf_helper->action) {
387 modest_tny_msg_create_reply_msg (msg, from,
388 rf_helper->reply_forward_type,
389 MODEST_TNY_MSG_REPLY_MODE_SENDER);
391 case ACTION_REPLY_TO_ALL:
393 modest_tny_msg_create_reply_msg (msg, from, rf_helper->reply_forward_type,
394 MODEST_TNY_MSG_REPLY_MODE_ALL);
395 edit_type = MODEST_EDIT_TYPE_REPLY;
399 modest_tny_msg_create_forward_msg (msg, from, rf_helper->reply_forward_type);
400 edit_type = MODEST_EDIT_TYPE_FORWARD;
403 g_return_if_reached ();
408 g_printerr ("modest: failed to create message\n");
412 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
413 rf_helper->account_name,
414 TNY_ACCOUNT_TYPE_STORE);
416 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
420 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
422 g_printerr ("modest: failed to find Drafts folder\n");
426 tny_folder_add_msg (folder, msg, &err);
428 g_printerr ("modest: error adding msg to Drafts folder: %s",
434 /* Create and register the windows */
435 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
436 mgr = modest_runtime_get_window_mgr ();
437 modest_window_mgr_register_window (mgr, msg_win);
439 /* Show edit window */
440 gtk_widget_show_all (GTK_WIDGET (msg_win));
444 g_object_unref (G_OBJECT (new_msg));
446 g_object_unref (G_OBJECT (folder));
448 g_object_unref (G_OBJECT (account));
450 g_free (rf_helper->account_name);
451 g_slice_free (ReplyForwardHelper, rf_helper);
454 * Common code for the reply and forward actions
457 reply_forward (ReplyForwardAction action, ModestWindow *win)
459 TnyList *header_list;
460 guint reply_forward_type;
463 GetMsgAsyncHelper *helper;
464 ReplyForwardHelper *rf_helper;
466 g_return_if_fail (MODEST_IS_WINDOW(win));
468 header_list = get_selected_headers (win);
472 reply_forward_type = modest_conf_get_int (modest_runtime_get_conf (),
473 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
475 /* We assume that we can only select messages of the
476 same folder and that we reply all of them from the
477 same account. In fact the interface currently only
478 allows single selection */
481 rf_helper = g_slice_new0 (ReplyForwardHelper);
482 rf_helper->reply_forward_type = reply_forward_type;
483 rf_helper->action = action;
485 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
486 if (!rf_helper->account_name)
487 rf_helper->account_name =
488 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
490 helper = g_slice_new0 (GetMsgAsyncHelper);
491 helper->window = win;
492 helper->func = reply_forward_func;
493 helper->iter = tny_list_create_iterator (header_list);
494 helper->user_data = rf_helper;
496 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
498 msg = modest_msg_view_window_get_message(MODEST_MSG_VIEW_WINDOW(win));
500 g_printerr ("modest: no message found\n");
503 reply_forward_func (msg, helper);
505 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
506 folder = tny_header_get_folder (header);
508 /* The callback will call it per each header */
509 tny_folder_get_msg_async (folder, header, get_msg_cb, NULL, helper);
510 g_object_unref (G_OBJECT (folder));
512 g_printerr ("modest: no folder for header\n");
515 g_object_unref (G_OBJECT (header));
521 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
523 g_return_if_fail (MODEST_IS_WINDOW(win));
525 reply_forward (ACTION_REPLY, win);
529 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
531 g_return_if_fail (MODEST_IS_WINDOW(win));
533 reply_forward (ACTION_FORWARD, win);
537 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
539 g_return_if_fail (MODEST_IS_WINDOW(win));
541 reply_forward (ACTION_REPLY_TO_ALL, win);
545 modest_ui_actions_on_next (GtkAction *action,
546 ModestWindow *window)
548 if (MODEST_IS_MAIN_WINDOW (window)) {
549 GtkWidget *header_view;
551 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
552 MODEST_WIDGET_TYPE_HEADER_VIEW);
556 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
557 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
558 modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (window));
560 g_return_if_reached ();
565 modest_ui_actions_on_prev (GtkAction *action,
566 ModestWindow *window)
568 g_return_if_fail (MODEST_IS_WINDOW(window));
570 if (MODEST_IS_MAIN_WINDOW (window)) {
571 GtkWidget *header_view;
572 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
573 MODEST_WIDGET_TYPE_HEADER_VIEW);
577 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
578 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
579 modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window));
581 g_return_if_reached ();
586 modest_ui_actions_on_sort (GtkAction *action,
587 ModestWindow *window)
589 g_return_if_fail (MODEST_IS_WINDOW(window));
590 /* FIXME: unimplemented */
595 action_send (const gchar* account_name)
597 TnyAccount *tny_account;
598 ModestTnySendQueue *send_queue;
600 g_return_val_if_fail (account_name, FALSE);
603 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
605 TNY_ACCOUNT_TYPE_TRANSPORT);
607 g_printerr ("modest: cannot get tny transport account for %s\n", account_name);
610 send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account));
612 g_object_unref (G_OBJECT(tny_account));
613 g_printerr ("modest: cannot get send queue for %s\n", account_name);
617 //modest_tny_send_queue_flush (send_queue);
619 g_object_unref (G_OBJECT(send_queue));
620 g_object_unref (G_OBJECT(tny_account));
627 action_receive (const gchar* account_name)
629 TnyAccount *tny_account;
630 ModestMailOperation *mail_op;
632 g_return_val_if_fail (account_name, FALSE);
635 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
637 TNY_ACCOUNT_TYPE_STORE);
639 g_printerr ("modest: cannot get tny store account for %s\n", account_name);
643 /* Create the mail operation */
644 mail_op = modest_mail_operation_new ();
645 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
646 modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account));
648 g_object_unref (G_OBJECT(tny_account));
649 g_object_unref (G_OBJECT (mail_op));
657 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
662 g_message ("online? %s",
663 tny_device_is_online(modest_runtime_get_device()) ? "yes":"no");
666 g_strdup(modest_window_get_active_account(MODEST_WINDOW(win)));
668 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
670 g_printerr ("modest: cannot get account\n");
674 if (!action_send(account_name))
675 g_printerr ("modest: failed to send\n");
676 if (!action_receive(account_name))
677 g_printerr ("modest: failed to receive\n");
683 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
686 GtkWidget *header_view;
688 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
690 header_view = modest_main_window_get_child_widget (main_window,
691 MODEST_WIDGET_TYPE_HEADER_VIEW);
695 conf = modest_runtime_get_conf ();
697 /* what is saved/restored is depending on the style; thus; we save with
698 * old style, then update the style, and restore for this new style
700 modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view");
702 if (modest_header_view_get_style
703 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
704 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
705 MODEST_HEADER_VIEW_STYLE_TWOLINES);
707 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
708 MODEST_HEADER_VIEW_STYLE_DETAILS);
710 modest_widget_memory_restore (conf, G_OBJECT(header_view),
717 * Marks a message as read and passes it to the msg preview widget
720 read_msg_func (gpointer data, gpointer user_data)
724 GetMsgAsyncHelper *helper;
725 TnyHeaderFlags header_flags;
726 GtkWidget *msg_preview;
728 msg = TNY_MSG (data);
729 helper = (GetMsgAsyncHelper *) user_data;
731 msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
732 MODEST_WIDGET_TYPE_MSG_PREVIEW);
736 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
737 header_flags = tny_header_get_flags (header);
738 tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
739 g_object_unref (G_OBJECT (header));
741 /* Set message on msg view */
742 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg);
746 * This function is a generic handler for the tny_folder_get_msg_async
747 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
748 * contains a user provided function that is called inside this
749 * method. This will allow us to use this callback in many different
750 * places. This callback performs the common actions for the
751 * get_msg_async call, more specific actions will be done by the user
755 get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
757 GetMsgAsyncHelper *helper;
759 helper = (GetMsgAsyncHelper *) user_data;
761 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
762 modest_ui_actions_on_item_not_found (NULL,
763 MODEST_ITEM_TYPE_MESSAGE,
768 /* Call user function */
769 helper->func (msg, user_data);
771 /* Process next element (if exists) */
772 tny_iterator_next (helper->iter);
773 if (tny_iterator_is_done (helper->iter)) {
775 headers = tny_iterator_get_list (helper->iter);
777 g_object_unref (G_OBJECT (headers));
778 g_object_unref (G_OBJECT (helper->iter));
779 g_slice_free (GetMsgAsyncHelper, helper);
782 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
783 tny_folder_get_msg_async (folder, header,
784 get_msg_cb, NULL, helper);
785 g_object_unref (G_OBJECT(header));
790 modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
792 ModestMainWindow *main_window)
795 GetMsgAsyncHelper *helper;
798 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
800 /* when there's no header, clear the msgview */
802 GtkWidget *msg_preview;
804 /* Clear msg preview if exists */
805 msg_preview = modest_main_window_get_child_widget(main_window,
806 MODEST_WIDGET_TYPE_MSG_PREVIEW);
809 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
813 /* Update Main window title */
814 if (GTK_WIDGET_HAS_FOCUS (header_view)) {
815 const gchar *subject = tny_header_get_subject (header);
816 if (subject && strcmp (subject, ""))
817 gtk_window_set_title (GTK_WINDOW (main_window), subject);
819 gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject"));
823 list = tny_simple_list_new ();
824 tny_list_prepend (list, G_OBJECT (header));
826 /* Fill helper data */
827 helper = g_slice_new0 (GetMsgAsyncHelper);
828 helper->window = MODEST_WINDOW (main_window);
829 helper->iter = tny_list_create_iterator (list);
830 helper->func = read_msg_func;
832 folder = tny_header_get_folder (TNY_HEADER(header));
834 tny_folder_get_msg_async (TNY_FOLDER(folder),
839 g_object_unref (G_OBJECT (folder));
845 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
846 ModestMainWindow *main_window)
848 ModestWindow *win = NULL;
849 TnyFolder *folder = NULL;
851 ModestWindowMgr *mgr;
853 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
858 folder = tny_header_get_folder (header);
860 g_printerr ("modest: cannot get folder for header\n");
864 /* FIXME: make async?; check error */
865 msg = tny_folder_get_msg (folder, header, NULL);
867 g_printerr ("modest: cannot get msg for header\n");
871 /* Look if we already have a message view for that header */
872 mgr = modest_runtime_get_window_mgr ();
873 win = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header));
875 /* If not, create a new window */
879 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
881 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
883 win = modest_msg_view_window_new (msg, account);
884 modest_window_mgr_register_window (mgr, win);
886 gtk_window_set_transient_for (GTK_WINDOW (win),
887 GTK_WINDOW (main_window));
890 gtk_widget_show_all (GTK_WIDGET(win));
892 g_object_unref (G_OBJECT (msg));
895 g_object_unref (G_OBJECT (folder));
899 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
900 TnyFolderStore *folder_store,
902 ModestMainWindow *main_window)
905 GtkWidget *header_view;
907 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
909 header_view = modest_main_window_get_child_widget(main_window,
910 MODEST_WIDGET_TYPE_HEADER_VIEW);
914 conf = modest_runtime_get_conf ();
916 if (TNY_IS_FOLDER (folder_store)) {
918 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
921 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
922 TNY_FOLDER (folder_store));
923 modest_widget_memory_restore (conf, G_OBJECT(header_view),
926 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
927 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
929 } else if (TNY_IS_ACCOUNT (folder_store)) {
931 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
936 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
943 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
945 if (g_main_depth > 0)
946 gdk_threads_enter ();
947 online = tny_device_is_online (modest_runtime_get_device());
950 /* already online -- the item is simply not there... */
951 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
955 _("The %s you selected cannot be found"),
957 gtk_dialog_run (GTK_DIALOG(dialog));
959 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
967 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
968 "Do you want to get online?"), item);
969 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
970 gtk_label_new (txt), FALSE, FALSE, 0);
971 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
974 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
975 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
976 // tny_device_force_online (modest_runtime_get_device());
979 gtk_widget_destroy (dialog);
980 if (g_main_depth > 0)
981 gdk_threads_leave ();
985 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
988 g_message ("%s %s", __FUNCTION__, link);
993 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
996 modest_platform_activate_uri (link);
1000 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
1003 modest_platform_show_uri_popup (link);
1007 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
1010 g_message (__FUNCTION__);
1015 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
1016 const gchar *address,
1019 g_message ("%s %s", __FUNCTION__, address);
1023 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1025 TnyTransportAccount *transport_account;
1026 ModestMailOperation *mail_operation;
1028 gchar *account_name, *from;
1029 ModestAccountMgr *account_mgr;
1031 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1033 data = modest_msg_edit_window_get_msg_data (edit_window);
1035 /* FIXME: Code added just for testing. The final version will
1036 use the send queue provided by tinymail and some
1038 account_mgr = modest_runtime_get_account_mgr();
1039 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1041 account_name = modest_account_mgr_get_default_account (account_mgr);
1042 if (!account_name) {
1043 g_printerr ("modest: no account found\n");
1044 modest_msg_edit_window_free_msg_data (edit_window, data);
1048 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_tny_account_by_account
1049 (modest_runtime_get_account_store(),
1051 TNY_ACCOUNT_TYPE_TRANSPORT));
1052 if (!transport_account) {
1053 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1054 g_free (account_name);
1055 modest_msg_edit_window_free_msg_data (edit_window, data);
1058 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1060 /* Create the mail operation */
1061 mail_operation = modest_mail_operation_new ();
1062 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1064 modest_mail_operation_send_new_mail (mail_operation,
1074 data->priority_flags);
1077 g_free (account_name);
1078 g_object_unref (G_OBJECT (transport_account));
1079 g_object_unref (G_OBJECT (mail_operation));
1081 modest_msg_edit_window_free_msg_data (edit_window, data);
1083 /* Save settings and close the window */
1084 gtk_widget_destroy (GTK_WIDGET (edit_window));
1088 modest_ui_actions_on_toggle_bold (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->bold = 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_italics (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->italics = 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_toggle_bullets (GtkToggleAction *action,
1131 ModestMsgEditWindow *window)
1133 ModestMsgEditFormatState *format_state = NULL;
1135 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1136 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1138 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1141 format_state = modest_msg_edit_window_get_format_state (window);
1142 g_return_if_fail (format_state != NULL);
1144 format_state->bullet = gtk_toggle_action_get_active (action);
1145 modest_msg_edit_window_set_format_state (window, format_state);
1146 g_free (format_state);
1151 modest_ui_actions_on_change_justify (GtkRadioAction *action,
1152 GtkRadioAction *selected,
1153 ModestMsgEditWindow *window)
1155 ModestMsgEditFormatState *format_state = NULL;
1156 GtkJustification value;
1158 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1160 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1163 value = gtk_radio_action_get_current_value (selected);
1165 format_state = modest_msg_edit_window_get_format_state (window);
1166 g_return_if_fail (format_state != NULL);
1168 format_state->justification = value;
1169 modest_msg_edit_window_set_format_state (window, format_state);
1170 g_free (format_state);
1174 modest_ui_actions_on_select_editor_color (GtkAction *action,
1175 ModestMsgEditWindow *window)
1177 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1178 g_return_if_fail (GTK_IS_ACTION (action));
1180 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1183 modest_msg_edit_window_select_color (window);
1187 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
1188 ModestMsgEditWindow *window)
1190 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1191 g_return_if_fail (GTK_IS_ACTION (action));
1193 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1196 modest_msg_edit_window_select_background_color (window);
1200 modest_ui_actions_on_insert_image (GtkAction *action,
1201 ModestMsgEditWindow *window)
1203 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1204 g_return_if_fail (GTK_IS_ACTION (action));
1206 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1209 modest_msg_edit_window_insert_image (window);
1213 * Shows a dialog with an entry that asks for some text. The returned
1214 * value must be freed by the caller. The dialog window title will be
1218 ask_for_folder_name (GtkWindow *parent_window,
1221 GtkWidget *dialog, *entry;
1222 gchar *folder_name = NULL;
1224 /* Ask for folder name */
1225 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1229 GTK_RESPONSE_REJECT,
1231 GTK_RESPONSE_ACCEPT,
1233 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1234 gtk_label_new(title),
1237 entry = gtk_entry_new_with_max_length (40);
1238 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1242 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1244 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1245 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1247 gtk_widget_destroy (dialog);
1253 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1255 TnyFolderStore *parent_folder;
1256 GtkWidget *folder_view;
1258 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1260 folder_view = modest_main_window_get_child_widget (main_window,
1261 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1265 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1267 if (parent_folder) {
1270 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1271 _("Please enter a name for the new folder"));
1273 if (folder_name != NULL && strlen (folder_name) > 0) {
1274 TnyFolder *new_folder;
1275 ModestMailOperation *mail_op;
1277 mail_op = modest_mail_operation_new ();
1278 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1281 new_folder = modest_mail_operation_create_folder (mail_op,
1283 (const gchar *) folder_name);
1285 g_object_unref (new_folder);
1286 g_object_unref (mail_op);
1287 g_free (folder_name);
1289 g_object_unref (parent_folder);
1294 modest_ui_actions_on_rename_folder (GtkAction *action,
1295 ModestMainWindow *main_window)
1297 TnyFolderStore *folder;
1298 GtkWidget *folder_view;
1300 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1302 folder_view = modest_main_window_get_child_widget (main_window,
1303 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1307 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1309 if (folder && TNY_IS_FOLDER (folder)) {
1311 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1312 _("Please enter a new name for the folder"));
1314 if (folder_name != NULL && strlen (folder_name) > 0) {
1315 ModestMailOperation *mail_op;
1317 mail_op = modest_mail_operation_new ();
1318 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1321 modest_mail_operation_rename_folder (mail_op,
1322 TNY_FOLDER (folder),
1323 (const gchar *) folder_name);
1325 g_object_unref (mail_op);
1326 g_free (folder_name);
1328 g_object_unref (folder);
1333 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1335 TnyFolderStore *folder;
1336 ModestMailOperation *mail_op;
1337 GtkWidget *folder_view;
1339 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1341 folder_view = modest_main_window_get_child_widget (main_window,
1342 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1346 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1348 mail_op = modest_mail_operation_new ();
1349 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1351 modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
1353 g_object_unref (G_OBJECT (mail_op));
1354 g_object_unref (G_OBJECT (folder));
1358 modest_ui_actions_on_delete_folder (GtkAction *action,
1359 ModestMainWindow *main_window)
1361 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1363 delete_folder (main_window, FALSE);
1367 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1369 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1371 delete_folder (main_window, TRUE);
1375 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1376 const gchar* account_name,
1380 ModestMainWindow *main_window)
1383 GtkWidget *dialog, *entry, *remember_pass_check;
1385 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1389 GTK_RESPONSE_REJECT,
1391 GTK_RESPONSE_ACCEPT,
1393 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1395 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1396 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1400 entry = gtk_entry_new_with_max_length (40);
1401 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1402 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1404 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1407 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1408 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1411 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1413 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1414 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1421 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1426 gtk_widget_destroy (dialog);
1430 modest_ui_actions_on_cut (GtkAction *action,
1431 ModestWindow *window)
1433 GtkWidget *focused_widget;
1435 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1436 if (GTK_IS_EDITABLE (focused_widget)) {
1437 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
1438 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1439 GtkTextBuffer *buffer;
1440 GtkClipboard *clipboard;
1442 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1443 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1444 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
1449 modest_ui_actions_on_copy (GtkAction *action,
1450 ModestWindow *window)
1452 GtkClipboard *clipboard;
1453 GtkWidget *focused_widget;
1455 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1456 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1457 if (GTK_IS_LABEL (focused_widget)) {
1458 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
1459 } else if (GTK_IS_EDITABLE (focused_widget)) {
1460 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
1461 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1462 GtkTextBuffer *buffer;
1464 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1465 gtk_text_buffer_copy_clipboard (buffer, clipboard);
1470 modest_ui_actions_on_undo (GtkAction *action,
1471 ModestWindow *window)
1473 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
1474 modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
1476 g_return_if_reached ();
1481 modest_ui_actions_on_paste (GtkAction *action,
1482 ModestWindow *window)
1484 GtkWidget *focused_widget;
1486 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1487 if (GTK_IS_EDITABLE (focused_widget)) {
1488 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
1489 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1490 GtkTextBuffer *buffer;
1491 GtkClipboard *clipboard;
1493 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1494 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1495 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
1500 modest_ui_actions_on_select_all (GtkAction *action,
1501 ModestWindow *window)
1503 GtkWidget *focused_widget;
1505 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1506 if (GTK_IS_LABEL (focused_widget)) {
1507 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
1508 } else if (GTK_IS_EDITABLE (focused_widget)) {
1509 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
1510 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1511 GtkTextBuffer *buffer;
1512 GtkTextIter start, end;
1514 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1515 gtk_text_buffer_get_start_iter (buffer, &start);
1516 gtk_text_buffer_get_end_iter (buffer, &end);
1517 gtk_text_buffer_select_range (buffer, &start, &end);
1522 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
1523 GtkRadioAction *selected,
1524 ModestWindow *window)
1528 value = gtk_radio_action_get_current_value (selected);
1529 if (MODEST_IS_WINDOW (window)) {
1530 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
1534 void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action,
1535 GtkRadioAction *selected,
1536 ModestWindow *window)
1538 TnyHeaderFlags flags;
1539 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1541 flags = gtk_radio_action_get_current_value (selected);
1542 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags);
1545 void modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action,
1546 GtkRadioAction *selected,
1547 ModestWindow *window)
1551 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1553 file_format = gtk_radio_action_get_current_value (selected);
1554 modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (window), file_format);
1559 modest_ui_actions_on_zoom_plus (GtkAction *action,
1560 ModestWindow *window)
1562 g_return_if_fail (MODEST_IS_WINDOW (window));
1564 modest_window_zoom_plus (MODEST_WINDOW (window));
1568 modest_ui_actions_on_zoom_minus (GtkAction *action,
1569 ModestWindow *window)
1571 g_return_if_fail (MODEST_IS_WINDOW (window));
1573 modest_window_zoom_minus (MODEST_WINDOW (window));
1577 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
1578 ModestWindow *window)
1580 ModestWindowMgr *mgr;
1581 gboolean fullscreen, active;
1582 g_return_if_fail (MODEST_IS_WINDOW (window));
1584 mgr = modest_runtime_get_window_mgr ();
1586 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
1587 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1589 if (active != fullscreen) {
1590 modest_window_mgr_set_fullscreen_mode (mgr, active);
1591 gtk_window_present (GTK_WINDOW (window));
1596 modest_ui_actions_on_change_fullscreen (GtkAction *action,
1597 ModestWindow *window)
1599 ModestWindowMgr *mgr;
1600 gboolean fullscreen;
1602 g_return_if_fail (MODEST_IS_WINDOW (window));
1604 mgr = modest_runtime_get_window_mgr ();
1605 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1606 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
1608 gtk_window_present (GTK_WINDOW (window));
1612 show_header_details (TnyHeader *header,
1617 dialog = modest_msg_view_details_dialog_new (window, header);
1618 g_object_unref (header);
1619 gtk_widget_show_all (dialog);
1621 gtk_dialog_run (GTK_DIALOG (dialog));
1623 gtk_widget_destroy (dialog);
1627 modest_ui_actions_on_details (GtkAction *action,
1630 TnyList * headers_list;
1634 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1637 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1641 headers_list = get_selected_headers (win);
1645 iter = tny_list_create_iterator (headers_list);
1647 header = TNY_HEADER (tny_iterator_get_current (iter));
1648 show_header_details (header, GTK_WINDOW (win));
1649 g_object_unref (header);
1651 g_object_unref (iter);
1653 } else if (MODEST_IS_MAIN_WINDOW (win)) {
1654 GtkWidget *folder_view, *header_view;
1656 /* Check which widget has the focus */
1657 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1658 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1659 if (gtk_widget_is_focus (folder_view)) {
1662 folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
1664 /* Show only when it's a folder */
1665 if (!folder || !TNY_IS_FOLDER (folder))
1670 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1671 MODEST_WIDGET_TYPE_HEADER_VIEW);
1672 if (!gtk_widget_is_focus (header_view))
1675 headers_list = get_selected_headers (win);
1679 iter = tny_list_create_iterator (headers_list);
1680 while (!tny_iterator_is_done (iter)) {
1682 header = TNY_HEADER (tny_iterator_get_current (iter));
1683 show_header_details (header, GTK_WINDOW (win));
1684 g_object_unref (header);
1686 tny_iterator_next (iter);
1688 g_object_unref (iter);
1694 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
1695 ModestMsgEditWindow *window)
1697 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1699 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
1703 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
1704 ModestMsgEditWindow *window)
1706 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1708 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
1712 modest_ui_actions_toggle_folders_view (GtkAction *action,
1713 ModestMainWindow *main_window)
1717 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1719 conf = modest_runtime_get_conf ();
1721 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
1722 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
1724 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
1728 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
1729 ModestWindow *window)
1731 gboolean active, fullscreen = FALSE;
1732 ModestWindowMgr *mgr;
1734 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
1736 /* Check if we want to toggle the toolbar vuew in fullscreen
1738 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
1739 "ViewShowToolbarFullScreen")) {
1743 /* Toggle toolbar */
1744 mgr = modest_runtime_get_window_mgr ();
1745 modest_window_mgr_show_toolbars (mgr, active, fullscreen);
1749 modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
1750 ModestMsgEditWindow *window)
1752 modest_msg_edit_window_select_font (window);
1756 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
1757 const gchar *display_name,
1760 /* Do not change the application name if the widget has not
1761 the focus. This callback could be called even if the folder
1762 view has not the focus, because the handled signal could be
1763 emitted when the folder view is redrawn */
1764 if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) {
1766 gtk_window_set_title (window, display_name);
1768 gtk_window_set_title (window, " ");
1773 modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *window)
1775 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1776 modest_msg_edit_window_select_contacts (window);