From 4ccbecd15680fd76ac5ebf1b8da82bffc8f68ca0 Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Wed, 4 Jul 2012 15:12:15 +0200 Subject: empathy-chat: add some JavaScript to prepend messages Fixes: https://bugzilla.gnome.org/639877 --- configure.ac | 3 ++ src/Makefile.am | 26 +++++++++++- src/empathy-chat.gresource.xml | 6 +++ src/empathy-chat.js | 92 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 src/empathy-chat.gresource.xml create mode 100644 src/empathy-chat.js diff --git a/configure.ac b/configure.ac index d5b270181..9557e9a5f 100644 --- a/configure.ac +++ b/configure.ac @@ -122,6 +122,9 @@ LT_INIT AC_PATH_PROG(DBUS_BINDING_TOOL, dbus-binding-tool) GLIB_GSETTINGS + +GLIB_COMPILE_RESOURCES=`$PKG_CONFIG gio-2.0 --variable=glib_compile_resources` +AC_SUBST(GLIB_COMPILE_RESOURCES) GLIB_GENMARSHAL=`$PKG_CONFIG glib-2.0 --variable=glib_genmarshal` AC_SUBST(GLIB_GENMARSHAL) diff --git a/src/Makefile.am b/src/Makefile.am index c2cb9f7a0..400b83b82 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -85,6 +85,11 @@ empathy_chat_SOURCES = \ empathy-chat.c \ $(NULL) +nodist_empathy_chat_SOURCES = \ + empathy-chat-resources.c \ + empathy-chat-resources.h \ + $(NULL) + empathy_call_SOURCES = \ empathy-call.c \ empathy-call-factory.c \ @@ -182,9 +187,28 @@ ui_DATA = \ EXTRA_DIST = \ $(autostart_DATA) \ - $(ui_DATA) + $(ui_DATA) \ + empathy-chat.js \ + empathy-chat.gresource.xml dist_man_MANS = \ empathy.1 \ empathy-accounts.1 +BUILT_SOURCES = \ + $(nodist_empathy_chat_SOURCES) \ + $(NULL) + +CLEANFILES = $(BUILT_SOURCES) + +empathy-chat-resources.c: empathy-chat.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies $(srcdir)/empathy-chat.gresource.xml) + $(AM_V_GEN)$(GLIB_COMPILE_RESOURCES) --target=$@ \ + --sourcedir=$(srcdir) \ + --generate-source \ + $< + +empathy-chat-resources.h: empathy-chat.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies $(srcdir)/empathy-chat.gresource.xml) + $(AM_V_GEN)$(GLIB_COMPILE_RESOURCES) --target=$@ \ + --sourcedir=$(srcdir) \ + --generate-header \ + $< diff --git a/src/empathy-chat.gresource.xml b/src/empathy-chat.gresource.xml new file mode 100644 index 000000000..dd5a29b2f --- /dev/null +++ b/src/empathy-chat.gresource.xml @@ -0,0 +1,6 @@ + + + + empathy-chat.js + + diff --git a/src/empathy-chat.js b/src/empathy-chat.js new file mode 100644 index 000000000..236049959 --- /dev/null +++ b/src/empathy-chat.js @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2012 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: Debarshi Ray + */ + + +var chat = document.getElementById("Chat"); + + +function createHTMLNode(html) { + var range = document.createRange(); + range.selectNode(chat); + return range.createContextualFragment(html); +} + + +function getContentsNode(node) { + var post = node.getElementsByClassName("post")[0]; + return post.getElementsByClassName("post-contents")[0]; +} + + +// Remove all but the last #insert +function removeInsertNodes(node) { + var inserts = node.querySelectorAll("#insert"); + if (inserts.length < 2) + return; + + for (var i = 0; i < inserts.length - 1; i++) { + var insert = inserts[i]; + insert.parentNode.removeChild(insert); + } +} + + +// Remove all but the first #prepend +function removePrependNodes(node) { + var pres = node.querySelectorAll("#prepend"); + if (pres.length < 2) + return; + + for (var i = 1; i < pres.length; i++) { + var pre = pres[i]; + pre.parentNode.removeChild(pre); + } +} + + +function prepend(html) { + var node = createHTMLNode(html); + chat.insertBefore(node, chat.firstChild); + + // The lastChild should retain the #insert + if (chat.children.length == 1) + return; + + removeInsertNodes(chat); + removePrependNodes(chat); +} + + +function prependPrev(html) { + var pre = chat.firstChild.querySelector("#prepend"); + + // For themes that don't support #prepend + if (!pre) { + prepend(html); + return; + } + + var contents = pre.parentNode; + var node = createHTMLNode(html); + + // Skip both the #prepend and #insert + for (var i = node.childNodes.length - 2; i > 0; i--) + contents.insertBefore(node.childNodes[i], pre.nextSibling); +} -- cgit v1.2.3