From b87566f46243257310b6d3b5e9b8fc25a0f6954d Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Wed, 18 May 2011 16:04:26 +1000 Subject: [theme-adium] implement edit_message() This is done via DOM manipulation, we find the id for the tag we wrapped the message in in the previous commit. We then replace the innerHTML with the new message. This requires a version of WebKitGtk 1.3.x, but I'm not precisely sure what. I used WebKitGtk 1.4.0, but natty only has 1.3.13, so we'll try setting that as the dep. Need to somehow mark a message as edited. Could set a class on it, but that requires support in the theme. Need inspiration here. --- libempathy-gtk/empathy-theme-adium.c | 68 ++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-) (limited to 'libempathy-gtk/empathy-theme-adium.c') diff --git a/libempathy-gtk/empathy-theme-adium.c b/libempathy-gtk/empathy-theme-adium.c index 6c5ae7910..a55eff67e 100644 --- a/libempathy-gtk/empathy-theme-adium.c +++ b/libempathy-gtk/empathy-theme-adium.c @@ -1027,6 +1027,64 @@ theme_adium_append_event (EmpathyChatView *view, g_free (str_escaped); } +static void +theme_adium_edit_message (EmpathyChatView *view, + EmpathyMessage *message) +{ + EmpathyThemeAdiumPriv *priv = GET_PRIV (view); + WebKitDOMDocument *doc; + WebKitDOMElement *span; + gchar *id, *parsed_body; + GError *error = NULL; + + if (priv->pages_loading != 0) { + GValue *value = tp_g_value_slice_new (EMPATHY_TYPE_MESSAGE); + g_value_set_object (value, message); + g_queue_push_tail (&priv->message_queue, value); + return; + } + + id = g_strdup_printf ("message-token-%s", + empathy_message_get_supersedes (message)); + /* we don't pass a token here, because doing so will return another + * element, and we don't want nested elements */ + parsed_body = theme_adium_parse_body (EMPATHY_THEME_ADIUM (view), + empathy_message_get_body (message), NULL); + + /* find the element */ + doc = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view)); + span = webkit_dom_document_get_element_by_id (doc, id); + + if (span == NULL) { + DEBUG ("Failed to find id '%s'", id); + goto except; + } + + if (!WEBKIT_DOM_IS_HTML_ELEMENT (span)) { + DEBUG ("Not a HTML element"); + goto except; + } + + /* update the HTML */ + webkit_dom_html_element_set_inner_html (WEBKIT_DOM_HTML_ELEMENT (span), + parsed_body, &error); + + if (error != NULL) { + DEBUG ("Error setting new inner-HTML: %s", error->message); + g_error_free (error); + } + + goto finally; + +except: + DEBUG ("Could not find message to edit with: %s", + empathy_message_get_body (message)); + +finally: + g_free (id); + g_free (parsed_body); +} + static void theme_adium_scroll (EmpathyChatView *view, gboolean allow_scrolling) @@ -1323,6 +1381,7 @@ theme_adium_iface_init (EmpathyChatViewIface *iface) { iface->append_message = theme_adium_append_message; iface->append_event = theme_adium_append_event; + iface->edit_message = theme_adium_edit_message; iface->scroll = theme_adium_scroll; iface->scroll_down = theme_adium_scroll_down; iface->get_has_selection = theme_adium_get_has_selection; @@ -1356,8 +1415,12 @@ theme_adium_load_finished_cb (WebKitWebView *view, GValue *value = l->data; if (G_VALUE_HOLDS_OBJECT (value)) { - theme_adium_append_message (chat_view, - g_value_get_object (value)); + EmpathyMessage *message = g_value_get_object (value); + + if (empathy_message_is_edit (message)) + theme_adium_edit_message (chat_view, message); + else + theme_adium_append_message (chat_view, message); } else { theme_adium_append_event (chat_view, g_value_get_string (value)); @@ -1365,6 +1428,7 @@ theme_adium_load_finished_cb (WebKitWebView *view, tp_g_value_slice_free (value); } + g_queue_clear (&priv->message_queue); } -- cgit v1.2.3