Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 198 - (hide annotations) (download)
Sun Jan 3 14:23:38 2010 UTC (14 years, 3 months ago) by masaki
File size: 12597 byte(s)
[Mod] deprecatedなメソッドを削除。
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 masaki 182 #import "XspfMMainWindowController.h"
10 masaki 2
11     #import "XspfMMovieLoadRequest.h"
12 masaki 198 //#import "XspfMCheckFileModifiedRequest.h"
13 masaki 2
14 masaki 189 #import "XspfMViewController.h"
15 masaki 41 #import "XspfMLibraryViewController.h"
16 masaki 16 #import "XspfMCollectionViewController.h"
17 masaki 25 #import "XspfMListViewController.h"
18 masaki 47 #import "XspfMDetailViewController.h"
19 masaki 2
20 masaki 193 #import "XspfMDragControl.h"
21    
22 masaki 94 #import "UKKQueue.h"
23 masaki 69
24 masaki 182 @interface XspfMMainWindowController(HMPrivate)
25 masaki 43 - (void)setupXspfLists;
26 masaki 47 - (void)setupDetailView;
27 masaki 82 - (void)setupAccessorylView;
28 masaki 25 - (void)changeViewType:(XspfMViewType)newType;
29     - (void)setCurrentListViewType:(XspfMViewType)newType;
30 masaki 189 - (void)recalculateKeyViewLoop;
31 masaki 16 @end
32    
33 masaki 184
34 masaki 182 @implementation XspfMMainWindowController
35 masaki 36
36 masaki 182 static XspfMMainWindowController *sharedInstance = nil;
37 masaki 2
38 masaki 182 + (XspfMMainWindowController *)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 masaki 185 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
101     [nc addObserver:self
102     selector:@selector(managerDidAddObjects:)
103     name:XspfManagerDidAddXspfObjectsNotification
104     object:appDelegate];
105 masaki 98
106 masaki 49 [self window];
107 masaki 99
108 masaki 47 }
109 masaki 8 }
110 masaki 49 - (void)windowDidLoad
111     {
112 masaki 82 [[self window] setContentBorderThickness:38 forEdge:NSMinYEdge];
113    
114 masaki 49 [self setupXspfLists];
115     [self setupDetailView];
116 masaki 82 [self setupAccessorylView];
117 masaki 50 if(currentListViewType == typeNotSelected) {
118 masaki 180 [self setCurrentListViewType:typeTableView];
119 masaki 50 }
120 masaki 49
121 masaki 50 [self showWindow:nil];
122 masaki 189 [self recalculateKeyViewLoop];
123 masaki 49 }
124 masaki 25 #pragma mark#### KVC ####
125 masaki 8 - (NSManagedObjectContext *)managedObjectContext
126     {
127     return [appDelegate managedObjectContext];
128     }
129 masaki 16 - (NSArrayController *)arrayController
130     {
131     return controller;
132     }
133 masaki 2
134 masaki 25 - (XspfMViewType)currentListViewType
135     {
136     return currentListViewType;
137     }
138     - (void)setCurrentListViewType:(XspfMViewType)newType
139     {
140     if(currentListViewType == newType) return;
141    
142     [self changeViewType:newType];
143     }
144 masaki 16
145 masaki 13 #pragma mark#### Actions ####
146 masaki 10 - (IBAction)openXspf:(id)sender
147     {
148 masaki 115 BOOL isSelected = [[controller valueForKeyPath:@"selectedObjects.@count"] boolValue];
149     if(!isSelected) return;
150    
151 masaki 77 XSPFMXspfObject *rep = [controller valueForKeyPath:@"selection.self"];
152 masaki 101 if(rep.deleted) {
153     NSRunCriticalAlertPanel( NSLocalizedString(@"Xspf is Deleted", @"Xspf is Deleted"),
154     NSLocalizedString(@"\"%@\" is deleted", @"\"%@\" is deleted"),
155     nil, nil, nil, rep.title);
156     return;
157     }
158 masaki 77 [[NSWorkspace sharedWorkspace] openFile:rep.filePath withApplication:@"XspfQT"];
159     rep.lastPlayDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
160 masaki 10 }
161 masaki 190 - (IBAction)switchListView:(id)sender
162     {
163     [self setCurrentListViewType:typeTableView];
164     }
165     - (IBAction)switchRegularIconView:(id)sender
166     {
167     [self setCurrentListViewType:typeCollectionView];
168     [(XspfMCollectionViewController *)listViewController collectionViewItemViewRegular:sender];
169     }
170     - (IBAction)switchSmallIconView:(id)sender
171     {
172     [self setCurrentListViewType:typeCollectionView];
173     [(XspfMCollectionViewController *)listViewController collectionViewItemViewSmall:sender];
174     }
175 masaki 191 - (void)sortByKey:(NSString *)key
176 masaki 190 {
177     NSMutableArray *sortDescs = [[controller sortDescriptors] mutableCopy];
178     NSSortDescriptor *sortDesc = nil;
179    
180     // key is descs first key.
181     if([sortDescs count] > 1) {
182     NSSortDescriptor *firstDesc = [sortDescs objectAtIndex:0];
183     if([key isEqualToString:[firstDesc key]]) {
184     sortDesc = [[[NSSortDescriptor alloc] initWithKey:key ascending:![firstDesc ascending]] autorelease];
185     [sortDescs removeObject:firstDesc];
186     }
187     }
188     // remove same key.
189     if(!sortDesc) {
190 masaki 191 BOOL newAscending = NO;
191 masaki 190 NSSortDescriptor *foundDesc = nil;
192     for(id desc in sortDescs) {
193     if([key isEqualToString:[desc key]]) {
194     foundDesc = desc;
195     break;
196     }
197     }
198     if(foundDesc) {
199 masaki 191 newAscending = [foundDesc ascending];
200 masaki 190 [sortDescs removeObject:foundDesc];
201     }
202    
203 masaki 191 sortDesc = [[[NSSortDescriptor alloc] initWithKey:key ascending:newAscending] autorelease];
204 masaki 190 }
205    
206     [sortDescs insertObject:sortDesc atIndex:0];
207    
208     NSArray *selectedObjects = [controller selectedObjects];
209     [controller setSortDescriptors:sortDescs];
210     [controller setSelectedObjects:selectedObjects];
211     }
212     - (IBAction)sortByTitle:(id)sender
213     {
214 masaki 191 [self sortByKey:@"title"];
215 masaki 190 }
216     - (IBAction)sortByLastPlayDate:(id)sender
217     {
218 masaki 191 [self sortByKey:@"lastPlayDate"];
219 masaki 190 }
220     - (IBAction)sortByModificationDate:(id)sender
221     {
222 masaki 191 [self sortByKey:@"modificationDate"];
223 masaki 190 }
224     - (IBAction)sortByCreationDate:(id)sender
225     {
226 masaki 191 [self sortByKey:@"creationDate"];
227 masaki 190 }
228     - (IBAction)sortByRegisterDate:(id)sender
229     {
230 masaki 191 [self sortByKey:@"registerDate"];
231 masaki 190 }
232     - (IBAction)sortByRate:(id)sender
233     {
234 masaki 191 [self sortByKey:@"rating"];
235 masaki 190 }
236     - (IBAction)sortByMovieNumber:(id)sender
237     {
238 masaki 191 [self sortByKey:@"movieNum"];
239 masaki 190 }
240     - (IBAction)sortByLabel:(id)sender
241     {
242     [self doesNotRecognizeSelector:_cmd];
243     }
244    
245 masaki 2 - (IBAction)add:(id)sender
246     {
247     NSOpenPanel *panel = [NSOpenPanel openPanel];
248    
249     [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]];
250     [panel setAllowsMultipleSelection:YES];
251 masaki 9 [panel setDelegate:self];
252 masaki 2
253     [panel beginSheetForDirectory:nil
254     file:nil
255     types:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]
256 masaki 8 modalForWindow:[self window]
257 masaki 2 modalDelegate:self
258     didEndSelector:@selector(endOpenPanel:::)
259     contextInfo:NULL];
260     }
261 masaki 106 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
262     {
263     [panel orderOut:nil];
264 masaki 2
265 masaki 106 if(returnCode == NSCancelButton) return;
266    
267     NSArray *URLs = [panel URLs];
268     if([URLs count] == 0) return;
269    
270 masaki 184 [appDelegate registerURLs:URLs];
271 masaki 106 }
272 masaki 190 - (IBAction)remove:(id)sender
273     {
274     XSPFMXspfObject *obj = [controller valueForKeyPath:@"selection.self"];
275     [[UKKQueue sharedFileWatcher] removePathFromQueue:obj.filePath];
276     [[self managedObjectContext] deleteObject:obj];
277     }
278 masaki 182
279 masaki 194 - (IBAction)newPredicate:(id)sender
280     {
281     [libraryViewController newPredicate:sender];
282     }
283    
284 masaki 190 - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
285     {
286     BOOL enabled = YES;
287     SEL action = [menuItem action];
288    
289     if(action == @selector(switchListView:)) {
290     if(currentListViewType == typeTableView) {
291     [menuItem setState:NSOnState];
292     } else {
293     [menuItem setState:NSOffState];
294     }
295     } else if(action == @selector(switchRegularIconView:)) {
296     if(currentListViewType == typeCollectionView
297     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXspfMRegularItem) {
298     [menuItem setState:NSOnState];
299     } else {
300     [menuItem setState:NSOffState];
301     }
302     } else if(action == @selector(switchSmallIconView:)) {
303     if(currentListViewType == typeCollectionView
304     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXSpfMSmallItem) {
305     [menuItem setState:NSOnState];
306     } else {
307     [menuItem setState:NSOffState];
308     }
309     } else if(action == @selector(sortByLabel:)) {
310     enabled = NO;
311     }
312    
313     return enabled;
314     }
315    
316 masaki 25 #pragma mark#### Other methods ####
317 masaki 189 - (void)recalculateKeyViewLoop
318     {
319     [searchField setNextKeyView:[libraryViewController firstKeyView]];
320     [libraryViewController setNextKeyView:[listViewController firstKeyView]];
321     [listViewController setNextKeyView:[detailViewController firstKeyView]];
322     [detailViewController setNextKeyView:searchField];
323     }
324 masaki 25 - (void)changeViewType:(XspfMViewType)viewType
325     {
326     if(currentListViewType == viewType) return;
327     currentListViewType = viewType;
328    
329     NSString *className = nil;
330     switch(currentListViewType) {
331     case typeCollectionView:
332     className = @"XspfMCollectionViewController";
333     break;
334     case typeTableView:
335     className = @"XspfMListViewController";
336     break;
337     }
338     if(!className) return;
339    
340 masaki 189 XspfMViewController *targetContorller = [viewControllers objectForKey:className];
341 masaki 25 if(!targetContorller) {
342     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
343     if(!targetContorller) return;
344 masaki 192
345     id selectionIndexes = [controller selectionIndexes];
346 masaki 25 [viewControllers setObject:targetContorller forKey:className];
347 masaki 180 [targetContorller view];
348 masaki 30 [targetContorller setRepresentedObject:controller];
349 masaki 189 [targetContorller recalculateKeyViewLoop];
350 masaki 192 [controller setSelectionIndexes:selectionIndexes];
351 masaki 25 }
352 masaki 109
353 masaki 25 [[listViewController view] removeFromSuperview];
354     listViewController = targetContorller;
355     [listView addSubview:[listViewController view]];
356     [[listViewController view] setFrame:[listView bounds]];
357 masaki 189 // [[self window] recalculateKeyViewLoop];
358     [self recalculateKeyViewLoop];
359 masaki 25 }
360 masaki 2
361 masaki 5
362 masaki 43 - (void)setupXspfLists
363 masaki 36 {
364 masaki 47 if(libraryViewController) return;
365    
366 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
367 masaki 37 [libraryViewController setRepresentedObject:listController];
368     [libraryView addSubview:[libraryViewController view]];
369 masaki 193 NSRect rect = [libraryView bounds];
370     rect.size.width += 2;
371     rect.origin.x -= 1;
372     [[libraryViewController view] setFrame:rect];
373 masaki 189 [libraryViewController recalculateKeyViewLoop];
374 masaki 36 }
375 masaki 47 - (void)setupDetailView
376 masaki 6 {
377 masaki 47 if(detailViewController) return;
378 masaki 6
379 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
380     [detailViewController setRepresentedObject:controller];
381     [detailView addSubview:[detailViewController view]];
382     [[detailViewController view] setFrame:[detailView bounds]];
383 masaki 189 [detailViewController recalculateKeyViewLoop];
384 masaki 6 }
385 masaki 82 - (void)setupAccessorylView
386     {
387     if(accessoryViewController) return;
388    
389     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
390     [accessoryViewController setRepresentedObject:[appDelegate channel]];
391     [accessoryView addSubview:[accessoryViewController view]];
392     [[accessoryViewController view] setFrame:[accessoryView bounds]];
393 masaki 189 // [accessoryViewController recalculateKeyViewLoop];
394 masaki 82 }
395 masaki 8 #pragma mark#### NSWidnow Delegate ####
396     /**
397     Returns the NSUndoManager for the application. In this case, the manager
398     returned is that of the managed object context for the application.
399     */
400 masaki 6
401 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
402     return [[appDelegate managedObjectContext] undoManager];
403     }
404    
405 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
406     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
407     {
408 masaki 184 return ![appDelegate didRegisteredURL:[NSURL fileURLWithPath:filename]];
409 masaki 9 }
410    
411 masaki 193 #pragma mark#### XspfMDragControl Delegate ####
412     - (void)dragControl:(XspfMDragControl *)control dragDelta:(NSSize)delta
413     {
414     HMLog(HMLogLevelDebug, @"Enter %@", NSStringFromSelector(_cmd));
415     CGFloat libWidth = [libraryView frame].size.width;
416     [splitView setPosition:libWidth + delta.width ofDividerAtIndex:0];
417     }
418    
419 masaki 185 #pragma mark#### XspfManager Notifications ####
420     - (void)managerDidAddObjects:(NSNotification *)notification
421     {
422     id addedObjects = [[notification userInfo] objectForKey:@"XspfManagerAddedXspfObjects"];
423     if(!addedObjects || ![addedObjects isKindOfClass:[NSArray class]] || [addedObjects count] == 0) return;
424    
425     [controller performSelector:@selector(setSelectedObjects:)
426     withObject:addedObjects
427     afterDelay:0.01];
428     }
429    
430 masaki 184 #pragma mark#### Test ####
431     - (IBAction)test01:(id)sender
432     {
433 masaki 187 HMLog(HMLogLevelDebug, @"HMLogLevelDebug");
434     HMLog(HMLogLevelNotice, @"HMLogLevelNotice");
435     HMLog(HMLogLevelCaution, @"HMLogLevelCaution");
436     HMLog(HMLogLevelAlert, @"HMLogLevelAlert");
437     HMLog(HMLogLevelError, @"HMLogLevelError");
438 masaki 184
439 masaki 187 HMLog(HMLogLevelDebug, @"HMLogLevelDebug -> %@", @"DEBUG");
440 masaki 184 }
441     - (IBAction)test02:(id)sender
442     {
443     NSResponder *responder = [[self window] firstResponder];
444     while(responder) {
445 masaki 188 HMLog(HMLogLevelDebug, @"Responder -> %@", responder);
446 masaki 184 responder = [responder nextResponder];
447     }
448     }
449     - (IBAction)test03:(id)sender
450     {
451     id keyView = [[self window] firstResponder];
452     NSView *firstKeyView = keyView;
453     while(keyView) {
454 masaki 188 HMLog(HMLogLevelDebug, @"Keyview -> %@", keyView);
455 masaki 184 keyView = [keyView nextKeyView];
456     if(keyView == firstKeyView) break;
457     }
458    
459 masaki 188 HMLog(HMLogLevelDebug, @"Valid next view -> %@", [firstKeyView nextValidKeyView]);
460 masaki 184 }
461     @end

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