[empathy] empathy-chat: add some JavaScript to prepend messages



commit 4ccbecd15680fd76ac5ebf1b8da82bffc8f68ca0
Author: Debarshi Ray <debarshir src gnome org>
Date:   Wed Jul 4 15:12:15 2012 +0200

    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 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index d5b2701..9557e9a 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 c2cb9f7..400b83b 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 0000000..dd5a29b
--- /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 0000000..2360499
--- /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);
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]