* 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 <Adium/AIContactControllerProtocol.h> #import <Adium/AIMenuControllerProtocol.h> #import "AIContactVisibilityControlPlugin.h" #import <Adium/AIAccountControllerProtocol.h> #import <AIUtilities/AIDictionaryAdditions.h> #import <AIUtilities/AIMenuAdditions.h> #import <AIUtilities/AIImageAdditions.h> #import <AIUtilities/AIDictionaryAdditions.h> #import <AIUtilities/AIMenuAdditions.h> #import <Adium/AIListGroup.h> #import <Adium/AIListObject.h> #import <Adium/AIMetaContact.h> #import "AIContactController.h" #define HIDE_CONTACTS_MENU_TITLE AILocalizedString(@"Hide Certain Contacts",nil) #define HIDE_OFFLINE_MENU_TITLE AILocalizedString(@"Hide Offline Contacts",nil) #define HIDE_IDLE_MENU_TITLE AILocalizedString(@"Hide Idle Contacts",nil) #define HIDE_MOBILE_MENU_TITLE AILocalizedString(@"Hide Mobile Contacts",nil) #define HIDE_BLOCKED_MENU_TITLE AILocalizedString(@"Hide Blocked Contacts",nil) #define HIDE_ACCOUNT_CONTACT_MENU_TITLE AILocalizedString(@"Hide Contacts for Accounts",nil) #define HIDE_AWAY_MENU_TITLE AILocalizedString(@"Hide Away Contacts",nil) #define USE_OFFLINE_GROUP_MENU_TITLE AILocalizedString(@"Use Offline Group",nil) @interface AIContactVisibilityControlPlugin() - (void)updateAccountMenu; - (IBAction)toggleHide:(id)sender; * @class AIContactVisibilityControlPlugin * @brief Component to handle showing or hiding offline contacts and hiding empty groups. * Only manages menu items and preferences. The actaual hiding is done by their containing objects. @implementation AIContactVisibilityControlPlugin [adium.preferenceController registerDefaults:[NSDictionary dictionaryNamed:@"OfflineContactHidingDefaults" forClass:[self class]] forGroup:PREF_GROUP_CONTACT_LIST_DISPLAY]; menu_hideAccounts = [[NSMenu alloc] init]; [menu_hideAccounts setDelegate:self]; array_hideAccounts = [[NSMutableArray alloc] init]; accountMenu = [[AIAccountMenu accountMenuWithDelegate:self submenuType:AIAccountNoSubmenu showTitleVerbs:NO] retain]; //"Hide Contacts" menu item menuItem_hideContacts = [[NSMenuItem alloc] initWithTitle:HIDE_CONTACTS_MENU_TITLE action:@selector(toggleHide:) [adium.menuController addMenuItem:menuItem_hideContacts toLocation:LOC_View_Toggles]; //Hide Contacts for Account menuItem_hideAccountContact = [[NSMenuItem alloc] initWithTitle:HIDE_ACCOUNT_CONTACT_MENU_TITLE action:@selector(toggleHide:) [menuItem_hideAccountContact setIndentationLevel:1]; [menuItem_hideAccountContact setSubmenu:menu_hideAccounts]; [adium.menuController addMenuItem:menuItem_hideAccountContact toLocation:LOC_View_Toggles]; menuItem_hideOffline = [[NSMenuItem alloc] initWithTitle:HIDE_OFFLINE_MENU_TITLE action:@selector(toggleHide:) [menuItem_hideOffline setIndentationLevel:1]; [adium.menuController addMenuItem:menuItem_hideOffline toLocation:LOC_View_Toggles]; menuItem_hideIdle = [[NSMenuItem alloc] initWithTitle:HIDE_IDLE_MENU_TITLE action:@selector(toggleHide:) [menuItem_hideIdle setIndentationLevel:1]; [adium.menuController addMenuItem:menuItem_hideIdle toLocation:LOC_View_Toggles]; menuItem_hideAway = [[NSMenuItem alloc] initWithTitle:HIDE_AWAY_MENU_TITLE action:@selector(toggleHide:) [menuItem_hideAway setIndentationLevel:1]; [adium.menuController addMenuItem:menuItem_hideAway toLocation:LOC_View_Toggles]; menuItem_hideMobile = [[NSMenuItem alloc] initWithTitle:HIDE_MOBILE_MENU_TITLE action:@selector(toggleHide:) [menuItem_hideMobile setIndentationLevel:1]; [adium.menuController addMenuItem:menuItem_hideMobile toLocation:LOC_View_Toggles]; menuItem_hideBlocked = [[NSMenuItem alloc] initWithTitle:HIDE_BLOCKED_MENU_TITLE action:@selector(toggleHide:) [menuItem_hideBlocked setIndentationLevel:1]; [adium.menuController addMenuItem:menuItem_hideBlocked toLocation:LOC_View_Toggles]; menuItem_useOfflineGroup = [[NSMenuItem alloc] initWithTitle:USE_OFFLINE_GROUP_MENU_TITLE action:@selector(toggleHide:) [adium.menuController addMenuItem:menuItem_useOfflineGroup toLocation:LOC_View_Toggles]; //Register preference observer first so values will be correct for the following calls [adium.preferenceController registerPreferenceObserver:self forGroup:PREF_GROUP_CONTACT_LIST_DISPLAY]; [adium.preferenceController unregisterPreferenceObserver:self]; [menu_hideAccounts release]; menu_hideAccounts = nil; [array_hideAccounts release]; array_hideAccounts = nil; [accountMenu release]; accountMenu = nil; [menuItem_hideOffline release]; menuItem_hideOffline = nil; [menuItem_hideIdle release]; menuItem_hideIdle = nil; [menuItem_useOfflineGroup release]; menuItem_useOfflineGroup = nil; [menuItem_hideBlocked release]; menuItem_hideBlocked = nil; [menuItem_hideAccountContact release]; menuItem_hideAccountContact = nil; [menuItem_hideAway release]; menuItem_hideAway = nil; [[NSNotificationCenter defaultCenter] removeObserver:self]; * @brief Preferences changed - (void)preferencesChangedForGroup:(NSString *)group key:(NSString *)key object:(AIListObject *)object preferenceDict:(NSDictionary *)prefDict firstTime:(BOOL)firstTime hideContacts = [[prefDict objectForKey:KEY_HIDE_CONTACTS] boolValue]; showOfflineContacts = [[prefDict objectForKey:KEY_SHOW_OFFLINE_CONTACTS] boolValue]; showIdleContacts = [[prefDict objectForKey:KEY_SHOW_IDLE_CONTACTS] boolValue]; showMobileContacts = [[prefDict objectForKey:KEY_SHOW_MOBILE_CONTACTS] boolValue]; showBlockedContacts = [[prefDict objectForKey:KEY_SHOW_BLOCKED_CONTACTS] boolValue]; showAwayContacts = [[prefDict objectForKey:KEY_SHOW_AWAY_CONTACTS] boolValue]; [array_hideAccounts removeAllObjects]; [array_hideAccounts addObjectsFromArray:[prefDict objectForKey:KEY_HIDE_ACCOUNT_CONTACTS]]; [self updateAccountMenu]; useContactListGroups = ![[prefDict objectForKey:KEY_HIDE_CONTACT_LIST_GROUPS] boolValue]; useOfflineGroup = (useContactListGroups && [[prefDict objectForKey:KEY_USE_OFFLINE_GROUP] boolValue]); //Update our menu to reflect the current preferences [menuItem_hideAccountContact setState:(array_hideAccounts.count ? NSMixedState : NSOffState)]; [menuItem_hideContacts setState:hideContacts]; [menuItem_hideOffline setState:!showOfflineContacts]; [menuItem_hideIdle setState:!showIdleContacts]; [menuItem_hideAway setState:!showAwayContacts]; [menuItem_hideMobile setState:!showMobileContacts]; [menuItem_hideBlocked setState:!showBlockedContacts]; [menuItem_useOfflineGroup setState:useOfflineGroup]; * @brief Toggle contact/group hiding - (IBAction)toggleHide:(id)sender if (sender == menuItem_hideContacts) { [adium.preferenceController setPreference:[NSNumber numberWithBool:!hideContacts] group:PREF_GROUP_CONTACT_LIST_DISPLAY]; } else if (sender == menuItem_hideOffline) { [adium.preferenceController setPreference:[NSNumber numberWithBool:!showOfflineContacts] forKey:KEY_SHOW_OFFLINE_CONTACTS group:PREF_GROUP_CONTACT_LIST_DISPLAY]; } else if (sender == menuItem_hideIdle) { [adium.preferenceController setPreference:[NSNumber numberWithBool:!showIdleContacts] forKey:KEY_SHOW_IDLE_CONTACTS group:PREF_GROUP_CONTACT_LIST_DISPLAY]; } else if (sender == menuItem_hideMobile) { [adium.preferenceController setPreference:[NSNumber numberWithBool:!showMobileContacts] forKey:KEY_SHOW_MOBILE_CONTACTS group:PREF_GROUP_CONTACT_LIST_DISPLAY]; } else if (sender == menuItem_hideBlocked) { [adium.preferenceController setPreference:[NSNumber numberWithBool:!showBlockedContacts] forKey:KEY_SHOW_BLOCKED_CONTACTS group:PREF_GROUP_CONTACT_LIST_DISPLAY]; } else if (sender == menuItem_hideAway) { [adium.preferenceController setPreference:[NSNumber numberWithBool:!showAwayContacts] forKey:KEY_SHOW_AWAY_CONTACTS group:PREF_GROUP_CONTACT_LIST_DISPLAY]; } else if (sender == menuItem_useOfflineGroup) { [adium.preferenceController setPreference:[NSNumber numberWithBool:!useOfflineGroup] forKey:KEY_USE_OFFLINE_GROUP group:PREF_GROUP_CONTACT_LIST_DISPLAY]; #pragma mark Menu Methods * @brief Update our account menu - (void)accountMenu:(AIAccountMenu *)inAccountMenu didRebuildMenuItems:(NSArray *)menuItems [menu_hideAccounts removeAllItems]; // Add all the accounts as menu items. for(NSMenuItem *menuItem in menuItems) { [menu_hideAccounts addItem:[[menuItem copy] autorelease]]; // Remove any dead accounts from the array. BOOL removedAnyAccounts = NO; for (NSString *internalID in [[array_hideAccounts copy] autorelease]) { if(![adium.accountController accountWithInternalObjectID:internalID]) { [array_hideAccounts removeObject:internalID]; removedAnyAccounts = YES; [adium.preferenceController setPreference:[[array_hideAccounts copy] autorelease] forKey:KEY_HIDE_ACCOUNT_CONTACTS group:PREF_GROUP_CONTACT_LIST_DISPLAY]; [self updateAccountMenu]; * @brief Toggle an account. - (void)accountMenu:(AIAccountMenu *)inAccountMenu didSelectAccount:(AIAccount *)inAccount NSString *accountID = [[inAccount.internalObjectID copy] autorelease]; if ([array_hideAccounts containsObject:accountID]) { [array_hideAccounts removeObject:accountID]; [array_hideAccounts addObject:accountID]; [adium.preferenceController setPreference:[[array_hideAccounts copy] autorelease] forKey:KEY_HIDE_ACCOUNT_CONTACTS group:PREF_GROUP_CONTACT_LIST_DISPLAY]; * @brief Include all accounts. - (BOOL)accountMenu:(AIAccountMenu *)inAccountMenu shouldIncludeAccount:(AIAccount *)inAccount * @brief Update our account menu for current state information. - (void)updateAccountMenu for(NSMenuItem *menuItem in menu_hideAccounts.itemArray) { NSUInteger itemState = NSOffState; if([array_hideAccounts containsObject:((AIAccount *)menuItem.representedObject).internalObjectID]) { [menuItem setState:itemState]; - (BOOL)validateMenuItem:(NSMenuItem *)menuItem if (menuItem == menuItem_useOfflineGroup) { // Can only change the offline group preference if groups are enabled. return useContactListGroups; } else if (menuItem == menuItem_hideOffline || menuItem == menuItem_hideIdle || menuItem == menuItem_hideMobile || menuItem == menuItem_hideBlocked || menuItem == menuItem_hideAway || menuItem == menuItem_hideAccountContact) {