diff options
Diffstat (limited to 'composer')
-rw-r--r-- | composer/e-composer-private.c | 28 | ||||
-rw-r--r-- | composer/e-composer-private.h | 3 | ||||
-rw-r--r-- | composer/e-msg-composer.c | 295 | ||||
-rw-r--r-- | composer/e-msg-composer.h | 2 |
4 files changed, 199 insertions, 129 deletions
diff --git a/composer/e-composer-private.c b/composer/e-composer-private.c index d16afa32f0..8dfdeeb4b0 100644 --- a/composer/e-composer-private.c +++ b/composer/e-composer-private.c @@ -83,12 +83,13 @@ composer_setup_recent_menu (EMsgComposer *composer) } void -e_composer_private_init (EMsgComposer *composer) +e_composer_private_constructed (EMsgComposer *composer) { EMsgComposerPrivate *priv = composer->priv; - + EFocusTracker *focus_tracker; GtkhtmlEditor *editor; GtkUIManager *ui_manager; + GtkAction *action; GtkWidget *container; GtkWidget *widget; GtkWidget *send_widget; @@ -157,6 +158,24 @@ e_composer_private_init (EMsgComposer *composer) g_clear_error (&error); } + /* Configure an EFocusTracker to manage selection actions. */ + + focus_tracker = e_focus_tracker_new (GTK_WINDOW (composer)); + + action = gtkhtml_editor_get_action (editor, "cut"); + e_focus_tracker_set_cut_clipboard_action (focus_tracker, action); + + action = gtkhtml_editor_get_action (editor, "copy"); + e_focus_tracker_set_copy_clipboard_action (focus_tracker, action); + + action = gtkhtml_editor_get_action (editor, "paste"); + e_focus_tracker_set_paste_clipboard_action (focus_tracker, action); + + action = gtkhtml_editor_get_action (editor, "select-all"); + e_focus_tracker_set_select_all_action (focus_tracker, action); + + priv->focus_tracker = focus_tracker; + /* Construct the header table. */ container = editor->vbox; @@ -314,6 +333,11 @@ e_composer_private_dispose (EMsgComposer *composer) composer->priv->attachment_paned = NULL; } + if (composer->priv->focus_tracker != NULL) { + g_object_unref (composer->priv->focus_tracker); + composer->priv->focus_tracker = NULL; + } + if (composer->priv->window_group != NULL) { g_object_unref (composer->priv->window_group); composer->priv->window_group = NULL; diff --git a/composer/e-composer-private.h b/composer/e-composer-private.h index 54837b9093..bab8dd160a 100644 --- a/composer/e-composer-private.h +++ b/composer/e-composer-private.h @@ -94,6 +94,7 @@ struct _EMsgComposerPrivate { GtkWidget *header_table; GtkWidget *attachment_paned; + EFocusTracker *focus_tracker; GtkWindowGroup *window_group; GtkActionGroup *charset_actions; @@ -130,7 +131,7 @@ struct _EMsgComposerPrivate { gboolean mail_sent; }; -void e_composer_private_init (EMsgComposer *composer); +void e_composer_private_constructed (EMsgComposer *composer); void e_composer_private_dispose (EMsgComposer *composer); void e_composer_private_finalize (EMsgComposer *composer); diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c index 6477936011..eed3893d95 100644 --- a/composer/e-msg-composer.c +++ b/composer/e-msg-composer.c @@ -55,6 +55,7 @@ #include "shell/e-shell.h" #include "em-format/em-format.h" #include "em-format/em-format-quote.h" +#include "misc/e-web-view.h" #include <camel/camel-charset-map.h> #include <camel/camel-cipher-context.h> @@ -92,6 +93,11 @@ ((obj), E_TYPE_MSG_COMPOSER, EMsgComposerPrivate)) enum { + PROP_0, + PROP_FOCUS_TRACKER +}; + +enum { SEND, SAVE_DRAFT, PRINT, @@ -118,6 +124,14 @@ static void handle_multipart_alternative (EMsgComposer *composer, CamelMultipart static void handle_multipart_encrypted (EMsgComposer *composer, CamelMimePart *multipart, gint depth); static void handle_multipart_signed (EMsgComposer *composer, CamelMultipart *multipart, gint depth); +static void msg_composer_drag_data_received (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + GtkSelectionData *selection, + guint info, + guint time); + /** * emcu_part_to_html: * @part: @@ -1514,32 +1528,90 @@ msg_composer_notify_header_cb (EMsgComposer *composer) gtkhtml_editor_set_changed (editor, TRUE); } -static GObject * -msg_composer_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties) +static void +msg_composer_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_FOCUS_TRACKER: + g_value_set_object ( + value, e_msg_composer_get_focus_tracker ( + E_MSG_COMPOSER (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); +} + +static void +msg_composer_dispose (GObject *object) +{ + EMsgComposer *composer = E_MSG_COMPOSER (object); + + e_composer_private_dispose (composer); + + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +msg_composer_finalize (GObject *object) +{ + EMsgComposer *composer = E_MSG_COMPOSER (object); + + e_composer_autosave_unregister (composer); + e_composer_private_finalize (composer); + + /* Chain up to parent's finalize() method. */ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +msg_composer_constructed (GObject *object) { EShell *shell; EShellSettings *shell_settings; - GObject *object; + GtkhtmlEditor *editor; EMsgComposer *composer; + EAttachmentView *view; + EAttachmentStore *store; + EComposerHeaderTable *table; + GdkDragAction drag_actions; + GtkTargetList *target_list; + GtkTargetEntry *targets; + GtkUIManager *ui_manager; GtkToggleAction *action; + GtkHTML *html; GArray *array; + const gchar *id; gboolean active; guint binding_id; + gint n_targets; - /* Chain up to parent's constructor() method. */ - object = G_OBJECT_CLASS (parent_class)->constructor ( - type, n_construct_properties, construct_properties); - + editor = GTKHTML_EDITOR (object); composer = E_MSG_COMPOSER (object); - array = composer->priv->gconf_bridge_binding_ids; shell = e_shell_get_default (); shell_settings = e_shell_get_shell_settings (shell); + e_composer_private_constructed (composer); + + html = gtkhtml_editor_get_html (editor); + ui_manager = gtkhtml_editor_get_ui_manager (editor); + view = e_msg_composer_get_attachment_view (composer); + table = E_COMPOSER_HEADER_TABLE (composer->priv->header_table); + + gtk_window_set_title (GTK_WINDOW (composer), _("Compose Message")); + gtk_window_set_icon_name (GTK_WINDOW (composer), "mail-message-new"); + + e_shell_watch_window (shell, GTK_WINDOW (object)); + /* Restore Persistent State */ + array = composer->priv->gconf_bridge_binding_ids; + binding_id = gconf_bridge_bind_property ( gconf_bridge_get (), COMPOSER_GCONF_CURRENT_FOLDER_KEY, @@ -1563,32 +1635,77 @@ msg_composer_constructor (GType type, shell_settings, "composer-request-receipt"); gtk_toggle_action_set_active (action, active); - e_shell_watch_window (shell, GTK_WINDOW (object)); + /* Drag-and-Drop Support */ - return object; -} + target_list = e_attachment_view_get_target_list (view); + drag_actions = e_attachment_view_get_drag_actions (view); -static void -msg_composer_dispose (GObject *object) -{ - EMsgComposer *composer = E_MSG_COMPOSER (object); + targets = gtk_target_table_new_from_list (target_list, &n_targets); - e_composer_private_dispose (composer); + gtk_drag_dest_set ( + GTK_WIDGET (composer), GTK_DEST_DEFAULT_ALL, + targets, n_targets, drag_actions); - /* Chain up to parent's dispose() method. */ - G_OBJECT_CLASS (parent_class)->dispose (object); -} + g_signal_connect ( + html, "drag-data-received", + G_CALLBACK (msg_composer_drag_data_received), NULL); -static void -msg_composer_finalize (GObject *object) -{ - EMsgComposer *composer = E_MSG_COMPOSER (object); + gtk_target_table_free (targets, n_targets); - e_composer_autosave_unregister (composer); - e_composer_private_finalize (composer); + /* Configure Headers */ - /* Chain up to parent's finalize() method. */ - G_OBJECT_CLASS (parent_class)->finalize (object); + e_composer_header_table_set_account_list ( + table, e_get_account_list ()); + e_composer_header_table_set_signature_list ( + table, e_get_signature_list ()); + + g_signal_connect_swapped ( + table, "notify::account", + G_CALLBACK (msg_composer_account_changed_cb), composer); + g_signal_connect_swapped ( + table, "notify::destinations-bcc", + G_CALLBACK (msg_composer_notify_header_cb), composer); + g_signal_connect_swapped ( + table, "notify::destinations-cc", + G_CALLBACK (msg_composer_notify_header_cb), composer); + g_signal_connect_swapped ( + table, "notify::destinations-to", + G_CALLBACK (msg_composer_notify_header_cb), composer); + g_signal_connect_swapped ( + table, "notify::reply-to", + G_CALLBACK (msg_composer_notify_header_cb), composer); + g_signal_connect_swapped ( + table, "notify::signature", + G_CALLBACK (e_msg_composer_show_sig_file), composer); + g_signal_connect_swapped ( + table, "notify::subject", + G_CALLBACK (msg_composer_subject_changed_cb), composer); + g_signal_connect_swapped ( + table, "notify::subject", + G_CALLBACK (msg_composer_notify_header_cb), composer); + + msg_composer_account_changed_cb (composer); + + /* Attachments */ + + store = e_attachment_view_get_store (view); + + g_signal_connect_swapped ( + store, "row-deleted", + G_CALLBACK (attachment_store_changed_cb), composer); + + g_signal_connect_swapped ( + store, "row-inserted", + G_CALLBACK (attachment_store_changed_cb), composer); + + e_composer_autosave_register (composer); + + /* Initialization may have tripped the "changed" state. */ + gtkhtml_editor_set_changed (editor, FALSE); + + id = "org.gnome.evolution.composer"; + e_plugin_ui_register_manager (ui_manager, id, composer); + e_plugin_ui_enable_manager (ui_manager, id); } static void @@ -2045,9 +2162,10 @@ msg_composer_class_init (EMsgComposerClass *class) g_type_class_add_private (class, sizeof (EMsgComposerPrivate)); object_class = G_OBJECT_CLASS (class); - object_class->constructor = msg_composer_constructor; + object_class->get_property = msg_composer_get_property; object_class->dispose = msg_composer_dispose; object_class->finalize = msg_composer_finalize; + object_class->constructed = msg_composer_constructed; gtk_object_class = GTK_OBJECT_CLASS (class); gtk_object_class->destroy = msg_composer_destroy; @@ -2071,6 +2189,16 @@ msg_composer_class_init (EMsgComposerClass *class) editor_class->object_deleted = msg_composer_object_deleted; editor_class->uri_requested = msg_composer_uri_requested; + g_object_class_install_property ( + object_class, + PROP_FOCUS_TRACKER, + g_param_spec_object ( + "focus-tracker", + NULL, + NULL, + E_TYPE_FOCUS_TRACKER, + G_PARAM_READABLE)); + signals[SEND] = g_signal_new ( "send", G_OBJECT_CLASS_TYPE (class), @@ -2100,103 +2228,8 @@ msg_composer_class_init (EMsgComposerClass *class) static void msg_composer_init (EMsgComposer *composer) { - EAttachmentView *view; - EAttachmentStore *store; - EComposerHeaderTable *table; - GdkDragAction drag_actions; - GtkTargetList *target_list; - GtkTargetEntry *targets; - GtkUIManager *ui_manager; - GtkhtmlEditor *editor; - GtkHTML *html; - const gchar *id; - gint n_targets; - composer->lite = composer_lite; composer->priv = E_MSG_COMPOSER_GET_PRIVATE (composer); - - e_composer_private_init (composer); - - editor = GTKHTML_EDITOR (composer); - html = gtkhtml_editor_get_html (editor); - ui_manager = gtkhtml_editor_get_ui_manager (editor); - view = e_msg_composer_get_attachment_view (composer); - table = E_COMPOSER_HEADER_TABLE (composer->priv->header_table); - - gtk_window_set_title (GTK_WINDOW (composer), _("Compose Message")); - gtk_window_set_icon_name (GTK_WINDOW (composer), "mail-message-new"); - - /* Drag-and-Drop Support */ - - target_list = e_attachment_view_get_target_list (view); - drag_actions = e_attachment_view_get_drag_actions (view); - - targets = gtk_target_table_new_from_list (target_list, &n_targets); - - gtk_drag_dest_set ( - GTK_WIDGET (composer), GTK_DEST_DEFAULT_ALL, - targets, n_targets, drag_actions); - - g_signal_connect ( - html, "drag-data-received", - G_CALLBACK (msg_composer_drag_data_received), NULL); - - gtk_target_table_free (targets, n_targets); - - /* Configure Headers */ - - e_composer_header_table_set_account_list ( - table, e_get_account_list ()); - e_composer_header_table_set_signature_list ( - table, e_get_signature_list ()); - - g_signal_connect_swapped ( - table, "notify::account", - G_CALLBACK (msg_composer_account_changed_cb), composer); - g_signal_connect_swapped ( - table, "notify::destinations-bcc", - G_CALLBACK (msg_composer_notify_header_cb), composer); - g_signal_connect_swapped ( - table, "notify::destinations-cc", - G_CALLBACK (msg_composer_notify_header_cb), composer); - g_signal_connect_swapped ( - table, "notify::destinations-to", - G_CALLBACK (msg_composer_notify_header_cb), composer); - g_signal_connect_swapped ( - table, "notify::reply-to", - G_CALLBACK (msg_composer_notify_header_cb), composer); - g_signal_connect_swapped ( - table, "notify::signature", - G_CALLBACK (e_msg_composer_show_sig_file), composer); - g_signal_connect_swapped ( - table, "notify::subject", - G_CALLBACK (msg_composer_subject_changed_cb), composer); - g_signal_connect_swapped ( - table, "notify::subject", - G_CALLBACK (msg_composer_notify_header_cb), composer); - - msg_composer_account_changed_cb (composer); - - /* Attachments */ - - store = e_attachment_view_get_store (view); - - g_signal_connect_swapped ( - store, "row-deleted", - G_CALLBACK (attachment_store_changed_cb), composer); - - g_signal_connect_swapped ( - store, "row-inserted", - G_CALLBACK (attachment_store_changed_cb), composer); - - e_composer_autosave_register (composer); - - /* Initialization may have tripped the "changed" state. */ - gtkhtml_editor_set_changed (editor, FALSE); - - id = "org.gnome.evolution.composer"; - e_plugin_ui_register_manager (ui_manager, id, composer); - e_plugin_ui_enable_manager (ui_manager, id); } GType @@ -2237,7 +2270,9 @@ e_msg_composer_get_type (void) EMsgComposer * e_msg_composer_new (void) { - return g_object_new (E_TYPE_MSG_COMPOSER, NULL); + return g_object_new ( + E_TYPE_MSG_COMPOSER, + "html", e_web_view_new (), NULL); } void @@ -2265,6 +2300,14 @@ e_msg_composer_lite_new (void) return composer; } +EFocusTracker * +e_msg_composer_get_focus_tracker (EMsgComposer *composer) +{ + g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL); + + return composer->priv->focus_tracker; +} + static void e_msg_composer_set_pending_body (EMsgComposer *composer, gchar *text, diff --git a/composer/e-msg-composer.h b/composer/e-msg-composer.h index 74128e0c0f..c55237ce52 100644 --- a/composer/e-msg-composer.h +++ b/composer/e-msg-composer.h @@ -31,6 +31,7 @@ #include <libebook/e-destination.h> #include <gtkhtml-editor.h> #include <misc/e-attachment-view.h> +#include <misc/e-focus-tracker.h> #include "e-composer-header-table.h" @@ -78,6 +79,7 @@ EMsgComposer * e_msg_composer_new_with_message (CamelMimeMessage *msg); EMsgComposer * e_msg_composer_new_from_url (const gchar *url); EMsgComposer * e_msg_composer_new_redirect (CamelMimeMessage *message, const gchar *resent_from); +EFocusTracker * e_msg_composer_get_focus_tracker(EMsgComposer *composer); CamelSession * e_msg_composer_get_session (EMsgComposer *composer); void e_msg_composer_send (EMsgComposer *composer); |