Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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