aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/external-editor/external-editor.c
diff options
context:
space:
mode:
authorTomas Popela <tpopela@redhat.com>2014-06-09 22:32:25 +0800
committerTomas Popela <tpopela@redhat.com>2014-06-09 22:32:25 +0800
commit8650fb139a9143f04615de74ff569bce3e0c4ce3 (patch)
tree89a41d08f179a5359b8eaee0c9344b8a5bf07cb3 /plugins/external-editor/external-editor.c
parent04b7c97275ae420dca43f3e65c2ef54d02f01bdd (diff)
downloadgsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.tar
gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.tar.gz
gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.tar.bz2
gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.tar.lz
gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.tar.xz
gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.tar.zst
gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.zip
Bug 540362: [webkit-composer] Use webkit for composer
Merge wip/webkit-composer branch into master.
Diffstat (limited to 'plugins/external-editor/external-editor.c')
-rw-r--r--plugins/external-editor/external-editor.c106
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;