--- a/Adium.xcodeproj/project.pbxproj Tue Jul 23 22:33:23 2013 +0200
+++ b/Adium.xcodeproj/project.pbxproj Mon Sep 09 22:33:40 2013 +0200
@@ -1377,8 +1377,6 @@
76AA110C1635585E00A6EC4B /* AIAccountSelectionTopBar.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76AA11091635585E00A6EC4B /* AIAccountSelectionTopBar.xib */; };
76AA110D1635585E00A6EC4B /* AIAccountSelectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 76AA110B1635585E00A6EC4B /* AIAccountSelectionViewController.m */; };
76AA1110163558B200A6EC4B /* AIRejoinGroupChatViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 76AA110F163558B200A6EC4B /* AIRejoinGroupChatViewController.m */; };
- 76B8B8EC16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.m in Sources */ = {isa = PBXBuildFile; fileRef = 76B8B8EA16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.m */; };
- 76B8B8ED16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76B8B8EB16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.xib */; };
76C1AF9C125A906A00D269A9 /* AIAdiumURLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 76C1AF9B125A906A00D269A9 /* AIAdiumURLProtocol.m */; };
76FBDAC91733B9CA00C9F10B /* STTwitterHTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 76FBDAC61733B9C900C9F10B /* STTwitterHTML.m */; };
76FF925A14B524B40043E23B /* AIIRCConsoleController.h in Headers */ = {isa = PBXBuildFile; fileRef = 76FF925814B524B40043E23B /* AIIRCConsoleController.h */; };
@@ -4463,9 +4461,6 @@
76AA110B1635585E00A6EC4B /* AIAccountSelectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIAccountSelectionViewController.m; path = "Plugins/Dual Window Interface/AIAccountSelectionViewController.m"; sourceTree = "<group>"; };
76AA110E163558B200A6EC4B /* AIRejoinGroupChatViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIRejoinGroupChatViewController.h; path = "Plugins/Dual Window Interface/AIRejoinGroupChatViewController.h"; sourceTree = "<group>"; };
76AA110F163558B200A6EC4B /* AIRejoinGroupChatViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIRejoinGroupChatViewController.m; path = "Plugins/Dual Window Interface/AIRejoinGroupChatViewController.m"; sourceTree = "<group>"; };
- 76B8B8E916AF3A46009126FE /* AIOTRTopBarLoggingWarningController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIOTRTopBarLoggingWarningController.h; path = Source/AIOTRTopBarLoggingWarningController.h; sourceTree = "<group>"; };
- 76B8B8EA16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIOTRTopBarLoggingWarningController.m; path = Source/AIOTRTopBarLoggingWarningController.m; sourceTree = "<group>"; };
- 76B8B8EB16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = AIOTRTopBarLoggingWarningController.xib; path = Resources/AIOTRTopBarLoggingWarningController.xib; sourceTree = "<group>"; };
76C1AF9A125A906A00D269A9 /* AIAdiumURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIAdiumURLProtocol.h; path = "Plugins/WebKit Message View/AIAdiumURLProtocol.h"; sourceTree = "<group>"; };
76C1AF9B125A906A00D269A9 /* AIAdiumURLProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIAdiumURLProtocol.m; path = "Plugins/WebKit Message View/AIAdiumURLProtocol.m"; sourceTree = "<group>"; };
76FBDAC51733B9C900C9F10B /* STTwitterHTML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = STTwitterHTML.h; path = "Plugins/Twitter Plugin/STTwitter/STTwitterHTML.h"; sourceTree = "<group>"; };
@@ -5251,9 +5246,6 @@
765F5D72162F48FA00C57904 /* AIOTRSMPSharedSecretWindowController.h */,
765F5D73162F48FB00C57904 /* AIOTRSMPSharedSecretWindowController.m */,
765F5D70162F483F00C57904 /* AIOTRSMPSharedSecretWindowController.xib */,
- 76B8B8E916AF3A46009126FE /* AIOTRTopBarLoggingWarningController.h */,
- 76B8B8EA16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.m */,
- 76B8B8EB16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.xib */,
76674645178D8A8F00F65048 /* AIOTRTopBarUnverifiedContactController.h */,
76674646178D8A9000F65048 /* AIOTRTopBarUnverifiedContactController.m */,
7667464B178D8B2700F65048 /* AIOTRTopBarUnverifiedContactController.xib */,
@@ -10012,7 +10004,6 @@
C613B1111640C370006683FF /* pref-profile.tiff in Resources */,
C613B143164112B3006683FF /* events-dock-name.tiff in Resources */,
C613B1451641210B006683FF /* events-contact.tiff in Resources */,
- 76B8B8ED16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.xib in Resources */,
5A0BBC4317400544002A7BE0 /* emoticons_menu@2x.png in Resources */,
7667464C178D8B2700F65048 /* AIOTRTopBarUnverifiedContactController.xib in Resources */,
@@ -10664,7 +10655,6 @@
761D58831636EDE100210B12 /* AINewMessageTextFieldCell.m in Sources */,
761D58861636F94300210B12 /* AINewMessageSearchField.m in Sources */,
5A44595E169143130078AB0A /* AIPreferenceCVPrototypeView.m in Sources */,
- 76B8B8EC16AF3A46009126FE /* AIOTRTopBarLoggingWarningController.m in Sources */,
5A3B4D7916D878AC00903E40 /* NSString+STTwitter.m in Sources */,
5A3B4D7A16D878AC00903E40 /* STTwitterAPIWrapper.m in Sources */,
5A3B4D7C16D878AC00903E40 /* STTwitterOAuth.m in Sources */,
--- a/Frameworks/Adium Framework/Source/AIChat.h Tue Jul 23 22:33:23 2013 +0200
+++ b/Frameworks/Adium Framework/Source/AIChat.h Mon Sep 09 22:33:40 2013 +0200
@@ -132,6 +132,8 @@
NSDictionary *securityDetails;
AIListContact *_listObject;
+ NSNumber *overrideLogging; + (id)chatForAccount:(AIAccount *)inAccount;
@@ -195,6 +197,8 @@
@property (readwrite, nonatomic) BOOL hideUserIconAndStatus;
+@property (readwrite, nonatomic, retain) NSNumber *overrideLogging; // Compatibility. I don't like this here.
- (NSArray *)containedObjects;
--- a/Source/AILoggerPlugin.h Tue Jul 23 22:33:23 2013 +0200
+++ b/Source/AILoggerPlugin.h Mon Sep 09 22:33:40 2013 +0200
@@ -58,6 +58,9 @@
+ // Chat window toolbar item + NSMutableSet *toolbarItems; @property(assign,readonly) BOOL indexIsFlushing;
@property(assign,readonly) BOOL isIndexing;
--- a/Source/AILoggerPlugin.m Tue Jul 23 22:33:23 2013 +0200
+++ b/Source/AILoggerPlugin.m Mon Sep 09 22:33:40 2013 +0200
@@ -74,6 +74,8 @@
#define LOG_VIEWER_IDENTIFIER @"LogViewer"
+#define LOGGING_OVERRIDE_ITEM @"LoggingOverride" #define ENABLE_PROXIMITY_SEARCH TRUE
@@ -138,6 +140,10 @@
- (void)_flushIndex:(SKIndexRef)inIndex;
+- (IBAction)toggleLogging:(NSToolbarItem *)sender; +- (void)updateToolbarItem:(NSToolbarItem *)item forChat:(AIChat *)chat; @property(retain,readwrite) NSMutableDictionary *activeAppenders;
@property(retain,readwrite) AIHTMLDecoder *xhtmlDecoder;
@@ -218,6 +224,8 @@
logAppendingGroup = dispatch_group_create();
loggerPluginGroup = dispatch_group_create();
+ toolbarItems = [[NSMutableSet alloc] init]; ioQueue = dispatch_queue_create("im.adium.AILoggerPlugin.ioQueue", 0);
NSUInteger cpuCount = [[NSProcessInfo processInfo] activeProcessorCount];
@@ -304,6 +312,26 @@
selector:@selector(showLogViewerAndReindex:)
name:AIShowLogViewerAndReindexNotification
+ toolbarItem = [AIToolbarUtilities toolbarItemWithIdentifier:LOGGING_OVERRIDE_ITEM + label:AILocalizedString(@"Toggle Logging",nil) + paletteLabel:AILocalizedString(@"Toggle Logging",nil) + toolTip:AILocalizedString(@"Turn logging on or off for this conversation.",nil) + settingSelector:@selector(setImage:) + itemContent:[NSImage imageNamed:@"Authorize" forClass:NSClassFromString(@"AIAuthorizationRequestsWindowController")] + action:@selector(toggleLogging:) + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(toolbarWillAddItem:) + name:NSToolbarWillAddItemNotification + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(toolbarDidRemoveItem:) + name:NSToolbarDidRemoveItemNotification + [adium.toolbarController registerToolbarItem:toolbarItem forToolbarType:@"TextEntry"]; @@ -1722,4 +1750,80 @@
+#pragma mark Toolbar item +- (void)updateToolbarItem:(NSToolbarItem *)item forChat:(AIChat *)chat + if ([chat shouldLog]) { + [item setImage:[NSImage imageNamed:@"Authorize" forClass:NSClassFromString(@"AIAuthorizationRequestsWindowController")]]; + [item setLabel:AILocalizedString(@"Turn Logging Off", nil)]; + [item setImage:[NSImage imageNamed:@"Deny" forClass:NSClassFromString(@"AIAuthorizationRequestsWindowController")]]; + [item setLabel:AILocalizedString(@"Turn Logging On", nil)]; +- (IBAction)toggleLogging:(NSToolbarItem *)sender + AIListObject *object = adium.interfaceController.selectedListObject; + if ([object isKindOfClass:[AIListContact class]]) { + AIChat *chat = [adium.chatController openChatWithContact:(AIListContact *)object + onPreferredAccount:YES]; + chat.overrideLogging = @(![chat shouldLog]); + AILogWithSignature(@"Logging for this conversation is now %@", chat.overrideLogging); + [self updateToolbarItem:sender forChat:chat]; +- (void)chatDidBecomeVisible:(NSNotification *)notification + AIChat *chat = [notification object]; + NSWindow *window = [[notification userInfo] objectForKey:@"NSWindow"]; + for (NSToolbarItem *item in window.toolbar.items) { + if ([[item itemIdentifier] isEqualToString:LOGGING_OVERRIDE_ITEM]) { + [self updateToolbarItem:item forChat:chat]; +- (void)toolbarDidRemoveItem:(NSNotification *)notification + NSToolbarItem *item = [[notification userInfo] objectForKey:@"item"]; + if ([toolbarItems containsObject:item]) { + [toolbarItems removeObject:item]; + if ([toolbarItems count] == 0) { + [[NSNotificationCenter defaultCenter] removeObserver:self + name:@"AIChatDidBecomeVisible" +- (void)toolbarWillAddItem:(NSNotification *)notification + NSToolbarItem *item = [[notification userInfo] objectForKey:@"item"]; + if ([[item itemIdentifier] isEqualToString:LOGGING_OVERRIDE_ITEM]) { + //If this is the first item added, start observing for chats becoming visible so we can update the icon + if ([toolbarItems count] == 0) { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(chatDidBecomeVisible:) + name:@"AIChatDidBecomeVisible" + [toolbarItems addObject:item]; --- a/Source/AdiumOTREncryption.m Tue Jul 23 22:33:23 2013 +0200
+++ b/Source/AdiumOTREncryption.m Mon Sep 09 22:33:40 2013 +0200
@@ -37,7 +37,6 @@
#import "AIOTRSMPSecretAnswerWindowController.h"
#import "AIOTRSMPSharedSecretWindowController.h"
-#import "AIOTRTopBarLoggingWarningController.h"
#import "AIOTRTopBarUnverifiedContactController.h"
#import "AIMessageViewController.h"
@@ -1072,19 +1071,10 @@
fullSecurityDetailsDict = nil;
- NSInteger oldEncryptionStatus = [[[inChat securityDetails] objectForKey:@"EncryptionStatus"] integerValue];
[inChat setSecurityDetails:fullSecurityDetailsDict];
NSInteger newEncryptionStatus = [[securityDetailsDict objectForKey:@"EncryptionStatus"] integerValue];
- if (newEncryptionStatus != EncryptionStatus_None && oldEncryptionStatus == EncryptionStatus_None && inChat.shouldLog) {
- AIOTRTopBarLoggingWarningController *warningController = [[AIOTRTopBarLoggingWarningController alloc] init];
- AIMessageViewController *mvc = [[inChat chatContainer] messageViewController];
- [mvc addTopBarController:warningController];
if (newEncryptionStatus == EncryptionStatus_Unverified) {
AIOTRTopBarUnverifiedContactController *warningController = [[AIOTRTopBarUnverifiedContactController alloc] init];
AIMessageViewController *mvc = [[inChat chatContainer] messageViewController];