Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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