gossip r2805 - in trunk: . data/glade libgossip src



Author: mr
Date: Wed May 14 22:22:25 2008
New Revision: 2805
URL: http://svn.gnome.org/viewvc/gossip?rev=2805&view=rev

Log:
Added a context menu for group chat contacts, fixes bug 522388


Modified:
   trunk/ChangeLog
   trunk/data/glade/chat.glade
   trunk/data/glade/group-chat.glade
   trunk/libgossip/gossip-jabber-vcard.c
   trunk/libgossip/gossip-session.c
   trunk/src/gossip-chat-window.c
   trunk/src/gossip-group-chat.c
   trunk/src/gossip-group-chat.h

Modified: trunk/data/glade/chat.glade
==============================================================================
--- trunk/data/glade/chat.glade	(original)
+++ trunk/data/glade/chat.glade	Wed May 14 22:22:25 2008
@@ -332,21 +332,21 @@
 		  </child>
 
 		  <child>
-		    <widget class="GtkSeparatorMenuItem" id="separator12">
+		    <widget class="GtkSeparatorMenuItem" id="menu_room_separator">
 		      <property name="visible">True</property>
 		    </widget>
 		  </child>
 
 		  <child>
-		    <widget class="GtkMenuItem" id="menu_room_kick">
-		      <property name="visible">True</property>
-		      <property name="label" translatable="yes">_Kick...</property>
+		    <widget class="GtkMenuItem" id="menu_room_contact">
+		      <property name="visible">False</property>
+		      <property name="label" translatable="yes">_Contact</property>
 		      <property name="use_underline">True</property>
 		    </widget>
 		  </child>
 
 		  <child>
-		    <widget class="GtkSeparatorMenuItem" id="separator10">
+		    <widget class="GtkSeparatorMenuItem" id="menu_room_separator_bottom">
 		      <property name="visible">True</property>
 		    </widget>
 		  </child>

Modified: trunk/data/glade/group-chat.glade
==============================================================================
--- trunk/data/glade/group-chat.glade	(original)
+++ trunk/data/glade/group-chat.glade	Wed May 14 22:22:25 2008
@@ -1133,4 +1133,60 @@
   </child>
 </widget>
 
+<widget class="GtkMenu" id="contact_menu">
+  <property name="visible">True</property>
+
+  <child>
+    <widget class="GtkImageMenuItem" id="private_chat">
+      <property name="visible">True</property>
+      <property name="label" translatable="yes">Private Chat</property>
+      <property name="use_underline">True</property>
+
+      <child internal-child="image">
+	<widget class="GtkImage" id="image12">
+	  <property name="visible">True</property>
+	  <property name="pixbuf">gossip-message.png</property>
+	  <property name="xalign">0.5</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">0</property>
+	</widget>
+      </child>
+    </widget>
+  </child>
+
+  <child>
+    <widget class="GtkImageMenuItem" id="contact_information">
+      <property name="visible">True</property>
+      <property name="label" translatable="yes">Contact Information</property>
+      <property name="use_underline">True</property>
+
+      <child internal-child="image">
+	<widget class="GtkImage" id="image13">
+	  <property name="visible">True</property>
+	  <property name="pixbuf">vcard_16.png</property>
+	  <property name="xalign">0.5</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">0</property>
+	</widget>
+      </child>
+    </widget>
+  </child>
+
+  <child>
+    <widget class="GtkSeparatorMenuItem" id="separator1">
+      <property name="visible">True</property>
+    </widget>
+  </child>
+
+  <child>
+    <widget class="GtkMenuItem" id="kick">
+      <property name="visible">True</property>
+      <property name="label" translatable="yes">Kick...</property>
+      <property name="use_underline">True</property>
+    </widget>
+  </child>
+</widget>
+
 </glade-interface>

Modified: trunk/libgossip/gossip-jabber-vcard.c
==============================================================================
--- trunk/libgossip/gossip-jabber-vcard.c	(original)
+++ trunk/libgossip/gossip-jabber-vcard.c	Wed May 14 22:22:25 2008
@@ -230,23 +230,15 @@
 	LmMessage          *m;
 	LmMessageNode      *node;
 	LmMessageHandler   *handler;
-	GossipJID          *jid;
 	GossipCallbackData *data;
-	const gchar        *jid_without_resource;
 
 	connection = gossip_jabber_get_connection (jabber);
 
-	jid = gossip_jid_new (jid_str);
-	jid_without_resource = gossip_jid_get_without_resource (jid);
+	gossip_debug (DEBUG_DOMAIN, "Requesting VCard, JID:'%s'", jid_str);
 
