Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 561 - (hide annotations) (download)
Wed Mar 9 12:57:53 2011 UTC (13 years, 1 month ago) by masakih
File size: 28113 byte(s)
[Mod] ファイルが見つからない場合アラートを出すようにした。
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     }
579     - (void)createPlayList:(id)sender
580     {
581     NSDocumentController *dc = [NSDocumentController sharedDocumentController];
582     NSError *error = nil;
583     NSDocument *doc = [dc makeUntitledDocumentOfType:@"com.masakih.xspf"
584     error:&error];
585     if(!doc) {
586     NSString *errorString;
587     if(error) {
588     errorString = [NSString stringWithFormat:@"%@", [error localizedDescription]];
589     } else {
590     errorString = [NSString stringWithFormat:@"Could not create new documnet."];
591     }
592     NSLog(@"%@", errorString);
593     NSBeep();
594     return;
595     }
596     NSURL *newDocumentURL = [appDelegate availableFileURL];
597     [doc setFileURL:newDocumentURL];
598     [doc saveDocument:nil];
599    
600     XspfMXspfObject *object = [appDelegate registerWithURL:newDocumentURL];
601     [self performSelector:@selector(selectAndScrollTo:)
602     withObject:object
603     afterDelay:0.0];
604     [doc close];
605     }
606 masaki 5
607 masakih 555 - (void)setOnDetailView
608     {
609     [self overlayView:detailViewController.view
610     on:detailPlaceholderView
611     offset:NSZeroPoint
612     extend:NSZeroSize];
613     }
614     - (void)pullOutDetailView:(id)dummy
615     {
616     if([self isOpenDetailView]) return;
617     [detailViewController.view removeFromSuperview];
618     HMLog(HMLogLevelDebug, @"PullOut");
619     }
620    
621     - (void)removePlayerView
622     {
623     NSView *playerView = movieViewController.view;
624     [playerView setHidden:YES];
625     [playerView removeFromSuperview];
626    
627     // List view
628     NSView *playListView = playListViewController.view;
629     [playListView removeFromSuperview];
630     self.playListViewController = nil;
631    
632     NSDocument *doc = [movieViewController representedObject];
633     if([doc hasUnautosavedChanges]) {
634     [doc saveDocument:nil];
635     }
636     [doc close];
637     self.movieViewController = nil;
638    
639     [[self window] makeFirstResponder:[listViewController initialFirstResponder]];
640     }
641     - (void)hideListContentView
642     {
643     [listViewController.view removeFromSuperview];
644     [spin stopAnimation:self];
645    
646     [movieViewController play];
647     }
648    
649    
650     - (void)wipeOut
651     {
652     NSTimeInterval duration = 0.3;
653     [[NSAnimationContext currentContext] setDuration:duration];
654    
655     NSView *playerView = movieViewController.view;
656     NSRect listViewFrame = listPlaceholderView.frame;
657     NSView *listViewContentView = listViewController.view;
658     NSRect listViewContentViewFrame = listViewContentView.frame;
659     listViewContentViewFrame.origin.x = 0;
660     listViewContentViewFrame.size = listViewFrame.size;
661     [[listViewContentView animator] setFrame:listViewContentViewFrame];
662    
663     NSRect playerViewFrame = playerView.frame;
664     playerViewFrame.origin.x = NSWidth(listViewFrame);
665     [[playerView animator] setFrame:playerViewFrame];
666    
667     // List view
668     NSView *playListView = playListViewController.view;
669     NSRect playListViewFrame = playListView.frame;
670     playListViewFrame.origin.y = -NSHeight(libraryPlaceholderView.frame);
671     [[playListView animator] setFrame:playListViewFrame];
672    
673     [self performSelector:@selector(removePlayerView) withObject:nil afterDelay:duration + 0.01];
674     }
675     - (void)wipeIn
676     {
677     NSTimeInterval duration = 0.3;
678     [[NSAnimationContext currentContext] setDuration:duration];
679    
680     NSView *playerView = movieViewController.view;
681     NSView *listViewContentView = listViewController.view;
682     NSRect listViewContentViewFrame = listViewContentView.frame;
683     listViewContentViewFrame.origin.x -= NSWidth(listPlaceholderView.frame);
684     [[listViewContentView animator] setFrame:listViewContentViewFrame];
685    
686     NSRect playerViewFrame = playerView.frame;
687     playerViewFrame.origin.x = 0;
688     [[playerView animator] setFrame:playerViewFrame];
689    
690    
691     // List view
692     NSView *playListView = playListViewController.view;
693     NSRect playListViewFrame = playListView.frame;
694     playListViewFrame.origin.y = -1;
695     [[playListView animator] setFrame:playListViewFrame];
696    
697     [self performSelector:@selector(hideListContentView) withObject:nil afterDelay:duration + 0.01];
698     }
699 masakih 561 - (BOOL)prepareWipeIn
700 masakih 555 {
701     [self.spin startAnimation:self];
702     XspfMXspfObject *rep = controller.selectedItem;
703    
704     NSError *error = nil;
705     NSDocumentController *dc = [NSDocumentController sharedDocumentController];
706     NSDocument *doc = [dc openDocumentWithContentsOfURL:rep.url
707     display:NO
708     error:&error];
709     if(doc) {
710     rep.lastPlayDate = [NSDate dateWithTimeIntervalSinceNow:0.0];
711 masakih 561 } else {
712     [spin stopAnimation:self];
713     return NO;
714 masakih 555 }
715 masakih 561 self.mode = modeMovie;
716 masakih 555 [doc makeWindowControllers];
717    
718     NSArray *windowControllers = [doc windowControllers];
719     [windowControllers makeObjectsPerformSelector:@selector(window)];
720     XspfQTMovieWindowController *windowController = [windowControllers objectAtIndex:0];
721     self.movieViewController = windowController.contentViewController;
722     [self overlayView:movieViewController.view
723     on:listPlaceholderView
724     offset:NSMakePoint(NSWidth(listPlaceholderView.frame), 0)
725     extend:NSZeroSize];
726    
727     self.playListViewController = [[[XspfMPlayListViewController alloc] init] autorelease];
728     playListViewController.representedObject = doc;
729     [self overlayView:playListViewController.view
730     on:libraryPlaceholderView
731     offset:NSMakePoint(-1, -NSHeight(libraryPlaceholderView.frame) - 1)
732     extend:NSMakeSize(1, 1)];
733 masakih 561
734     return YES;
735 masakih 555 }
736    
737     #pragma mark#### Set up views ####
738 masaki 43 - (void)setupXspfLists
739 masaki 36 {
740 masaki 47 if(libraryViewController) return;
741    
742 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
743 masakih 483 [libraryViewController setRepresentedObject:libraryController];
744 masakih 499 [self overlayView:libraryViewController.view
745     on:libraryPlaceholderView
746     offset:NSMakePoint(-1, -1)
747     extend:NSMakeSize(2, 1)];
748 masaki 189 [libraryViewController recalculateKeyViewLoop];
749 masaki 36 }
750 masaki 47 - (void)setupDetailView
751 masaki 6 {
752 masaki 47 if(detailViewController) return;
753 masaki 6
754 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
755     [detailViewController setRepresentedObject:controller];
756 masakih 499 [self overlayView:detailViewController.view
757     on:detailPlaceholderView
758     offset:NSZeroPoint
759     extend:NSZeroSize];
760 masaki 189 [detailViewController recalculateKeyViewLoop];
761 masaki 6 }
762 masaki 82 - (void)setupAccessorylView
763     {
764     if(accessoryViewController) return;
765    
766     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
767     [accessoryViewController setRepresentedObject:[appDelegate channel]];
768 masakih 499 [self overlayView:accessoryViewController.view
769     on:accessoryPlaceholderView
770     offset:NSZeroPoint
771     extend:NSZeroSize];
772 masaki 189 // [accessoryViewController recalculateKeyViewLoop];
773 masaki 82 }
774 masaki 8 #pragma mark#### NSWidnow Delegate ####
775     /**
776     Returns the NSUndoManager for the application. In this case, the manager
777     returned is that of the managed object context for the application.
778     */
779 masaki 6
780 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
781     return [[appDelegate managedObjectContext] undoManager];
782     }
783    
784 masakih 370 - (void)windowWillClose:(NSNotification *)notification
785     {
786     XspfMPreferences *pref = [XspfMPreferences sharedPreference];
787 masakih 483 pref.splitViewLeftWidth = [libraryPlaceholderView frame].size.width;
788 masakih 370 }
789    
790 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
791     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
792     {
793 masaki 184 return ![appDelegate didRegisteredURL:[NSURL fileURLWithPath:filename]];
794 masaki 9 }
795 masaki 294 #pragma mark#### NSSplitView Delegate ####
796     - (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex
797     {
798     return 130;
799     }
800 masaki 295 - (void)splitView:(NSSplitView *)aSplitView resizeSubviewsWithOldSize:(NSSize)oldSize
801     {
802     NSView *rightView = [[splitView subviews] objectAtIndex:1];
803     NSRect newFrame = [splitView frame];
804 masakih 483 NSRect libFrame = [libraryPlaceholderView frame];
805 masaki 295 NSRect listFrame = [rightView frame];
806     CGFloat dividerThickness = [splitView dividerThickness];
807    
808     libFrame.size.height = newFrame.size.height;
809     listFrame.size.height = newFrame.size.height;
810    
811     listFrame.size.width = newFrame.size.width - libFrame.size.width - dividerThickness;
812    
813     if(listFrame.size.width < 0) listFrame.size.width = 0;
814    
815 masakih 483 [libraryPlaceholderView setFrame:libFrame];
816 masaki 295 [rightView setFrame:listFrame];
817     }
818 masaki 193
819 masaki 185 #pragma mark#### XspfManager Notifications ####
820     - (void)managerDidAddObjects:(NSNotification *)notification
821     {
822     id addedObjects = [[notification userInfo] objectForKey:@"XspfManagerAddedXspfObjects"];
823     if(!addedObjects || ![addedObjects isKindOfClass:[NSArray class]] || [addedObjects count] == 0) return;
824    
825     [controller performSelector:@selector(setSelectedObjects:)
826     withObject:addedObjects
827     afterDelay:0.01];
828     }
829    
830 masaki 184 #pragma mark#### Test ####
831     - (IBAction)test01:(id)sender
832     {
833 masakih 550 id firstKeyView = [[self window] firstResponder];
834     NSView *view = firstKeyView;
835     do {
836     HMLog(HMLogLevelDebug, @"KeyView -> %@", view);
837     view = [view nextValidKeyView];
838     } while(view && view != firstKeyView);
839 masaki 184 }
840     - (IBAction)test02:(id)sender
841     {
842     NSResponder *responder = [[self window] firstResponder];
843     while(responder) {
844 masaki 188 HMLog(HMLogLevelDebug, @"Responder -> %@", responder);
845 masaki 184 responder = [responder nextResponder];
846     }
847     }
848 masakih 483 //- (IBAction)test03:(id)sender
849     //{
850     // [listController setAutomaticallyRearrangesObjects:YES];
851     //
852     //}
853     @end
854    
855     @implementation XspfMMainWindowController (MessageForwarding)
856     - (BOOL)respondsToSelector:(SEL)aSelector
857 masaki 184 {
858 masakih 483 if([super respondsToSelector:aSelector]) return YES;
859 masakih 559 if([movieViewController respondsToSelector:aSelector]) return YES;
860 masakih 500 if([controller respondsToSelector:aSelector]) return YES;
861 masakih 483
862     return NO;
863     }
864     - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
865     {
866 masakih 559 if([movieViewController respondsToSelector:aSelector]) {
867     return [movieViewController methodSignatureForSelector:aSelector];
868 masakih 483 }
869 masakih 500 if([controller respondsToSelector:aSelector]) {
870     return [controller methodSignatureForSelector:aSelector];
871     }
872 masakih 483 return [super methodSignatureForSelector:aSelector];
873     }
874     - (void)forwardInvocation:(NSInvocation *)anInvocation
875     {
876     SEL selector = [anInvocation selector];
877 masakih 559 if([movieViewController respondsToSelector:selector]) {
878     [anInvocation invokeWithTarget:movieViewController];
879 masakih 483 return;
880     }
881 masakih 500 if([controller respondsToSelector:selector]) {
882     [anInvocation invokeWithTarget:controller];
883     return;
884     }
885 masakih 483 }
886 masakih 380
887 masaki 184 @end

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