Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfQT/XspfQTMovieWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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