-	gossip_debug (DEBUG_DOMAIN, 
-		      "Getting for JID:'%s'...", 
-		      jid_without_resource);
-
-	m = lm_message_new (jid_without_resource,
+	m = lm_message_new (jid_str,
 			    LM_MESSAGE_TYPE_IQ);
 
-	gossip_jid_unref (jid);
 
 	node = lm_message_node_add_child (m->node, "vCard", NULL);
 	lm_message_node_set_attribute (node, "xmlns", "vcard-temp");
@@ -262,7 +254,7 @@
 	if (!lm_connection_send_with_reply (connection, m, handler, error)) {
 		gossip_debug (DEBUG_DOMAIN, 
 			      "Failed to get VCard for JID:'%s' (could not send request)", 
-			      jid_without_resource);
+			      jid_str);
 
 		lm_message_unref (m);
 		lm_message_handler_unref (handler);

Modified: trunk/libgossip/gossip-session.c
==============================================================================
--- trunk/libgossip/gossip-session.c	(original)
+++ trunk/libgossip/gossip-session.c	Wed May 14 22:22:25 2008
@@ -1954,7 +1954,18 @@
 	jabber = session_get_protocol (session, contact);
 
 	if (!jabber) {
-		return FALSE;
+		/* Temporary contact. Use account */
+		GossipAccount           *account;
+		GossipSessionPriv        *priv = GET_PRIV (session);
+
+		account = gossip_session_find_account (session, contact);
+		g_return_val_if_fail (GOSSIP_IS_ACCOUNT (account), FALSE);
+
+		jabber = g_hash_table_lookup (priv->accounts, account);
+ 		g_object_unref (account);
+
+		g_return_val_if_fail (jabber, FALSE);
+
 	}
 
 	return gossip_jabber_get_version (jabber, contact,

Modified: trunk/src/gossip-chat-window.c
==============================================================================
--- trunk/src/gossip-chat-window.c	(original)
+++ trunk/src/gossip-chat-window.c	Wed May 14 22:22:25 2008
@@ -95,7 +95,8 @@
 	GtkWidget   *menu_room_add;
 	GtkWidget   *menu_room_change_subject;
 	GtkWidget   *menu_room_change_nick;
-	GtkWidget   *menu_room_kick;
+	GtkWidget   *menu_room_contact;
+	GtkWidget   *menu_room_separator;
 	GtkWidget   *menu_room_show_contacts;
 
 	GtkWidget   *menu_edit_cut;
@@ -165,8 +166,6 @@
 								 GossipChatWindow      *window);
 static void         chat_window_room_change_nick_activate_cb    (GtkWidget             *menuitem,
 								 GossipChatWindow      *window);
-static void         chat_window_room_kick_activate_cb           (GtkWidget             *menuitem,
-								 GossipChatWindow      *window);
 static void         chat_window_edit_activate_cb                (GtkWidget             *menuitem,
 								 GossipChatWindow      *window);
 static void         chat_window_edit_insert_smiley_activate_cb  (GtkWidget             *menuitem,
@@ -315,7 +314,8 @@
 				       "menu_room_add", &priv->menu_room_add,
 				       "menu_room_change_subject", &priv->menu_room_change_subject,
 				       "menu_room_change_nick", &priv->menu_room_change_nick,
-				       "menu_room_kick", &priv->menu_room_kick,
+				       "menu_room_contact", &priv->menu_room_contact,
+				       "menu_room_separator", &priv->menu_room_separator,
 				       "menu_room_show_contacts", &priv->menu_room_show_contacts,
 				       "menu_edit_cut", &priv->menu_edit_cut,
 				       "menu_edit_copy", &priv->menu_edit_copy,
@@ -343,7 +343,6 @@
 			      "menu_room_add", "activate", chat_window_room_add_activate_cb,
 			      "menu_room_change_subject", "activate", chat_window_room_change_subject_activate_cb,
 			      "menu_room_change_nick", "activate", chat_window_room_change_nick_activate_cb,
-			      "menu_room_kick", "activate", chat_window_room_kick_activate_cb,
 			      "menu_edit", "activate", chat_window_edit_activate_cb,
 			      "menu_edit_cut", "activate", chat_window_edit_cut_activate_cb,
 			      "menu_edit_copy", "activate", chat_window_edit_copy_activate_cb,
@@ -841,7 +840,6 @@
 		GossipChatroom        *chatroom;
 		GossipChatroomId       id;
 		gboolean               saved;
-		gboolean               can_kick = TRUE;
 		gboolean               can_change_subject = TRUE;
 
 		group_chat = GOSSIP_GROUP_CHAT (priv->current_chat);
@@ -861,9 +859,6 @@
 		id = gossip_chatroom_get_id (chatroom);
 		saved = gossip_chatroom_manager_find (manager, id) != NULL;
 
-		can_kick &= is_connected;
-		can_kick &= gossip_group_chat_contact_can_kick (group_chat, own_contact);
-
 		can_change_subject &= is_connected;
 		can_change_subject &= gossip_group_chat_contact_can_change_subject (group_chat, own_contact);
 
@@ -873,7 +868,6 @@
 		gtk_widget_set_sensitive (priv->menu_room_invite, is_connected);
 		gtk_widget_set_sensitive (priv->menu_room_change_subject, can_change_subject);
 		gtk_widget_set_sensitive (priv->menu_room_change_nick, is_connected);
-		gtk_widget_set_sensitive (priv->menu_room_kick, can_kick);
 
 		/* We need to block the signal here because all we are
 		 * really trying to do is check or uncheck the menu
@@ -1129,10 +1123,7 @@
 {
 	GossipChatWindowPriv *priv;
 	GossipGroupChat      *group_chat;
-	GossipContact        *contact;
-	GossipContact        *own_contact;
-	gboolean              can_kick;
-	gboolean              can_change_subject;
+	GtkWidget            *submenu = NULL;
 
 	priv = GET_PRIV (window);
 
@@ -1142,19 +1133,26 @@
 
 	/* Set up 'selected contact' sensitive items */
 	group_chat = GOSSIP_GROUP_CHAT (priv->current_chat);
-	contact = gossip_group_chat_get_selected_contact (group_chat);
-	own_contact = gossip_chat_get_own_contact (priv->current_chat);
 
-	can_kick  = TRUE;
-	can_kick &= contact && !gossip_contact_equal (contact, own_contact);
-	can_kick &= gossip_group_chat_contact_can_kick (group_chat, own_contact);
+	submenu = gossip_group_chat_contact_menu (group_chat);
+	
+	if (submenu) {
+		GtkMenuItem *item;
 
-	gtk_widget_set_sensitive (priv->menu_room_kick, can_kick);
+		item = GTK_MENU_ITEM (priv->menu_room_contact);
+		
+		gtk_menu_item_set_submenu (item, submenu);
+		gtk_widget_show (priv->menu_room_contact);
+		gtk_widget_show (priv->menu_room_separator);
+	} else {
+		GtkMenuItem *item;
 
-	can_change_subject = TRUE;
-	can_change_subject &= gossip_group_chat_contact_can_change_subject (group_chat, own_contact);
+		item = GTK_MENU_ITEM (priv->menu_room_contact);
 
-	gtk_widget_set_sensitive (priv->menu_room_change_subject, can_change_subject);
+		gtk_menu_item_set_submenu (item, NULL);
+		gtk_widget_hide (priv->menu_room_contact);
+		gtk_widget_hide (priv->menu_room_separator);
+	}
 }
 
 static void
@@ -1253,23 +1251,6 @@
 }
 
 static void
