]> git.saurik.com Git - wxWidgets.git/commitdiff
Reverted wxAuiFloatingFrame dtor crash fix (r51324) in favor of wxWeakRef implementat...
authorBryan Petty <bryan@ibaku.net>
Wed, 23 Jan 2008 07:53:03 +0000 (07:53 +0000)
committerBryan Petty <bryan@ibaku.net>
Wed, 23 Jan 2008 07:53:03 +0000 (07:53 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51340 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/aui/floatpane.h
include/wx/aui/framemanager.h
src/aui/floatpane.cpp
src/aui/framemanager.cpp

index 8c7360567624037bfb40c80ea196da28a88a4551..9bbf28c47607f029b4f3b69b3a13bd128d88c76f 100644 (file)
@@ -21,6 +21,7 @@
 #if wxUSE_AUI
 
 #include "wx/frame.h"
+#include "wx/weakref.h"
 
 #if defined( __WXMSW__ ) || defined( __WXMAC__ ) ||  defined( __WXGTK__ )
 #include "wx/minifram.h"
@@ -31,8 +32,6 @@
 
 class WXDLLIMPEXP_AUI wxAuiFloatingFrame : public wxAuiFloatingFrameBaseClass
 {
-    friend class wxAuiManager;
-
 public:
     wxAuiFloatingFrame(wxWindow* parent,
                    wxAuiManager* owner_mgr,
@@ -47,7 +46,6 @@ public:
     wxAuiManager* GetOwnerManager() const;
     
 protected:
-    void SetOwnerManager(wxAuiManager* owner_mgr);
     virtual void OnMoveStart();
     virtual void OnMoving(const wxRect& window_rect, wxDirection dir);
     virtual void OnMoveFinished();
@@ -70,7 +68,7 @@ private:
     wxSize m_last_size;
     wxDirection m_lastDirection;
 
-    wxAuiManager* m_owner_mgr;
+    wxWeakRef<wxAuiManager> m_owner_mgr;
     wxAuiManager m_mgr;
 
 #ifndef SWIG
index 4043147af00fa06c360aa86a7254168ab57ee4d4..a7abb6974f1234ac4f11ebc1c89dac3c0c58fe73 100644 (file)
@@ -121,7 +121,6 @@ enum wxAuiPaneInsertLevel
 
 
 // forwards and array declarations
-class WXDLLIMPEXP_FWD_AUI wxAuiFloatingFrame;
 class wxAuiDockUIPart;
 class wxAuiPaneButton;
 class wxAuiPaneInfo;
@@ -134,7 +133,6 @@ WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiDockInfo, wxAuiDockInfoArray, WXDLLIMPEXP
 WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiDockUIPart, wxAuiDockUIPartArray, WXDLLIMPEXP_AUI);
 WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiPaneButton, wxAuiPaneButtonArray, WXDLLIMPEXP_AUI);
 WX_DECLARE_USER_EXPORTED_OBJARRAY(wxAuiPaneInfo, wxAuiPaneInfoArray, WXDLLIMPEXP_AUI);
-WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxAuiFloatingFrame*, wxAuiFloatingFramePtrArray, class WXDLLIMPEXP_AUI);
 WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxAuiPaneInfo*, wxAuiPaneInfoPtrArray, class WXDLLIMPEXP_AUI);
 WX_DEFINE_USER_EXPORTED_ARRAY_PTR(wxAuiDockInfo*, wxAuiDockInfoPtrArray, class WXDLLIMPEXP_AUI);
 #endif // SWIG
@@ -421,6 +419,8 @@ public:
 
 
 
