Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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