X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5276b0a53cef4815230e39b54d2ecda14f72cbd1..6f3f38980f10a935f3b47dbf0d3b4643e96a4be2:/src/osx/nonownedwnd_osx.cpp diff --git a/src/osx/nonownedwnd_osx.cpp b/src/osx/nonownedwnd_osx.cpp index 638af1d7ac..e2543dff27 100644 --- a/src/osx/nonownedwnd_osx.cpp +++ b/src/osx/nonownedwnd_osx.cpp @@ -3,7 +3,7 @@ // Purpose: implementation of wxNonOwnedWindow // Author: Stefan Csomor // Created: 2008-03-24 -// RCS-ID: $Id: nonownedwnd.cpp 50329 2007-11-29 17:00:58Z VS $ +// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor 2008 // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -52,14 +52,14 @@ static MacWindowMap wxWinMacWindowList; wxNonOwnedWindow* wxNonOwnedWindow::GetFromWXWindow( WXWindow win ) { wxNonOwnedWindowImpl* impl = wxNonOwnedWindowImpl::FindFromWXWindow(win); - + return ( impl != NULL ? impl->GetWXPeer() : NULL ) ; } wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::FindFromWXWindow (WXWindow window) { MacWindowMap::iterator node = wxWinMacWindowList.find(window); - + return (node == wxWinMacWindowList.end()) ? NULL : node->second; } @@ -81,7 +81,7 @@ void wxNonOwnedWindowImpl::Associate( WXWindow window, wxNonOwnedWindowImpl *imp // adding NULL WindowRef is (first) surely a result of an error and // nothing else :-) wxCHECK_RET( window != (WXWindow) NULL, wxT("attempt to add a NULL WindowRef to window list") ); - + wxWinMacWindowList[window] = impl; } @@ -101,8 +101,8 @@ void wxNonOwnedWindow::Init() bool wxNonOwnedWindow::Create(wxWindow *parent, wxWindowID id, - const wxPoint& pos, - const wxSize& size, + const wxPoint& posOrig, + const wxSize& sizeOrig, long style, const wxString& name) { @@ -114,22 +114,35 @@ bool wxNonOwnedWindow::Create(wxWindow *parent, m_windowStyle = style; m_isShown = false; - // create frame. - int x = (int)pos.x; - int y = (int)pos.y; - - wxRect display = wxGetClientDisplayRect() ; + // use the appropriate defaults for the position and size if necessary + wxSize size(sizeOrig); + if ( !size.IsFullySpecified() ) + size.SetDefaults(wxTopLevelWindow::GetDefaultSize()); - if ( x == wxDefaultPosition.x ) - x = display.x ; + wxPoint pos(posOrig); + if ( !pos.IsFullySpecified() ) + { + wxRect rectWin = wxRect(size).CentreIn(wxGetClientDisplayRect()); - if ( y == wxDefaultPosition.y ) - y = display.y ; + // The size of the window is often not really known yet, TLWs are often + // created with some small initial size and later are fitted to contain + // their children so centering the window will show it too much to the + // right and bottom, adjust for it by putting it more to the left and + // center. + rectWin.x /= 2; + rectWin.y /= 2; - int w = WidthDefault(size.x); - int h = HeightDefault(size.y); + pos.SetDefaults(rectWin.GetPosition()); + } - m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow(this, parent, wxPoint(x,y) , wxSize(w,h) , style , GetExtraStyle(), name ); + // create frame. + m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow + ( + this, parent, + pos , size, + style, GetExtraStyle(), + name + ); wxNonOwnedWindowImpl::Associate( m_nowpeer->GetWXWindow() , m_nowpeer ) ; m_peer = wxWidgetImpl::CreateContentView(this); @@ -148,17 +161,39 @@ bool wxNonOwnedWindow::Create(wxWindow *parent, bool wxNonOwnedWindow::Create(wxWindow *parent, WXWindow nativeWindow) { - m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow(this, parent, nativeWindow ); + if ( parent ) + parent->AddChild(this); + + SubclassWin(nativeWindow); + + return true; +} + +void wxNonOwnedWindow::SubclassWin(WXWindow nativeWindow) +{ + wxASSERT_MSG( !m_isNativeWindowWrapper, wxT("subclassing window twice?") ); + wxASSERT_MSG( m_nowpeer == NULL, wxT("window already was created") ); + + m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow(this, GetParent(), nativeWindow ); m_isNativeWindowWrapper = true; wxNonOwnedWindowImpl::Associate( m_nowpeer->GetWXWindow() , m_nowpeer ) ; m_peer = wxWidgetImpl::CreateContentView(this); +} - if ( parent ) - parent->AddChild(this); - - return true; +void wxNonOwnedWindow::UnsubclassWin() +{ + wxASSERT_MSG( m_isNativeWindowWrapper, wxT("window was not subclassed") ); + + if ( GetParent() ) + GetParent()->RemoveChild(this); + + wxNonOwnedWindowImpl::RemoveAssociations(m_nowpeer) ; + wxDELETE(m_nowpeer); + wxDELETE(m_peer); + m_isNativeWindowWrapper = false; } + wxNonOwnedWindow::~wxNonOwnedWindow() { SendDestroyEvent(); @@ -177,7 +212,7 @@ wxNonOwnedWindow::~wxNonOwnedWindow() bool wxNonOwnedWindow::Destroy() { WillBeDestroyed(); - + return wxWindow::Destroy(); } @@ -243,9 +278,9 @@ void wxNonOwnedWindow::SetWindowStyleFlag(long flags) { if (flags == GetWindowStyleFlag()) return; - + wxWindow::SetWindowStyleFlag(flags); - + if (m_nowpeer) m_nowpeer->SetWindowStyleFlag(flags); } @@ -432,7 +467,14 @@ void wxNonOwnedWindow::DoGetClientSize( int *width, int *height ) const return; int left, top, w, h; + // under iphone with a translucent status bar the m_nowpeer returns the + // inner area, while the content area extends under the translucent + // status bar, therefore we use the content view's area +#ifdef __WXOSX_IPHONE__ + m_peer->GetContentArea(left, top, w, h); +#else m_nowpeer->GetContentArea(left, top, w, h); +#endif if (width) *width = w ; @@ -462,7 +504,7 @@ bool wxNonOwnedWindow::DoSetShape(const wxRegion& region) wxT("Shaped windows must be created with the wxFRAME_SHAPED style.")); m_shape = region; - + // The empty region signifies that the shape // should be removed from the window. if ( region.IsEmpty() )