1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: cocoa/toplevel.mm
3 // Purpose: implements wxTopLevelWindow for Cocoa
4 // Author: David Elliott
8 // Copyright: (c) 2002 David Elliott
9 // License: wxWindows license
10 ///////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
23 #include "wx/window.h"
24 #include "wx/toplevel.h"
25 #include "wx/menuitem.h"
31 #include "wx/cocoa/autorelease.h"
33 #import <AppKit/NSView.h>
34 #import <AppKit/NSWindow.h>
35 // ----------------------------------------------------------------------------
37 // ----------------------------------------------------------------------------
39 // list of all frames and modeless dialogs
40 wxWindowList wxModelessWindows;
42 // ============================================================================
43 // wxTopLevelWindowCocoa implementation
44 // ============================================================================
46 // ----------------------------------------------------------------------------
47 // wxTopLevelWindowCocoa creation
48 // ----------------------------------------------------------------------------
49 BEGIN_EVENT_TABLE(wxTopLevelWindowCocoa,wxTopLevelWindowBase)
50 EVT_CLOSE(wxTopLevelWindowCocoa::OnCloseWindow)
53 void wxTopLevelWindowCocoa::Init()
60 bool wxTopLevelWindowCocoa::Create(wxWindow *parent,
62 const wxString& title,
68 wxAutoNSAutoreleasePool pool;
69 wxTopLevelWindows.Append(this);
71 if(!CreateBase(parent,winid,pos,size,style,wxDefaultValidator,name))
75 parent->AddChild(this);
77 // TODO: get rect from given position/size
78 NSRect cocoaRect = NSMakeRect(100,100,200,200);
80 // TODO: Set flags given wxWindows style
81 unsigned int cocoaStyle = 0;
82 cocoaStyle |= NSTitledWindowMask;
83 cocoaStyle |= NSClosableWindowMask;
84 cocoaStyle |= NSMiniaturizableWindowMask;
85 cocoaStyle |= NSResizableWindowMask;
87 m_cocoaNSWindow = NULL;
89 SetNSWindow([[NSWindow alloc] initWithContentRect:cocoaRect styleMask:cocoaStyle backing:NSBackingStoreBuffered defer:NO]);
90 // NOTE: SetNSWindow has retained the Cocoa object for this object.
91 // Because we do not release on close, the following release matches the
92 // above alloc and thus the retain count will be 1.
93 [m_cocoaNSWindow release];
98 wxTopLevelWindowCocoa::~wxTopLevelWindowCocoa()
100 wxAutoNSAutoreleasePool pool;
101 // Hand ownership of the content view to wxWindow so it can destroy
103 NSView *view = [m_cocoaNSView retain];
109 // ----------------------------------------------------------------------------
110 // wxTopLevelWindowCocoa Cocoa Specifics
111 // ----------------------------------------------------------------------------
113 void wxTopLevelWindowCocoa::SetNSWindow(WX_NSWindow cocoaNSWindow)
115 bool need_debug = cocoaNSWindow || m_cocoaNSWindow;
116 if(need_debug) wxLogDebug("wxTopLevelWindowCocoa=%p::SetNSWindow [m_cocoaNSWindow=%p retainCount]=%d",this,m_cocoaNSWindow,[m_cocoaNSWindow retainCount]);
117 DisassociateNSWindow(m_cocoaNSWindow);
118 [cocoaNSWindow retain];
119 [m_cocoaNSWindow release];
120 m_cocoaNSWindow = cocoaNSWindow;
122 SetNSView([m_cocoaNSWindow contentView]);
125 AssociateNSWindow(m_cocoaNSWindow);
126 if(need_debug) wxLogDebug("wxTopLevelWindowCocoa=%p::SetNSWindow [cocoaNSWindow=%p retainCount]=%d",this,cocoaNSWindow,[cocoaNSWindow retainCount]);
129 void wxTopLevelWindowCocoa::Cocoa_wxMenuItemAction(wxMenuItem& item)
133 void wxTopLevelWindowCocoa::Cocoa_close(void)
137 /* Be SURE that idle events get ran. If the window was not active when
138 it was closed, then there will be no more events to trigger this and
139 therefore it must be done here */
140 wxTheApp->CocoaInstallRequestedIdleHandler();
143 bool wxTopLevelWindowCocoa::Cocoa_windowShouldClose()
145 return wxWindowBase::Close(false);
148 // ----------------------------------------------------------------------------
149 // wxTopLevelWindowCocoa maximize/minimize
150 // ----------------------------------------------------------------------------
152 void wxTopLevelWindowCocoa::Maximize(bool maximize)
156 bool wxTopLevelWindowCocoa::IsMaximized() const
161 void wxTopLevelWindowCocoa::Iconize(bool iconize)
165 bool wxTopLevelWindowCocoa::IsIconized() const
170 void wxTopLevelWindowCocoa::Restore()
174 bool wxTopLevelWindowCocoa::Show(bool show)
176 wxAutoNSAutoreleasePool pool;
178 [m_cocoaNSWindow makeKeyAndOrderFront:m_cocoaNSWindow];
180 [m_cocoaNSWindow orderOut:m_cocoaNSWindow];
184 bool wxTopLevelWindowCocoa::Close(bool force)
187 return wxWindowBase::Close(force);
188 // performClose will fake the user clicking the close button which
189 // will invoke windowShouldClose which will call the base class version
190 // of Close() which will NOT Destroy() the window (see below) but
191 // if closing is not stopped, then performClose will go ahead and
192 // close the window which will invoke Cocoa_close() setting m_closed
193 // to true and Destroy()ing the window.
194 [m_cocoaNSWindow performClose:m_cocoaNSWindow];
198 void wxTopLevelWindowCocoa::OnCloseWindow(wxCloseEvent& event)
200 // If the event was forced, close the window which will Destroy() it
202 [m_cocoaNSWindow close];
203 // if the event was not forced, it's probably because the user clicked
204 // the close button, or Close(false) was called which (see above) is
205 // redirected to performClose and thus Cocoa itself will close the window
208 // ----------------------------------------------------------------------------
209 // wxTopLevelWindowCocoa misc
210 // ----------------------------------------------------------------------------
212 bool wxTopLevelWindowCocoa::ShowFullScreen(bool show, long style)
217 bool wxTopLevelWindowCocoa::IsFullScreen() const
222 void wxTopLevelWindowCocoa::DoMoveWindow(int x, int y, int width, int height)
224 wxLogDebug("wxTopLevelWindow=%p::DoMoveWindow(%d,%d,%d,%d)",this,x,y,width,height);
226 NSRect cocoaRect = NSMakeRect(x,y,width,height);
227 [m_cocoaNSWindow setFrame: cocoaRect display:NO];
230 void wxTopLevelWindowCocoa::DoGetSize(int *w, int *h) const
232 NSRect cocoaRect = [m_cocoaNSWindow frame];
234 *w=(int)cocoaRect.size.width;
236 *h=(int)cocoaRect.size.height;
237 wxLogDebug("wxTopLevelWindow=%p::DoGetSize = (%d,%d)",this,(int)cocoaRect.size.width,(int)cocoaRect.size.height);
240 void wxTopLevelWindowCocoa::DoGetPosition(int *x, int *y) const
242 NSRect cocoaRect = [m_cocoaNSWindow frame];
244 *x=(int)cocoaRect.origin.x;
246 *y=(int)cocoaRect.origin.y;
247 wxLogDebug("wxTopLevelWindow=%p::DoGetPosition = (%d,%d)",this,(int)cocoaRect.origin.x,(int)cocoaRect.origin.y);