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:
Vadim Zeitlin
2002-08-22 18:02:16 +00:00
parent 674c474f20
commit 5036ea9074
2 changed files with 55 additions and 26 deletions

View File

@@ -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:

View File

@@ -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;
} }