From 34bc4f6c854aae8def04b1f1b537a07fb6d3a656 Mon Sep 17 00:00:00 2001
From: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
Date: Mon, 23 Aug 2010 16:11:15 -0400
Subject: [PATCH] [#3621] Add message time

---
 sflphone-client-gnome/src/dbus/dbus.c        |  15 ++--
 sflphone-client-gnome/src/imwindow.c         |  38 +++++----
 sflphone-client-gnome/src/widget/imwidget.c  |  77 +++++++++++--------
 sflphone-client-gnome/src/widget/imwidget.h  |   3 +
 sflphone-client-gnome/webkit/im/im.css       |  25 +++++-
 sflphone-client-gnome/webkit/im/im.html      |  12 +--
 sflphone-client-gnome/webkit/im/im.js        |  18 ++---
 sflphone-client-gnome/webkit/im/sflphone.png | Bin 13002 -> 13002 bytes
 8 files changed, 116 insertions(+), 72 deletions(-)

diff --git a/sflphone-client-gnome/src/dbus/dbus.c b/sflphone-client-gnome/src/dbus/dbus.c
index 5911e23387..011e67395d 100644
--- a/sflphone-client-gnome/src/dbus/dbus.c
+++ b/sflphone-client-gnome/src/dbus/dbus.c
@@ -127,17 +127,20 @@ incoming_message_cb(DBusGProxy *proxy UNUSED, const gchar* callID UNUSED, const
 	// Get the call information. Does this call exist?
 	callable_obj_t * c = calllist_get (current_calls, callID);
 
-	/* Make the instant messaging main window pops */
-	im_widget_display (&c);
+	/* First check if the call is valid */
+	if (c) {
 
-	/* Display le message */
-	im_widget_add_message (c, from, msg, 0);
+		/* Make the instant messaging main window pops */
+		im_widget_display (&c);
 
-	if (c) {
-		notify_incoming_message (callID, msg);
+		/* Display the message */
+		im_widget_add_message (c, get_peer_information (c), msg, 0);
+	
 	} else {
 		ERROR ("Message received, but no recipient found");
 	}
+	/*if (c) {
+		notify_incoming_message (callID, msg);*/
 }
 
 	static void
diff --git a/sflphone-client-gnome/src/imwindow.c b/sflphone-client-gnome/src/imwindow.c
index b805b5751c..cecf56b2e3 100644
--- a/sflphone-client-gnome/src/imwindow.c
+++ b/sflphone-client-gnome/src/imwindow.c
@@ -65,6 +65,13 @@ on_delete(GtkWidget * widget UNUSED, gpointer data UNUSED)
 	return TRUE;
 }
 
+	static void
+on_switch_page (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer userdata)
+{
+	guint index = gtk_notebook_get_current_page (GTK_NOTEBOOK (notebook));
+	g_print ("switch to %i-  current = %i\n", page_num, index);
+}
+
 	static void
 im_window_init()
 {
@@ -93,20 +100,17 @@ im_window_init()
 
 	gtk_widget_set_name(im_window, "imwindow");
 
-	g_signal_connect (G_OBJECT (im_window), "delete-event",
-			G_CALLBACK (on_delete), NULL);
-
-	g_signal_connect_object (G_OBJECT (im_window), "configure-event",
-			G_CALLBACK (window_configure_cb), NULL, 0);
-
 	GtkWidget *im_vbox = gtk_vbox_new (FALSE /*homogeneous*/, 0 /*spacing*/);
 	im_notebook = gtk_notebook_new ();
 
-
 	gtk_container_add (GTK_CONTAINER (im_window), im_vbox);
 	gtk_box_pack_start (GTK_BOX (im_vbox), im_notebook, TRUE, TRUE, 0);
 	gtk_widget_show (im_notebook);
 
+	g_signal_connect (G_OBJECT (im_window), "delete-event", G_CALLBACK (on_delete), NULL);
+	g_signal_connect_object (G_OBJECT (im_window), "configure-event", G_CALLBACK (window_configure_cb), NULL, 0);
+	g_signal_connect (G_OBJECT (im_notebook), "switch-page", G_CALLBACK (on_switch_page), NULL);
+
 	/* make sure that everything is visible */
 	gtk_widget_show_all (im_window);
 
@@ -122,8 +126,9 @@ im_window_get()
 	return im_window;
 }
 
-void
-im_window_show (){
+	void
+im_window_show ()
+{
 	gtk_widget_show (im_window_get ());
 }
 
@@ -134,11 +139,6 @@ im_window_add (GtkWidget *widget, gchar *label)
 		/* Add the new tab to the notebook */
 		im_window_add_tab (widget, label);
 
-		/* Switch to the newly opened tab */
-		guint index = gtk_notebook_page_num (GTK_NOTEBOOK (im_notebook), widget);
-		gtk_notebook_set_current_page (GTK_NOTEBOOK (im_notebook), 2);
-		g_print ("index %i - current %i\n", index, gtk_notebook_get_current_page (GTK_NOTEBOOK (im_notebook)));
-
 		/* Show it all */
 		gtk_widget_show_all (im_window);
 	}
@@ -149,7 +149,7 @@ im_window_add (GtkWidget *widget, gchar *label)
 	static void
 close_tab_cb (GtkButton *button, gpointer userdata)
 {
-	
+
 	/* We want here to close the current tab */
 	guint index = gtk_notebook_page_num (GTK_NOTEBOOK (im_notebook), GTK_WIDGET (userdata));
 	g_print ("removing index %i\n", index);
@@ -172,11 +172,15 @@ im_window_add_tab (GtkWidget *widget, gchar *label)
 	g_signal_connect (tab_CloseButton, "clicked", G_CALLBACK (close_tab_cb), widget);
 
 	gtk_widget_show_all (tab_Container);
-	gtk_notebook_append_page (GTK_NOTEBOOK (im_notebook), widget, tab_Container);
 
-}
+	/* Add the page to the notebook */
+	gtk_notebook_append_page (GTK_NOTEBOOK (im_notebook), widget, tab_Container);
 
+	/* Switch to the newly opened tab */
+	guint tabIndex = gtk_notebook_page_num (GTK_NOTEBOOK (im_notebook), widget);
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (im_notebook), tabIndex);
 