-chat_window_room_kick_activate_cb (GtkWidget        *menuitem,
-				   GossipChatWindow *window)
-{
-	GossipChatWindowPriv *priv;
-	GossipGroupChat      *group_chat;
-	
-	priv = GET_PRIV (window);
-
-	if (!gossip_chat_is_group_chat (priv->current_chat)) {
-		return;
-	}
-
-	group_chat = GOSSIP_GROUP_CHAT (priv->current_chat);
-	gossip_group_chat_contact_kick (group_chat, NULL);
-}
-
-static void
 chat_window_edit_activate_cb (GtkWidget        *menuitem,
 			      GossipChatWindow *window)
 {

Modified: trunk/src/gossip-group-chat.c
==============================================================================
--- trunk/src/gossip-group-chat.c	(original)
+++ trunk/src/gossip-group-chat.c	Wed May 14 22:22:25 2008
@@ -44,6 +44,7 @@
 #include "gossip-chat-invite.h"
 #include "gossip-chat-view.h"
 #include "gossip-contact-list-iface.h"
+#include "gossip-contact-info-dialog.h"
 #include "gossip-glade.h"
 #include "gossip-group-chat.h"
 #include "gossip-private-chat.h"
@@ -225,6 +226,9 @@
 							       GtkTreePath                  *path,
 							       GtkTreeViewColumn            *col,
 							       GossipGroupChat              *chat);
