Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 189 - (hide annotations) (download)
Sat Jan 2 05:28:49 2010 UTC (14 years, 3 months ago) by masaki
File size: 15438 byte(s)
[Mod] keyViewLoopが適切になるように修正。
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 masaki 182 #import "XspfMMainWindowController.h"
10 masaki 2
11     #import "XspfMMovieLoadRequest.h"
12 masaki 50 #import "XspfMCheckFileModifiedRequest.h"
13 masaki 2
14 masaki 189 #import "XspfMViewController.h"
15 masaki 41 #import "XspfMLibraryViewController.h"
16 masaki 16 #import "XspfMCollectionViewController.h"
17 masaki 25 #import "XspfMListViewController.h"
18 masaki 47 #import "XspfMDetailViewController.h"
19 masaki 2
20 masaki 94 #import "UKKQueue.h"
21 masaki 96 #import "NSPathUtilities-XspfQT-Extensions.h"
22 masaki 69
23 masaki 182 @interface XspfMMainWindowController(HMPrivate)
24 masaki 43 - (void)setupXspfLists;
25 masaki 47 - (void)setupDetailView;
26 masaki 82 - (void)setupAccessorylView;
27 masaki 25 - (void)changeViewType:(XspfMViewType)newType;
28     - (void)setCurrentListViewType:(XspfMViewType)newType;
29 masaki 189 - (void)recalculateKeyViewLoop;
30 masaki 16 @end
31    
32 masaki 184 @interface XspfMMainWindowController(XspfMDeprecated)
33     - (BOOL)didRegisteredURL:(NSURL *)url;
34     - (XSPFMXspfObject *)registerWithURL:(NSURL *)url;
35     - (void)registerFilePaths:(NSArray *)filePaths;
36     - (void)registerURLs:(NSArray *)URLs;
37    
38     - (void)registerToUKKQueue;
39     -(void) watcher:(id<UKFileWatcher>)kq receivedNotification:(NSString*)notificationName forPath: (NSString*)filePath;
40    
41     @end
42    
43    
44 masaki 182 @interface XspfMMainWindowController(UKKQueueSupport)
45 masaki 98 - (void)registerToUKKQueue;
46     @end
47    
48 masaki 182 @implementation XspfMMainWindowController
49 masaki 36
50 masaki 182 static XspfMMainWindowController *sharedInstance = nil;
51 masaki 2
52 masaki 182 + (XspfMMainWindowController *)sharedInstance
53 masaki 2 {
54 masaki 8 @synchronized(self) {
55     if (sharedInstance == nil) {
56     [[self alloc] init]; // assignment not done here
57     }
58     }
59     return sharedInstance;
60     }
61    
62     + (id)allocWithZone:(NSZone *)zone
63     {
64     @synchronized(self) {
65     if (sharedInstance == nil) {
66     sharedInstance = [super allocWithZone:zone];
67     return sharedInstance; // assignment and return on first allocation
68     }
69     }
70     return nil; //on subsequent allocation attempts return nil
71     }
72    
73     - (id)copyWithZone:(NSZone *)zone
74     {
75     return self;
76     }
77    
78     - (id)retain
79     {
80     return self;
81     }
82    
83     - (unsigned)retainCount
84     {
85     return UINT_MAX; //denotes an object that cannot be released
86     }
87    
88     - (void)release
89     {
90     //do nothing
91     }
92    
93     - (id)autorelease
94     {
95     return self;
96     }
97    
98    
99     - (id)init
100     {
101     [super initWithWindowNibName:@"MainWindow"];
102    
103 masaki 25 viewControllers = [[NSMutableDictionary alloc] init];
104 masaki 50
105 masaki 8 return self;
106 masaki 2 }
107 masaki 8 - (void)awakeFromNib
108     {
109 masaki 47 static BOOL didSetupOnMainMenu = NO;
110    
111     if(appDelegate && !didSetupOnMainMenu) {
112     didSetupOnMainMenu = YES;
113 masaki 98
114 masaki 185 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
115     [nc addObserver:self
116     selector:@selector(managerDidAddObjects:)
117     name:XspfManagerDidAddXspfObjectsNotification
118     object:appDelegate];
119 masaki 98
120 masaki 49 [self window];
121 masaki 99
122 masaki 47 }
123 masaki 8 }
124 masaki 49 - (void)windowDidLoad
125     {
126 masaki 82 [[self window] setContentBorderThickness:38 forEdge:NSMinYEdge];
127    
128 masaki 49 [self setupXspfLists];
129     [self setupDetailView];
130 masaki 82 [self setupAccessorylView];
131 masaki 50 if(currentListViewType == typeNotSelected) {
132 masaki 180 [self setCurrentListViewType:typeTableView];
133 masaki 50 }
134 masaki 49
135 masaki 50 [self showWindow:nil];
136 masaki 189 [self recalculateKeyViewLoop];
137 masaki 49 }
138 masaki 25 #pragma mark#### KVC ####
139 masaki 8 - (NSManagedObjectContext *)managedObjectContext
140     {
141     return [appDelegate managedObjectContext];
142     }
143 masaki 16 - (NSArrayController *)arrayController
144     {
145     return controller;
146     }
147 masaki 2
148 masaki 25 - (XspfMViewType)currentListViewType
149     {
150     return currentListViewType;
151     }
152     - (void)setCurrentListViewType:(XspfMViewType)newType
153     {
154     if(currentListViewType == newType) return;
155    
156     [self changeViewType:newType];
157     }
158 masaki 16
159 masaki 13 #pragma mark#### Actions ####
160 masaki 10 - (IBAction)openXspf:(id)sender
161     {
162 masaki 115 BOOL isSelected = [[controller valueForKeyPath:@"selectedObjects.@count"] boolValue];
163     if(!isSelected) return;
164    
165 masaki 77 XSPFMXspfObject *rep = [controller valueForKeyPath:@"selection.self"];
166 masaki 101 if(rep.deleted) {
167     NSRunCriticalAlertPanel( NSLocalizedString(@"Xspf is Deleted", @"Xspf is Deleted"),
168     NSLocalizedString(@"\"%@\" is deleted", @"\"%@\" is deleted"),
169     nil, nil, nil, rep.title);
170     return;
171     }
172 masaki 77 [[NSWorkspace sharedWorkspace] openFile:rep.filePath withApplication:@"XspfQT"];
173     rep.lastPlayDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
174 masaki 10 }
175 masaki 2 - (IBAction)add:(id)sender
176     {
177     NSOpenPanel *panel = [NSOpenPanel openPanel];
178    
179     [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]];
180     [panel setAllowsMultipleSelection:YES];
181 masaki 9 [panel setDelegate:self];
182 masaki 2
183     [panel beginSheetForDirectory:nil
184     file:nil
185     types:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]
186 masaki 8 modalForWindow:[self window]
187 masaki 2 modalDelegate:self
188     didEndSelector:@selector(endOpenPanel:::)
189     contextInfo:NULL];
190     }
191 masaki 91 - (IBAction)remove:(id)sender
192     {
193     XSPFMXspfObject *obj = [controller valueForKeyPath:@"selection.self"];
194 masaki 94 [[UKKQueue sharedFileWatcher] removePathFromQueue:obj.filePath];
195 masaki 91 [[self managedObjectContext] deleteObject:obj];
196     }
197 masaki 2
198 masaki 184
199 masaki 106 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
200     {
201     [panel orderOut:nil];
202 masaki 2
203 masaki 106 if(returnCode == NSCancelButton) return;
204    
205     NSArray *URLs = [panel URLs];
206     if([URLs count] == 0) return;
207    
208 masaki 184 [appDelegate registerURLs:URLs];
209 masaki 106 }
210 masaki 182
211 masaki 25 #pragma mark#### Other methods ####
212 masaki 189 - (void)recalculateKeyViewLoop
213     {
214     [searchField setNextKeyView:[libraryViewController firstKeyView]];
215     [libraryViewController setNextKeyView:[listViewController firstKeyView]];
216     [listViewController setNextKeyView:[detailViewController firstKeyView]];
217     [detailViewController setNextKeyView:searchField];
218     }
219 masaki 25 - (void)changeViewType:(XspfMViewType)viewType
220     {
221     if(currentListViewType == viewType) return;
222     currentListViewType = viewType;
223    
224     NSString *className = nil;
225     switch(currentListViewType) {
226     case typeCollectionView:
227     className = @"XspfMCollectionViewController";
228     break;
229     case typeTableView:
230     className = @"XspfMListViewController";
231     break;
232     }
233     if(!className) return;
234    
235 masaki 189 XspfMViewController *targetContorller = [viewControllers objectForKey:className];
236 masaki 25 if(!targetContorller) {
237     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
238     if(!targetContorller) return;
239     [viewControllers setObject:targetContorller forKey:className];
240 masaki 180 [targetContorller view];
241 masaki 30 [targetContorller setRepresentedObject:controller];
242 masaki 189 [targetContorller recalculateKeyViewLoop];
243 masaki 25 }
244 masaki 109
245 masaki 25 [[listViewController view] removeFromSuperview];
246     listViewController = targetContorller;
247     [listView addSubview:[listViewController view]];
248     [[listViewController view] setFrame:[listView bounds]];
249 masaki 189 // [[self window] recalculateKeyViewLoop];
250     [self recalculateKeyViewLoop];
251 masaki 25 }
252 masaki 2
253 masaki 5
254 masaki 43 - (void)setupXspfLists
255 masaki 36 {
256 masaki 47 if(libraryViewController) return;
257    
258 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
259 masaki 37 [libraryViewController setRepresentedObject:listController];
260     [libraryView addSubview:[libraryViewController view]];
261     [[libraryViewController view] setFrame:[libraryView bounds]];
262 masaki 189 [libraryViewController recalculateKeyViewLoop];
263 masaki 36 }
264 masaki 47 - (void)setupDetailView
265 masaki 6 {
266 masaki 47 if(detailViewController) return;
267 masaki 6
268 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
269     [detailViewController setRepresentedObject:controller];
270     [detailView addSubview:[detailViewController view]];
271     [[detailViewController view] setFrame:[detailView bounds]];
272 masaki 189 [detailViewController recalculateKeyViewLoop];
273 masaki 6 }
274 masaki 82 - (void)setupAccessorylView
275     {
276     if(accessoryViewController) return;
277    
278     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
279     [accessoryViewController setRepresentedObject:[appDelegate channel]];
280     [accessoryView addSubview:[accessoryViewController view]];
281     [[accessoryViewController view] setFrame:[accessoryView bounds]];
282 masaki 189 // [accessoryViewController recalculateKeyViewLoop];
283 masaki 82 }
284 masaki 8 #pragma mark#### NSWidnow Delegate ####
285     /**
286     Returns the NSUndoManager for the application. In this case, the manager
287     returned is that of the managed object context for the application.
288     */
289 masaki 6
290 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
291     return [[appDelegate managedObjectContext] undoManager];
292     }
293    
294 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
295     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
296     {
297 masaki 184 return ![appDelegate didRegisteredURL:[NSURL fileURLWithPath:filename]];
298 masaki 9 }
299    
300 masaki 185 #pragma mark#### XspfManager Notifications ####
301     - (void)managerDidAddObjects:(NSNotification *)notification
302     {
303     id addedObjects = [[notification userInfo] objectForKey:@"XspfManagerAddedXspfObjects"];
304     if(!addedObjects || ![addedObjects isKindOfClass:[NSArray class]] || [addedObjects count] == 0) return;
305    
306     [controller performSelector:@selector(setSelectedObjects:)
307     withObject:addedObjects
308     afterDelay:0.01];
309     }
310    
311 masaki 184 #pragma mark#### Test ####
312     - (IBAction)test01:(id)sender
313     {
314 masaki 187 HMLog(HMLogLevelDebug, @"HMLogLevelDebug");
315     HMLog(HMLogLevelNotice, @"HMLogLevelNotice");
316     HMLog(HMLogLevelCaution, @"HMLogLevelCaution");
317     HMLog(HMLogLevelAlert, @"HMLogLevelAlert");
318     HMLog(HMLogLevelError, @"HMLogLevelError");
319 masaki 184
320 masaki 187 HMLog(HMLogLevelDebug, @"HMLogLevelDebug -> %@", @"DEBUG");
321 masaki 184 }
322     - (IBAction)test02:(id)sender
323     {
324     NSResponder *responder = [[self window] firstResponder];
325     while(responder) {
326 masaki 188 HMLog(HMLogLevelDebug, @"Responder -> %@", responder);
327 masaki 184 responder = [responder nextResponder];
328     }
329     }
330     - (IBAction)test03:(id)sender
331     {
332     id keyView = [[self window] firstResponder];
333     NSView *firstKeyView = keyView;
334     while(keyView) {
335 masaki 188 HMLog(HMLogLevelDebug, @"Keyview -> %@", keyView);
336 masaki 184 keyView = [keyView nextKeyView];
337     if(keyView == firstKeyView) break;
338     }
339    
340 masaki 188 HMLog(HMLogLevelDebug, @"Valid next view -> %@", [firstKeyView nextValidKeyView]);
341 masaki 184 }
342     @end
343    
344     @implementation XspfMMainWindowController(XspfMDeprecated)
345    
346     - (BOOL)didRegisteredURL:(NSURL *)url
347     {
348 masaki 188 HMLog(HMLogLevelError, @"-[%@ %@] is Deprecated.", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
349 masaki 184
350     NSManagedObjectContext *moc = [appDelegate managedObjectContext];
351     NSError *error = nil;
352     NSFetchRequest *fetch;
353     NSInteger num;
354    
355     fetch = [[[NSFetchRequest alloc] init] autorelease];
356     [fetch setEntity:[NSEntityDescription entityForName:@"Xspf" inManagedObjectContext:moc]];
357     NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"urlString LIKE %@", [url absoluteString]];
358     [fetch setPredicate:aPredicate];
359     num = [moc countForFetchRequest:fetch error:&error];
360     if(error) {
361 masaki 188 HMLog(HMLogLevelError, @"%@", [error localizedDescription]);
362 masaki 184 return NO;
363     }
364    
365     return num != 0;
366     }
367 masaki 94 #pragma mark#### UKKQUEUE ####
368 masaki 98 - (void)registerToUKKQueue
369     {
370 masaki 188 HMLog(HMLogLevelError, @"-[%@ %@] is Deprecated.", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
371 masaki 184
372 masaki 98 NSManagedObjectContext *moc = [[NSApp delegate] managedObjectContext];
373     NSError *error = nil;
374 masaki 99 NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
375 masaki 98 [fetch setEntity:[NSEntityDescription entityForName:@"Xspf" inManagedObjectContext:moc]];
376    
377     NSArray *array = [moc executeFetchRequest:fetch error:&error];
378     if(!array) {
379     if(error) {
380 masaki 188 HMLog(HMLogLevelError, @"could not fetch : %@", [error localizedDescription]);
381 masaki 98 }
382 masaki 188 HMLog(HMLogLevelError, @"Could not fetch.");
383 masaki 98 return;
384     }
385    
386 masaki 99 NSFileManager *fm = [NSFileManager defaultManager];
387 masaki 98 UKKQueue *queue = [UKKQueue sharedFileWatcher];
388     for(XSPFMXspfObject *obj in array) {
389 masaki 99 NSString *filePath = obj.filePath;
390     if([fm fileExistsAtPath:filePath]) {
391     [queue addPathToQueue:filePath];
392     } else {
393     obj.deleted = YES;
394     }
395 masaki 98 }
396     }
397 masaki 184 - (XSPFMXspfObject *)registerWithURL:(NSURL *)url
398     {
399 masaki 188 HMLog(HMLogLevelError, @"-[%@ %@] is Deprecated.", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
400 masaki 184
401     if([appDelegate didRegisteredURL:url]) return nil;
402    
403     XSPFMXspfObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Xspf"
404     inManagedObjectContext:[appDelegate managedObjectContext]];
405     if(!obj) return nil;
406    
407     obj.url = url;
408     obj.registerDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
409    
410     // will set in XspfMCheckFileModifiedRequest.
411     // [obj setValue:[NSDate dateWithTimeIntervalSinceNow:0.0] forKey:@"modificationDate"];
412     // [obj setValue:[NSDate dateWithTimeIntervalSinceNow:0.0] forKey:@"creationDate"];
413    
414     id<HMChannel> channel = [appDelegate channel];
415     id<HMRequest> request = [XspfMCheckFileModifiedRequest requestWithObject:obj];
416     [channel putRequest:request];
417     request = [XspfMMovieLoadRequest requestWithObject:obj];
418     [channel putRequest:request];
419    
420     [[UKKQueue sharedFileWatcher] addPathToQueue:obj.filePath];
421    
422     return obj;
423     }
424     - (void)registerFilePaths:(NSArray *)filePaths
425     {
426 masaki 188 HMLog(HMLogLevelError, @"-[%@ %@] is Deprecated.", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
427 masaki 184
428     NSMutableArray *array = [NSMutableArray array];
429    
430     for(NSString *filePath in filePaths) {
431     [array addObject:[NSURL fileURLWithPath:filePath]];
432     }
433    
434     [self registerURLs:array];
435     }
436     - (void)registerURLs:(NSArray *)URLs
437     {
438 masaki 188 HMLog(HMLogLevelError, @"-[%@ %@] is Deprecated.", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
439 masaki 184
440     [progressBar setUsesThreadedAnimation:YES];
441     [progressBar startAnimation:self];
442     [progressMessage setStringValue:@"During register."];
443    
444     [NSApp beginSheet:progressPanel
445     modalForWindow:[self window]
446     modalDelegate:nil
447     didEndSelector:Nil
448     contextInfo:NULL];
449    
450     XSPFMXspfObject *insertedObject = nil;
451     for(id URL in URLs) {
452     insertedObject = [appDelegate registerWithURL:URL];
453     }
454     if(insertedObject) {
455     [controller performSelector:@selector(setSelectedObjects:)
456     withObject:[NSArray arrayWithObject:insertedObject]
457     afterDelay:0.0];
458     }
459    
460     [progressBar stopAnimation:self];
461     [progressPanel orderOut:self];
462     [NSApp endSheet:progressPanel];
463     }
464 masaki 96 -(void) watcher:(id<UKFileWatcher>)kq receivedNotification:(NSString*)notificationName forPath: (NSString*)filePath
465 masaki 94 {
466 masaki 188 HMLog(HMLogLevelError, @"-[%@ %@] is Deprecated.", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
467 masaki 184
468 masaki 94 if(![NSThread isMainThread]) {
469 masaki 188 HMLog(HMLogLevelError, @"there is not main thread.");
470 masaki 94 }
471 masaki 184
472 masaki 94 NSString *fileURL = [[NSURL fileURLWithPath:filePath] absoluteString];
473     NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
474     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"urlString = %@", fileURL];
475     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Xspf"
476     inManagedObjectContext:[self managedObjectContext]];
477     [fetch setPredicate:predicate];
478     [fetch setEntity:entity];
479    
480     NSError *error = nil;
481     NSArray *array = [[self managedObjectContext] executeFetchRequest:fetch error:&error];
482     if(!array) {
483     if(error) {
484 masaki 188 HMLog(HMLogLevelError, @"%@", [error localizedDescription]);
485 masaki 94 }
486 masaki 188 HMLog(HMLogLevelError, @"Could not fetch.");
487 masaki 94 return;
488     }
489     if([array count] == 0) {
490 masaki 188 HMLog(HMLogLevelError, @"Target file is not found.");
491 masaki 94 return;
492     }
493     if([array count] > 1) {
494 masaki 188 HMLog(HMLogLevelError, @"Target found too many!!! (%d).", [array count]);
495 masaki 94 }
496    
497     XSPFMXspfObject *obj = [array objectAtIndex:0];
498     NSString *resolvedPath = [obj.alias resolvedPath];
499    
500 masaki 102 if([UKFileWatcherRenameNotification isEqualToString:notificationName]) {
501     obj.url = [NSURL fileURLWithPath:resolvedPath];
502     [[UKKQueue sharedFileWatcher] removePathFromQueue:filePath];
503     [[UKKQueue sharedFileWatcher] addPathToQueue:obj.filePath];
504     return;
505     }
506    
507     NSFileManager *fm = [NSFileManager defaultManager];
508 masaki 98 if(!resolvedPath) {
509     if(![fm fileExistsAtPath:filePath]) {
510 masaki 94 [[UKKQueue sharedFileWatcher] removePathFromQueue:filePath];
511 masaki 98 obj.deleted = YES;
512 masaki 94 return;
513 masaki 98 } else {
514     obj.alias = [filePath aliasData];
515 masaki 94 }
516     }
517    
518 masaki 102 id attr = [fm fileAttributesAtPath:resolvedPath traverseLink:YES];
519     NSDate *newModDate = [attr fileModificationDate];
520     if(newModDate) {
521     obj.modificationDate = newModDate;
522 masaki 94 }
523 masaki 107 obj.alias = [filePath aliasData];
524 masaki 94 }
525    
526 masaki 2 @end

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