Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 573 - (hide annotations) (download)
Sat Jul 30 14:16:33 2011 UTC (12 years, 8 months ago) by masakih
File size: 28273 byte(s)
[Fix] Mac OS X 10.7 Lionで落ちる問題を修正。
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 masakih 506 #import "XspfMListController.h"
66 masaki 2
67 masaki 189 #import "XspfMViewController.h"
68 masaki 41 #import "XspfMLibraryViewController.h"
69 masaki 16 #import "XspfMCollectionViewController.h"
70 masaki 25 #import "XspfMListViewController.h"
71 masaki 47 #import "XspfMDetailViewController.h"
72 masaki 281 #import "XspfMCoverFlowViewController.h"
73 masaki 2
74 masakih 370 #import "XspfMPreferences.h"
75 masaki 193
76 masakih 483 #import "XspfQTMovieWindowController.h"
77     #import "XspfMPlayListViewController.h"
78 masaki 69
79 masakih 483 #import "NSControl_Validation.h"
80    
81    
82     @interface XspfMMainWindowController()
83     @property (retain) XspfMPlayListViewController *playListViewController;
84     @property (retain) XspfQTMovieViewController *movieViewController;
85     @end
86    
87    
88 masaki 182 @interface XspfMMainWindowController(HMPrivate)
89 masaki 43 - (void)setupXspfLists;
90 masaki 47 - (void)setupDetailView;
91 masaki 82 - (void)setupAccessorylView;
92 masaki 25 - (void)changeViewType:(XspfMViewType)newType;
93     - (void)setCurrentListViewType:(XspfMViewType)newType;
94 masaki 189 - (void)recalculateKeyViewLoop;
95 masaki 199
96     - (void)removeSelectedItem;
97 masakih 370
98     - (BOOL)isOpenDetailView;
99 masakih 373 - (BOOL)validateControl:(id)anItem;
100 masakih 483 - (void)autoControlValidate;
101 masakih 499
102 masakih 555 - (void)setOnDetailView;
103 masakih 561 - (BOOL)prepareWipeIn;
104 masakih 555
105 masakih 499 - (void)overlayView:(NSView *)view on:(NSView *)original offset:(NSPoint)offset extend:(NSSize)extend;
106 masaki 16 @end
107    
108 masaki 317
109 masaki 182 @implementation XspfMMainWindowController
110 masakih 483 @synthesize movieViewController, playListViewController;
111     @synthesize spin;
112    
113 masaki 8 - (id)init
114     {
115 masaki 200 self = [super initWithWindowNibName:@"MainWindow"];
116     if(self) {
117 masakih 483 listViewControllers = [[NSMutableDictionary alloc] init];
118 masaki 200 }
119 masakih 483
120 masaki 8 return self;
121 masaki 2 }
122 masaki 8 - (void)awakeFromNib
123     {
124 masaki 47 static BOOL didSetupOnMainMenu = NO;
125    
126     if(appDelegate && !didSetupOnMainMenu) {
127     didSetupOnMainMenu = YES;
128 masaki 98
129 masaki 185 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
130     [nc addObserver:self
131     selector:@selector(managerDidAddObjects:)
132     name:XspfManagerDidAddXspfObjectsNotification
133     object:appDelegate];
134 masakih 483
135 masaki 49 [self window];
136 masaki 47 }
137 masaki 8 }
138 masaki 49 - (void)windowDidLoad
139     {
140 masakih 358 [[self window] setContentBorderThickness:27 forEdge:NSMinYEdge];
141 masaki 82
142 masaki 294 [splitView setDelegate:self];
143 masaki 49 [self setupXspfLists];
144     [self setupDetailView];
145 masaki 82 [self setupAccessorylView];
146 masaki 49
147 masakih 370 XspfMPreferences *pref = [XspfMPreferences sharedPreference];
148     if(!pref.isOpenDetailView) {
149     [self showHideDetail:self];
150     if(pref.splitViewLeftWidth != 0) {
151     [splitView setPosition:pref.splitViewLeftWidth ofDividerAtIndex:0];
152     }
153     }
154 masakih 573 [self validateControl:detailViewButton];
155 masakih 483 [self autoControlValidate];
156 masakih 370
157 masakih 374 [self setCurrentListViewType:pref.viewType];
158 masaki 315
159 masakih 483 [libraryController bind:NSManagedObjectContextBinding
160 masaki 315 toObject:appDelegate
161     withKeyPath:@"managedObjectContext"
162     options:nil];
163    
164     [allXspfController bind:NSManagedObjectContextBinding
165     toObject:appDelegate
166     withKeyPath:@"managedObjectContext"
167     options:nil];
168 masakih 370
169 masaki 189 [self recalculateKeyViewLoop];
170 masakih 550 [[self window] update];
171 masakih 373
172 masakih 573 [self showWindow:self];
173    
174     [self performSelector:@selector(delayExcute:) withObject:self afterDelay:0.5];
175 masaki 49 }
176 masakih 380 - (void)delayExcute:(id)dummy
177     {
178 masakih 382 // load時にこれを行うと循環的にRearrangeが実行されてしまう。
179 masakih 483 [libraryController setAutomaticallyRearrangesObjects:YES];
180 masakih 380 }
181 masaki 25 #pragma mark#### KVC ####
182 masaki 2
183 masaki 25 - (XspfMViewType)currentListViewType
184     {
185     return currentListViewType;
186     }
187     - (void)setCurrentListViewType:(XspfMViewType)newType
188     {
189     if(currentListViewType == newType) return;
190    
191 masakih 374 [XspfMPreferences sharedPreference].viewType = newType;
192 masaki 316
193 masaki 25 [self changeViewType:newType];
194 masakih 483 [self autoControlValidate];
195 masaki 25 }
196 masaki 16
197 masakih 483 - (XspfMViwMode)mode
198     {
199     return appDelegate.mode;
200     }
201     - (void)setMode:(XspfMViwMode)newMode
202     {
203     appDelegate.mode = newMode;
204     [self performSelector:@selector(autoControlValidate) withObject:nil afterDelay:0.0];
205     }
206     - (void)relocateSpin
207     {
208     NSRect spinRect = spin.frame;
209     NSRect contentViewFrame = listPlaceholderView.frame;
210     spinRect.origin.x = (NSWidth(contentViewFrame) - NSWidth(spinRect)) / 2;
211     spinRect.origin.y = (NSHeight(contentViewFrame) - NSHeight(spinRect)) / 2;
212     spin.frame = spinRect;
213     }
214     - (NSProgressIndicator *)spin
215     {
216     if(spin) {
217     [self relocateSpin];
218     return spin;
219     }
220    
221     NSRect spinRect = { {0,0}, {200,200} };
222     spin = [[[NSProgressIndicator alloc] initWithFrame:spinRect] autorelease];
223     spin.usesThreadedAnimation = YES;
224     spin.style = NSProgressIndicatorSpinningStyle;
225     [spin setDisplayedWhenStopped:YES];
226     [spin sizeToFit];
227     [self relocateSpin];
228     [listPlaceholderView addSubview:spin];
229     return spin;
230     }
231    
232 masakih 555 - (BOOL)isOpenDetailView
233 masakih 483 {
234 masakih 555 NSView *view = [detailViewController view];
235     if(![view superview]) return NO;
236     NSRect visRect = [view visibleRect];
237     return !(NSEqualRects(visRect, NSZeroRect));
238 masakih 483 }
239 masakih 555
240     #pragma mark#### Actions ####
241 masakih 483 - (IBAction)returnToList:(id)sender
242     {
243     movieViewController.fullScreenMode = NO;
244    
245     NSView *playerView = movieViewController.view;
246     [listPlaceholderView addSubview:listViewController.view positioned:NSWindowBelow relativeTo:playerView];
247    
248     [movieViewController pause];
249    
250 masakih 498 [self performSelector:@selector(wipeOut) withObject:nil afterDelay:0.0];
251 masakih 483 self.mode = modeList;
252     }
253    
254 masaki 10 - (IBAction)openXspf:(id)sender
255     {
256 masakih 506 BOOL isSelected = controller.isSelected;
257 masaki 115 if(!isSelected) return;
258    
259 masakih 561 if(![self prepareWipeIn]) {
260     XspfMXspfObject *rep = controller.selectedItem;
261     NSInteger result = NSRunCriticalAlertPanel(NSLocalizedString(@"Xspf is not found", @"Xspf is not found"),
262     NSLocalizedString(@"\"%@\" is not found.", @"\"%@\" is not found."),
263     nil, nil/*@"Search Original"*/, nil, rep.title);
264     if(result == NSAlertDefaultReturn) {
265     return;
266     } else if(result == NSAlertAlternateReturn) {
267     //
268     #warning should implement.
269     }
270    
271     return;
272     }
273 masakih 483
274     [self performSelector:@selector(wipeIn) withObject:nil afterDelay:0.0];
275 masaki 10 }
276 masaki 190 - (IBAction)switchListView:(id)sender
277     {
278     [self setCurrentListViewType:typeTableView];
279     }
280     - (IBAction)switchRegularIconView:(id)sender
281     {
282     [self setCurrentListViewType:typeCollectionView];
283     [(XspfMCollectionViewController *)listViewController collectionViewItemViewRegular:sender];
284     }
285     - (IBAction)switchSmallIconView:(id)sender
286     {
287     [self setCurrentListViewType:typeCollectionView];
288     [(XspfMCollectionViewController *)listViewController collectionViewItemViewSmall:sender];
289     }
290 masaki 281 - (IBAction)switchCoverFlowView:(id)sender
291     {
292     [self setCurrentListViewType:typeCoverFlowView];
293     }
294 masakih 483 - (IBAction)rotateViewType:(id)sender
295     {
296     NSInteger newType = currentListViewType + 1;
297     if(newType > 3) newType = 1;
298     [self setCurrentListViewType:newType];
299     }
300     - (IBAction)switchActiveView:(id)sender
301     {
302     id firstResponder = self.window.firstResponder;
303     if(firstResponder == listViewController.initialFirstResponder) {
304 masakih 550 [[self window] makeFirstResponder:[libraryViewController initialFirstResponder]];
305 masakih 483 } else {
306 masakih 550 [[self window] makeFirstResponder:[listViewController initialFirstResponder]];
307 masakih 483 }
308     }
309 masaki 190
310 masaki 2 - (IBAction)add:(id)sender
311     {
312     NSOpenPanel *panel = [NSOpenPanel openPanel];
313    
314     [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]];
315     [panel setAllowsMultipleSelection:YES];
316 masaki 9 [panel setDelegate:self];
317 masaki 2
318     [panel beginSheetForDirectory:nil
319     file:nil
320     types:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]
321 masaki 8 modalForWindow:[self window]
322 masaki 2 modalDelegate:self
323     didEndSelector:@selector(endOpenPanel:::)
324     contextInfo:NULL];
325     }
326 masaki 106 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
327     {
328     [panel orderOut:nil];
329 masaki 2
330 masaki 106 if(returnCode == NSCancelButton) return;
331    
332     NSArray *URLs = [panel URLs];
333     if([URLs count] == 0) return;
334    
335 masaki 184 [appDelegate registerURLs:URLs];
336 masaki 106 }
337 masakih 393 - (IBAction)delete:(id)sender
338     {
339     [self remove:sender];
340     }
341 masaki 190 - (IBAction)remove:(id)sender
342     {
343 masaki 199 [self removeSelectedItem];
344 masaki 190 }
345 masaki 182
346 masaki 194 - (IBAction)newPredicate:(id)sender
347     {
348 masakih 393 [libraryViewController createPredicate:sender];
349 masaki 194 }
350    
351 masakih 358 - (IBAction)showHideDetail:(id)sender
352     {
353 masakih 370 XspfMPreferences *pref = [XspfMPreferences sharedPreference];
354 masakih 358
355 masakih 483 NSPoint origin = [detailPlaceholderView frame].origin;
356 masakih 358 NSSize size = NSZeroSize;
357    
358 masakih 483 CGFloat detailWidth = [detailPlaceholderView frame].size.width;
359 masakih 386 if(![self isOpenDetailView]){ // show
360 masakih 358 origin.x -= detailWidth;
361     size = [splitView frame].size;
362     size.width -= detailWidth;
363 masakih 370
364     pref.openDetailView = YES;
365 masakih 550 [self setOnDetailView];
366 masakih 358 } else { // hide
367     origin.x += detailWidth;
368     size = [splitView frame].size;
369     size.width += detailWidth;
370 masakih 370
371     pref.openDetailView = NO;
372 masakih 358 }
373 masakih 483 [[detailPlaceholderView animator] setFrameOrigin:origin];
374 masakih 358 [[splitView animator] setFrameSize:size];
375 masakih 373
376 masakih 386 // アニメーションが終わってから確認する。
377 masakih 483 NSAnimationContext *context = [NSAnimationContext currentContext];
378 masakih 386 NSTimeInterval duration = [context duration];
379     [self performSelector:@selector(validateControl:) withObject:detailViewButton afterDelay:duration + 0.1];
380 masakih 550 [self performSelector:@selector(pullOutDetailView:) withObject:nil afterDelay:duration + 0.11];
381 masakih 358 }
382 masakih 483 - (BOOL)validateMenuItemForListMode:(NSMenuItem *)menuItem
383 masaki 190 {
384     BOOL enabled = YES;
385     SEL action = [menuItem action];
386    
387     if(action == @selector(switchListView:)) {
388     if(currentListViewType == typeTableView) {
389     [menuItem setState:NSOnState];
390     } else {
391     [menuItem setState:NSOffState];
392     }
393     } else if(action == @selector(switchRegularIconView:)) {
394     if(currentListViewType == typeCollectionView
395     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXspfMRegularItem) {
396     [menuItem setState:NSOnState];
397     } else {
398     [menuItem setState:NSOffState];
399     }
400     } else if(action == @selector(switchSmallIconView:)) {
401     if(currentListViewType == typeCollectionView
402     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXSpfMSmallItem) {
403     [menuItem setState:NSOnState];
404     } else {
405     [menuItem setState:NSOffState];
406     }
407 masaki 281 } else if(action == @selector(switchCoverFlowView:)) {
408     if(currentListViewType == typeCoverFlowView) {
409     [menuItem setState:NSOnState];
410     } else {
411     [menuItem setState:NSOffState];
412     }
413 masakih 551 } else if(action == @selector(showHideDetail:)) {
414     if([self isOpenDetailView]) {
415     [menuItem setTitle:NSLocalizedString(@"Hide Detail", @"Hide Detail")];
416     } else {
417     [menuItem setTitle:NSLocalizedString(@"Show Detail", @"Show Detail")];
418     }
419 masaki 190 }
420    
421 masakih 393 if(action == @selector(remove:) || action == @selector(delete:)) {
422 masakih 506 if(!controller.isSelected) return NO;
423 masakih 393
424     NSView *listView_ = [listViewController view];
425     id responder = [[self window] firstResponder];
426     while(responder) {
427     if(listView_ == responder) return YES;
428     responder = [responder nextResponder];
429     }
430     enabled = NO;
431     }
432    
433 masakih 559 if([controller respondsToSelector:[menuItem action]]) {
434     return [controller validateMenuItem:menuItem];
435     }
436    
437 masaki 190 return enabled;
438     }
439 masakih 483 - (BOOL)validateMenuItemForMovieMode:(NSMenuItem *)menuItem
440 masakih 373 {
441 masakih 559 if([movieViewController respondsToSelector:[menuItem action]]) {
442     return [movieViewController validateMenuItem:menuItem];
443 masakih 502 }
444 masakih 483
445     return YES;
446     }
447     - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
448     {
449     switch(appDelegate.mode) {
450     case modeList:
451     return [self validateMenuItemForListMode:menuItem];
452     break;
453     case modeMovie:
454     return [self validateMenuItemForMovieMode:menuItem];
455     break;
456     }
457    
458     return NO;
459     }
460    
461     - (BOOL)validateControl:(NSControl *)anItem
462     {
463 masakih 373 if([detailViewButton isEqual:anItem]) {
464     if([self isOpenDetailView]) {
465     [detailViewButton setImage:[NSImage imageNamed:@"NSRightFacingTriangleTemplate"]];
466 masakih 551 [detailViewButton setToolTip:NSLocalizedString(@"Hide Detail", @"Hide Detail")];
467 masakih 373 } else {
468     [detailViewButton setImage:[NSImage imageNamed:@"NSLeftFacingTriangleTemplate"]];
469 masakih 551 [detailViewButton setToolTip:NSLocalizedString(@"Show Detail", @"Show Detail")];
470 masakih 550
471     id keyView = [[self window] firstResponder];
472 masakih 573 if(![keyView respondsToSelector:@selector(visibleRect)]) return NO;
473 masakih 550 if(NSEqualSizes([keyView visibleRect].size, NSZeroSize)) {
474     [[self window] makeFirstResponder:[listViewController initialFirstResponder]];
475     }
476 masakih 373 }
477 masakih 554 [self recalculateKeyViewLoop];
478 masakih 483 return YES;
479 masakih 373 }
480 masakih 483
481     SEL action = [anItem action];
482     if(action == @selector(newPredicate:)) {
483     if(self.mode == modeMovie) {
484     return NO;
485     }
486     }
487 masakih 373 return YES;
488     }
489 masaki 25 #pragma mark#### Other methods ####
490 masaki 199 - (void)removeSelectedItem
491     {
492 masakih 506 XspfMXspfObject *obj = controller.selectedItem;
493 masaki 199
494     NSBeginInformationalAlertSheet(nil, nil, @"Cancel", nil, [self window],
495     self, @selector(didEndAskDelete:::), Nil, obj,
496     NSLocalizedString(@"Do you really delete item \"%@\" from list?", @"Do you really delete item \"%@\" from list?"),
497     obj.title);
498     }
499     - (void)didEndAskDelete:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
500     {
501     if(returnCode == NSCancelButton) return;
502    
503     [appDelegate removeObject:contextInfo];
504     }
505    
506 masaki 189 - (void)recalculateKeyViewLoop
507     {
508     [searchField setNextKeyView:[libraryViewController firstKeyView]];
509     [libraryViewController setNextKeyView:[listViewController firstKeyView]];
510 masakih 550 if([self isOpenDetailView]) {
511     [listViewController setNextKeyView:[detailViewController firstKeyView]];
512     [detailViewController setNextKeyView:searchField];
513 masakih 554 HMLog(HMLogLevelDebug, @"Recalc with detail.");
514 masakih 550 } else {
515     [listViewController setNextKeyView:searchField];
516 masakih 554 HMLog(HMLogLevelDebug, @"Recalc without detail.");
517 masakih 550 }
518 masaki 189 }
519 masakih 499 - (void)overlayView:(NSView *)view on:(NSView *)original offset:(NSPoint)offset extend:(NSSize)extend
520     {
521     NSRect frame = original.frame;
522     frame.origin = offset;
523     frame.size.width += extend.width;
524     frame.size.height += extend.height;
525     view.frame = frame;
526     [original addSubview:view];
527     }
528 masaki 25 - (void)changeViewType:(XspfMViewType)viewType
529     {
530     if(currentListViewType == viewType) return;
531     currentListViewType = viewType;
532    
533     NSString *className = nil;
534     switch(currentListViewType) {
535     case typeCollectionView:
536     className = @"XspfMCollectionViewController";
537     break;
538     case typeTableView:
539     className = @"XspfMListViewController";
540     break;
541 masaki 281 case typeCoverFlowView:
542     className = @"XspfMCoverFlowViewController";
543     break;
544 masakih 573 case typeNotSelected:
545     default:
546     break;
547 masaki 25 }
548     if(!className) return;
549    
550 masakih 483 XspfMViewController *targetContorller = [listViewControllers objectForKey:className];
551 masaki 25 if(!targetContorller) {
552     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
553     if(!targetContorller) return;
554 masaki 192
555     id selectionIndexes = [controller selectionIndexes];
556 masakih 483 [listViewControllers setObject:targetContorller forKey:className];
557 masaki 180 [targetContorller view];
558 masaki 30 [targetContorller setRepresentedObject:controller];
559 masaki 189 [targetContorller recalculateKeyViewLoop];
560 masaki 192 [controller setSelectionIndexes:selectionIndexes];
561 masaki 25 }
562 masaki 109
563 masaki 25 [[listViewController view] removeFromSuperview];
564     listViewController = targetContorller;
565 masakih 499 [self overlayView:listViewController.view
566     on:listPlaceholderView
567     offset:NSMakePoint(0, -1)
568     extend:NSMakeSize(0, 1)];
569 masaki 189 // [[self window] recalculateKeyViewLoop];
570     [self recalculateKeyViewLoop];
571 masakih 429
572     /* TODO
573     環境設定で変更可能にする
574     */
575     [listViewController performSelector:@selector(scrollToSelection:) withObject:self afterDelay:0.0];
576 masaki 25 }
577 masaki 2
578 masakih 555 - (void)selectAndScrollTo:(XspfMXspfObject *)object
579     {
580     [controller setSelectedObjects:[NSArray arrayWithObject:object]];
581     [listViewController scrollToSelection:nil];
582 masakih 566 [libraryViewController selectLibrayItem:nil];
583 masakih 555 }
584     - (void)createPlayList:(id)sender
585     {
586     NSDocumentController *dc = [NSDocumentController sharedDocumentController];
587     NSError *error = nil;
588     NSDocument *doc = [dc makeUntitledDocumentOfType:@"com.masakih.xspf"
589     error:&error];
590     if(!doc) {
591     NSString *errorString;
592     if(error) {
593     errorString = [NSString stringWithFormat:@"%@", [error localizedDescription]];
594     } else {
595     errorString = [NSString stringWithFormat:@"Could not create new documnet."];
596     }
597     NSLog(@"%@", errorString);
598     NSBeep();
599     return;
600     }
601     NSURL *newDocumentURL = [appDelegate availableFileURL];
602     [doc setFileURL:newDocumentURL];
603     [doc saveDocument:nil];
604    
605     XspfMXspfObject *object = [appDelegate registerWithURL:newDocumentURL];
606     [self performSelector:@selector(selectAndScrollTo:)
607     withObject:object
608     afterDelay:0.0];
609     [doc close];
610     }
611 masaki 5
612 masakih 555 - (void)setOnDetailView
613     {
614     [self overlayView:detailViewController.view
615     on:detailPlaceholderView
616     offset:NSZeroPoint
617     extend:NSZeroSize];
618     }
619     - (void)pullOutDetailView:(id)dummy
620     {
621     if([self isOpenDetailView]) return;
622     [detailViewController.view removeFromSuperview];
623     HMLog(HMLogLevelDebug, @"PullOut");
624     }
625    
626     - (void)removePlayerView
627     {
628     NSView *playerView = movieViewController.view;
629     [playerView setHidden:YES];
630     [playerView removeFromSuperview];
631    
632     // List view
633     NSView *playListView = playListViewController.view;
634     [playListView removeFromSuperview];
635     self.playListViewController = nil;
636    
637     NSDocument *doc = [movieViewController representedObject];
638     if([doc hasUnautosavedChanges]) {
639     [doc saveDocument:nil];
640     }
641     [doc close];
642     self.movieViewController = nil;
643    
644     [[self window] makeFirstResponder:[listViewController initialFirstResponder]];
645     }
646     - (void)hideListContentView
647     {
648     [listViewController.view removeFromSuperview];
649     [spin stopAnimation:self];
650    
651     [movieViewController play];
652     }
653    
654    
655     - (void)wipeOut
656     {
657     NSTimeInterval duration = 0.3;
658     [[NSAnimationContext currentContext] setDuration:duration];
659    
660     NSView *playerView = movieViewController.view;
661     NSRect listViewFrame = listPlaceholderView.frame;
662     NSView *listViewContentView = listViewController.view;
663     NSRect listViewContentViewFrame = listViewContentView.frame;
664     listViewContentViewFrame.origin.x = 0;
665     listViewContentViewFrame.size = listViewFrame.size;
666     [[listViewContentView animator] setFrame:listViewContentViewFrame];
667    
668     NSRect playerViewFrame = playerView.frame;
669     playerViewFrame.origin.x = NSWidth(listViewFrame);
670     [[playerView animator] setFrame:playerViewFrame];
671    
672     // List view
673     NSView *playListView = playListViewController.view;
674     NSRect playListViewFrame = playListView.frame;
675     playListViewFrame.origin.y = -NSHeight(libraryPlaceholderView.frame);
676     [[playListView animator] setFrame:playListViewFrame];
677    
678     [self performSelector:@selector(removePlayerView) withObject:nil afterDelay:duration + 0.01];
679     }
680     - (void)wipeIn
681     {
682     NSTimeInterval duration = 0.3;
683     [[NSAnimationContext currentContext] setDuration:duration];
684    
685     NSView *playerView = movieViewController.view;
686     NSView *listViewContentView = listViewController.view;
687     NSRect listViewContentViewFrame = listViewContentView.frame;
688     listViewContentViewFrame.origin.x -= NSWidth(listPlaceholderView.frame);
689     [[listViewContentView animator] setFrame:listViewContentViewFrame];
690    
691     NSRect playerViewFrame = playerView.frame;
692     playerViewFrame.origin.x = 0;
693     [[playerView animator] setFrame:playerViewFrame];
694    
695    
696     // List view
697     NSView *playListView = playListViewController.view;
698     NSRect playListViewFrame = playListView.frame;
699     playListViewFrame.origin.y = -1;
700     [[playListView animator] setFrame:playListViewFrame];
701    
702     [self performSelector:@selector(hideListContentView) withObject:nil afterDelay:duration + 0.01];
703     }
704 masakih 561 - (BOOL)prepareWipeIn
705 masakih 555 {
706     [self.spin startAnimation:self];
707     XspfMXspfObject *rep = controller.selectedItem;
708    
709     NSError *error = nil;
710     NSDocumentController *dc = [NSDocumentController sharedDocumentController];
711     NSDocument *doc = [dc openDocumentWithContentsOfURL:rep.url
712     display:NO
713     error:&error];
714     if(doc) {
715     rep.lastPlayDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
716 masakih 561 } else {
717     [spin stopAnimation:self];
718     return NO;
719 masakih 555 }
720 masakih 561 self.mode = modeMovie;
721 masakih 555 [doc makeWindowControllers];
722    
723     NSArray *windowControllers = [doc windowControllers];
724     [windowControllers makeObjectsPerformSelector:@selector(window)];
725     XspfQTMovieWindowController *windowController = [windowControllers objectAtIndex:0];
726     self.movieViewController = windowController.contentViewController;
727     [self overlayView:movieViewController.view
728     on:listPlaceholderView
729     offset:NSMakePoint(NSWidth(listPlaceholderView.frame), 0)
730     extend:NSZeroSize];
731    
732     self.playListViewController = [[[XspfMPlayListViewController alloc] init] autorelease];
733     playListViewController.representedObject = doc;
734     [self overlayView:playListViewController.view
735     on:libraryPlaceholderView
736     offset:NSMakePoint(-1, -NSHeight(libraryPlaceholderView.frame) - 1)
737     extend:NSMakeSize(1, 1)];
738 masakih 561
739     return YES;
740 masakih 555 }
741    
742     #pragma mark#### Set up views ####
743 masaki 43 - (void)setupXspfLists
744 masaki 36 {
745 masaki 47 if(libraryViewController) return;
746    
747 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
748 masakih 483 [libraryViewController setRepresentedObject:libraryController];
749 masakih 499 [self overlayView:libraryViewController.view
750     on:libraryPlaceholderView
751     offset:NSMakePoint(-1, -1)
752     extend:NSMakeSize(2, 1)];
753 masaki 189 [libraryViewController recalculateKeyViewLoop];
754 masaki 36 }
755 masaki 47 - (void)setupDetailView
756 masaki 6 {
757 masaki 47 if(detailViewController) return;
758 masaki 6
759 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
760     [detailViewController setRepresentedObject:controller];
761 masakih 499 [self overlayView:detailViewController.view
762     on:detailPlaceholderView
763     offset:NSZeroPoint
764     extend:NSZeroSize];
765 masaki 189 [detailViewController recalculateKeyViewLoop];
766 masaki 6 }
767 masaki 82 - (void)setupAccessorylView
768     {
769     if(accessoryViewController) return;
770    
771     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
772     [accessoryViewController setRepresentedObject:[appDelegate channel]];
773 masakih 499 [self overlayView:accessoryViewController.view
774     on:accessoryPlaceholderView
775     offset:NSZeroPoint
776     extend:NSZeroSize];
777 masaki 189 // [accessoryViewController recalculateKeyViewLoop];
778 masaki 82 }
779 masaki 8 #pragma mark#### NSWidnow Delegate ####
780     /**
781     Returns the NSUndoManager for the application. In this case, the manager
782     returned is that of the managed object context for the application.
783     */
784 masaki 6
785 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
786     return [[appDelegate managedObjectContext] undoManager];
787     }
788    
789 masakih 370 - (void)windowWillClose:(NSNotification *)notification
790     {
791     XspfMPreferences *pref = [XspfMPreferences sharedPreference];
792 masakih 483 pref.splitViewLeftWidth = [libraryPlaceholderView frame].size.width;
793 masakih 370 }
794    
795 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
796     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
797     {
798 masaki 184 return ![appDelegate didRegisteredURL:[NSURL fileURLWithPath:filename]];
799 masaki 9 }
800 masaki 294 #pragma mark#### NSSplitView Delegate ####
801     - (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex
802     {
803     return 130;
804     }
805 masaki 295 - (void)splitView:(NSSplitView *)aSplitView resizeSubviewsWithOldSize:(NSSize)oldSize
806     {
807     NSView *rightView = [[splitView subviews] objectAtIndex:1];
808     NSRect newFrame = [splitView frame];
809 masakih 483 NSRect libFrame = [libraryPlaceholderView frame];
810 masaki 295 NSRect listFrame = [rightView frame];
811     CGFloat dividerThickness = [splitView dividerThickness];
812    
813     libFrame.size.height = newFrame.size.height;
814     listFrame.size.height = newFrame.size.height;
815    
816     listFrame.size.width = newFrame.size.width - libFrame.size.width - dividerThickness;
817    
818     if(listFrame.size.width < 0) listFrame.size.width = 0;
819    
820 masakih 483 [libraryPlaceholderView setFrame:libFrame];
821 masaki 295 [rightView setFrame:listFrame];
822     }
823 masaki 193
824 masaki 185 #pragma mark#### XspfManager Notifications ####
825     - (void)managerDidAddObjects:(NSNotification *)notification
826     {
827     id addedObjects = [[notification userInfo] objectForKey:@"XspfManagerAddedXspfObjects"];
828     if(!addedObjects || ![addedObjects isKindOfClass:[NSArray class]] || [addedObjects count] == 0) return;
829    
830     [controller performSelector:@selector(setSelectedObjects:)
831     withObject:addedObjects
832     afterDelay:0.01];
833     }
834    
835 masaki 184 #pragma mark#### Test ####
836     - (IBAction)test01:(id)sender
837     {
838 masakih 550 id firstKeyView = [[self window] firstResponder];
839     NSView *view = firstKeyView;
840     do {
841     HMLog(HMLogLevelDebug, @"KeyView -> %@", view);
842     view = [view nextValidKeyView];
843     } while(view && view != firstKeyView);
844 masaki 184 }
845     - (IBAction)test02:(id)sender
846     {
847     NSResponder *responder = [[self window] firstResponder];
848     while(responder) {
849 masaki 188 HMLog(HMLogLevelDebug, @"Responder -> %@", responder);
850 masaki 184 responder = [responder nextResponder];
851     }
852     }
853 masakih 483 //- (IBAction)test03:(id)sender
854     //{
855     // [listController setAutomaticallyRearrangesObjects:YES];
856     //
857     //}
858     @end
859    
860     @implementation XspfMMainWindowController (MessageForwarding)
861     - (BOOL)respondsToSelector:(SEL)aSelector
862 masaki 184 {
863 masakih 483 if([super respondsToSelector:aSelector]) return YES;
864 masakih 559 if([movieViewController respondsToSelector:aSelector]) return YES;
865 masakih 500 if([controller respondsToSelector:aSelector]) return YES;
866 masakih 483
867     return NO;
868     }
869     - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
870     {
871 masakih 559 if([movieViewController respondsToSelector:aSelector]) {
872     return [movieViewController methodSignatureForSelector:aSelector];
873 masakih 483 }
874 masakih 500 if([controller respondsToSelector:aSelector]) {
875     return [controller methodSignatureForSelector:aSelector];
876     }
877 masakih 483 return [super methodSignatureForSelector:aSelector];
878     }
879     - (void)forwardInvocation:(NSInvocation *)anInvocation
880     {
881     SEL selector = [anInvocation selector];
882 masakih 559 if([movieViewController respondsToSelector:selector]) {
883     [anInvocation invokeWithTarget:movieViewController];
884 masakih 483 return;
885     }
886 masakih 500 if([controller respondsToSelector:selector]) {
887     [anInvocation invokeWithTarget:controller];
888     return;
889     }
890 masakih 483 }
891 masakih 380
892 masaki 184 @end

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