]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/nonownedwnd_osx.cpp
moving userpane attribute into implementation
[wxWidgets.git] / src / osx / nonownedwnd_osx.cpp
index b3987670d7478a0347c561cb18ac4e595d5ca948..c3f981a100a5ac21bed9947246a718280cecd605 100644 (file)
@@ -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,24 +114,37 @@ 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);
+    SetPeer(wxWidgetImpl::CreateContentView(this));
 
     DoSetWindowVariant( m_windowVariant ) ;
 
@@ -148,17 +161,39 @@ bool wxNonOwnedWindow::Create(wxWindow *parent,
 
 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();
@@ -167,8 +202,7 @@ wxNonOwnedWindow::~wxNonOwnedWindow()
 
     DestroyChildren();
 
-    delete m_nowpeer;
-    m_nowpeer = NULL;
+    wxDELETE(m_nowpeer);
 
     // avoid dangling refs
     if ( s_macDeactivateWindow == this )
@@ -178,7 +212,7 @@ wxNonOwnedWindow::~wxNonOwnedWindow()
 bool wxNonOwnedWindow::Destroy()
 {
     WillBeDestroyed();
-    
+
     return wxWindow::Destroy();
 }
 
@@ -244,9 +278,9 @@ void wxNonOwnedWindow::SetWindowStyleFlag(long flags)
 {
     if (flags == GetWindowStyleFlag())
         return;
-        
+
     wxWindow::SetWindowStyleFlag(flags);
-    
+
     if (m_nowpeer)
         m_nowpeer->SetWindowStyleFlag(flags);
 }
@@ -433,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__
+    GetPeer()->GetContentArea(left, top, w, h);
+#else
     m_nowpeer->GetContentArea(left, top, w, h);
+#endif
     
     if (width)
        *width = w ;
@@ -463,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() )