1/* All Rights reserved */ 2 3#include <AppKit/AppKit.h> 4#include "CollectionBrowser.h" 5#include "Strings.h" 6 7@interface CollectionBrowser(Private) 8- (void) _refreshView:(id) sender; 9@end 10 11@implementation CollectionBrowser 12+ (id) sharedCollectionBrowser 13{ 14 static CollectionBrowser *_sharedCollectionBrowser = nil; 15 16 if (! _sharedCollectionBrowser) 17 { 18 _sharedCollectionBrowser = [[CollectionBrowser 19 allocWithZone: [self zone]] init]; 20 } 21 22 return _sharedCollectionBrowser; 23} 24 25- (id) init 26{ 27 if ((self = [self initWithWindowNibName: @"CollectionBrowser"]) != nil) 28 { 29 [self setWindowFrameAutosaveName: @"CollectionBrowser"]; 30 mpdController = [MPDController sharedMPDController]; 31 directories = [[mpdController getAllDirectories] retain]; 32 dirhierarchy = [[NSMutableDictionary alloc] init]; 33 dirmetadata = [[NSMutableDictionary alloc] init]; 34 } 35 return self; 36} 37 38- (void) dealloc 39{ 40 [mpdController release]; 41 [directories release]; 42 [dirhierarchy release]; 43 [dirmetadata release]; 44 45 [super dealloc]; 46} 47 48/* -------------------- 49 - Playlist Methods - 50 --------------------*/ 51 52- (void) addSelected: (id)sender 53{ 54 NSEnumerator *songEnum = [[browser selectedCells] objectEnumerator]; 55 NSCell *selectedSong; 56 NSString *path = [browser pathToColumn:[browser selectedColumn]]; 57 while ((selectedSong = [songEnum nextObject]) != nil) 58 { 59 [NSString pathWithComponents: 60 [NSArray arrayWithObjects: 61 path, [selectedSong objectValue], nil]]; 62 63 [[MPDController sharedMPDController] 64 addTrack: [[NSString pathWithComponents: 65 [NSArray arrayWithObjects: path, [selectedSong objectValue], nil]] 66 substringFromIndex:1]]; 67 } 68} 69 70/* --------------- 71 - Gui Methods - 72 ---------------*/ 73 74- (void) awakeFromNib 75{ 76 NSNotificationCenter *defCenter; 77 78 defCenter = [NSNotificationCenter defaultCenter]; 79 80 [defCenter addObserver: self 81 selector: @selector(_refreshView:) 82 name: ShownCollectionChangedNotification 83 object: nil]; 84 85 [browser setPath:@"/"]; 86 [browser setDelegate: self]; 87} 88 89- (void) updateCollection: (id)sender 90{ 91 [[MPDController sharedMPDController] updateCollection]; 92} 93 94/* ----------------------- 95 - NSBrowser Delegates - 96 -----------------------*/ 97 98- (NSInteger)browser:(NSBrowser *)sender numberOfRowsInColumn:(NSInteger)column 99{ 100 NSInteger count; 101 NSEnumerator *dirEnum, *fileEnum; 102 NSString *dir, *file; 103 NSMutableArray *tmpArray = [NSMutableArray new]; 104 NSSet *uniqueElements; 105 NSArray *files; 106 107 NSString *ptc = [sender pathToColumn: column]; 108 NSString *rptc = [ptc substringFromIndex:1]; 109 dirEnum = [directories objectEnumerator]; 110 111 while ((dir = [dirEnum nextObject]) != nil) 112 { 113 if ([[dir pathComponents] count] > column) 114 { 115 NSString *tmpObject = [NSString stringWithFormat:@"%@", [[dir pathComponents] objectAtIndex:column]]; 116 if ([dir hasPrefix:rptc]) 117 { 118 if ([tmpArray indexOfObject:dir] == NSNotFound) 119 { 120 [tmpArray addObject:tmpObject]; 121 122 } 123 } 124 if ([rptc length] == 0 && column == 0) 125 { 126 if (![tmpArray containsObject:tmpObject]) 127 { 128 [tmpArray addObject:tmpObject]; 129 } 130 } 131 [dirmetadata setObject:[NSNumber numberWithBool:NO] forKey:[NSString stringWithFormat:@"%@%@", ptc,tmpObject]]; 132 } 133 } 134 135 uniqueElements = [NSSet setWithArray:tmpArray]; 136 [tmpArray release]; 137 tmpArray = [NSMutableArray arrayWithArray: [uniqueElements allObjects]]; 138 [tmpArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 139 files = [mpdController getAllFilesInDirectory:rptc]; 140 [tmpArray addObjectsFromArray: files]; 141 [dirhierarchy setObject:tmpArray forKey:ptc]; 142 143 fileEnum = [files objectEnumerator]; 144 while ((file = [fileEnum nextObject]) != nil) 145 { 146 [dirmetadata setObject:[NSNumber numberWithBool:YES] forKey:[NSString stringWithFormat:@"%@%@", ptc,file]]; 147 } 148 count = [tmpArray count]; 149 return count; 150} 151 152- (void)browser:(NSBrowser *)sender willDisplayCell:(id)cell atRow:(NSInteger)row column:(NSInteger)column 153{ 154 NSString *ptc = [sender pathToColumn: column]; 155 NSString *content = [NSString stringWithFormat:@"%@", [[dirhierarchy objectForKey:ptc] objectAtIndex:row]]; 156 157 [cell setStringValue:content]; 158 [cell setTitle:content]; 159 [cell setLeaf: [[dirmetadata objectForKey:[NSString stringWithFormat:@"%@%@", ptc,content]] boolValue]]; 160 [cell setLoaded: YES]; 161} 162 163- (BOOL)browser:(NSBrowser *)browser canDragRowsWithIndexes:(NSIndexSet *)rowIndexes inColumn:(NSInteger)column withEvent:(NSEvent *)event 164{ 165 return YES; 166} 167 168- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)proposedFrameSize 169{ 170 // Doesn't work. Why ???? 171 printf("windowWillResize: %s\n", [NSStringFromSize(proposedFrameSize) cString]); 172 return proposedFrameSize; 173} 174@end 175 176@implementation CollectionBrowser(Private) 177- (void) _refreshView:(id) sender 178{ 179 NSInteger idx; 180 NSInteger last = [browser lastColumn]; 181 directories = [[mpdController getAllDirectories] retain]; 182 for (idx = 0;idx < last;idx++) 183 { 184 [browser reloadColumn:idx]; 185 } 186} 187@end 188