Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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