Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 566 - (hide annotations) (download)
Mon Jun 20 14:18:18 2011 UTC (12 years, 10 months ago) by masakih
File size: 28160 byte(s)
[Fix] ライブラリ以外が選択されている時の新規プレイリストの挙動を修正。(#24232)
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 483 // [self validateControl:detailViewButton];
155     [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 380 [self performSelector:@selector(delayExcute:) withObject:self afterDelay:0.1];
173 masaki 49 }
174 masakih 380 - (void)delayExcute:(id)dummy
175     {
176     [self showWindow:self];
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     if(NSEqualSizes([keyView visibleRect].size, NSZeroSize)) {
473     [[self window] makeFirstResponder:[listViewController initialFirstResponder]];
474     }
475 masakih 373 }
476 masakih 554 [self recalculateKeyViewLoop];
477 masakih 483 return YES;
478 masakih 373 }
479 masakih 483
480     SEL action = [anItem action];
481     if(action == @selector(newPredicate:)) {
482     if(self.mode == modeMovie) {
483     return NO;
484     }
485     }
486 masakih 373 return YES;
487     }
488 masaki 25 #pragma mark#### Other methods ####
489 masaki 199 - (void)removeSelectedItem
490     {
491 masakih 506 XspfMXspfObject *obj = controller.selectedItem;
492 masaki 199
493     NSBeginInformationalAlertSheet(nil, nil, @"Cancel", nil, [self window],
494     self, @selector(didEndAskDelete:::), Nil, obj,
495     NSLocalizedString(@"Do you really delete item \"%@\" from list?", @"Do you really delete item \"%@\" from list?"),
496     obj.title);
497     }
498     - (void)didEndAskDelete:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
499     {
500     if(returnCode == NSCancelButton) return;
501    
502     [appDelegate removeObject:contextInfo];
503     }
504    
505 masaki 189 - (void)recalculateKeyViewLoop
506     {
507     [searchField setNextKeyView:[libraryViewController firstKeyView]];
508     [libraryViewController setNextKeyView:[listViewController firstKeyView]];
509 masakih 550 if([self isOpenDetailView]) {
510     [listViewController setNextKeyView:[detailViewController firstKeyView]];
511     [detailViewController setNextKeyView:searchField];
512 masakih 554 HMLog(HMLogLevelDebug, @"Recalc with detail.");
513 masakih 550 } else {
514     [listViewController setNextKeyView:searchField];
515 masakih 554 HMLog(HMLogLevelDebug, @"Recalc without detail.");
516 masakih 550 }
517 masaki 189 }
518 masakih 499 - (void)overlayView:(NSView *)view on:(NSView *)original offset:(NSPoint)offset extend:(NSSize)extend
519     {
520     NSRect frame = original.frame;
521     frame.origin = offset;
522     frame.size.width += extend.width;
523     frame.size.height += extend.height;
524     view.frame = frame;
525     [original addSubview:view];
526     }
527 masaki 25 - (void)changeViewType:(XspfMViewType)viewType
528     {
529     if(currentListViewType == viewType) return;
530     currentListViewType = viewType;
531    
532     NSString *className = nil;
533     switch(currentListViewType) {
534     case typeCollectionView:
535     className = @"XspfMCollectionViewController";
536     break;
537     case typeTableView:
538     className = @"XspfMListViewController";
539     break;
540 masaki 281 case typeCoverFlowView:
541     className = @"XspfMCoverFlowViewController";
542     break;
543 masaki 25 }
544     if(!className) return;
545    
546 masakih 483 XspfMViewController *targetContorller = [listViewControllers objectForKey:className];
547 masaki 25 if(!targetContorller) {
548     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
549     if(!targetContorller) return;
550 masaki 192
551     id selectionIndexes = [controller selectionIndexes];
552 masakih 483 [listViewControllers setObject:targetContorller forKey:className];
553 masaki 180 [targetContorller view];
554 masaki 30 [targetContorller setRepresentedObject:controller];
555 masaki 189 [targetContorller recalculateKeyViewLoop];
556 masaki 192 [controller setSelectionIndexes:selectionIndexes];
557 masaki 25 }
558 masaki 109
559 masaki 25 [[listViewController view] removeFromSuperview];
560     listViewController = targetContorller;
561 masakih 499 [self overlayView:listViewController.view
562     on:listPlaceholderView
563     offset:NSMakePoint(0, -1)
564     extend:NSMakeSize(0, 1)];
565 masaki 189 // [[self window] recalculateKeyViewLoop];
566     [self recalculateKeyViewLoop];
567 masakih 429
568     /* TODO
569     環境設定で変更可能にする
570     */
571     [listViewController performSelector:@selector(scrollToSelection:) withObject:self afterDelay:0.0];
572 masaki 25 }
573 masaki 2
574 masakih 555 - (void)selectAndScrollTo:(XspfMXspfObject *)object
575     {
576     [controller setSelectedObjects:[NSArray arrayWithObject:object]];
577     [listViewController scrollToSelection:nil];
578 masakih 566 [libraryViewController selectLibrayItem:nil];
579 masakih 555 }
580     - (void)createPlayList:(id)sender
581     {
582     NSDocumentController *dc = [NSDocumentController sharedDocumentController];
583     NSError *error = nil;
584     NSDocument *doc = [dc makeUntitledDocumentOfType:@"com.masakih.xspf"
585     error:&error];
586     if(!doc) {
587     NSString *errorString;
588     if(error) {
589     errorString = [NSString stringWithFormat:@"%@", [error localizedDescription]];
590     } else {
591     errorString = [NSString stringWithFormat:@"Could not create new documnet."];
592     }
593     NSLog(@"%@", errorString);
594     NSBeep();
595     return;
596     }
597     NSURL *newDocumentURL = [appDelegate availableFileURL];
598     [doc setFileURL:newDocumentURL];
599     [doc saveDocument:nil];
600    
601     XspfMXspfObject *object = [appDelegate registerWithURL:newDocumentURL];
602     [self performSelector:@selector(selectAndScrollTo:)
603     withObject:object
604     afterDelay:0.0];
605     [doc close];
606     }
607 masaki 5
608 masakih 555 - (void)setOnDetailView
609     {
610     [self overlayView:detailViewController.view
611     on:detailPlaceholderView
612     offset:NSZeroPoint
613     extend:NSZeroSize];
614     }
615     - (void)pullOutDetailView:(id)dummy
616     {
617     if([self isOpenDetailView]) return;
618     [detailViewController.view removeFromSuperview];
619     HMLog(HMLogLevelDebug, @"PullOut");
620     }
621    
622     - (void)removePlayerView
623     {
624     NSView *playerView = movieViewController.view;
625     [playerView setHidden:YES];
626     [playerView removeFromSuperview];
627    
628     // List view
629     NSView *playListView = playListViewController.view;
630     [playListView removeFromSuperview];
631     self.playListViewController = nil;
632    
633     NSDocument *doc = [movieViewController representedObject];
634     if([doc hasUnautosavedChanges]) {
635     [doc saveDocument:nil];
636     }
637     [doc close];
638     self.movieViewController = nil;
639    
640     [[self window] makeFirstResponder:[listViewController initialFirstResponder]];
641     }
642     - (void)hideListContentView
643     {
644     [listViewController.view removeFromSuperview];
645     [spin stopAnimation:self];
646    
647     [movieViewController play];
648     }
649    
650    
651     - (void)wipeOut
652     {
653     NSTimeInterval duration = 0.3;
654     [[NSAnimationContext currentContext] setDuration:duration];
655    
656     NSView *playerView = movieViewController.view;
657     NSRect listViewFrame = listPlaceholderView.frame;
658     NSView *listViewContentView = listViewController.view;
659     NSRect listViewContentViewFrame = listViewContentView.frame;
660     listViewContentViewFrame.origin.x = 0;
661     listViewContentViewFrame.size = listViewFrame.size;
662     [[listViewContentView animator] setFrame:listViewContentViewFrame];
663    
664     NSRect playerViewFrame = playerView.frame;
665     playerViewFrame.origin.x = NSWidth(listViewFrame);
666     [[playerView animator] setFrame:playerViewFrame];
667    
668     // List view
669     NSView *playListView = playListViewController.view;
670     NSRect playListViewFrame = playListView.frame;
671     playListViewFrame.origin.y = -NSHeight(libraryPlaceholderView.frame);
672     [[playListView animator] setFrame:playListViewFrame];
673    
674     [self performSelector:@selector(removePlayerView) withObject:nil afterDelay:duration + 0.01];
675     }
676     - (void)wipeIn
677     {
678     NSTimeInterval duration = 0.3;
679     [[NSAnimationContext currentContext] setDuration:duration];
680    
681     NSView *playerView = movieViewController.view;
682     NSView *listViewContentView = listViewController.view;
683     NSRect listViewContentViewFrame = listViewContentView.frame;
684     listViewContentViewFrame.origin.x -= NSWidth(listPlaceholderView.frame);
685     [[listViewContentView animator] setFrame:listViewContentViewFrame];
686    
687     NSRect playerViewFrame = playerView.frame;
688     playerViewFrame.origin.x = 0;
689     [[playerView animator] setFrame:playerViewFrame];
690    
691    
692     // List view
693     NSView *playListView = playListViewController.view;
694     NSRect playListViewFrame = playListView.frame;
695     playListViewFrame.origin.y = -1;
696     [[playListView animator] setFrame:playListViewFrame];
697    
698     [self performSelector:@selector(hideListContentView) withObject:nil afterDelay:duration + 0.01];
699     }
700 masakih 561 - (BOOL)prepareWipeIn
701 masakih 555 {
702     [self.spin startAnimation:self];
703     XspfMXspfObject *rep = controller.selectedItem;
704    
705     NSError *error = nil;
706     NSDocumentController *dc = [NSDocumentController sharedDocumentController];
707     NSDocument *doc = [dc openDocumentWithContentsOfURL:rep.url
708     display:NO
709     error:&error];
710     if(doc) {
711     rep.lastPlayDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
712 masakih 561 } else {
713     [spin stopAnimation:self];
714     return NO;
715 masakih 555 }
716 masakih 561 self.mode = modeMovie;
717 masakih 555 [doc makeWindowControllers];
718    
719     NSArray *windowControllers = [doc windowControllers];
720     [windowControllers makeObjectsPerformSelector:@selector(window)];
721     XspfQTMovieWindowController *windowController = [windowControllers objectAtIndex:0];
722     self.movieViewController = windowController.contentViewController;
723     [self overlayView:movieViewController.view
724     on:listPlaceholderView
725     offset:NSMakePoint(NSWidth(listPlaceholderView.frame), 0)
726     extend:NSZeroSize];
727    
728     self.playListViewController = [[[XspfMPlayListViewController alloc] init] autorelease];
729     playListViewController.representedObject = doc;
730     [self overlayView:playListViewController.view
731     on:libraryPlaceholderView
732     offset:NSMakePoint(-1, -NSHeight(libraryPlaceholderView.frame) - 1)
733     extend:NSMakeSize(1, 1)];
734 masakih 561
735     return YES;
736 masakih 555 }
737    
738     #pragma mark#### Set up views ####
739 masaki 43 - (void)setupXspfLists
740 masaki 36 {
741 masaki 47 if(libraryViewController) return;
742    
743 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
744 masakih 483 [libraryViewController setRepresentedObject:libraryController];
745 masakih 499 [self overlayView:libraryViewController.view
746     on:libraryPlaceholderView
747     offset:NSMakePoint(-1, -1)
748     extend:NSMakeSize(2, 1)];
749 masaki 189 [libraryViewController recalculateKeyViewLoop];
750 masaki 36 }
751 masaki 47 - (void)setupDetailView
752 masaki 6 {
753 masaki 47 if(detailViewController) return;
754 masaki 6
755 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
756     [detailViewController setRepresentedObject:controller];
757 masakih 499 [self overlayView:detailViewController.view
758     on:detailPlaceholderView
759     offset:NSZeroPoint
760     extend:NSZeroSize];
761 masaki 189 [detailViewController recalculateKeyViewLoop];
762 masaki 6 }
763 masaki 82 - (void)setupAccessorylView
764     {
765     if(accessoryViewController) return;
766    
767     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
768     [accessoryViewController setRepresentedObject:[appDelegate channel]];
769 masakih 499 [self overlayView:accessoryViewController.view
770     on:accessoryPlaceholderView
771     offset:NSZeroPoint
772     extend:NSZeroSize];
773 masaki 189 // [accessoryViewController recalculateKeyViewLoop];
774 masaki 82 }
775 masaki 8 #pragma mark#### NSWidnow Delegate ####
776     /**
777     Returns the NSUndoManager for the application. In this case, the manager
778     returned is that of the managed object context for the application.
779     */
780 masaki 6
781 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
782     return [[appDelegate managedObjectContext] undoManager];
783     }
784    
785 masakih 370 - (void)windowWillClose:(NSNotification *)notification
786     {
787     XspfMPreferences *pref = [XspfMPreferences sharedPreference];
788 masakih 483 pref.splitViewLeftWidth = [libraryPlaceholderView frame].size.width;
789 masakih 370 }
790    
791 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
792     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
793     {
794 masaki 184 return ![appDelegate didRegisteredURL:[NSURL fileURLWithPath:filename]];
795 masaki 9 }
796 masaki 294 #pragma mark#### NSSplitView Delegate ####
797     - (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex
798     {
799     return 130;
800     }
801 masaki 295 - (void)splitView:(NSSplitView *)aSplitView resizeSubviewsWithOldSize:(NSSize)oldSize
802     {
803     NSView *rightView = [[splitView subviews] objectAtIndex:1];
804     NSRect newFrame = [splitView frame];
805 masakih 483 NSRect libFrame = [libraryPlaceholderView frame];
806 masaki 295 NSRect listFrame = [rightView frame];
807     CGFloat dividerThickness = [splitView dividerThickness];
808    
809     libFrame.size.height = newFrame.size.height;
810     listFrame.size.height = newFrame.size.height;
811    
812     listFrame.size.width = newFrame.size.width - libFrame.size.width - dividerThickness;
813    
814     if(listFrame.size.width < 0) listFrame.size.width = 0;
815    
816 masakih 483 [libraryPlaceholderView setFrame:libFrame];
817 masaki 295 [rightView setFrame:listFrame];
818     }
819 masaki 193
820 masaki 185 #pragma mark#### XspfManager Notifications ####
821     - (void)managerDidAddObjects:(NSNotification *)notification
822     {
823     id addedObjects = [[notification userInfo] objectForKey:@"XspfManagerAddedXspfObjects"];
824     if(!addedObjects || ![addedObjects isKindOfClass:[NSArray class]] || [addedObjects count] == 0) return;
825    
826     [controller performSelector:@selector(setSelectedObjects:)
827     withObject:addedObjects
828     afterDelay:0.01];
829     }
830    
831 masaki 184 #pragma mark#### Test ####
832     - (IBAction)test01:(id)sender
833     {
834 masakih 550 id firstKeyView = [[self window] firstResponder];
835     NSView *view = firstKeyView;
836     do {
837     HMLog(HMLogLevelDebug, @"KeyView -> %@", view);
838     view = [view nextValidKeyView];
839     } while(view && view != firstKeyView);
840 masaki 184 }
841     - (IBAction)test02:(id)sender
842     {
843     NSResponder *responder = [[self window] firstResponder];
844     while(responder) {
845 masaki 188 HMLog(HMLogLevelDebug, @"Responder -> %@", responder);
846 masaki 184 responder = [responder nextResponder];
847     }
848     }
849 masakih 483 //- (IBAction)test03:(id)sender
850     //{
851     // [listController setAutomaticallyRearrangesObjects:YES];
852     //
853     //}
854     @end
855    
856     @implementation XspfMMainWindowController (MessageForwarding)
857     - (BOOL)respondsToSelector:(SEL)aSelector
858 masaki 184 {
859 masakih 483 if([super respondsToSelector:aSelector]) return YES;
860 masakih 559 if([movieViewController respondsToSelector:aSelector]) return YES;
861 masakih 500 if([controller respondsToSelector:aSelector]) return YES;
862 masakih 483
863     return NO;
864     }
865     - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
866     {
867 masakih 559 if([movieViewController respondsToSelector:aSelector]) {
868     return [movieViewController methodSignatureForSelector:aSelector];
869 masakih 483 }
870 masakih 500 if([controller respondsToSelector:aSelector]) {
871     return [controller methodSignatureForSelector:aSelector];
872     }
873 masakih 483 return [super methodSignatureForSelector:aSelector];
874     }
875     - (void)forwardInvocation:(NSInvocation *)anInvocation
876     {
877     SEL selector = [anInvocation selector];
878 masakih 559 if([movieViewController respondsToSelector:selector]) {
879     [anInvocation invokeWithTarget:movieViewController];
880 masakih 483 return;
881     }
882 masakih 500 if([controller respondsToSelector:selector]) {
883     [anInvocation invokeWithTarget:controller];
884     return;
885     }
886 masakih 483 }
887 masakih 380
888 masaki 184 @end

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