]> cgit.babelmonkeys.de Git - jubjub.git/blobdiff - src/gui/gtk/JubGtkRosterUI.m
Show the domainpart for contacts without nick and nodepart
[jubjub.git] / src / gui / gtk / JubGtkRosterUI.m
index 4102e3432e3cf0307ffb90c9ff4908a613b1d4a2..901da507e2411b08c05ff67aca7e019fec1e021c 100644 (file)
@@ -9,12 +9,13 @@
 static void roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path,
     GtkTreeViewColumn *column, gpointer data)
 {
-       JubGtkRosterUI *roster = data;
+       OFAutoreleasePool *pool;
+       XMPPContact *contact;
+       JubChatClient *client = data;
        GtkTreeIter row_iter;
        GtkTreeModel *tree_model;
        gchar *jid_s;
-       XMPPJID *jid;
-       OFAutoreleasePool *pool;
+       OFString *jid;
 
        tree_model = gtk_tree_view_get_model(tree_view);
        gtk_tree_model_get_iter(tree_model, &row_iter, path);
@@ -24,10 +25,12 @@ static void roster_row_activated(GtkTreeView *tree_view, GtkTreePath *path,
        if (!jid_s) return;
 
        pool = [OFAutoreleasePool new];
-       jid = [XMPPJID JIDWithString: [OFString stringWithUTF8String: jid_s]];
 
-       [roster performSelectorOnMainThread: @selector(chatForJID:)
-                                withObject: jid
+       jid = [OFString stringWithUTF8String: jid_s];
+       contact = [client.contactManager.contacts objectForKey: jid];
+
+       [client performSelectorOnMainThread: @selector(chatForContact:)
+                                withObject: contact
                              waitUntilDone: NO];
        [pool release];
 }
@@ -82,7 +85,6 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model,
                    initWithKeyFunctions: keyFunctions
                          valueFunctions: rowRefFunctions];
                contactMap = [[OFMutableDictionary alloc] init];
-               chatMap = [[OFMutableDictionary alloc] init];
                client = [client_ retain];
 
                [client.contactManager addDelegate: self];
@@ -109,7 +111,7 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model,
                        "RosterTreeView"));
 
                g_signal_connect(roster_view, "row_activated",
-                   G_CALLBACK(roster_row_activated), self);
+                   G_CALLBACK(roster_row_activated), client);
 
                presence_combo = GTK_COMBO_BOX(gtk_builder_get_object(builder,
                        "PresenceComboBox"));
@@ -132,7 +134,6 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model,
        [client.contactManager removeDelegate: self];
        [groupMap release];
        [contactMap release];
-       [chatMap release];
        [client release];
 
        gtk_widget_destroy(roster_window);
@@ -140,46 +141,13 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model,
        [super dealloc];
 }
 
-// FIXME: This needs to move somewhere else
-- (JubGtkChatUI*)chatForJID: (XMPPJID*)jid
-{
-       OFAutoreleasePool *pool = [OFAutoreleasePool new];
-       JubGtkChatUI *chat =
-           [chatMap objectForKey: [jid bareJID]];
-       if (chat == nil) {
-               OFString * title = [@"Chat with " stringByAppendingString:
-                   [jid bareJID]];
-
-               chat = [[[JubGtkChatUI alloc]
-                   initWithTitle: title
-                      closeBlock: ^{
-                               [chatMap removeObjectForKey: [jid bareJID]];
-                       }
-                       sendBlock: ^(OFString *text) {
-                               XMPPMessage *msg =
-                                   [XMPPMessage messageWithType: @"chat"];
-                               msg.to = jid;
-                               msg.body = text;
-                               [client.connection sendStanza: msg];
-                       }
-               ] autorelease];
-
-               [chatMap setObject: chat
-                           forKey: [jid bareJID]];
-       }
-
-       [pool release];
-
-       return chat;
-}
-
 -  (void)contact: (XMPPContact*)contact
   didSendMessage: (XMPPMessage*)message
 {
        if (message.body == nil || ![message.type isEqual: @"chat"])
                return;
 
-       JubGtkChatUI *chat = [self chatForJID: message.from];
+       id<JubChatUI> chat = [client chatForContact: contact];
        [chat addMessage: message.body
                  sender: [message.from bareJID]];
 }
@@ -236,11 +204,16 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model,
                            0, [item.name UTF8String],
                            1, [bareJID UTF8String],
                            2, "unavailable", -1);
-               else
+               else if (item.JID.node)
                        gtk_tree_store_set(roster_model, &contact_iter,
                            0, [item.JID.node UTF8String],
                            1, [bareJID UTF8String],
                            2, "unavailable", -1);
+               else
+                       gtk_tree_store_set(roster_model, &contact_iter,
+                           0, [item.JID.domain UTF8String],
+                           1, [bareJID UTF8String],
+                           2, "unavailable", -1);
 
                contact_path = gtk_tree_model_get_path(GTK_TREE_MODEL(
                        roster_model), &contact_iter);
@@ -348,6 +321,28 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model,
 -   (void)contact: (XMPPContact*)contact
   didSendPresence: (XMPPPresence*)presence
 {
+       OFDictionary *allPresences = [contact presences];
+       XMPPPresence *highPresence = [[[allPresences allObjects] sortedArray]
+                                        lastObject];
+       OFMutableString *tooltip =
+           [OFMutableString stringWithString: @"<b>Resources:</b>"];
+
+       [allPresences enumerateKeysAndObjectsUsingBlock:
+           ^(OFString *resource, XMPPPresence *pres, BOOL *stop) {
+               [tooltip appendString: @"\n"];
+               [tooltip appendString: resource];
+               if ([pres.type isEqual: @"available"]) {
+                       if (pres.show != nil)
+                               [tooltip appendFormat: @" (%@)", pres.show];
+                       else
+                               [tooltip appendString: @" (available)"];
+               } else
+                       [tooltip appendString: @" (unavailable)"];
+
+               if (pres.status)
+                       [tooltip appendFormat: @": <i>%@</i>", pres.status];
+       }];
+
        g_idle_add_block(^{
                GtkTreeIter iter;
                GtkTreePath *path;
@@ -362,19 +357,20 @@ static gboolean filter_roster_by_presence(GtkTreeModel *model,
                            &iter, path);
                        gtk_tree_path_free(path);
 
-                       if ([presence.type isEqual: @"available"])
-                               if (presence.show != nil)
+                       if ([highPresence.type isEqual: @"available"]) {
+                               if (highPresence.show != nil)
                                        gtk_tree_store_set(roster_model, &iter,
-                                           2, [presence.show UTF8String], -1);
+                                           2, [highPresence.show UTF8String],
+                                           -1);
                                else
                                        gtk_tree_store_set(roster_model, &iter,
                                            2, "available", -1);
-                       else if ([presence.type isEqual: @"unavailable"])
+                       } else
                                gtk_tree_store_set(roster_model, &iter,
                                    2, "unavailable", -1);
 
                        gtk_tree_store_set(roster_model, &iter,
-                           3, [presence.status UTF8String], -1);
+                           3, [tooltip UTF8String], -1);
                }
 
                gtk_tree_model_filter_refilter(roster_filter);