Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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