Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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