// 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
/////////////////////////////////////////////////////////////////////////////
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;
}
// 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;
}
m_isShown = false;
// use the appropriate defaults for the position and size if necessary
- wxPoint pos(posOrig);
- if ( !pos.IsFullySpecified() )
- pos.SetDefaults(wxGetClientDisplayRect().GetPosition());
-
wxSize size(sizeOrig);
if ( !size.IsFullySpecified() )
size.SetDefaults(wxTopLevelWindow::GetDefaultSize());
+ wxPoint pos(posOrig);
+ if ( !pos.IsFullySpecified() )
+ {
+ wxRect rectWin = wxRect(size).CentreIn(wxGetClientDisplayRect());
+
+ // 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;
+
+ pos.SetDefaults(rectWin.GetPosition());
+ }
+
// create frame.
m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow
(
name
);
wxNonOwnedWindowImpl::Associate( m_nowpeer->GetWXWindow() , m_nowpeer ) ;
- m_peer = wxWidgetImpl::CreateContentView(this);
+ SetPeer(wxWidgetImpl::CreateContentView(this));
DoSetWindowVariant( m_windowVariant ) ;
bool wxNonOwnedWindow::Create(wxWindow *parent, WXWindow nativeWindow)
{
- m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow(this, parent, nativeWindow );
- m_isNativeWindowWrapper = true;
- wxNonOwnedWindowImpl::Associate( m_nowpeer->GetWXWindow() , m_nowpeer ) ;
- m_peer = wxWidgetImpl::CreateContentView(this);
-
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 ) ;
+ SetPeer(wxWidgetImpl::CreateContentView(this));
+}
+
+void wxNonOwnedWindow::UnsubclassWin()
+{
+ wxASSERT_MSG( m_isNativeWindowWrapper, wxT("window was not subclassed") );
+
+ if ( GetParent() )
+ GetParent()->RemoveChild(this);
+
+ wxNonOwnedWindowImpl::RemoveAssociations(m_nowpeer) ;
+ wxDELETE(m_nowpeer);
+ SetPeer(NULL);
+ m_isNativeWindowWrapper = false;
+}
+
+
wxNonOwnedWindow::~wxNonOwnedWindow()
{
SendDestroyEvent();
bool wxNonOwnedWindow::Destroy()
{
WillBeDestroyed();
-
+
return wxWindow::Destroy();
}
{
if (flags == GetWindowStyleFlag())
return;
-
+
wxWindow::SetWindowStyleFlag(flags);
-
+
if (m_nowpeer)
m_nowpeer->SetWindowStyleFlag(flags);
}
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__
+ GetPeer()->GetContentArea(left, top, w, h);
+#else
m_nowpeer->GetContentArea(left, top, w, h);
+#endif
if (width)
*width = w ;
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() )