diff options
Diffstat (limited to 'plugins/external-editor/external-editor.c')
-rw-r--r-- | plugins/external-editor/external-editor.c | 106 |
1 files changed, 76 insertions, 30 deletions
diff --git a/plugins/external-editor/external-editor.c b/plugins/external-editor/external-editor.c index 584c0b61e4..2eb00b6e87 100644 --- a/plugins/external-editor/external-editor.c +++ b/plugins/external-editor/external-editor.c @@ -149,29 +149,28 @@ static void enable_disable_composer (EMsgComposer *composer, gboolean enable) { - GtkhtmlEditor *editor; + EHTMLEditor *editor; + EHTMLEditorView *view; GtkAction *action; GtkActionGroup *action_group; g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - editor = GTKHTML_EDITOR (composer); + editor = e_msg_composer_get_editor (composer); + view = e_html_editor_get_view (editor); - if (enable) - gtkhtml_editor_run_command (editor, "editable-on"); - else - gtkhtml_editor_run_command (editor, "editable-off"); + webkit_web_view_set_editable (WEBKIT_WEB_VIEW (view), enable); - action = GTKHTML_EDITOR_ACTION_EDIT_MENU (composer); + action = E_HTML_EDITOR_ACTION_EDIT_MENU (editor); gtk_action_set_sensitive (action, enable); - action = GTKHTML_EDITOR_ACTION_FORMAT_MENU (composer); + action = E_HTML_EDITOR_ACTION_FORMAT_MENU (editor); gtk_action_set_sensitive (action, enable); - action = GTKHTML_EDITOR_ACTION_INSERT_MENU (composer); + action = E_HTML_EDITOR_ACTION_INSERT_MENU (editor); gtk_action_set_sensitive (action, enable); - action_group = gtkhtml_editor_get_action_group (editor, "composer"); + action_group = e_html_editor_get_action_group (editor, "composer"); gtk_action_group_set_sensitive (action_group, enable); } @@ -192,16 +191,21 @@ static gboolean update_composer_text (GArray *array) { EMsgComposer *composer; + EHTMLEditor *editor; + EHTMLEditorView *view; gchar *text; composer = g_array_index (array, gpointer, 0); text = g_array_index (array, gpointer, 1); + editor = e_msg_composer_get_editor (composer); + view = e_html_editor_get_view (editor); + e_msg_composer_set_body_text (composer, text, FALSE); enable_composer (composer); - gtkhtml_editor_set_changed (GTKHTML_EDITOR (composer), TRUE); + e_html_editor_view_set_changed (view, TRUE); g_free (text); @@ -250,6 +254,49 @@ numlines (const gchar *text, return lineno; } +static gint +get_caret_position (EHTMLEditorView *view) +{ + WebKitDOMDocument *document; + WebKitDOMDOMWindow *window; + WebKitDOMDOMSelection *selection; + WebKitDOMRange *range; + gint range_count; + WebKitDOMNodeList *nodes; + gulong ii, length; + + document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view)); + window = webkit_dom_document_get_default_view (document); + selection = webkit_dom_dom_window_get_selection (window); + + if (webkit_dom_dom_selection_get_range_count (selection) < 1) + return 0; + + range = webkit_dom_dom_selection_get_range_at (selection, 0, NULL); + range_count = 0; + nodes = webkit_dom_node_get_child_nodes ( + webkit_dom_node_get_parent_node ( + webkit_dom_dom_selection_get_anchor_node ( + selection))); + length = webkit_dom_node_list_get_length (nodes); + for (ii = 0; ii < length; ii++) { + WebKitDOMNode *node; + + node = webkit_dom_node_list_item (nodes, ii); + if (webkit_dom_node_is_same_node ( + node, webkit_dom_dom_selection_get_anchor_node (selection))) { + + break; + } else if (webkit_dom_node_get_node_type (node) == 3) { + gchar *text = webkit_dom_node_get_text_content (node); + range_count += strlen (text); + g_free (text); + } + } + + return webkit_dom_range_get_start_offset (range, NULL) + range_count; +} + static gboolean external_editor_running = FALSE; static GMutex external_editor_running_lock; @@ -262,18 +309,21 @@ external_editor_thread (gpointer user_data) GSettings *settings; gchar *editor_cmd_line = NULL, *editor_cmd = NULL, *content; gint fd, position = -1, offset = -1; + EHTMLEditor *editor; + EHTMLEditorView *view; + + editor = e_msg_composer_get_editor (composer); + view = e_html_editor_get_view (editor); /* prefix temp files with evo so .*vimrc can be setup to recognize them */ fd = g_file_open_tmp ("evoXXXXXX", &filename, NULL); if (fd > 0) { - gsize length = 0; - close (fd); d (printf ("\n\aTemporary-file Name is : [%s] \n\a", filename)); /* Push the text (if there is one) from the composer to the file */ - content = gtkhtml_editor_get_text_plain (GTKHTML_EDITOR (composer), &length); - g_file_set_contents (filename, content, length, NULL); + content = e_html_editor_view_get_text_plain (view); + g_file_set_contents (filename, content, strlen (content), NULL); } else { struct run_error_dialog_data *data; @@ -292,7 +342,7 @@ external_editor_thread (gpointer user_data) settings = g_settings_new ("org.gnome.evolution.plugin.external-editor"); editor_cmd = g_settings_get_string (settings, "command"); if (!editor_cmd) { - if (!(editor_cmd = g_strdup (g_getenv ("EDITOR")))) + if (!(editor_cmd = g_strdup (g_getenv ("EDITOR"))) ) /* Make gedit the default external editor, * if the default schemas are not installed * and no $EDITOR is set. */ @@ -300,11 +350,8 @@ external_editor_thread (gpointer user_data) } g_object_unref (settings); - if (g_strrstr (editor_cmd, "vim") != NULL - && gtk_html_get_cursor_pos ( - gtkhtml_editor_get_html ( - GTKHTML_EDITOR (composer)), &position, &offset) - && position >= 0 && offset >= 0) { + if (g_strrstr (editor_cmd, "vim") != NULL && + ((position = get_caret_position (view)) > 0)) { gchar *tmp = editor_cmd; gint lineno; gboolean set_nofork; @@ -385,7 +432,7 @@ external_editor_thread (gpointer user_data) } } - finished: +finished: g_mutex_lock (&external_editor_running_lock); external_editor_running = FALSE; g_mutex_unlock (&external_editor_running_lock); @@ -484,24 +531,23 @@ gboolean e_plugin_ui_init (GtkUIManager *manager, EMsgComposer *composer) { - GtkhtmlEditor *editor; - EWebViewGtkHTML *web_view; + EHTMLEditor *editor; + EHTMLEditorView *view; - editor = GTKHTML_EDITOR (composer); + editor = e_msg_composer_get_editor (composer); + view = e_html_editor_get_view (editor); /* Add actions to the "composer" action group. */ gtk_action_group_add_actions ( - gtkhtml_editor_get_action_group (editor, "composer"), + e_html_editor_get_action_group (editor, "composer"), entries, G_N_ELEMENTS (entries), composer); - web_view = e_msg_composer_get_web_view (composer); - g_signal_connect ( - web_view, "key_press_event", + view, "key_press_event", G_CALLBACK (key_press_cb), composer); g_signal_connect ( - web_view, "delete-event", + view, "delete-event", G_CALLBACK (delete_cb), composer); return TRUE; |