Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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