Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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