Adium

Changeset 14701

Show
Ignore:
Timestamp:
01/01/2006 08:06:36 PM (3 years ago)
Author:
evands
Message:

Added a "Show Offline Group" item to the View menu which, if enabled, groups all offline contacts into an Offline group.

Closes #2366

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Source/AIContactController.h

    r13820 r14701  
    7575@end 
    7676 
    77 @interface AIContactController : AIObject <AIController> { 
     77@interface AIContactController : AIObject <AIController, AIListObjectObserver> { 
    7878        //Contacts and metaContacts 
    7979        NSMutableDictionary             *contactDict; 
     
    8484    AIListGroup                         *contactList; 
    8585        NSMutableDictionary             *groupDict; 
    86     AIListGroup                         *strangerGroup; 
    8786        BOOL                                    useContactListGroups; 
    88         NSMenuItem                              *showGroupsMenuItem; 
     87        NSMenuItem                              *menuItem_showGroups; 
     88        BOOL                                    useOfflineGroup; 
     89        NSMenuItem                              *menuItem_useOfflineGroup; 
    8990         
    9091        //Status and Attribute updates 
     
    125126- (NSMenu *)menuOfAllGroupsInGroup:(AIListGroup *)inGroup withTarget:(id)target; 
    126127- (NSSet *)allContactsWithService:(AIService *)service UID:(NSString *)inUID existingOnly:(BOOL)existingOnly; 
     128- (AIListGroup *)offlineGroup; 
    127129 
    128130- (AIMetaContact *)groupUIDs:(NSArray *)UIDsArray forServices:(NSArray *)servicesArray; 
  • trunk/Source/AIContactController.m

    r14428 r14701  
    7777 
    7878#define KEY_HIDE_CONTACT_LIST_GROUPS    @"Hide Contact List Groups" 
     79#define KEY_USE_OFFLINE_GROUP                   @"Use Offline Group" 
     80#define KEY_SHOW_OFFLINE_CONTACTS               @"Show Offline Contacts" 
     81 
    7982#define PREF_GROUP_CONTACT_LIST_DISPLAY @"Contact List Display" 
    8083 
     
    121124 
    122125- (void)_addMenuItemsFromArray:(NSArray *)contactArray toMenu:(NSMenu *)contactMenu target:(id)target offlineContacts:(BOOL)offlineContacts; 
     126 
     127- (void)_performChangeOfUseOfflineGroup; 
     128 
    123129@end 
    124130 
     
    175181        [self loadContactList]; 
    176182        [self sortContactList]; 
     183 
     184        [[adium preferenceController] registerPreferenceObserver:self forGroup:PREF_GROUP_CONTACT_LIST_DISPLAY]; 
    177185} 
    178186 
     
    186194- (void)dealloc 
    187195{ 
     196        [[adium preferenceController] unregisterPreferenceObserver:self]; 
     197 
    188198    [contactList release]; 
    189199    [contactObservers release]; contactObservers = nil; 
     
    496506                        AIListGroup *targetGroup; 
    497507 
    498                         targetGroup = (useContactListGroups ? [self groupWithUID:remoteGroupName] : contactList); 
     508                        targetGroup = (useContactListGroups ? 
     509                                                   ((useOfflineGroup && ![inContact online]) ? [self offlineGroup] : [self groupWithUID:remoteGroupName]) : 
     510                                                   contactList); 
    499511 
    500512                        [targetGroup addObject:containingObject]; 
     
    507519                        AIListGroup *localGroup; 
    508520 
    509                         localGroup = (useContactListGroups ? [self groupWithUID:remoteGroupName] : contactList); 
     521                        localGroup = (useContactListGroups ? 
     522                                                  ((useOfflineGroup && ![inContact online]) ? [self offlineGroup] : [self groupWithUID:remoteGroupName]) : 
     523                                                  contactList); 
     524 
    510525                        [self _moveContactLocally:inContact 
    511526                                                          toGroup:localGroup]; 
     
    617632{ 
    618633        if (inFlag != useContactListGroups) { 
    619  
    620634                useContactListGroups = inFlag; 
    621635 
     
    682696 
    683697        //Show offline contacts menu item 
    684     showGroupsMenuItem = [[NSMenuItem alloc] initWithTitle:SHOW_GROUPS_MENU_TITLE 
     698    menuItem_showGroups = [[NSMenuItem alloc] initWithTitle:SHOW_GROUPS_MENU_TITLE 
    685699                                                                                                        target:self 
    686700                                                                                                        action:@selector(toggleShowGroups:) 
    687701                                                                                         keyEquivalent:@""]; 
    688         [showGroupsMenuItem setState:useContactListGroups]; 
    689         [[adium menuController] addMenuItem:showGroupsMenuItem toLocation:LOC_View_Toggles]; 
     702        [menuItem_showGroups setState:useContactListGroups]; 
     703        [[adium menuController] addMenuItem:menuItem_showGroups toLocation:LOC_View_Toggles]; 
    690704 
    691705        //Toolbar 
     
    710724        //Flip-flop. 
    711725        useContactListGroups = !useContactListGroups; 
    712         [showGroupsMenuItem setState:useContactListGroups]; 
     726        [menuItem_showGroups setState:useContactListGroups]; 
    713727 
    714728        //Update the contact list.  Do it on the next run loop for better menu responsiveness, as it may be a lengthy procedure. 
     
    726740                                                                                  @"togglegroups") 
    727741                                                                forClass:[self class]]]; 
     742} 
     743 
     744- (BOOL)useOfflineGroup 
     745{ 
     746        return useOfflineGroup; 
     747} 
     748 
     749- (void)setUseOfflineGroup:(BOOL)inFlag 
     750{ 
     751        if (inFlag != useOfflineGroup) { 
     752                useOfflineGroup = inFlag; 
     753                 
     754                if (useOfflineGroup) { 
     755                        [self registerListObjectObserver:self];  
     756                } else { 
     757                        [self updateAllListObjectsForObserver:self]; 
     758                        [self unregisterListObjectObserver:self];        
     759                } 
     760        } 
     761} 
     762 
     763- (AIListGroup *)offlineGroup 
     764{ 
     765        return [self groupWithUID:AILocalizedString(@"Offline", "Name of offline group")]; 
    728766} 
    729767 
     
    12321270        return listObject; 
    12331271} 
     1272 
     1273#pragma mark Preference observing 
     1274/*! 
     1275* @brief Preferences changed 
     1276 */ 
     1277- (void)preferencesChangedForGroup:(NSString *)group key:(NSString *)key 
     1278                                                        object:(AIListObject *)object preferenceDict:(NSDictionary *)prefDict firstTime:(BOOL)firstTime 
     1279{ 
     1280        if (firstTime || 
     1281                [key isEqualToString:KEY_USE_OFFLINE_GROUP]) { 
     1282 
     1283                [self setUseOfflineGroup:[[prefDict objectForKey:KEY_USE_OFFLINE_GROUP] boolValue]]; 
     1284        } 
     1285} 
     1286 
     1287- (NSSet *)updateListObject:(AIListObject *)inObject keys:(NSSet *)inModifiedKeys silent:(BOOL)silent 
     1288{ 
     1289        if (!inModifiedKeys || 
     1290                [inModifiedKeys containsObject:@"Online"]) { 
     1291 
     1292                if ([inObject isKindOfClass:[AIListContact class]]) {                    
     1293                        //If this contact is not its own parent contact, don't bother since we'll get an update for the parent if appropriate 
     1294                        if (inObject == [(AIListContact *)inObject parentContact]) { 
     1295                                if (useOfflineGroup) { 
     1296                                        AIListObject *containingObject = [inObject containingObject]; 
     1297                                         
     1298                                        if ([inObject online] && 
     1299                                                (containingObject == [self offlineGroup])) { 
     1300                                                [inObject restoreGrouping]; 
     1301                                                 
     1302                                        } else if (![inObject online] && 
     1303                                                           containingObject && 
     1304                                                           (containingObject != [self offlineGroup])) { 
     1305                                                [self _moveContactLocally:inObject 
     1306                                                                                  toGroup:[self offlineGroup]]; 
     1307                                        } 
     1308                                         
     1309                                } else { 
     1310                                        if ([inObject containingObject] == [self offlineGroup]) { 
     1311                                                [inObject restoreGrouping]; 
     1312                                        } 
     1313                                } 
     1314                        } 
     1315                } 
     1316        } 
     1317         
     1318        return nil; 
     1319} 
     1320 
    12341321//Contact Info -------------------------------------------------------------------------------- 
    12351322#pragma mark Contact Info 
  • trunk/Source/AIOfflineContactHidingPlugin.h

    r9828 r14701  
    2020 
    2121@interface AIOfflineContactHidingPlugin : AIPlugin <AIListObjectObserver> { 
    22         NSMenuItem              *showOfflineMenuItem; 
     22        NSMenuItem              *menuItem_showOffline; 
     23        NSMenuItem              *menuItem_useOfflineGroup; 
     24 
    2325        BOOL                    showOfflineContacts; 
    2426        BOOL                    useContactListGroups; 
    25  
     27        BOOL                    useOfflineGroup; 
    2628} 
    2729 
  • trunk/Source/AIOfflineContactHidingPlugin.m

    r13563 r14701  
    3030#define SHOW_OFFLINE_MENU_TITLE                         AILocalizedString(@"Show Offline Contacts",nil) 
    3131#define KEY_SHOW_OFFLINE_CONTACTS                       @"Show Offline Contacts" 
     32 
     33#define USE_OFFLINE_GROUP_MENU_TITLE            AILocalizedString(@"Show Offline Group",nil) 
     34#define KEY_USE_OFFLINE_GROUP                           @"Use Offline Group" 
     35 
    3236#define OFFLINE_CONTACTS_IDENTIFER                      @"OfflineContacts" 
    3337#define KEY_HIDE_CONTACT_LIST_GROUPS            @"Hide Contact List Groups" 
     
    5054{        
    5155        //Show offline contacts menu item 
    52     showOfflineMenuItem = [[NSMenuItem alloc] initWithTitle:SHOW_OFFLINE_MENU_TITLE 
     56    menuItem_showOffline = [[NSMenuItem alloc] initWithTitle:SHOW_OFFLINE_MENU_TITLE 
    5357                                                                                                         target:self 
    5458                                                                                                         action:@selector(toggleOfflineContactsMenu:) 
    5559                                                                                          keyEquivalent:@"H"]; 
    56         [[adium menuController] addMenuItem:showOfflineMenuItem toLocation:LOC_View_Toggles];            
    57  
     60        [[adium menuController] addMenuItem:menuItem_showOffline toLocation:LOC_View_Toggles];           
     61 
     62        menuItem_useOfflineGroup = [[NSMenuItem alloc] initWithTitle:USE_OFFLINE_GROUP_MENU_TITLE 
     63                                                                                                                  target:self 
     64                                                                                                                  action:@selector(toggleUseOfflineGroup:) 
     65                                                                                                   keyEquivalent:@""]; 
     66        [[adium menuController] addMenuItem:menuItem_useOfflineGroup toLocation:LOC_View_Toggles]; 
     67         
    5868        //Register preference observer first so values will be correct for the following calls 
    5969        [[adium preferenceController] registerPreferenceObserver:self forGroup:PREF_GROUP_CONTACT_LIST_DISPLAY]; 
     
    94104- (void)dealloc 
    95105{ 
    96         [showOfflineMenuItem release]; showOfflineMenuItem = nil; 
     106        [menuItem_showOffline release]; menuItem_showOffline = nil; 
    97107        [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    98108         
     
    108118        showOfflineContacts = [[prefDict objectForKey:KEY_SHOW_OFFLINE_CONTACTS] boolValue]; 
    109119        useContactListGroups = ![[prefDict objectForKey:KEY_HIDE_CONTACT_LIST_GROUPS] boolValue]; 
     120        useOfflineGroup = [[prefDict objectForKey:KEY_USE_OFFLINE_GROUP] boolValue]; 
    110121 
    111122        if (firstTime) { 
     
    122133 
    123134        //Update our menu to reflect the current preferences 
    124         [showOfflineMenuItem setState:showOfflineContacts]; 
     135        [menuItem_showOffline setState:showOfflineContacts]; 
     136        [menuItem_useOfflineGroup setState:useOfflineGroup]; 
    125137} 
    126138 
     
    164176 */ 
    165177- (NSSet *)updateListObject:(AIListObject *)inObject keys:(NSSet *)inModifiedKeys silent:(BOOL)silent 
    166 {     
     178{ 
    167179    if (inModifiedKeys == nil || 
    168180           [inModifiedKeys containsObject:@"Online"] || 
     
    190202 
    191203                        [inObject setVisible:((useContactListGroups) && 
    192                                                                   ([(AIListGroup *)inObject visibleCount] > 0 || newObject))]; 
     204                                                                  ([(AIListGroup *)inObject visibleCount] > 0 || newObject) && 
     205                                                                  (useOfflineGroup || ((AIListGroup *)inObject != [[adium contactController] offlineGroup])))]; 
    193206                } 
    194207        } 
     
    197210} 
    198211 
     212#pragma mark Offline group 
     213 
     214- (IBAction)toggleUseOfflineGroup:(id)sender 
     215{ 
     216        //Store the preference 
     217        [[adium preferenceController] setPreference:[NSNumber numberWithBool:!useOfflineGroup] 
     218                                                                                 forKey:KEY_USE_OFFLINE_GROUP 
     219                                                                                  group:PREF_GROUP_CONTACT_LIST_DISPLAY]; 
     220} 
     221 
     222- (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem 
     223{ 
     224        if (menuItem == menuItem_useOfflineGroup) { 
     225                return (useContactListGroups && showOfflineContacts); 
     226        } 
     227         
     228        return YES; 
     229} 
    199230@end