Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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