Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 99 - (hide annotations) (download)
Sun Nov 22 15:30:31 2009 UTC (14 years, 4 months ago) by masaki
Original Path: XspfManager/XspfManager.m
File size: 12103 byte(s)
[New] 起動時に登録されているファイルの存在確認と、UKKQueueへの登録をするようにした。
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     [[NSWorkspace sharedWorkspace] openFile:rep.filePath withApplication:@"XspfQT"];
147     rep.lastPlayDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
148 masaki 10 }
149 masaki 2 - (IBAction)add:(id)sender
150     {
151     NSOpenPanel *panel = [NSOpenPanel openPanel];
152    
153     [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]];
154     [panel setAllowsMultipleSelection:YES];
155 masaki 9 [panel setDelegate:self];
156 masaki 2
157     [panel beginSheetForDirectory:nil
158     file:nil
159     types:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]
160 masaki 8 modalForWindow:[self window]
161 masaki 2 modalDelegate:self
162     didEndSelector:@selector(endOpenPanel:::)
163     contextInfo:NULL];
164     }
165 masaki 91 - (IBAction)remove:(id)sender
166     {
167     XSPFMXspfObject *obj = [controller valueForKeyPath:@"selection.self"];
168 masaki 94 [[UKKQueue sharedFileWatcher] removePathFromQueue:obj.filePath];
169 masaki 91 [[self managedObjectContext] deleteObject:obj];
170     }
171 masaki 2
172 masaki 13 - (NSInteger)registerWithURL:(NSURL *)url
173     {
174 masaki 77 XSPFMXspfObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Xspf"
175     inManagedObjectContext:[appDelegate managedObjectContext]];
176 masaki 13 if(!obj) return 1;
177    
178 masaki 77 obj.url = url;
179     obj.registerDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
180 masaki 13
181 masaki 79 // will set in XspfMCheckFileModifiedRequest.
182 masaki 35 // [obj setValue:[NSDate dateWithTimeIntervalSinceNow:0.0] forKey:@"modificationDate"];
183     // [obj setValue:[NSDate dateWithTimeIntervalSinceNow:0.0] forKey:@"creationDate"];
184 masaki 33
185 masaki 54 id<HMChannel> channel = [appDelegate channel];
186 masaki 96 id<HMRequest> request = [XspfMCheckFileModifiedRequest requestWithObject:obj];
187 masaki 13 [channel putRequest:request];
188 masaki 96 request = [XspfMMovieLoadRequest requestWithObject:obj];
189 masaki 50 [channel putRequest:request];
190 masaki 13
191 masaki 94 [[UKKQueue sharedFileWatcher] addPathToQueue:obj.filePath];
192    
193 masaki 13 return noErr;
194     }
195 masaki 2 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
196     {
197 masaki 9 [panel orderOut:nil];
198    
199 masaki 2 if(returnCode == NSCancelButton) return;
200    
201     NSArray *URLs = [panel URLs];
202     if([URLs count] == 0) return;
203    
204     [progressBar setUsesThreadedAnimation:YES];
205 masaki 82 [progressBar startAnimation:self];
206     [progressMessage setStringValue:@"During register."];
207 masaki 2
208     [NSApp beginSheet:progressPanel
209 masaki 8 modalForWindow:[self window]
210 masaki 2 modalDelegate:nil
211     didEndSelector:Nil
212     contextInfo:NULL];
213    
214     for(id URL in URLs) {
215     [self registerWithURL:URL];
216     }
217    
218     [progressBar stopAnimation:self];
219     [progressPanel orderOut:self];
220     [NSApp endSheet:progressPanel];
221     }
222    
223 masaki 25 #pragma mark#### Other methods ####
224     - (void)changeViewType:(XspfMViewType)viewType
225     {
226     if(currentListViewType == viewType) return;
227     currentListViewType = viewType;
228    
229     NSString *className = nil;
230     switch(currentListViewType) {
231     case typeCollectionView:
232     className = @"XspfMCollectionViewController";
233     break;
234     case typeTableView:
235     className = @"XspfMListViewController";
236     break;
237     }
238     if(!className) return;
239    
240     NSViewController *targetContorller = [viewControllers objectForKey:className];
241     if(!targetContorller) {
242     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
243     if(!targetContorller) return;
244     [viewControllers setObject:targetContorller forKey:className];
245 masaki 30 [targetContorller setRepresentedObject:controller];
246 masaki 25 }
247 masaki 79
248 masaki 25 [[listViewController view] removeFromSuperview];
249     listViewController = targetContorller;
250     [listView addSubview:[listViewController view]];
251     [[listViewController view] setFrame:[listView bounds]];
252     }
253 masaki 2
254 masaki 5
255 masaki 43 - (void)setupXspfLists
256 masaki 36 {
257 masaki 47 if(libraryViewController) return;
258    
259 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
260 masaki 37 [libraryViewController setRepresentedObject:listController];
261     [libraryView addSubview:[libraryViewController view]];
262     [[libraryViewController view] setFrame:[libraryView bounds]];
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 6 }
273 masaki 82 - (void)setupAccessorylView
274     {
275     if(accessoryViewController) return;
276    
277     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
278     [accessoryViewController setRepresentedObject:[appDelegate channel]];
279     [accessoryView addSubview:[accessoryViewController view]];
280     [[accessoryViewController view] setFrame:[accessoryView bounds]];
281     }
282 masaki 8 #pragma mark#### NSWidnow Delegate ####
283     /**
284     Returns the NSUndoManager for the application. In this case, the manager
285     returned is that of the managed object context for the application.
286     */
287 masaki 6
288 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
289     return [[appDelegate managedObjectContext] undoManager];
290     }
291    
292 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
293     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
294     {
295     NSManagedObjectContext *moc = [appDelegate managedObjectContext];
296     NSError *error = nil;
297     NSFetchRequest *fetch;
298     NSInteger num;
299     NSURL *url = [NSURL fileURLWithPath:filename];
300    
301     fetch = [[[NSFetchRequest alloc] init] autorelease];
302     [fetch setEntity:[NSEntityDescription entityForName:@"Xspf" inManagedObjectContext:moc]];
303 masaki 16 NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"urlString LIKE %@", [url absoluteString]];
304     [fetch setPredicate:aPredicate];
305 masaki 9 num = [moc countForFetchRequest:fetch error:&error];
306     if(error) {
307     NSLog(@"%@", [error localizedDescription]);
308     return NO;
309     }
310    
311     return num == 0;
312     }
313    
314 masaki 94 #pragma mark#### UKKQUEUE ####
315 masaki 98 - (void)registerToUKKQueue
316     {
317     NSManagedObjectContext *moc = [[NSApp delegate] managedObjectContext];
318     NSError *error = nil;
319 masaki 99 NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
320 masaki 98 [fetch setEntity:[NSEntityDescription entityForName:@"Xspf" inManagedObjectContext:moc]];
321    
322     NSArray *array = [moc executeFetchRequest:fetch error:&error];
323     if(!array) {
324     if(error) {
325 masaki 99 NSLog(@"could not fetch : %@", [error localizedDescription]);
326 masaki 98 }
327     NSLog(@"Could not fetch.");
328     return;
329     }
330    
331 masaki 99 NSFileManager *fm = [NSFileManager defaultManager];
332 masaki 98 UKKQueue *queue = [UKKQueue sharedFileWatcher];
333     for(XSPFMXspfObject *obj in array) {
334 masaki 99 NSString *filePath = obj.filePath;
335     if([fm fileExistsAtPath:filePath]) {
336     [queue addPathToQueue:filePath];
337     } else {
338     obj.deleted = YES;
339     }
340 masaki 98 }
341     }
342    
343 masaki 96 -(void) watcher:(id<UKFileWatcher>)kq receivedNotification:(NSString*)notificationName forPath: (NSString*)filePath
344 masaki 94 {
345 masaki 96 NSLog(@"UKKQueue notification. %@", notificationName);
346 masaki 94 if(![NSThread isMainThread]) {
347     NSLog(@"there is not main thread.");
348     }
349 masaki 96
350 masaki 94 NSString *fileURL = [[NSURL fileURLWithPath:filePath] absoluteString];
351     NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
352     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"urlString = %@", fileURL];
353     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Xspf"
354     inManagedObjectContext:[self managedObjectContext]];
355     [fetch setPredicate:predicate];
356     [fetch setEntity:entity];
357    
358     NSError *error = nil;
359     NSArray *array = [[self managedObjectContext] executeFetchRequest:fetch error:&error];
360     if(!array) {
361     if(error) {
362     NSLog(@"%@", [error localizedDescription]);
363     }
364     NSLog(@"Could not fetch.");
365     return;
366     }
367     if([array count] == 0) {
368     NSLog(@"Target file is not found.");
369     return;
370     }
371     if([array count] > 1) {
372     NSLog(@"Target found too many!!! (%d).", [array count]);
373     }
374    
375 masaki 98 sleep(0.2);
376 masaki 94 XSPFMXspfObject *obj = [array objectAtIndex:0];
377     NSString *resolvedPath = [obj.alias resolvedPath];
378    
379 masaki 98 if(!resolvedPath) {
380     NSFileManager *fm = [NSFileManager defaultManager];
381     if(![fm fileExistsAtPath:filePath]) {
382     NSLog(@"object already deleted. (%@)", filePath);
383 masaki 94 [[UKKQueue sharedFileWatcher] removePathFromQueue:filePath];
384 masaki 98 obj.deleted = YES;
385 masaki 94 return;
386 masaki 98 } else {
387     obj.alias = [filePath aliasData];
388 masaki 94 }
389     }
390    
391 masaki 98 // if([UKFileWatcherDeleteNotification isEqualToString:notificationName]) {
392     // NSLog(@"File(%@) deleted", filePath);
393     // [[UKKQueue sharedFileWatcher] removePathFromQueue:filePath];
394     // obj.deleted = YES;
395     // return;
396     // }
397 masaki 94
398 masaki 96 if([UKFileWatcherRenameNotification isEqualToString:notificationName]) {
399     NSLog(@"File(%@) renamed", filePath);
400     obj.url = [NSURL fileURLWithPath:resolvedPath];
401     [[UKKQueue sharedFileWatcher] removePathFromQueue:filePath];
402     [[UKKQueue sharedFileWatcher] addPathToQueue:obj.filePath];
403 masaki 94 return;
404     }
405    
406 masaki 98 if([UKFileWatcherAttributeChangeNotification isEqualToString:notificationName]) {
407     NSLog(@"checking file.");
408    
409     [[UKKQueue sharedFileWatcher] removePathFromQueue:filePath];
410     [[UKKQueue sharedFileWatcher] addPathToQueue:obj.filePath];
411     obj.alias = [obj.filePath aliasData];
412    
413     id<HMChannel> channel = [appDelegate channel];
414     id<HMRequest> request = [XspfMCheckFileModifiedRequest requestWithObject:obj];
415     [channel putRequest:request];
416     request = [XspfMMovieLoadRequest requestWithObject:obj];
417     [channel putRequest:request];
418     }
419 masaki 94 }
420    
421 masaki 5 #pragma mark#### Test ####
422 masaki 2 - (IBAction)test01:(id)sender
423     {
424 masaki 47 //
425 masaki 2 }
426     - (IBAction)test02:(id)sender
427     {
428 masaki 10 NSResponder *responder = [[self window] firstResponder];
429     while(responder) {
430     NSLog(@"Responder -> %@", responder);
431     responder = [responder nextResponder];
432     }
433 masaki 2 }
434     - (IBAction)test03:(id)sender
435     {
436    
437     id moc = [appDelegate managedObjectContext];
438    
439 masaki 54 NSLog(@"Updated count -> %d", [[moc updatedObjects] count]);
440 masaki 2 }
441     @end

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