Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 94 - (hide annotations) (download)
Sun Nov 22 04:21:47 2009 UTC (14 years, 4 months ago) by masaki
Original Path: XspfManager/XspfManager.m
File size: 10895 byte(s)
[New] UKKQueueを追加。Thanks to M. Uli Kusterer.

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 69
21 masaki 94
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 2 @implementation XspfManager
31 masaki 36
32 masaki 8 static XspfManager *sharedInstance = nil;
33 masaki 2
34 masaki 8 + (XspfManager *)sharedInstance
35 masaki 2 {
36 masaki 8 @synchronized(self) {
37     if (sharedInstance == nil) {
38     [[self alloc] init]; // assignment not done here
39     }
40     }
41     return sharedInstance;
42     }
43    
44     + (id)allocWithZone:(NSZone *)zone
45     {
46     @synchronized(self) {
47     if (sharedInstance == nil) {
48     sharedInstance = [super allocWithZone:zone];
49     return sharedInstance; // assignment and return on first allocation
50     }
51     }
52     return nil; //on subsequent allocation attempts return nil
53     }
54    
55     - (id)copyWithZone:(NSZone *)zone
56     {
57     return self;
58     }
59    
60     - (id)retain
61     {
62     return self;
63     }
64    
65     - (unsigned)retainCount
66     {
67     return UINT_MAX; //denotes an object that cannot be released
68     }
69    
70     - (void)release
71     {
72     //do nothing
73     }
74    
75     - (id)autorelease
76     {
77     return self;
78     }
79    
80    
81     - (id)init
82     {
83     [super initWithWindowNibName:@"MainWindow"];
84    
85 masaki 25 viewControllers = [[NSMutableDictionary alloc] init];
86 masaki 94
87     NSNotificationCenter *nc = [[NSWorkspace sharedWorkspace] notificationCenter];
88     UKKQueue *queue = [UKKQueue sharedFileWatcher];
89     [nc addObserver:self selector:@selector(ukkqueueFileModified:) name:nil object:queue];
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 49 [self window];
100 masaki 47 }
101 masaki 8 }
102 masaki 49 - (void)windowDidLoad
103     {
104 masaki 82 [[self window] setContentBorderThickness:38 forEdge:NSMinYEdge];
105    
106 masaki 49 [self setupXspfLists];
107     [self setupDetailView];
108 masaki 82 [self setupAccessorylView];
109 masaki 50 if(currentListViewType == typeNotSelected) {
110     [self setCurrentListViewType:typeCollectionView];
111     }
112 masaki 49
113 masaki 50 [self showWindow:nil];
114 masaki 49 }
115 masaki 25 #pragma mark#### KVC ####
116 masaki 8 - (NSManagedObjectContext *)managedObjectContext
117     {
118     return [appDelegate managedObjectContext];
119     }
120 masaki 16 - (NSArrayController *)arrayController
121     {
122     return controller;
123     }
124 masaki 2
125 masaki 25 - (XspfMViewType)currentListViewType
126     {
127     return currentListViewType;
128     }
129     - (void)setCurrentListViewType:(XspfMViewType)newType
130     {
131     if(currentListViewType == newType) return;
132    
133     [self changeViewType:newType];
134     }
135 masaki 16
136 masaki 13 #pragma mark#### Actions ####
137 masaki 10 - (IBAction)openXspf:(id)sender
138     {
139 masaki 77 XSPFMXspfObject *rep = [controller valueForKeyPath:@"selection.self"];
140     [[NSWorkspace sharedWorkspace] openFile:rep.filePath withApplication:@"XspfQT"];
141     rep.lastPlayDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
142 masaki 10 }
143 masaki 2 - (IBAction)add:(id)sender
144     {
145     NSOpenPanel *panel = [NSOpenPanel openPanel];
146    
147     [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]];
148     [panel setAllowsMultipleSelection:YES];
149 masaki 9 [panel setDelegate:self];
150 masaki 2
151     [panel beginSheetForDirectory:nil
152     file:nil
153     types:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]
154 masaki 8 modalForWindow:[self window]
155 masaki 2 modalDelegate:self
156     didEndSelector:@selector(endOpenPanel:::)
157     contextInfo:NULL];
158     }
159 masaki 91 - (IBAction)remove:(id)sender
160     {
161     XSPFMXspfObject *obj = [controller valueForKeyPath:@"selection.self"];
162 masaki 94 [[UKKQueue sharedFileWatcher] removePathFromQueue:obj.filePath];
163 masaki 91 [[self managedObjectContext] deleteObject:obj];
164     }
165 masaki 2
166 masaki 13 - (NSInteger)registerWithURL:(NSURL *)url
167     {
168 masaki 77 XSPFMXspfObject *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Xspf"
169     inManagedObjectContext:[appDelegate managedObjectContext]];
170 masaki 13 if(!obj) return 1;
171    
172 masaki 77 obj.url = url;
173     obj.registerDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
174 masaki 13
175 masaki 79 // will set in XspfMCheckFileModifiedRequest.
176 masaki 35 // [obj setValue:[NSDate dateWithTimeIntervalSinceNow:0.0] forKey:@"modificationDate"];
177     // [obj setValue:[NSDate dateWithTimeIntervalSinceNow:0.0] forKey:@"creationDate"];
178 masaki 33
179 masaki 54 id<HMChannel> channel = [appDelegate channel];
180 masaki 50 id<HMRequest> request = [XspfMCheckFileModifiedRequest requestWithObject:obj url:url];
181 masaki 13 [channel putRequest:request];
182 masaki 50 request = [XspfMMovieLoadRequest requestWithObject:obj url:url];
183     [channel putRequest:request];
184 masaki 13
185 masaki 94 [[UKKQueue sharedFileWatcher] addPathToQueue:obj.filePath];
186    
187 masaki 13 return noErr;
188     }
189 masaki 2 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
190     {
191 masaki 9 [panel orderOut:nil];
192    
193 masaki 2 if(returnCode == NSCancelButton) return;
194    
195     NSArray *URLs = [panel URLs];
196     if([URLs count] == 0) return;
197    
198     [progressBar setUsesThreadedAnimation:YES];
199 masaki 82 [progressBar startAnimation:self];
200     [progressMessage setStringValue:@"During register."];
201 masaki 2
202     [NSApp beginSheet:progressPanel
203 masaki 8 modalForWindow:[self window]
204 masaki 2 modalDelegate:nil
205     didEndSelector:Nil
206     contextInfo:NULL];
207    
208     for(id URL in URLs) {
209     [self registerWithURL:URL];
210     }
211    
212     [progressBar stopAnimation:self];
213     [progressPanel orderOut:self];
214     [NSApp endSheet:progressPanel];
215     }
216    
217 masaki 25 #pragma mark#### Other methods ####
218     - (void)changeViewType:(XspfMViewType)viewType
219     {
220     if(currentListViewType == viewType) return;
221     currentListViewType = viewType;
222    
223     NSString *className = nil;
224     switch(currentListViewType) {
225     case typeCollectionView:
226     className = @"XspfMCollectionViewController";
227     break;
228     case typeTableView:
229     className = @"XspfMListViewController";
230     break;
231     }
232     if(!className) return;
233    
234     NSViewController *targetContorller = [viewControllers objectForKey:className];
235     if(!targetContorller) {
236     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
237     if(!targetContorller) return;
238     [viewControllers setObject:targetContorller forKey:className];
239 masaki 30 [targetContorller setRepresentedObject:controller];
240 masaki 25 }
241 masaki 79
242 masaki 25 [[listViewController view] removeFromSuperview];
243     listViewController = targetContorller;
244     [listView addSubview:[listViewController view]];
245     [[listViewController view] setFrame:[listView bounds]];
246     }
247 masaki 2
248 masaki 5
249 masaki 43 - (void)setupXspfLists
250 masaki 36 {
251 masaki 47 if(libraryViewController) return;
252    
253 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
254 masaki 37 [libraryViewController setRepresentedObject:listController];
255     [libraryView addSubview:[libraryViewController view]];
256     [[libraryViewController view] setFrame:[libraryView bounds]];
257 masaki 36 }
258 masaki 47 - (void)setupDetailView
259 masaki 6 {
260 masaki 47 if(detailViewController) return;
261 masaki 6
262 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
263     [detailViewController setRepresentedObject:controller];
264     [detailView addSubview:[detailViewController view]];
265     [[detailViewController view] setFrame:[detailView bounds]];
266 masaki 6 }
267 masaki 82 - (void)setupAccessorylView
268     {
269     if(accessoryViewController) return;
270    
271     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
272     [accessoryViewController setRepresentedObject:[appDelegate channel]];
273     [accessoryView addSubview:[accessoryViewController view]];
274     [[accessoryViewController view] setFrame:[accessoryView bounds]];
275     }
276 masaki 8 #pragma mark#### NSWidnow Delegate ####
277     /**
278     Returns the NSUndoManager for the application. In this case, the manager
279     returned is that of the managed object context for the application.
280     */
281 masaki 6
282 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
283     return [[appDelegate managedObjectContext] undoManager];
284     }
285    
286 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
287     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
288     {
289     NSManagedObjectContext *moc = [appDelegate managedObjectContext];
290     NSError *error = nil;
291     NSFetchRequest *fetch;
292     NSInteger num;
293     NSURL *url = [NSURL fileURLWithPath:filename];
294    
295     fetch = [[[NSFetchRequest alloc] init] autorelease];
296     [fetch setEntity:[NSEntityDescription entityForName:@"Xspf" inManagedObjectContext:moc]];
297 masaki 16 NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"urlString LIKE %@", [url absoluteString]];
298     [fetch setPredicate:aPredicate];
299 masaki 9 num = [moc countForFetchRequest:fetch error:&error];
300     if(error) {
301     NSLog(@"%@", [error localizedDescription]);
302     return NO;
303     }
304    
305     return num == 0;
306     }
307    
308 masaki 94 #pragma mark#### UKKQUEUE ####
309     - (void)ukkqueueFileModified:(NSNotification *)notification
310     {
311     NSLog(@"UKKQueue notification. %@", notification);
312     if(![NSThread isMainThread]) {
313     NSLog(@"there is not main thread.");
314     }
315    
316     NSString *notificationName = [notification name];
317    
318     NSString *filePath = [[notification userInfo] objectForKey:@"path"];
319     NSString *fileURL = [[NSURL fileURLWithPath:filePath] absoluteString];
320     NSFetchRequest *fetch = [[[NSFetchRequest alloc] init] autorelease];
321     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"urlString = %@", fileURL];
322     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Xspf"
323     inManagedObjectContext:[self managedObjectContext]];
324     [fetch setPredicate:predicate];
325     [fetch setEntity:entity];
326    
327     NSError *error = nil;
328     NSArray *array = [[self managedObjectContext] executeFetchRequest:fetch error:&error];
329     if(!array) {
330     if(error) {
331     NSLog(@"%@", [error localizedDescription]);
332     }
333     NSLog(@"Could not fetch.");
334     return;
335     }
336     if([array count] == 0) {
337     NSLog(@"Target file is not found.");
338     return;
339     }
340     if([array count] > 1) {
341     NSLog(@"Target found too many!!! (%d).", [array count]);
342     }
343    
344     XSPFMXspfObject *obj = [array objectAtIndex:0];
345     NSString *resolvedPath = [obj.alias resolvedPath];
346    
347     if(obj.deleted) {
348     if(!resolvedPath) {
349     NSLog(@"object already deleted.");
350     [[UKKQueue sharedFileWatcher] removePathFromQueue:filePath];
351     return;
352     }
353     // NSLog(@"What is happen???");
354     [[UKKQueue sharedFileWatcher] addPathToQueue:obj.filePath];
355     obj.deleted = NO;
356     }
357    
358     if([UKFileWatcherDeleteNotification isEqualToString:notificationName]) {
359     [[UKKQueue sharedFileWatcher] removePathFromQueue:filePath];
360     obj.deleted = YES;
361     return;
362     }
363    
364     if(![resolvedPath isEqualToString:filePath]) {
365     NSLog(@"resolvedPath is not filePath. resolvedPath is %@. notification is %@. ", resolvedPath, notificationName);
366     return;
367     }
368    
369     NSLog(@"checking file.");
370     id<HMChannel> channel = [appDelegate channel];
371     id<HMRequest> request = [XspfMCheckFileModifiedRequest requestWithObject:obj url:[NSURL fileURLWithPath:filePath]];
372     [channel putRequest:request];
373     request = [XspfMMovieLoadRequest requestWithObject:obj url:[NSURL fileURLWithPath:filePath]];
374     [channel putRequest:request];
375     }
376    
377 masaki 5 #pragma mark#### Test ####
378 masaki 2 - (IBAction)test01:(id)sender
379     {
380 masaki 47 //
381 masaki 2 }
382     - (IBAction)test02:(id)sender
383     {
384 masaki 10 NSResponder *responder = [[self window] firstResponder];
385     while(responder) {
386     NSLog(@"Responder -> %@", responder);
387     responder = [responder nextResponder];
388     }
389 masaki 2 }
390     - (IBAction)test03:(id)sender
391     {
392    
393     id moc = [appDelegate managedObjectContext];
394    
395 masaki 54 NSLog(@"Updated count -> %d", [[moc updatedObjects] count]);
396 masaki 2 }
397     @end

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