Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfQT/XspfQTMovieWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 312 - (hide annotations) (download)
Sun May 16 02:22:37 2010 UTC (13 years, 11 months ago) by masakih
File size: 18320 byte(s)
著作権表示、免責表示を追加。
1 masaki 2 //
2 masaki 72 // XspfQTMovieWindowController.m
3 masaki 2 // XspfQT
4     //
5     // Created by Hori,Masaki on 08/08/31.
6     //
7    
8 masakih 312 /*
9     Copyright (c) 2008-2010, masakih
10     All rights reserved.
11     ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に限り、再頒布および使用が許可されます。
12    
13     1, ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
14     2, バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
15     3, 書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、コントリビューターの名前を使用してはならない。
16     本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。著作権者もコントリビューターも、事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか厳格責任であるか(過失その他の)不法行為であるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、本ソフトウェアの使用によって発生した(代替品または代用サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない)直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、一切責任を負わないものとします。
17     -------------------------------------------------------------------
18     Copyright (c) 2008-2010, masakih
19     All rights reserved.
20    
21     Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
22    
23     1, Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
24     2, Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
25     3, The names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
26     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27     */
28    
29 masaki 224 #import <Carbon/Carbon.h>
30    
31 masaki 72 #import "XspfQTMovieWindowController.h"
32     #import "XspfQTDocument.h"
33 masaki 306 #import "HMXSPFComponent.h"
34 masaki 72 #import "XspfQTFullScreenWindow.h"
35 masaki 144 #import "XspfQTMovieWindow.h"
36 masaki 2
37 masaki 299
38     #pragma mark #### Global Variables ####
39     /********* Global variables *******/
40     NSString *XspfQTMovieDidStartNotification = @"XspfQTMovieDidStartNotification";
41     NSString *XspfQTMovieDidPauseNotification = @"XspfQTMovieDidPauseNotification";
42    
43    
44 masaki 72 @interface XspfQTMovieWindowController (Private)
45 masaki 45 - (NSSize)windowSizeWithoutQTView;
46 masaki 17 - (void)sizeTofitWidnow;
47 masaki 2 - (NSSize)fitSizeToSize:(NSSize)toSize;
48     - (NSWindow *)fullscreenWindow;
49 masaki 151 - (void)movieDidStart;
50     - (void)movieDidPause;
51 masaki 2 @end
52    
53 masaki 72 @implementation XspfQTMovieWindowController
54 masaki 2
55 masaki 10 #pragma mark ### Static variables ###
56 masaki 132 static const float sVolumeDelta = 0.1;
57 masaki 200 static const NSTimeInterval sUpdateTimeInterval = 0.5;
58 masaki 171 static NSString *const kQTMovieKeyPath = @"playingMovie";
59 masaki 40 static NSString *const kIsPlayedKeyPath = @"trackList.isPlayed";
60 masaki 135 static NSString *const kVolumeKeyPath = @"qtMovie.volume";
61 masaki 2
62 masaki 10 - (id)init
63 masaki 2 {
64 masaki 151 self = [super initWithWindowNibName:@"XspfQTDocument"];
65 masaki 2
66     return self;
67     }
68    
69     - (void)dealloc
70     {
71     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
72     [nc removeObserver:self];
73 masaki 49
74     [self setQtMovie:nil];
75 masaki 2
76     [fullscreenWindow release];
77 masaki 151 [self movieDidPause];
78 masaki 10 [prevMouseMovedDate release];
79 masaki 76
80 masaki 2 [super dealloc];
81     }
82     - (void)awakeFromNib
83     {
84 masaki 3 prevMouseMovedDate = [[NSDate dateWithTimeIntervalSinceNow:0.0] retain];
85    
86 masaki 100 id doc = [self document];
87 masaki 151
88 masaki 100 [doc addObserver:self
89     forKeyPath:kQTMovieKeyPath
90     options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
91     context:NULL];
92     [doc addObserver:self
93     forKeyPath:kIsPlayedKeyPath
94     options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
95     context:NULL];
96 masaki 2
97 masaki 100 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
98     [nc addObserver:self
99     selector:@selector(documentWillClose:)
100     name:XspfQTDocumentWillCloseNotification
101     object:doc];
102    
103 masaki 177 [[doc trackList] setSelectionIndex:0];
104 masaki 17 [self sizeTofitWidnow];
105 masaki 2 [self play];
106     }
107 masaki 10
108 masaki 62 - (NSString *)windowTitleForDocumentDisplayName:(NSString *)displayName
109     {
110 masaki 70 id title1 = [self valueForKeyPath:@"document.trackList.title"];
111     id title2 = [self valueForKeyPath:@"document.trackList.currentTrack.title"];
112     if(title1 && title2) {
113 masaki 62 return [NSString stringWithFormat:@"%@ - %@",
114 masaki 70 title1, title2];
115 masaki 62 }
116 masaki 116 if(title2) {
117     return [NSString stringWithFormat:@"%@ - %@",
118     displayName, title2];
119     }
120 masaki 62 return displayName;
121     }
122    
123 masaki 10 #pragma mark ### KVO & KVC ###
124 masaki 2 - (void)observeValueForKeyPath:(NSString *)keyPath
125     ofObject:(id)object
126     change:(NSDictionary *)change
127     context:(void *)context
128     {
129 masaki 49 if([keyPath isEqualToString:kQTMovieKeyPath]) {
130 masaki 2 id new = [change objectForKey:NSKeyValueChangeNewKey];
131 masaki 49 [self setQtMovie:new];
132 masaki 2 return;
133     }
134 masaki 49 if([keyPath isEqualToString:kIsPlayedKeyPath]) {
135 masaki 14 id new = [change objectForKey:NSKeyValueChangeNewKey];
136     if([new boolValue]) {
137 masaki 151 [self movieDidStart];
138 masaki 14 } else {
139 masaki 151 [self movieDidPause];
140 masaki 14 }
141     return;
142     }
143 masaki 2 }
144    
145     - (void)setQtMovie:(QTMovie *)qt
146     {
147     if(qtMovie == qt) return;
148     if([qtMovie isEqual:qt]) return;
149 masaki 62 if(qt == (id)[NSNull null]) qt = nil;
150 masaki 2
151     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
152    
153     if(qtMovie) {
154     [nc removeObserver:self name:nil object:qtMovie];
155     }
156     if(qt) {
157 masaki 151 [nc addObserver:self selector:@selector(movieDidEndNotification:) name:QTMovieDidEndNotification object:qt];
158 masaki 2 }
159 masaki 3
160     if(qtMovie) {
161     [qt setVolume:[qtMovie volume]];
162     [qt setMuted:[qtMovie muted]];
163     }
164 masaki 2 [qtMovie autorelease];
165     qtMovie = [qt retain];
166 masaki 49
167     if(!qtMovie) return;
168    
169 masaki 2 [self synchronizeWindowTitleWithDocumentName];
170 masaki 17 [self sizeTofitWidnow];
171 masaki 2 [self play];
172     }
173     - (QTMovie *)qtMovie
174     {
175     return qtMovie;
176     }
177    
178 masaki 10 #pragma mark ### Other functions ###
179 masaki 151 // Area size without QTMovieView.
180 masaki 45 - (NSSize)windowSizeWithoutQTView
181     {
182     if(windowSizeWithoutQTView.width == 0
183     && windowSizeWithoutQTView.height == 0) {
184     QTMovie *curMovie = [self qtMovie];
185     if(!curMovie) return windowSizeWithoutQTView;
186    
187     NSSize qtViewSize = [qtView frame].size;
188     NSSize currentWindowSize = [[self window] frame].size;
189    
190     windowSizeWithoutQTView = NSMakeSize(currentWindowSize.width - qtViewSize.width,
191     currentWindowSize.height - qtViewSize.height);
192     }
193    
194     return windowSizeWithoutQTView;
195     }
196 masaki 17 - (void)sizeTofitWidnow
197     {
198     id window = [self window];
199     NSRect frame = [window frame];
200     NSSize newSize = [self fitSizeToSize:frame.size];
201 masaki 19 frame.origin.y += frame.size.height - newSize.height;
202 masaki 17 frame.size = newSize;
203    
204 masaki 19 [window setFrame:frame display:YES animate:YES];
205 masaki 17 }
206 masaki 2 - (NSSize)fitSizeToSize:(NSSize)toSize
207     {
208     QTMovie *curMovie = [self qtMovie];
209     if(!curMovie) return toSize;
210    
211 masaki 45 NSSize delta = [self windowSizeWithoutQTView];
212 masaki 2
213     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
214 masaki 107 if(movieSize.width == 0) return toSize;
215 masaki 2
216     float targetViewWidth = toSize.width - delta.width;
217     float targetViewHeight = targetViewWidth * (movieSize.height / movieSize.width);
218    
219     targetViewWidth += delta.width;
220     targetViewHeight += delta.height;
221    
222 masaki 107 return NSMakeSize(targetViewWidth, targetViewHeight);
223 masaki 2 }
224    
225 masaki 134 - (NSSize)windowSizeFromMovieSize:(NSSize)movieSize
226     {
227    
228     //
229 masaki 135
230     return NSZeroSize;
231 masaki 134 }
232    
233     - (void)setMovieSize:(NSSize)movieSize
234     {
235 masaki 139 NSRect newFrame = [[self window] frame];
236     NSSize newSize;
237    
238     newSize = [self windowSizeWithoutQTView];
239     newSize.width += movieSize.width;
240     newSize.height += movieSize.height;
241    
242     newFrame.origin.y -= newSize.height - newFrame.size.height;
243     newFrame.size = newSize;
244    
245     NSWindow *w = [self window];
246     [w setFrame:newFrame display:YES animate:YES];
247 masaki 134 }
248 masaki 151 - (void)movieDidStart
249 masaki 135 {
250     [playButton setTitle:@"||"];
251 masaki 299
252     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
253     [nc postNotificationName:XspfQTMovieDidStartNotification object:self];
254 masaki 135 }
255    
256 masaki 151 - (void)movieDidPause
257 masaki 135 {
258     [playButton setTitle:@">"];
259 masaki 299
260     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
261     [nc postNotificationName:XspfQTMovieDidPauseNotification object:self];
262 masaki 135 }
263 masaki 2 - (void)play
264     {
265     [qtView performSelectorOnMainThread:@selector(play:) withObject:self waitUntilDone:NO];
266     }
267 masaki 14 - (void)pause
268     {
269     [qtView performSelectorOnMainThread:@selector(pause:) withObject:self waitUntilDone:NO];
270     }
271 masaki 56 - (void)stop
272     {
273     [qtView performSelectorOnMainThread:@selector(pause:) withObject:self waitUntilDone:YES];
274     }
275 masaki 3 - (void)enterFullScreen
276 masaki 2 {
277 masaki 17 NSWindow *w = [self fullscreenWindow];
278 masaki 3
279 masaki 156 normalModeSavedFrame = [qtView frame];
280 masaki 17
281 masaki 144 XspfQTMovieWindow *player = (XspfQTMovieWindow *)[self window];
282 masaki 143 NSRect originalWFrame = [player frame];
283 masaki 17
284 masaki 107 SetSystemUIMode(kUIModeAllHidden, kUIOptionAutoShowMenuBar);
285 masaki 17
286 masaki 143 NSRect newWFrame = [[NSScreen mainScreen] frame];
287    
288 masaki 148 newWFrame.size.width += windowSizeWithoutQTView.width;
289     newWFrame.size.height += windowSizeWithoutQTView.height;
290     newWFrame.origin.y -= windowSizeWithoutQTView.height;
291 masaki 143
292 masaki 156 isChangingFullScreen = YES;
293     [player setIsChangingFullScreen:YES];
294 masaki 147
295 masaki 143 [player setFrame:newWFrame display:YES animate:YES];
296 masaki 147
297 masaki 156 [player setIsChangingFullScreen:NO];
298     isChangingFullScreen = NO;
299 masaki 143
300 masaki 148 [w setContentView:qtView];
301 masaki 17 [w makeKeyAndOrderFront:self];
302 masaki 143
303     [w makeFirstResponder:qtView];
304    
305     [player orderOut:self];
306     [player setFrame:originalWFrame display:NO];
307 masaki 2 }
308 masaki 3 - (void)exitFullScreen
309 masaki 2 {
310 masaki 144 XspfQTMovieWindow *player = (XspfQTMovieWindow *)[self window];
311     NSRect originalWFrame = [player frame];
312    
313     // calculate new Window frame.
314     NSRect windowRect = originalWFrame;
315     NSSize movieSize = [[[self qtMovie] attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
316     if(movieSize.width != 0) {
317 masaki 156 CGFloat newViewHeight = normalModeSavedFrame.size.width * (movieSize.height / movieSize.width);
318 masaki 144
319     windowRect.size.height = newViewHeight + windowSizeWithoutQTView.height;
320     windowRect.origin.y -= windowRect.size.height - originalWFrame.size.height + [player titlebarHeight];
321     }
322    
323 masaki 156 isChangingFullScreen = YES;
324     [player setIsChangingFullScreen:YES];
325 masaki 144
326     // caluculate screen size window frame.
327     NSRect screenWFrame = [[NSScreen mainScreen] frame];
328     screenWFrame.size.width += windowSizeWithoutQTView.width;
329     screenWFrame.size.height += windowSizeWithoutQTView.height;
330     screenWFrame.origin.y -= windowSizeWithoutQTView.height;
331     [player setFrame:screenWFrame display:NO];
332    
333 masaki 156 isChangingFullScreen = NO;
334 masaki 144
335 masaki 151 // move QTView.
336 masaki 17 [qtView retain];
337     {
338 masaki 154 // [qtView removeFromSuperview];
339 masaki 144 NSRect fViewRec = [qtView frame];
340 masaki 154
341     // for do not flushing qtview.
342     [fullscreenWindow setContentView:[[[NSView alloc] initWithFrame:fViewRec] autorelease]];
343    
344 masaki 144 fViewRec.origin.y += windowSizeWithoutQTView.height - [player titlebarHeight];
345     [qtView setFrame:fViewRec];
346     [[player contentView] addSubview:qtView];
347 masaki 17 }
348     [qtView release];
349    
350 masaki 191 [player makeKeyAndOrderFront:self];
351 masaki 144 [player makeFirstResponder:qtView];
352 masaki 132
353 masaki 154 [fullscreenWindow orderOut:self];
354 masaki 107
355 masaki 144 [player setFrame:windowRect display:YES animate:YES];
356    
357     [NSMenu setMenuBarVisible:YES];
358 masaki 156 [player setIsChangingFullScreen:NO];
359 masaki 3 }
360 masaki 10
361     - (NSWindow *)fullscreenWindow
362     {
363     if(fullscreenWindow) return fullscreenWindow;
364    
365     NSRect mainScreenRect = [[NSScreen mainScreen] frame];
366 masaki 72 fullscreenWindow = [[XspfQTFullScreenWindow alloc] initWithContentRect:mainScreenRect
367 masaki 132 styleMask:NSBorderlessWindowMask
368     backing:NSBackingStoreBuffered
369     defer:YES];
370 masaki 10 [fullscreenWindow setReleasedWhenClosed:NO];
371     [fullscreenWindow setBackgroundColor:[NSColor blackColor]];
372     [fullscreenWindow setDelegate:self];
373 masaki 49 [fullscreenWindow setWindowController:self];
374 masaki 10
375     return fullscreenWindow;
376     }
377    
378     #pragma mark ### Actions ###
379 masaki 14 - (IBAction)togglePlayAndPause:(id)sender
380     {
381     if([[self valueForKeyPath:@"document.trackList.isPlayed"] boolValue]) {
382     [self pause];
383     } else {
384     [self play];
385     }
386     }
387    
388 masaki 3 - (IBAction)turnUpVolume:(id)sender
389     {
390 masaki 135 NSNumber *cv = [self valueForKeyPath:kVolumeKeyPath];
391 masaki 3 cv = [NSNumber numberWithFloat:[cv floatValue] + sVolumeDelta];
392 masaki 135 [self setValue:cv forKeyPath:kVolumeKeyPath];
393 masaki 3 }
394     - (IBAction)turnDownVolume:(id)sender
395     {
396 masaki 135 NSNumber *cv = [self valueForKeyPath:kVolumeKeyPath];
397 masaki 3 cv = [NSNumber numberWithFloat:[cv floatValue] - sVolumeDelta];
398 masaki 135 [self setValue:cv forKeyPath:kVolumeKeyPath];
399 masaki 3 }
400     - (IBAction)toggleFullScreenMode:(id)sender
401     {
402 masaki 10 if(fullScreenMode) {
403 masaki 3 [self exitFullScreen];
404 masaki 10 fullScreenMode = NO;
405 masaki 2 } else {
406 masaki 3 [self enterFullScreen];
407 masaki 10 fullScreenMode = YES;
408 masaki 2 }
409     }
410    
411 masaki 4 - (IBAction)forwardTagValueSecends:(id)sender
412     {
413     if(![sender respondsToSelector:@selector(tag)]) return;
414    
415     int tag = [sender tag];
416     if(tag == 0) return;
417    
418     QTTime current = [[self qtMovie] currentTime];
419     NSTimeInterval cur;
420     if(!QTGetTimeInterval(current, &cur)) return;
421    
422     QTTime new = QTMakeTimeWithTimeInterval(cur + tag);
423 masaki 9 [[self qtMovie] setCurrentTime:new];
424 masaki 4 }
425     - (IBAction)backwardTagValueSecends:(id)sender
426     {
427     if(![sender respondsToSelector:@selector(tag)]) return;
428    
429     int tag = [sender tag];
430     if(tag == 0) return;
431    
432     QTTime current = [[self qtMovie] currentTime];
433     NSTimeInterval cur;
434     if(!QTGetTimeInterval(current, &cur)) return;
435    
436     QTTime new = QTMakeTimeWithTimeInterval(cur - tag);
437 masaki 9 [[self qtMovie] setCurrentTime:new];
438 masaki 4 }
439 masaki 24 - (IBAction)nextTrack:(id)sender
440     {
441 masaki 49 [qtView pause:sender];
442 masaki 24 [[[self document] trackList] next];
443     }
444     - (IBAction)previousTrack:(id)sender
445     {
446 masaki 49 [qtView pause:sender];
447 masaki 24 [[[self document] trackList] previous];
448     }
449 masaki 4
450 masaki 134 - (IBAction)normalSize:(id)sender
451     {
452     if(fullScreenMode) return;
453    
454     QTMovie *curMovie = [self qtMovie];
455     if(!curMovie) return;
456    
457     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
458     if(movieSize.width == 0) return;
459    
460     [self setMovieSize:movieSize];
461     }
462     - (IBAction)halfSize:(id)sender
463     {
464     if(fullScreenMode) return;
465    
466     QTMovie *curMovie = [self qtMovie];
467     if(!curMovie) return;
468    
469     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
470     if(movieSize.width == 0) return;
471    
472     movieSize.width *= 0.5;
473     movieSize.height *= 0.5;
474    
475     [self setMovieSize:movieSize];
476     }
477     - (IBAction)doubleSize:(id)sender
478     {
479     if(fullScreenMode) return;
480    
481     QTMovie *curMovie = [self qtMovie];
482     if(!curMovie) return;
483    
484     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
485     if(movieSize.width == 0) return;
486    
487     movieSize.width *= 2;
488     movieSize.height *= 2;
489    
490     [self setMovieSize:movieSize];
491     }
492 masaki 135 - (IBAction)screenSize:(id)sender
493     {
494     //
495     //
496     }
497 masaki 134
498 masaki 10 #pragma mark ### Notification & Timer ###
499 masaki 151 - (void)movieDidEndNotification:(id)notification
500 masaki 2 {
501     [[[self document] trackList] next];
502     }
503 masaki 298
504     // call from XspfQTMovieTimer.
505 masaki 2 - (void)updateTimeIfNeeded:(id)timer
506     {
507     QTMovie *qt = [self qtMovie];
508     if(qt) {
509 masaki 10 // force update time indicator.
510 masaki 2 [qt willChangeValueForKey:@"currentTime"];
511     [qt didChangeValueForKey:@"currentTime"];
512     }
513 masaki 3
514     // Hide cursor and controller, if mouse didn't move for 3 seconds.
515     NSPoint mouse = [NSEvent mouseLocation];
516     if(!NSEqualPoints(prevMouse, mouse)) {
517     prevMouse = mouse;
518     [prevMouseMovedDate autorelease];
519     prevMouseMovedDate = [[NSDate dateWithTimeIntervalSinceNow:0.0] retain];
520 masaki 10 } else if(fullScreenMode && [prevMouseMovedDate timeIntervalSinceNow] < -3.0 ) {
521 masaki 3 [NSCursor setHiddenUntilMouseMoves:YES];
522     //
523     // hide controller.
524     }
525 masaki 2 }
526    
527 masaki 10 #pragma mark ### NSResponder ###
528 masaki 2 - (void)cancelOperation:(id)sender
529     {
530 masaki 10 if(fullScreenMode) {
531 masaki 2 [self toggleFullScreenMode:self];
532     }
533     }
534    
535 masaki 10 #pragma mark ### NSMenu valivation ###
536     - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
537     {
538     if([menuItem action] == @selector(toggleFullScreenMode:)) {
539     if(fullScreenMode) {
540     [menuItem setTitle:NSLocalizedString(@"Exit Full Screen", @"Exit Full Screen")];
541     } else {
542     [menuItem setTitle:NSLocalizedString(@"Full Screen", @"Full Screen")];
543     }
544     return YES;
545     }
546    
547 masaki 139 if([menuItem action] == @selector(screenSize:)) {
548     return NO;
549     }
550    
551     if([menuItem action] == @selector(normalSize:)
552     || [menuItem action] == @selector(halfSize:)
553     || [menuItem action] == @selector(doubleSize:)) {
554     if(fullScreenMode) {
555     return NO;
556     } else {
557     return YES;
558     }
559     }
560    
561 masaki 10 return YES;
562     }
563    
564 masaki 100 #pragma mark ### XspfQTDocument Notification ###
565     - (void)documentWillClose:(NSNotification *)notification
566 masaki 2 {
567 masaki 100 id doc = [notification object];
568 masaki 272
569 masaki 10 if(fullScreenMode) {
570 masaki 2 [self toggleFullScreenMode:self];
571     }
572 masaki 100
573     [doc removeObserver:self forKeyPath:kQTMovieKeyPath];
574     [doc removeObserver:self forKeyPath:kIsPlayedKeyPath];
575    
576     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
577     [nc removeObserver:self name:XspfQTDocumentWillCloseNotification object:doc];
578 masaki 2 }
579    
580 masaki 10 #pragma mark ### NSWindow Delegate ###
581 masaki 2 - (BOOL)windowShouldClose:(id)sender
582     {
583     [qtView pause:self];
584     [self setQtMovie:nil];
585 masaki 298
586 masaki 2 return YES;
587     }
588     - (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize
589     {
590 masaki 156 if(isChangingFullScreen) return frameSize;
591 masaki 143
592 masaki 2 return [self fitSizeToSize:frameSize];
593     }
594 masaki 16 - (void)windowDidMove:(NSNotification *)notification
595     {
596     if(fullscreenWindow && [notification object] == fullscreenWindow) {
597     NSRect r = [fullscreenWindow frame];
598 masaki 45 if(!NSEqualPoints(r.origin, NSZeroPoint)) {
599 masaki 16 [fullscreenWindow setFrameOrigin:NSZeroPoint];
600     }
601     }
602     }
603 masaki 2 @end

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