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/NSWindow.h>
32 // ----------------------------------------------------------------------------
34 // ----------------------------------------------------------------------------
36 // list of all frames and modeless dialogs
37 wxWindowList wxModelessWindows;
39 // ============================================================================
40 // wxTopLevelWindowCocoa implementation
41 // ============================================================================
43 // ----------------------------------------------------------------------------
44 // wxTopLevelWindowCocoa creation
45 // ----------------------------------------------------------------------------
46 IMPLEMENT_CLASS(wxTopLevelWindowCocoa,wxWindowCocoa)
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()
100 // ----------------------------------------------------------------------------
101 // wxTopLevelWindowCocoa Cocoa Specifics
102 // ----------------------------------------------------------------------------
104 void wxTopLevelWindowCocoa::SetNSWindow(WX_NSWindow cocoaNSWindow)
106 bool need_debug = cocoaNSWindow || m_cocoaNSWindow;
107 if(need_debug) wxLogDebug("wxTopLevelWindowCocoa=%p::SetNSWindow [m_cocoaNSWindow=%p retainCount]=%d",this,m_cocoaNSWindow,[m_cocoaNSWindow retainCount]);
109 DisassociateNSWindow(m_cocoaNSWindow);
110 [cocoaNSWindow retain];
111 [m_cocoaNSWindow release];
112 m_cocoaNSWindow = cocoaNSWindow;
114 SetNSView([m_cocoaNSWindow contentView]);
118 AssociateNSWindow(m_cocoaNSWindow);
119 if(need_debug) wxLogDebug("wxTopLevelWindowCocoa=%p::SetNSWindow [cocoaNSWindow=%p retainCount]=%d",this,cocoaNSWindow,[cocoaNSWindow retainCount]);
122 void wxTopLevelWindowCocoa::Cocoa_wxMenuItemAction(wxMenuItem& item)
126 void wxTopLevelWindowCocoa::Cocoa_close(void)
130 /* Be SURE that idle events get ran. If the window was not active when
131 it was closed, then there will be no more events to trigger this and
132 therefore it must be done here */
133 wxTheApp->CocoaInstallRequestedIdleHandler();
136 bool wxTopLevelWindowCocoa::Cocoa_windowShouldClose()
138 return wxWindowBase::Close(false);
141 // ----------------------------------------------------------------------------
142 // wxTopLevelWindowCocoa maximize/minimize
143 // ----------------------------------------------------------------------------
145 void wxTopLevelWindowCocoa::Maximize(bool maximize)
149 bool wxTopLevelWindowCocoa::IsMaximized() const
154 void wxTopLevelWindowCocoa::Iconize(bool iconize)
158 bool wxTopLevelWindowCocoa::IsIconized() const
163 void wxTopLevelWindowCocoa::Restore()
167 bool wxTopLevelWindowCocoa::Show(bool show)
170 [m_cocoaNSWindow makeKeyAndOrderFront:m_cocoaNSWindow];
172 [m_cocoaNSWindow orderOut:m_cocoaNSWindow];
176 bool wxTopLevelWindowCocoa::Close(bool force)
179 return wxWindowBase::Close(force);
180 // performClose will fake the user clicking the close button which
181 // will invoke windowShouldClose which will call the base class version
182 // of Close() which will NOT Destroy() the window (see below) but
183 // if closing is not stopped, then performClose will go ahead and
184 // close the window which will invoke Cocoa_close() setting m_closed
185 // to true and Destroy()ing the window.
186 [m_cocoaNSWindow performClose:m_cocoaNSWindow];
190 void wxTopLevelWindowCocoa::OnCloseWindow(wxCloseEvent& event)
192 // If the event was forced, close the window which will Destroy() it
194 [m_cocoaNSWindow close];
195 // if the event was not forced, it's probably because the user clicked
196 // the close button, or Close(false) was called which (see above) is
197 // redirected to performClose and thus Cocoa itself will close the window
200 // ----------------------------------------------------------------------------
201 // wxTopLevelWindowCocoa misc
202 // ----------------------------------------------------------------------------
204 bool wxTopLevelWindowCocoa::ShowFullScreen(bool show, long style)
209 bool wxTopLevelWindowCocoa::IsFullScreen() const
214 void wxTopLevelWindowCocoa::DoMoveWindow(int x, int y, int width, int height)
216 wxLogDebug("wxTopLevelWindow=%p::DoMoveWindow(%d,%d,%d,%d)",this,x,y,width,height);
218 NSRect cocoaRect = NSMakeRect(x,y,width,height);
219 [m_cocoaNSWindow setFrame: cocoaRect display:NO];
222 void wxTopLevelWindowCocoa::DoGetSize(int *w, int *h) const
224 NSRect cocoaRect = [m_cocoaNSWindow frame];
226 *w=(int)cocoaRect.size.width;
228 *h=(int)cocoaRect.size.height;
229 wxLogDebug("wxTopLevelWindow=%p::DoGetSize = (%d,%d)",this,(int)cocoaRect.size.width,(int)cocoaRect.size.height);
232 void wxTopLevelWindowCocoa::DoGetPosition(int *x, int *y) const
234 NSRect cocoaRect = [m_cocoaNSWindow frame];
236 *x=(int)cocoaRect.origin.x;
238 *y=(int)cocoaRect.origin.y;
239 wxLogDebug("wxTopLevelWindow=%p::DoGetPosition = (%d,%d)",this,(int)cocoaRect.origin.x,(int)cocoaRect.origin.y);