From: Vadim Zeitlin Date: Thu, 20 May 2010 22:04:03 +0000 (+0000) Subject: Fix wxListCtrl::EndEditLabel() which simply didn't work. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/747eb0f686b70131761bfaa43aacfaae26d8f799 Fix wxListCtrl::EndEditLabel() which simply didn't work. Also document it (even though it's wxMSW-only for now) and add a test for it in the sample. Closes #7663. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64368 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/interface/wx/listctrl.h b/interface/wx/listctrl.h index 9a6ddd739b..bfa9b019bc 100644 --- a/interface/wx/listctrl.h +++ b/interface/wx/listctrl.h @@ -247,6 +247,23 @@ public: wxTextCtrl* EditLabel(long item, wxClassInfo* textControlClass = CLASSINFO(wxTextCtrl)); + /** + Finish editing the label. + + This method allows to programmatically end editing a list control item + in place. Usually it will only be called when editing is in progress, + i.e. if GetEditControl() returns non-NULL. + + Currently only implemented in wxMSW. + + @param cancel If @true, discard the changes made by user, as if @c + Escape key was pressed. Otherwise, accept the changes as if @c + Return was pressed. + @return @true if item editing wad finished or @false if no item as + being edited. + */ + bool EndEditLabel(bool cancel); + /** Ensures this item is visible. */ diff --git a/samples/listctrl/listtest.cpp b/samples/listctrl/listtest.cpp index bf2ef2c376..4cf75b2406 100644 --- a/samples/listctrl/listtest.cpp +++ b/samples/listctrl/listtest.cpp @@ -840,16 +840,26 @@ void MyFrame::OnAdd(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnEdit(wxCommandEvent& WXUNUSED(event)) { - long itemCur = m_listCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, - wxLIST_STATE_FOCUSED); - - if ( itemCur != -1 ) + // demonstrate cancelling editing: this currently is wxMSW-only +#ifdef __WXMSW__ + if ( m_listCtrl->GetEditControl() ) { - m_listCtrl->EditLabel(itemCur); + m_listCtrl->EndEditLabel(true); } - else + else // start editing +#endif // __WXMSW__ { - m_logWindow->WriteText(wxT("No item to edit")); + long itemCur = m_listCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, + wxLIST_STATE_FOCUSED); + + if ( itemCur != -1 ) + { + m_listCtrl->EditLabel(itemCur); + } + else + { + m_logWindow->WriteText(wxT("No item to edit")); + } } } diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index f688344557..ec5add16ea 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -1561,14 +1561,10 @@ bool wxListCtrl::EndEditLabel(bool cancel) if ( !hwnd ) return false; - if ( cancel ) - ::SetWindowText(hwnd, wxEmptyString); // dubious but better than nothing - - // we shouldn't destroy the control ourselves according to MSDN, which - // proposes WM_CANCELMODE to do this, but it doesn't seem to work - // - // posting WM_CLOSE to it does seem to work without any side effects - ::PostMessage(hwnd, WM_CLOSE, 0, 0); + // We shouldn't destroy the control ourselves according to MSDN, which + // proposes WM_CANCELMODE to do this, but it doesn't seem to work so + // emulate the corresponding user action instead. + ::SendMessage(hwnd, WM_KEYDOWN, cancel ? VK_ESCAPE : VK_RETURN, 0); return true; }