]> git.saurik.com Git - wxWidgets.git/commitdiff
Reapply wxWeakRef patch again
authorRobert Roebling <robert@roebling.de>
Tue, 27 May 2008 09:17:56 +0000 (09:17 +0000)
committerRobert Roebling <robert@roebling.de>
Tue, 27 May 2008 09:17:56 +0000 (09:17 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53774 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

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

index 6e98d624b9510aeb589e1c1370e2cd36a382aafd..8d95b8cfe3f76defbaa7c49c7d6a2080ae5d834f 100644 (file)
@@ -17,6 +17,7 @@
 // ----------------------------------------------------------------------------
 
 #include "wx/defs.h"
+#include "wx/weakref.h"
 
 #if wxUSE_AUI
 
@@ -30,8 +31,6 @@
 
 class WXDLLIMPEXP_AUI wxAuiFloatingFrame : public wxAuiFloatingFrameBaseClass
 {
-    friend class wxAuiManager;
-
 public:
     wxAuiFloatingFrame(wxWindow* parent,
                    wxAuiManager* owner_mgr,
@@ -46,7 +45,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();
@@ -69,7 +67,7 @@ private:
     wxSize m_last_size;
     wxDirection m_lastDirection;
 
-    wxAuiManager* m_owner_mgr;
+    wxWeakRef<wxAuiManager> m_owner_mgr;
     wxAuiManager m_mgr;
 
 #ifndef SWIG
index 11f3b2508ff10524e3849bcf17437514dc6e2531..8b80a6d0bcb3d839a471cac9e4b7b17517bbe5eb 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 9ceabbf8dcbfaa72a1e31ce56bfb108ea38d814e..e960113c3ea6c53128ced040c1a0355c988056d2 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