Changeset 1040

Show
Ignore:
Timestamp:
10/28/07 12:01:36 (15 months ago)
Author:
stephen_booth
Message:

Leopard updates

Location:
trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/AudioLibrary/AudioLibrary.m

    r1038 r1040  
    9292#import "ImageAndTextCell.h" 
    9393 
     94// Hacky 10.4 workarounds 
    9495#import "NSTreeController_Extensions.h" 
    9596 
     
    162163#define STREAM_TABLE_COLUMNS_MENU_ITEM_INDEX            6 
    163164 
    164 #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 
    165165// ======================================== 
    166 // Completely bogus NSTreeController bindings hack 
     166// Completely bogus NSTreeController bindings hack (unnecessary on 10.5) 
    167167// ======================================== 
    168168@interface NSObject (NSTreeControllerBogosity) 
    169169- (id) observedObject; 
    170170@end 
    171 #endif 
    172171 
    173172// ======================================== 
     
    208207- (void) saveBrowserStateToDefaults; 
    209208- (void) restoreBrowserStateFromDefaults; 
     209- (BOOL) selectBrowserNode:(BrowserNode *)node; 
    210210 
    211211- (void) setupStreamTableColumns; 
     
    711711- (IBAction) browseLibrary:(id)sender 
    712712{ 
    713         /*BOOL success =*/ [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:_libraryNode]]; 
     713        [self selectBrowserNode:_libraryNode]; 
    714714} 
    715715 
    716716- (IBAction) browseMostPopular:(id)sender 
    717717{ 
    718         /*BOOL success =*/ [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:_mostPopularNode]]; 
     718        [self selectBrowserNode:_mostPopularNode]; 
    719719} 
    720720 
    721721- (IBAction) browseHighestRated:(id)sender 
    722722{ 
    723         /*BOOL success =*/ [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:_highestRatedNode]]; 
     723        [self selectBrowserNode:_highestRatedNode]; 
    724724} 
    725725 
    726726- (IBAction) browseRecentlyAdded:(id)sender 
    727727{ 
    728         /*BOOL success =*/ [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:_recentlyAddedNode]]; 
     728        [self selectBrowserNode:_recentlyAddedNode]; 
    729729} 
    730730 
    731731- (IBAction) browseRecentlyPlayed:(id)sender 
    732732{ 
    733         /*BOOL success =*/ [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:_recentlyPlayedNode]]; 
     733        [self selectBrowserNode:_recentlyPlayedNode]; 
    734734} 
    735735 
    736736- (IBAction) browseRecentlySkipped:(id)sender 
    737737{ 
    738         /*BOOL success =*/ [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:_recentlySkippedNode]]; 
     738        [self selectBrowserNode:_recentlySkippedNode]; 
    739739} 
    740740 
     
    745745        BrowserNode *artistNode = [_artistsNode findChildNamed:artist]; 
    746746        if(nil != artistNode) 
    747                 return [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:artistNode]]; 
     747                return [self selectBrowserNode:artistNode]; 
    748748        else 
    749749                return NO; 
     
    756756        BrowserNode *albumNode = [_albumsNode findChildNamed:album]; 
    757757        if(nil != albumNode) 
    758                 return [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:albumNode]]; 
     758                return [self selectBrowserNode:albumNode]; 
    759759        else 
    760760                return NO; 
     
    767767        BrowserNode *composerNode = [_composersNode findChildNamed:composer]; 
    768768        if(nil != composerNode) 
    769                 return [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:composerNode]]; 
     769                return [self selectBrowserNode:composerNode]; 
    770770        else 
    771771                return NO; 
     
    778778        BrowserNode *genreNode = [_genresNode findChildNamed:genre]; 
    779779        if(nil != genreNode) 
    780                 return [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:genreNode]]; 
     780                return [self selectBrowserNode:genreNode]; 
    781781        else     
    782782                return NO; 
     
    789789        BrowserNode *playlistNode = [_playlistsNode findChildNamed:playlistName]; 
    790790        if(nil != playlistNode) 
    791                 return [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:playlistNode]]; 
     791                return [self selectBrowserNode:playlistNode]; 
    792792        else     
    793793                return NO; 
     
    800800        BrowserNode *smartPlaylistNode = [_smartPlaylistsNode findChildNamed:smartPlaylistName]; 
    801801        if(nil != smartPlaylistNode) 
    802                 return [_browserController setSelectionIndexPath:[_browserController arrangedIndexPathForObject:smartPlaylistName]]; 
     802                return [self selectBrowserNode:smartPlaylistNode]; 
    803803        else     
    804804                return NO; 
     
    17661766- (BOOL) outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item 
    17671767{ 
    1768         BrowserNode *node = [item observedObject]; 
     1768        BrowserNode *node = nil; 
     1769         
     1770        // In Leopard observedObject no longer works (which is a good thing) 
     1771        if(nil != NSClassFromString(@"NSTreeNode")) 
     1772                node = [item representedObject]; 
     1773        else 
     1774                node = [item observedObject]; 
     1775 
    17691776        return [node nameIsEditable]; 
    17701777} 
     
    17821789- (void) outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item 
    17831790{ 
    1784         BrowserNode *node = [item observedObject]; 
     1791        BrowserNode *node = nil; 
     1792         
     1793        // In Leopard observedObject no longer works (which is a good thing) 
     1794        if(nil != NSClassFromString(@"NSTreeNode")) 
     1795                node = [item representedObject]; 
     1796        else 
     1797                node = [item observedObject]; 
     1798 
    17851799        [(ImageAndTextCell *)cell setImage:[node icon]]; 
    17861800 
     
    17971811        int                                                     selectedRow                     = [outlineView selectedRow]; 
    17981812        id                                                      opaqueNode                      = [outlineView itemAtRow:selectedRow]; 
    1799         BrowserNode                                     *node                           = [opaqueNode observedObject]; 
     1813        BrowserNode                                     *node                           = nil; 
    18001814        NSArray                                         *selected                       = [_streamController selectedObjects]; 
    18011815        NSDictionary                            *bindingInfo            = [_streamController infoForBinding:@"contentArray"]; 
    18021816        AudioStreamCollectionNode       *oldStreamsNode         = [bindingInfo valueForKey:NSObservedObjectKey]; 
     1817 
     1818        // In Leopard observedObject no longer works (which is a good thing) 
     1819        if(nil != NSClassFromString(@"NSTreeNode")) 
     1820                node = [opaqueNode representedObject]; 
     1821        else 
     1822                node = [opaqueNode observedObject]; 
    18031823 
    18041824        // Unbind the current stream source 
     
    18091829        // Don't do anything except possibly save the sort descriptors if the user selected nothing 
    18101830        if(nil == node) { 
    1811  
    18121831                if(NO == [oldStreamsNode streamsAreOrdered]) { 
    18131832                        [_streamTableSavedSortDescriptors release], _streamTableSavedSortDescriptors = nil; 
     
    24902509} 
    24912510 
     2511- (BOOL) selectBrowserNode:(BrowserNode *)node 
     2512{ 
     2513        NSParameterAssert(nil != node); 
     2514         
     2515        NSIndexPath *indexPath = nil; 
     2516         
     2517        // If the NSTreeNode class is present, use it 
     2518        if(nil != NSClassFromString(@"NSTreeNode")) { 
     2519                NSEnumerator    *enumerator             = [[[_browserController arrangedObjects] childNodes] objectEnumerator]; 
     2520                NSTreeNode              *child                  = nil; 
     2521                NSTreeNode              *match                  = nil; 
     2522                 
     2523                while(nil == match && (child = [enumerator nextObject])) 
     2524                        match = treeNodeForRepresentedObject(child, node); 
     2525                 
     2526                indexPath = [match indexPath]; 
     2527        } 
     2528        // Otherwise use hacky-10.4 workarounds 
     2529        else 
     2530                indexPath = [_browserController arrangedIndexPathForObject:node]; 
     2531         
     2532        return [_browserController setSelectionIndexPath:indexPath];     
     2533} 
     2534 
    24922535- (void) setupStreamTableColumns 
    24932536{ 
     
    25572600                [contextMenuItem setState:([[visibleDictionary objectForKey:[obj identifier]] boolValue] ? NSOnState : NSOffState)]; 
    25582601                 
    2559                 //              NSLog(@"setting width of %@ to %f", [obj identifier], [[sizesDictionary objectForKey:[obj identifier]] floatValue]); 
     2602//              NSLog(@"setting width of %@ to %f", [obj identifier], [[sizesDictionary objectForKey:[obj identifier]] floatValue]); 
    25602603                [obj setWidth:[[sizesDictionary objectForKey:[obj identifier]] floatValue]]; 
    25612604                 
    2562                 if([[visibleDictionary objectForKey:[obj identifier]] boolValue]) { 
     2605                if([[visibleDictionary objectForKey:[obj identifier]] boolValue]) 
    25632606                        [_streamTableVisibleColumns addObject:obj]; 
    2564                 } 
    2565                 else { 
     2607                else 
    25662608                        [_streamTableHiddenColumns addObject:obj]; 
    2567                         [_streamTable removeTableColumn:obj]; 
    2568                 } 
    2569         } 
    2570          
     2609        } 
     2610 
     2611        // Don't modify table columns while enumerating 
     2612        enumerator = [_streamTableHiddenColumns objectEnumerator]; 
     2613        while((obj = [enumerator nextObject])) 
     2614                [_streamTable removeTableColumn:obj]; 
     2615 
    25712616        i = 0; 
    25722617        enumerator = [orderArray objectEnumerator]; 
     
    26492694                [obj setWidth:[[sizesDictionary objectForKey:[obj identifier]] floatValue]]; 
    26502695                 
    2651                 if([[visibleDictionary objectForKey:[obj identifier]] boolValue]) { 
     2696                if([[visibleDictionary objectForKey:[obj identifier]] boolValue]) 
    26522697                        [_playQueueTableVisibleColumns addObject:obj]; 
    2653                 } 
    2654                 else { 
     2698                else 
    26552699                        [_playQueueTableHiddenColumns addObject:obj]; 
    2656                         [_playQueueTable removeTableColumn:obj]; 
    2657                 } 
    2658         } 
     2700        } 
     2701 
     2702        // Don't modify table columns while enumerating 
     2703        enumerator = [_playQueueTableHiddenColumns objectEnumerator]; 
     2704        while((obj = [enumerator nextObject])) 
     2705                [_playQueueTable removeTableColumn:obj]; 
    26592706         
    26602707        i = 0; 
  • trunk/Utilities/UtilityFunctions.h

    r359 r1040  
    4545        NSData * getBitmapDataForImage(NSImage *image, NSBitmapImageFileType type); 
    4646         
     47        NSTreeNode * treeNodeForRepresentedObject(NSTreeNode *root, id representedObject); 
     48 
    4749#ifdef __cplusplus 
    4850} 
  • trunk/Utilities/UtilityFunctions.m

    r245 r1040  
    219219        return [bitmapRep representationUsingType:type properties:nil];  
    220220} 
     221 
     222NSTreeNode *  
     223treeNodeForRepresentedObject(NSTreeNode *root, id representedObject) 
     224{ 
     225        NSCParameterAssert(nil != root); 
     226        NSCParameterAssert(nil != representedObject); 
     227         
     228        // Termination condition 
     229        if([[root representedObject] isEqual:representedObject]) 
     230                return root; 
     231         
     232        NSEnumerator    *enumerator             = [[root childNodes] objectEnumerator]; 
     233        NSTreeNode              *child                  = nil; 
     234        NSTreeNode              *match                  = nil; 
     235         
     236        // Perform a breadth-first search 
     237        while(nil == match && (child = [enumerator nextObject])) { 
     238                if([[child representedObject] isEqual:representedObject]) 
     239                        match = child; 
     240        } 
     241         
     242        if(nil == match) { 
     243                enumerator      = [[root childNodes] objectEnumerator]; 
     244                child           = nil; 
     245                 
     246                while(nil == match && (child = [enumerator nextObject])) 
     247                        match = treeNodeForRepresentedObject(child, representedObject); 
     248        } 
     249         
     250        return match; 
     251}