Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfQT/XspfQTMovieWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 224 - (hide annotations) (download)
Mon Oct 12 07:07:46 2009 UTC (14 years, 6 months ago) by masaki
File size: 15202 byte(s)
[New] XSPF用のUTIを設定。
1 masaki 2 //
2 masaki 72 // XspfQTMovieWindowController.m
3 masaki 2 // XspfQT
4     //
5     // Created by Hori,Masaki on 08/08/31.
6     // Copyright 2008 masakih. All rights reserved.
7     //
8    
9 masaki 224 #import <Carbon/Carbon.h>
10    
11 masaki 72 #import "XspfQTMovieWindowController.h"
12     #import "XspfQTDocument.h"
13     #import "XspfQTComponent.h"
14     #import "XspfQTFullScreenWindow.h"
15 masaki 144 #import "XspfQTMovieWindow.h"
16 masaki 2
17 masaki 72 @interface XspfQTMovieWindowController (Private)
18 masaki 45 - (NSSize)windowSizeWithoutQTView;
19 masaki 17 - (void)sizeTofitWidnow;
20 masaki 2 - (NSSize)fitSizeToSize:(NSSize)toSize;
21     - (NSWindow *)fullscreenWindow;
22 masaki 151 - (void)movieDidStart;
23     - (void)movieDidPause;
24 masaki 2 @end
25    
26 masaki 72 @implementation XspfQTMovieWindowController
27 masaki 2
28 masaki 10 #pragma mark ### Static variables ###
29 masaki 132 static const float sVolumeDelta = 0.1;
30 masaki 200 static const NSTimeInterval sUpdateTimeInterval = 0.5;
31 masaki 171 static NSString *const kQTMovieKeyPath = @"playingMovie";
32 masaki 40 static NSString *const kIsPlayedKeyPath = @"trackList.isPlayed";
33 masaki 135 static NSString *const kVolumeKeyPath = @"qtMovie.volume";
34 masaki 2
35 masaki 10 - (id)init
36 masaki 2 {
37 masaki 151 self = [super initWithWindowNibName:@"XspfQTDocument"];
38 masaki 2
39     return self;
40     }
41    
42     - (void)dealloc
43     {
44     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
45     [nc removeObserver:self];
46 masaki 49
47     [self setQtMovie:nil];
48 masaki 2
49     [fullscreenWindow release];
50 masaki 151 [self movieDidPause];
51 masaki 10 [prevMouseMovedDate release];
52 masaki 76
53 masaki 2 [super dealloc];
54     }
55     - (void)awakeFromNib
56     {
57 masaki 3 prevMouseMovedDate = [[NSDate dateWithTimeIntervalSinceNow:0.0] retain];
58    
59 masaki 100 id doc = [self document];
60 masaki 151
61 masaki 100 [doc addObserver:self
62     forKeyPath:kQTMovieKeyPath
63     options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
64     context:NULL];
65     [doc addObserver:self
66     forKeyPath:kIsPlayedKeyPath
67     options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
68     context:NULL];
69 masaki 2
70 masaki 100 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
71     [nc addObserver:self
72     selector:@selector(documentWillClose:)
73     name:XspfQTDocumentWillCloseNotification
74     object:doc];
75    
76 masaki 177 [[doc trackList] setSelectionIndex:0];
77 masaki 17 [self sizeTofitWidnow];
78 masaki 2 [self play];
79     }
80 masaki 10
81 masaki 62 - (NSString *)windowTitleForDocumentDisplayName:(NSString *)displayName
82     {
83 masaki 70 id title1 = [self valueForKeyPath:@"document.trackList.title"];
84     id title2 = [self valueForKeyPath:@"document.trackList.currentTrack.title"];
85     if(title1 && title2) {
86 masaki 62 return [NSString stringWithFormat:@"%@ - %@",
87 masaki 70 title1, title2];
88 masaki 62 }
89 masaki 116 if(title2) {
90     return [NSString stringWithFormat:@"%@ - %@",
91     displayName, title2];
92     }
93 masaki 62 return displayName;
94     }
95    
96 masaki 10 #pragma mark ### KVO & KVC ###
97 masaki 2 - (void)observeValueForKeyPath:(NSString *)keyPath
98     ofObject:(id)object
99     change:(NSDictionary *)change
100     context:(void *)context
101     {
102 masaki 49 if([keyPath isEqualToString:kQTMovieKeyPath]) {
103 masaki 2 id new = [change objectForKey:NSKeyValueChangeNewKey];
104 masaki 49 [self setQtMovie:new];
105 masaki 2 return;
106     }
107 masaki 49 if([keyPath isEqualToString:kIsPlayedKeyPath]) {
108 masaki 14 id new = [change objectForKey:NSKeyValueChangeNewKey];
109     if([new boolValue]) {
110 masaki 151 [self movieDidStart];
111 masaki 14 } else {
112 masaki 151 [self movieDidPause];
113 masaki 14 }
114     return;
115     }
116 masaki 2 }
117    
118     - (void)setQtMovie:(QTMovie *)qt
119     {
120     if(qtMovie == qt) return;
121     if([qtMovie isEqual:qt]) return;
122 masaki 62 if(qt == (id)[NSNull null]) qt = nil;
123 masaki 2
124     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
125    
126     if(qtMovie) {
127     [nc removeObserver:self name:nil object:qtMovie];
128     }
129     if(qt) {
130 masaki 151 [nc addObserver:self selector:@selector(movieDidEndNotification:) name:QTMovieDidEndNotification object:qt];
131 masaki 2 }
132 masaki 3
133     if(qtMovie) {
134     [qt setVolume:[qtMovie volume]];
135     [qt setMuted:[qtMovie muted]];
136     }
137 masaki 2 [qtMovie autorelease];
138     qtMovie = [qt retain];
139 masaki 49
140     if(!qtMovie) return;
141    
142 masaki 2 [self synchronizeWindowTitleWithDocumentName];
143 masaki 17 [self sizeTofitWidnow];
144 masaki 2 [self play];
145     }
146     - (QTMovie *)qtMovie
147     {
148     return qtMovie;
149     }
150    
151 masaki 10 #pragma mark ### Other functions ###
152 masaki 151 // Area size without QTMovieView.
153 masaki 45 - (NSSize)windowSizeWithoutQTView
154     {
155     if(windowSizeWithoutQTView.width == 0
156     && windowSizeWithoutQTView.height == 0) {
157     QTMovie *curMovie = [self qtMovie];
158     if(!curMovie) return windowSizeWithoutQTView;
159    
160     NSSize qtViewSize = [qtView frame].size;
161     NSSize currentWindowSize = [[self window] frame].size;
162    
163     windowSizeWithoutQTView = NSMakeSize(currentWindowSize.width - qtViewSize.width,
164     currentWindowSize.height - qtViewSize.height);
165     }
166    
167     return windowSizeWithoutQTView;
168     }
169 masaki 17 - (void)sizeTofitWidnow
170     {
171     id window = [self window];
172     NSRect frame = [window frame];
173     NSSize newSize = [self fitSizeToSize:frame.size];
174 masaki 19 frame.origin.y += frame.size.height - newSize.height;
175 masaki 17 frame.size = newSize;
176    
177 masaki 19 [window setFrame:frame display:YES animate:YES];
178 masaki 17 }
179 masaki 2 - (NSSize)fitSizeToSize:(NSSize)toSize
180     {
181     QTMovie *curMovie = [self qtMovie];
182     if(!curMovie) return toSize;
183    
184 masaki 45 NSSize delta = [self windowSizeWithoutQTView];
185 masaki 2
186     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
187 masaki 107 if(movieSize.width == 0) return toSize;
188 masaki 2
189     float targetViewWidth = toSize.width - delta.width;
190     float targetViewHeight = targetViewWidth * (movieSize.height / movieSize.width);
191    
192     targetViewWidth += delta.width;
193     targetViewHeight += delta.height;
194    
195 masaki 107 return NSMakeSize(targetViewWidth, targetViewHeight);
196 masaki 2 }
197    
198 masaki 134 - (NSSize)windowSizeFromMovieSize:(NSSize)movieSize
199     {
200    
201     //
202 masaki 135
203     return NSZeroSize;
204 masaki 134 }
205    
206     - (void)setMovieSize:(NSSize)movieSize
207     {
208 masaki 139 NSRect newFrame = [[self window] frame];
209     NSSize newSize;
210    
211     newSize = [self windowSizeWithoutQTView];
212     newSize.width += movieSize.width;
213     newSize.height += movieSize.height;
214    
215     newFrame.origin.y -= newSize.height - newFrame.size.height;
216     newFrame.size = newSize;
217    
218     NSWindow *w = [self window];
219     [w setFrame:newFrame display:YES animate:YES];
220 masaki 134 }
221 masaki 151 - (void)movieDidStart
222 masaki 135 {
223     [playButton setTitle:@"||"];
224    
225     @synchronized(self) {
226     if(updateTime) return;
227    
228     updateTime = [[NSTimer timerWithTimeInterval:sUpdateTimeInterval
229     target:self
230     selector:@selector(updateTimeIfNeeded:)
231     userInfo:NULL
232     repeats:YES] retain];
233    
234     NSRunLoop *currentLoop = [NSRunLoop currentRunLoop];
235     [currentLoop addTimer:updateTime forMode:NSDefaultRunLoopMode];
236     }
237     }
238    
239 masaki 151 - (void)movieDidPause
240 masaki 135 {
241     [playButton setTitle:@">"];
242    
243     @synchronized(self) {
244     [updateTime invalidate];
245     [updateTime release];
246     updateTime = nil;
247     }
248     }
249 masaki 2 - (void)play
250     {
251     [qtView performSelectorOnMainThread:@selector(play:) withObject:self waitUntilDone:NO];
252     }
253 masaki 14 - (void)pause
254     {
255     [qtView performSelectorOnMainThread:@selector(pause:) withObject:self waitUntilDone:NO];
256     }
257 masaki 56 - (void)stop
258     {
259     [qtView performSelectorOnMainThread:@selector(pause:) withObject:self waitUntilDone:YES];
260     }
261 masaki 3 - (void)enterFullScreen
262 masaki 2 {
263 masaki 17 NSWindow *w = [self fullscreenWindow];
264 masaki 3
265 masaki 156 normalModeSavedFrame = [qtView frame];
266 masaki 17
267 masaki 144 XspfQTMovieWindow *player = (XspfQTMovieWindow *)[self window];
268 masaki 143 NSRect originalWFrame = [player frame];
269 masaki 17
270 masaki 107 SetSystemUIMode(kUIModeAllHidden, kUIOptionAutoShowMenuBar);
271 masaki 17
272 masaki 143 NSRect newWFrame = [[NSScreen mainScreen] frame];
273     // NSLog(@"screen ->\t%@",NSStringFromRect(newWFrame));
274    
275 masaki 148 newWFrame.size.width += windowSizeWithoutQTView.width;
276     newWFrame.size.height += windowSizeWithoutQTView.height;
277     newWFrame.origin.y -= windowSizeWithoutQTView.height;
278 masaki 143 // NSLog(@"window ->\t%@",NSStringFromRect(newWFrame));
279    
280 masaki 156 isChangingFullScreen = YES;
281     [player setIsChangingFullScreen:YES];
282 masaki 147
283 masaki 143 [player setFrame:newWFrame display:YES animate:YES];
284 masaki 147
285 masaki 156 [player setIsChangingFullScreen:NO];
286     isChangingFullScreen = NO;
287 masaki 143 // NSLog(@"new window ->\t%@",NSStringFromRect([player frame]));
288    
289 masaki 154 // [w disableScreenUpdatesUntilFlush];
290 masaki 148 [w setContentView:qtView];
291 masaki 17 [w makeKeyAndOrderFront:self];
292 masaki 143
293     [w makeFirstResponder:qtView];
294    
295     [player orderOut:self];
296     [player setFrame:originalWFrame display:NO];
297 masaki 2 }
298 masaki 3 - (void)exitFullScreen
299 masaki 2 {
300 masaki 144 XspfQTMovieWindow *player = (XspfQTMovieWindow *)[self window];
301     NSRect originalWFrame = [player frame];
302    
303     // calculate new Window frame.
304     NSRect windowRect = originalWFrame;
305     NSSize movieSize = [[[self qtMovie] attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
306     if(movieSize.width != 0) {
307 masaki 156 CGFloat newViewHeight = normalModeSavedFrame.size.width * (movieSize.height / movieSize.width);
308 masaki 144
309     windowRect.size.height = newViewHeight + windowSizeWithoutQTView.height;
310     windowRect.origin.y -= windowRect.size.height - originalWFrame.size.height + [player titlebarHeight];
311     }
312    
313 masaki 156 isChangingFullScreen = YES;
314     [player setIsChangingFullScreen:YES];
315 masaki 144
316     // caluculate screen size window frame.
317     NSRect screenWFrame = [[NSScreen mainScreen] frame];
318     screenWFrame.size.width += windowSizeWithoutQTView.width;
319     screenWFrame.size.height += windowSizeWithoutQTView.height;
320     screenWFrame.origin.y -= windowSizeWithoutQTView.height;
321     [player setFrame:screenWFrame display:NO];
322    
323 masaki 156 isChangingFullScreen = NO;
324 masaki 144
325 masaki 151 // move QTView.
326 masaki 17 [qtView retain];
327     {
328 masaki 154 // [qtView removeFromSuperview];
329 masaki 144 NSRect fViewRec = [qtView frame];
330 masaki 154
331     // for do not flushing qtview.
332     [fullscreenWindow setContentView:[[[NSView alloc] initWithFrame:fViewRec] autorelease]];
333    
334 masaki 144 fViewRec.origin.y += windowSizeWithoutQTView.height - [player titlebarHeight];
335     [qtView setFrame:fViewRec];
336     [[player contentView] addSubview:qtView];
337 masaki 17 }
338     [qtView release];
339    
340 masaki 191 [player makeKeyAndOrderFront:self];
341 masaki 144 [player makeFirstResponder:qtView];
342 masaki 132
343 masaki 154 [fullscreenWindow orderOut:self];
344 masaki 107
345 masaki 144 [player setFrame:windowRect display:YES animate:YES];
346    
347     [NSMenu setMenuBarVisible:YES];
348 masaki 156 [player setIsChangingFullScreen:NO];
349 masaki 3 }
350 masaki 10
351     - (NSWindow *)fullscreenWindow
352     {
353     if(fullscreenWindow) return fullscreenWindow;
354    
355     NSRect mainScreenRect = [[NSScreen mainScreen] frame];
356 masaki 72 fullscreenWindow = [[XspfQTFullScreenWindow alloc] initWithContentRect:mainScreenRect
357 masaki 132 styleMask:NSBorderlessWindowMask
358     backing:NSBackingStoreBuffered
359     defer:YES];
360 masaki 10 [fullscreenWindow setReleasedWhenClosed:NO];
361     [fullscreenWindow setBackgroundColor:[NSColor blackColor]];
362     [fullscreenWindow setDelegate:self];
363 masaki 49 [fullscreenWindow setWindowController:self];
364 masaki 10
365     return fullscreenWindow;
366     }
367    
368     #pragma mark ### Actions ###
369 masaki 14 - (IBAction)togglePlayAndPause:(id)sender
370     {
371     if([[self valueForKeyPath:@"document.trackList.isPlayed"] boolValue]) {
372     [self pause];
373     } else {
374     [self play];
375     }
376     }
377    
378 masaki 3 - (IBAction)turnUpVolume:(id)sender
379     {
380 masaki 135 NSNumber *cv = [self valueForKeyPath:kVolumeKeyPath];
381 masaki 3 cv = [NSNumber numberWithFloat:[cv floatValue] + sVolumeDelta];
382 masaki 135 [self setValue:cv forKeyPath:kVolumeKeyPath];
383 masaki 3 }
384     - (IBAction)turnDownVolume:(id)sender
385     {
386 masaki 135 NSNumber *cv = [self valueForKeyPath:kVolumeKeyPath];
387 masaki 3 cv = [NSNumber numberWithFloat:[cv floatValue] - sVolumeDelta];
388 masaki 135 [self setValue:cv forKeyPath:kVolumeKeyPath];
389 masaki 3 }
390     - (IBAction)toggleFullScreenMode:(id)sender
391     {
392 masaki 10 if(fullScreenMode) {
393 masaki 3 [self exitFullScreen];
394 masaki 10 fullScreenMode = NO;
395 masaki 2 } else {
396 masaki 3 [self enterFullScreen];
397 masaki 10 fullScreenMode = YES;
398 masaki 2 }
399     }
400    
401 masaki 4 - (IBAction)forwardTagValueSecends:(id)sender
402     {
403     if(![sender respondsToSelector:@selector(tag)]) return;
404    
405     int tag = [sender tag];
406     if(tag == 0) return;
407    
408     QTTime current = [[self qtMovie] currentTime];
409     NSTimeInterval cur;
410     if(!QTGetTimeInterval(current, &cur)) return;
411    
412     QTTime new = QTMakeTimeWithTimeInterval(cur + tag);
413 masaki 9 [[self qtMovie] setCurrentTime:new];
414 masaki 4 }
415     - (IBAction)backwardTagValueSecends:(id)sender
416     {
417     if(![sender respondsToSelector:@selector(tag)]) return;
418    
419     int tag = [sender tag];
420     if(tag == 0) return;
421    
422     QTTime current = [[self qtMovie] currentTime];
423     NSTimeInterval cur;
424     if(!QTGetTimeInterval(current, &cur)) return;
425    
426     QTTime new = QTMakeTimeWithTimeInterval(cur - tag);
427 masaki 9 [[self qtMovie] setCurrentTime:new];
428 masaki 4 }
429 masaki 24 - (IBAction)nextTrack:(id)sender
430     {
431 masaki 49 [qtView pause:sender];
432 masaki 24 [[[self document] trackList] next];
433     }
434     - (IBAction)previousTrack:(id)sender
435     {
436 masaki 49 [qtView pause:sender];
437 masaki 24 [[[self document] trackList] previous];
438     }
439 masaki 4
440 masaki 134 - (IBAction)normalSize:(id)sender
441     {
442     if(fullScreenMode) return;
443    
444     QTMovie *curMovie = [self qtMovie];
445     if(!curMovie) return;
446    
447     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
448     if(movieSize.width == 0) return;
449    
450     [self setMovieSize:movieSize];
451     }
452     - (IBAction)halfSize:(id)sender
453     {
454     if(fullScreenMode) return;
455    
456     QTMovie *curMovie = [self qtMovie];
457     if(!curMovie) return;
458    
459     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
460     if(movieSize.width == 0) return;
461    
462     movieSize.width *= 0.5;
463     movieSize.height *= 0.5;
464    
465     [self setMovieSize:movieSize];
466     }
467     - (IBAction)doubleSize:(id)sender
468     {
469     if(fullScreenMode) return;
470    
471     QTMovie *curMovie = [self qtMovie];
472     if(!curMovie) return;
473    
474     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
475     if(movieSize.width == 0) return;
476    
477     movieSize.width *= 2;
478     movieSize.height *= 2;
479    
480     [self setMovieSize:movieSize];
481     }
482 masaki 135 - (IBAction)screenSize:(id)sender
483     {
484     //
485     //
486     }
487 masaki 134
488 masaki 10 #pragma mark ### Notification & Timer ###
489 masaki 151 - (void)movieDidEndNotification:(id)notification
490 masaki 2 {
491     [[[self document] trackList] next];
492     }
493     - (void)updateTimeIfNeeded:(id)timer
494     {
495     QTMovie *qt = [self qtMovie];
496     if(qt) {
497 masaki 10 // force update time indicator.
498 masaki 2 [qt willChangeValueForKey:@"currentTime"];
499     [qt didChangeValueForKey:@"currentTime"];
500     }
501 masaki 3
502     // Hide cursor and controller, if mouse didn't move for 3 seconds.
503     NSPoint mouse = [NSEvent mouseLocation];
504     if(!NSEqualPoints(prevMouse, mouse)) {
505     prevMouse = mouse;
506     [prevMouseMovedDate autorelease];
507     prevMouseMovedDate = [[NSDate dateWithTimeIntervalSinceNow:0.0] retain];
508 masaki 10 } else if(fullScreenMode && [prevMouseMovedDate timeIntervalSinceNow] < -3.0 ) {
509 masaki 3 [NSCursor setHiddenUntilMouseMoves:YES];
510     //
511     // hide controller.
512     }
513 masaki 2 }
514    
515 masaki 10 #pragma mark ### NSResponder ###
516 masaki 2 - (void)cancelOperation:(id)sender
517     {
518 masaki 10 if(fullScreenMode) {
519 masaki 2 [self toggleFullScreenMode:self];
520     }
521     }
522    
523 masaki 10 #pragma mark ### NSMenu valivation ###
524     - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
525     {
526     if([menuItem action] == @selector(toggleFullScreenMode:)) {
527     if(fullScreenMode) {
528     [menuItem setTitle:NSLocalizedString(@"Exit Full Screen", @"Exit Full Screen")];
529     } else {
530     [menuItem setTitle:NSLocalizedString(@"Full Screen", @"Full Screen")];
531     }
532     return YES;
533     }
534    
535 masaki 139 if([menuItem action] == @selector(screenSize:)) {
536     return NO;
537     }
538    
539     if([menuItem action] == @selector(normalSize:)
540     || [menuItem action] == @selector(halfSize:)
541     || [menuItem action] == @selector(doubleSize:)) {
542     if(fullScreenMode) {
543     return NO;
544     } else {
545     return YES;
546     }
547     }
548    
549 masaki 10 return YES;
550     }
551    
552 masaki 100 #pragma mark ### XspfQTDocument Notification ###
553     - (void)documentWillClose:(NSNotification *)notification
554 masaki 2 {
555 masaki 100 id doc = [notification object];
556     // NSLog(@"Remove Observed! %@", doc);
557 masaki 10 if(fullScreenMode) {
558 masaki 2 [self toggleFullScreenMode:self];
559     }
560 masaki 100
561     [doc removeObserver:self forKeyPath:kQTMovieKeyPath];
562     [doc removeObserver:self forKeyPath:kIsPlayedKeyPath];
563    
564     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
565     [nc removeObserver:self name:XspfQTDocumentWillCloseNotification object:doc];
566 masaki 2 }
567    
568 masaki 10 #pragma mark ### NSWindow Delegate ###
569 masaki 2 - (BOOL)windowShouldClose:(id)sender
570     {
571     [qtView pause:self];
572     [self setQtMovie:nil];
573    
574 masaki 66 [updateTime invalidate];
575 masaki 2 updateTime = nil;
576    
577     return YES;
578     }
579     - (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize
580     {
581 masaki 156 if(isChangingFullScreen) return frameSize;
582 masaki 143
583 masaki 2 return [self fitSizeToSize:frameSize];
584     }
585 masaki 16 - (void)windowDidMove:(NSNotification *)notification
586     {
587     if(fullscreenWindow && [notification object] == fullscreenWindow) {
588     NSRect r = [fullscreenWindow frame];
589 masaki 45 if(!NSEqualPoints(r.origin, NSZeroPoint)) {
590 masaki 16 [fullscreenWindow setFrameOrigin:NSZeroPoint];
591     }
592     }
593     }
594 masaki 2 @end

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