Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 502 - (hide annotations) (download)
Tue Jan 4 11:43:45 2011 UTC (13 years, 3 months ago) by masakih
File size: 25504 byte(s)
[Mod] さらに、不要なアクションを削除、menuValidationを再考。
1 masaki 2 //
2     // XspfManager.m
3     // XspfManager
4     //
5     // Created by Hori,Masaki on 09/11/01.
6     //
7    
8 masakih 350 /*
9 masakih 365 This source code is release under the New BSD License.
10 masakih 350 Copyright (c) 2009-2010, masakih
11     All rights reserved.
12    
13 masakih 365 ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に
14     限り、再頒布および使用が許可されます。
15    
16     1, ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含
17     めること。
18     2, バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表
19     示、本条件一覧、および下記免責条項を含めること。
20     3, 書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、
21     コントリビューターの名前を使用してはならない。
22     本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、
23     明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証
24     も含め、またそれに限定されない、いかなる保証もありません。著作権者もコントリビューター
25     も、事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか
26     厳格責任であるか(過失その他の)不法行為であるかを問わず、仮にそのような損害が発生する
27     可能性を知らされていたとしても、本ソフトウェアの使用によって発生した(代替品または代用
28     サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定
29     されない)直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害につい
30     て、一切責任を負わないものとします。
31 masakih 350 -------------------------------------------------------------------
32     Copyright (c) 2009-2010, masakih
33     All rights reserved.
34    
35 masakih 365 Redistribution and use in source and binary forms, with or without
36     modification, are permitted provided that the following conditions
37     are met:
38 masakih 350
39 masakih 365 1, Redistributions of source code must retain the above copyright
40     notice, this list of conditions and the following disclaimer.
41     2, Redistributions in binary form must reproduce the above copyright
42     notice, this list of conditions and the following disclaimer in
43     the documentation and/or other materials provided with the
44     distribution.
45     3, The names of its contributors may be used to endorse or promote
46     products derived from this software without specific prior
47     written permission.
48     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
49     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
50     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
51     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
52     COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
53     INCIDENTAL, SPECIAL,EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
54     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
55     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
56     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
58     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
59     POSSIBILITY OF SUCH DAMAGE.
60 masakih 350 */
61    
62 masaki 182 #import "XspfMMainWindowController.h"
63 masaki 2
64 masaki 238 #import "XspfMXspfObject.h"
65 masaki 2
66 masaki 189 #import "XspfMViewController.h"
67 masaki 41 #import "XspfMLibraryViewController.h"
68 masaki 16 #import "XspfMCollectionViewController.h"
69 masaki 25 #import "XspfMListViewController.h"
70 masaki 47 #import "XspfMDetailViewController.h"
71 masaki 281 #import "XspfMCoverFlowViewController.h"
72 masaki 2
73 masakih 370 #import "XspfMPreferences.h"
74 masaki 193
75 masakih 483 #import "XspfQTMovieWindowController.h"
76     #import "XspfMPlayListViewController.h"
77 masaki 69
78 masakih 483 #import "NSControl_Validation.h"
79    
80    
81     @interface XspfMMainWindowController()
82     @property (retain) XspfMPlayListViewController *playListViewController;
83     @property (retain) XspfQTMovieViewController *movieViewController;
84     @end
85    
86    
87 masaki 182 @interface XspfMMainWindowController(HMPrivate)
88 masaki 43 - (void)setupXspfLists;
89 masaki 47 - (void)setupDetailView;
90 masaki 82 - (void)setupAccessorylView;
91 masaki 25 - (void)changeViewType:(XspfMViewType)newType;
92     - (void)setCurrentListViewType:(XspfMViewType)newType;
93 masaki 189 - (void)recalculateKeyViewLoop;
94 masaki 199
95     - (void)removeSelectedItem;
96 masakih 370
97     - (BOOL)isOpenDetailView;
98 masakih 373 - (BOOL)validateControl:(id)anItem;
99 masakih 483 - (void)autoControlValidate;
100 masakih 499
101     - (void)overlayView:(NSView *)view on:(NSView *)original offset:(NSPoint)offset extend:(NSSize)extend;
102 masaki 16 @end
103    
104 masaki 317
105 masaki 182 @implementation XspfMMainWindowController
106 masakih 483 @synthesize movieViewController, playListViewController;
107     @synthesize spin;
108    
109 masaki 8 - (id)init
110     {
111 masaki 200 self = [super initWithWindowNibName:@"MainWindow"];
112     if(self) {
113 masakih 483 listViewControllers = [[NSMutableDictionary alloc] init];
114 masaki 200 }
115 masakih 483
116 masaki 8 return self;
117 masaki 2 }
118 masaki 8 - (void)awakeFromNib
119     {
120 masaki 47 static BOOL didSetupOnMainMenu = NO;
121    
122     if(appDelegate && !didSetupOnMainMenu) {
123     didSetupOnMainMenu = YES;
124 masaki 98
125 masaki 185 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
126     [nc addObserver:self
127     selector:@selector(managerDidAddObjects:)
128     name:XspfManagerDidAddXspfObjectsNotification
129     object:appDelegate];
130 masakih 483
131 masaki 49 [self window];
132 masaki 47 }
133 masaki 8 }
134 masaki 49 - (void)windowDidLoad
135     {
136 masakih 358 [[self window] setContentBorderThickness:27 forEdge:NSMinYEdge];
137 masaki 82
138 masaki 294 [splitView setDelegate:self];
139 masaki 49 [self setupXspfLists];
140     [self setupDetailView];
141 masaki 82 [self setupAccessorylView];
142 masaki 49
143 masakih 370 XspfMPreferences *pref = [XspfMPreferences sharedPreference];
144     if(!pref.isOpenDetailView) {
145     [self showHideDetail:self];
146     if(pref.splitViewLeftWidth != 0) {
147     [splitView setPosition:pref.splitViewLeftWidth ofDividerAtIndex:0];
148     }
149     }
150 masakih 483 // [self validateControl:detailViewButton];
151     [self autoControlValidate];
152 masakih 370
153 masakih 374 [self setCurrentListViewType:pref.viewType];
154 masaki 315
155 masakih 483 [libraryController bind:NSManagedObjectContextBinding
156 masaki 315 toObject:appDelegate
157     withKeyPath:@"managedObjectContext"
158     options:nil];
159    
160     [allXspfController bind:NSManagedObjectContextBinding
161     toObject:appDelegate
162     withKeyPath:@"managedObjectContext"
163     options:nil];
164 masakih 370
165 masaki 189 [self recalculateKeyViewLoop];
166 masakih 373
167 masakih 380 [self performSelector:@selector(delayExcute:) withObject:self afterDelay:0.1];
168 masaki 49 }
169 masakih 380 - (void)delayExcute:(id)dummy
170     {
171     [self showWindow:self];
172    
173 masakih 382 // load時にこれを行うと循環的にRearrangeが実行されてしまう。
174 masakih 483 [libraryController setAutomaticallyRearrangesObjects:YES];
175 masakih 380 }
176 masaki 25 #pragma mark#### KVC ####
177 masaki 2
178 masaki 25 - (XspfMViewType)currentListViewType
179     {
180     return currentListViewType;
181     }
182     - (void)setCurrentListViewType:(XspfMViewType)newType
183     {
184     if(currentListViewType == newType) return;
185    
186 masakih 374 [XspfMPreferences sharedPreference].viewType = newType;
187 masaki 316
188 masaki 25 [self changeViewType:newType];
189 masakih 483 [self autoControlValidate];
190 masaki 25 }
191 masaki 16
192 masakih 483 - (XspfMViwMode)mode
193     {
194     return appDelegate.mode;
195     }
196     - (void)setMode:(XspfMViwMode)newMode
197     {
198     appDelegate.mode = newMode;
199     [self performSelector:@selector(autoControlValidate) withObject:nil afterDelay:0.0];
200     }
201     - (void)relocateSpin
202     {
203     NSRect spinRect = spin.frame;
204     NSRect contentViewFrame = listPlaceholderView.frame;
205     spinRect.origin.x = (NSWidth(contentViewFrame) - NSWidth(spinRect)) / 2;
206     spinRect.origin.y = (NSHeight(contentViewFrame) - NSHeight(spinRect)) / 2;
207     spin.frame = spinRect;
208     }
209     - (NSProgressIndicator *)spin
210     {
211     if(spin) {
212     [self relocateSpin];
213     return spin;
214     }
215    
216     NSRect spinRect = { {0,0}, {200,200} };
217     spin = [[[NSProgressIndicator alloc] initWithFrame:spinRect] autorelease];
218     spin.usesThreadedAnimation = YES;
219     spin.style = NSProgressIndicatorSpinningStyle;
220     [spin setDisplayedWhenStopped:YES];
221     [spin sizeToFit];
222     [self relocateSpin];
223     [listPlaceholderView addSubview:spin];
224     return spin;
225     }
226    
227 masaki 13 #pragma mark#### Actions ####
228 masakih 483
229 masakih 498 - (void)removePlayerView
230 masakih 483 {
231 masakih 498 NSView *playerView = movieViewController.view;
232 masakih 483 [playerView setHidden:YES];
233     [playerView removeFromSuperview];
234    
235     // List view
236     NSView *playListView = playListViewController.view;
237     [playListView removeFromSuperview];
238     self.playListViewController = nil;
239    
240     NSDocument *doc = movieViewController.representedObject;
241     [doc close];
242     self.movieViewController = nil;
243    
244     [self.window makeFirstResponder:listViewController.initialFirstResponder];
245     }
246 masakih 498 - (void)wipeOut
247 masakih 483 {
248     NSTimeInterval duration = 0.3;
249     [[NSAnimationContext currentContext] setDuration:duration];
250    
251 masakih 498 NSView *playerView = movieViewController.view;
252 masakih 483 NSRect listViewFrame = listPlaceholderView.frame;
253     NSView *listViewContentView = listViewController.view;
254     NSRect listViewContentViewFrame = listViewContentView.frame;
255     listViewContentViewFrame.origin.x = 0;
256     listViewContentViewFrame.size = listViewFrame.size;
257     [[listViewContentView animator] setFrame:listViewContentViewFrame];
258    
259     NSRect playerViewFrame = playerView.frame;
260     playerViewFrame.origin.x = NSWidth(listViewFrame);
261     [[playerView animator] setFrame:playerViewFrame];
262    
263     // List view
264     NSView *playListView = playListViewController.view;
265     NSRect playListViewFrame = playListView.frame;
266     playListViewFrame.origin.y = -NSHeight(libraryPlaceholderView.frame);
267     [[playListView animator] setFrame:playListViewFrame];
268    
269 masakih 498 [self performSelector:@selector(removePlayerView) withObject:nil afterDelay:duration + 0.01];
270 masakih 483 }
271     - (IBAction)returnToList:(id)sender
272     {
273     movieViewController.fullScreenMode = NO;
274    
275     NSView *playerView = movieViewController.view;
276     [listPlaceholderView addSubview:listViewController.view positioned:NSWindowBelow relativeTo:playerView];
277    
278     [movieViewController pause];
279    
280 masakih 498 [self performSelector:@selector(wipeOut) withObject:nil afterDelay:0.0];
281 masakih 483 self.mode = modeList;
282     }
283    
284     - (void)hideListContentView
285     {
286     [listViewController.view removeFromSuperview];
287     [spin stopAnimation:self];
288    
289     [movieViewController play];
290     }
291     - (void)wipeIn
292     {
293     NSTimeInterval duration = 0.3;
294     [[NSAnimationContext currentContext] setDuration:duration];
295    
296     NSView *playerView = movieViewController.view;
297     NSView *listViewContentView = listViewController.view;
298     NSRect listViewContentViewFrame = listViewContentView.frame;
299     listViewContentViewFrame.origin.x -= NSWidth(listPlaceholderView.frame);
300     [[listViewContentView animator] setFrame:listViewContentViewFrame];
301    
302     NSRect playerViewFrame = playerView.frame;
303     playerViewFrame.origin.x = 0;
304     [[playerView animator] setFrame:playerViewFrame];
305    
306    
307     // List view
308     NSView *playListView = playListViewController.view;
309     NSRect playListViewFrame = playListView.frame;
310     playListViewFrame.origin.y = -1;
311     [[playListView animator] setFrame:playListViewFrame];
312    
313     [self performSelector:@selector(hideListContentView) withObject:nil afterDelay:duration + 0.01];
314     }
315     - (void)prepareWipeIn
316     {
317     [self.spin startAnimation:self];
318     XspfMXspfObject *rep = [controller valueForKeyPath:@"selection.self"];
319    
320     NSError *error = nil;
321     NSDocumentController *dc = [NSDocumentController sharedDocumentController];
322     NSDocument *doc = [dc openDocumentWithContentsOfURL:rep.url
323     display:NO
324     error:&error];
325     if(doc) {
326     rep.lastPlayDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
327     }
328    
329     [doc makeWindowControllers];
330    
331     NSArray *windowControllers = [doc windowControllers];
332     [windowControllers makeObjectsPerformSelector:@selector(window)];
333     XspfQTMovieWindowController *windowController = [windowControllers objectAtIndex:0];
334     self.movieViewController = windowController.contentViewController;
335 masakih 499 [self overlayView:movieViewController.view
336     on:listPlaceholderView
337     offset:NSMakePoint(NSWidth(listPlaceholderView.frame), 0)
338     extend:NSZeroSize];
339 masakih 483
340     self.playListViewController = [[[XspfMPlayListViewController alloc] init] autorelease];
341     playListViewController.representedObject = doc;
342 masakih 499 [self overlayView:playListViewController.view
343     on:libraryPlaceholderView
344     offset:NSMakePoint(-1, -NSHeight(libraryPlaceholderView.frame) - 1)
345     extend:NSMakeSize(1, 1)];
346 masakih 483 }
347 masaki 10 - (IBAction)openXspf:(id)sender
348     {
349 masaki 115 BOOL isSelected = [[controller valueForKeyPath:@"selectedObjects.@count"] boolValue];
350     if(!isSelected) return;
351    
352 masakih 483 [self prepareWipeIn];
353    
354     [self performSelector:@selector(wipeIn) withObject:nil afterDelay:0.0];
355     self.mode = modeMovie;
356     return;
357    
358 masaki 238 XspfMXspfObject *rep = [controller valueForKeyPath:@"selection.self"];
359 masaki 277 NSInteger result = NSRunCriticalAlertPanel(NSLocalizedString(@"Xspf is not found", @"Xspf is not found"),
360     NSLocalizedString(@"\"%@\" is not found.", @"\"%@\" is not found."),
361     nil, nil/*@"Search Original"*/, nil, rep.title);
362     if(result == NSAlertDefaultReturn) {
363     return;
364     } else if(result == NSAlertAlternateReturn) {
365     //
366 masakih 345 #warning should implement.
367 masaki 277 }
368 masaki 10 }
369 masaki 190 - (IBAction)switchListView:(id)sender
370     {
371     [self setCurrentListViewType:typeTableView];
372     }
373     - (IBAction)switchRegularIconView:(id)sender
374     {
375     [self setCurrentListViewType:typeCollectionView];
376     [(XspfMCollectionViewController *)listViewController collectionViewItemViewRegular:sender];
377     }
378     - (IBAction)switchSmallIconView:(id)sender
379     {
380     [self setCurrentListViewType:typeCollectionView];
381     [(XspfMCollectionViewController *)listViewController collectionViewItemViewSmall:sender];
382     }
383 masaki 281 - (IBAction)switchCoverFlowView:(id)sender
384     {
385     [self setCurrentListViewType:typeCoverFlowView];
386     }
387 masakih 483 - (IBAction)rotateViewType:(id)sender
388     {
389     NSInteger newType = currentListViewType + 1;
390     if(newType > 3) newType = 1;
391     [self setCurrentListViewType:newType];
392     }
393     - (IBAction)switchActiveView:(id)sender
394     {
395     id firstResponder = self.window.firstResponder;
396     if(firstResponder == listViewController.initialFirstResponder) {
397     [self.window makeFirstResponder:libraryViewController.initialFirstResponder];
398     } else {
399     [self.window makeFirstResponder:listViewController.initialFirstResponder];
400     }
401     }
402 masaki 190
403 masakih 500
404 masaki 2 - (IBAction)add:(id)sender
405     {
406     NSOpenPanel *panel = [NSOpenPanel openPanel];
407    
408     [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]];
409     [panel setAllowsMultipleSelection:YES];
410 masaki 9 [panel setDelegate:self];
411 masaki 2
412     [panel beginSheetForDirectory:nil
413     file:nil
414     types:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]
415 masaki 8 modalForWindow:[self window]
416 masaki 2 modalDelegate:self
417     didEndSelector:@selector(endOpenPanel:::)
418     contextInfo:NULL];
419     }
420 masaki 106 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
421     {
422     [panel orderOut:nil];
423 masaki 2
424 masaki 106 if(returnCode == NSCancelButton) return;
425    
426     NSArray *URLs = [panel URLs];
427     if([URLs count] == 0) return;
428    
429 masaki 184 [appDelegate registerURLs:URLs];
430 masaki 106 }
431 masakih 393 - (IBAction)delete:(id)sender
432     {
433     [self remove:sender];
434     }
435 masaki 190 - (IBAction)remove:(id)sender
436     {
437 masaki 199 [self removeSelectedItem];
438 masaki 190 }
439 masaki 182
440 masaki 194 - (IBAction)newPredicate:(id)sender
441     {
442 masakih 393 [libraryViewController createPredicate:sender];
443 masaki 194 }
444    
445 masakih 370 - (BOOL)isOpenDetailView
446     {
447 masakih 386 NSView *view = [detailViewController view];
448     NSRect visRect = [view visibleRect];
449     return !(NSEqualRects(visRect, NSZeroRect));
450 masakih 370 }
451 masakih 358 - (IBAction)showHideDetail:(id)sender
452     {
453 masakih 370 XspfMPreferences *pref = [XspfMPreferences sharedPreference];
454 masakih 358
455 masakih 483 NSPoint origin = [detailPlaceholderView frame].origin;
456 masakih 358 NSSize size = NSZeroSize;
457    
458 masakih 483 CGFloat detailWidth = [detailPlaceholderView frame].size.width;
459 masakih 386 if(![self isOpenDetailView]){ // show
460 masakih 358 origin.x -= detailWidth;
461     size = [splitView frame].size;
462     size.width -= detailWidth;
463 masakih 370
464     pref.openDetailView = YES;
465 masakih 358 } else { // hide
466     origin.x += detailWidth;
467     size = [splitView frame].size;
468     size.width += detailWidth;
469 masakih 370
470     pref.openDetailView = NO;
471 masakih 358 }
472 masakih 483 [[detailPlaceholderView animator] setFrameOrigin:origin];
473 masakih 358 [[splitView animator] setFrameSize:size];
474 masakih 373
475 masakih 386 // アニメーションが終わってから確認する。
476 masakih 483 NSAnimationContext *context = [NSAnimationContext currentContext];
477 masakih 386 NSTimeInterval duration = [context duration];
478     [self performSelector:@selector(validateControl:) withObject:detailViewButton afterDelay:duration + 0.1];
479 masakih 358 }
480 masakih 483 - (BOOL)validateMenuItemForListMode:(NSMenuItem *)menuItem
481 masaki 190 {
482     BOOL enabled = YES;
483     SEL action = [menuItem action];
484    
485     if(action == @selector(switchListView:)) {
486     if(currentListViewType == typeTableView) {
487     [menuItem setState:NSOnState];
488     } else {
489     [menuItem setState:NSOffState];
490     }
491     } else if(action == @selector(switchRegularIconView:)) {
492     if(currentListViewType == typeCollectionView
493     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXspfMRegularItem) {
494     [menuItem setState:NSOnState];
495     } else {
496     [menuItem setState:NSOffState];
497     }
498     } else if(action == @selector(switchSmallIconView:)) {
499     if(currentListViewType == typeCollectionView
500     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXSpfMSmallItem) {
501     [menuItem setState:NSOnState];
502     } else {
503     [menuItem setState:NSOffState];
504     }
505 masaki 281 } else if(action == @selector(switchCoverFlowView:)) {
506     if(currentListViewType == typeCoverFlowView) {
507     [menuItem setState:NSOnState];
508     } else {
509     [menuItem setState:NSOffState];
510     }
511 masaki 190 }
512    
513 masakih 393 if(action == @selector(remove:) || action == @selector(delete:)) {
514     if([controller selectionIndex] == NSNotFound) return NO;
515    
516     NSView *listView_ = [listViewController view];
517     id responder = [[self window] firstResponder];
518     while(responder) {
519     if(listView_ == responder) return YES;
520     responder = [responder nextResponder];
521     }
522     enabled = NO;
523     }
524    
525    
526 masaki 190 return enabled;
527     }
528 masakih 483 - (BOOL)validateMenuItemForMovieMode:(NSMenuItem *)menuItem
529 masakih 373 {
530 masakih 502 if([self.movieViewController respondsToSelector:[menuItem action]]) {
531     return [self.movieViewController validateMenuItem:menuItem];
532     }
533 masakih 483
534     return YES;
535     }
536     - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
537     {
538     switch(appDelegate.mode) {
539     case modeList:
540     return [self validateMenuItemForListMode:menuItem];
541     break;
542     case modeMovie:
543     return [self validateMenuItemForMovieMode:menuItem];
544     break;
545     }
546    
547     return NO;
548     }
549    
550     - (BOOL)validateControl:(NSControl *)anItem
551     {
552 masakih 373 if([detailViewButton isEqual:anItem]) {
553     if([self isOpenDetailView]) {
554     [detailViewButton setImage:[NSImage imageNamed:@"NSRightFacingTriangleTemplate"]];
555     } else {
556     [detailViewButton setImage:[NSImage imageNamed:@"NSLeftFacingTriangleTemplate"]];
557     }
558 masakih 483 return YES;
559 masakih 373 }
560 masakih 483
561     SEL action = [anItem action];
562     if(action == @selector(newPredicate:)) {
563     if(self.mode == modeMovie) {
564     return NO;
565     }
566     }
567 masakih 373 return YES;
568     }
569 masaki 25 #pragma mark#### Other methods ####
570 masaki 199 - (void)removeSelectedItem
571     {
572 masaki 238 XspfMXspfObject *obj = [controller valueForKeyPath:@"selection.self"];
573 masaki 199
574     NSBeginInformationalAlertSheet(nil, nil, @"Cancel", nil, [self window],
575     self, @selector(didEndAskDelete:::), Nil, obj,
576     NSLocalizedString(@"Do you really delete item \"%@\" from list?", @"Do you really delete item \"%@\" from list?"),
577     obj.title);
578     }
579     - (void)didEndAskDelete:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
580     {
581     if(returnCode == NSCancelButton) return;
582    
583     [appDelegate removeObject:contextInfo];
584     }
585    
586 masaki 189 - (void)recalculateKeyViewLoop
587     {
588     [searchField setNextKeyView:[libraryViewController firstKeyView]];
589     [libraryViewController setNextKeyView:[listViewController firstKeyView]];
590     [listViewController setNextKeyView:[detailViewController firstKeyView]];
591     [detailViewController setNextKeyView:searchField];
592     }
593 masakih 499 - (void)overlayView:(NSView *)view on:(NSView *)original offset:(NSPoint)offset extend:(NSSize)extend
594     {
595     NSRect frame = original.frame;
596     frame.origin = offset;
597     frame.size.width += extend.width;
598     frame.size.height += extend.height;
599     view.frame = frame;
600     [original addSubview:view];
601     }
602 masaki 25 - (void)changeViewType:(XspfMViewType)viewType
603     {
604     if(currentListViewType == viewType) return;
605     currentListViewType = viewType;
606    
607     NSString *className = nil;
608     switch(currentListViewType) {
609     case typeCollectionView:
610     className = @"XspfMCollectionViewController";
611     break;
612     case typeTableView:
613     className = @"XspfMListViewController";
614     break;
615 masaki 281 case typeCoverFlowView:
616     className = @"XspfMCoverFlowViewController";
617     break;
618 masaki 25 }
619     if(!className) return;
620    
621 masakih 483 XspfMViewController *targetContorller = [listViewControllers objectForKey:className];
622 masaki 25 if(!targetContorller) {
623     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
624     if(!targetContorller) return;
625 masaki 192
626     id selectionIndexes = [controller selectionIndexes];
627 masakih 483 [listViewControllers setObject:targetContorller forKey:className];
628 masaki 180 [targetContorller view];
629 masaki 30 [targetContorller setRepresentedObject:controller];
630 masaki 189 [targetContorller recalculateKeyViewLoop];
631 masaki 192 [controller setSelectionIndexes:selectionIndexes];
632 masaki 25 }
633 masaki 109
634 masaki 25 [[listViewController view] removeFromSuperview];
635     listViewController = targetContorller;
636 masakih 499 [self overlayView:listViewController.view
637     on:listPlaceholderView
638     offset:NSMakePoint(0, -1)
639     extend:NSMakeSize(0, 1)];
640 masaki 189 // [[self window] recalculateKeyViewLoop];
641     [self recalculateKeyViewLoop];
642 masakih 429
643     /* TODO
644     環境設定で変更可能にする
645     */
646     [listViewController performSelector:@selector(scrollToSelection:) withObject:self afterDelay:0.0];
647 masaki 25 }
648 masaki 2
649 masaki 5
650 masaki 43 - (void)setupXspfLists
651 masaki 36 {
652 masaki 47 if(libraryViewController) return;
653    
654 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
655 masakih 483 [libraryViewController setRepresentedObject:libraryController];
656 masakih 499 [self overlayView:libraryViewController.view
657     on:libraryPlaceholderView
658     offset:NSMakePoint(-1, -1)
659     extend:NSMakeSize(2, 1)];
660 masaki 189 [libraryViewController recalculateKeyViewLoop];
661 masaki 36 }
662 masaki 47 - (void)setupDetailView
663 masaki 6 {
664 masaki 47 if(detailViewController) return;
665 masaki 6
666 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
667     [detailViewController setRepresentedObject:controller];
668 masakih 499 [self overlayView:detailViewController.view
669     on:detailPlaceholderView
670     offset:NSZeroPoint
671     extend:NSZeroSize];
672 masaki 189 [detailViewController recalculateKeyViewLoop];
673 masaki 6 }
674 masaki 82 - (void)setupAccessorylView
675     {
676     if(accessoryViewController) return;
677    
678     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
679     [accessoryViewController setRepresentedObject:[appDelegate channel]];
680 masakih 499 [self overlayView:accessoryViewController.view
681     on:accessoryPlaceholderView
682     offset:NSZeroPoint
683     extend:NSZeroSize];
684 masaki 189 // [accessoryViewController recalculateKeyViewLoop];
685 masaki 82 }
686 masaki 8 #pragma mark#### NSWidnow Delegate ####
687     /**
688     Returns the NSUndoManager for the application. In this case, the manager
689     returned is that of the managed object context for the application.
690     */
691 masaki 6
692 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
693     return [[appDelegate managedObjectContext] undoManager];
694     }
695    
696 masakih 370 - (void)windowWillClose:(NSNotification *)notification
697     {
698     XspfMPreferences *pref = [XspfMPreferences sharedPreference];
699 masakih 483 pref.splitViewLeftWidth = [libraryPlaceholderView frame].size.width;
700 masakih 370 }
701    
702 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
703     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
704     {
705 masaki 184 return ![appDelegate didRegisteredURL:[NSURL fileURLWithPath:filename]];
706 masaki 9 }
707 masaki 294 #pragma mark#### NSSplitView Delegate ####
708     - (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex
709     {
710     return 130;
711     }
712 masaki 295 - (void)splitView:(NSSplitView *)aSplitView resizeSubviewsWithOldSize:(NSSize)oldSize
713     {
714     NSView *rightView = [[splitView subviews] objectAtIndex:1];
715     NSRect newFrame = [splitView frame];
716 masakih 483 NSRect libFrame = [libraryPlaceholderView frame];
717 masaki 295 NSRect listFrame = [rightView frame];
718     CGFloat dividerThickness = [splitView dividerThickness];
719    
720     libFrame.size.height = newFrame.size.height;
721     listFrame.size.height = newFrame.size.height;
722    
723     listFrame.size.width = newFrame.size.width - libFrame.size.width - dividerThickness;
724    
725     if(listFrame.size.width < 0) listFrame.size.width = 0;
726    
727 masakih 483 [libraryPlaceholderView setFrame:libFrame];
728 masaki 295 [rightView setFrame:listFrame];
729     }
730 masaki 193
731 masaki 185 #pragma mark#### XspfManager Notifications ####
732     - (void)managerDidAddObjects:(NSNotification *)notification
733     {
734     id addedObjects = [[notification userInfo] objectForKey:@"XspfManagerAddedXspfObjects"];
735     if(!addedObjects || ![addedObjects isKindOfClass:[NSArray class]] || [addedObjects count] == 0) return;
736    
737     [controller performSelector:@selector(setSelectedObjects:)
738     withObject:addedObjects
739     afterDelay:0.01];
740     }
741    
742 masaki 184 #pragma mark#### Test ####
743     - (IBAction)test01:(id)sender
744     {
745 masakih 483 NSPoint origin = [detailPlaceholderView frame].origin;
746     origin.x = [[detailPlaceholderView window] frame].size.width;
747     [detailPlaceholderView setFrameOrigin:origin];
748 masaki 184 }
749     - (IBAction)test02:(id)sender
750     {
751     NSResponder *responder = [[self window] firstResponder];
752     while(responder) {
753 masaki 188 HMLog(HMLogLevelDebug, @"Responder -> %@", responder);
754 masaki 184 responder = [responder nextResponder];
755     }
756     }
757 masakih 483 //- (IBAction)test03:(id)sender
758     //{
759     // [listController setAutomaticallyRearrangesObjects:YES];
760     //
761     //}
762     @end
763    
764     @implementation XspfMMainWindowController (MessageForwarding)
765     - (BOOL)respondsToSelector:(SEL)aSelector
766 masaki 184 {
767 masakih 483 if([super respondsToSelector:aSelector]) return YES;
768     if([self.movieViewController respondsToSelector:aSelector]) return YES;
769 masakih 500 if([controller respondsToSelector:aSelector]) return YES;
770 masakih 483
771     return NO;
772     }
773     - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
774     {
775     if([self.movieViewController respondsToSelector:aSelector]) {
776     return [self.movieViewController methodSignatureForSelector:aSelector];
777     }
778 masakih 500 if([controller respondsToSelector:aSelector]) {
779     return [controller methodSignatureForSelector:aSelector];
780     }
781 masakih 483 return [super methodSignatureForSelector:aSelector];
782     }
783     - (void)forwardInvocation:(NSInvocation *)anInvocation
784     {
785     SEL selector = [anInvocation selector];
786     if([self.movieViewController respondsToSelector:selector]) {
787     [anInvocation invokeWithTarget:self.movieViewController];
788     return;
789     }
790 masakih 500 if([controller respondsToSelector:selector]) {
791     [anInvocation invokeWithTarget:controller];
792     return;
793     }
794 masakih 483 }
795 masakih 380
796 masaki 184 @end

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