adium/adium

Merged adium-1.6 into default.

2013-05-03, Thijs Alkemade
231fb0c720ae
Merged adium-1.6 into default.
  • +4 -1
    Frameworks/AIUtilities Framework/Source/AIColorAdditions.m
  • +1 -1
    Frameworks/AIUtilities Framework/Source/AIImageViewWithImagePicker.m
  • +15 -5
    Frameworks/Adium Framework/Source/AIAbstractListController.m
  • +1 -0
    Frameworks/Adium Framework/Source/AIChat.m
  • +10 -1
    Frameworks/Adium Framework/Source/AIContentMessage.h
  • +28 -9
    Frameworks/Adium Framework/Source/AIContentMessage.m
  • +10 -0
    Frameworks/Adium Framework/Source/AIContentObject.h
  • +13 -1
    Frameworks/Adium Framework/Source/AIContentObject.m
  • +2 -1
    Frameworks/Adium Framework/Source/AIContentTopic.h
  • +2 -0
    Frameworks/Adium Framework/Source/AIContentTopic.m
  • +18 -14
    Frameworks/Adium Framework/Source/AIGroupChat.h
  • +115 -112
    Frameworks/Adium Framework/Source/AIGroupChat.m
  • +6 -9
    Frameworks/Adium Framework/Source/AIListContactGroupChatCell.m
  • +6 -0
    Frameworks/Adium Framework/Source/AIProxyListObject.h
  • +13 -1
    Frameworks/Adium Framework/Source/AIProxyListObject.m
  • +1 -0
    Frameworks/Adium Framework/Source/ESFileTransfer.m
  • +0 -23
    Frameworks/PSMTabBarControl.framework/Versions/A/Headers/NSBezierPath_AMShading.h
  • +0 -0
    Frameworks/PSMTabBarControl.framework/Versions/A/PSMTabBarControl
  • +0 -0
    Frameworks/PSMTabBarControl.framework/Versions/A/Resources/English.lproj/InfoPlist.strings
  • +5 -5
    Frameworks/PSMTabBarControl.framework/Versions/A/Resources/Info.plist
  • +0 -0
    Frameworks/PSMTabBarControl.framework/Versions/A/Resources/Japanese.lproj/InfoPlist.strings
  • +0 -0
    Frameworks/PSMTabBarControl.framework/Versions/A/Resources/Japanese.lproj/Inspector.nib
  • +0 -0
    Frameworks/PSMTabBarControl.framework/Versions/A/Resources/Japanese.lproj/Library.nib
  • +0 -0
    Frameworks/PSMTabBarControl.framework/Versions/A/Resources/largeImage.png
  • +2 -0
    Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h
  • +2 -2
    Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdater.h
  • +7 -7
    Frameworks/Sparkle.framework/Versions/A/Resources/Info.plist
  • +0 -115
    Frameworks/Sparkle.framework/Versions/A/Resources/License.txt
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/SUPasswordPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUPasswordPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib
  • +6 -6
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Info.plist
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/MacOS/finish_installation
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/SUStatus.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ar.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/da.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/is.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ja.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/pt_BR.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ro.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/ru.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/sl.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/th.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/tr.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/finish_installation.app/Contents/Resources/uk.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ko.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUPasswordPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sk.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/SUPasswordPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib
  • +0 -0
    Frameworks/Sparkle.framework/Versions/A/Sparkle
  • +4 -4
    Plists/Info.plist
  • +15 -13
    Plugins/Dual Window Interface/AIMessageViewController.m
  • +2 -1
    Plugins/Purple Service/AIPurpleCertificateViewer.h
  • +11 -2
    Plugins/Purple Service/AIPurpleCertificateViewer.m
  • +2 -2
    Plugins/Purple Service/CBPurpleAccount.h
  • +44 -46
    Plugins/Purple Service/CBPurpleAccount.m
  • +1 -3
    Plugins/Purple Service/ESIRCAccount.m
  • +2 -1
    Plugins/Purple Service/ESPurpleAIMAccount.m
  • +17 -18
    Plugins/Purple Service/adiumPurpleConversation.m
  • +12 -8
    Plugins/Twitter Plugin/AITwitterAccount.m
  • +26 -1
    Plugins/WebKit Message View/AIWebKitMessageViewController.m
  • +3 -3
    Plugins/WebKit Message View/AIWebkitMessageViewStyle.m
  • +2 -0
    Resources/LoggingDefaults.plist
  • +4 -3
    Source/AIChatController.m
  • +1 -19
    Source/AIContactInfoImageViewWithImagePicker.m
  • +29 -28
    Source/AIGroupChatStatusTooltipPlugin.m
  • +1 -0
    Source/AILogViewerWindowController.h
  • +53 -11
    Source/AILogViewerWindowController.m
  • +1 -1
    Source/AILoggerPlugin.m
  • +13 -12
    Source/AIMentionEventPlugin.m
  • +1 -0
    Source/AIPreferenceWindowController.m
  • +7 -3
    Source/AIXMLChatlogConverter.m
  • +35 -7
    Source/AIXtrasManager.m
  • +1 -0
    Source/DCMessageContextDisplayPlugin.m
  • --- a/Frameworks/AIUtilities Framework/Source/AIColorAdditions.m Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/AIUtilities Framework/Source/AIColorAdditions.m Fri May 03 00:06:06 2013 +0200
    @@ -163,6 +163,7 @@
    [NSColor colorWithHTMLString:@"#00f"], @"blue",
    [NSColor colorWithHTMLString:@"#008080"], @"teal",
    [NSColor colorWithHTMLString:@"#0ff"], @"aqua",
    + [NSColor colorWithHTMLString:@"#4b0082"], @"indigo",
    nil];
    NSArray *paths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:defaultRGBTxtLocation1 error:NULL];
    for (NSString *middlePath in paths) {
    @@ -527,7 +528,9 @@
    NSDictionary *colorValues = [self colorNamesDictionary];
    colorValue = [colorValues objectForKey:str];
    if (!colorValue) colorValue = [colorValues objectForKey:[str lowercaseString]];
    - if (!colorValue) {
    + if (colorValue) {
    + return colorValue;
    + } else {
    #if COLOR_DEBUG
    NSLog(@"+[NSColor(AIColorAdditions) colorWithHTMLString:] called with unrecognised color name (str is %@); returning %@", str, defaultColor);
    #endif
    --- a/Frameworks/AIUtilities Framework/Source/AIImageViewWithImagePicker.m Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/AIUtilities Framework/Source/AIImageViewWithImagePicker.m Fri May 03 00:06:06 2013 +0200
    @@ -254,7 +254,7 @@
    //Draw our original image as 50% transparent
    [dragImage lockFocus];
    - [[self image] dissolveToPoint:NSZeroPoint fraction:0.5f];
    + [[self image] drawAtPoint:NSZeroPoint fromRect:NSMakeRect(0, 0, self.image.size.width, self.image.size.height) operation:NSCompositeCopy fraction:0.5f];
    [dragImage unlockFocus];
    //We want the image to resize
    --- a/Frameworks/Adium Framework/Source/AIAbstractListController.m Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIAbstractListController.m Fri May 03 00:06:06 2013 +0200
    @@ -28,6 +28,7 @@
    #import <Adium/AIListObject.h>
    #import <Adium/AIListContact.h>
    #import <Adium/AIListGroup.h>
    +#import <Adium/AIGroupChat.h>
    #import <Adium/AIMetaContact.h>
    #import <Adium/AIListOutlineView.h>
    #import <Adium/AIMenuControllerProtocol.h>
    @@ -590,11 +591,20 @@
    id<AIContainingObject> listObject = (id<AIContainingObject>)(item.listObject);
    proxyListObject = [AIProxyListObject proxyListObjectForListObject:[listObject visibleObjectAtIndex:idx]
    inListObject:listObject];
    -
    - } else if (hideRoot)
    - proxyListObject = [AIProxyListObject proxyListObjectForListObject:[contactList visibleObjectAtIndex:idx]
    - inListObject:contactList];
    - else
    +
    + } else if (hideRoot) {
    + if ([contactList isKindOfClass:[AIGroupChat class]]) {
    + NSString *nick = [(AIGroupChat *)contactList visibleObjectAtIndex:idx];
    + AIListObject *listObject = [(AIGroupChat *)contactList contactForNick:nick];
    +
    + proxyListObject = [AIProxyListObject proxyListObjectForListObject:listObject
    + inListObject:contactList
    + withNick:nick];
    + } else {
    + proxyListObject = [AIProxyListObject proxyListObjectForListObject:[contactList visibleObjectAtIndex:idx]
    + inListObject:contactList];
    + }
    + } else
    proxyListObject = [AIProxyListObject proxyListObjectForListObject:contactList
    inListObject:nil];
    --- a/Frameworks/Adium Framework/Source/AIChat.m Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIChat.m Fri May 03 00:06:06 2013 +0200
    @@ -606,6 +606,7 @@
    AIContentMessage *messageContent;
    messageContent = [AIContentMessage messageInChat:self
    withSource:self.account
    + sourceNick:nil
    destination:self.listObject
    date:nil
    message:attributedMessage
    --- a/Frameworks/Adium Framework/Source/AIContentMessage.h Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIContentMessage.h Fri May 03 00:06:06 2013 +0200
    @@ -45,7 +45,15 @@
    withSource:(id)inSource
    destination:(id)inDest
    date:(NSDate *)inDate
    - message:(NSAttributedString *)inMessage
    + message:(NSAttributedString *)inMessage
    + autoreply:(BOOL)inAutoReply;
    +
    ++ (id)messageInChat:(AIChat *)inChat
    + withSource:(id)inSource
    + sourceNick:(NSString *)inSourceNick
    + destination:(id)inDest
    + date:(NSDate *)inDate
    + message:(NSAttributedString *)inMessage
    autoreply:(BOOL)inAutoreply;
    /*! @brief Create an AIContentMessage.
    @@ -56,6 +64,7 @@
    */
    - (id)initWithChat:(AIChat *)inChat
    source:(id)inSource
    + sourceNick:(NSString *)inSourceNick
    destination:(id)inDest
    date:(NSDate *)inDate
    message:(NSAttributedString *)inMessage
    --- a/Frameworks/Adium Framework/Source/AIContentMessage.m Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIContentMessage.m Fri May 03 00:06:06 2013 +0200
    @@ -21,7 +21,6 @@
    @implementation AIContentMessage
    -//Create a content message
    + (id)messageInChat:(AIChat *)inChat
    withSource:(id)inSource
    destination:(id)inDest
    @@ -30,11 +29,30 @@
    autoreply:(BOOL)inAutoReply
    {
    return [[self alloc] initWithChat:inChat
    - source:inSource
    - destination:inDest
    - date:inDate
    - message:inMessage
    - autoreply:inAutoReply];
    + source:inSource
    + sourceNick:nil
    + destination:inDest
    + date:inDate
    + message:inMessage
    + autoreply:inAutoReply];
    +}
    +
    +//Create a content message
    ++ (id)messageInChat:(AIChat *)inChat
    + withSource:(id)inSource
    + sourceNick:(NSString *)inSourceNick
    + destination:(id)inDest
    + date:(NSDate *)inDate
    + message:(NSAttributedString *)inMessage
    + autoreply:(BOOL)inAutoReply
    +{
    + return [[self alloc] initWithChat:inChat
    + source:inSource
    + sourceNick:inSourceNick
    + destination:inDest
    + date:inDate
    + message:inMessage
    + autoreply:inAutoReply];
    }
    //Content Identifier
    @@ -46,12 +64,13 @@
    //Init
    - (id)initWithChat:(AIChat *)inChat
    source:(id)inSource
    + sourceNick:(NSString *)inSourceNick
    destination:(id)inDest
    date:(NSDate *)inDate
    message:(NSAttributedString *)inMessage
    autoreply:(BOOL)inAutoReply
    {
    - if ((self = [super initWithChat:inChat source:inSource destination:inDest date:inDate message:inMessage])) {
    + if ((self = [super initWithChat:inChat source:inSource sourceNick:inSourceNick destination:inDest date:inDate message:inMessage])) {
    isAutoreply = inAutoReply;
    encodedMessage = nil;
    encodedMessageAccountData = nil;
    @@ -66,7 +85,7 @@
    [classes addObject:@"message"];
    if(isAutoreply) [classes addObject:@"autoreply"];
    if(self.chat.isGroupChat) {
    - AIGroupChatFlags flags = [(AIGroupChat *)self.chat flagsForContact:(AIListContact *)self.source];
    + AIGroupChatFlags flags = [(AIGroupChat *)self.chat flagsForNick:self.sourceNick];
    if (flags & AIGroupChatOp)
    [classes addObject:@"op"];
    if (flags & AIGroupChatHalfOp)
    @@ -83,7 +102,7 @@
    {
    if (!self.chat.isGroupChat) return @"";
    - AIGroupChatFlags flags = [(AIGroupChat *)self.chat flagsForContact:(AIListContact *)self.source];
    + AIGroupChatFlags flags = [(AIGroupChat *)self.chat flagsForNick:self.sourceNick];
    if ((flags & AIGroupChatFounder) == AIGroupChatFounder) {
    return @"~";
    --- a/Frameworks/Adium Framework/Source/AIContentObject.h Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIContentObject.h Fri May 03 00:06:06 2013 +0200
    @@ -38,6 +38,7 @@
    AIChat *__weak chat;
    AIListObject *source;
    AIListObject *destination;
    + NSString *sourceNick;
    BOOL outgoing;
    NSAttributedString *message;
    @@ -86,6 +87,13 @@
    date:(NSDate*)inDate
    message:(NSAttributedString *)inMessage;
    +- (id)initWithChat:(AIChat *)inChat
    + source:(AIListObject *)inSource
    + sourceNick:(NSString *)inSourceNick
    + destination:(AIListObject *)inDest
    + date:(NSDate*)inDate
    + message:(NSAttributedString *)inMessage;
    +
    /*! @brief The type of content.
    *
    * @par There is at least one type defined for every concrete subclass of \c AIContentObject.
    @@ -254,4 +262,6 @@
    */
    @property (nonatomic) BOOL postProcessContent;
    +@property (nonatomic, retain) NSString *sourceNick;
    +
    @end
    --- a/Frameworks/Adium Framework/Source/AIContentObject.m Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIContentObject.m Fri May 03 00:06:06 2013 +0200
    @@ -22,7 +22,7 @@
    @implementation AIContentObject
    @synthesize source, destination, date, isOutgoing = outgoing, chat, message, userInfo;
    -@synthesize filterContent, trackContent, displayContent, displayContentImmediately, sendContent, postProcessContent;
    +@synthesize filterContent, trackContent, displayContent, displayContentImmediately, sendContent, postProcessContent, sourceNick;
    - (id)initWithChat:(AIChat *)inChat
    source:(AIListObject *)inSource
    @@ -31,12 +31,23 @@
    {
    return [self initWithChat:inChat source:inSource destination:inDest date:inDate message:nil];
    }
    +
    - (id)initWithChat:(AIChat *)inChat
    source:(AIListObject *)inSource
    destination:(AIListObject *)inDest
    date:(NSDate*)inDate
    message:(NSAttributedString *)inMessage
    {
    + return [self initWithChat:inChat source:inSource sourceNick:nil destination:inDest date:inDate message:inMessage];
    +}
    +
    +- (id)initWithChat:(AIChat *)inChat
    + source:(AIListObject *)inSource
    + sourceNick:(NSString *)inSourceNick
    + destination:(AIListObject *)inDest
    + date:(NSDate*)inDate
    + message:(NSAttributedString *)inMessage
    +{
    if ((self = [super init]))
    {
    //Default Behavior
    @@ -49,6 +60,7 @@
    //Store source, dest, chat, ...
    source = inSource;
    + sourceNick = inSourceNick;
    destination = inDest;
    message = inMessage;
    date = (inDate ? inDate : [NSDate date]);
    --- a/Frameworks/Adium Framework/Source/AIContentTopic.h Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIContentTopic.h Fri May 03 00:06:06 2013 +0200
    @@ -27,8 +27,9 @@
    + (id)topicInChat:(AIChat *)inChat
    withSource:(id)inSource
    + sourceNick:(NSString *)inSourceNick
    destination:(id)inDest
    - date:(NSDate *)inDate
    + date:(NSDate *)inDate
    message:(NSAttributedString *)inMessage;
    @property (nonatomic) BOOL actuallyBlank;
    --- a/Frameworks/Adium Framework/Source/AIContentTopic.m Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIContentTopic.m Fri May 03 00:06:06 2013 +0200
    @@ -20,12 +20,14 @@
    @implementation AIContentTopic
    + (id)topicInChat:(AIChat *)inChat
    withSource:(id)inSource
    + sourceNick:(NSString *)inSourceNick
    destination:(id)inDest
    date:(NSDate *)inDate
    message:(NSAttributedString *)inMessage
    {
    return [super messageInChat:inChat
    withSource:inSource
    + sourceNick:inSourceNick
    destination:inDest
    date:inDate
    message:inMessage
    --- a/Frameworks/Adium Framework/Source/AIGroupChat.h Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIGroupChat.h Fri May 03 00:06:06 2013 +0200
    @@ -18,10 +18,11 @@
    @interface AIGroupChat : AIChat <AIContainingObject> {
    NSString *topic;
    -
    - NSMutableDictionary *participatingContactsFlags;
    - NSMutableDictionary *participatingContactsAliases;
    - NSMutableArray *participatingContacts;
    + NSString *topicSetter;
    +
    + NSMutableDictionary *participatingNicksFlags;
    + NSMutableDictionary *participatingNicksContacts;
    + NSMutableArray *participatingNicks;
    BOOL showJoinLeave;
    BOOL expanded;
    @@ -33,26 +34,29 @@
    @property (readonly, nonatomic) BOOL supportsTopic;
    -- (void)updateTopic:(NSString *)inTopic withSource:(AIListContact *)contact;
    +- (void)updateTopic:(NSString *)inTopic withSource:(NSString *)contact;
    - (void)setTopic:(NSString *)inTopic;
    @property (readwrite, copy, nonatomic) NSDate *lastMessageDate;
    // Group chat participants.
    -- (NSString *)displayNameForContact:(AIListObject *)contact;
    -- (AIGroupChatFlags)flagsForContact:(AIListObject *)contact;
    -- (NSString *)aliasForContact:(AIListObject *)contact;
    -- (void)setFlags:(AIGroupChatFlags)flags forContact:(AIListObject *)contact;
    -- (void)setAlias:(NSString *)alias forContact:(AIListObject *)contact;
    -- (void)removeSavedValuesForContactUID:(NSString *)contactUID;
    +- (AIListContact *)contactForNick:(NSString *)nick;
    +- (AIGroupChatFlags)flagsForNick:(NSString *)nick;
    +- (void)setFlags:(AIGroupChatFlags)flags forNick:(NSString *)nick;
    +- (void)setContact:(AIListContact *)contact forNick:(NSString *)nick;
    +- (void)changeNick:(NSString *)from to:(NSString *)to;
    +- (void)removeSavedValuesForNick:(NSString *)nick;
    +- (NSArray *)nicksForContact:(AIListObject *)contact;
    -- (void)addParticipatingListObject:(AIListContact *)inObject notify:(BOOL)notify;
    -- (void)addParticipatingListObjects:(NSArray *)inObjects notify:(BOOL)notify;
    +- (void)addParticipatingNick:(NSString *)inObject notify:(BOOL)notify;
    +- (void)addParticipatingNicks:(NSArray *)inObjects notify:(BOOL)notify;
    - (void)removeAllParticipatingContactsSilently;
    -- (void)removeObject:(AIListObject *)inObject;
    +- (void)removeObject:(NSString *)inObject;
    - (BOOL)inviteListContact:(AIListContact *)inObject withMessage:(NSString *)inviteMessage;
    - (void)resortParticipants;
    +- (NSString *)visibleObjectAtIndex:(NSUInteger)idx;
    +
    @end
    --- a/Frameworks/Adium Framework/Source/AIGroupChat.m Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIGroupChat.m Fri May 03 00:06:06 2013 +0200
    @@ -31,7 +31,6 @@
    @interface AIGroupChat ()
    - (void)contentObjectAdded:(NSNotification *)notification;
    -- (AIListContact *)visibleObjectAtIndex:(NSUInteger)idx;
    @end
    @@ -46,9 +45,9 @@
    if ((self = [super initForAccount:inAccount])) {
    showJoinLeave = YES;
    expanded = YES;
    - participatingContacts = [[NSMutableArray alloc] init];
    - participatingContactsFlags = [[NSMutableDictionary alloc] init];
    - participatingContactsAliases = [[NSMutableDictionary alloc] init];
    + participatingNicks = [[NSMutableArray alloc] init];
    + participatingNicksFlags = [[NSMutableDictionary alloc] init];
    + participatingNicksContacts = [[NSMutableDictionary alloc] init];
    [[NSNotificationCenter defaultCenter] addObserver:self
    @@ -117,20 +116,6 @@
    [super object:inObject didChangeValueForProperty:key notify:notify];
    }
    -/*!
    - * @brief The alias for a given contact
    - */
    -- (NSString *)aliasForContact:(AIListObject *)contact
    -{
    - NSString *alias = [participatingContactsAliases objectForKey:contact.UID];
    -
    - if (!alias) {
    - alias = [self.account fallbackAliasForContact:(AIListContact *)contact inChat:self];
    - }
    -
    - return alias;
    -}
    -
    AIGroupChatFlags highestFlag(AIGroupChatFlags flags)
    {
    if ((flags & AIGroupChatFounder) == AIGroupChatFounder)
    @@ -194,15 +179,18 @@
    /*!
    * @brief Update the topic.
    */
    -- (void)updateTopic:(NSString *)inTopic withSource:(AIListContact *)contact
    +- (void)updateTopic:(NSString *)inTopic withSource:(NSString *)nick
    {
    + AIListContact *contact = [self contactForNick:nick];
    +
    [self setValue:inTopic forProperty:KEY_TOPIC notify:NotifyNow];
    - [self setValue:contact forProperty:KEY_TOPIC_SETTER notify:NotifyNow];
    + [self setValue:nick forProperty:KEY_TOPIC_SETTER notify:NotifyNow];
    // Apply the new topic to the message view
    AIContentTopic *contentTopic = [AIContentTopic topicInChat:self
    withSource:contact
    + sourceNick:nick
    destination:nil
    date:[NSDate date]
    message:[NSAttributedString stringWithString:[self valueForProperty:KEY_TOPIC] ?: @""]];
    @@ -250,15 +238,15 @@
    */
    - (void)resortParticipants
    {
    - [participatingContacts sortUsingComparator:^(id objectA, id objectB){
    - AIGroupChatFlags flagA = highestFlag([self flagsForContact:objectA]), flagB = highestFlag([self flagsForContact:objectB]);
    + [participatingNicks sortUsingComparator:^(id objectA, id objectB){
    + AIGroupChatFlags flagA = highestFlag([self flagsForNick:objectA]), flagB = highestFlag([self flagsForNick:objectB]);
    if(flagA > flagB) {
    return (NSComparisonResult)NSOrderedAscending;
    } else if (flagA < flagB) {
    return (NSComparisonResult)NSOrderedDescending;
    } else {
    - return [[self displayNameForContact:objectA] localizedCaseInsensitiveCompare:[self displayNameForContact:objectB]];
    + return [objectA localizedCaseInsensitiveCompare:objectB];
    }
    }];
    }
    @@ -266,46 +254,42 @@
    //Participating ListObjects --------------------------------------------------------------------------------------------
    #pragma mark Participating ListObjects
    -/*!
    - * @brief The display name for the contact in this chat.
    - *
    - * @param contact The AIListObject whose display name should be created
    - *
    - * If the user has an alias set, the alias is used, otherwise the display name.
    - *
    - * @returns Display name
    - */
    -- (NSString *)displayNameForContact:(AIListObject *)contact
    +- (AIListObject *)contactForNick:(NSString *)nick
    +{
    + return [participatingNicksContacts objectForKey:nick];
    +}
    +
    +- (AIGroupChatFlags)flagsForNick:(NSString *)nick
    {
    - return [self aliasForContact:contact] ?: contact.displayName;
    + return [[participatingNicksFlags objectForKey:nick] intValue];
    +}
    +
    +- (void)setFlags:(AIGroupChatFlags)flags forNick:(NSString *)nick
    +{
    + [participatingNicksFlags setObject:@(flags)
    + forKey:nick];
    }
    -/*!
    - * @brief The flags for a given contact.
    - */
    -- (AIGroupChatFlags)flagsForContact:(AIListObject *)contact
    +- (void)setContact:(AIListContact *)contact forNick:(NSString *)nick
    {
    - return [(NSNumber *)[participatingContactsFlags objectForKey:contact.UID] intValue];
    + NSParameterAssert(contact != nil);
    +
    + [participatingNicksContacts setObject:contact
    + forKey:nick];
    }
    -/*!
    - * @brief Set the flags for a contact
    - *
    - * Note that this doesn't set the bitwise or; this directly sets the value passed.
    - */
    -- (void)setFlags:(AIGroupChatFlags)flags forContact:(AIListObject *)contact
    +- (void)changeNick:(NSString *)from to:(NSString *)to
    {
    - [participatingContactsFlags setObject:[NSNumber numberWithInteger:flags]
    - forKey:contact.UID];
    -}
    -
    -/*!
    - * @brief Set the alias for a contact.
    - */
    -- (void)setAlias:(NSString *)alias forContact:(AIListObject *)contact
    -{
    - [participatingContactsAliases setObject:alias
    - forKey:contact.UID];
    + [participatingNicks removeObject:from];
    + [participatingNicks addObject:to];
    +
    + NSNumber *flags = [participatingNicksFlags objectForKey:from];
    + [participatingNicksFlags removeObjectForKey:from];
    + if (flags) [participatingNicksFlags setObject:flags forKey:to];
    +
    + AIListObject *contact = [participatingNicksContacts objectForKey:from];
    + [participatingNicksContacts removeObjectForKey:from];
    + if (contact) [participatingNicksContacts setObject:contact forKey:to];
    }
    /*!
    @@ -314,35 +298,41 @@
    * Removes any values which are dependent upon the contact, such as
    * its flags or alias.
    */
    -- (void)removeSavedValuesForContactUID:(NSString *)contactUID
    +- (void)removeSavedValuesForNick:(NSString *)nick
    {
    - [participatingContactsFlags removeObjectForKey:contactUID];
    - [participatingContactsAliases removeObjectForKey:contactUID];
    -}
    -
    -- (void)addParticipatingListObject:(AIListContact *)inObject notify:(BOOL)notify
    -{
    - [self addParticipatingListObjects:[NSArray arrayWithObject:inObject] notify:notify];
    + [participatingNicksFlags removeObjectForKey:nick];
    + [participatingNicksContacts removeObjectForKey:nick];
    }
    -- (void)addParticipatingListObjects:(NSArray *)inObjects notify:(BOOL)notify
    +- (NSArray *)nicksForContact:(AIListObject *)contact
    {
    - NSMutableArray *contacts = [inObjects mutableCopy];
    -
    - for (AIListObject *obj in inObjects) {
    - if ([self containsObject:obj] || ![self canContainObject:obj])
    - [contacts removeObject:obj];
    + NSMutableArray *nicks = [NSMutableArray array];
    +
    + for (NSString *nick in participatingNicks) {
    + if ([[participatingNicksContacts objectForKey:nick] isEqual:contact]) {
    + [nicks addObject:nick];
    + }
    }
    - [participatingContacts addObjectsFromArray:contacts];
    - [adium.chatController chat:self addedListContacts:contacts notify:notify];
    + return nicks;
    +}
    +
    +- (void)addParticipatingNick:(NSString *)inObject notify:(BOOL)notify
    +{
    + [self addParticipatingNicks:[NSArray arrayWithObject:inObject] notify:notify];
    }
    -- (BOOL)addObject:(AIListObject *)inObject
    +- (void)addParticipatingNicks:(NSArray *)inObjects notify:(BOOL)notify
    {
    - NSParameterAssert([inObject isKindOfClass:[AIListContact class]]);
    + [participatingNicks addObjectsFromArray:inObjects];
    + [adium.chatController chat:self addedListContacts:inObjects notify:notify];
    +}
    +
    +- (BOOL)addObject:(NSString *)inObject
    +{
    + NSParameterAssert([inObject isKindOfClass:[NSString class]]);
    - [self addParticipatingListObject:(AIListContact *)inObject notify:YES];
    + [self addParticipatingNick:inObject notify:YES];
    return YES;
    }
    @@ -352,84 +342,97 @@
    return ([self.account inviteContact:inContact toChat:self withMessage:inviteMessage]);
    }
    -#pragma mark AIContainingObject protocol
    +- (NSArray *)containedObjects
    +{
    + return [participatingNicksContacts allValues];
    +}
    +
    - (NSArray *)visibleContainedObjects
    {
    return self.containedObjects;
    }
    -- (NSArray *)containedObjects
    -{
    - return participatingContacts;
    -}
    +
    - (NSUInteger)countOfContainedObjects
    {
    - return [participatingContacts count];
    + return [participatingNicks count];
    }
    - (BOOL)containsObject:(AIListObject *)inObject
    {
    - return [participatingContacts containsObjectIdenticalTo:inObject];
    + return [[participatingNicksContacts allValues] containsObjectIdenticalTo:inObject];
    }
    -- (AIListContact *)visibleObjectAtIndex:(NSUInteger)idx
    +- (NSString *)visibleObjectAtIndex:(NSUInteger)idx
    {
    - return [participatingContacts objectAtIndex:idx];
    + return [participatingNicks objectAtIndex:idx];
    }
    - (NSUInteger)visibleIndexOfObject:(AIListObject *)obj
    {
    if(![[AIContactHidingController sharedController] visibilityOfListObject:obj inContainer:self])
    return NSNotFound;
    - return [participatingContacts indexOfObject:obj];
    + for (NSString *nick in participatingNicks) {
    + if ([[participatingNicksContacts objectForKey:nick] isEqual:obj]) {
    + return [participatingNicks indexOfObject:nick];
    + }
    + }
    +
    + return NSNotFound;
    }
    - (NSArray *)uniqueContainedObjects
    {
    - return self.containedObjects;
    + NSMutableArray *contacts = [NSMutableArray array];
    +
    + for (AIListContact *contact in [participatingNicksContacts allValues]) {
    + if (![contacts containsObject:contacts]) {
    + [contacts addObject:contact];
    + }
    + }
    +
    + return contacts;
    }
    -- (void)removeObject:(AIListObject *)inObject
    +- (void)removeObject:(NSString *)inObject
    {
    - if ([self containsObject:inObject]) {
    - AIListContact *contact = (AIListContact *)inObject; //if we contain it, it has to be an AIListContact
    -
    - [participatingContacts removeObject:inObject];
    + AIListContact *contact = [participatingNicksContacts valueForKey:inObject];
    +
    + [participatingNicks removeObject:inObject];
    +
    + [self removeSavedValuesForNick:inObject];
    +
    + [adium.chatController chat:self removedListContact:contact];
    +
    + if (contact.isStranger &&
    + ![adium.chatController allGroupChatsContainingContact:contact.parentContact].count &&
    + ![adium.chatController existingChatWithContact:contact.parentContact]) {
    - [self removeSavedValuesForContactUID:inObject.UID];
    -
    - [adium.chatController chat:self removedListContact:contact];
    -
    - if (contact.isStranger &&
    - ![adium.chatController allGroupChatsContainingContact:contact.parentContact].count &&
    - ![adium.chatController existingChatWithContact:contact.parentContact]) {
    -
    - [[AIContactObserverManager sharedManager] delayListObjectNotifications];
    - [adium.contactController accountDidStopTrackingContact:contact];
    - [[AIContactObserverManager sharedManager] endListObjectNotificationsDelaysImmediately];
    - }
    + [[AIContactObserverManager sharedManager] delayListObjectNotifications];
    + [adium.contactController accountDidStopTrackingContact:contact];
    + [[AIContactObserverManager sharedManager] endListObjectNotificationsDelaysImmediately];
    }
    }
    -- (void)removeObjectAfterAccountStopsTracking:(AIListObject *)object
    +- (void)removeObjectAfterAccountStopsTracking:(NSString *)object
    {
    - [self removeObject:object]; //does nothing if we've already removed it
    + [self removeObject:object];
    }
    - (void)removeAllParticipatingContactsSilently
    {
    /* Note that allGroupChatsContainingContact won't count this chat if it's already marked as not open */
    - for (AIListContact *listContact in self) {
    + for (AIListContact *listContact in [participatingNicksContacts allValues]) {
    if (listContact.isStranger &&
    ![adium.chatController existingChatWithContact:listContact.parentContact] &&
    ([adium.chatController allGroupChatsContainingContact:listContact.parentContact].count == 0)) {
    [adium.contactController accountDidStopTrackingContact:listContact];
    }
    }
    -
    - [participatingContacts removeAllObjects];
    - [participatingContactsFlags removeAllObjects];
    - [participatingContactsAliases removeAllObjects];
    -
    +
    + [participatingNicks removeAllObjects];
    + [participatingNicksFlags removeAllObjects];
    + [participatingNicksContacts removeAllObjects];
    +
    [[NSNotificationCenter defaultCenter] postNotificationName:Chat_ParticipatingListObjectsChanged
    object:self];
    }
    @@ -448,7 +451,7 @@
    - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(__unsafe_unretained id [])stackbuf count:(NSUInteger)len
    {
    - return [participatingContacts countByEnumeratingWithState:state objects:stackbuf count:len];
    + return [participatingNicks countByEnumeratingWithState:state objects:stackbuf count:len];
    }
    - (BOOL) canContainObject:(id)obj
    --- a/Frameworks/Adium Framework/Source/AIListContactGroupChatCell.m Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIListContactGroupChatCell.m Fri May 03 00:06:06 2013 +0200
    @@ -25,11 +25,10 @@
    - (NSString *)labelString
    {
    - AIListObject *listObject = [proxyObject listObject];
    NSString *label;
    - if (chat && [chat displayNameForContact:listObject]) {
    - label = [chat displayNameForContact:listObject];
    + if (proxyObject.nick) {
    + label = proxyObject.nick;
    } else {
    label = [super labelString];
    }
    @@ -39,23 +38,21 @@
    - (NSImage *)statusImage
    {
    - AIListObject *listObject = [proxyObject listObject];
    - return [[AIGroupChatStatusIcons sharedIcons] imageForFlag:[chat flagsForContact:listObject]];
    + return [[AIGroupChatStatusIcons sharedIcons] imageForFlag:[chat flagsForNick:proxyObject.nick]];
    }
    - (NSImage *)serviceImage
    {
    // We can't use [listObject statusIcon] because it will show unknown for strangers.
    - AIListObject *listObject = [proxyObject listObject];
    - return [AIStatusIcons statusIconForListObject:listObject
    + AIListContact *listObject = [chat contactForNick:proxyObject.nick];
    + return [AIStatusIcons statusIconForListObject:(AIListObject *)listObject
    type:AIStatusIconTab
    direction:AIIconFlipped];
    }
    - (NSColor *)textColor
    {
    - AIListObject *listObject = [proxyObject listObject];
    - return [[AIGroupChatStatusIcons sharedIcons] colorForFlag:[chat flagsForContact:listObject]];
    + return [[AIGroupChatStatusIcons sharedIcons] colorForFlag:[chat flagsForNick:proxyObject.nick]];
    }
    - (float)imageOpacityForDrawing
    --- a/Frameworks/Adium Framework/Source/AIProxyListObject.h Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIProxyListObject.h Fri May 03 00:06:06 2013 +0200
    @@ -25,6 +25,7 @@
    NSAttributedString *cachedDisplayName;
    NSDictionary *cachedLabelAttributes;
    NSSize cachedDisplayNameSize;
    + NSString *nick;
    }
    @property (nonatomic, copy) NSDictionary *cachedLabelAttributes;
    @property (nonatomic, strong) NSString *cachedDisplayNameString;
    @@ -32,6 +33,7 @@
    @property (nonatomic) NSSize cachedDisplayNameSize;
    @property (nonatomic, strong) NSString *key;
    +@property (nonatomic, strong) NSString *nick;
    @property (nonatomic, weak) AIListObject *listObject;
    @property (nonatomic, weak) ESObjectWithProperties <AIContainingObject> * containingObject;
    @@ -42,6 +44,10 @@
    + (AIProxyListObject *)existingProxyListObjectForListObject:(ESObjectWithProperties *)inListObject
    inListObject:(ESObjectWithProperties <AIContainingObject>*)inContainingObject;
    ++ (AIProxyListObject *)proxyListObjectForListObject:(AIListObject *)inListObject
    + inListObject:(ESObjectWithProperties <AIContainingObject>*)inContainingObject
    + withNick:(NSString *)inNick;
    +
    /*!
    * @brief Called when an AIListObject is done with an AIProxyListObject to remove it from the global dictionary
    */
    --- a/Frameworks/Adium Framework/Source/AIProxyListObject.m Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/AIProxyListObject.m Fri May 03 00:06:06 2013 +0200
    @@ -25,7 +25,7 @@
    @implementation AIProxyListObject
    @synthesize key, cachedDisplayName, cachedDisplayNameString, cachedLabelAttributes, cachedDisplayNameSize;
    -@synthesize listObject, containingObject;
    +@synthesize listObject, containingObject, nick;
    static inline NSMutableDictionary *_getProxyDict() {
    @@ -52,10 +52,21 @@
    + (AIProxyListObject *)proxyListObjectForListObject:(AIListObject *)inListObject
    inListObject:(ESObjectWithProperties <AIContainingObject>*)inContainingObject
    {
    + return [self proxyListObjectForListObject:inListObject inListObject:inContainingObject withNick:nil];
    +}
    +
    ++ (AIProxyListObject *)proxyListObjectForListObject:(AIListObject *)inListObject
    + inListObject:(ESObjectWithProperties <AIContainingObject>*)inContainingObject
    + withNick:(NSString *)inNick
    +{
    AIProxyListObject *proxy;
    NSString *key = (inContainingObject ?
    [NSString stringWithFormat:@"%@-%@", inListObject.internalObjectID, inContainingObject.internalObjectID] :
    inListObject.internalObjectID);
    +
    + if (inNick) {
    + key = [key stringByAppendingFormat:@"-%@", inNick];
    + }
    proxy = [proxyDict objectForKey:key];
    @@ -73,6 +84,7 @@
    proxy.listObject = inListObject;
    proxy.containingObject = inContainingObject;
    proxy.key = key;
    + proxy.nick = inNick;
    [inListObject noteProxyObject:proxy];
    [proxyDict setObject:proxy
    forKey:key];
    --- a/Frameworks/Adium Framework/Source/ESFileTransfer.m Fri Apr 26 18:36:46 2013 +0200
    +++ b/Frameworks/Adium Framework/Source/ESFileTransfer.m Fri May 03 00:06:06 2013 +0200
    @@ -70,6 +70,7 @@
    }
    if ((self = [super initWithChat:aChat
    source:s
    + sourceNick:nil
    destination:d
    date:[NSDate date]
    message:[[NSAttributedString alloc] initWithString:@""]
    --- a/Frameworks/PSMTabBarControl.framework/Versions/A/Headers/NSBezierPath_AMShading.h Fri Apr 26 18:36:46 2013 +0200
    +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
    @@ -1,23 +0,0 @@
    -//
    -// NSBezierPath_AMShading.h
    -// ------------------------
    -//
    -// Created by Andreas on 2005-06-01.
    -// Copyright 2005 Andreas Mayer. All rights reserved.
    -//
    -// based on http://www.cocoadev.com/index.pl?GradientFill
    -
    -
    -#import <Cocoa/Cocoa.h>
    -
    -@interface NSBezierPath (AMShading)
    -
    -- (void)customHorizontalFillWithCallbacks:(CGFunctionCallbacks) functionCallbacks firstColor:(NSColor *)firstColor secondColor:(NSColor *)secondColor;
    -- (void)customVerticalFillWithCallbacks:(CGFunctionCallbacks) functionCallbacks firstColor:(NSColor *)firstColor secondColor:(NSColor *)secondColor;
    -