+static gboolean        group_chat_cl_button_press_event_cb    (GtkTreeView                  *view,
+							       GdkEventButton               *event,
+							       GossipGroupChat              *chat);  
 static gint            group_chat_cl_sort_func                (GtkTreeModel                 *model,
 							       GtkTreeIter                  *iter_a,
 							       GtkTreeIter                  *iter_b,
@@ -255,6 +259,16 @@
 static void            group_chat_cl_set_background           (GossipGroupChat              *chat,
 							       GtkCellRenderer              *cell,
 							       gboolean                      is_header);
+static GtkWidget *     group_chat_cl_menu_create              (GossipGroupChat              *chat,
+							       GossipContact                *contact);
+static void            group_chat_cl_menu_destroy             (GtkWidget                    *menu,
+	                                                       GossipGroupChat              *chat);
+static void            group_chat_cl_menu_info_activate_cb    (GtkMenuItem                  *menuitem,
+	                                                       GossipGroupChat              *chat);
+static void            group_chat_cl_menu_chat_activate_cb    (GtkMenuItem                  *menuitem,
+	                                                       GossipGroupChat              *chat);
+static void            group_chat_cl_menu_kick_activate_cb    (GtkMenuItem                  *menuitem,
+	                                                       GossipGroupChat              *chat);
 static void            group_chat_set_scrolling_for_events    (GossipGroupChat              *chat,
 							       gboolean                      disable);
 static gboolean        group_chat_scroll_down_when_idle_func  (GossipGroupChat              *chat);
@@ -593,14 +607,94 @@
 	group_chat_chatroom_status_update (GOSSIP_GROUP_CHAT (chat), error);
 }
 
+static GtkWidget*
+group_chat_cl_menu_create (GossipGroupChat *chat,
+			   GossipContact   *contact)
+{
+	GladeXML      *glade;
+	GtkWidget     *menu;
+	GtkWidget     *menu_item_kick;
+	GossipContact *own_contact;
+	gboolean       can_kick = TRUE;
+	
+	g_return_val_if_fail (GOSSIP_IS_GROUP_CHAT (chat), NULL);
+	
+	glade = gossip_glade_get_file ("group-chat.glade",
+				       "contact_menu",
+				       NULL,
+				       "contact_menu", &menu,
+				       "kick", &menu_item_kick,
+				       NULL);
+	
+	gossip_glade_connect (glade,
+			      chat,
+			      "contact_menu", "selection-done", group_chat_cl_menu_destroy,
+			      "private_chat", "activate", group_chat_cl_menu_chat_activate_cb,
+			      "contact_information", "activate", group_chat_cl_menu_info_activate_cb,
+			      "kick", "activate", group_chat_cl_menu_kick_activate_cb,
+			      NULL);
+	
+	own_contact = gossip_chat_get_own_contact (GOSSIP_CHAT (chat));
+	can_kick &= gossip_chat_is_connected (GOSSIP_CHAT (chat));
+	can_kick &= gossip_group_chat_contact_can_kick (chat, own_contact);
+
+	gtk_widget_set_sensitive (menu_item_kick, can_kick);
+	
+	g_object_unref (glade); 
+	
+	return menu;    
+}
+
+static void
+group_chat_cl_menu_destroy (GtkWidget       *menu,
+			    GossipGroupChat *chat)
+{
+	gtk_widget_destroy (menu);
+	g_object_unref (menu);
+}
+
+static void
+group_chat_cl_menu_info_activate_cb (GtkMenuItem     *menuitem,
+				     GossipGroupChat *chat)
+{
+	GossipContact *contact;
+	
+	contact = gossip_group_chat_get_selected_contact (chat);
+	
+	gossip_contact_info_dialog_show (contact,
+					 NULL);
+	g_object_unref (contact);
+	
+}
+static void
+group_chat_cl_menu_chat_activate_cb (GtkMenuItem     *menuitem,
+				     GossipGroupChat *chat)
+{
+	GossipContact *contact;
+	
+	contact = gossip_group_chat_get_selected_contact(chat);
+	
+	group_chat_private_chat_new (chat, contact);
+	
+	g_object_unref (contact);
+	
+}
+
+static void
+group_chat_cl_menu_kick_activate_cb (GtkMenuItem     *menuitem,
+				     GossipGroupChat *chat)
+{
+	gossip_group_chat_contact_kick (chat, NULL);
+}
+ 
 static void
 group_chat_protocol_connected_cb (GossipSession   *session,
 				  GossipAccount   *account,
 				  GossipJabber    *jabber,
 				  GossipGroupChat *chat)
 {
-	GossipGroupChatPriv  *priv;
-	GossipAccount        *this_account;
+	GossipGroupChatPriv *priv;
+	GossipAccount       *this_account;
 
 	priv = GET_PRIV (chat);
 
@@ -1474,6 +1568,50 @@
 	}
 }
 