+class WXDLLIMPEXP_FWD_AUI wxAuiFloatingFrame;
+
 class WXDLLIMPEXP_AUI wxAuiManager : public wxEvtHandler
 {
     friend class wxAuiFloatingFrame;
@@ -511,12 +511,6 @@ public:
 
 protected:
 
-    // Sometimes floating frames are deleted after wxAuiManager, so we need
-    // to clear m_owner_mgr in the floating frame to avoid a crash. To do so,
-    // we register frames with wxAuiManager so it can keep track.
-    void RegisterFloatingFrame(wxAuiFloatingFrame* frame);
-    void UnregisterFloatingFrame(wxAuiFloatingFrame* frame);
-
     void UpdateHintWindowConfig();
 
     void DoFrameLayout();
@@ -607,7 +601,6 @@ protected:
     wxAuiPaneInfoArray m_panes;     // array of panes structures
     wxAuiDockInfoArray m_docks;     // array of docks structures
     wxAuiDockUIPartArray m_uiparts; // array of UI parts (captions, buttons, etc)
-    wxAuiFloatingFramePtrArray m_floating_frames; // array of floating frames
 
     int m_action;                // current mouse action
     wxPoint m_action_start;      // position where the action click started
index ab81810d615cad41a22cc9dae25d1edadefbdcb5..f98693a9d10399142f3729069af9d60b24a39916 100644 (file)
@@ -73,11 +73,9 @@ wxAuiFloatingFrame::wxAuiFloatingFrame(wxWindow* parent,
 wxAuiFloatingFrame::~wxAuiFloatingFrame()
 {
     // if we do not do this, then we can crash...
-    if(m_owner_mgr)
+    if (m_owner_mgr && m_owner_mgr->m_action_window == this)
     {
-        if(m_owner_mgr->m_action_window == this)
-            m_owner_mgr->m_action_window = NULL;
-        m_owner_mgr->UnregisterFloatingFrame(this);
+        m_owner_mgr->m_action_window = NULL;
     }
 
     m_mgr.UnInit();
@@ -153,11 +151,6 @@ wxAuiManager* wxAuiFloatingFrame::GetOwnerManager() const
     return m_owner_mgr;
 }
 
-void wxAuiFloatingFrame::SetOwnerManager(wxAuiManager* owner_mgr)
-{
-    // we want to allow for NULL here to avoid crashing in dtor
-    m_owner_mgr = owner_mgr;
-}
 
 void wxAuiFloatingFrame::OnSize(wxSizeEvent& event)
 {
index 4c856f2c52b6c2c4a2ae8dc2a4dc1135e07d7b1a..c94279ccd65962b8d605d784e8b725e955965044 100644 (file)
@@ -610,17 +610,6 @@ wxAuiManager::~wxAuiManager()
     }
 #endif
 
-    // We need to remove any reference to this wxAuiManager in any of the
-    // wxAuiFloatingFrames associated with this manager in case they haven't
-    // been deleted just yet.
-    // We need an array copy since Unregister removes the items.
-    wxAuiFloatingFramePtrArray array_copy = m_floating_frames;
-    int i, count = array_copy.GetCount();
-    for (i = 0; i < count; ++i)
-    {
-        UnregisterFloatingFrame(array_copy.Item(i));
-    }
-
     delete m_art;
 }
 
@@ -628,9 +617,7 @@ wxAuiManager::~wxAuiManager()
 wxAuiFloatingFrame* wxAuiManager::CreateFloatingFrame(wxWindow* parent,
                                                       const wxAuiPaneInfo& pane_info)
 {
-    wxAuiFloatingFrame* frame = new wxAuiFloatingFrame(parent, this, pane_info);
-    RegisterFloatingFrame(frame);
-    return frame;
+    return new wxAuiFloatingFrame(parent, this, pane_info);
 }
 
 bool wxAuiManager::CanDockPanel(const wxAuiPaneInfo & WXUNUSED(p))
@@ -640,37 +627,6 @@ bool wxAuiManager::CanDockPanel(const wxAuiPaneInfo & WXUNUSED(p))
     return !(wxGetKeyState(WXK_CONTROL) || wxGetKeyState(WXK_ALT));
 }
 
-// registers a floating frame with this manager (see header)
-void wxAuiManager::RegisterFloatingFrame(wxAuiFloatingFrame* frame)
-{
-    frame->SetOwnerManager(this);
-    int i, count = m_floating_frames.GetCount();
-    for (i = 0; i < count; ++i)
-    {
-        wxAuiFloatingFrame* f = m_floating_frames.Item(i);
-        if (f == frame)
-            // this frame is already registered
-            return;
-    }
-    m_floating_frames.Add(frame);
-}
-
-// unregisters a floating frame from this manager (see header)
-void wxAuiManager::UnregisterFloatingFrame(wxAuiFloatingFrame* frame)
-{
-    frame->SetOwnerManager(NULL);
-    int i, count = m_floating_frames.GetCount();
-    for (i = 0; i < count; ++i)
-    {
-        wxAuiFloatingFrame* f = m_floating_frames.Item(i);
-        if (f == frame)
-        {
-            m_floating_frames.Remove(f);
-            return;
-        }
-    }
-}
-
 // GetPane() looks up a wxAuiPaneInfo structure based
 // on the supplied window pointer.  Upon failure, GetPane()
 // returns an empty wxAuiPaneInfo, a condition which can be checked