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