diff options
Diffstat (limited to 'e-util/e-mail-signature-editor.c')
-rw-r--r-- | e-util/e-mail-signature-editor.c | 319 |
1 files changed, 138 insertions, 181 deletions
diff --git a/e-util/e-mail-signature-editor.c b/e-util/e-mail-signature-editor.c index 05c783d448..b5c87635f1 100644 --- a/e-util/e-mail-signature-editor.c +++ b/e-util/e-mail-signature-editor.c @@ -17,13 +17,13 @@ #include "e-mail-signature-editor.h" +#include <config.h> #include <string.h> #include <glib/gi18n.h> -#include "e-alert-bar.h" #include "e-alert-dialog.h" #include "e-alert-sink.h" -#include "e-web-view-gtkhtml.h" +#include "e-alert-bar.h" #define E_MAIL_SIGNATURE_EDITOR_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE \ @@ -32,6 +32,7 @@ typedef struct _AsyncContext AsyncContext; struct _EMailSignatureEditorPrivate { + EHTMLEditor *editor; GtkActionGroup *action_group; EFocusTracker *focus_tracker; GCancellable *cancellable; @@ -40,7 +41,6 @@ struct _EMailSignatureEditorPrivate { gchar *original_name; GtkWidget *entry; /* not referenced */ - GtkWidget *alert_bar; /* not referenced */ }; struct _AsyncContext { @@ -52,6 +52,7 @@ struct _AsyncContext { enum { PROP_0, + PROP_EDITOR, PROP_FOCUS_TRACKER, PROP_REGISTRY, PROP_SOURCE @@ -75,17 +76,10 @@ static const gchar *ui = " </toolbar>\n" "</ui>"; -/* Forward Declarations */ -static void e_mail_signature_editor_alert_sink_init - (EAlertSinkInterface *iface); - -G_DEFINE_TYPE_WITH_CODE ( +G_DEFINE_TYPE ( EMailSignatureEditor, e_mail_signature_editor, - GTKHTML_TYPE_EDITOR, - G_IMPLEMENT_INTERFACE ( - E_TYPE_ALERT_SINK, - e_mail_signature_editor_alert_sink_init)) + GTK_TYPE_WINDOW) static void async_context_free (AsyncContext *async_context) @@ -106,8 +100,10 @@ mail_signature_editor_loaded_cb (GObject *object, GAsyncResult *result, gpointer user_data) { + EHTMLEditor *editor; + EHTMLEditorView *view; ESource *source; - EMailSignatureEditor *editor; + EMailSignatureEditor *window; ESourceMailSignature *extension; const gchar *extension_name; const gchar *mime_type; @@ -116,7 +112,7 @@ mail_signature_editor_loaded_cb (GObject *object, GError *error = NULL; source = E_SOURCE (object); - editor = E_MAIL_SIGNATURE_EDITOR (user_data); + window = E_MAIL_SIGNATURE_EDITOR (user_data); e_source_mail_signature_load_finish ( source, result, &contents, NULL, &error); @@ -124,17 +120,17 @@ mail_signature_editor_loaded_cb (GObject *object, /* Ignore cancellations. */ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { g_warn_if_fail (contents == NULL); - g_object_unref (editor); + g_object_unref (window); g_error_free (error); return; } else if (error != NULL) { g_warn_if_fail (contents == NULL); e_alert_submit ( - E_ALERT_SINK (editor), + E_ALERT_SINK (window), "widgets:no-load-signature", error->message, NULL); - g_object_unref (editor); + g_object_unref (window); g_error_free (error); return; } @@ -147,30 +143,18 @@ mail_signature_editor_loaded_cb (GObject *object, mime_type = e_source_mail_signature_get_mime_type (extension); is_html = (g_strcmp0 (mime_type, "text/html") == 0); - gtkhtml_editor_set_html_mode (GTKHTML_EDITOR (editor), is_html); + editor = e_mail_signature_editor_get_editor (window); + view = e_html_editor_get_view (editor); + e_html_editor_view_set_html_mode (view, is_html); - if (is_html) { - gtkhtml_editor_insert_html ( - GTKHTML_EDITOR (editor), contents); - } else { - gtkhtml_editor_insert_text ( - GTKHTML_EDITOR (editor), contents); - - gtkhtml_editor_run_command ( - GTKHTML_EDITOR (editor), "cursor-position-save"); - gtkhtml_editor_run_command ( - GTKHTML_EDITOR (editor), "select-all"); - gtkhtml_editor_run_command ( - GTKHTML_EDITOR (editor), "style-pre"); - gtkhtml_editor_run_command ( - GTKHTML_EDITOR (editor), "unselect-all"); - gtkhtml_editor_run_command ( - GTKHTML_EDITOR (editor), "cursor-position-restore"); - } + if (is_html) + e_html_editor_view_set_text_html (view, contents); + else + e_html_editor_view_set_text_plain (view, contents); g_free (contents); - g_object_unref (editor); + g_object_unref (window); } static gboolean @@ -189,28 +173,33 @@ mail_signature_editor_delete_event_cb (EMailSignatureEditor *editor, static void action_close_cb (GtkAction *action, - EMailSignatureEditor *editor) + EMailSignatureEditor *window) { + EHTMLEditor *editor; + EHTMLEditorView *view; gboolean something_changed = FALSE; const gchar *original_name; const gchar *signature_name; - original_name = editor->priv->original_name; - signature_name = gtk_entry_get_text (GTK_ENTRY (editor->priv->entry)); + original_name = window->priv->original_name; + signature_name = gtk_entry_get_text (GTK_ENTRY (window->priv->entry)); + + editor = e_mail_signature_editor_get_editor (window); + view = e_html_editor_get_view (editor); - something_changed |= gtkhtml_editor_has_undo (GTKHTML_EDITOR (editor)); + something_changed |= webkit_web_view_can_undo (WEBKIT_WEB_VIEW (view)); something_changed |= (strcmp (signature_name, original_name) != 0); if (something_changed) { gint response; response = e_alert_run_dialog_for_args ( - GTK_WINDOW (editor), + GTK_WINDOW (window), "widgets:ask-signature-changed", NULL); if (response == GTK_RESPONSE_YES) { GtkActionGroup *action_group; - action_group = editor->priv->action_group; + action_group = window->priv->action_group; action = gtk_action_group_get_action ( action_group, "save-and-close"); gtk_action_activate (action); @@ -219,7 +208,7 @@ action_close_cb (GtkAction *action, return; } - gtk_widget_destroy (GTK_WIDGET (editor)); + gtk_widget_destroy (GTK_WIDGET (window)); } static void @@ -292,8 +281,7 @@ action_save_and_close_cb (GtkAction *action, /* Only make sure that the 'source-changed' is called, * thus the preview of the signature is updated on save. * It is not called when only signature body is changed - * (and ESource properties are left unchanged). - */ + * (and ESource properties are left unchanged). */ g_signal_emit_by_name (registry, "source-changed", source); gtk_widget_destroy (GTK_WIDGET (editor)); @@ -397,6 +385,13 @@ mail_signature_editor_get_property (GObject *object, GParamSpec *pspec) { switch (property_id) { + case PROP_EDITOR: + g_value_set_object ( + value, + e_mail_signature_editor_get_editor ( + E_MAIL_SIGNATURE_EDITOR (object))); + return; + case PROP_FOCUS_TRACKER: g_value_set_object ( value, @@ -429,6 +424,11 @@ mail_signature_editor_dispose (GObject *object) priv = E_MAIL_SIGNATURE_EDITOR_GET_PRIVATE (object); + if (priv->editor != NULL) { + g_object_unref (priv->editor); + priv->editor = NULL; + } + if (priv->action_group != NULL) { g_object_unref (priv->action_group); priv->action_group = NULL; @@ -477,16 +477,18 @@ mail_signature_editor_finalize (GObject *object) static void mail_signature_editor_constructed (GObject *object) { - EMailSignatureEditor *editor; + EMailSignatureEditor *window; GtkActionGroup *action_group; EFocusTracker *focus_tracker; - GtkhtmlEditor *gtkhtml_editor; + EHTMLEditor *editor; + EHTMLEditorView *view; GtkUIManager *ui_manager; GDBusObject *dbus_object; ESource *source; GtkAction *action; GtkWidget *container; GtkWidget *widget; + GtkWidget *hbox; const gchar *display_name; GError *error = NULL; @@ -494,10 +496,11 @@ mail_signature_editor_constructed (GObject *object) G_OBJECT_CLASS (e_mail_signature_editor_parent_class)-> constructed (object); - editor = E_MAIL_SIGNATURE_EDITOR (object); + window = E_MAIL_SIGNATURE_EDITOR (object); + editor = e_mail_signature_editor_get_editor (window); + view = e_html_editor_get_view (editor); - gtkhtml_editor = GTKHTML_EDITOR (editor); - ui_manager = gtkhtml_editor_get_ui_manager (gtkhtml_editor); + ui_manager = e_html_editor_get_ui_manager (editor); /* Because we are loading from a hard-coded string, there is * no chance of I/O errors. Failure here implies a malformed @@ -511,103 +514,102 @@ mail_signature_editor_constructed (GObject *object) action_group, GETTEXT_PACKAGE); gtk_action_group_add_actions ( action_group, entries, - G_N_ELEMENTS (entries), editor); + G_N_ELEMENTS (entries), window); gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); - editor->priv->action_group = g_object_ref (action_group); + window->priv->action_group = g_object_ref (action_group); /* Hide page properties because it is not inherited in the mail. */ - action = gtkhtml_editor_get_action (gtkhtml_editor, "properties-page"); + action = e_html_editor_get_action (editor, "properties-page"); gtk_action_set_visible (action, FALSE); - action = gtkhtml_editor_get_action ( - gtkhtml_editor, "context-properties-page"); + action = e_html_editor_get_action (editor, "context-properties-page"); gtk_action_set_visible (action, FALSE); gtk_ui_manager_ensure_update (ui_manager); - gtk_window_set_title (GTK_WINDOW (editor), _("Edit Signature")); + gtk_window_set_title (GTK_WINDOW (window), _("Edit Signature")); + gtk_window_set_default_size (GTK_WINDOW (window), 600, 440); - /* Construct the signature name entry. */ + widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_container_add (GTK_CONTAINER (window), widget); + gtk_widget_show (widget); + + container = widget; + + /* Construct the main menu and toolbar. */ + + widget = e_html_editor_get_managed_widget (editor, "/main-menu"); + gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); + gtk_widget_show (widget); + + widget = e_html_editor_get_managed_widget (editor, "/main-toolbar"); + gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); + gtk_widget_show (widget); - container = gtkhtml_editor->vbox; + /* Construct the signature name entry. */ widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); gtk_container_set_border_width (GTK_CONTAINER (widget), 6); gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - /* Position 2 should be between the main and style toolbars. */ - gtk_box_reorder_child (GTK_BOX (container), widget, 2); gtk_widget_show (widget); - container = widget; + hbox = widget; widget = gtk_entry_new (); - gtk_box_pack_end (GTK_BOX (container), widget, TRUE, TRUE, 0); - editor->priv->entry = widget; /* not referenced */ + gtk_box_pack_end (GTK_BOX (hbox), widget, TRUE, TRUE, 0); + window->priv->entry = widget; /* not referenced */ gtk_widget_show (widget); widget = gtk_label_new_with_mnemonic (_("_Signature Name:")); - gtk_label_set_mnemonic_widget (GTK_LABEL (widget), editor->priv->entry); - gtk_box_pack_end (GTK_BOX (container), widget, FALSE, FALSE, 0); + gtk_label_set_mnemonic_widget (GTK_LABEL (widget), window->priv->entry); + gtk_box_pack_end (GTK_BOX (hbox), widget, FALSE, FALSE, 0); gtk_widget_show (widget); - g_signal_connect ( - editor, "delete-event", - G_CALLBACK (mail_signature_editor_delete_event_cb), NULL); - - /* Construct the alert bar for errors. */ + /* Construct the main editing area. */ - container = gtkhtml_editor->vbox; - - widget = e_alert_bar_new (); - gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); - /* Position 5 should be between the style toolbar and editing area. */ - gtk_box_reorder_child (GTK_BOX (container), widget, 5); - editor->priv->alert_bar = widget; /* not referenced */ - /* EAlertBar controls its own visibility. */ + widget = GTK_WIDGET (editor); + gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0); + gtk_widget_show (widget); - /* Configure an EFocusTracker to manage selection actions. - * - * XXX GtkhtmlEditor does not manage its own selection actions, - * which is technically a bug but works in our favor here - * because it won't cause any conflicts with EFocusTracker. */ + g_signal_connect ( + window, "delete-event", + G_CALLBACK (mail_signature_editor_delete_event_cb), NULL); - focus_tracker = e_focus_tracker_new (GTK_WINDOW (editor)); + /* Configure an EFocusTracker to manage selection actions. */ + focus_tracker = e_focus_tracker_new (GTK_WINDOW (window)); - action = gtkhtml_editor_get_action (gtkhtml_editor, "cut"); + action = e_html_editor_get_action (editor, "cut"); e_focus_tracker_set_cut_clipboard_action (focus_tracker, action); - action = gtkhtml_editor_get_action (gtkhtml_editor, "copy"); + action = e_html_editor_get_action (editor, "copy"); e_focus_tracker_set_copy_clipboard_action (focus_tracker, action); - action = gtkhtml_editor_get_action (gtkhtml_editor, "paste"); + action = e_html_editor_get_action (editor, "paste"); e_focus_tracker_set_paste_clipboard_action (focus_tracker, action); - action = gtkhtml_editor_get_action (gtkhtml_editor, "select-all"); + action = e_html_editor_get_action (editor, "select-all"); e_focus_tracker_set_select_all_action (focus_tracker, action); - editor->priv->focus_tracker = focus_tracker; + window->priv->focus_tracker = focus_tracker; - source = e_mail_signature_editor_get_source (editor); + source = e_mail_signature_editor_get_source (window); display_name = e_source_get_display_name (source); if (display_name == NULL || *display_name == '\0') display_name = _("Unnamed"); /* Set the entry text before we grab focus. */ - g_free (editor->priv->original_name); - editor->priv->original_name = g_strdup (display_name); - gtk_entry_set_text (GTK_ENTRY (editor->priv->entry), display_name); + g_free (window->priv->original_name); + window->priv->original_name = g_strdup (display_name); + gtk_entry_set_text (GTK_ENTRY (window->priv->entry), display_name); /* Set the focus appropriately. If this is a new signature, draw * the user's attention to the signature name entry. Otherwise go * straight to the editing area. */ if (source == NULL) { - gtk_widget_grab_focus (editor->priv->entry); + gtk_widget_grab_focus (window->priv->entry); } else { - GtkHTML *html; - - html = gtkhtml_editor_get_html (gtkhtml_editor); - gtk_widget_grab_focus (GTK_WIDGET (html)); + gtk_widget_grab_focus (GTK_WIDGET (view)); } /* Load file content only for an existing signature. @@ -623,72 +625,19 @@ mail_signature_editor_constructed (GObject *object) G_PRIORITY_DEFAULT, cancellable, mail_signature_editor_loaded_cb, - g_object_ref (editor)); + g_object_ref (window)); - g_warn_if_fail (editor->priv->cancellable == NULL); - editor->priv->cancellable = cancellable; + g_warn_if_fail (window->priv->cancellable == NULL); + window->priv->cancellable = cancellable; g_object_unref (dbus_object); } } static void -mail_signature_editor_cut_clipboard (GtkhtmlEditor *editor) -{ - /* Do nothing. EFocusTracker handles this. */ -} - -static void -mail_signature_editor_copy_clipboard (GtkhtmlEditor *editor) -{ - /* Do nothing. EFocusTracker handles this. */ -} - -static void -mail_signature_editor_paste_clipboard (GtkhtmlEditor *editor) -{ - /* Do nothing. EFocusTracker handles this. */ -} - -static void -mail_signature_editor_select_all (GtkhtmlEditor *editor) -{ - /* Do nothing. EFocusTracker handles this. */ -} - -static void -mail_signature_editor_submit_alert (EAlertSink *alert_sink, - EAlert *alert) -{ - EMailSignatureEditorPrivate *priv; - EAlertBar *alert_bar; - GtkWidget *dialog; - GtkWindow *parent; - - priv = E_MAIL_SIGNATURE_EDITOR_GET_PRIVATE (alert_sink); - - switch (e_alert_get_message_type (alert)) { - case GTK_MESSAGE_INFO: - case GTK_MESSAGE_WARNING: - case GTK_MESSAGE_ERROR: - alert_bar = E_ALERT_BAR (priv->alert_bar); - e_alert_bar_add_alert (alert_bar, alert); - break; - - default: - parent = GTK_WINDOW (alert_sink); - dialog = e_alert_dialog_new (parent, alert); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - break; - } -} - -static void e_mail_signature_editor_class_init (EMailSignatureEditorClass *class) { GObjectClass *object_class; - GtkhtmlEditorClass *editor_class; g_type_class_add_private (class, sizeof (EMailSignatureEditorPrivate)); @@ -699,11 +648,16 @@ e_mail_signature_editor_class_init (EMailSignatureEditorClass *class) object_class->finalize = mail_signature_editor_finalize; object_class->constructed = mail_signature_editor_constructed; - editor_class = GTKHTML_EDITOR_CLASS (class); - editor_class->cut_clipboard = mail_signature_editor_cut_clipboard; - editor_class->copy_clipboard = mail_signature_editor_copy_clipboard; - editor_class->paste_clipboard = mail_signature_editor_paste_clipboard; - editor_class->select_all = mail_signature_editor_select_all; + g_object_class_install_property ( + object_class, + PROP_EDITOR, + g_param_spec_object ( + "editor", + NULL, + NULL, + E_TYPE_HTML_EDITOR, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); g_object_class_install_property ( object_class, @@ -742,15 +696,11 @@ e_mail_signature_editor_class_init (EMailSignatureEditorClass *class) } static void -e_mail_signature_editor_alert_sink_init (EAlertSinkInterface *iface) -{ - iface->submit_alert = mail_signature_editor_submit_alert; -} - -static void e_mail_signature_editor_init (EMailSignatureEditor *editor) { editor->priv = E_MAIL_SIGNATURE_EDITOR_GET_PRIVATE (editor); + + editor->priv->editor = g_object_ref_sink (e_html_editor_new ()); } GtkWidget * @@ -764,11 +714,18 @@ e_mail_signature_editor_new (ESourceRegistry *registry, return g_object_new ( E_TYPE_MAIL_SIGNATURE_EDITOR, - "html", e_web_view_gtkhtml_new (), "registry", registry, "source", source, NULL); } +EHTMLEditor * +e_mail_signature_editor_get_editor (EMailSignatureEditor *editor) +{ + g_return_val_if_fail (E_IS_MAIL_SIGNATURE_EDITOR (editor), NULL); + + return editor->priv->editor; +} + EFocusTracker * e_mail_signature_editor_get_focus_tracker (EMailSignatureEditor *editor) { @@ -851,7 +808,7 @@ mail_signature_editor_commit_cb (GObject *object, } void -e_mail_signature_editor_commit (EMailSignatureEditor *editor, +e_mail_signature_editor_commit (EMailSignatureEditor *window, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) @@ -864,23 +821,23 @@ e_mail_signature_editor_commit (EMailSignatureEditor *editor, const gchar *extension_name; const gchar *mime_type; gchar *contents; - gboolean is_html; - gsize length; + EHTMLEditor *editor; + EHTMLEditorView *view; - g_return_if_fail (E_IS_MAIL_SIGNATURE_EDITOR (editor)); + g_return_if_fail (E_IS_MAIL_SIGNATURE_EDITOR (window)); - registry = e_mail_signature_editor_get_registry (editor); - source = e_mail_signature_editor_get_source (editor); - is_html = gtkhtml_editor_get_html_mode (GTKHTML_EDITOR (editor)); + registry = e_mail_signature_editor_get_registry (window); + source = e_mail_signature_editor_get_source (window); + + editor = e_mail_signature_editor_get_editor (window); + view = e_html_editor_get_view (editor); - if (is_html) { + if (e_html_editor_view_get_html_mode (view)) { mime_type = "text/html"; - contents = gtkhtml_editor_get_text_html ( - GTKHTML_EDITOR (editor), &length); + contents = e_html_editor_view_get_text_html (view); } else { mime_type = "text/plain"; - contents = gtkhtml_editor_get_text_plain ( - GTKHTML_EDITOR (editor), &length); + contents = e_html_editor_view_get_text_plain (view); } extension_name = E_SOURCE_EXTENSION_MAIL_SIGNATURE; @@ -890,13 +847,13 @@ e_mail_signature_editor_commit (EMailSignatureEditor *editor, async_context = g_slice_new0 (AsyncContext); async_context->source = g_object_ref (source); async_context->contents = contents; /* takes ownership */ - async_context->length = length; + async_context->length = strlen (contents); if (G_IS_CANCELLABLE (cancellable)) async_context->cancellable = g_object_ref (cancellable); simple = g_simple_async_result_new ( - G_OBJECT (editor), callback, user_data, + G_OBJECT (window), callback, user_data, e_mail_signature_editor_commit); g_simple_async_result_set_op_res_gpointer ( |