Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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