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"
55 #include <tny-maemo-conic-device.h> /* For ConIcIap */
57 #ifdef MODEST_HAVE_EASYSETUP
58 #include "easysetup/modest-easysetup-wizard.h"
59 #endif /*MODEST_HAVE_EASYSETUP*/
61 #include <modest-widget-memory.h>
62 #include <tny-error.h>
63 #include <tny-simple-list.h>
64 #include <tny-msg-view.h>
65 #include <tny-device.h>
67 typedef struct _GetMsgAsyncHelper {
74 typedef enum _ReplyForwardAction {
80 typedef struct _ReplyForwardHelper {
81 guint reply_forward_type;
82 ReplyForwardAction action;
87 static void reply_forward_func (gpointer data, gpointer user_data);
88 static void read_msg_func (gpointer data, gpointer user_data);
89 static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err,
91 static void reply_forward (ReplyForwardAction action, ModestWindow *win);
93 static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title);
97 modest_ui_actions_on_about (GtkAction *action, ModestWindow *win)
100 const gchar *authors[] = {
101 "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
104 about = gtk_about_dialog_new ();
105 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME);
106 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION);
107 gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about),
108 _("Copyright (c) 2006, Nokia Corporation\n"
109 "All rights reserved."));
110 gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about),
111 _("a modest e-mail client\n\n"
112 "design and implementation: Dirk-Jan C. Binnema\n"
113 "contributions from the fine people at KC and Ig\n"
114 "uses the tinymail email framework written by Philip van Hoof"));
115 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors);
116 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org");
118 gtk_dialog_run (GTK_DIALOG (about));
119 gtk_widget_destroy(about);
124 get_selected_headers (ModestWindow *win)
126 if (MODEST_IS_MAIN_WINDOW(win)) {
127 GtkWidget *header_view;
129 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
130 MODEST_WIDGET_TYPE_HEADER_VIEW);
131 return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
133 } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
134 /* for MsgViewWindows, we simply return a list with one element */
137 TnyList *list = NULL;
139 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW(win));
141 header = tny_msg_get_header (msg);
142 list = tny_simple_list_new ();
143 tny_list_prepend (list, G_OBJECT(header));
144 g_object_unref (G_OBJECT(header));
153 modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win)
155 TnyList *header_list;
158 g_return_if_fail (MODEST_IS_WINDOW(win));
160 header_list = get_selected_headers (win);
163 iter = tny_list_create_iterator (header_list);
166 ModestMailOperation *mail_op;
168 header = TNY_HEADER (tny_iterator_get_current (iter));
169 /* TODO: thick grain mail operation involving
170 a list of objects. Composite pattern ??? */
171 /* TODO: add confirmation dialog */
172 mail_op = modest_mail_operation_new ();
173 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
176 /* Always delete. TODO: Move to trash still not supported */
177 modest_mail_operation_remove_msg (mail_op, header, FALSE);
180 g_object_unref (G_OBJECT (mail_op));
181 g_object_unref (G_OBJECT (header));
183 tny_iterator_next (iter);
185 } while (!tny_iterator_is_done (iter));
188 g_object_unref (G_OBJECT (iter));
191 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
192 gtk_widget_destroy (GTK_WIDGET(win));
198 modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win)
204 modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win)
206 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
207 gtk_widget_destroy (GTK_WIDGET (win));
208 } else if (MODEST_IS_WINDOW (win)) {
209 gtk_widget_destroy (GTK_WIDGET (win));
211 g_return_if_reached ();
216 modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win)
218 GtkClipboard *clipboard = NULL;
219 gchar *selection = NULL;
221 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
222 selection = gtk_clipboard_wait_for_text (clipboard);
224 modest_address_book_add_address (selection);
229 modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win)
232 /* This is currently only implemented for Maemo,
233 * because it requires a providers preset file which is not publically available.
235 #ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */
236 GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr());
237 gboolean accounts_exist = account_names != NULL;
238 g_slist_free (account_names);
240 /* To test, while modest_account_mgr_account_names() is broken: accounts_exist = TRUE; */
241 if (!accounts_exist) {
242 /* If there are no accounts yet, just show the easy-setup wizard, as per the UI spec: */
243 ModestEasysetupWizardDialog *wizard = modest_easysetup_wizard_dialog_new ();
244 gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win));
245 gtk_dialog_run (GTK_DIALOG (wizard));
246 gtk_widget_destroy (GTK_WIDGET (wizard));
248 /* Show the list of accounts: */
249 GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ());
250 gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win));
251 gtk_dialog_run (account_win);
252 gtk_widget_destroy (GTK_WIDGET(account_win));
255 GtkWidget *dialog, *label;
257 /* Create the widgets */
259 dialog = gtk_dialog_new_with_buttons ("Message",
261 GTK_DIALOG_DESTROY_WITH_PARENT,
265 label = gtk_label_new ("Hello World!");
267 /* Ensure that the dialog box is destroyed when the user responds. */
269 g_signal_connect_swapped (dialog, "response",
270 G_CALLBACK (gtk_widget_destroy),
273 /* Add the label, and show everything we've added to the dialog. */
275 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox),
277 gtk_widget_show_all (dialog);
278 #endif /* MODEST_PLATFORM_MAEMO */
282 modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win)
284 ModestWindow *msg_win;
286 TnyFolder *folder = NULL;
287 gchar *account_name = NULL;
288 gchar *from_str = NULL;
290 TnyAccount *account = NULL;
291 ModestWindowMgr *mgr;
293 account_name = g_strdup(modest_window_get_active_account (win));
295 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
297 g_printerr ("modest: no account found\n");
301 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
303 TNY_ACCOUNT_TYPE_STORE);
305 g_printerr ("modest: failed to get tnyaccount for '%s'\n", account_name);
309 from_str = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(), account_name);
311 g_printerr ("modest: failed get from string for '%s'\n", account_name);
315 msg = modest_tny_msg_new ("", from_str, "", "", "", "", NULL);
317 g_printerr ("modest: failed to create new msg\n");
321 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
323 g_printerr ("modest: failed to find Drafts folder\n");
327 tny_folder_add_msg (folder, msg, &err);
329 g_printerr ("modest: error adding msg to Drafts folder: %s",
335 /* Create and register edit window */
336 msg_win = modest_msg_edit_window_new (msg, account_name);
337 mgr = modest_runtime_get_window_mgr ();
338 modest_window_mgr_register_window (mgr, msg_win);
341 gtk_window_set_transient_for (GTK_WINDOW (msg_win),
343 gtk_widget_show_all (GTK_WIDGET (msg_win));
346 g_free (account_name);
349 g_object_unref (G_OBJECT(account));
351 g_object_unref (G_OBJECT(msg));
353 g_object_unref (G_OBJECT(folder));
358 modest_ui_actions_on_open (GtkAction *action, ModestWindow *win)
360 modest_runtime_not_implemented (GTK_WINDOW(win)); /* FIXME */
366 reply_forward_func (gpointer data, gpointer user_data)
368 TnyMsg *msg, *new_msg;
369 GetMsgAsyncHelper *helper;
370 ReplyForwardHelper *rf_helper;
371 ModestWindow *msg_win;
372 ModestEditType edit_type;
375 TnyFolder *folder = NULL;
376 TnyAccount *account = NULL;
377 ModestWindowMgr *mgr;
379 msg = TNY_MSG (data);
380 helper = (GetMsgAsyncHelper *) user_data;
381 rf_helper = (ReplyForwardHelper *) helper->user_data;
383 from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
384 rf_helper->account_name);
385 /* Create reply mail */
386 switch (rf_helper->action) {
389 modest_tny_msg_create_reply_msg (msg, from,
390 rf_helper->reply_forward_type,
391 MODEST_TNY_MSG_REPLY_MODE_SENDER);
393 case ACTION_REPLY_TO_ALL:
395 modest_tny_msg_create_reply_msg (msg, from, rf_helper->reply_forward_type,
396 MODEST_TNY_MSG_REPLY_MODE_ALL);
397 edit_type = MODEST_EDIT_TYPE_REPLY;
401 modest_tny_msg_create_forward_msg (msg, from, rf_helper->reply_forward_type);
402 edit_type = MODEST_EDIT_TYPE_FORWARD;
405 g_return_if_reached ();
410 g_printerr ("modest: failed to create message\n");
414 account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
415 rf_helper->account_name,
416 TNY_ACCOUNT_TYPE_STORE);
418 g_printerr ("modest: failed to get tnyaccount for '%s'\n", rf_helper->account_name);
422 folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_DRAFTS);
424 g_printerr ("modest: failed to find Drafts folder\n");
428 tny_folder_add_msg (folder, msg, &err);
430 g_printerr ("modest: error adding msg to Drafts folder: %s",
436 /* Create and register the windows */
437 msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name);
438 mgr = modest_runtime_get_window_mgr ();
439 modest_window_mgr_register_window (mgr, msg_win);
441 /* Show edit window */
442 gtk_widget_show_all (GTK_WIDGET (msg_win));
446 g_object_unref (G_OBJECT (new_msg));
448 g_object_unref (G_OBJECT (folder));
450 g_object_unref (G_OBJECT (account));
452 g_free (rf_helper->account_name);
453 g_slice_free (ReplyForwardHelper, rf_helper);
456 * Common code for the reply and forward actions
459 reply_forward (ReplyForwardAction action, ModestWindow *win)
461 TnyList *header_list;
462 guint reply_forward_type;
465 GetMsgAsyncHelper *helper;
466 ReplyForwardHelper *rf_helper;
468 g_return_if_fail (MODEST_IS_WINDOW(win));
470 header_list = get_selected_headers (win);
474 reply_forward_type = modest_conf_get_int (modest_runtime_get_conf (),
475 (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE,
477 /* We assume that we can only select messages of the
478 same folder and that we reply all of them from the
479 same account. In fact the interface currently only
480 allows single selection */
483 rf_helper = g_slice_new0 (ReplyForwardHelper);
484 rf_helper->reply_forward_type = reply_forward_type;
485 rf_helper->action = action;
487 rf_helper->account_name = g_strdup (modest_window_get_active_account (win));
488 if (!rf_helper->account_name)
489 rf_helper->account_name =
490 modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
492 helper = g_slice_new0 (GetMsgAsyncHelper);
493 helper->window = win;
494 helper->func = reply_forward_func;
495 helper->iter = tny_list_create_iterator (header_list);
496 helper->user_data = rf_helper;
498 if (MODEST_IS_MSG_VIEW_WINDOW(win)) {
500 msg = modest_msg_view_window_get_message(MODEST_MSG_VIEW_WINDOW(win));
502 g_printerr ("modest: no message found\n");
505 reply_forward_func (msg, helper);
507 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
508 folder = tny_header_get_folder (header);
510 /* The callback will call it per each header */
511 tny_folder_get_msg_async (folder, header, get_msg_cb, NULL, helper);
512 g_object_unref (G_OBJECT (folder));
514 g_printerr ("modest: no folder for header\n");
517 g_object_unref (G_OBJECT (header));
523 modest_ui_actions_on_reply (GtkAction *action, ModestWindow *win)
525 g_return_if_fail (MODEST_IS_WINDOW(win));
527 reply_forward (ACTION_REPLY, win);
531 modest_ui_actions_on_forward (GtkAction *action, ModestWindow *win)
533 g_return_if_fail (MODEST_IS_WINDOW(win));
535 reply_forward (ACTION_FORWARD, win);
539 modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win)
541 g_return_if_fail (MODEST_IS_WINDOW(win));
543 reply_forward (ACTION_REPLY_TO_ALL, win);
547 modest_ui_actions_on_next (GtkAction *action,
548 ModestWindow *window)
550 if (MODEST_IS_MAIN_WINDOW (window)) {
551 GtkWidget *header_view;
553 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
554 MODEST_WIDGET_TYPE_HEADER_VIEW);
558 modest_header_view_select_next (MODEST_HEADER_VIEW(header_view));
559 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
560 modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (window));
562 g_return_if_reached ();
567 modest_ui_actions_on_prev (GtkAction *action,
568 ModestWindow *window)
570 g_return_if_fail (MODEST_IS_WINDOW(window));
572 if (MODEST_IS_MAIN_WINDOW (window)) {
573 GtkWidget *header_view;
574 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
575 MODEST_WIDGET_TYPE_HEADER_VIEW);
579 modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view));
580 } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) {
581 modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window));
583 g_return_if_reached ();
588 modest_ui_actions_on_sort (GtkAction *action,
589 ModestWindow *window)
591 ModestWindowMgr *mgr;
593 g_return_if_fail (MODEST_IS_WINDOW(window));
595 /* Show sorting dialog */
596 mgr = modest_runtime_get_window_mgr ();
602 action_send (const gchar* account_name)
604 TnyAccount *tny_account;
605 ModestTnySendQueue *send_queue;
607 g_return_val_if_fail (account_name, FALSE);
609 /* Get the transport account according to the open connection,
610 * because the account might specify connection-specific SMTP servers.
613 modest_tny_account_store_get_transport_account_for_open_connection (modest_runtime_get_account_store(),
616 g_printerr ("modest: cannot get tny transport account for %s\n", account_name);
620 send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account));
622 g_object_unref (G_OBJECT(tny_account));
623 g_printerr ("modest: cannot get send queue for %s\n", account_name);
627 //modest_tny_send_queue_flush (send_queue);
629 g_object_unref (G_OBJECT(send_queue));
630 g_object_unref (G_OBJECT(tny_account));
637 action_receive (const gchar* account_name)
639 TnyAccount *tny_account;
640 ModestMailOperation *mail_op;
642 g_return_val_if_fail (account_name, FALSE);
645 modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(),
647 TNY_ACCOUNT_TYPE_STORE);
649 g_printerr ("modest: cannot get tny store account for %s\n", account_name);
653 /* Create the mail operation */
654 /* TODO: The spec wants us to first do any pending deletions, before receiving. */
655 mail_op = modest_mail_operation_new ();
656 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
657 modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account));
659 g_object_unref (G_OBJECT(tny_account));
660 g_object_unref (G_OBJECT (mail_op));
665 /** Check that an appropriate connection is open.
667 gboolean check_for_connection (const gchar *account_name)
669 TnyDevice *device = modest_runtime_get_device ();
672 g_assert (TNY_IS_MAEMO_CONIC_DEVICE (device));
674 TnyMaemoConicDevice *maemo_device = TNY_MAEMO_CONIC_DEVICE (device);
677 if (tny_device_is_online (device))
680 tny_maemo_conic_device_connect (TNY_MAEMO_CONIC_DEVICE (device), NULL);
682 /* TODO: Wait until a result. */
688 modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win)
693 g_message ("%s: online? %s", __FUNCTION__,
694 tny_device_is_online(modest_runtime_get_device()) ? "yes":"no");
696 /* As per the UI spec, only the active account should be affected,
697 * else the default folder if there is no active account: */
699 g_strdup(modest_window_get_active_account(MODEST_WINDOW(win)));
701 account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
703 g_printerr ("modest: cannot get default account\n");
707 /* Do not continue if no suitable connection is open: */
708 if (!check_for_connection (account_name))
711 /* As per the UI spec,
712 * for POP accounts, we should receive,
713 * for IMAP we should synchronize everything, including receiving,
714 * for SMTP we should send,
715 * first receiving, then sending:
717 if (!action_receive(account_name))
718 g_printerr ("modest: failed to receive\n");
719 if (!action_send(account_name))
720 g_printerr ("modest: failed to send\n");
727 modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window)
730 GtkWidget *header_view;
732 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
734 header_view = modest_main_window_get_child_widget (main_window,
735 MODEST_WIDGET_TYPE_HEADER_VIEW);
739 conf = modest_runtime_get_conf ();
741 /* what is saved/restored is depending on the style; thus; we save with
742 * old style, then update the style, and restore for this new style
744 modest_widget_memory_save (conf, G_OBJECT(header_view), "header-view");
746 if (modest_header_view_get_style
747 (MODEST_HEADER_VIEW(header_view)) == MODEST_HEADER_VIEW_STYLE_DETAILS)
748 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
749 MODEST_HEADER_VIEW_STYLE_TWOLINES);
751 modest_header_view_set_style (MODEST_HEADER_VIEW(header_view),
752 MODEST_HEADER_VIEW_STYLE_DETAILS);
754 modest_widget_memory_restore (conf, G_OBJECT(header_view),
761 * Marks a message as read and passes it to the msg preview widget
764 read_msg_func (gpointer data, gpointer user_data)
768 GetMsgAsyncHelper *helper;
769 TnyHeaderFlags header_flags;
770 GtkWidget *msg_preview;
772 msg = TNY_MSG (data);
773 helper = (GetMsgAsyncHelper *) user_data;
775 msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
776 MODEST_WIDGET_TYPE_MSG_PREVIEW);
780 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
781 header_flags = tny_header_get_flags (header);
782 tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN);
783 g_object_unref (G_OBJECT (header));
785 /* Set message on msg view */
786 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), msg);
790 * This function is a generic handler for the tny_folder_get_msg_async
791 * call. It expects as user_data a #GetMsgAsyncHelper. This helper
792 * contains a user provided function that is called inside this
793 * method. This will allow us to use this callback in many different
794 * places. This callback performs the common actions for the
795 * get_msg_async call, more specific actions will be done by the user
799 get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data)
801 GetMsgAsyncHelper *helper;
803 helper = (GetMsgAsyncHelper *) user_data;
805 if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
806 modest_ui_actions_on_item_not_found (NULL,
807 MODEST_ITEM_TYPE_MESSAGE,
812 /* Call user function */
813 helper->func (msg, user_data);
815 /* Process next element (if exists) */
816 tny_iterator_next (helper->iter);
817 if (tny_iterator_is_done (helper->iter)) {
819 headers = tny_iterator_get_list (helper->iter);
821 g_object_unref (G_OBJECT (headers));
822 g_object_unref (G_OBJECT (helper->iter));
823 g_slice_free (GetMsgAsyncHelper, helper);
826 header = TNY_HEADER (tny_iterator_get_current (helper->iter));
827 tny_folder_get_msg_async (folder, header,
828 get_msg_cb, NULL, helper);
829 g_object_unref (G_OBJECT(header));
834 modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
836 ModestMainWindow *main_window)
839 GetMsgAsyncHelper *helper;
842 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
844 /* when there's no header, clear the msgview */
846 GtkWidget *msg_preview;
848 /* Clear msg preview if exists */
849 msg_preview = modest_main_window_get_child_widget(main_window,
850 MODEST_WIDGET_TYPE_MSG_PREVIEW);
853 modest_msg_view_set_message (MODEST_MSG_VIEW(msg_preview), NULL);
857 /* Update Main window title */
858 if (GTK_WIDGET_HAS_FOCUS (header_view)) {
859 const gchar *subject = tny_header_get_subject (header);
860 if (subject && strcmp (subject, ""))
861 gtk_window_set_title (GTK_WINDOW (main_window), subject);
863 gtk_window_set_title (GTK_WINDOW (main_window), _("mail_va_no_subject"));
867 list = tny_simple_list_new ();
868 tny_list_prepend (list, G_OBJECT (header));
870 /* Fill helper data */
871 helper = g_slice_new0 (GetMsgAsyncHelper);
872 helper->window = MODEST_WINDOW (main_window);
873 helper->iter = tny_list_create_iterator (list);
874 helper->func = read_msg_func;
876 folder = tny_header_get_folder (TNY_HEADER(header));
878 tny_folder_get_msg_async (TNY_FOLDER(folder),
883 g_object_unref (G_OBJECT (folder));
889 modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header,
890 ModestMainWindow *main_window)
892 ModestWindow *win = NULL;
893 TnyFolder *folder = NULL;
895 ModestWindowMgr *mgr;
897 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
902 folder = tny_header_get_folder (header);
904 g_printerr ("modest: cannot get folder for header\n");
908 /* FIXME: make async?; check error */
909 msg = tny_folder_get_msg (folder, header, NULL);
911 g_printerr ("modest: cannot get msg for header\n");
915 /* Look if we already have a message view for that header */
916 mgr = modest_runtime_get_window_mgr ();
917 win = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header));
919 /* If not, create a new window */
923 account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window)));
925 account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
927 win = modest_msg_view_window_new (msg, account);
928 modest_window_mgr_register_window (mgr, win);
930 gtk_window_set_transient_for (GTK_WINDOW (win),
931 GTK_WINDOW (main_window));
934 gtk_widget_show_all (GTK_WIDGET(win));
936 g_object_unref (G_OBJECT (msg));
939 g_object_unref (G_OBJECT (folder));
943 modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
944 TnyFolderStore *folder_store,
946 ModestMainWindow *main_window)
949 GtkWidget *header_view;
951 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
953 header_view = modest_main_window_get_child_widget(main_window,
954 MODEST_WIDGET_TYPE_HEADER_VIEW);
958 conf = modest_runtime_get_conf ();
960 if (TNY_IS_FOLDER (folder_store)) {
962 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_HEADERS);
965 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view),
966 TNY_FOLDER (folder_store));
967 modest_widget_memory_restore (conf, G_OBJECT(header_view),
970 modest_widget_memory_save (conf, G_OBJECT (header_view), "header-view");
971 modest_header_view_set_folder (MODEST_HEADER_VIEW(header_view), NULL);
973 } else if (TNY_IS_ACCOUNT (folder_store)) {
975 modest_main_window_set_contents_style (main_window, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
980 modest_ui_actions_on_item_not_found (ModestHeaderView *header_view,ModestItemType type,
987 item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message";
989 if (g_main_depth > 0)
990 gdk_threads_enter ();
991 online = tny_device_is_online (modest_runtime_get_device());
994 /* already online -- the item is simply not there... */
995 dialog = gtk_message_dialog_new (GTK_WINDOW (win),
999 _("The %s you selected cannot be found"),
1001 gtk_dialog_run (GTK_DIALOG(dialog));
1003 dialog = gtk_dialog_new_with_buttons (_("Connection requested"),
1007 GTK_RESPONSE_REJECT,
1009 GTK_RESPONSE_ACCEPT,
1011 txt = g_strdup_printf (_("This %s is not available in offline mode.\n"
1012 "Do you want to get online?"), item);
1013 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1014 gtk_label_new (txt), FALSE, FALSE, 0);
1015 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1018 gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300);
1019 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1020 // tny_maemo_conic_device_connect (TNY_MAEMO_CONIC_DEVICE (modest_runtime_get_device());
1023 gtk_widget_destroy (dialog);
1024 if (g_main_depth > 0)
1025 gdk_threads_leave ();
1029 modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link,
1032 g_message ("%s %s", __FUNCTION__, link);
1037 modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link,
1040 modest_platform_activate_uri (link);
1044 modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link,
1047 modest_platform_show_uri_popup (link);
1051 modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, TnyMimePart *mime_part,
1054 g_message (__FUNCTION__);
1059 modest_ui_actions_on_msg_recpt_activated (ModestMsgView *msgview,
1060 const gchar *address,
1063 g_message ("%s %s", __FUNCTION__, address);
1067 modest_ui_actions_on_send (GtkWidget *widget, ModestMsgEditWindow *edit_window)
1069 TnyTransportAccount *transport_account;
1070 ModestMailOperation *mail_operation;
1072 gchar *account_name, *from;
1073 ModestAccountMgr *account_mgr;
1075 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW(edit_window));
1077 data = modest_msg_edit_window_get_msg_data (edit_window);
1079 /* FIXME: Code added just for testing. The final version will
1080 use the send queue provided by tinymail and some
1082 account_mgr = modest_runtime_get_account_mgr();
1083 account_name = g_strdup(modest_window_get_active_account (MODEST_WINDOW(edit_window)));
1085 account_name = modest_account_mgr_get_default_account (account_mgr);
1086 if (!account_name) {
1087 g_printerr ("modest: no account found\n");
1088 modest_msg_edit_window_free_msg_data (edit_window, data);
1092 TNY_TRANSPORT_ACCOUNT(modest_tny_account_store_get_transport_account_for_open_connection
1093 (modest_runtime_get_account_store(),
1095 if (!transport_account) {
1096 g_printerr ("modest: no transport account found for '%s'\n", account_name);
1097 g_free (account_name);
1098 modest_msg_edit_window_free_msg_data (edit_window, data);
1101 from = modest_account_mgr_get_from_string (account_mgr, account_name);
1103 /* Create the mail operation */
1104 mail_operation = modest_mail_operation_new ();
1105 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_operation);
1107 modest_mail_operation_send_new_mail (mail_operation,
1117 data->priority_flags);
1120 g_free (account_name);
1121 g_object_unref (G_OBJECT (transport_account));
1122 g_object_unref (G_OBJECT (mail_operation));
1124 modest_msg_edit_window_free_msg_data (edit_window, data);
1126 /* Save settings and close the window */
1127 gtk_widget_destroy (GTK_WIDGET (edit_window));
1131 modest_ui_actions_on_toggle_bold (GtkToggleAction *action,
1132 ModestMsgEditWindow *window)
1134 ModestMsgEditFormatState *format_state = NULL;
1136 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1137 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1139 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1142 format_state = modest_msg_edit_window_get_format_state (window);
1143 g_return_if_fail (format_state != NULL);
1145 format_state->bold = gtk_toggle_action_get_active (action);
1146 modest_msg_edit_window_set_format_state (window, format_state);
1147 g_free (format_state);
1152 modest_ui_actions_on_toggle_italics (GtkToggleAction *action,
1153 ModestMsgEditWindow *window)
1155 ModestMsgEditFormatState *format_state = NULL;
1157 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1158 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1160 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1163 format_state = modest_msg_edit_window_get_format_state (window);
1164 g_return_if_fail (format_state != NULL);
1166 format_state->italics = gtk_toggle_action_get_active (action);
1167 modest_msg_edit_window_set_format_state (window, format_state);
1168 g_free (format_state);
1173 modest_ui_actions_on_toggle_bullets (GtkToggleAction *action,
1174 ModestMsgEditWindow *window)
1176 ModestMsgEditFormatState *format_state = NULL;
1178 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1179 g_return_if_fail (GTK_IS_TOGGLE_ACTION (action));
1181 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1184 format_state = modest_msg_edit_window_get_format_state (window);
1185 g_return_if_fail (format_state != NULL);
1187 format_state->bullet = gtk_toggle_action_get_active (action);
1188 modest_msg_edit_window_set_format_state (window, format_state);
1189 g_free (format_state);
1194 modest_ui_actions_on_change_justify (GtkRadioAction *action,
1195 GtkRadioAction *selected,
1196 ModestMsgEditWindow *window)
1198 ModestMsgEditFormatState *format_state = NULL;
1199 GtkJustification value;
1201 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1203 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1206 value = gtk_radio_action_get_current_value (selected);
1208 format_state = modest_msg_edit_window_get_format_state (window);
1209 g_return_if_fail (format_state != NULL);
1211 format_state->justification = value;
1212 modest_msg_edit_window_set_format_state (window, format_state);
1213 g_free (format_state);
1217 modest_ui_actions_on_select_editor_color (GtkAction *action,
1218 ModestMsgEditWindow *window)
1220 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1221 g_return_if_fail (GTK_IS_ACTION (action));
1223 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1226 modest_msg_edit_window_select_color (window);
1230 modest_ui_actions_on_select_editor_background_color (GtkAction *action,
1231 ModestMsgEditWindow *window)
1233 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1234 g_return_if_fail (GTK_IS_ACTION (action));
1236 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1239 modest_msg_edit_window_select_background_color (window);
1243 modest_ui_actions_on_insert_image (GtkAction *action,
1244 ModestMsgEditWindow *window)
1246 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1247 g_return_if_fail (GTK_IS_ACTION (action));
1249 if (modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW(window)) == MODEST_MSG_EDIT_FORMAT_TEXT)
1252 modest_msg_edit_window_insert_image (window);
1256 * Shows a dialog with an entry that asks for some text. The returned
1257 * value must be freed by the caller. The dialog window title will be
1261 ask_for_folder_name (GtkWindow *parent_window,
1264 GtkWidget *dialog, *entry;
1265 gchar *folder_name = NULL;
1267 /* Ask for folder name */
1268 dialog = gtk_dialog_new_with_buttons (_("New Folder Name"),
1272 GTK_RESPONSE_REJECT,
1274 GTK_RESPONSE_ACCEPT,
1276 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1277 gtk_label_new(title),
1280 entry = gtk_entry_new_with_max_length (40);
1281 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
1285 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1287 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
1288 folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
1290 gtk_widget_destroy (dialog);
1296 modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_window)
1298 TnyFolderStore *parent_folder;
1299 GtkWidget *folder_view;
1301 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1303 folder_view = modest_main_window_get_child_widget (main_window,
1304 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1308 parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1310 if (parent_folder) {
1311 gboolean finished = FALSE;
1313 gchar *folder_name = NULL, *suggested_name = NULL;
1315 /* Run the new folder dialog */
1317 result = modest_platform_run_new_folder_dialog (GTK_WINDOW (main_window),
1322 if (result == GTK_RESPONSE_REJECT) {
1325 ModestMailOperation *mail_op = modest_mail_operation_new ();
1326 TnyFolder *new_folder = NULL;
1328 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1331 new_folder = modest_mail_operation_create_folder (mail_op,
1333 (const gchar *) folder_name);
1335 g_object_unref (new_folder);
1339 /* /\* TODO: check error and follow proper actions *\/ */
1340 /* /\* suggested_name = X; *\/ */
1341 /* /\* Show error to the user *\/ */
1342 /* modest_platform_run_information_dialog (GTK_WINDOW (main_window), */
1343 /* MODEST_INFORMATION_CREATE_FOLDER); */
1345 g_object_unref (mail_op);
1347 g_free (folder_name);
1351 g_object_unref (parent_folder);
1356 modest_ui_actions_on_rename_folder (GtkAction *action,
1357 ModestMainWindow *main_window)
1359 TnyFolderStore *folder;
1360 GtkWidget *folder_view;
1362 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1364 folder_view = modest_main_window_get_child_widget (main_window,
1365 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1369 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
1371 if (folder && TNY_IS_FOLDER (folder)) {
1373 folder_name = ask_for_folder_name (GTK_WINDOW (main_window),
1374 _("Please enter a new name for the folder"));
1376 if (folder_name != NULL && strlen (folder_name) > 0) {
1377 ModestMailOperation *mail_op;
1379 mail_op = modest_mail_operation_new ();
1380 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1383 modest_mail_operation_rename_folder (mail_op,
1384 TNY_FOLDER (folder),
1385 (const gchar *) folder_name);
1387 g_object_unref (mail_op);
1388 g_free (folder_name);
1390 g_object_unref (folder);
1395 delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
1397 TnyFolderStore *folder;
1398 GtkWidget *folder_view;
1401 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1403 folder_view = modest_main_window_get_child_widget (main_window,
1404 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1408 folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1411 response = modest_platform_run_confirmation_dialog (GTK_WINDOW (main_window),
1412 MODEST_CONFIRMATION_DELETE_FOLDER,
1415 if (response == GTK_RESPONSE_OK) {
1416 ModestMailOperation *mail_op = modest_mail_operation_new ();
1418 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1420 modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), move_to_trash);
1422 /* Show error if happened */
1423 if (modest_mail_operation_get_error (mail_op))
1424 modest_platform_run_information_dialog (GTK_WINDOW (main_window),
1425 MODEST_INFORMATION_DELETE_FOLDER);
1427 g_object_unref (G_OBJECT (mail_op));
1430 g_object_unref (G_OBJECT (folder));
1434 modest_ui_actions_on_delete_folder (GtkAction *action,
1435 ModestMainWindow *main_window)
1437 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1439 delete_folder (main_window, FALSE);
1443 modest_ui_actions_on_move_folder_to_trash_folder (GtkAction *action, ModestMainWindow *main_window)
1445 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1447 delete_folder (main_window, TRUE);
1451 modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
1452 const gchar* account_name,
1456 ModestMainWindow *main_window)
1459 GtkWidget *dialog, *entry, *remember_pass_check;
1461 dialog = gtk_dialog_new_with_buttons (_("Password requested"),
1465 GTK_RESPONSE_REJECT,
1467 GTK_RESPONSE_ACCEPT,
1469 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(main_window));
1471 txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
1472 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
1476 entry = gtk_entry_new_with_max_length (40);
1477 gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
1478 gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
1480 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
1483 remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
1484 gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
1487 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1489 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
1490 *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
1497 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
1502 gtk_widget_destroy (dialog);
1506 modest_ui_actions_on_cut (GtkAction *action,
1507 ModestWindow *window)
1509 GtkWidget *focused_widget;
1511 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1512 if (GTK_IS_EDITABLE (focused_widget)) {
1513 gtk_editable_cut_clipboard (GTK_EDITABLE(focused_widget));
1514 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1515 GtkTextBuffer *buffer;
1516 GtkClipboard *clipboard;
1518 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1519 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1520 gtk_text_buffer_cut_clipboard (buffer, clipboard, TRUE);
1525 modest_ui_actions_on_copy (GtkAction *action,
1526 ModestWindow *window)
1528 GtkClipboard *clipboard;
1529 GtkWidget *focused_widget;
1531 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1532 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1533 if (GTK_IS_LABEL (focused_widget)) {
1534 gtk_clipboard_set_text (clipboard, gtk_label_get_text (GTK_LABEL (focused_widget)), -1);
1535 } else if (GTK_IS_EDITABLE (focused_widget)) {
1536 gtk_editable_copy_clipboard (GTK_EDITABLE(focused_widget));
1537 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1538 GtkTextBuffer *buffer;
1540 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1541 gtk_text_buffer_copy_clipboard (buffer, clipboard);
1546 modest_ui_actions_on_undo (GtkAction *action,
1547 ModestWindow *window)
1549 if (MODEST_IS_MSG_EDIT_WINDOW (window)) {
1550 modest_msg_edit_window_undo (MODEST_MSG_EDIT_WINDOW (window));
1552 g_return_if_reached ();
1557 modest_ui_actions_on_paste (GtkAction *action,
1558 ModestWindow *window)
1560 GtkWidget *focused_widget;
1562 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1563 if (GTK_IS_EDITABLE (focused_widget)) {
1564 gtk_editable_paste_clipboard (GTK_EDITABLE(focused_widget));
1565 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1566 GtkTextBuffer *buffer;
1567 GtkClipboard *clipboard;
1569 clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
1570 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1571 gtk_text_buffer_paste_clipboard (buffer, clipboard, NULL, TRUE);
1576 modest_ui_actions_on_select_all (GtkAction *action,
1577 ModestWindow *window)
1579 GtkWidget *focused_widget;
1581 focused_widget = gtk_window_get_focus (GTK_WINDOW (window));
1582 if (GTK_IS_LABEL (focused_widget)) {
1583 gtk_label_select_region (GTK_LABEL (focused_widget), 0, -1);
1584 } else if (GTK_IS_EDITABLE (focused_widget)) {
1585 gtk_editable_select_region (GTK_EDITABLE(focused_widget), 0, -1);
1586 } else if (GTK_IS_TEXT_VIEW (focused_widget)) {
1587 GtkTextBuffer *buffer;
1588 GtkTextIter start, end;
1590 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused_widget));
1591 gtk_text_buffer_get_start_iter (buffer, &start);
1592 gtk_text_buffer_get_end_iter (buffer, &end);
1593 gtk_text_buffer_select_range (buffer, &start, &end);
1598 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
1599 GtkRadioAction *selected,
1600 ModestWindow *window)
1604 value = gtk_radio_action_get_current_value (selected);
1605 if (MODEST_IS_WINDOW (window)) {
1606 modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100);
1610 void modest_ui_actions_msg_edit_on_change_priority (GtkRadioAction *action,
1611 GtkRadioAction *selected,
1612 ModestWindow *window)
1614 TnyHeaderFlags flags;
1615 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1617 flags = gtk_radio_action_get_current_value (selected);
1618 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW (window), flags);
1621 void modest_ui_actions_msg_edit_on_change_file_format (GtkRadioAction *action,
1622 GtkRadioAction *selected,
1623 ModestWindow *window)
1627 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1629 file_format = gtk_radio_action_get_current_value (selected);
1630 modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (window), file_format);
1635 modest_ui_actions_on_zoom_plus (GtkAction *action,
1636 ModestWindow *window)
1638 g_return_if_fail (MODEST_IS_WINDOW (window));
1640 modest_window_zoom_plus (MODEST_WINDOW (window));
1644 modest_ui_actions_on_zoom_minus (GtkAction *action,
1645 ModestWindow *window)
1647 g_return_if_fail (MODEST_IS_WINDOW (window));
1649 modest_window_zoom_minus (MODEST_WINDOW (window));
1653 modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle,
1654 ModestWindow *window)
1656 ModestWindowMgr *mgr;
1657 gboolean fullscreen, active;
1658 g_return_if_fail (MODEST_IS_WINDOW (window));
1660 mgr = modest_runtime_get_window_mgr ();
1662 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0;
1663 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1665 if (active != fullscreen) {
1666 modest_window_mgr_set_fullscreen_mode (mgr, active);
1667 gtk_window_present (GTK_WINDOW (window));
1672 modest_ui_actions_on_change_fullscreen (GtkAction *action,
1673 ModestWindow *window)
1675 ModestWindowMgr *mgr;
1676 gboolean fullscreen;
1678 g_return_if_fail (MODEST_IS_WINDOW (window));
1680 mgr = modest_runtime_get_window_mgr ();
1681 fullscreen = modest_window_mgr_get_fullscreen_mode (mgr);
1682 modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen);
1684 gtk_window_present (GTK_WINDOW (window));
1688 * Show the header details in a ModestDetailsDialog widget
1691 show_header_details (TnyHeader *header,
1697 dialog = modest_details_dialog_new_with_header (window, header);
1700 gtk_widget_show_all (dialog);
1701 gtk_dialog_run (GTK_DIALOG (dialog));
1703 gtk_widget_destroy (dialog);
1707 * Show the folder details in a ModestDetailsDialog widget
1710 show_folder_details (TnyFolder *folder,
1716 dialog = modest_details_dialog_new_with_folder (window, folder);
1719 gtk_widget_show_all (dialog);
1720 gtk_dialog_run (GTK_DIALOG (dialog));
1722 gtk_widget_destroy (dialog);
1727 modest_ui_actions_on_details (GtkAction *action,
1730 TnyList * headers_list;
1734 if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
1737 msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win));
1741 headers_list = get_selected_headers (win);
1745 iter = tny_list_create_iterator (headers_list);
1747 header = TNY_HEADER (tny_iterator_get_current (iter));
1748 show_header_details (header, GTK_WINDOW (win));
1749 g_object_unref (header);
1751 g_object_unref (iter);
1753 } else if (MODEST_IS_MAIN_WINDOW (win)) {
1754 GtkWidget *folder_view, *header_view;
1756 /* Check which widget has the focus */
1757 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1758 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1759 if (gtk_widget_is_focus (folder_view)) {
1762 folder = (TnyFolder *) modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1764 /* Show only when it's a folder */
1765 if (!folder || !TNY_IS_FOLDER (folder))
1768 show_folder_details (folder, GTK_WINDOW (win));
1771 header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1772 MODEST_WIDGET_TYPE_HEADER_VIEW);
1773 if (!gtk_widget_is_focus (header_view))
1776 headers_list = get_selected_headers (win);
1780 iter = tny_list_create_iterator (headers_list);
1781 while (!tny_iterator_is_done (iter)) {
1783 header = TNY_HEADER (tny_iterator_get_current (iter));
1784 show_header_details (header, GTK_WINDOW (win));
1785 g_object_unref (header);
1787 tny_iterator_next (iter);
1789 g_object_unref (iter);
1795 modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle,
1796 ModestMsgEditWindow *window)
1798 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1800 modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle));
1804 modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle,
1805 ModestMsgEditWindow *window)
1807 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1809 modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle));
1813 modest_ui_actions_toggle_folders_view (GtkAction *action,
1814 ModestMainWindow *main_window)
1818 g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
1820 conf = modest_runtime_get_conf ();
1822 if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT)
1823 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE);
1825 modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT);
1829 modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle,
1830 ModestWindow *window)
1832 gboolean active, fullscreen = FALSE;
1833 ModestWindowMgr *mgr;
1835 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle));
1837 /* Check if we want to toggle the toolbar vuew in fullscreen
1839 if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)),
1840 "ViewShowToolbarFullScreen")) {
1844 /* Toggle toolbar */
1845 mgr = modest_runtime_get_window_mgr ();
1846 modest_window_mgr_show_toolbars (mgr, active, fullscreen);
1850 modest_ui_actions_msg_edit_on_select_font (GtkAction *action,
1851 ModestMsgEditWindow *window)
1853 modest_msg_edit_window_select_font (window);
1857 modest_ui_actions_on_folder_display_name_changed (ModestFolderView *folder_view,
1858 const gchar *display_name,
1861 /* Do not change the application name if the widget has not
1862 the focus. This callback could be called even if the folder
1863 view has not the focus, because the handled signal could be
1864 emitted when the folder view is redrawn */
1865 if (gtk_widget_is_focus (GTK_WIDGET (folder_view))) {
1867 gtk_window_set_title (window, display_name);
1869 gtk_window_set_title (window, " ");
1874 modest_ui_actions_on_select_contacts (GtkAction *action, ModestMsgEditWindow *window)
1876 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1877 modest_msg_edit_window_select_contacts (window);
1882 modest_ui_actions_on_move_to (GtkAction *action,
1885 GtkWidget *dialog, *scroll, *folder_view, *tree_view;
1888 g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
1890 dialog = gtk_dialog_new_with_buttons (_("mcen_ti_moveto_folders_title"),
1892 GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR | GTK_DIALOG_DESTROY_WITH_PARENT,
1894 GTK_RESPONSE_ACCEPT,
1896 GTK_RESPONSE_REJECT,
1899 /* Create scrolled window */
1900 scroll = gtk_scrolled_window_new (NULL, NULL);
1901 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
1902 GTK_POLICY_AUTOMATIC,
1903 GTK_POLICY_AUTOMATIC);
1905 /* Create folder view */
1906 folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
1907 MODEST_WIDGET_TYPE_FOLDER_VIEW);
1908 tree_view = modest_folder_view_new (NULL);
1909 gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view),
1910 gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view)));
1912 gtk_container_add (GTK_CONTAINER (scroll), tree_view);
1914 /* Add scroll to dialog */
1915 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
1916 scroll, FALSE, FALSE, 0);
1918 gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
1920 result = gtk_dialog_run (GTK_DIALOG(dialog));
1921 if (result == GTK_RESPONSE_ACCEPT) {
1922 TnyFolderStore *folder_store;
1923 folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (tree_view));
1924 if (TNY_IS_ACCOUNT (folder_store)) {
1926 ModestMailOperation *mail_op;
1928 /* Create mail operation */
1929 mail_op = modest_mail_operation_new ();
1930 modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
1933 /* Get folder or messages to transfer */
1934 if (gtk_widget_is_focus (folder_view)) {
1935 TnyFolderStore *src_folder;
1936 src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
1938 if (TNY_IS_FOLDER (src_folder))
1939 modest_mail_operation_xfer_folder (mail_op,
1940 TNY_FOLDER (src_folder),
1945 g_object_unref (G_OBJECT (src_folder));
1948 g_object_unref (G_OBJECT (mail_op));
1950 g_object_unref (folder_store);
1953 gtk_widget_destroy (dialog);