+static gboolean
+group_chat_cl_button_press_event_cb (GtkTreeView     *view,
+				     GdkEventButton  *event,
+				     GossipGroupChat *chat)
+{
+	GtkWidget        *menu;
+	GtkTreePath      *path;
+	GtkTreeSelection *selection;
+	gboolean          row_exists;
+	
+	if (event->button != 3) {
+		return FALSE;
+	}
+	
+	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+	
+	gtk_widget_grab_focus (GTK_WIDGET (view));
+	
+	row_exists = gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (view),
+						    event->x, event->y,
+						    &path,
+						    NULL, NULL, NULL);
+	if (!row_exists) {
+		return FALSE;
+	}
+	
+	gtk_tree_selection_unselect_all (selection);
+	gtk_tree_selection_select_path (selection, path);
+	
+	menu = gossip_group_chat_contact_menu (chat);
+		
+	if (menu) {
+		g_object_ref (menu);
+		g_object_ref_sink (menu);
+		g_object_unref (menu);
+		gtk_widget_show (menu);
+		gtk_menu_popup (GTK_MENU (menu),
+				NULL, NULL, NULL, NULL,
+				event->button, event->time);
+	}
+	
+	return TRUE;
+}
+
 static void
 group_chat_cl_setup (GossipGroupChat *chat)
 {
@@ -1548,9 +1686,12 @@
 
 	gtk_tree_view_append_column (treeview, col);
 
-	g_signal_connect (treeview, "row_activated",
+	g_signal_connect (treeview, "row-activated",
 			  G_CALLBACK (group_chat_cl_row_activated_cb),
 			  chat);
+	g_signal_connect (treeview, "button-press-event",
+			  G_CALLBACK (group_chat_cl_button_press_event_cb),
+			  chat);
 }
 
 static gboolean
@@ -2565,6 +2706,37 @@
 }
 
 
+GtkWidget *
+gossip_group_chat_contact_menu (GossipGroupChat *group_chat)
+{
+	GossipGroupChatPriv *priv;
+	GossipContact       *contact;
+	GtkWidget           *menu = NULL;
+
+	g_return_val_if_fail (GOSSIP_IS_GROUP_CHAT (group_chat), NULL);
+
+	priv = GET_PRIV (group_chat);
+
+	if (!gossip_chat_is_connected (GOSSIP_CHAT (group_chat))) {
+		return NULL;
+	}
+
+	contact = gossip_group_chat_get_selected_contact (group_chat);
+	if (!contact) {
+		return NULL;
+	}
+	
+	if (gossip_contact_equal (contact, priv->own_contact)) {
+		g_object_unref (contact);
+		return NULL;
+	}
+
+	menu = group_chat_cl_menu_create (group_chat, contact);
+	g_object_unref (contact);
+
+	return menu;
+}
+
 void
 gossip_group_chat_change_subject (GossipGroupChat *group_chat)
 {
@@ -2707,3 +2879,4 @@
 
 	return gossip_chatroom_contact_can_change_role (priv->chatroom, contact_to_use);
 }
+

Modified: trunk/src/gossip-group-chat.h
==============================================================================
--- trunk/src/gossip-group-chat.h	(original)
+++ trunk/src/gossip-group-chat.h	Wed May 14 22:22:25 2008
@@ -61,6 +61,7 @@
 		 gossip_group_chat_get_chatroom_provider      (GossipGroupChat        *group_chat);
 GossipChatroom * gossip_group_chat_get_chatroom               (GossipGroupChat        *group_chat);
 GossipContact *  gossip_group_chat_get_selected_contact       (GossipGroupChat        *group_chat);
+GtkWidget *      gossip_group_chat_contact_menu               (GossipGroupChat        *group_chat);
 
 /* Actions */
 void             gossip_group_chat_change_subject             (GossipGroupChat        *group_chat);
@@ -68,7 +69,6 @@
 void             gossip_group_chat_contact_kick               (GossipGroupChat        *group_chat,
 							       GossipContact          *contact);
 
-
 /* Privileges */
 gboolean         gossip_group_chat_contact_can_message_all    (GossipGroupChat        *group_chat,
 							       GossipContact          *contact);



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