From 46622ba4f8d9c95ccf0f9eb3d2404b00db92bc5b Mon Sep 17 00:00:00 2001
From: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
Date: Fri, 20 Aug 2010 17:01:11 -0400
Subject: [PATCH] [#3621] Display multiple chat windows in tabs

---
 sflphone-client-gnome/src/callable_obj.c      |  11 ++
 sflphone-client-gnome/src/callable_obj.h      |   2 +
 sflphone-client-gnome/src/dbus/dbus.c         |   6 ++
 sflphone-client-gnome/src/imwindow.c          |  76 ++++++++++---
 sflphone-client-gnome/src/imwindow.h          |   7 +-
 sflphone-client-gnome/src/uimanager.c         |  18 +---
 sflphone-client-gnome/src/widget/imwidget.c   | 100 ++++++++++++------
 sflphone-client-gnome/src/widget/imwidget.h   |   7 ++
 sflphone-client-gnome/webkit/Makefile.am      |   3 +-
 sflphone-client-gnome/webkit/im/chat_info.png | Bin 0 -> 7284 bytes
 sflphone-client-gnome/webkit/im/im.css        |  12 ++-
 sflphone-client-gnome/webkit/im/im.html       |   9 +-
 sflphone-client-gnome/webkit/im/im.js         |  10 +-
 13 files changed, 196 insertions(+), 65 deletions(-)
 create mode 100644 sflphone-client-gnome/webkit/im/chat_info.png

diff --git a/sflphone-client-gnome/src/callable_obj.c b/sflphone-client-gnome/src/callable_obj.c
index e165857433..66b0503b48 100644
--- a/sflphone-client-gnome/src/callable_obj.c
+++ b/sflphone-client-gnome/src/callable_obj.c
@@ -423,3 +423,14 @@ time_t convert_gchar_to_timestamp (gchar *timestamp)
 {
     return (time_t) atoi (timestamp);
 }
+
+	gchar* 
+get_peer_information (callable_obj_t *c) {
+	
+	gchar *res;
+
+	if (g_strcasecmp (c->_peer_name,"") == 0) 
+		return g_strdup (c->_peer_number);
+	else
+		return g_strdup (c->_peer_name);  
+}
diff --git a/sflphone-client-gnome/src/callable_obj.h b/sflphone-client-gnome/src/callable_obj.h
index a3d4f252ee..acab0ed3ea 100644
--- a/sflphone-client-gnome/src/callable_obj.h
+++ b/sflphone-client-gnome/src/callable_obj.h
@@ -224,4 +224,6 @@ time_t convert_gchar_to_timestamp (gchar*);
 
 gchar* call_get_audio_codec (callable_obj_t *obj);
 
+gchar* get_peer_information (callable_obj_t *c);
+
 #endif
diff --git a/sflphone-client-gnome/src/dbus/dbus.c b/sflphone-client-gnome/src/dbus/dbus.c
index 2fbeb378d1..5acd8c35f5 100644
--- a/sflphone-client-gnome/src/dbus/dbus.c
+++ b/sflphone-client-gnome/src/dbus/dbus.c
@@ -127,7 +127,13 @@ incoming_message_cb(DBusGProxy *proxy UNUSED, const gchar* callID UNUSED,
 
 	// 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);
+
+	/* Display le message */
 	im_widget_add_message (c, msg);
+
 	if (c) {
 		notify_incoming_message (callID, msg);
 	} else {
diff --git a/sflphone-client-gnome/src/imwindow.c b/sflphone-client-gnome/src/imwindow.c
index eb20ca626b..b805b5751c 100644
--- a/sflphone-client-gnome/src/imwindow.c
+++ b/sflphone-client-gnome/src/imwindow.c
@@ -39,7 +39,7 @@
 
 /** Local variables */
 GtkWidget *im_window = NULL;
-GtkWidget *im_vbox = NULL;
+GtkWidget *im_notebook = NULL;
 
 static gboolean window_configure_cb (GtkWidget *win, GdkEventConfigure *event) {
 	int pos_x, pos_y;
@@ -57,15 +57,15 @@ static gboolean window_configure_cb (GtkWidget *win, GdkEventConfigure *event) {
 /**
  * Minimize the main window.
  */
-static gboolean
+	static gboolean
 on_delete(GtkWidget * widget UNUSED, gpointer data UNUSED)
 {
-	gtk_widget_hide(GTK_WIDGET(im_window_get()));
-	// gtk_widget_destroy (GTK_WIDGET(im_window_get()));
+	/* Only hide the main window that contains all the instant messaging instances */
+	gtk_widget_hide (GTK_WIDGET(im_window_get()));
 	return TRUE;
 }
 
-static void
+	static void
 im_window_init()
 {
 	const char *window_title = "SFLphone VoIP Client - Instant Messaging Module";
@@ -94,14 +94,18 @@ 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_CALLBACK (on_delete), NULL);
 
 	g_signal_connect_object (G_OBJECT (im_window), "configure-event",
-		G_CALLBACK (window_configure_cb), NULL, 0);
+			G_CALLBACK (window_configure_cb), NULL, 0);
+
+	GtkWidget *im_vbox = gtk_vbox_new (FALSE /*homogeneous*/, 0 /*spacing*/);
+	im_notebook = gtk_notebook_new ();
 
-	im_vbox = gtk_vbox_new (FALSE /*homogeneous*/, 0 /*spacing*/);
 
 	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);
 
 	/* make sure that everything is visible */
 	gtk_widget_show_all (im_window);
@@ -110,7 +114,7 @@ im_window_init()
 	gtk_window_move (GTK_WINDOW (im_window), position_x, position_y);
 }
 
-GtkWidget *
+	GtkWidget *
 im_window_get()
 {
 	if (im_window == NULL)
@@ -119,16 +123,62 @@ im_window_get()
 }
 
 void
-im_window_add (GtkWidget *widget)
+im_window_show (){
+	gtk_widget_show (im_window_get ());
+}
+
+	void
+im_window_add (GtkWidget *widget, gchar *label)
 {
 	if (im_window_get()) {
-		gtk_box_pack_start (GTK_BOX (im_vbox), widget, TRUE /*expand*/,
-			TRUE /*fill*/, 0 /*padding*/);
+		/* 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);
 	}
+	else
+		error ("Could not create the main instant messaging window");
 }
 
-void
+	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);
+	gtk_notebook_remove_page (GTK_NOTEBOOK (im_notebook), index);
+
+}
+
+	void
+im_window_add_tab (GtkWidget *widget, gchar *label)
+{	
+	/* A container to include the tab label and the close button */
+	GtkWidget *tab_Container = gtk_hbox_new (FALSE, 3);
+	GtkWidget *tab_Label = gtk_label_new (label);
+	GtkWidget *tab_CloseButton = gtk_button_new ();
+
+	gtk_button_set_relief (GTK_BUTTON(tab_CloseButton), GTK_RELIEF_NONE);
+	gtk_box_pack_start (GTK_BOX (tab_Container), tab_Label, TRUE, TRUE, 0);
+	gtk_box_pack_start (GTK_BOX (tab_Container), tab_CloseButton, FALSE, FALSE, 0);
+	gtk_container_add(GTK_CONTAINER (tab_CloseButton), gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU));
+	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);
+
+}
+
+
+
+	void
 im_window_remove(GtkWidget *widget)
 {
 	// TODO(jonas) remove widget from the window
diff --git a/sflphone-client-gnome/src/imwindow.h b/sflphone-client-gnome/src/imwindow.h
index 61128a415f..22d24e5007 100644
--- a/sflphone-client-gnome/src/imwindow.h
+++ b/sflphone-client-gnome/src/imwindow.h
@@ -49,11 +49,16 @@ GtkWidget *im_window_get();
 /**
  * Add IM widget to the IM window
  */
-void im_window_add(GtkWidget *widget);
+void im_window_add(GtkWidget *widget, gchar *label);
 
 /**
  * Remove IM widget from the IM window
  */
 void im_window_remove(GtkWidget *widget);
 
+void im_window_show ();
+
+void im_window_add_tab (GtkWidget *widget, gchar *label);
+
+
 #endif
diff --git a/sflphone-client-gnome/src/uimanager.c b/sflphone-client-gnome/src/uimanager.c
index 602f25a333..faa3dda240 100644
--- a/sflphone-client-gnome/src/uimanager.c
+++ b/sflphone-client-gnome/src/uimanager.c
@@ -509,20 +509,12 @@ call_hold(void* foo UNUSED)
 call_im (void* foo UNUSED)
 {
 	callable_obj_t * selectedCall = calltab_get_selected_call(current_calls);
-	static IMWidget *im = NULL;
 	
-	if (selectedCall)
-	{
-		if (selectedCall->_im_widget == NULL) {
-			printf("Call IM with call %s\n", selectedCall->_callID);
-			im = im_widget_new();
-			im_window_add (im);
-			im->call = selectedCall;
-			selectedCall->_im_widget = im;
-
-			/* Update the informations about the call in the chat window */
-			im_widget_add_call_header (selectedCall);
-		}
+	if (selectedCall) {
+		im_widget_display (&selectedCall);
+	}
+	else {
+		warn ("Sorry. Instant messaging is not allowed outside a call\n");
 	}
 }
 
diff --git a/sflphone-client-gnome/src/widget/imwidget.c b/sflphone-client-gnome/src/widget/imwidget.c
index 0396a1ce91..b3d994d5aa 100644
--- a/sflphone-client-gnome/src/widget/imwidget.c
+++ b/sflphone-client-gnome/src/widget/imwidget.c
@@ -33,46 +33,57 @@
 
 #define WEBKIT_DIR "file://" DATA_DIR "/webkit/"
 
-static IMWidget *_this;
-
 	void
 im_widget_add_message (callable_obj_t *call, const gchar *message)
 {
 	/* use the widget for this specific call, if exists */
-	IMWidget *im = IM_WIDGET (call->_im_widget); // IM_WIDGET(widget);
+	if (!call){
+		error ("The call passed as a parameter does not seem to be valid");
+	}
+	else {
 
-	if (im) {
+		IMWidget *im = IM_WIDGET (call->_im_widget);
 
-		/* 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(_this->web_view), script);
+		if (im) {
 
-		/* Cleanup */
-		g_free(script);
-	}
+			/* Update the informations about the call in the chat window */
+			im_widget_add_call_header (call);
 
-	else {
+			/* 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);
 
-		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(_this->web_view), script);
+			/* Cleanup */
+			g_free(script);
 
-		/* Cleanup */
-		g_free(script);
+		}
 
+		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(_this->web_view), script);
+	webkit_web_view_execute_script (WEBKIT_WEB_VIEW(im->web_view), script);
 
 	/* Cleanup */
 	g_free(script);
@@ -105,8 +116,9 @@ on_Textview_changed (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
 
 	GtkTextIter start, end;
 	/* Get all the text in the buffer */
-	GtkTextBuffer *buffer =  gtk_text_view_get_buffer (GTK_TEXT_VIEW (_this->textarea));
-	
+	IMWidget *im =  user_data;
+	GtkTextBuffer *buffer =  gtk_text_view_get_buffer (GTK_TEXT_VIEW (im->textarea));
+
 	if (event->type == GDK_KEY_PRESS){
 
 		switch (event->keyval)
@@ -119,10 +131,10 @@ on_Textview_changed (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
 					gchar *message = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
 
 					/* Display our own message in the chat window */
-					im_widget_add_message (_this->call, message);
+					im_widget_add_message (im->call, message);
 
 					/* Send the message to the peer */
-					dbus_send_text_message (_this->call->_callID, message);
+					dbus_send_text_message (im->call->_callID, message);
 
 					/* Empty the buffer */
 					gtk_text_buffer_delete (GTK_TEXT_BUFFER (buffer), &start, &end);	
@@ -165,17 +177,13 @@ im_widget_init (IMWidget *im)
 	gtk_box_pack_start (GTK_BOX(im), webscrollwin, TRUE, TRUE, 5);
 	gtk_box_pack_end (GTK_BOX(im), hbox, FALSE, FALSE, 2);
 	g_signal_connect (im->web_view, "navigation-policy-decision-requested", G_CALLBACK (web_view_nav_requested_cb), NULL);
-	g_signal_connect(im->textarea, "key-press-event", G_CALLBACK (on_Textview_changed), NULL);
+	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);
 	webkit_web_view_load_uri (WEBKIT_WEB_VIEW(im->web_view), "file://" DATA_DIR "/webkit/im/im.html");
-
-	
-
-	_this = im;
 }
 
 	GtkWidget *
@@ -211,4 +219,34 @@ im_widget_get_type(void)
 	}
 
 	return im_widget_type;
+}
+
+	void 
+im_widget_display (callable_obj_t **call) 
+{
+
+	/* Work with a copy of the object */
+	callable_obj_t *tmp = *call;
+
+	/* Use the widget for this specific call, if exists */
+	IMWidget *im = IM_WIDGET (tmp->_im_widget);
+
+	if (!im) {
+		g_print ("creating the im widget for this call\n");
+		/* Create the im object */
+		im = im_widget_new ();
+		tmp->_im_widget = im;
+		/* Update the call */
+		*call = tmp;	
+		im->call = *call;
+
+		/* Add it to the main instant messaging window */
+		gchar *label = get_peer_information (tmp);
+		im_window_add (im, label);
+	}
+	else {
+		g_print ("im widget exists for this call\n");
+		im_window_show ();
+	}
+
 }
diff --git a/sflphone-client-gnome/src/widget/imwidget.h b/sflphone-client-gnome/src/widget/imwidget.h
index 7a250b43f8..b5e80b27df 100644
--- a/sflphone-client-gnome/src/widget/imwidget.h
+++ b/sflphone-client-gnome/src/widget/imwidget.h
@@ -63,6 +63,13 @@ struct _IMWidgetClass {
 	GtkContainerClass parent_class;
 };
 
+
+/*
+ * Display the instant messaging interface for this call. 
+ * If it has not been created yet, create it and attached it to the imWindow
+ */
+void im_widget_display (callable_obj_t**);
+
 GType im_widget_get_type(void) G_GNUC_CONST;
 GtkWidget *im_widget_new(void);
 void im_widget_add_message (callable_obj_t *c, const gchar *message);
diff --git a/sflphone-client-gnome/webkit/Makefile.am b/sflphone-client-gnome/webkit/Makefile.am
index 7d546f4840..6ef49f61b1 100644
--- a/sflphone-client-gnome/webkit/Makefile.am
+++ b/sflphone-client-gnome/webkit/Makefile.am
@@ -8,4 +8,5 @@ imdir = $(webkitdir)/im
 im_DATA =	im/im.js \
 			im/im.html \
 			im/im.css \
-			im/sflphone.png
+			im/sflphone.png \
+			im/chat_info.png
diff --git a/sflphone-client-gnome/webkit/im/chat_info.png b/sflphone-client-gnome/webkit/im/chat_info.png
new file mode 100644
index 0000000000000000000000000000000000000000..07d3ac7940b2817de5f0497975c883a6c416dd55
GIT binary patch
literal 7284
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
Jmvv4FO#uD!i-Q0F

literal 0
HcmV?d00001

diff --git a/sflphone-client-gnome/webkit/im/im.css b/sflphone-client-gnome/webkit/im/im.css
index 5058075b0e..a234d411e9 100644
--- a/sflphone-client-gnome/webkit/im/im.css
+++ b/sflphone-client-gnome/webkit/im/im.css
@@ -7,6 +7,7 @@
 	margin: 20px;
 overflow: auto;
 font-size: 0.95em;
+clear: both;
 }
 
 * {
@@ -22,7 +23,16 @@ body {
 	background: #fbfdfe url(sflphone.png) no-repeat fixed bottom right;
 }
 
-.peername {
+.author {
 	color: #3578B1;
 	font-weight: bold;
 }
+
+#call-info {
+	margin: 40px;
+height: 96px;
+	background: url(chat_info.png) no-repeat center left;
+	padding: 20px 20px 20px 100px;
+	border: 2px solid #dedede;
+	-webkit-border-radius: 25px;
+}
diff --git a/sflphone-client-gnome/webkit/im/im.html b/sflphone-client-gnome/webkit/im/im.html
index cb7e025185..ee3a5d5584 100644
--- a/sflphone-client-gnome/webkit/im/im.html
+++ b/sflphone-client-gnome/webkit/im/im.html
@@ -5,8 +5,13 @@
 	</head>
 	<body>
 		<div class='page'>
-			<div id="call-info"></div>
-			<div id="messages"></div>
+			<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="messages">
+			</div>
 		</div>
 	</body>
 </html>
diff --git a/sflphone-client-gnome/webkit/im/im.js b/sflphone-client-gnome/webkit/im/im.js
index be53a4b082..45642b0ce3 100644
--- a/sflphone-client-gnome/webkit/im/im.js
+++ b/sflphone-client-gnome/webkit/im/im.js
@@ -23,12 +23,16 @@ function add_message (message, peer_name, peer_number, peer_info)
 	}
 	
 	var msgBody = document.getElementById ('messages');
-	msgBody.innerHTML = msgBody.innerHTML + '<div class="message">' +  '<span class="peername">' + display_name + ': </span>' + '<span class="text">' + linkify (message) + '</span></div>' ;
+	msgBody.innerHTML = msgBody.innerHTML + '<div class="message">' +  '<span class="author">' + display_name + ': </span>' + '<p class="text">' + linkify (message) + '</p></div>' ;
 }
 
 function add_call_info_header (peer_name, peer_number, peer_info)
 {
-	var infoBody = document.getElementById ('call-info');
-	infoBody.innerHTML = '<h2>Calling ' + peer_number + '</h2><p>' + peer_info + '</p></h4>';
+	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;
 
 }
-- 
GitLab