MacOSX/Framework: Merge Enrique Osuna's work on the Framework.
[vlc.git] / extras / MacOSX / Framework / Sources / VLCVideoView.m
1 /*****************************************************************************
2  * VLCVideoView.h: VLC.framework VLCVideoView implementation
3  *****************************************************************************
4  * Copyright (C) 2007 Pierre d'Herbemont
5  * Copyright (C) 2007 the VideoLAN team
6  * $Id$
7  *
8  * Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 #import "VLCVideoView.h"
26 #import "VLCLibrary.h"
27 #import "VLCEventManager.h"
28
29 /* Libvlc */
30 #include <vlc/vlc.h>
31 #include <vlc/libvlc.h>
32
33 /* Notifications */
34 NSString *VLCVideoViewEnteredFullScreen = @"VLCVideoViewEnteredFullScreen";
35 NSString *VLCVideoViewLeftFullScreen = @"VLCVideoViewLeftFullScreen";
36
37 /* This is a forward reference to VLCOpenGLVoutView specified in minimal_macosx
38    library.  We could get rid of this, but it prevents warnings from the 
39    compiler. */
40 @interface VLCOpenGLVoutView : NSView
41
42 - (void)detachFromVout;
43
44 @end
45
46 @implementation VLCVideoView
47
48 - (id)initWithFrame:(NSRect)rect
49 {
50     if (self = [super initWithFrame:rect]) 
51     {
52         delegate = nil;
53         [self setBackColor:[NSColor blackColor]];
54         [self setStretchesVideo:NO];
55         [self setAutoresizesSubviews:YES];
56     }
57     return self;
58 }
59
60 - (void)dealloc
61 {
62     delegate = nil;
63     [backColor release];
64     [super dealloc];
65 }
66
67 - (void)setDelegate:(id)value
68 {
69     delegate = value;
70 }
71
72 - (id)delegate
73 {
74     return delegate;
75 }
76
77 - (void)setBackColor:(NSColor *)value
78 {
79     if (backColor != value)
80     {
81         [backColor release];
82         backColor = [value retain];
83     }
84 }
85
86 - (NSColor *)backColor
87 {
88     return backColor;
89 }
90
91 - (void)setStretchesVideo:(BOOL)value
92 {
93     stretchesVideo = value;
94 }
95
96 - (BOOL)stretchesVideo
97 {
98     return stretchesVideo;
99 }
100
101 /* This is called by the libvlc module 'minimal_macosx' as soon as there is one 
102  * vout available 
103  */
104 - (void)addVoutSubview:(NSView *)aView
105 {
106     if( [[self subviews] count] )
107     {
108         /* XXX: This is a hack until core gets fixed */
109         int i;
110         for( i = 0; i < [[self subviews] count]; i++ )
111         {
112             [[[self subviews] objectAtIndex:i] detachFromVout];
113             [[[self subviews] objectAtIndex:i] retain];
114             [[[self subviews] objectAtIndex:i] removeFromSuperview];
115         }
116     }
117     [self addSubview:aView];
118     [aView setFrame:[self bounds]];
119     
120     // TODO: Should we let the media player specify these values?
121     [aView setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable];
122 }
123
124 - (void)removeVoutSubview:(NSView *)view
125 {
126     // Should we do something?  I don't know, however the protocol requires
127     // this to be implemented
128 }
129
130 /* This is a LibVLC notification that we're about to enter into full screen,
131    there is no other place where I can see where we can trap this event */
132 - (void)enterFullscreen
133 {
134     // Go ahead and send a notification to the world we're going into full screen
135     [[VLCEventManager sharedManager] callOnMainThreadDelegateOfObject:self 
136                                                    withDelegateMethod:nil 
137                                                  withNotificationName:VLCVideoViewEnteredFullScreen];
138     
139     // There is nothing else to do, as this object strictly displays the video feed
140 }
141
142 /* This is a LibVLC notification that we're about to enter leaving full screen,
143    there is no other place where I can see where we can trap this event */
144 - (void)leaveFullscreen
145 {
146     // Go ahead and send a notification to the world we're leaving full screen
147     [[VLCEventManager sharedManager] callOnMainThreadDelegateOfObject:self 
148                                                    withDelegateMethod:nil 
149                                                  withNotificationName:VLCVideoViewLeftFullScreen];
150     
151     // There is nothing else to do, as this object strictly displays the video feed
152 }
153
154 - (void)drawRect:(NSRect)aRect
155 {
156     [self lockFocus];
157     [backColor set];
158     NSRectFill(aRect);
159     [self unlockFocus];
160 }
161
162 - (BOOL)isOpaque
163 {
164     return YES;
165 }
166
167 @end