diff options
author | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-05-18 14:04:26 +0800 |
---|---|---|
committer | Danielle Madeley <danielle.madeley@collabora.co.uk> | 2011-06-14 00:04:03 +0800 |
commit | b87566f46243257310b6d3b5e9b8fc25a0f6954d (patch) | |
tree | 248758652f757892e844d4fa8861ba5fc2d7ab45 /libempathy-gtk/empathy-theme-adium.c | |
parent | 0569ded29dbab08462670e4780fb17ec5e4950ff (diff) | |
download | gsoc2013-empathy-b87566f46243257310b6d3b5e9b8fc25a0f6954d.tar gsoc2013-empathy-b87566f46243257310b6d3b5e9b8fc25a0f6954d.tar.gz gsoc2013-empathy-b87566f46243257310b6d3b5e9b8fc25a0f6954d.tar.bz2 gsoc2013-empathy-b87566f46243257310b6d3b5e9b8fc25a0f6954d.tar.lz gsoc2013-empathy-b87566f46243257310b6d3b5e9b8fc25a0f6954d.tar.xz gsoc2013-empathy-b87566f46243257310b6d3b5e9b8fc25a0f6954d.tar.zst gsoc2013-empathy-b87566f46243257310b6d3b5e9b8fc25a0f6954d.zip |
[theme-adium] implement edit_message()
This is done via DOM manipulation, we find the id for the <span> 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.
Diffstat (limited to 'libempathy-gtk/empathy-theme-adium.c')
-rw-r--r-- | libempathy-gtk/empathy-theme-adium.c | 68 |
1 files changed, 66 insertions, 2 deletions
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 @@ -1028,6 +1028,64 @@ theme_adium_append_event (EmpathyChatView *view, } 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 + * <span> element, and we don't want nested <span> 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); } |