]> git.0d.be Git - empathy.git/commitdiff
empathy-chat: add some JavaScript to prepend messages
authorDebarshi Ray <debarshir@src.gnome.org>
Wed, 4 Jul 2012 13:12:15 +0000 (15:12 +0200)
committerDebarshi Ray <debarshir@src.gnome.org>
Mon, 21 Jan 2013 15:42:23 +0000 (16:42 +0100)
Fixes: https://bugzilla.gnome.org/639877
configure.ac
src/Makefile.am
src/empathy-chat.gresource.xml [new file with mode: 0644]
src/empathy-chat.js [new file with mode: 0644]

index d5b2701817864fb4b38d823199979ec6aaac4273..9557e9a5f873fde55e5e36f9494d5b20b89b6e1c 100644 (file)
@@ -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)
 
index c2cb9f7a0999f6fa650ef2117468cf9689275cf5..400b83b824a1be43d2aec645cb078fdf8efed1f1 100644 (file)
@@ -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 (file)
index 0000000..dd5a29b
--- /dev/null
@@ -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 (file)
index 0000000..2360499
--- /dev/null
@@ -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);
+}