/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, see . * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) */ #ifdef HAVE_CONFIG_H #include #endif #include "e-composer-actions.h" #include "e-composer-private.h" #include #include #include /* because 'composer' is compiled before 'mail' folder */ static gboolean composer_copy_em_utils_prompt_user (GtkWindow *parent, const gchar *promptkey, const gchar *tag, ...) { GtkWidget *dialog; GtkWidget *check = NULL; GtkWidget *container; va_list ap; gint button; GSettings *settings; EAlert *alert = NULL; settings = g_settings_new ("org.gnome.evolution.mail"); if (promptkey && !g_settings_get_boolean (settings, promptkey)) { g_object_unref (settings); return TRUE; } va_start (ap, tag); alert = e_alert_new_valist (tag, ap); va_end (ap); dialog = e_alert_dialog_new (parent, alert); g_object_unref (alert); container = e_alert_dialog_get_content_area (E_ALERT_DIALOG (dialog)); if (promptkey) { check = gtk_check_button_new_with_mnemonic ( _("_Do not show this message again")); gtk_box_pack_start ( GTK_BOX (container), check, FALSE, FALSE, 0); gtk_widget_show (check); } button = gtk_dialog_run (GTK_DIALOG (dialog)); if (promptkey) g_settings_set_boolean ( settings, promptkey, !gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON (check))); gtk_widget_destroy (dialog); g_object_unref (settings); return button == GTK_RESPONSE_YES; } static void action_attach_cb (GtkAction *action, EMsgComposer *composer) { EAttachmentView *view; EAttachmentStore *store; view = e_msg_composer_get_attachment_view (composer); store = e_attachment_view_get_store (view); e_attachment_store_run_load_dialog (store, GTK_WINDOW (composer)); } static void action_charset_cb (GtkRadioAction *action, GtkRadioAction *current, EMsgComposer *composer) { const gchar *charset; if (action != current) return; charset = g_object_get_data (G_OBJECT (action), "charset"); g_free (composer->priv->charset); composer->priv->charset = g_strdup (charset); } static void action_close_cb (GtkAction *action, EMsgComposer *composer) { if (e_msg_composer_can_close (composer, TRUE)) gtk_widget_destroy (GTK_WIDGET (composer)); } static void action_new_message_cb (GtkAction *action, EMsgComposer *composer) { EMsgComposer *new_composer; EShell *shell; shell = e_msg_composer_get_shell (composer); new_composer = e_msg_composer_new (shell); gtk_widget_show (GTK_WIDGET (new_composer)); } static void action_pgp_encrypt_cb (GtkToggleAction *action, EMsgComposer *composer) { EHTMLEditor *editor; EHTMLEditorView *view; editor = e_msg_composer_get_editor (composer); view = e_html_editor_get_view (editor); e_html_editor_view_set_changed (view, TRUE); } static void action_pgp_sign_cb (GtkToggleAction *action, EMsgComposer *composer) { EHTMLEditor *editor; EHTMLEditorView *view; editor = e_msg_composer_get_editor (composer); view = e_html_editor_get_view (editor); e_html_editor_view_set_changed (view, TRUE); } static void action_preferences_cb (GtkAction *action, EMsgComposer *composer) { EShell *shell; GtkWidget *preferences_window; const gchar *page_name = "composer"; shell = e_msg_composer_get_shell (composer); preferences_window = e_shell_get_preferences_window (shell); e_preferences_window_setup (E_PREFERENCES_WINDOW (preferences_window)); gtk_window_set_transient_for ( GTK_WINDOW (preferences_window), GTK_WINDOW (composer)); gtk_window_set_position ( GTK_WINDOW (preferences_window), GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_present (GTK_WINDOW (preferences_window)); e_preferences_window_show_page ( E_PREFERENCES_WINDOW (preferences_window), page_name); } static void action_print_cb (GtkAction *action, EMsgComposer *composer) { GtkPrintOperationAction print_action; print_action = GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG; e_msg_composer_print (composer, print_action); } static void action_print_preview_cb (GtkAction *action, EMsgComposer *composer) { GtkPrintOperationAction print_action; print_action = GTK_PRINT_OPERATION_ACTION_PREVIEW; e_msg_composer_print (composer, print_action); } static void action_save_cb (GtkAction *action, EMsgComposer *composer) { EHTMLEditor *editor; EHTMLEditorView *view; const gchar *filename; gint fd; GError *error = NULL; editor = e_msg_composer_get_editor (composer); filename = e_html_editor_get_filename (editor); if (filename == NULL) { gtk_action_activate (ACTION (SAVE_AS)); return; } /* Check if the file already exists and we can create it. */ fd = g_open (filename, O_RDONLY | O_CREAT | O_EXCL, 0777); if (fd < 0) { gint errno_saved = errno; if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { gint response; response = e_alert_run_dialog_for_args ( GTK_WINDOW (composer), E_ALERT_ASK_FILE_EXISTS_OVERWRITE, filename, NULL); if (response != GTK_RESPONSE_OK) return; } else { e_alert_submit ( E_ALERT_SINK (composer), E_ALERT_NO_SAVE_FILE, filename, g_strerror (errno_saved), NULL); return; } } else close (fd); if (!e_html_editor_save (editor, filename, TRUE, &error)) { e_alert_submit ( E_ALERT_SINK (composer), E_ALERT_NO_SAVE_FILE, filename, error->message, NULL); g_error_free (error); return; } view = e_html_editor_get_view (editor); e_html_editor_view_set_changed (view, TRUE); } static void action_save_as_cb (GtkAction *action, EMsgComposer *composer) { EHTMLEditor *editor; GtkWidget *dialog; gchar *filename; gint response; dialog = gtk_file_chooser_dialog_new ( _("Save as..."), GTK_WINDOW (composer), GTK_FILE_CHOOSER_ACTION_SAVE, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Save"), GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response ( GTK_DIALOG (dialog), GTK_RESPONSE_OK); gtk_file_chooser_set_local_only ( GTK_FILE_CHOOSER (dialog), FALSE); gtk_window_set_icon_name ( GTK_WINDOW (dialog), "mail-message-new"); response = gtk_dialog_run (GTK_DIALOG (dialog)); if (response != GTK_RESPONSE_OK) goto exit; editor = e_msg_composer_get_editor (composer); filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); e_html_editor_set_filename (editor, filename); g_free (filename); gtk_action_activate (ACTION (SAVE)); exit: gtk_widget_destroy (dialog); } static void action_save_draft_cb (GtkAction *action, EMsgComposer *composer) { e_msg_composer_save_to_drafts (composer); } static void action_send_cb (GtkAction *action, EMsgComposer *composer) { e_msg_composer_send (composer); } static void action_smime_encrypt_cb (GtkToggleAction *action, EMsgComposer *composer) { EHTMLEditor *editor; EHTMLEditorView *view; editor = e_msg_composer_get_editor (composer); view = e_html_editor_get_view (editor); e_html_editor_view_set_changed (view, TRUE); } static void action_smime_sign_cb (GtkToggleAction *action, EMsgComposer *composer) { EHTMLEditor *editor; EHTMLEditorView *view; editor = e_msg_composer_get_editor (composer); view = e_html_editor_get_view (editor); e_html_editor_view_set_changed (view, TRUE); } static gboolean composer_actions_accel_activate_cb (GtkAccelGroup *accel_group, GObject *acceleratable, guint keyval, GdkModifierType modifier, gpointer user_data) { EMsgComposer *composer = user_data; if (keyval == GDK_KEY_Return && (modifier & GDK_MODIFIER_MASK) == GDK_CONTROL_MASK && !composer_copy_em_utils_prompt_user (GTK_WINDOW (composer), "prompt-on-accel-send", "mail-composer:prompt-accel-send", NULL)) { return TRUE; } return FALSE; } static GtkActionEntry entries[] = { { "attach", "mail-attachment", N_("_Attachment..."), "m", N_("Attach a file"), G_CALLBACK (action_attach_cb) }, { "close", "window-close", N_("_Close"), "w", N_("Close the current file"), G_CALLBACK (action_close_cb) }, { "new-message", "mail-message-new", N_("New _Message"), "n", N_("Open New Message window"), G_CALLBACK (action_new_message_cb) }, { "preferences", "preferences-system", N_("_Preferences"), NULL, N_("Configure Evolution"), G_CALLBACK (action_preferences_cb) }, { "save", "document-save", N_("_Save"), "s", N_("Save the current file"), G_CALLBACK (action_save_cb) }, { "save-as", "document-save-as", N_("Save _As..."), NULL, N_("Save the current file with a different name"), G_CALLBACK (action_save_as_cb) }, /* Menus */ { "charset-menu", NULL, N_("Character _Encoding"), NULL, NULL, NULL }, { "options-menu", NULL, N_("_Options"), NULL, NULL, NULL } }; static GtkActionEntry async_entries[] = { { "print", "document-print", N_("_Print..."), "p", NULL, G_CALLBACK (action_print_cb) }, { "print-preview", "document-print-preview", N_("Print Pre_view"), "p", NULL, G_CALLBACK (action_print_preview_cb) }, { "save-draft", "document-save", N_("Save as _Draft"), "s", N_("Save as draft"), G_CALLBACK (action_save_draft_cb) }, { "send", "mail-send", N_("S_end"), "Return", N_("Send this message"), G_CALLBACK (action_send_cb) }, }; static GtkToggleActionEntry toggle_entries[] = { { "pgp-encrypt", NULL, N_("PGP _Encrypt"), NULL, N_("Encrypt this message with PGP"), G_CALLBACK (action_pgp_encrypt_cb), FALSE }, { "pgp-sign", NULL, N_("PGP _Sign"), NULL, N_("Sign this message with your PGP key"), G_CALLBACK (action_pgp_sign_cb), FALSE }, { "picture-gallery", "emblem-photos", N_("_Picture Gallery"), NULL, N_("Show a collection of pictures that you can drag to your message"), NULL, /* no callback */ FALSE }, { "prioritize-message", NULL, N_("_Prioritize Message"), NULL, N_("Set the message priority to high"), NULL, /* no callback */ FALSE }, { "request-read-receipt", NULL, N_("Re_quest Read Receipt"), NULL, N_("Get delivery notification when your message is read"), NULL, /* no callback */ FALSE }, { "smime-encrypt", NULL, N_("S/MIME En_crypt"), NULL, N_("Encrypt this message with your S/MIME Encryption Certificate"), G_CALLBACK (action_smime_encrypt_cb), FALSE }, { "smime-sign", NULL, N_("S/MIME Sig_n"), NULL, N_("Sign this message with your S/MIME Signature Certificate"), G_CALLBACK (action_smime_sign_cb), FALSE }, { "view-bcc", NULL, N_("_Bcc Field"), NULL, N_("Toggles whether the BCC field is displayed"), NULL, /* Handled by property bindings */ FALSE }, { "view-cc", NULL, N_("_Cc Field"), NULL, N_("Toggles whether the CC field is displayed"), NULL, /* Handled by property bindings */ FALSE }, { "view-reply-to", NULL, N_("_Reply-To Field"), NULL, N_("Toggles whether the Reply-To field is displayed"), NULL, /* Handled by property bindings */ FALSE }, }; void e_composer_actions_init (EMsgComposer *composer) { GtkActionGroup *action_group; GtkAccelGroup *accel_group; GtkUIManager *ui_manager; EHTMLEditor *editor; EHTMLEditorView *view; gboolean visible; g_return_if_fail (E_IS_MSG_COMPOSER (composer)); editor = e_msg_composer_get_editor (composer); view = e_html_editor_get_view (editor); ui_manager = e_html_editor_get_ui_manager (editor); /* Composer Actions */ action_group = composer->priv->composer_actions; gtk_action_group_set_translation_domain ( action_group, GETTEXT_PACKAGE); gtk_action_group_add_actions ( action_group, entries, G_N_ELEMENTS (entries), composer); gtk_action_group_add_toggle_actions ( action_group, toggle_entries, G_N_ELEMENTS (toggle_entries), composer); gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); /* Asynchronous Actions */ action_group = composer->priv->async_actions; gtk_action_group_set_translation_domain ( action_group, GETTEXT_PACKAGE); gtk_action_group_add_actions ( action_group, async_entries, G_N_ELEMENTS (async_entries), composer); gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); /* Character Set Actions */ action_group = composer->priv->charset_actions; gtk_action_group_set_translation_domain ( action_group, GETTEXT_PACKAGE); e_charset_add_radio_actions ( action_group, "charset-", composer->priv->charset, G_CALLBACK (action_charset_cb), composer); gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); /* Fine Tuning */ g_object_set ( ACTION (ATTACH), "short-label", _("Attach"), NULL); g_object_set ( ACTION (PICTURE_GALLERY), "is-important", TRUE, NULL); g_object_set ( ACTION (SAVE_DRAFT), "short-label", _("Save Draft"), NULL); g_object_bind_property ( view, "html-mode", ACTION (PICTURE_GALLERY), "sensitive", G_BINDING_SYNC_CREATE); g_object_bind_property ( view, "editable", e_html_editor_get_action (editor, "edit-menu"), "sensitive", G_BINDING_SYNC_CREATE); g_object_bind_property ( view, "editable", e_html_editor_get_action (editor, "format-menu"), "sensitive", G_BINDING_SYNC_CREATE); g_object_bind_property ( view, "editable", e_html_editor_get_action (editor, "insert-menu"), "sensitive", G_BINDING_SYNC_CREATE); g_object_bind_property ( view, "editable", e_html_editor_get_action (editor, "options-menu"), "sensitive", G_BINDING_SYNC_CREATE); g_object_bind_property ( view, "editable", e_html_editor_get_action (editor, "picture-gallery"), "sensitive", G_BINDING_SYNC_CREATE); #if defined (HAVE_NSS) visible = TRUE; #else visible = FALSE; #endif gtk_action_set_visible (ACTION (SMIME_ENCRYPT), visible); gtk_action_set_visible (ACTION (SMIME_SIGN), visible); accel_group = gtk_ui_manager_get_accel_group (ui_manager); g_signal_connect (accel_group, "accel-activate", G_CALLBACK (composer_actions_accel_activate_cb), composer); }