aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDebarshi Ray <debarshir@src.gnome.org>2012-07-04 21:12:15 +0800
committerDebarshi Ray <debarshir@src.gnome.org>2013-01-21 23:42:23 +0800
commit4ccbecd15680fd76ac5ebf1b8da82bffc8f68ca0 (patch)
treed8fef872aa02573e1365b3980966591277ef602c /src
parentfc577ecee431fdfc91617b0cd7f6df39e575b006 (diff)
downloadgsoc2013-empathy-4ccbecd15680fd76ac5ebf1b8da82bffc8f68ca0.tar.gz
gsoc2013-empathy-4ccbecd15680fd76ac5ebf1b8da82bffc8f68ca0.tar.zst
gsoc2013-empathy-4ccbecd15680fd76ac5ebf1b8da82bffc8f68ca0.zip
empathy-chat: add some JavaScript to prepend messages
Fixes: https://bugzilla.gnome.org/639877
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am26
-rw-r--r--src/empathy-chat.gresource.xml6
-rw-r--r--src/empathy-chat.js92
3 files changed, 123 insertions, 1 deletions
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/Empathy/Chat">
+ <file>empathy-chat.js</file>
+ </gresource>
+</gresources>
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 <debarshir@src.gnome.org>
+ */
+
+
+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);
+}