If the in-place text control was still alive when wxGenericListCtrl was
destroyed, it resulted in asserts from wxWindow dtor about child windows still
being alive, so explicitly destroy it from wxListMainWindow dtor.
As this required a slightly different behaviour from wxListTextCtrlWrapper::
EndEdit(), replace its bool argument with an enum one which can take more than
2 values. Not using bool values when calling it also made the code more clear.
Finally, added a unit test verifying that the in-place control is indeed
destroyed correctly.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65769
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
wxTextCtrl *GetText() const { return m_text; }
wxTextCtrl *GetText() const { return m_text; }
- void EndEdit( bool discardChanges );
+ // Different reasons for calling EndEdit():
+ //
+ // It was called because:
+ enum EndReason
+ {
+ End_Accept, // user has accepted the changes.
+ End_Discard, // user has cancelled editing.
+ End_Destroy // the entire control is being destroyed.
+ };
+
+ void EndEdit(EndReason reason);
protected:
void OnChar( wxKeyEvent &event );
protected:
void OnChar( wxKeyEvent &event );
m_text->PushEventHandler(this);
}
m_text->PushEventHandler(this);
}
-void wxListTextCtrlWrapper::EndEdit(bool discardChanges)
+void wxListTextCtrlWrapper::EndEdit(EndReason reason)
{
m_aboutToFinish = true;
{
m_aboutToFinish = true;
- m_owner->OnRenameCancelled(m_itemEdited);
+ case End_Accept:
+ // Notify the owner about the changes
+ AcceptChanges();
- Finish( true );
- }
- else
- {
- // Notify the owner about the changes
- AcceptChanges();
+ // Even if vetoed, close the control (consistent with MSW)
+ Finish( true );
+ break;
+
+ case End_Discard:
+ m_owner->OnRenameCancelled(m_itemEdited);
- // Even if vetoed, close the control (consistent with MSW)
- Finish( true );
+ Finish( true );
+ break;
+
+ case End_Destroy:
+ // Don't generate any notifications for the control being destroyed
+ // and don't set focus to it neither.
+ Finish(false);
+ break;
switch ( event.m_keyCode )
{
case WXK_RETURN:
switch ( event.m_keyCode )
{
case WXK_RETURN:
+ EndEdit( End_Discard );
wxListMainWindow::~wxListMainWindow()
{
wxListMainWindow::~wxListMainWindow()
{
+ if ( m_textctrlWrapper )
+ m_textctrlWrapper->EndEdit(wxListTextCtrlWrapper::End_Destroy);
+
DoDeleteAllItems();
WX_CLEAR_LIST(wxListHeaderDataList, m_columns);
WX_CLEAR_ARRAY(m_aColWidths);
DoDeleteAllItems();
WX_CLEAR_LIST(wxListHeaderDataList, m_columns);
WX_CLEAR_ARRAY(m_aColWidths);
// listctrl because the order of events is different (or something like
// that), so explicitly end the edit if it is active.
if ( event.LeftDown() && m_textctrlWrapper )
// listctrl because the order of events is different (or something like
// that), so explicitly end the edit if it is active.
if ( event.LeftDown() && m_textctrlWrapper )
- m_textctrlWrapper->EndEdit( false );
+ m_textctrlWrapper->EndEdit(wxListTextCtrlWrapper::End_Accept);
#endif // __WXMAC__
if ( event.LeftDown() )
#endif // __WXMAC__
if ( event.LeftDown() )
private:
CPPUNIT_TEST_SUITE( ListCtrlTestCase );
wxLIST_BASE_TESTS();
private:
CPPUNIT_TEST_SUITE( ListCtrlTestCase );
wxLIST_BASE_TESTS();
+ CPPUNIT_TEST( EditLabel );
WXUISIM_TEST( ColumnClick );
WXUISIM_TEST( ColumnDrag );
CPPUNIT_TEST_SUITE_END();
WXUISIM_TEST( ColumnClick );
WXUISIM_TEST( ColumnDrag );
CPPUNIT_TEST_SUITE_END();
#if wxUSE_UIACTIONSIMULATOR
// Column events are only supported in wxListCtrl currently so we test them
// here rather than in ListBaseTest
#if wxUSE_UIACTIONSIMULATOR
// Column events are only supported in wxListCtrl currently so we test them
// here rather than in ListBaseTest
+void ListCtrlTestCase::EditLabel()
+{
+ m_list->InsertColumn(0, "Column 0");
+ m_list->InsertItem(0, "foo");
+ m_list->EditLabel(0);
+}
+
#if wxUSE_UIACTIONSIMULATOR
void ListCtrlTestCase::ColumnDrag()
{
#if wxUSE_UIACTIONSIMULATOR
void ListCtrlTestCase::ColumnDrag()
{