Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 16 - (hide annotations) (download)
Fri Nov 6 12:37:27 2009 UTC (14 years, 5 months ago) by masaki
Original Path: XspfManager/XspfManager.m
File size: 14212 byte(s)
[misc] NSCollectionView部分を別のnibに分離。NSViewControllerで管理。
1 masaki 2 //
2     // XspfManager.m
3     // XspfManager
4     //
5     // Created by Hori,Masaki on 09/11/01.
6     // Copyright 2009 masakih. All rights reserved.
7     //
8    
9     #import "XspfManager.h"
10    
11     #import "XspfMMovieLoadRequest.h"
12    
13 masaki 16 #import "XspfMCollectionViewController.h"
14 masaki 2
15 masaki 16 @interface XspfManager(HMPrivate)
16     - (void)buildFamilyNameFromFile;
17     @end
18    
19 masaki 2 @implementation XspfManager
20 masaki 8 static XspfManager *sharedInstance = nil;
21 masaki 2
22 masaki 8 + (XspfManager *)sharedInstance
23 masaki 2 {
24 masaki 8 @synchronized(self) {
25     if (sharedInstance == nil) {
26     [[self alloc] init]; // assignment not done here
27     }
28     }
29     return sharedInstance;
30     }
31    
32     + (id)allocWithZone:(NSZone *)zone
33     {
34     @synchronized(self) {
35     if (sharedInstance == nil) {
36     sharedInstance = [super allocWithZone:zone];
37     return sharedInstance; // assignment and return on first allocation
38     }
39     }
40     return nil; //on subsequent allocation attempts return nil
41     }
42    
43     - (id)copyWithZone:(NSZone *)zone
44     {
45     return self;
46     }
47    
48     - (id)retain
49     {
50     return self;
51     }
52    
53     - (unsigned)retainCount
54     {
55     return UINT_MAX; //denotes an object that cannot be released
56     }
57    
58     - (void)release
59     {
60     //do nothing
61     }
62    
63     - (id)autorelease
64     {
65     return self;
66     }
67    
68    
69     - (id)init
70     {
71     [super initWithWindowNibName:@"MainWindow"];
72 masaki 2 channel = [[HMChannel alloc] initWithWorkerNum:1];
73 masaki 8
74     return self;
75 masaki 2 }
76 masaki 8 - (void)awakeFromNib
77     {
78     if(appDelegate && [self window]) {
79     [self buildFamilyNameFromFile];
80 masaki 16
81     listViewController = [[XspfMCollectionViewController alloc] init];
82    
83     [listViewController setRepresentedObject:controller];
84     [listView addSubview:[listViewController view]];
85     [[listViewController view] setFrame:[listView bounds]];
86    
87 masaki 8 [self showWindow:self];
88     }
89     }
90     - (NSManagedObjectContext *)managedObjectContext
91     {
92     return [appDelegate managedObjectContext];
93     }
94 masaki 16 - (NSArrayController *)arrayController
95     {
96     return controller;
97     }
98 masaki 2
99 masaki 16
100 masaki 14 - (NSInteger)selectedSegmentTag
101     {
102     return selectedSegmentTag;
103     }
104     - (void)setSelectedSegmentTag:(NSInteger)newTag
105     {
106     if(selectedSegmentTag == newTag) return;
107     selectedSegmentTag = newTag;
108    
109     NSString *key = nil;
110     BOOL ascending = YES;
111     switch(selectedSegmentTag) {
112     case 0:
113     key = @"title";
114     break;
115     case 1:
116     key = @"registerDate";
117     ascending = NO;
118     break;
119     case 2:
120     key = @"lastPlayDate";
121     ascending = NO;
122     break;
123     case 3:
124     key = @"lastUpdateDate";
125     ascending = NO;
126     break;
127     }
128     if(!key) return;
129    
130     NSSortDescriptor *desc = [[[NSSortDescriptor alloc] initWithKey:key ascending:ascending] autorelease];
131    
132     NSMutableArray *array = [[controller sortDescriptors] mutableCopy];
133     [array insertObject:desc atIndex:0];
134     [controller setSortDescriptors:array];
135     [controller rearrangeObjects];
136     }
137 masaki 8
138 masaki 14
139 masaki 13 #pragma mark#### Actions ####
140 masaki 10 - (IBAction)openXspf:(id)sender
141     {
142 masaki 14 id rep = [controller valueForKeyPath:@"selection.self"];
143     id filePath = [rep valueForKey:@"filePath"];
144     if([filePath isKindOfClass:[NSString class]]) {
145 masaki 10 NSWorkspace *ws = [NSWorkspace sharedWorkspace];
146 masaki 14 [ws openFile:filePath withApplication:@"XspfQT"];
147     [rep setValue:[NSDate dateWithTimeIntervalSinceNow:0.0] forKey:@"lastPlayDate"];
148 masaki 10 }
149     }
150 masaki 2 - (IBAction)add:(id)sender
151     {
152     NSOpenPanel *panel = [NSOpenPanel openPanel];
153    
154     [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]];
155     [panel setAllowsMultipleSelection:YES];
156 masaki 9 [panel setDelegate:self];
157 masaki 2
158     [panel beginSheetForDirectory:nil
159     file:nil
160     types:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]
161 masaki 8 modalForWindow:[self window]
162 masaki 2 modalDelegate:self
163     didEndSelector:@selector(endOpenPanel:::)
164     contextInfo:NULL];
165     }
166    
167 masaki 13
168     - (NSInteger)registerWithURL:(NSURL *)url
169     {
170     id obj = [NSEntityDescription insertNewObjectForEntityForName:@"Xspf"
171     inManagedObjectContext:[appDelegate managedObjectContext]];
172     if(!obj) return 1;
173    
174     id info = [NSEntityDescription insertNewObjectForEntityForName:@"Info"
175     inManagedObjectContext:[appDelegate managedObjectContext]];
176     if(!info) {
177     [[appDelegate managedObjectContext] deleteObject:obj];
178     return 2;
179     }
180    
181     [obj setValue:info forKey:@"information"];
182     [obj setValue:url forKey:@"url"];
183     [obj setValue:[NSDate dateWithTimeIntervalSinceNow:0.0] forKey:@"registerDate"];
184     [obj setValue:[NSDate dateWithTimeIntervalSinceNow:0.0] forKey:@"lastUpdateDate"];
185    
186     XspfMMovieLoadRequest *request = [XspfMMovieLoadRequest requestWithObject:obj url:url];
187     [channel putRequest:request];
188    
189     [controller performSelector:@selector(setSelectedObjects:) withObject:[NSArray arrayWithObject:obj] afterDelay:0.0];
190    
191     return noErr;
192     }
193 masaki 2 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
194     {
195 masaki 9 [panel orderOut:nil];
196    
197 masaki 2 if(returnCode == NSCancelButton) return;
198    
199     NSArray *URLs = [panel URLs];
200     if([URLs count] == 0) return;
201    
202     [progressBar setUsesThreadedAnimation:YES];
203    
204     [NSApp beginSheet:progressPanel
205 masaki 8 modalForWindow:[self window]
206 masaki 2 modalDelegate:nil
207     didEndSelector:Nil
208     contextInfo:NULL];
209     [progressBar startAnimation:self];
210     [progressMessage setStringValue:@"During register."];
211    
212     for(id URL in URLs) {
213     [self registerWithURL:URL];
214     }
215    
216     [progressBar stopAnimation:self];
217     [progressPanel orderOut:self];
218     [NSApp endSheet:progressPanel];
219     }
220    
221    
222     - (void)addItem:(id)item
223     {
224    
225     }
226    
227    
228     - (void)removeItem:(id)item
229     {
230     [self doesNotRecognizeSelector:_cmd];
231     }
232    
233 masaki 5
234 masaki 6 #pragma mark#### load familynames ####
235     - (NSArray *)arrayFromLFSeparatedFile:(NSString *)name
236     {
237     NSString *path;
238    
239 masaki 13 path = [[appDelegate applicationSupportFolder] stringByAppendingPathComponent:name];
240     path = [path stringByAppendingPathExtension:@"txt"];
241    
242     NSFileManager *fm = [NSFileManager defaultManager];
243     BOOL isDir = NO;
244     if(![fm fileExistsAtPath:path isDirectory:&isDir] || isDir) {
245 masaki 6 path = [[NSBundle mainBundle] pathForResource:name ofType:@"txt"];
246 masaki 13 }
247 masaki 6
248     NSError *error = nil;
249     NSString *content = [NSString stringWithContentsOfFile:path
250     encoding:NSUTF8StringEncoding
251     error:&error];
252     if(error) {
253     NSLog(@"path => %@", path);
254     NSLog(@"%@", [error localizedDescription]);
255     return NO;
256     }
257    
258     return [content componentsSeparatedByString:@"\x0a"];
259     }
260 masaki 5
261 masaki 6 - (NSArray *)arrayFromTabSeparatedString:(NSString *)string
262     {
263     return [string componentsSeparatedByString:@"\t"];
264     }
265     - (BOOL)isEmptyEntityName:(NSString *)name
266     {
267     NSManagedObjectContext *moc = [appDelegate managedObjectContext];
268     NSError *error = nil;
269     NSFetchRequest *fetch;
270     NSInteger num;
271    
272     fetch = [[NSFetchRequest alloc] init];
273     [fetch setEntity:[NSEntityDescription entityForName:name
274     inManagedObjectContext:moc]];
275     num = [moc countForFetchRequest:fetch
276     error:&error];
277     [fetch release];
278     fetch = nil;
279     if(error) {
280     NSLog(@"%@", [error localizedDescription]);
281     return NO;
282     }
283    
284     return num == 0;
285     }
286     - (void) buildFamilyNameFromFile
287     {
288     NSManagedObjectContext *moc = [appDelegate managedObjectContext];
289    
290     NSString *entityName;
291     NSArray *contents;
292     entityName = @"FamilyName";
293 masaki 7 if([self isEmptyEntityName:entityName]) {
294 masaki 6 contents = [self arrayFromLFSeparatedFile:entityName];
295    
296 masaki 14 id key;
297     for(key in contents) {
298     NSArray *attr = [self arrayFromTabSeparatedString:key];
299 masaki 6 if([attr count] < 2) continue;
300    
301     id obj = [NSEntityDescription insertNewObjectForEntityForName:entityName
302     inManagedObjectContext:moc];
303     [obj setValue:[attr objectAtIndex:0] forKey:@"roman"];
304     [obj setValue:[attr objectAtIndex:1] forKey:@"japanese"];
305    
306     if([attr count] > 2) {
307     [obj setValue:[attr objectAtIndex:2] forKey:@"yomigana"];
308     }
309     }
310     }
311    
312     }
313    
314 masaki 7 - (void)truncateFamilyName
315     {
316     NSManagedObjectContext *moc = [appDelegate managedObjectContext];
317     NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
318     NSEntityDescription *entry = [NSEntityDescription entityForName:@"FamilyName"
319     inManagedObjectContext:moc];
320     [fetch setEntity:entry];
321    
322     NSError *error = nil;
323     NSArray *objects = [moc executeFetchRequest:fetch error:&error];
324     if(!objects) {
325     if(error) {
326     NSLog(@"fail fetch reason -> %@", error);
327     }
328     }
329    
330     [moc lock];
331     for(id obj in objects) {
332     [moc deleteObject:obj];
333     }
334     [moc unlock];
335     }
336 masaki 8 #pragma mark#### NSWidnow Delegate ####
337     /**
338     Returns the NSUndoManager for the application. In this case, the manager
339     returned is that of the managed object context for the application.
340     */
341 masaki 6
342 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
343     return [[appDelegate managedObjectContext] undoManager];
344     }
345    
346 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
347     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
348     {
349     NSManagedObjectContext *moc = [appDelegate managedObjectContext];
350     NSError *error = nil;
351     NSFetchRequest *fetch;
352     NSInteger num;
353     NSURL *url = [NSURL fileURLWithPath:filename];
354    
355     fetch = [[[NSFetchRequest alloc] init] autorelease];
356     [fetch setEntity:[NSEntityDescription entityForName:@"Xspf" inManagedObjectContext:moc]];
357 masaki 16 NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"urlString LIKE %@", [url absoluteString]];
358     [fetch setPredicate:aPredicate];
359 masaki 9 num = [moc countForFetchRequest:fetch error:&error];
360     if(error) {
361     NSLog(@"%@", [error localizedDescription]);
362     return NO;
363     }
364    
365     return num == 0;
366     }
367    
368 masaki 5 #pragma mark#### NSTokenField Delegate ####
369 masaki 6 #if 1
370 masaki 5 - (NSArray *)tokenField:(NSTokenField *)tokenField
371     completionsForSubstring:(NSString *)substring
372     indexOfToken:(NSInteger)tokenIndex
373     indexOfSelectedItem:(NSInteger *)selectedIndex
374     {
375 masaki 6 NSManagedObjectContext *moc = [appDelegate managedObjectContext];
376     NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
377    
378 masaki 16 NSPredicate *aPredicate = [NSPredicate predicateWithFormat:
379 masaki 6 @"roman BEGINSWITH[cd] %@"
380     @"OR japanese BEGINSWITH[cd] %@"
381     @"OR yomigana BEGINSWITH[cd] %@", substring,substring,substring];
382     NSEntityDescription *entry = [NSEntityDescription entityForName:@"FamilyName"
383     inManagedObjectContext:moc];
384    
385     [fetch setEntity:entry];
386 masaki 16 [fetch setPredicate:aPredicate];
387 masaki 6
388     NSError *error = nil;
389     NSArray *objects = [moc executeFetchRequest:fetch error:&error];
390     if(!objects) {
391     if(error) {
392     NSLog(@"fail fetch reason -> %@", error);
393     }
394     }
395    
396     NSString *entryName = @"";
397     switch([tokenField tag]) {
398     case 2000:
399     entryName = @"VoiceActor";
400     break;
401     case 2001:
402     entryName = @"Product";
403     break;
404     }
405    
406     if([objects count] > 0) {
407     NSMutableString *string = [NSMutableString string];
408     NSMutableArray *names = [NSMutableArray array];
409     for(id e in objects) {
410     if([string length]) {
411     [string appendString:@" OR "];
412     }
413     [string appendFormat:@"name BEGINSWITH[cd] %%@ "];
414     [names addObject:[e valueForKey:@"japanese"]];
415     }
416 masaki 16 aPredicate = [NSPredicate predicateWithFormat:string argumentArray:names];
417 masaki 6 } else {
418 masaki 16 aPredicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", substring];
419 masaki 6 }
420     entry = [NSEntityDescription entityForName:entryName inManagedObjectContext:moc];
421     [fetch setEntity:entry];
422 masaki 16 [fetch setPredicate:aPredicate];
423 masaki 6
424     error = nil;
425     objects = [moc executeFetchRequest:fetch error:&error];
426     if(!objects) {
427     if(error) {
428     NSLog(@"fail fetch reason -> %@", error);
429     }
430     }
431    
432     NSMutableArray *result = [NSMutableArray arrayWithObject:substring];
433     for(id obj in objects) {
434     [result addObject:[obj valueForKey:@"name"]];
435     }
436    
437     return result;
438     }
439     #else
440     - (NSArray *)tokenField:(NSTokenField *)tokenField
441     completionsForSubstring:(NSString *)substring
442     indexOfToken:(NSInteger)tokenIndex
443     indexOfSelectedItem:(NSInteger *)selectedIndex
444     {
445 masaki 5 NSLog(@"Enter %@", NSStringFromSelector(_cmd));
446    
447 masaki 6 NSString *entryName = @"";
448     switch([tokenField tag]) {
449     case 2000:
450     entryName = @"VoiceActor";
451     break;
452     case 2001:
453     entryName = @"Product";
454     break;
455     }
456    
457 masaki 5 NSManagedObjectContext *moc = [appDelegate managedObjectContext];
458     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", substring];
459 masaki 6 NSEntityDescription *entry = [NSEntityDescription entityForName:entryName
460 masaki 5 inManagedObjectContext:moc];
461     NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
462     [fetch setEntity:entry];
463     [fetch setPredicate:predicate];
464    
465     NSError *error = nil;
466     NSArray *objects = [moc executeFetchRequest:fetch error:&error];
467     if(!objects) {
468     if(error) {
469     NSLog(@"fail fetch reason -> %@", error);
470     }
471     }
472    
473     NSMutableArray *result = [NSMutableArray array];
474     for(id obj in objects) {
475     [result addObject:[obj valueForKey:@"name"]];
476     }
477    
478     return result;
479     }
480 masaki 6 #endif
481 masaki 5
482     - (void)registerVoiceActor:(NSTokenField *)tokenField
483     {
484     id array = [tokenField objectValue];
485     if(![array isKindOfClass:[NSArray class]]) return;
486    
487 masaki 6 NSString *entryName = @"";
488     switch([tokenField tag]) {
489     case 2000:
490     entryName = @"VoiceActor";
491     break;
492     case 2001:
493     entryName = @"Product";
494     break;
495     }
496    
497 masaki 5 NSManagedObjectContext *moc = [appDelegate managedObjectContext];
498 masaki 6 NSEntityDescription *entry = [NSEntityDescription entityForName:entryName
499 masaki 5 inManagedObjectContext:moc];
500     NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
501     [fetch setEntity:entry];
502    
503     for(id token in array) {
504 masaki 16 NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] %@", token];
505     [fetch setPredicate:aPredicate];
506 masaki 5
507     NSError *error = nil;
508     NSUInteger count = [moc countForFetchRequest:fetch error:&error];
509     if(error) {
510     NSLog(@"fail fetch reason -> %@", error);
511     continue;
512     }
513     if(count == 0) {
514 masaki 6 id obj = [NSEntityDescription insertNewObjectForEntityForName:entryName inManagedObjectContext:moc];
515 masaki 5 [obj setValue:token forKey:@"name"];
516     }
517     }
518     }
519     - (BOOL)control:(id)control textShouldEndEditing:(NSText *)fieldEditor
520     {
521 masaki 6 if([control tag] == 2000 || [control tag] == 2001) {
522 masaki 5 [self registerVoiceActor:control];
523     }
524    
525     return YES;
526     }
527    
528     #pragma mark#### Test ####
529 masaki 2 - (IBAction)test01:(id)sender
530     {
531 masaki 7 [self truncateFamilyName];
532 masaki 6 [self buildFamilyNameFromFile];
533 masaki 2 }
534     - (IBAction)test02:(id)sender
535     {
536 masaki 10 NSResponder *responder = [[self window] firstResponder];
537     while(responder) {
538     NSLog(@"Responder -> %@", responder);
539     responder = [responder nextResponder];
540     }
541 masaki 2 }
542     - (IBAction)test03:(id)sender
543     {
544     NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
545    
546     id moc = [appDelegate managedObjectContext];
547    
548     [fetch setEntity:[NSEntityDescription entityForName:@"Xspf" inManagedObjectContext:moc]];
549    
550     id objs = [moc executeFetchRequest:fetch error:NULL];
551     NSLog(@"Fetched -> %@", objs);
552     }
553     @end

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26