X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-ui-actions.c;h=acf643cb96e5b1824b22026d688f919b565e855a;hp=f9793166a544adae3807caebf5157d27c168a451;hb=535e2815d90bbd647972bb5616ca65bcf0e6d2a5;hpb=24c7fbfe1ce5156e490df32274b72fba1ad39a16 diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index f979316..acf643c 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -41,14 +42,20 @@ #include "modest-ui-actions.h" #include "modest-tny-platform-factory.h" +#include "modest-platform.h" #include #include #include +#include #include "modest-account-mgr-helpers.h" #include "modest-mail-operation.h" + +#ifdef MODEST_HAVE_EASYSETUP #include "easysetup/modest-easysetup-wizard.h" +#endif /*MODEST_HAVE_EASYSETUP*/ + #include #include #include @@ -81,6 +88,8 @@ static void read_msg_func (gpointer data, gpointer user_data); static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data); static void reply_forward (ReplyForwardAction action, ModestWindow *win); +static void modest_ui_actions_message_details_cb (gpointer msg_data, + gpointer helper_data); static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title); @@ -178,15 +187,29 @@ modest_ui_actions_on_delete (GtkAction *action, ModestWindow *win) /* Free iter */ g_object_unref (G_OBJECT (iter)); } + + if (MODEST_IS_MSG_VIEW_WINDOW (win)) { + gtk_widget_destroy (GTK_WIDGET(win)); + } } void modest_ui_actions_on_quit (GtkAction *action, ModestWindow *win) { - /* FIXME: save size of main window */ -/* save_sizes (main_window); */ - gtk_widget_destroy (GTK_WIDGET (win)); + gtk_main_quit (); +} + +void +modest_ui_actions_on_close_window (GtkAction *action, ModestWindow *win) +{ + if (MODEST_IS_MSG_VIEW_WINDOW (win)) { + gtk_widget_destroy (GTK_WIDGET (win)); + } else if (MODEST_IS_WINDOW (win)) { + gtk_widget_destroy (GTK_WIDGET (win)); + } else { + g_return_if_reached (); + } } void @@ -205,44 +228,54 @@ modest_ui_actions_on_add_to_contacts (GtkAction *action, ModestWindow *win) void modest_ui_actions_on_accounts (GtkAction *action, ModestWindow *win) { - /* GtkDialog *account_win; */ -/* account_win = GTK_DIALOG(modest_account_view_window_new ()); */ - -/* gtk_dialog_run (account_win); */ - //gtk_widget_destroy (GTK_WIDGET(account_win)); - GtkWidget *dialog, *label; - - /* Create the widgets */ - - dialog = gtk_dialog_new_with_buttons ("Message", - GTK_WINDOW(win), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_OK, - GTK_RESPONSE_NONE, - NULL); - label = gtk_label_new ("Hello World!"); - - /* Ensure that the dialog box is destroyed when the user responds. */ - - g_signal_connect_swapped (dialog, "response", - G_CALLBACK (gtk_widget_destroy), - dialog); - - /* Add the label, and show everything we've added to the dialog. */ - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), - label); - gtk_widget_show_all (dialog); -} - -void -modest_ui_actions_on_new_account (GtkAction *action, ModestWindow *win) -{ - ModestEasysetupWizardDialog *wizard = modest_easysetup_wizard_dialog_new (); - gtk_window_set_transient_for (GTK_WINDOW (wizard), win); - gtk_dialog_run (GTK_DIALOG (wizard)); - gtk_widget_destroy (wizard); + /* This is currently only implemented for Maemo, + * because it requires a providers preset file which is not publically available. + */ +#ifdef MODEST_PLATFORM_MAEMO /* Defined in config.h */ + GSList *account_names = modest_account_mgr_account_names (modest_runtime_get_account_mgr()); + gboolean accounts_exist = account_names != NULL; + g_slist_free (account_names); + +/* To test, while modest_account_mgr_account_names() is broken: accounts_exist = TRUE; */ + if (!accounts_exist) { + /* If there are no accounts yet, just show the easy-setup wizard, as per the UI spec: */ + ModestEasysetupWizardDialog *wizard = modest_easysetup_wizard_dialog_new (); + gtk_window_set_transient_for (GTK_WINDOW (wizard), GTK_WINDOW (win)); + gtk_dialog_run (GTK_DIALOG (wizard)); + gtk_widget_destroy (GTK_WIDGET (wizard)); + } else { + /* Show the list of accounts: */ + GtkDialog *account_win = GTK_DIALOG(modest_account_view_window_new ()); + gtk_window_set_transient_for (GTK_WINDOW (account_win), GTK_WINDOW(win)); + gtk_dialog_run (account_win); + gtk_widget_destroy (GTK_WIDGET(account_win)); + } +#else + GtkWidget *dialog, *label; + + /* Create the widgets */ + + dialog = gtk_dialog_new_with_buttons ("Message", + GTK_WINDOW(win), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, + GTK_RESPONSE_NONE, + NULL); + label = gtk_label_new ("Hello World!"); + + /* Ensure that the dialog box is destroyed when the user responds. */ + + g_signal_connect_swapped (dialog, "response", + G_CALLBACK (gtk_widget_destroy), + dialog); + + /* Add the label, and show everything we've added to the dialog. */ + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), + label); + gtk_widget_show_all (dialog); +#endif /* MODEST_PLATFORM_MAEMO */ } void @@ -254,11 +287,16 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) gchar *account_name = NULL; gchar *from_str = NULL; GError *err = NULL; - TnyAccount *account; + TnyAccount *account = NULL; + ModestWindowMgr *mgr; account_name = g_strdup(modest_window_get_active_account (win)); if (!account_name) account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); + if (!account_name) { + g_printerr ("modest: no account found\n"); + goto cleanup; + } account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), account_name, @@ -290,7 +328,11 @@ modest_ui_actions_on_new_msg (GtkAction *action, ModestWindow *win) goto cleanup; } + /* Create and register edit window */ msg_win = modest_msg_edit_window_new (msg, account_name); + mgr = modest_runtime_get_window_mgr (); + modest_window_mgr_register_window (mgr, msg_win); + if (win) gtk_window_set_transient_for (GTK_WINDOW (msg_win), GTK_WINDOW (win)); @@ -328,6 +370,7 @@ reply_forward_func (gpointer data, gpointer user_data) GError *err = NULL; TnyFolder *folder = NULL; TnyAccount *account = NULL; + ModestWindowMgr *mgr; msg = TNY_MSG (data); helper = (GetMsgAsyncHelper *) user_data; @@ -385,9 +428,13 @@ reply_forward_func (gpointer data, gpointer user_data) g_error_free (err); goto cleanup; } - - /* Show edit window */ + + /* Create and register the windows */ msg_win = modest_msg_edit_window_new (new_msg, rf_helper->account_name); + mgr = modest_runtime_get_window_mgr (); + modest_window_mgr_register_window (mgr, msg_win); + + /* Show edit window */ gtk_widget_show_all (GTK_WIDGET (msg_win)); cleanup: @@ -494,51 +541,53 @@ modest_ui_actions_on_reply_all (GtkAction *action, ModestWindow *win) void modest_ui_actions_on_next (GtkAction *action, - ModestMainWindow *main_window) + ModestWindow *window) { - GtkWidget *header_view; - g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); + if (MODEST_IS_MAIN_WINDOW (window)) { + GtkWidget *header_view; - header_view = modest_main_window_get_child_widget (main_window, - MODEST_WIDGET_TYPE_HEADER_VIEW); - if (!header_view) - return; + header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window), + MODEST_WIDGET_TYPE_HEADER_VIEW); + if (!header_view) + return; - modest_header_view_select_next (MODEST_HEADER_VIEW(header_view)); + modest_header_view_select_next (MODEST_HEADER_VIEW(header_view)); + } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) { + modest_msg_view_window_select_next_message (MODEST_MSG_VIEW_WINDOW (window)); + } else { + g_return_if_reached (); + } } void modest_ui_actions_on_prev (GtkAction *action, - ModestMainWindow *main_window) + ModestWindow *window) { - GtkWidget *header_view; - g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); + g_return_if_fail (MODEST_IS_WINDOW(window)); - header_view = modest_main_window_get_child_widget (main_window, - MODEST_WIDGET_TYPE_HEADER_VIEW); - if (!header_view) - return; - - modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view)); + if (MODEST_IS_MAIN_WINDOW (window)) { + GtkWidget *header_view; + header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window), + MODEST_WIDGET_TYPE_HEADER_VIEW); + if (!header_view) + return; + + modest_header_view_select_prev (MODEST_HEADER_VIEW(header_view)); + } else if (MODEST_IS_MSG_VIEW_WINDOW (window)) { + modest_msg_view_window_select_previous_message (MODEST_MSG_VIEW_WINDOW (window)); + } else { + g_return_if_reached (); + } } -void -modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) +static gboolean +action_send (const gchar* account_name) { - gchar *account_name; TnyAccount *tny_account; ModestTnySendQueue *send_queue; - ModestMailOperation *mail_op; - - account_name = - g_strdup(modest_window_get_active_account(MODEST_WINDOW(win))); - if (!account_name) - account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); - if (!account_name) { - g_printerr ("modest: cannot get account\n"); - return; - } + + g_return_val_if_fail (account_name, FALSE); tny_account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), @@ -546,26 +595,39 @@ modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) TNY_ACCOUNT_TYPE_TRANSPORT); if (!tny_account) { g_printerr ("modest: cannot get tny transport account for %s\n", account_name); - return; + return FALSE; } send_queue = modest_tny_send_queue_new (TNY_CAMEL_TRANSPORT_ACCOUNT(tny_account)); if (!send_queue) { g_object_unref (G_OBJECT(tny_account)); g_printerr ("modest: cannot get send queue for %s\n", account_name); - return; - } + return FALSE; + } + //modest_tny_send_queue_flush (send_queue); g_object_unref (G_OBJECT(send_queue)); g_object_unref (G_OBJECT(tny_account)); + return TRUE; +} + + +static gboolean +action_receive (const gchar* account_name) +{ + TnyAccount *tny_account; + ModestMailOperation *mail_op; + + g_return_val_if_fail (account_name, FALSE); + tny_account = modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store(), account_name, TNY_ACCOUNT_TYPE_STORE); if (!tny_account) { g_printerr ("modest: cannot get tny store account for %s\n", account_name); - return; + return FALSE; } /* Create the mail operation */ @@ -573,15 +635,38 @@ modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op); modest_mail_operation_update_account (mail_op, TNY_STORE_ACCOUNT(tny_account)); - /* Frees */ - g_object_unref (G_OBJECT (tny_account)); + g_object_unref (G_OBJECT(tny_account)); g_object_unref (G_OBJECT (mail_op)); + + return TRUE; } void -modest_ui_actions_toggle_view (GtkAction *action, ModestMainWindow *main_window) +modest_ui_actions_on_send_receive (GtkAction *action, ModestWindow *win) +{ + gchar *account_name; + + account_name = + g_strdup(modest_window_get_active_account(MODEST_WINDOW(win))); + if (!account_name) + account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); + if (!account_name) { + g_printerr ("modest: cannot get account\n"); + return; + } + + if (!action_send(account_name)) + g_printerr ("modest: failed to send\n"); + if (!action_receive(account_name)) + g_printerr ("modest: failed to receive\n"); +} + + + +void +modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *main_window) { ModestConf *conf; GtkWidget *header_view; @@ -736,10 +821,10 @@ void modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader *header, ModestMainWindow *main_window) { - ModestWindow *win; + ModestWindow *win = NULL; TnyFolder *folder = NULL; TnyMsg *msg = NULL; - gchar *account = NULL; + ModestWindowMgr *mgr; g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); @@ -749,7 +834,7 @@ modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader folder = tny_header_get_folder (header); if (!folder) { g_printerr ("modest: cannot get folder for header\n"); - goto cleanup; + return; } /* FIXME: make async?; check error */ @@ -759,23 +844,31 @@ modest_ui_actions_on_header_activated (ModestHeaderView *folder_view, TnyHeader goto cleanup; } - account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window))); - if (!account) - account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); - - win = modest_msg_view_window_new (msg, account); - gtk_window_set_transient_for (GTK_WINDOW (win), - GTK_WINDOW (main_window)); + /* Look if we already have a message view for that header */ + mgr = modest_runtime_get_window_mgr (); + win = modest_window_mgr_find_window_by_msguid (mgr, tny_header_get_uid (header)); + + /* If not, create a new window */ + if (!win) { + gchar *account; + + account = g_strdup(modest_window_get_active_account(MODEST_WINDOW(main_window))); + if (!account) + account = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr()); + + win = modest_msg_view_window_new (msg, account); + modest_window_mgr_register_window (mgr, win); + + gtk_window_set_transient_for (GTK_WINDOW (win), + GTK_WINDOW (main_window)); + } gtk_widget_show_all (GTK_WIDGET(win)); + + g_object_unref (G_OBJECT (msg)); cleanup: - g_free (account); - - if (folder) - g_object_unref (G_OBJECT (folder)); - if (msg) - g_object_unref (G_OBJECT (msg)); + g_object_unref (G_OBJECT (folder)); } void @@ -879,7 +972,7 @@ void modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link, ModestWindow *win) { - g_message (__FUNCTION__); + g_message ("%s %s", __FUNCTION__, link); } @@ -887,7 +980,14 @@ void modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link, ModestWindow *win) { - g_message (__FUNCTION__); + modest_platform_activate_uri (link); +} + +void +modest_ui_actions_on_msg_link_contextual (ModestMsgView *msgview, const gchar* link, + ModestWindow *win) +{ + modest_platform_show_uri_popup (link); } void @@ -1392,3 +1492,177 @@ modest_ui_actions_on_select_all (GtkAction *action, gtk_text_buffer_select_range (buffer, &start, &end); } } + +void +modest_ui_actions_on_change_zoom (GtkRadioAction *action, + GtkRadioAction *selected, + ModestWindow *window) +{ + gint value; + + value = gtk_radio_action_get_current_value (selected); + if (MODEST_IS_WINDOW (window)) { + modest_window_set_zoom (MODEST_WINDOW (window), ((gdouble)value)/100); + } +} + +void +modest_ui_actions_on_zoom_plus (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + modest_window_zoom_plus (MODEST_WINDOW (window)); +} + +void +modest_ui_actions_on_zoom_minus (GtkAction *action, + ModestWindow *window) +{ + g_return_if_fail (MODEST_IS_WINDOW (window)); + + modest_window_zoom_minus (MODEST_WINDOW (window)); +} + +void +modest_ui_actions_on_toggle_fullscreen (GtkToggleAction *toggle, + ModestWindow *window) +{ + ModestWindowMgr *mgr; + gboolean fullscreen, active; + g_return_if_fail (MODEST_IS_WINDOW (window)); + + mgr = modest_runtime_get_window_mgr (); + + active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)))?1:0; + fullscreen = modest_window_mgr_get_fullscreen_mode (mgr); + + if (active != fullscreen) { + modest_window_mgr_set_fullscreen_mode (mgr, active); + gtk_window_present (GTK_WINDOW (window)); + } +} + +void +modest_ui_actions_on_change_fullscreen (GtkAction *action, + ModestWindow *window) +{ + ModestWindowMgr *mgr; + gboolean fullscreen; + + g_return_if_fail (MODEST_IS_WINDOW (window)); + + mgr = modest_runtime_get_window_mgr (); + fullscreen = modest_window_mgr_get_fullscreen_mode (mgr); + modest_window_mgr_set_fullscreen_mode (mgr, !fullscreen); + + gtk_window_present (GTK_WINDOW (window)); +} + +static void +modest_ui_actions_message_details_cb (gpointer msg_data, + gpointer helper_data) +{ + GtkWidget *dialog; + TnyMsg *msg = (TnyMsg *) msg_data; + TnyHeader *header; + GetMsgAsyncHelper *helper = (GetMsgAsyncHelper *) helper_data; + + header = tny_msg_get_header (msg); + + dialog = modest_msg_view_details_dialog_new (GTK_WINDOW (helper->window), header); + g_object_unref (header); + gtk_widget_show_all (dialog); + + gtk_dialog_run (GTK_DIALOG (dialog)); + + gtk_widget_destroy (dialog); +} + +void +modest_ui_actions_on_message_details (GtkAction *action, + ModestWindow *win) +{ + TnyList * headers_list; + GetMsgAsyncHelper *helper; + + headers_list = get_selected_headers (win); + if (!headers_list) + return; + + helper = g_slice_new0 (GetMsgAsyncHelper); + helper->window = win; + helper->func = modest_ui_actions_message_details_cb; + helper->iter = tny_list_create_iterator (headers_list); + helper->user_data = NULL; + + if (MODEST_IS_MSG_VIEW_WINDOW (win)) { + TnyMsg *msg; + + msg = modest_msg_view_window_get_message (MODEST_MSG_VIEW_WINDOW (win)); + if (!msg) + return; + else { + modest_ui_actions_message_details_cb (msg, helper); + } + } else { + /* here we should add an implementation to run the message details dialog + from the main window */ + g_return_if_reached (); + } +} + +void +modest_ui_actions_on_toggle_show_cc (GtkToggleAction *toggle, + ModestMsgEditWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + + modest_msg_edit_window_show_cc (window, gtk_toggle_action_get_active (toggle)); +} + +void +modest_ui_actions_on_toggle_show_bcc (GtkToggleAction *toggle, + ModestMsgEditWindow *window) +{ + g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); + + modest_msg_edit_window_show_bcc (window, gtk_toggle_action_get_active (toggle)); +} + +void +modest_ui_actions_toggle_folders_view (GtkAction *action, + ModestMainWindow *main_window) +{ + ModestConf *conf; + + g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window)); + + conf = modest_runtime_get_conf (); + + if (modest_main_window_get_style (main_window) == MODEST_MAIN_WINDOW_STYLE_SPLIT) + modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SIMPLE); + else + modest_main_window_set_style (main_window, MODEST_MAIN_WINDOW_STYLE_SPLIT); +} + +void +modest_ui_actions_on_toggle_toolbar (GtkToggleAction *toggle, + ModestWindow *window) +{ + gboolean active, fullscreen = FALSE; + ModestWindowMgr *mgr; + + active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (toggle)); + + /* Check if we want to toggle the toolbar vuew in fullscreen + or normal mode */ + if (!strcmp (gtk_action_get_name (GTK_ACTION (toggle)), + "ViewShowToolbarFullScreen")) { + fullscreen = TRUE; + } + + /* Toggle toolbar */ + mgr = modest_runtime_get_window_mgr (); + modest_window_mgr_show_toolbars (mgr, active, fullscreen); +}