+}
 
 	void
 im_window_remove(GtkWidget *widget)
diff --git a/sflphone-client-gnome/src/widget/imwidget.c b/sflphone-client-gnome/src/widget/imwidget.c
index cebbbdc922..f603d3944e 100644
--- a/sflphone-client-gnome/src/widget/imwidget.c
+++ b/sflphone-client-gnome/src/widget/imwidget.c
@@ -48,12 +48,15 @@ im_widget_add_message (callable_obj_t *call, const gchar *from, const gchar *mes
 
 			/* Update the informations about the call in the chat window */
 			im_widget_add_call_header (call);
-			
+
+			/* Compute the date the message was sent */
+			gchar *msgtime = im_widget_add_message_time ();
+
 			/* Check for the message level */
 			gchar *css_class = (level == MESSAGE_LEVEL_ERROR ) ? "error" : "";
 
 			/* Prepare and execute the Javascript code */
-			gchar *script = g_strdup_printf("add_message('%s', '%s', '%s', '%s');", message, from, call->_peer_number, css_class);
+			gchar *script = g_strdup_printf("add_message('%s', '%s', '%s', '%s');", message, from, css_class, msgtime);
 			webkit_web_view_execute_script (WEBKIT_WEB_VIEW(im->web_view), script);
 
 			/* Cleanup */
@@ -61,35 +64,20 @@ im_widget_add_message (callable_obj_t *call, const gchar *from, const gchar *mes
 
 		}
 
-		else {
-
-			/* If the chat window is not opened when we receive an incoming message, create the im widget first, 
-			   then call the javascript to display the message */
-
-			im = im_widget_new ();
-			im_window_add (im);
-			im->call = call;
-			call->_im_widget = im;
-
-			/* Prepare and execute the Javascript code */
-			gchar *script = g_strdup_printf("add_message('%s', '%s', '%s', '%s');", message, call->_peer_name, call->_peer_number, call->_peer_info);
-			webkit_web_view_execute_script (WEBKIT_WEB_VIEW(im->web_view), script);
-
-			/* Cleanup */
-			g_free(script);
-		}
 	}
 }
 
 void
 im_widget_add_call_header (callable_obj_t *call) {
 
-	IMWidget *im = IM_WIDGET (call->_im_widget);
-	gchar *script = g_strdup_printf("add_call_info_header('%s', '%s', '%s');", call->_peer_name, call->_peer_number, call->_peer_info);
-	webkit_web_view_execute_script (WEBKIT_WEB_VIEW(im->web_view), script);
+	if (call) {
+		IMWidget *im = IM_WIDGET (call->_im_widget);
+		gchar *script = g_strdup_printf("add_call_info_header('%s', '%s');", call->_peer_name, call->_peer_number);
+		webkit_web_view_execute_script (WEBKIT_WEB_VIEW(im->web_view), script);
 
-	/* Cleanup */
-	g_free(script);
+		/* Cleanup */
+		g_free(script);
+	}
 }
 
 static gboolean
