* Adium is the legal property of its developers, whose names are listed in the copyright file included * with this source distribution. * This program is free software; you can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation; either version 2 of the License, * or (at your option) any later version. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * You should have received a copy of the GNU General Public License along with this program; if not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #import "AIDockAccountStatusPlugin.h" #import <Adium/AIAccountControllerProtocol.h> #import <Adium/AIContactControllerProtocol.h> #import <Adium/AIDockControllerProtocol.h> #import <Adium/AIStatusControllerProtocol.h> #import <Adium/AIAccount.h> #import <Adium/AIListObject.h> #import <Adium/AIStatus.h> @interface AIDockAccountStatusPlugin () - (BOOL)_accountsWithBoolProperty:(NSString *)inKey; - (BOOL)_accountsWithProperty:(NSString *)inKey; * @class AIDockAccountStatusPlugin * @brief Maintain the dock icon state in relation to global account status * This class manages the dock icon state via the dockController. It specifies the icon which should be shown based * on an aggregated, global account status. @implementation AIDockAccountStatusPlugin //Observe account status changes [[AIContactObserverManager sharedManager] registerListObjectObserver:self]; //Observer preference changes [adium.preferenceController registerPreferenceObserver:self forGroup:PREF_GROUP_GENERAL]; * @brief Uninstall plugin [[AIContactObserverManager sharedManager] unregisterListObjectObserver:self]; [adium.preferenceController unregisterPreferenceObserver:self]; [[NSNotificationCenter defaultCenter] removeObserver:self]; * @brief Handle preference changes * When the active dock icon changes, call updateListObject:keys:silent: to update its state to the global account state - (void)preferencesChangedForGroup:(NSString *)group key:(NSString *)key object:(AIListObject *)object preferenceDict:(NSDictionary *)prefDict firstTime:(BOOL)firstTime if (!key || [key isEqualToString:KEY_ACTIVE_DOCK_ICON]) { [self updateListObject:nil keys:nil silent:NO]; * @brief Update the dock icon state in response to an account changing status * If one or more accounts are online, set the Online icon state. Similarly, handle the Connecting, Away, and Idle - (NSSet *)updateListObject:(AIListObject *)inObject keys:(NSSet *)inModifiedKeys silent:(BOOL)silent if (inObject == nil || [inObject isKindOfClass:[AIAccount class]]) { id<AIDockController> dockController = adium.dockController; BOOL shouldUpdateStatus = NO; if (inObject == nil || [inModifiedKeys containsObject:@"isOnline"]) { if ([self _accountsWithBoolProperty:@"isOnline"]) { [dockController setIconStateNamed:@"Online"]; [dockController removeIconStateNamed:@"Online"]; shouldUpdateStatus = YES; if (inObject == nil || ([inModifiedKeys containsObject:@"isConnecting"] || [inModifiedKeys containsObject:@"waitingToReconnect"])) { if ([self _accountsWithBoolProperty:@"isConnecting"] || [self _accountsWithProperty:@"waitingToReconnect"]) { [dockController setIconStateNamed:@"Connecting"]; [dockController removeIconStateNamed:@"Connecting"]; shouldUpdateStatus = YES; if (inObject == nil || [inModifiedKeys containsObject:@"idleSince"]) { if ([self _accountsWithProperty:@"idleSince"]) { [dockController setIconStateNamed:@"Idle"]; [dockController removeIconStateNamed:@"Idle"]; if (shouldUpdateStatus || [inModifiedKeys containsObject:@"accountStatus"]) { BOOL iconSupportsInvisible = [adium.dockController currentIconSupportsIconStateNamed:@"Invisible"]; AIStatusType activeStatusType = [adium.statusController activeStatusTypeTreatingInvisibleAsAway:!iconSupportsInvisible]; if (activeStatusType == AIAwayStatusType) { [dockController setIconStateNamed:@"Away"]; [dockController removeIconStateNamed:@"Away"]; if (activeStatusType == AIInvisibleStatusType) { [dockController setIconStateNamed:@"Invisible"]; [dockController removeIconStateNamed:@"Invisible"]; * @brief Return if any accounts have a TRUE value for the specified property * @param inKey The property for which to search * @result YES if any account returns TRUE for the boolean property for inKey - (BOOL)_accountsWithBoolProperty:(NSString *)inKey for (AIAccount *account in adium.accountController.accounts) { if ([account boolValueForProperty:inKey] && account.enabled) return YES; * @brief Return if any accounts have a non-nil value for the specified property * @param inKey The property for which to search * @result YES if any account returns a non-nil value for the property for inKey - (BOOL)_accountsWithProperty:(NSString *)inKey for (AIAccount *account in adium.accountController.accounts) { if ([account valueForProperty:inKey] && account.enabled) return YES;