In 3.0 compatibility mode member variable holding pending delete editor objects is emulated by hash map item.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@78092 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -121,6 +121,21 @@
|
|||||||
// adjusted.
|
// adjusted.
|
||||||
#define IN_CELL_EXPANDER_BUTTON_X_ADJUST 2
|
#define IN_CELL_EXPANDER_BUTTON_X_ADJUST 2
|
||||||
|
|
||||||
|
#if WXWIN_COMPATIBILITY_3_0
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
// Hash containing for every active wxPG the list of editors and their event handlers
|
||||||
|
// to be deleted in the idle event handler.
|
||||||
|
// It emulates member variable 'm_deletedEditorObjects' in 3.0 compatibility mode.
|
||||||
|
WX_DECLARE_HASH_MAP(wxPropertyGrid*, wxArrayPGObject*,
|
||||||
|
wxPointerHash, wxPointerEqual,
|
||||||
|
DeletedObjects);
|
||||||
|
|
||||||
|
DeletedObjects gs_deletedEditorObjects;
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
#endif
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
#if wxUSE_INTL
|
#if wxUSE_INTL
|
||||||
@@ -397,6 +412,11 @@ void wxPropertyGrid::Init1()
|
|||||||
m_cvUnspecified = 0;
|
m_cvUnspecified = 0;
|
||||||
|
|
||||||
m_chgInfo_changedProperty = NULL;
|
m_chgInfo_changedProperty = NULL;
|
||||||
|
#if WXWIN_COMPATIBILITY_3_0
|
||||||
|
// Object array for this wxPG shouldn't exist in the hash map.
|
||||||
|
wxASSERT( gs_deletedEditorObjects.find(this) == gs_deletedEditorObjects.end() );
|
||||||
|
gs_deletedEditorObjects[this] = new wxArrayPGObject;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
@@ -544,7 +564,10 @@ wxPropertyGrid::~wxPropertyGrid()
|
|||||||
// We are inside event handler and we cannot delete
|
// We are inside event handler and we cannot delete
|
||||||
// editor objects immediatelly. They have to be deleted
|
// editor objects immediatelly. They have to be deleted
|
||||||
// later on in the global idle handler.
|
// later on in the global idle handler.
|
||||||
#if !WXWIN_COMPATIBILITY_3_0
|
#if WXWIN_COMPATIBILITY_3_0
|
||||||
|
// Emulate member variable.
|
||||||
|
wxArrayPGObject& m_deletedEditorObjects = *gs_deletedEditorObjects[this];
|
||||||
|
#endif
|
||||||
while ( !m_deletedEditorObjects.empty() )
|
while ( !m_deletedEditorObjects.empty() )
|
||||||
{
|
{
|
||||||
wxObject* obj = m_deletedEditorObjects.back();
|
wxObject* obj = m_deletedEditorObjects.back();
|
||||||
@@ -552,7 +575,6 @@ wxPropertyGrid::~wxPropertyGrid()
|
|||||||
|
|
||||||
wxPendingDelete.Append(obj);
|
wxPendingDelete.Append(obj);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -580,6 +602,12 @@ wxPropertyGrid::~wxPropertyGrid()
|
|||||||
wxPGCommonValue* value = m_commonValues[i];
|
wxPGCommonValue* value = m_commonValues[i];
|
||||||
delete value;
|
delete value;
|
||||||
}
|
}
|
||||||
|
#if WXWIN_COMPATIBILITY_3_0
|
||||||
|
wxASSERT( gs_deletedEditorObjects[this]->empty() );
|
||||||
|
|
||||||
|
delete gs_deletedEditorObjects[this];
|
||||||
|
gs_deletedEditorObjects.erase(this);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
@@ -3947,7 +3975,10 @@ void wxPropertyGrid::SetupChildEventHandling( wxWindow* argWnd )
|
|||||||
|
|
||||||
void wxPropertyGrid::DeletePendingObjects()
|
void wxPropertyGrid::DeletePendingObjects()
|
||||||
{
|
{
|
||||||
#if !WXWIN_COMPATIBILITY_3_0
|
#if WXWIN_COMPATIBILITY_3_0
|
||||||
|
// Emulate member variable.
|
||||||
|
wxArrayPGObject& m_deletedEditorObjects = *gs_deletedEditorObjects[this];
|
||||||
|
#endif
|
||||||
// Delete pending property editors and their event handlers.
|
// Delete pending property editors and their event handlers.
|
||||||
while ( !m_deletedEditorObjects.empty() )
|
while ( !m_deletedEditorObjects.empty() )
|
||||||
{
|
{
|
||||||
@@ -3956,7 +3987,6 @@ void wxPropertyGrid::DeletePendingObjects()
|
|||||||
|
|
||||||
delete obj;
|
delete obj;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxPropertyGrid::DestroyEditorWnd( wxWindow* wnd )
|
void wxPropertyGrid::DestroyEditorWnd( wxWindow* wnd )
|
||||||
@@ -3968,10 +3998,10 @@ void wxPropertyGrid::DestroyEditorWnd( wxWindow* wnd )
|
|||||||
|
|
||||||
// Do not free editors immediately (for sake of processing events)
|
// Do not free editors immediately (for sake of processing events)
|
||||||
#if WXWIN_COMPATIBILITY_3_0
|
#if WXWIN_COMPATIBILITY_3_0
|
||||||
wxPendingDelete.Append(wnd);
|
// Emulate member variable.
|
||||||
#else
|
wxArrayPGObject& m_deletedEditorObjects = *gs_deletedEditorObjects[this];
|
||||||
m_deletedEditorObjects.push_back(wnd);
|
|
||||||
#endif
|
#endif
|
||||||
|
m_deletedEditorObjects.push_back(wnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxPropertyGrid::FreeEditors()
|
void wxPropertyGrid::FreeEditors()
|
||||||
@@ -3982,16 +4012,16 @@ void wxPropertyGrid::FreeEditors()
|
|||||||
// instead of moving it to closest parent).
|
// instead of moving it to closest parent).
|
||||||
SetFocusOnCanvas();
|
SetFocusOnCanvas();
|
||||||
|
|
||||||
|
#if WXWIN_COMPATIBILITY_3_0
|
||||||
|
// Emulate member variable.
|
||||||
|
wxArrayPGObject& m_deletedEditorObjects = *gs_deletedEditorObjects[this];
|
||||||
|
#endif
|
||||||
// Do not free editors immediately if processing events
|
// Do not free editors immediately if processing events
|
||||||
if ( m_wndEditor2 )
|
if ( m_wndEditor2 )
|
||||||
{
|
{
|
||||||
wxEvtHandler* handler = m_wndEditor2->PopEventHandler(false);
|
wxEvtHandler* handler = m_wndEditor2->PopEventHandler(false);
|
||||||
m_wndEditor2->Hide();
|
m_wndEditor2->Hide();
|
||||||
#if WXWIN_COMPATIBILITY_3_0
|
|
||||||
wxPendingDelete.Append( handler );
|
|
||||||
#else
|
|
||||||
m_deletedEditorObjects.push_back(handler);
|
m_deletedEditorObjects.push_back(handler);
|
||||||
#endif
|
|
||||||
DestroyEditorWnd(m_wndEditor2);
|
DestroyEditorWnd(m_wndEditor2);
|
||||||
m_wndEditor2 = NULL;
|
m_wndEditor2 = NULL;
|
||||||
}
|
}
|
||||||
@@ -4000,11 +4030,7 @@ void wxPropertyGrid::FreeEditors()
|
|||||||
{
|
{
|
||||||
wxEvtHandler* handler = m_wndEditor->PopEventHandler(false);
|
wxEvtHandler* handler = m_wndEditor->PopEventHandler(false);
|
||||||
m_wndEditor->Hide();
|
m_wndEditor->Hide();
|
||||||
#if WXWIN_COMPATIBILITY_3_0
|
|
||||||
wxPendingDelete.Append( handler );
|
|
||||||
#else
|
|
||||||
m_deletedEditorObjects.push_back(handler);
|
m_deletedEditorObjects.push_back(handler);
|
||||||
#endif
|
|
||||||
DestroyEditorWnd(m_wndEditor);
|
DestroyEditorWnd(m_wndEditor);
|
||||||
m_wndEditor = NULL;
|
m_wndEditor = NULL;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user