make sure that IsModified() returns false when it's called from EVT_TEXT handler invoked because of SetValue() call
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39172 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -157,11 +157,19 @@ public:
|
|||||||
virtual void OnParentEnable( bool enable ) ;
|
virtual void OnParentEnable( bool enable ) ;
|
||||||
|
|
||||||
// tell the control to ignore next text changed signal
|
// tell the control to ignore next text changed signal
|
||||||
void IgnoreNextTextUpdate();
|
void IgnoreNextTextUpdate() { m_ignoreNextUpdate = true; }
|
||||||
|
|
||||||
// should we ignore the changed signal? always resets the flag
|
// should we ignore the changed signal? always resets the flag
|
||||||
bool IgnoreTextUpdate();
|
bool IgnoreTextUpdate();
|
||||||
|
|
||||||
|
// call this to indicate that the control is about to be changed
|
||||||
|
// programmatically and so m_modified flag shouldn't be set
|
||||||
|
void DontMarkDirtyOnNextChange() { m_dontMarkDirty = true; }
|
||||||
|
|
||||||
|
// should we mark the control as dirty? always resets the flag
|
||||||
|
bool MarkDirtyOnChange();
|
||||||
|
|
||||||
|
|
||||||
static wxVisualAttributes
|
static wxVisualAttributes
|
||||||
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
|
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
|
||||||
|
|
||||||
@@ -187,6 +195,7 @@ private:
|
|||||||
|
|
||||||
bool m_modified:1;
|
bool m_modified:1;
|
||||||
bool m_ignoreNextUpdate:1;
|
bool m_ignoreNextUpdate:1;
|
||||||
|
bool m_dontMarkDirty:1;
|
||||||
|
|
||||||
// Our text buffer. Convenient, and holds the buffer while using
|
// Our text buffer. Convenient, and holds the buffer while using
|
||||||
// a dummy one when m_frozenness > 0
|
// a dummy one when m_frozenness > 0
|
||||||
|
@@ -454,6 +454,7 @@ gtk_text_changed_callback( GtkWidget *widget, wxTextCtrl *win )
|
|||||||
if (g_isIdle)
|
if (g_isIdle)
|
||||||
wxapp_install_idle_handler();
|
wxapp_install_idle_handler();
|
||||||
|
|
||||||
|
if ( win->MarkDirtyOnChange() )
|
||||||
win->MarkDirty();
|
win->MarkDirty();
|
||||||
|
|
||||||
wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() );
|
wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() );
|
||||||
@@ -551,9 +552,12 @@ END_EVENT_TABLE()
|
|||||||
|
|
||||||
void wxTextCtrl::Init()
|
void wxTextCtrl::Init()
|
||||||
{
|
{
|
||||||
|
m_dontMarkDirty =
|
||||||
m_ignoreNextUpdate =
|
m_ignoreNextUpdate =
|
||||||
m_modified = false;
|
m_modified = false;
|
||||||
|
|
||||||
SetUpdateFont(false);
|
SetUpdateFont(false);
|
||||||
|
|
||||||
m_text = NULL;
|
m_text = NULL;
|
||||||
m_frozenness = 0;
|
m_frozenness = 0;
|
||||||
m_gdkHandCursor = NULL;
|
m_gdkHandCursor = NULL;
|
||||||
@@ -812,6 +816,13 @@ void wxTextCtrl::SetValue( const wxString &value )
|
|||||||
{
|
{
|
||||||
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
|
wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
|
||||||
|
|
||||||
|
// the control won't be modified any more as we programmatically replace
|
||||||
|
// all the existing text, so reset the flag and don't set it again (and do
|
||||||
|
// it now, before the text event handler is ran so that IsModified() called
|
||||||
|
// from there returns the expected value)
|
||||||
|
m_modified = false;
|
||||||
|
DontMarkDirtyOnNextChange();
|
||||||
|
|
||||||
if (m_windowStyle & wxTE_MULTILINE)
|
if (m_windowStyle & wxTE_MULTILINE)
|
||||||
{
|
{
|
||||||
const wxCharBuffer buffer(wxGTK_CONV(value));
|
const wxCharBuffer buffer(wxGTK_CONV(value));
|
||||||
@@ -840,8 +851,6 @@ void wxTextCtrl::SetValue( const wxString &value )
|
|||||||
// the lists. wxWidgets 2.2 will have a set of flags to
|
// the lists. wxWidgets 2.2 will have a set of flags to
|
||||||
// customize this behaviour.
|
// customize this behaviour.
|
||||||
SetInsertionPoint(0);
|
SetInsertionPoint(0);
|
||||||
|
|
||||||
m_modified = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxTextCtrl::WriteText( const wxString &text )
|
void wxTextCtrl::WriteText( const wxString &text )
|
||||||
@@ -858,10 +867,8 @@ void wxTextCtrl::WriteText( const wxString &text )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// gtk_text_changed_callback() will set m_modified to true but m_modified
|
// we're changing the text programmatically
|
||||||
// shouldn't be changed by the program writing to the text control itself,
|
DontMarkDirtyOnNextChange();
|
||||||
// so save the old value and restore when we're done
|
|
||||||
bool oldModified = m_modified;
|
|
||||||
|
|
||||||
if ( m_windowStyle & wxTE_MULTILINE )
|
if ( m_windowStyle & wxTE_MULTILINE )
|
||||||
{
|
{
|
||||||
@@ -896,8 +903,6 @@ void wxTextCtrl::WriteText( const wxString &text )
|
|||||||
// Bring entry's cursor uptodate.
|
// Bring entry's cursor uptodate.
|
||||||
gtk_editable_set_position( GTK_EDITABLE(m_text), len );
|
gtk_editable_set_position( GTK_EDITABLE(m_text), len );
|
||||||
}
|
}
|
||||||
|
|
||||||
m_modified = oldModified;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxTextCtrl::AppendText( const wxString &text )
|
void wxTextCtrl::AppendText( const wxString &text )
|
||||||
@@ -1139,11 +1144,6 @@ void wxTextCtrl::DiscardEdits()
|
|||||||
// max text length support
|
// max text length support
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void wxTextCtrl::IgnoreNextTextUpdate()
|
|
||||||
{
|
|
||||||
m_ignoreNextUpdate = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wxTextCtrl::IgnoreTextUpdate()
|
bool wxTextCtrl::IgnoreTextUpdate()
|
||||||
{
|
{
|
||||||
if ( m_ignoreNextUpdate )
|
if ( m_ignoreNextUpdate )
|
||||||
@@ -1156,6 +1156,18 @@ bool wxTextCtrl::IgnoreTextUpdate()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxTextCtrl::MarkDirtyOnChange()
|
||||||
|
{
|
||||||
|
if ( m_dontMarkDirty )
|
||||||
|
{
|
||||||
|
m_dontMarkDirty = false;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void wxTextCtrl::SetMaxLength(unsigned long len)
|
void wxTextCtrl::SetMaxLength(unsigned long len)
|
||||||
{
|
{
|
||||||
if ( !HasFlag(wxTE_MULTILINE) )
|
if ( !HasFlag(wxTE_MULTILINE) )
|
||||||
|
Reference in New Issue
Block a user