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 #import <AppKit/NSView.h>
32 #import <AppKit/NSWindow.h>
33 // ----------------------------------------------------------------------------
35 // ----------------------------------------------------------------------------
37 // list of all frames and modeless dialogs
38 wxWindowList wxModelessWindows;
40 // ============================================================================
41 // wxTopLevelWindowCocoa implementation
42 // ============================================================================
44 // ----------------------------------------------------------------------------
45 // wxTopLevelWindowCocoa creation
46 // ----------------------------------------------------------------------------
47 BEGIN_EVENT_TABLE(wxTopLevelWindowCocoa,wxTopLevelWindowBase)
48 EVT_CLOSE(wxTopLevelWindowCocoa::OnCloseWindow)
51 void wxTopLevelWindowCocoa::Init()
58 bool wxTopLevelWindowCocoa::Create(wxWindow *parent,
60 const wxString& title,
66 wxTopLevelWindows.Append(this);
68 if(!CreateBase(parent,winid,pos,size,style,wxDefaultValidator,name))
72 parent->AddChild(this);
74 // TODO: get rect from given position/size
75 NSRect cocoaRect = NSMakeRect(100,100,200,200);
77 // TODO: Set flags given wxWindows style
78 unsigned int cocoaStyle = 0;
79 cocoaStyle |= NSTitledWindowMask;
80 cocoaStyle |= NSClosableWindowMask;
81 cocoaStyle |= NSMiniaturizableWindowMask;
82 cocoaStyle |= NSResizableWindowMask;
84 m_cocoaNSWindow = NULL;
86 SetNSWindow([[NSWindow alloc] initWithContentRect:cocoaRect styleMask:cocoaStyle backing:NSBackingStoreBuffered defer:NO]);
87 // NOTE: SetNSWindow has retained the Cocoa object for this object.
88 // Because we do not release on close, the following release matches the
89 // above alloc and thus the retain count will be 1.
90 [m_cocoaNSWindow release];
95 wxTopLevelWindowCocoa::~wxTopLevelWindowCocoa()
97 // Hand ownership of the content view to wxWindow so it can destroy
99 NSView *view = [m_cocoaNSView retain];
105 // ----------------------------------------------------------------------------
106 // wxTopLevelWindowCocoa Cocoa Specifics
107 // ----------------------------------------------------------------------------
109 void wxTopLevelWindowCocoa::SetNSWindow(WX_NSWindow cocoaNSWindow)
111 bool need_debug = cocoaNSWindow || m_cocoaNSWindow;
112 if(need_debug) wxLogDebug("wxTopLevelWindowCocoa=%p::SetNSWindow [m_cocoaNSWindow=%p retainCount]=%d",this,m_cocoaNSWindow,[m_cocoaNSWindow retainCount]);
113 DisassociateNSWindow(m_cocoaNSWindow);
114 [cocoaNSWindow retain];
115 [m_cocoaNSWindow release];
116 m_cocoaNSWindow = cocoaNSWindow;
118 SetNSView([m_cocoaNSWindow contentView]);
121 AssociateNSWindow(m_cocoaNSWindow);
122 if(need_debug) wxLogDebug("wxTopLevelWindowCocoa=%p::SetNSWindow [cocoaNSWindow=%p retainCount]=%d",this,cocoaNSWindow,[cocoaNSWindow retainCount]);
125 void wxTopLevelWindowCocoa::Cocoa_wxMenuItemAction(wxMenuItem& item)
129 void wxTopLevelWindowCocoa::Cocoa_close(void)
133 /* Be SURE that idle events get ran. If the window was not active when
134 it was closed, then there will be no more events to trigger this and
135 therefore it must be done here */
136 wxTheApp->CocoaInstallRequestedIdleHandler();
139 bool wxTopLevelWindowCocoa::Cocoa_windowShouldClose()
141 return wxWindowBase::Close(false);
144 // ----------------------------------------------------------------------------
145 // wxTopLevelWindowCocoa maximize/minimize
146 // ----------------------------------------------------------------------------
148 void wxTopLevelWindowCocoa::Maximize(bool maximize)
152 bool wxTopLevelWindowCocoa::IsMaximized() const
157 void wxTopLevelWindowCocoa::Iconize(bool iconize)
161 bool wxTopLevelWindowCocoa::IsIconized() const
166 void wxTopLevelWindowCocoa::Restore()
170 bool wxTopLevelWindowCocoa::Show(bool show)
173 [m_cocoaNSWindow makeKeyAndOrderFront:m_cocoaNSWindow];
175 [m_cocoaNSWindow orderOut:m_cocoaNSWindow];
179 bool wxTopLevelWindowCocoa::Close(bool force)
182 return wxWindowBase::Close(force);
183 // performClose will fake the user clicking the close button which
184 // will invoke windowShouldClose which will call the base class version
185 // of Close() which will NOT Destroy() the window (see below) but
186 // if closing is not stopped, then performClose will go ahead and
187 // close the window which will invoke Cocoa_close() setting m_closed
188 // to true and Destroy()ing the window.
189 [m_cocoaNSWindow performClose:m_cocoaNSWindow];
193 void wxTopLevelWindowCocoa::OnCloseWindow(wxCloseEvent& event)
195 // If the event was forced, close the window which will Destroy() it
197 [m_cocoaNSWindow close];
198 // if the event was not forced, it's probably because the user clicked
199 // the close button, or Close(false) was called which (see above) is
200 // redirected to performClose and thus Cocoa itself will close the window
203 // ----------------------------------------------------------------------------
204 // wxTopLevelWindowCocoa misc
205 // ----------------------------------------------------------------------------
207 bool wxTopLevelWindowCocoa::ShowFullScreen(bool show, long style)
212 bool wxTopLevelWindowCocoa::IsFullScreen() const
217 void wxTopLevelWindowCocoa::DoMoveWindow(int x, int y, int width, int height)
219 wxLogDebug("wxTopLevelWindow=%p::DoMoveWindow(%d,%d,%d,%d)",this,x,y,width,height);
221 NSRect cocoaRect = NSMakeRect(x,y,width,height);
222 [m_cocoaNSWindow setFrame: cocoaRect display:NO];
225 void wxTopLevelWindowCocoa::DoGetSize(int *w, int *h) const
227 NSRect cocoaRect = [m_cocoaNSWindow frame];
229 *w=(int)cocoaRect.size.width;
231 *h=(int)cocoaRect.size.height;
232 wxLogDebug("wxTopLevelWindow=%p::DoGetSize = (%d,%d)",this,(int)cocoaRect.size.width,(int)cocoaRect.size.height);
235 void wxTopLevelWindowCocoa::DoGetPosition(int *x, int *y) const
237 NSRect cocoaRect = [m_cocoaNSWindow frame];
239 *x=(int)cocoaRect.origin.x;
241 *y=(int)cocoaRect.origin.y;
242 wxLogDebug("wxTopLevelWindow=%p::DoGetPosition = (%d,%d)",this,(int)cocoaRect.origin.x,(int)cocoaRect.origin.y);