]> git.saurik.com Git - wxWidgets.git/blame - src/osx/cocoa/nonownedwnd.mm
universal implementation for osx cocoa
[wxWidgets.git] / src / osx / cocoa / nonownedwnd.mm
CommitLineData
33e90275
SC
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/mac/cocoa/nonownedwnd.mm
3// Purpose: non owned window for cocoa
4// Author: DavidStefan Csomor
5// Modified by:
6// Created: 2008-06-20
7// RCS-ID: $Id: nonownedwnd.mm 48805 2007-09-19 14:52:25Z SC $
8// Copyright: (c) Stefan Csomor
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#include "wx/wxprec.h"
13
14#if wxOSX_USE_COCOA
15#include <Cocoa/Cocoa.h>
16#else
17#include <UIKit/UIKit.h>
18#endif
19
20#ifdef __WXMAC__
21#include "wx/osx/private.h"
22#endif
23
24#if wxOSX_USE_COCOA
25
26
27NSRect wxToNSRect( NSView* parent, const wxRect& r )
28{
29 NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame];
30 int y = r.y;
31 int x = r.x ;
32 if ( parent != NULL && ![ parent isFlipped ] )
33 y = frame.size.height - ( r.y + r.height );
34 return NSMakeRect(x, y, r.width , r.height);
35}
36
37wxRect wxFromNSRect( NSView* parent, const NSRect& rect )
38{
39 NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame];
40 int y = rect.origin.y;
41 int x = rect.origin.x;
42 if ( parent != NULL && ![ parent isFlipped ] )
43 y = frame.size.height - (rect.origin.y + rect.size.height);
44 return wxRect( x, y, rect.size.width, rect.size.height );
45}
46
47NSPoint wxToNSPoint( NSView* parent, const wxPoint& p )
48{
49 NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame];
50 int x = p.x ;
51 int y = p.y;
52 if ( parent != NULL && ![ parent isFlipped ] )
53 y = frame.size.height - ( p.y );
54 return NSMakePoint(x, y);
55}
56
57wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p )
58{
59 NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame];
60 int x = p.x;
61 int y = p.y;
62 if ( parent != NULL && ![ parent isFlipped ] )
63 y = frame.size.height - ( p.y );
64 return wxPoint( x, y);
65}
66
67IMPLEMENT_DYNAMIC_CLASS( wxNonOwnedWindowCocoaImpl , wxNonOwnedWindowImpl )
68
69wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl( wxNonOwnedWindow* nonownedwnd) :
70 wxNonOwnedWindowImpl(nonownedwnd)
71{
72 m_macWindow = NULL;
73 m_macFullScreenData = NULL;
74}
75
76wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl()
77{
78 m_macWindow = NULL;
79 m_macFullScreenData = NULL;
80}
81
82wxNonOwnedWindowCocoaImpl::~wxNonOwnedWindowCocoaImpl()
83{
84 [m_macWindow release];
85}
86
87void wxNonOwnedWindowCocoaImpl::Destroy()
88{
89 wxPendingDelete.Append( new wxDeferredObjectDeleter( this ) );
90}
91
92void wxNonOwnedWindowCocoaImpl::Create( wxWindow* parent, const wxPoint& pos, const wxSize& size,
93long style, long extraStyle, const wxString& name )
94{
95 int windowstyle = NSBorderlessWindowMask;
96
97 if ( style & wxFRAME_TOOL_WINDOW )
98 m_macWindow = [NSPanel alloc];
99 else
100 m_macWindow = [NSWindow alloc];
101
102 CGWindowLevel level = kCGNormalWindowLevelKey;
103
104 if ( style & wxFRAME_TOOL_WINDOW )
105 {
106 if ( ( style & wxSTAY_ON_TOP ) )
107 level = kCGUtilityWindowLevel;
108 else
109 level = kCGFloatingWindowLevel ;
110
111 }
112 else if ( ( style & wxPOPUP_WINDOW ) )
113 {
114 level = kCGPopUpMenuWindowLevel;
115 /*
116 if ( ( style & wxBORDER_NONE ) )
117 {
118 wclass = kHelpWindowClass ; // has no border
119 attr |= kWindowNoShadowAttribute;
120 }
121 else
122 {
123 wclass = kPlainWindowClass ; // has a single line border, it will have to do for now
124 }
125 */
126 }
127 else if ( ( style & wxCAPTION ) )
128 {
129 windowstyle |= NSTitledWindowMask ;
130 }
131 else if ( ( style & wxFRAME_DRAWER ) )
132 {
133 /*
134 wclass = kDrawerWindowClass;
135 */
136 }
137 else
138 {
139 // set these even if we have no title, otherwise the controls won't be visible
140 if ( ( style & wxMINIMIZE_BOX ) || ( style & wxMAXIMIZE_BOX ) ||
141 ( style & wxCLOSE_BOX ) || ( style & wxSYSTEM_MENU ) )
142 {
143 windowstyle |= NSTitledWindowMask ;
144 }
145 /*
146 else if ( ( style & wxNO_BORDER ) )
147 {
148 wclass = kSimpleWindowClass ;
149 }
150 else
151 {
152 wclass = kPlainWindowClass ;
153 }
154 */
155 }
156
157 if ( windowstyle & NSTitledWindowMask )
158 {
159 if ( ( style & wxMINIMIZE_BOX ) )
160 windowstyle |= NSMiniaturizableWindowMask ;
161
162 if ( ( style & wxMAXIMIZE_BOX ) )
163 windowstyle |= NSResizableWindowMask ; // TODO showing ZOOM ?
164
165 if ( ( style & wxRESIZE_BORDER ) )
166 windowstyle |= NSResizableWindowMask ;
167
168 if ( ( style & wxCLOSE_BOX) )
169 windowstyle |= NSClosableWindowMask ;
170 }
171 if ( extraStyle & wxFRAME_EX_METAL)
172 windowstyle |= NSTexturedBackgroundWindowMask;
173
174 if ( ( style & wxSTAY_ON_TOP ) )
175 level = kCGUtilityWindowLevel;
176/*
177 if ( ( style & wxFRAME_FLOAT_ON_PARENT ) )
178 group = GetWindowGroupOfClass(kFloatingWindowClass);
179 */
180
181 NSRect r = wxToNSRect( NULL, wxRect( pos, size) );
182
183 [m_macWindow initWithContentRect:r
184 styleMask:windowstyle
185 backing:NSBackingStoreBuffered
186 defer:NO
187 ];
188
189 [m_macWindow setLevel:level];
190 // [m_macWindow makeKeyAndOrderFront:nil];
191}
192
193
194WXWindow wxNonOwnedWindowCocoaImpl::GetWXWindow() const
195{
196 return m_macWindow;
197}
198
199void wxNonOwnedWindowCocoaImpl::Raise()
200{
201 [m_macWindow orderWindow:NSWindowAbove relativeTo:0];
202}
203
204void wxNonOwnedWindowCocoaImpl::Lower()
205{
206 [m_macWindow orderWindow:NSWindowBelow relativeTo:0];
207}
208
209bool wxNonOwnedWindowCocoaImpl::Show(bool show)
210{
211 if ( show )
212 {
213 [m_macWindow orderFront:nil];
214 [[m_macWindow contentView] setNeedsDisplay:YES];
215 }
216 else
217 [m_macWindow orderOut:nil];
218 return true;
219}
220
221bool wxNonOwnedWindowCocoaImpl::ShowWithEffect(bool show, wxShowEffect effect, unsigned timeout)
222{
223 return Show(show);
224}
225
226void wxNonOwnedWindowCocoaImpl::Update()
227{
228 [m_macWindow displayIfNeeded];
229}
230
231bool wxNonOwnedWindowCocoaImpl::SetTransparent(wxByte alpha)
232{
233 [m_macWindow setAlphaValue:(CGFloat) alpha/255.0];
234 return true;
235}
236
237bool wxNonOwnedWindowCocoaImpl::SetBackgroundColour(const wxColour& col )
238{
239 return true;
240}
241
242void wxNonOwnedWindowCocoaImpl::SetExtraStyle( long exStyle )
243{
244 if ( m_macWindow )
245 {
246 bool metal = exStyle & wxFRAME_EX_METAL ;
247 int windowStyle = [ m_macWindow styleMask];
248 if ( metal && !(windowStyle & NSTexturedBackgroundWindowMask) )
249 {
250 wxFAIL_MSG( _T("Metal Style cannot be changed after creation") );
251 }
252 else if ( !metal && (windowStyle & NSTexturedBackgroundWindowMask ) )
253 {
254 wxFAIL_MSG( _T("Metal Style cannot be changed after creation") );
255 }
256 }
257}
258
259bool wxNonOwnedWindowCocoaImpl::SetBackgroundStyle(wxBackgroundStyle style)
260{
261 return true;
262}
263
264bool wxNonOwnedWindowCocoaImpl::CanSetTransparent()
265{
266 return true;
267}
268
269void wxNonOwnedWindowCocoaImpl::MoveWindow(int x, int y, int width, int height)
270{
271 NSRect r = wxToNSRect( NULL, wxRect(x,y,width, height) );
272 [m_macWindow setFrame:r display:YES];
273}
274
275void wxNonOwnedWindowCocoaImpl::GetPosition( int &x, int &y ) const
276{
277 wxRect r = wxFromNSRect( NULL, [m_macWindow frame] );
278 x = r.GetLeft();
279 y = r.GetTop();
280}
281
282void wxNonOwnedWindowCocoaImpl::GetSize( int &width, int &height ) const
283{
284 NSRect rect = [m_macWindow frame];
285 width = rect.size.width;
286 height = rect.size.height;
287}
288
289void wxNonOwnedWindowCocoaImpl::GetContentArea( int& left, int &right, int &width, int &height ) const
290{
291 NSRect outer = NSMakeRect(100,100,100,100);
292 NSRect content = [NSWindow contentRectForFrameRect:outer styleMask:[m_macWindow styleMask] ];
293 NSRect rect = [[m_macWindow contentView] frame];
294 width = rect.size.width;
295 height = rect.size.height;
296}
297
298bool wxNonOwnedWindowCocoaImpl::SetShape(const wxRegion& region)
299{
300 return false;
301}
302
303void wxNonOwnedWindowCocoaImpl::SetTitle( const wxString& title, wxFontEncoding encoding )
304{
305 [m_macWindow setTitle:wxCFStringRef( title , encoding ).AsNSString()];
306}
307
308bool wxNonOwnedWindowCocoaImpl::IsMaximized() const
309{
310 return [m_macWindow isZoomed];
311}
312
313bool wxNonOwnedWindowCocoaImpl::IsIconized() const
314{
315 return [m_macWindow isMiniaturized];
316}
317
318void wxNonOwnedWindowCocoaImpl::Iconize( bool iconize )
319{
320 if ( iconize )
321 [m_macWindow miniaturize:nil];
322 else
323 [m_macWindow deminiaturize:nil];
324}
325
326void wxNonOwnedWindowCocoaImpl::Maximize(bool maximize)
327{
328 [m_macWindow zoom:nil];
329}
330
331
332// http://cocoadevcentral.com/articles/000028.php
333
334typedef struct
335{
336 int m_formerLevel;
337 NSRect m_formerFrame;
338} FullScreenData ;
339
340bool wxNonOwnedWindowCocoaImpl::IsFullScreen() const
341{
342 return m_macFullScreenData != NULL ;
343}
344
345bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long style)
346{
347 if ( show )
348 {
349 FullScreenData *data = (FullScreenData *)m_macFullScreenData ;
350 delete data ;
351 data = new FullScreenData();
352
353 m_macFullScreenData = data ;
354 data->m_formerLevel = [m_macWindow level];
355 data->m_formerFrame = [m_macWindow frame];
356 CGDisplayCapture( kCGDirectMainDisplay );
357 [m_macWindow setLevel:CGShieldingWindowLevel()];
358 [m_macWindow setFrame:[[NSScreen mainScreen] frame] display:YES];
359 }
360 else if ( m_macFullScreenData != NULL )
361 {
362 FullScreenData *data = (FullScreenData *) m_macFullScreenData ;
363 CGDisplayRelease( kCGDirectMainDisplay );
364 [m_macWindow setLevel:data->m_formerLevel];
365 [m_macWindow setFrame:data->m_formerFrame display:YES];
366 delete data ;
367 m_macFullScreenData = NULL ;
368 }
369
370 return true;
371}
372
373void wxNonOwnedWindowCocoaImpl::RequestUserAttention(int WXUNUSED(flags))
374{
375}
376#endif