@@ -105,10 +93,13 @@ web_view_nav_requested_cb(
 
 	/* Always allow files we are serving ourselves. */
 	if (!strncmp(uri, WEBKIT_DIR, sizeof(WEBKIT_DIR) - 1)) {
-		webkit_web_policy_decision_use(policy_decision);
+		webkit_web_policy_decision_use (policy_decision);
 	} else {
-		printf("FIXME(jonas) open URL in browser: %s\n", uri);
-		webkit_web_policy_decision_ignore(policy_decision);
+		/* Running a system command to open the URL in the user's default browser */
+		gchar *cmd = g_strdup_printf("x-www-browser %s", uri); 
+		system (cmd);
+		webkit_web_policy_decision_ignore (policy_decision);
+		g_free (cmd);
 	}
 	return TRUE;
 }
@@ -150,10 +141,30 @@ on_Textview_changed (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
 	return FALSE;
 }
 
+	gchar* 
+im_widget_add_message_time () 
+{
+
+	time_t now;
+	unsigned char str[100];
+
+	/* Compute the current time */
+	(void) time (&now);
+	struct tm* ptr;
+	ptr = localtime (&now);
+
+	/* Get the time of the message. Format: HH:MM::SS */
+	strftime ((char *)str, 100, "%R", (const struct tm *)ptr);
+	gchar *res = g_strdup (str);
+
+	/* Return the new value */
+	return res;
+}
+
 	void 
 im_widget_send_message (callable_obj_t *call, const gchar *message)
 {
-	
+
 	/* First check if the call is in CURRENT state, otherwise it could not be sent */
 	if (call->_type == CALL && call->_state == CALL_STATE_CURRENT)		
 	{
@@ -176,7 +187,10 @@ im_widget_class_init(IMWidgetClass *klass)
 im_widget_init (IMWidget *im)
 {
 
+	/* A text view to enable users to enter text */
 	im->textarea = gtk_text_view_new ();
+
+	/* The webkit widget to display the message */
 	im->web_view = webkit_web_view_new();
 	GtkWidget *textscrollwin = gtk_scrolled_window_new (NULL, NULL);
 	GtkWidget *webscrollwin = gtk_scrolled_window_new (NULL, NULL);
@@ -198,10 +212,11 @@ im_widget_init (IMWidget *im)
 	g_signal_connect(im->textarea, "key-press-event", G_CALLBACK (on_Textview_changed), im);
 	g_signal_connect (G_OBJECT (webscrollwin), "destroy", G_CALLBACK (gtk_main_quit), NULL);
 
-	im->web_frame = webkit_web_view_get_main_frame(WEBKIT_WEB_VIEW(im->web_view));
-	im->js_context = webkit_web_frame_get_global_context(im->web_frame);
-	im->js_global = JSContextGetGlobalObject(im->js_context);
+	im->web_frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW(im->web_view));
+	im->js_context = webkit_web_frame_get_global_context (im->web_frame);
+	im->js_global = JSContextGetGlobalObject (im->js_context);
 	webkit_web_view_load_uri (WEBKIT_WEB_VIEW(im->web_view), "file://" DATA_DIR "/webkit/im/im.html");
+
 }
 
 	GtkWidget *
diff --git a/sflphone-client-gnome/src/widget/imwidget.h b/sflphone-client-gnome/src/widget/imwidget.h
index 0d3e6d3d03..eceb433bbf 100644
--- a/sflphone-client-gnome/src/widget/imwidget.h
+++ b/sflphone-client-gnome/src/widget/imwidget.h
@@ -80,6 +80,9 @@ void im_widget_add_message (callable_obj_t *c, const gchar *from, const gchar *m
 
 void im_widget_send_message (callable_obj_t *call, const gchar *message);
 
+gchar* im_widget_add_message_time ();
+
+
 
 G_END_DECLS
 
diff --git a/sflphone-client-gnome/webkit/im/im.css b/sflphone-client-gnome/webkit/im/im.css
index 574348903c..c43eb2c4a9 100644
--- a/sflphone-client-gnome/webkit/im/im.css
+++ b/sflphone-client-gnome/webkit/im/im.css
@@ -1,12 +1,11 @@
 .message {
 	-webkit-border-radius: 5px;
 	background: rgba(242, 242, 242, 0.75);
-	color: #777;
+	color: #444;
 	padding: 1em;
 	-webkit-box-shadow: 2px 2px 5px #000;
 	margin: 20px;
 overflow: auto;
-font-size: 0.95em;
 clear: both;
 }
 
@@ -20,7 +19,11 @@ font-family: "Georgia","Verdana","Arial","Helvetica",sans-serif;
 }
 
 body {
-	background: #fbfdfe url(sflphone.png) no-repeat fixed bottom right;
+	background:  #fbfdfe;
+}
+
+#logo {
+	float: right;
 }
 
 .author {
@@ -28,9 +31,14 @@ body {
 	font-weight: bold;
 }
 
+#header {
+
+	margin: 40px;
+}
+
 #call-info {
