Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMMainWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 507 - (hide annotations) (download)
Mon Jan 10 03:33:14 2011 UTC (13 years, 3 months ago) by masakih
File size: 25426 byte(s)
[Fix] 起動時に前回終了時の状態に戻る前にウインドウが表示される問題を修正。
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 500
406 masaki 2 - (IBAction)add:(id)sender
407     {
408     NSOpenPanel *panel = [NSOpenPanel openPanel];
409    
410     [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]];
411     [panel setAllowsMultipleSelection:YES];
412 masaki 9 [panel setDelegate:self];
413 masaki 2
414     [panel beginSheetForDirectory:nil
415     file:nil
416     types:[NSArray arrayWithObjects:@"xspf", @"com.masakih.xspf", nil]
417 masaki 8 modalForWindow:[self window]
418 masaki 2 modalDelegate:self
419     didEndSelector:@selector(endOpenPanel:::)
420     contextInfo:NULL];
421     }
422 masaki 106 - (void)endOpenPanel:(NSOpenPanel *)panel :(NSInteger)returnCode :(void *)context
423     {
424     [panel orderOut:nil];
425 masaki 2
426 masaki 106 if(returnCode == NSCancelButton) return;
427    
428     NSArray *URLs = [panel URLs];
429     if([URLs count] == 0) return;
430    
431 masaki 184 [appDelegate registerURLs:URLs];
432 masaki 106 }
433 masakih 393 - (IBAction)delete:(id)sender
434     {
435     [self remove:sender];
436     }
437 masaki 190 - (IBAction)remove:(id)sender
438     {
439 masaki 199 [self removeSelectedItem];
440 masaki 190 }
441 masaki 182
442 masaki 194 - (IBAction)newPredicate:(id)sender
443     {
444 masakih 393 [libraryViewController createPredicate:sender];
445 masaki 194 }
446    
447 masakih 370 - (BOOL)isOpenDetailView
448     {
449 masakih 386 NSView *view = [detailViewController view];
450     NSRect visRect = [view visibleRect];
451     return !(NSEqualRects(visRect, NSZeroRect));
452 masakih 370 }
453 masakih 358 - (IBAction)showHideDetail:(id)sender
454     {
455 masakih 370 XspfMPreferences *pref = [XspfMPreferences sharedPreference];
456 masakih 358
457 masakih 483 NSPoint origin = [detailPlaceholderView frame].origin;
458 masakih 358 NSSize size = NSZeroSize;
459    
460 masakih 483 CGFloat detailWidth = [detailPlaceholderView frame].size.width;
461 masakih 386 if(![self isOpenDetailView]){ // show
462 masakih 358 origin.x -= detailWidth;
463     size = [splitView frame].size;
464     size.width -= detailWidth;
465 masakih 370
466     pref.openDetailView = YES;
467 masakih 358 } else { // hide
468     origin.x += detailWidth;
469     size = [splitView frame].size;
470     size.width += detailWidth;
471 masakih 370
472     pref.openDetailView = NO;
473 masakih 358 }
474 masakih 483 [[detailPlaceholderView animator] setFrameOrigin:origin];
475 masakih 358 [[splitView animator] setFrameSize:size];
476 masakih 373
477 masakih 386 // アニメーションが終わってから確認する。
478 masakih 483 NSAnimationContext *context = [NSAnimationContext currentContext];
479 masakih 386 NSTimeInterval duration = [context duration];
480     [self performSelector:@selector(validateControl:) withObject:detailViewButton afterDelay:duration + 0.1];
481 masakih 358 }
482 masakih 483 - (BOOL)validateMenuItemForListMode:(NSMenuItem *)menuItem
483 masaki 190 {
484     BOOL enabled = YES;
485     SEL action = [menuItem action];
486    
487     if(action == @selector(switchListView:)) {
488     if(currentListViewType == typeTableView) {
489     [menuItem setState:NSOnState];
490     } else {
491     [menuItem setState:NSOffState];
492     }
493     } else if(action == @selector(switchRegularIconView:)) {
494     if(currentListViewType == typeCollectionView
495     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXspfMRegularItem) {
496     [menuItem setState:NSOnState];
497     } else {
498     [menuItem setState:NSOffState];
499     }
500     } else if(action == @selector(switchSmallIconView:)) {
501     if(currentListViewType == typeCollectionView
502     && [(XspfMCollectionViewController*)listViewController collectionItemType] == typeXSpfMSmallItem) {
503     [menuItem setState:NSOnState];
504     } else {
505     [menuItem setState:NSOffState];
506     }
507 masaki 281 } else if(action == @selector(switchCoverFlowView:)) {
508     if(currentListViewType == typeCoverFlowView) {
509     [menuItem setState:NSOnState];
510     } else {
511     [menuItem setState:NSOffState];
512     }
513 masaki 190 }
514    
515 masakih 393 if(action == @selector(remove:) || action == @selector(delete:)) {
516 masakih 506 if(!controller.isSelected) return NO;
517 masakih 393
518     NSView *listView_ = [listViewController view];
519     id responder = [[self window] firstResponder];
520     while(responder) {
521     if(listView_ == responder) return YES;
522     responder = [responder nextResponder];
523     }
524     enabled = NO;
525     }
526    
527    
528 masaki 190 return enabled;
529     }
530 masakih 483 - (BOOL)validateMenuItemForMovieMode:(NSMenuItem *)menuItem
531 masakih 373 {
532 masakih 502 if([self.movieViewController respondsToSelector:[menuItem action]]) {
533     return [self.movieViewController validateMenuItem:menuItem];
534     }
535 masakih 483
536     return YES;
537     }
538     - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
539     {
540     switch(appDelegate.mode) {
541     case modeList:
542     return [self validateMenuItemForListMode:menuItem];
543     break;
544     case modeMovie:
545     return [self validateMenuItemForMovieMode:menuItem];
546     break;
547     }
548    
549     return NO;
550     }
551    
552     - (BOOL)validateControl:(NSControl *)anItem
553     {
554 masakih 373 if([detailViewButton isEqual:anItem]) {
555     if([self isOpenDetailView]) {
556     [detailViewButton setImage:[NSImage imageNamed:@"NSRightFacingTriangleTemplate"]];
557     } else {
558     [detailViewButton setImage:[NSImage imageNamed:@"NSLeftFacingTriangleTemplate"]];
559     }
560 masakih 483 return YES;
561 masakih 373 }
562 masakih 483
563     SEL action = [anItem action];
564     if(action == @selector(newPredicate:)) {
565     if(self.mode == modeMovie) {
566     return NO;
567     }
568     }
569 masakih 373 return YES;
570     }
571 masaki 25 #pragma mark#### Other methods ####
572 masaki 199 - (void)removeSelectedItem
573     {
574 masakih 506 XspfMXspfObject *obj = controller.selectedItem;
575 masaki 199
576     NSBeginInformationalAlertSheet(nil, nil, @"Cancel", nil, [self window],
577     self, @selector(didEndAskDelete:::), Nil, obj,
578     NSLocalizedString(@"Do you really delete item \"%@\" from list?", @"Do you really delete item \"%@\" from list?"),
579     obj.title);
580     }
581     - (void)didEndAskDelete:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
582     {
583     if(returnCode == NSCancelButton) return;
584    
585     [appDelegate removeObject:contextInfo];
586     }
587    
588 masaki 189 - (void)recalculateKeyViewLoop
589     {
590     [searchField setNextKeyView:[libraryViewController firstKeyView]];
591     [libraryViewController setNextKeyView:[listViewController firstKeyView]];
592     [listViewController setNextKeyView:[detailViewController firstKeyView]];
593     [detailViewController setNextKeyView:searchField];
594     }
595 masakih 499 - (void)overlayView:(NSView *)view on:(NSView *)original offset:(NSPoint)offset extend:(NSSize)extend
596     {
597     NSRect frame = original.frame;
598     frame.origin = offset;
599     frame.size.width += extend.width;
600     frame.size.height += extend.height;
601     view.frame = frame;
602     [original addSubview:view];
603     }
604 masaki 25 - (void)changeViewType:(XspfMViewType)viewType
605     {
606     if(currentListViewType == viewType) return;
607     currentListViewType = viewType;
608    
609     NSString *className = nil;
610     switch(currentListViewType) {
611     case typeCollectionView:
612     className = @"XspfMCollectionViewController";
613     break;
614     case typeTableView:
615     className = @"XspfMListViewController";
616     break;
617 masaki 281 case typeCoverFlowView:
618     className = @"XspfMCoverFlowViewController";
619     break;
620 masaki 25 }
621     if(!className) return;
622    
623 masakih 483 XspfMViewController *targetContorller = [listViewControllers objectForKey:className];
624 masaki 25 if(!targetContorller) {
625     targetContorller = [[[NSClassFromString(className) alloc] init] autorelease];
626     if(!targetContorller) return;
627 masaki 192
628     id selectionIndexes = [controller selectionIndexes];
629 masakih 483 [listViewControllers setObject:targetContorller forKey:className];
630 masaki 180 [targetContorller view];
631 masaki 30 [targetContorller setRepresentedObject:controller];
632 masaki 189 [targetContorller recalculateKeyViewLoop];
633 masaki 192 [controller setSelectionIndexes:selectionIndexes];
634 masaki 25 }
635 masaki 109
636 masaki 25 [[listViewController view] removeFromSuperview];
637     listViewController = targetContorller;
638 masakih 499 [self overlayView:listViewController.view
639     on:listPlaceholderView
640     offset:NSMakePoint(0, -1)
641     extend:NSMakeSize(0, 1)];
642 masaki 189 // [[self window] recalculateKeyViewLoop];
643     [self recalculateKeyViewLoop];
644 masakih 429
645     /* TODO
646     環境設定で変更可能にする
647     */
648     [listViewController performSelector:@selector(scrollToSelection:) withObject:self afterDelay:0.0];
649 masaki 25 }
650 masaki 2
651 masaki 5
652 masaki 43 - (void)setupXspfLists
653 masaki 36 {
654 masaki 47 if(libraryViewController) return;
655    
656 masaki 41 libraryViewController = [[XspfMLibraryViewController alloc] init];
657 masakih 483 [libraryViewController setRepresentedObject:libraryController];
658 masakih 499 [self overlayView:libraryViewController.view
659     on:libraryPlaceholderView
660     offset:NSMakePoint(-1, -1)
661     extend:NSMakeSize(2, 1)];
662 masaki 189 [libraryViewController recalculateKeyViewLoop];
663 masaki 36 }
664 masaki 47 - (void)setupDetailView
665 masaki 6 {
666 masaki 47 if(detailViewController) return;
667 masaki 6
668 masaki 47 detailViewController = [[XspfMDetailViewController alloc] init];
669     [detailViewController setRepresentedObject:controller];
670 masakih 499 [self overlayView:detailViewController.view
671     on:detailPlaceholderView
672     offset:NSZeroPoint
673     extend:NSZeroSize];
674 masaki 189 [detailViewController recalculateKeyViewLoop];
675 masaki 6 }
676 masaki 82 - (void)setupAccessorylView
677     {
678     if(accessoryViewController) return;
679    
680     accessoryViewController = [[NSViewController alloc] initWithNibName:@"AccessoryView" bundle:nil];
681     [accessoryViewController setRepresentedObject:[appDelegate channel]];
682 masakih 499 [self overlayView:accessoryViewController.view
683     on:accessoryPlaceholderView
684     offset:NSZeroPoint
685     extend:NSZeroSize];
686 masaki 189 // [accessoryViewController recalculateKeyViewLoop];
687 masaki 82 }
688 masaki 8 #pragma mark#### NSWidnow Delegate ####
689     /**
690     Returns the NSUndoManager for the application. In this case, the manager
691     returned is that of the managed object context for the application.
692     */
693 masaki 6
694 masaki 8 - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
695     return [[appDelegate managedObjectContext] undoManager];
696     }
697    
698 masakih 370 - (void)windowWillClose:(NSNotification *)notification
699     {
700     XspfMPreferences *pref = [XspfMPreferences sharedPreference];
701 masakih 483 pref.splitViewLeftWidth = [libraryPlaceholderView frame].size.width;
702 masakih 370 }
703    
704 masaki 9 #pragma mark#### NSOpenPanel Delegate ####
705     - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
706     {
707 masaki 184 return ![appDelegate didRegisteredURL:[NSURL fileURLWithPath:filename]];
708 masaki 9 }
709 masaki 294 #pragma mark#### NSSplitView Delegate ####
710     - (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex
711     {
712     return 130;
713     }
714 masaki 295 - (void)splitView:(NSSplitView *)aSplitView resizeSubviewsWithOldSize:(NSSize)oldSize
715     {
716     NSView *rightView = [[splitView subviews] objectAtIndex:1];
717     NSRect newFrame = [splitView frame];
718 masakih 483 NSRect libFrame = [libraryPlaceholderView frame];
719 masaki 295 NSRect listFrame = [rightView frame];
720     CGFloat dividerThickness = [splitView dividerThickness];
721    
722     libFrame.size.height = newFrame.size.height;
723     listFrame.size.height = newFrame.size.height;
724    
725     listFrame.size.width = newFrame.size.width - libFrame.size.width - dividerThickness;
726    
727     if(listFrame.size.width < 0) listFrame.size.width = 0;
728    
729 masakih 483 [libraryPlaceholderView setFrame:libFrame];
730 masaki 295 [rightView setFrame:listFrame];
731     }
732 masaki 193
733 masaki 185 #pragma mark#### XspfManager Notifications ####
734     - (void)managerDidAddObjects:(NSNotification *)notification
735     {
736     id addedObjects = [[notification userInfo] objectForKey:@"XspfManagerAddedXspfObjects"];
737     if(!addedObjects || ![addedObjects isKindOfClass:[NSArray class]] || [addedObjects count] == 0) return;
738    
739     [controller performSelector:@selector(setSelectedObjects:)
740     withObject:addedObjects
741     afterDelay:0.01];
742     }
743    
744 masaki 184 #pragma mark#### Test ####
745     - (IBAction)test01:(id)sender
746     {
747 masakih 483 NSPoint origin = [detailPlaceholderView frame].origin;
748     origin.x = [[detailPlaceholderView window] frame].size.width;
749     [detailPlaceholderView setFrameOrigin:origin];
750 masaki 184 }
751     - (IBAction)test02:(id)sender
752     {
753     NSResponder *responder = [[self window] firstResponder];
754     while(responder) {
755 masaki 188 HMLog(HMLogLevelDebug, @"Responder -> %@", responder);
756 masaki 184 responder = [responder nextResponder];
757     }
758     }
759 masakih 483 //- (IBAction)test03:(id)sender
760     //{
761     // [listController setAutomaticallyRearrangesObjects:YES];
762     //
763     //}
764     @end
765    
766     @implementation XspfMMainWindowController (MessageForwarding)
767     - (BOOL)respondsToSelector:(SEL)aSelector
768 masaki 184 {
769 masakih 483 if([super respondsToSelector:aSelector]) return YES;
770     if([self.movieViewController respondsToSelector:aSelector]) return YES;
771 masakih 500 if([controller respondsToSelector:aSelector]) return YES;
772 masakih 483
773     return NO;
774     }
775     - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
776     {
777     if([self.movieViewController respondsToSelector:aSelector]) {
778     return [self.movieViewController methodSignatureForSelector:aSelector];
779     }
780 masakih 500 if([controller respondsToSelector:aSelector]) {
781     return [controller methodSignatureForSelector:aSelector];
782     }
783 masakih 483 return [super methodSignatureForSelector:aSelector];
784     }
785     - (void)forwardInvocation:(NSInvocation *)anInvocation
786     {
787     SEL selector = [anInvocation selector];
788     if([self.movieViewController respondsToSelector:selector]) {
789     [anInvocation invokeWithTarget:self.movieViewController];
790     return;
791     }
792 masakih 500 if([controller respondsToSelector:selector]) {
793     [anInvocation invokeWithTarget:controller];
794     return;
795     }
796 masakih 483 }
797 masakih 380
798 masaki 184 @end

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