]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/nonownedwnd_osx.cpp
Fix bug with using uninitialized flags in GetParentForModalDialog().
[wxWidgets.git] / src / osx / nonownedwnd_osx.cpp
index 674c4d9968633dc3f8878df17a73b025b15cb40c..741b6468776c7d8ef54faa642f7191d8c93a34c8 100644 (file)
@@ -98,6 +98,7 @@ wxNonOwnedWindow *wxNonOwnedWindow::s_macDeactivateWindow = NULL;
 void wxNonOwnedWindow::Init()
 {
     m_nowpeer = NULL;
+    m_isNativeWindowWrapper = false;
 }
 
 bool wxNonOwnedWindow::Create(wxWindow *parent,
@@ -107,9 +108,6 @@ bool wxNonOwnedWindow::Create(wxWindow *parent,
                                  long style,
                                  const wxString& name)
 {
-    // init our fields
-    Init();
-
     m_windowStyle = style;
 
     SetName( name );
@@ -150,47 +148,78 @@ bool wxNonOwnedWindow::Create(wxWindow *parent,
     return true;
 }
 
+bool wxNonOwnedWindow::Create(wxWindow *parent, WXWindow nativeWindow)
+{
+    m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow(this, parent, nativeWindow );
+    m_isNativeWindowWrapper = true;
+    wxAssociateWindowWithWXWindow( m_nowpeer->GetWXWindow() , this ) ;
+    m_peer = wxWidgetImpl::CreateContentView(this);
+
+    if ( parent )
+        parent->AddChild(this);
+    
+    return true;
+}
+
 wxNonOwnedWindow::~wxNonOwnedWindow()
 {
     SendDestroyEvent();
-    
+
     wxRemoveWXWindowAssociation( this ) ;
-    
+
     DestroyChildren();
-    
+
     delete m_nowpeer;
+    m_nowpeer = NULL;
 
     // avoid dangling refs
     if ( s_macDeactivateWindow == this )
         s_macDeactivateWindow = NULL;
 }
 
+bool wxNonOwnedWindow::Destroy()
+{
+    WillBeDestroyed();
+    
+    return wxWindow::Destroy();
+}
+
+void wxNonOwnedWindow::WillBeDestroyed()
+{
+    if ( m_nowpeer )
+        m_nowpeer->WillBeDestroyed();
+}
+
 // ----------------------------------------------------------------------------
 // wxNonOwnedWindow misc
 // ----------------------------------------------------------------------------
 
-bool wxNonOwnedWindow::ShowWithEffect(wxShowEffect effect,
-                                unsigned timeout )
-{ 
-    if ( !wxWindow::Show(true) )
+bool wxNonOwnedWindow::OSXShowWithEffect(bool show,
+                                         wxShowEffect effect,
+                                         unsigned timeout)
+{
+    // Cocoa code needs to manage window visibility on its own and so calls
+    // wxWindow::Show() as needed but if we already changed the internal
+    // visibility flag here, Show() would do nothing, so avoid doing it
+#if wxOSX_USE_CARBON
+    if ( !wxWindow::Show(show) )
         return false;
+#endif // Carbon
 
-    // because apps expect a size event to occur at this moment
-    wxSizeEvent event(GetSize() , m_windowId);
-    event.SetEventObject(this);
-    HandleWindowEvent(event);
-
-
-    return m_nowpeer->ShowWithEffect(true, effect, timeout); 
-}
+    if ( effect == wxSHOW_EFFECT_NONE ||
+            !m_nowpeer || !m_nowpeer->ShowWithEffect(show, effect, timeout) )
+        return Show(show);
 
-bool wxNonOwnedWindow::HideWithEffect(wxShowEffect effect,
-                                unsigned timeout )
-{ 
-    if ( !wxWindow::Show(false) )
-        return false;
+    if ( show )
+    {
+        // as apps expect a size event to occur when the window is shown,
+        // generate one when it is shown with effect too
+        wxSizeEvent event(GetSize(), m_windowId);
+        event.SetEventObject(this);
+        HandleWindowEvent(event);
+    }
 
-    return m_nowpeer->ShowWithEffect(false, effect, timeout); 
+    return true;
 }
 
 wxPoint wxNonOwnedWindow::GetClientAreaOrigin() const
@@ -201,17 +230,28 @@ wxPoint wxNonOwnedWindow::GetClientAreaOrigin() const
 }
 
 bool wxNonOwnedWindow::SetBackgroundColour(const wxColour& c )
-{        
+{
     if ( !wxWindow::SetBackgroundColour(c) && m_hasBgCol )
         return false ;
-    
+
     if ( GetBackgroundStyle() != wxBG_STYLE_CUSTOM )
     {
         if ( m_nowpeer )
             return m_nowpeer->SetBackgroundColour(c);
     }
     return true;
-}    
+}
+
+void wxNonOwnedWindow::SetWindowStyleFlag(long flags)
+{
+    if (flags == GetWindowStyleFlag())
+        return;
+        
+    wxWindow::SetWindowStyleFlag(flags);
+    
+    if (m_nowpeer)
+        m_nowpeer->SetWindowStyleFlag(flags);
+}
 
 // Raise the window to the top of the Z order
 void wxNonOwnedWindow::Raise()
@@ -306,7 +346,7 @@ bool wxNonOwnedWindow::Show(bool show)
 
     if ( m_nowpeer )
         m_nowpeer->Show(show);
-    
+
     if ( show )
     {
         // because apps expect a size event to occur at this moment
@@ -314,7 +354,7 @@ bool wxNonOwnedWindow::Show(bool show)
         event.SetEventObject(this);
         HandleWindowEvent(event);
     }
-    
+
     return true ;
 }
 
@@ -345,7 +385,7 @@ bool wxNonOwnedWindow::SetBackgroundStyle(wxBackgroundStyle style)
 {
     if ( !wxWindow::SetBackgroundStyle(style) )
         return false ;
-        
+
     return m_nowpeer ? m_nowpeer->SetBackgroundStyle(style) : true;
 }
 
@@ -378,9 +418,9 @@ void wxNonOwnedWindow::DoGetSize( int *width, int *height ) const
 {
     if ( m_nowpeer == NULL )
         return;
-        
+
     int w,h;
-    
+
     m_nowpeer->GetSize(w, h);
 
     if (width)
@@ -396,7 +436,7 @@ void wxNonOwnedWindow::DoGetClientSize( int *width, int *height ) const
 
     int left, top, w, h;
     m_nowpeer->GetContentArea(left, top, w, h);
-
+    
     if (width)
        *width = w ;
     if (height)
@@ -422,8 +462,10 @@ WXWindow wxNonOwnedWindow::GetWXWindow() const
 bool wxNonOwnedWindow::DoSetShape(const wxRegion& region)
 {
     wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), false,
-                 _T("Shaped windows must be created with the wxFRAME_SHAPED style."));
+                 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() )