Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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