Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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