+	float: left;
 	font-size: 1.1em;
-	margin: 40px;
 height: 96px;
 	background: url(chat_info.png) no-repeat center left;
 	padding: 20px 20px 20px 100px;
@@ -47,3 +55,12 @@ height: 96px;
 	display: none;
 }
 
+.message-time {
+	color: #777;
+	float: right;
+}
+
+#messages {
+	clear: both;
+	padding-top: 20px;
+}
diff --git a/sflphone-client-gnome/webkit/im/im.html b/sflphone-client-gnome/webkit/im/im.html
index ea32787820..b1b13dc03c 100644
--- a/sflphone-client-gnome/webkit/im/im.html
+++ b/sflphone-client-gnome/webkit/im/im.html
@@ -5,11 +5,13 @@
 	</head>
 	<body>
 		<div class='page'>
-			<div id="call-info">
-				<h2> Calling <span id='peer-number'></span></h2>
-				<p>Nom: <span id='peer-name'></span></p>
-				<p>Plus: <span id='peer-info'></span></p>
-			</div>
+			<div id="header">
+				<div id="call-info">
+					<h2> Calling <span id='peer-number'></span></h2>
+					<p>Nom: <span id='peer-name'></span></p>
+				</div>
+				<div id="logo"><a href="http://www.sflphone.org" title="sflphone" alt="sflphone"><img src="sflphone.png"/></a></div>
+		</div>
 			<div id="messages">
 			</div>
 		</div>
diff --git a/sflphone-client-gnome/webkit/im/im.js b/sflphone-client-gnome/webkit/im/im.js
index ed53b8ea00..1c2ebd1c4e 100644
--- a/sflphone-client-gnome/webkit/im/im.js
+++ b/sflphone-client-gnome/webkit/im/im.js
@@ -15,25 +15,25 @@ function linkify(text){
 }
 
 
-function add_message (message, peer_name, peer_number, class_additionnal)
+function add_message (message, peer_name, class_additionnal, time)
 {
-	var display_name = 'Unknown';
-	if (peer_name != '') {
-		display_name = peer_name;
-	}
-
 	var msgBody = document.getElementById ('messages');
-	msgBody.innerHTML = msgBody.innerHTML + '<div class="message ' + class_additionnal + '">' +  '<span class="author">' + display_name + ': </span>' + '<p class="text">' + linkify (message) + '</p></div>' ;
+	msgBody.innerHTML = msgBody.innerHTML + '<div class="message ' + class_additionnal + '">' +  '<span class="author">[' + peer_name + '] </span><span class="message-time">' + time + '</span><p class="text">' + linkify (message) + '</p></div>' ;
 	document.getElementById("bottom").scrollIntoView(true);
 }
 
-function add_call_info_header (peer_name, peer_number, peer_info)
+function add_call_info_header (peer_name, peer_number)
 {
 	var peerNumber = document.getElementById ('peer-number');
 	var peerName = document.getElementById ('peer-name');
 	var peerInfo = document.getElementById ('peer-info');
 	peerNumber.innerHTML = peer_number;
 	peerName.innerHTML = peer_name;
-	peerInfo.innerHTML = peer_info;
+
+}
+
+function open_url (uri) {
+	window.open(''+self.location,'mywin',
+	'left=20,top=20,width=500,height=500,toolbar=1,resizable=0');
 
 }
diff --git a/sflphone-client-gnome/webkit/im/sflphone.png b/sflphone-client-gnome/webkit/im/sflphone.png
index 145a1fbac04cfecba8b5643ecaf64254c7a5b88b..03e40a0b35785c02ccc78f982e8fa10d2b5c1fb3 100644
GIT binary patch
delta 19
acmX?=dMb570*AP;qJnnZOrDJyNk#xj`Uaf<

delta 19
acmX?=dMb570*9c0E<5X)rgs}Nl8gXN+6S5d

-- 
GitLab