Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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