Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 101 - (hide annotations) (download)
Mon Nov 23 00:54:55 2009 UTC (14 years, 4 months ago) by masaki
Original Path: XspfManager/XspfManager.m
File size: 12330 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     #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 13 - (NSInteger)registerWithURL:(NSURL *)url
179     {
180 masaki 77 XSPFMXspfObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Xspf"
181     inManagedObjectContext:[appDelegate managedObjectContext]];
182 masaki 13 if(!obj) return 1;
183    
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 13 return noErr;
200     }
201 masaki 2 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
202     {
203 masaki 9 [panel orderOut:nil];
204    
205 masaki 2 if(returnCode == NSCancelButton) return;
206    
207     NSArray *URLs = [panel URLs];
208     if([URLs count] == 0) return;
209    
210     [progressBar setUsesThreadedAnimation:YES];
211 masaki 82 [progressBar startAnimation:self];
212     [progressMessage setStringValue:@"During register."];
213 masaki 2
214     [NSApp beginSheet:progressPanel
215 masaki 8 modalForWindow:[self window]
216 masaki 2 modalDelegate:nil
217     didEndSelector:Nil
218     contextInfo:NULL];
219    
220     for(id URL in URLs) {
221     [self registerWithURL:URL];
222     }
223    
224     [progressBar stopAnimation:self];
225     [progressPanel orderOut:self];
226     [NSApp endSheet:progressPanel];
227     }
228    
229 masaki 25 #pragma mark#### Other methods ####
230     - (void)changeViewType:(XspfMViewType)viewType
231     {
232     if(currentListViewType == viewType) return;
233     currentListViewType = viewType;
234    
235     NSString *className = nil;
236     switch(currentListViewType) {
237     case typeCollectionView:
238     className = @"XspfMCollectionViewController";
239     break;
240     case typeTableView:
241     className = @"XspfMListViewController";
242     break;
243     }
244     if(!className) return;
245    
246     NSViewController *targetContorller = [viewControllers objectForKey:className];
247     if(!targetContorller) {
248     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
249     if(!targetContorller) return;
250     [viewControllers setObject:targetContorller forKey:className];
251 masaki 30 [targetContorller setRepresentedObject:controller];
252 masaki 25 }
253 masaki 79
254 masaki 25 [[listViewController view] removeFromSuperview];
255     listViewController = targetContorller;
256     [listView addSubview:[listViewController view]];
257     [[listViewController view] setFrame:[listView bounds]];
258     }
259 masaki 2
260 masaki 5
261 masaki 43 - (void)setupXspfLists
262 masaki 36 {
263 masaki 47 if(libraryViewController) return;
264    
265 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
266 masaki 37 [libraryViewController setRepresentedObject:listController];
267     [libraryView addSubview:[libraryViewController view]];
268     [[libraryViewController view] setFrame:[libraryView bounds]];
269 masaki 36 }
270 masaki 47 - (void)setupDetailView
271 masaki 6 {
272 masaki 47 if(detailViewController) return;
273 masaki 6
274 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
275     [detailViewController setRepresentedObject:controller];
276     [detailView addSubview:[detailViewController view]];
277     [[detailViewController view] setFrame:[detailView bounds]];
278 masaki 6 }
279 masaki 82 - (void)setupAccessorylView
280     {
281     if(accessoryViewController) return;
282    
283     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
284     [accessoryViewController setRepresentedObject:[appDelegate channel]];
285     [accessoryView addSubview:[accessoryViewController view]];
286     [[accessoryViewController view] setFrame:[accessoryView bounds]];
287     }
288 masaki 8 #pragma mark#### NSWidnow Delegate ####
289     /**
290     Returns the NSUndoManager for the application. In this case, the manager
291     returned is that of the managed object context for the application.
292     */
293 masaki 6
294 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
295     return [[appDelegate managedObjectContext] undoManager];
296     }
297    
298 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
299     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
300     {
301     NSManagedObjectContext *moc = [appDelegate managedObjectContext];
302     NSError *error = nil;
303     NSFetchRequest *fetch;
304     NSInteger num;
305     NSURL *url = [NSURL fileURLWithPath:filename];
306    
307     fetch = [[[NSFetchRequest alloc] init] autorelease];
308     [fetch setEntity:[NSEntityDescription entityForName:@"Xspf" inManagedObjectContext:moc]];
309 masaki 16 NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"urlString LIKE %@", [url absoluteString]];
310     [fetch setPredicate:aPredicate];
311 masaki 9 num = [moc countForFetchRequest:fetch error:&error];
312     if(error) {
313     NSLog(@"%@", [error localizedDescription]);
314     return NO;
315     }
316    
317     return num == 0;
318     }
319    
320 masaki 94 #pragma mark#### UKKQUEUE ####
321 masaki 98 - (void)registerToUKKQueue
322     {
323     NSManagedObjectContext *moc = [[NSApp delegate] managedObjectContext];
324     NSError *error = nil;
325 masaki 99 NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
326 masaki 98 [fetch setEntity:[NSEntityDescription entityForName:@"Xspf" inManagedObjectContext:moc]];
327    
328     NSArray *array = [moc executeFetchRequest:fetch error:&error];
329     if(!array) {
330     if(error) {
331 masaki 99 NSLog(@"could not fetch : %@", [error localizedDescription]);
332 masaki 98 }
333     NSLog(@"Could not fetch.");
334     return;
335     }
336    
337 masaki 99 NSFileManager *fm = [NSFileManager defaultManager];
338 masaki 98 UKKQueue *queue = [UKKQueue sharedFileWatcher];
339     for(XSPFMXspfObject *obj in array) {
340 masaki 99 NSString *filePath = obj.filePath;
341     if([fm fileExistsAtPath:filePath]) {
342     [queue addPathToQueue:filePath];
343     } else {
344     obj.deleted = YES;
345     }
346 masaki 98 }
347     }
348    
349 masaki 96 -(void) watcher:(id<UKFileWatcher>)kq receivedNotification:(NSString*)notificationName forPath: (NSString*)filePath
350 masaki 94 {
351 masaki 96 NSLog(@"UKKQueue notification. %@", notificationName);
352 masaki 94 if(![NSThread isMainThread]) {
353     NSLog(@"there is not main thread.");
354     }
355 masaki 96
356 masaki 94 NSString *fileURL = [[NSURL fileURLWithPath:filePath] absoluteString];
357     NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
358     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"urlString = %@", fileURL];
359     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Xspf"
360     inManagedObjectContext:[self managedObjectContext]];
361     [fetch setPredicate:predicate];
362     [fetch setEntity:entity];
363    
364     NSError *error = nil;
365     NSArray *array = [[self managedObjectContext] executeFetchRequest:fetch error:&error];
366     if(!array) {
367     if(error) {
368     NSLog(@"%@", [error localizedDescription]);
369     }
370     NSLog(@"Could not fetch.");
371     return;
372     }
373     if([array count] == 0) {
374     NSLog(@"Target file is not found.");
375     return;
376     }
377     if([array count] > 1) {
378     NSLog(@"Target found too many!!! (%d).", [array count]);
379     }
380    
381 masaki 98 sleep(0.2);
382 masaki 94 XSPFMXspfObject *obj = [array objectAtIndex:0];
383     NSString *resolvedPath = [obj.alias resolvedPath];
384    
385 masaki 98 if(!resolvedPath) {
386     NSFileManager *fm = [NSFileManager defaultManager];
387     if(![fm fileExistsAtPath:filePath]) {
388     NSLog(@"object already deleted. (%@)", filePath);
389 masaki 94 [[UKKQueue sharedFileWatcher] removePathFromQueue:filePath];
390 masaki 98 obj.deleted = YES;
391 masaki 94 return;
392 masaki 98 } else {
393     obj.alias = [filePath aliasData];
394 masaki 94 }
395     }
396    
397 masaki 98 // if([UKFileWatcherDeleteNotification isEqualToString:notificationName]) {
398     // NSLog(@"File(%@) deleted", filePath);
399     // [[UKKQueue sharedFileWatcher] removePathFromQueue:filePath];
400     // obj.deleted = YES;
401     // return;
402     // }
403 masaki 94
404 masaki 96 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 masaki 94 return;
410     }
411    
412 masaki 98 if([UKFileWatcherAttributeChangeNotification isEqualToString:notificationName]) {
413     NSLog(@"checking file.");
414    
415     [[UKKQueue sharedFileWatcher] removePathFromQueue:filePath];
416     [[UKKQueue sharedFileWatcher] addPathToQueue:obj.filePath];
417     obj.alias = [obj.filePath aliasData];
418    
419     id<HMChannel> channel = [appDelegate channel];
420     id<HMRequest> request = [XspfMCheckFileModifiedRequest requestWithObject:obj];
421     [channel putRequest:request];
422     request = [XspfMMovieLoadRequest requestWithObject:obj];
423     [channel putRequest:request];
424     }
425 masaki 94 }
426    
427 masaki 5 #pragma mark#### Test ####
428 masaki 2 - (IBAction)test01:(id)sender
429     {
430 masaki 47 //
431 masaki 2 }
432     - (IBAction)test02:(id)sender
433     {
434 masaki 10 NSResponder *responder = [[self window] firstResponder];
435     while(responder) {
436     NSLog(@"Responder -> %@", responder);
437     responder = [responder nextResponder];
438     }
439 masaki 2 }
440     - (IBAction)test03:(id)sender
441     {
442    
443     id moc = [appDelegate managedObjectContext];
444    
445 masaki 54 NSLog(@"Updated count -> %d", [[moc updatedObjects] count]);
446 masaki 2 }
447     @end

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