Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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