send event from Clear() for a simple text control, send only one event from SetValue() instead of 2 for a rich one
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16683 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -207,6 +207,9 @@ protected:
|
|||||||
// position
|
// position
|
||||||
long GetLengthOfLineContainingPos(long pos) const;
|
long GetLengthOfLineContainingPos(long pos) const;
|
||||||
|
|
||||||
|
// send TEXT_UPDATED event, return TRUE if it was handled, FALSE otherwise
|
||||||
|
bool SendUpdateEvent();
|
||||||
|
|
||||||
// override some base class virtuals
|
// override some base class virtuals
|
||||||
virtual bool MSWShouldPreProcessMessage(WXMSG* pMsg);
|
virtual bool MSWShouldPreProcessMessage(WXMSG* pMsg);
|
||||||
virtual wxSize DoGetBestSize() const;
|
virtual wxSize DoGetBestSize() const;
|
||||||
@@ -218,6 +221,10 @@ protected:
|
|||||||
// 0, it also gives the version of the RICHEDIT control being used (1, 2 or
|
// 0, it also gives the version of the RICHEDIT control being used (1, 2 or
|
||||||
// 3 so far)
|
// 3 so far)
|
||||||
int m_verRichEdit;
|
int m_verRichEdit;
|
||||||
|
|
||||||
|
// if TRUE, SendUpdateEvent() will eat the next event (see comments in the
|
||||||
|
// code as to why this is needed)
|
||||||
|
bool m_suppressNextUpdate;
|
||||||
#endif // wxUSE_RICHEDIT
|
#endif // wxUSE_RICHEDIT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@@ -177,7 +177,9 @@ void wxTextCtrl::Init()
|
|||||||
{
|
{
|
||||||
#if wxUSE_RICHEDIT
|
#if wxUSE_RICHEDIT
|
||||||
m_verRichEdit = 0;
|
m_verRichEdit = 0;
|
||||||
#endif
|
|
||||||
|
m_suppressNextUpdate = FALSE;
|
||||||
|
#endif // wxUSE_RICHEDIT
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
|
bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
|
||||||
@@ -300,9 +302,9 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
|
|||||||
#if wxUSE_RICHEDIT
|
#if wxUSE_RICHEDIT
|
||||||
if ( IsRich() )
|
if ( IsRich() )
|
||||||
{
|
{
|
||||||
// enable the events we're interested in: we want to get EN_CHANGE and
|
// enable the events we're interested in: we want to get EN_CHANGE as
|
||||||
// EN_UPDATE as for the normal controls
|
// for the normal controls
|
||||||
LPARAM mask = ENM_CHANGE | ENM_UPDATE;
|
LPARAM mask = ENM_CHANGE;
|
||||||
|
|
||||||
if ( GetRichVersion() == 1 )
|
if ( GetRichVersion() == 1 )
|
||||||
{
|
{
|
||||||
@@ -676,15 +678,18 @@ void wxTextCtrl::DoWriteText(const wxString& value, bool selectionOnly)
|
|||||||
if ( !done )
|
if ( !done )
|
||||||
#endif // wxUSE_RICHEDIT
|
#endif // wxUSE_RICHEDIT
|
||||||
{
|
{
|
||||||
if ( !selectionOnly )
|
#if wxUSE_RICHEDIT
|
||||||
|
// rich edit text control sends us 2 EN_CHANGE events when we send
|
||||||
|
// WM_SETTEXT to it, we have to suppress one of them to make wxTextCtrl
|
||||||
|
// behaviour consistent
|
||||||
|
if ( IsRich() )
|
||||||
{
|
{
|
||||||
//SetSelection(-1, -1);
|
m_suppressNextUpdate = TRUE;
|
||||||
// This eliminates an annoying flashing effect
|
|
||||||
// when replacing all text.
|
|
||||||
Clear();
|
|
||||||
}
|
}
|
||||||
|
#endif // wxUSE_RICHEDIT
|
||||||
|
|
||||||
::SendMessage(GetHwnd(), EM_REPLACESEL, 0, (LPARAM)valueDos.c_str());
|
::SendMessage(GetHwnd(), selectionOnly ? EM_REPLACESEL : WM_SETTEXT,
|
||||||
|
0, (LPARAM)valueDos.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
AdjustSpaceLimit();
|
AdjustSpaceLimit();
|
||||||
@@ -700,6 +705,16 @@ void wxTextCtrl::AppendText(const wxString& text)
|
|||||||
void wxTextCtrl::Clear()
|
void wxTextCtrl::Clear()
|
||||||
{
|
{
|
||||||
::SetWindowText(GetHwnd(), wxT(""));
|
::SetWindowText(GetHwnd(), wxT(""));
|
||||||
|
|
||||||
|
#if wxUSE_RICHEDIT
|
||||||
|
if ( !IsRich() )
|
||||||
|
#endif // wxUSE_RICHEDIT
|
||||||
|
{
|
||||||
|
// rich edit controls send EN_UPDATE from WM_SETTEXT handler themselves
|
||||||
|
// but the normal ones don't -- make Clear() behaviour consistent by
|
||||||
|
// always sending this event
|
||||||
|
SendUpdateEvent();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __WIN32__
|
#ifdef __WIN32__
|
||||||
@@ -1260,6 +1275,24 @@ long wxTextCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
|
|||||||
// text control event processing
|
// text control event processing
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxTextCtrl::SendUpdateEvent()
|
||||||
|
{
|
||||||
|
// is event reporting suspended?
|
||||||
|
if ( m_suppressNextUpdate )
|
||||||
|
{
|
||||||
|
// do process the next one
|
||||||
|
m_suppressNextUpdate = FALSE;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId());
|
||||||
|
InitCommandEvent(event);
|
||||||
|
event.SetString(GetValue());
|
||||||
|
|
||||||
|
return ProcessCommand(event);
|
||||||
|
}
|
||||||
|
|
||||||
bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
|
bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
|
||||||
{
|
{
|
||||||
switch ( param )
|
switch ( param )
|
||||||
@@ -1276,16 +1309,11 @@ bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case EN_CHANGE:
|
case EN_CHANGE:
|
||||||
{
|
SendUpdateEvent();
|
||||||
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
|
|
||||||
InitCommandEvent(event);
|
|
||||||
event.SetString(GetValue());
|
|
||||||
ProcessCommand(event);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EN_MAXTEXT:
|
case EN_MAXTEXT:
|
||||||
// the text size limit has been hit - increase it
|
// the text size limit has been hit -- try to increase it
|
||||||
if ( !AdjustSpaceLimit() )
|
if ( !AdjustSpaceLimit() )
|
||||||
{
|
{
|
||||||
wxCommandEvent event(wxEVT_COMMAND_TEXT_MAXLEN, m_windowId);
|
wxCommandEvent event(wxEVT_COMMAND_TEXT_MAXLEN, m_windowId);
|
||||||
@@ -1295,13 +1323,7 @@ bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// the other notification messages are not processed
|
// the other edit notification messages are not processed
|
||||||
case EN_UPDATE:
|
|
||||||
case EN_ERRSPACE:
|
|
||||||
case EN_HSCROLL:
|
|
||||||
case EN_VSCROLL:
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user