]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxTextCtrl::ChangeValue() which is the same as SetValue() but doesn't send...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 8 Oct 2006 17:46:12 +0000 (17:46 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 8 Oct 2006 17:46:12 +0000 (17:46 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41739 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

24 files changed:
docs/latex/wx/text.tex
include/wx/cocoa/textctrl.h
include/wx/gtk/textctrl.h
include/wx/gtk1/textctrl.h
include/wx/mac/carbon/textctrl.h
include/wx/motif/textctrl.h
include/wx/msw/textctrl.h
include/wx/msw/wince/textctrlce.h
include/wx/os2/textctrl.h
include/wx/palmos/textctrl.h
include/wx/textctrl.h
include/wx/univ/textctrl.h
include/wx/x11/textctrl.h
samples/text/text.cpp
src/gtk/textctrl.cpp
src/gtk1/textctrl.cpp
src/mac/carbon/textctrl.cpp
src/motif/textctrl.cpp
src/msw/textctrl.cpp
src/msw/wince/textctrlce.cpp
src/os2/textctrl.cpp
src/palmos/textctrl.cpp
src/univ/textctrl.cpp
src/x11/textctrl.cpp

index 8b3f029567f08b2fa25dfaafc857627abe1bfd2b..4dc8df61a54d1a409c7ff816fc77f1f61d1d1cb9 100644 (file)
@@ -218,9 +218,10 @@ functions that take a \helpref{wxCommandEvent}{wxcommandevent} argument.
 \twocolwidtha{7cm}%
 \begin{twocollist}\itemsep=0pt
 \twocolitem{{\bf EVT\_TEXT(id, func)}}{Respond to a wxEVT\_COMMAND\_TEXT\_UPDATED event,
 \twocolwidtha{7cm}%
 \begin{twocollist}\itemsep=0pt
 \twocolitem{{\bf EVT\_TEXT(id, func)}}{Respond to a wxEVT\_COMMAND\_TEXT\_UPDATED event,
-generated when the text changes. Notice that this event will always be sent
+generated when the text changes. Notice that this event will be sent
 when the text controls contents changes - whether this is due to user input or
 when the text controls contents changes - whether this is due to user input or
-comes from the program itself (for example, if SetValue() is called)}
+comes from the program itself (for example, if SetValue() is called); see ChangeValue() for
+a function which does not send this event.}
 \twocolitem{{\bf EVT\_TEXT\_ENTER(id, func)}}{Respond to a wxEVT\_COMMAND\_TEXT\_ENTER event,
 generated when enter is pressed in a text control (which must have
 wxTE\_PROCESS\_ENTER style for this event to be generated).}
 \twocolitem{{\bf EVT\_TEXT\_ENTER(id, func)}}{Respond to a wxEVT\_COMMAND\_TEXT\_ENTER event,
 generated when enter is pressed in a text control (which must have
 wxTE\_PROCESS\_ENTER style for this event to be generated).}
@@ -973,6 +974,27 @@ after the call to SetValue).
 Note that this function will generate a {\tt wxEVT\_COMMAND\_TEXT\_UPDATED}
 event.
 
 Note that this function will generate a {\tt wxEVT\_COMMAND\_TEXT\_UPDATED}
 event.
 
+This function is deprecated and should not be used in new code. Please use the
+\helpref{ChangeValue}{wxtextctrlchangevalue} function instead.
+
+\wxheading{Parameters}
+
+\docparam{value}{The new value to set. It may contain newline characters if the text control is multi-line.}
+
+
+\membersection{wxTextCtrl::ChangeValue}\label{wxtextctrlchangevalue}
+
+\func{virtual void}{ChangeValue}{\param{const wxString\& }{ value}}
+
+Sets the text value and marks the control as not-modified (which means that
+\helpref{IsModified}{wxtextctrlismodified} would return {\tt false} immediately
+after the call to SetValue).
+
+Note that this function will \emph{not} generate the {\tt wxEVT\_COMMAND\_TEXT\_UPDATED} 
+event.
+This is the only difference with \helpref{SetValue}{wxtextctrlsetvalue}.
+See \helpref{this topic}{progevent} for more info.
+
 \wxheading{Parameters}
 
 \docparam{value}{The new value to set. It may contain newline characters if the text control is multi-line.}
 \wxheading{Parameters}
 
 \docparam{value}{The new value to set. It may contain newline characters if the text control is multi-line.}
index 3746fc6a672755ee066805d24a35d7351cb012a5..f6ea42dd6e2bb02dbd9fed91e839e756bfaed52a 100644 (file)
@@ -57,6 +57,8 @@ public:
     virtual wxString GetValue() const;
     virtual void SetValue(const wxString& value);
 
     virtual wxString GetValue() const;
     virtual void SetValue(const wxString& value);
 
+    virtual void ChangeValue(const wxString &value);
+
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
     virtual int GetNumberOfLines() const;
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
     virtual int GetNumberOfLines() const;
index 17c7006d41aa442c8d402a93d46cf3a9ee6d064e..8cde769c6b4a49b6c6abbf803c0f2cd25bd43467 100644 (file)
@@ -43,7 +43,9 @@ public:
     // ----------------------------------
 
     virtual wxString GetValue() const;
     // ----------------------------------
 
     virtual wxString GetValue() const;
-    virtual void SetValue(const wxString& value);
+    virtual void SetValue(const wxString& value) { DoSetValue(value, SetValue_SendEvent); }
+
+    virtual void ChangeValue(const wxString &value) { DoSetValue(value); }
 
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
 
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
@@ -155,7 +157,7 @@ public:
     virtual void OnParentEnable( bool enable ) ;
 
     // tell the control to ignore next text changed signal
     virtual void OnParentEnable( bool enable ) ;
 
     // tell the control to ignore next text changed signal
-    void IgnoreNextTextUpdate() { m_ignoreNextUpdate = true; }
+    void IgnoreNextTextUpdate(int n = 1) { m_countUpdatesToIgnore = n; }
 
     // should we ignore the changed signal? always resets the flag
     bool IgnoreTextUpdate();
 
     // should we ignore the changed signal? always resets the flag
     bool IgnoreTextUpdate();
@@ -189,6 +191,8 @@ protected:
     // has the control been frozen by Freeze()?
     bool IsFrozen() const { return m_frozenness > 0; }
 
     // has the control been frozen by Freeze()?
     bool IsFrozen() const { return m_frozenness > 0; }
 
+    void DoSetValue(const wxString &value, int flags = 0);
+
 private:
     // change the font for everything in this control
     void ChangeFontGlobally();
 private:
     // change the font for everything in this control
     void ChangeFontGlobally();
@@ -203,9 +207,10 @@ private:
     GtkWidget  *m_text;
 
     bool        m_modified:1;
     GtkWidget  *m_text;
 
     bool        m_modified:1;
-    bool        m_ignoreNextUpdate:1;
     bool        m_dontMarkDirty:1;
 
     bool        m_dontMarkDirty:1;
 
+    int         m_countUpdatesToIgnore;
+
     // Our text buffer. Convenient, and holds the buffer while using
     // a dummy one when m_frozenness > 0
     GtkTextBuffer *m_buffer;
     // Our text buffer. Convenient, and holds the buffer while using
     // a dummy one when m_frozenness > 0
     GtkTextBuffer *m_buffer;
index c34e71de273352a28c36ccd68e815bc09bd73650..8c8f3dec0702e211e31ca62b1bbfbbd4ae4f1d39 100644 (file)
@@ -43,7 +43,9 @@ public:
     // ----------------------------------
 
     virtual wxString GetValue() const;
     // ----------------------------------
 
     virtual wxString GetValue() const;
-    virtual void SetValue(const wxString& value);
+    virtual void SetValue(const wxString& value) { DoSetValue(value, SetValue_SendEvent); }
+
+    virtual void ChangeValue(const wxString &value) { DoSetValue(value); }
 
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
 
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
@@ -182,6 +184,8 @@ protected:
     // override this and return true.
     virtual bool UseGTKStyleBase() const { return true; }
 
     // override this and return true.
     virtual bool UseGTKStyleBase() const { return true; }
 
+    void DoSetValue(const wxString &value, int flags = 0);
+
 private:
     // change the font for everything in this control
     void ChangeFontGlobally();
 private:
     // change the font for everything in this control
     void ChangeFontGlobally();
index db4dbe798543e414cb11189e55cc77c6414b1c67..f77e41423a1ddfc0f269c42626e89f32bf6333d1 100644 (file)
@@ -63,6 +63,8 @@ public:
     virtual wxString GetValue() const;
     virtual void SetValue(const wxString& value);
 
     virtual wxString GetValue() const;
     virtual void SetValue(const wxString& value);
 
+    virtual void ChangeValue(const wxString &value);
+
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
     virtual int GetNumberOfLines() const;
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
     virtual int GetNumberOfLines() const;
index ed4f480c0573b37e08b8174fe7cbb170e903439c..3fdfa7ee3164019db5fbf2cc55cd39b9d24fe19b 100644 (file)
@@ -43,7 +43,10 @@ public:
     // accessors
     // ---------
     virtual wxString GetValue() const;
     // accessors
     // ---------
     virtual wxString GetValue() const;
-    virtual void SetValue(const wxString& value);
+    virtual void SetValue(const wxString& value)
+        { ChangeValue(value); SendTextUpdatedEvent(); }
+
+    virtual void ChangeValue(const wxString &value);
 
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
 
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
index 2988ed08df6c5e5a5c3606593e119c443a4275ce..dee8fd0bbe4b24ad4f55e24136a08cc78289abc4 100644 (file)
@@ -45,7 +45,8 @@ public:
     // ----------------------------------
 
     virtual wxString GetValue() const;
     // ----------------------------------
 
     virtual wxString GetValue() const;
-    virtual void SetValue(const wxString& value);
+    virtual void SetValue(const wxString& value) { DoSetValue(value, SetValue_SendEvent); }
+    virtual void ChangeValue(const wxString &value) { DoSetValue(value); }
 
     virtual wxString GetRange(long from, long to) const;
 
 
     virtual wxString GetRange(long from, long to) const;
 
@@ -207,6 +208,8 @@ protected:
     // common part of all ctors
     void Init();
 
     // common part of all ctors
     void Init();
 
+    void DoSetValue(const wxString &value, int flags = 0);
+
     // return true if this control has a user-set limit on amount of text (i.e.
     // the limit is due to a previous call to SetMaxLength() and not built in)
     bool HasSpaceLimit(unsigned int *len) const;
     // return true if this control has a user-set limit on amount of text (i.e.
     // the limit is due to a previous call to SetMaxLength() and not built in)
     bool HasSpaceLimit(unsigned int *len) const;
@@ -229,7 +232,7 @@ protected:
 
     // replace the contents of the selection or of the entire control with the
     // given text
 
     // replace the contents of the selection or of the entire control with the
     // given text
-    void DoWriteText(const wxString& text, bool selectionOnly = true);
+    void DoWriteText(const wxString& text, int flags = SetValue_SelectionOnly);
 
     // set the selection possibly without scrolling the caret into view
     void DoSetSelection(long from, long to, bool scrollCaret = true);
 
     // set the selection possibly without scrolling the caret into view
     void DoSetSelection(long from, long to, bool scrollCaret = true);
index 0ed278f7cd3d2b4b438ed76c20e31b7100c7eea8..259a3daadb0606838a9a0e12b51063e093176661 100644 (file)
@@ -50,7 +50,9 @@ public:
     // ----------------------------------
 
     virtual wxString GetValue() const;
     // ----------------------------------
 
     virtual wxString GetValue() const;
-    virtual void SetValue(const wxString& value);
+    virtual void SetValue(const wxString& value) { DoSetValue(value, SetValue_SendEvent); }
+
+    virtual void ChangeValue(const wxString &value) { DoSetValue(value); }
 
     virtual wxString GetRange(long from, long to) const;
 
 
     virtual wxString GetRange(long from, long to) const;
 
@@ -185,9 +187,11 @@ protected:
     // false if we hit the limit set by SetMaxLength() and so didn't change it
     bool AdjustSpaceLimit();
 
     // false if we hit the limit set by SetMaxLength() and so didn't change it
     bool AdjustSpaceLimit();
 
+    void DoSetValue(const wxString &value, int flags = 0);
+
     // replace the contents of the selection or of the entire control with the
     // given text
     // replace the contents of the selection or of the entire control with the
     // given text
-    void DoWriteText(const wxString& text, bool selectionOnly = true);
+    void DoWriteText(const wxString& text, int flags = SetValue_SelectionOnly);
 
     // set the selection possibly without scrolling the caret into view
     void DoSetSelection(long from, long to, bool scrollCaret = true);
 
     // set the selection possibly without scrolling the caret into view
     void DoSetSelection(long from, long to, bool scrollCaret = true);
index 81085c80a3d77daae641020cedb98cef15f4d4c6..e6197dd8fd74afe182829cdb0c3f2e80334d9544 100644 (file)
@@ -47,7 +47,9 @@ public:
     // ----------------------------------
     //
     virtual      wxString GetValue(void) const;
     // ----------------------------------
     //
     virtual      wxString GetValue(void) const;
-    virtual void SetValue(const wxString& rsValue);
+    virtual void SetValue(const wxString& value) { DoSetValue(value, SetValue_SendEvent); }
+
+    virtual void ChangeValue(const wxString &value) { DoSetValue(value); }
 
     virtual int      GetLineLength(long nLineNo) const;
     virtual wxString GetLineText(long nLineNo) const;
 
     virtual int      GetLineLength(long nLineNo) const;
     virtual wxString GetLineText(long nLineNo) const;
@@ -180,6 +182,11 @@ protected:
     virtual WXDWORD OS2GetStyle( long     lStyle
                                 ,WXDWORD* dwExstyle
                                ) const;
     virtual WXDWORD OS2GetStyle( long     lStyle
                                 ,WXDWORD* dwExstyle
                                ) const;
+
+    void DoSetValue(const wxString &value, int flags = 0);
+
+    bool m_bSkipUpdate;
+
 private:
     bool                            m_bIsMLE;
     DECLARE_EVENT_TABLE()
 private:
     bool                            m_bIsMLE;
     DECLARE_EVENT_TABLE()
index 6b1bb1ba54160045b15fc09f5573ef07fc2998dc..bfb5c9b663bfae7dbc85f7616b3214274254cd89 100644 (file)
@@ -47,6 +47,8 @@ public:
     virtual wxString GetValue() const;
     virtual void SetValue(const wxString& value);
 
     virtual wxString GetValue() const;
     virtual void SetValue(const wxString& value);
 
+    virtual void ChangeValue(const wxString &value);
+
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
     virtual int GetNumberOfLines() const;
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
     virtual int GetNumberOfLines() const;
index 204c28b7dfc7479be579d6252b0f17e9a7ddc64f..172301b6adeadfbe66a3159e54143977421588c3 100644 (file)
@@ -300,6 +300,8 @@ public:
     virtual wxString GetValue() const = 0;
     virtual void SetValue(const wxString& value) = 0;
 
     virtual wxString GetValue() const = 0;
     virtual void SetValue(const wxString& value) = 0;
 
+    virtual void ChangeValue(const wxString &value) = 0;
+
     virtual wxString GetRange(long from, long to) const;
 
     virtual int GetLineLength(long lineNo) const = 0;
     virtual wxString GetRange(long from, long to) const;
 
     virtual int GetLineLength(long lineNo) const = 0;
@@ -429,6 +431,18 @@ protected:
     int overflow(int i);
 #endif // wxHAS_TEXT_WINDOW_STREAM
 
     int overflow(int i);
 #endif // wxHAS_TEXT_WINDOW_STREAM
 
+    // typically, wxTextCtrl classes will use a DoSetValue() function to
+    // implement both SetValue() and ChangeValue() functions and these
+    // flags are meant to be passed to such DoSetValue()
+    enum
+    {
+        SetValue_SendEvent = 1,
+        SetValue_SelectionOnly = 2
+    };
+
+    // generate the wxEVT_COMMAND_TEXT_UPDATED event
+    void SendTextUpdatedEvent();
+
     // the name of the last file loaded with LoadFile() which will be used by
     // SaveFile() by default
     wxString m_filename;
     // the name of the last file loaded with LoadFile() which will be used by
     // SaveFile() by default
     wxString m_filename;
index 018454e8f9d7ed9d66e35b71e6eede2ed792900e..2ec12ca172a505c7ae8e04f986291fe7fd872bb9 100644 (file)
@@ -107,6 +107,8 @@ public:
     virtual wxString GetValue() const;
     virtual void SetValue(const wxString& value);
 
     virtual wxString GetValue() const;
     virtual void SetValue(const wxString& value);
 
+    virtual void ChangeValue(const wxString &value);
+
     virtual int GetLineLength(wxTextCoord lineNo) const;
     virtual wxString GetLineText(wxTextCoord lineNo) const;
     virtual int GetNumberOfLines() const;
     virtual int GetLineLength(wxTextCoord lineNo) const;
     virtual wxString GetLineText(wxTextCoord lineNo) const;
     virtual int GetNumberOfLines() const;
index 197acb64b560372dc9cfdafe2f246d9a27766f06..f201439b0721fbecb0de6e15d76f3042d100dad4 100644 (file)
@@ -117,7 +117,10 @@ public:
     // ----------------------------------
 
     virtual wxString GetValue() const;
     // ----------------------------------
 
     virtual wxString GetValue() const;
-    virtual void SetValue(const wxString& value);
+    virtual void SetValue(const wxString& value)
+        { ChangeValue(value); SendTextUpdatedEvent(); }
+
+    virtual void ChangeValue(const wxString &value);
 
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
 
     virtual int GetLineLength(long lineNo) const;
     virtual wxString GetLineText(long lineNo) const;
index 87c2a6d6b1e9db760dda9c1f0619d7450b932ca2..525a21e2ddb97c7669ccfd78393f01b8fddaed24 100644 (file)
@@ -947,7 +947,7 @@ void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
         case WXK_F6:
             wxLogMessage(_T("IsModified() before SetValue(): %d"),
                          IsModified());
         case WXK_F6:
             wxLogMessage(_T("IsModified() before SetValue(): %d"),
                          IsModified());
-            SetValue(_T("SetValue() has been called"));
+            ChangeValue(_T("ChangeValue() has been called"));
             wxLogMessage(_T("IsModified() after SetValue(): %d"),
                          IsModified());
             break;
             wxLogMessage(_T("IsModified() after SetValue(): %d"),
                          IsModified());
             break;
index 79cdce64654dd503464221035182b0f73086c281..f10fd64e01a96af2e971b5251ed13c71f94f538b 100644 (file)
@@ -544,9 +544,10 @@ END_EVENT_TABLE()
 void wxTextCtrl::Init()
 {
     m_dontMarkDirty =
 void wxTextCtrl::Init()
 {
     m_dontMarkDirty =
-    m_ignoreNextUpdate =
     m_modified = false;
 
     m_modified = false;
 
+    m_countUpdatesToIgnore = 0;
+
     SetUpdateFont(false);
 
     m_text = NULL;
     SetUpdateFont(false);
 
     m_text = NULL;
@@ -820,7 +821,7 @@ wxFontEncoding wxTextCtrl::GetTextEncoding() const
     return enc;
 }
 
     return enc;
 }
 
-void wxTextCtrl::SetValue( const wxString &value )
+void wxTextCtrl::DoSetValue( const wxString &value, int flags )
 {
     wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
 {
     wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
@@ -842,8 +843,20 @@ void wxTextCtrl::SetValue( const wxString &value )
             return;
         }
 
             return;
         }
 
-        if (gtk_text_buffer_get_char_count(m_buffer) != 0)
-            IgnoreNextTextUpdate();
+
+        // if the control is not empty, two "changed" signals are emitted
+        if ( flags & SetValue_SendEvent )
+        {
+            if ( gtk_text_buffer_get_char_count(m_buffer) != 0 )
+                IgnoreNextTextUpdate();
+        }
+        else
+        {
+            if ( gtk_text_buffer_get_char_count(m_buffer) != 0 )
+                IgnoreNextTextUpdate(2);
+            else
+                IgnoreNextTextUpdate(1);        // skip only one
+        }
 
         gtk_text_buffer_set_text( m_buffer, buffer, strlen(buffer) );
     }
 
         gtk_text_buffer_set_text( m_buffer, buffer, strlen(buffer) );
     }
@@ -851,9 +864,19 @@ void wxTextCtrl::SetValue( const wxString &value )
     {
         // gtk_entry_set_text() emits two "changed" signals if the control is
         // not empty because internally it calls gtk_editable_delete_text() and
     {
         // gtk_entry_set_text() emits two "changed" signals if the control is
         // not empty because internally it calls gtk_editable_delete_text() and
-        // gtk_editable_insert_text() but we want to have only one event
-        if ( !GetValue().empty() )
-            IgnoreNextTextUpdate();
+        // gtk_editable_insert_text()
+        if ( flags & SetValue_SendEvent )
+        {
+            if ( !GetValue().empty() )
+                IgnoreNextTextUpdate();
+        }
+        else
+        {
+            if ( !GetValue().empty() )
+                IgnoreNextTextUpdate(2);
+            else
+                IgnoreNextTextUpdate(1);        // if we are empty, skip only one event
+        }
 
         gtk_entry_set_text( GTK_ENTRY(m_text), wxGTK_CONV(value) );
     }
 
         gtk_entry_set_text( GTK_ENTRY(m_text), wxGTK_CONV(value) );
     }
@@ -1178,9 +1201,9 @@ void wxTextCtrl::DiscardEdits()
 
 bool wxTextCtrl::IgnoreTextUpdate()
 {
 
 bool wxTextCtrl::IgnoreTextUpdate()
 {
-    if ( m_ignoreNextUpdate )
+    if ( m_countUpdatesToIgnore > 0 )
     {
     {
-        m_ignoreNextUpdate = false;
+        m_countUpdatesToIgnore--;
 
         return true;
     }
 
         return true;
     }
index ca95f24fffe6aad67c7903c7d7334671bef0ee74..147486f8647ba9642c30e14c98bc998c1b107307 100644 (file)
@@ -412,10 +412,16 @@ wxString wxTextCtrl::GetValue() const
     return tmp;
 }
 
     return tmp;
 }
 
-void wxTextCtrl::SetValue( const wxString &value )
+void wxTextCtrl::DoSetValue( const wxString &value, int flags )
 {
     wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
 {
     wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
 
+    if ( !(flags & SetValue_SendEvent) )
+    {
+        // do not generate events
+        IgnoreNextTextUpdate();
+    }
+
     if (m_windowStyle & wxTE_MULTILINE)
     {
         gint len = gtk_text_get_length( GTK_TEXT(m_text) );
     if (m_windowStyle & wxTE_MULTILINE)
     {
         gint len = gtk_text_get_length( GTK_TEXT(m_text) );
index 3ee3663952b295f37ed4064656810f56a2e10f20..bd001090857696b0a464774509bbd69a599d18dc 100644 (file)
@@ -564,6 +564,15 @@ void wxTextCtrl::SetValue(const wxString& str)
     }
 }
 
     }
 }
 
+void wxTextCtrl::ChangeValue(const wxString& str)
+{
+    // optimize redraws
+    if ( GetValue() == str )
+        return ;
+
+    GetPeer()->SetStringValue( str ) ;
+}
+
 void wxTextCtrl::SetMaxLength(unsigned long len)
 {
     m_maxLength = len ;
 void wxTextCtrl::SetMaxLength(unsigned long len)
 {
     m_maxLength = len ;
index a74fc61d97333d06dfec3bb6ecff4dfca3b4cd74..d09a620465113dc20b3dbd411483cff6da523458 100644 (file)
@@ -240,7 +240,7 @@ wxString wxTextCtrl::GetValue() const
     return str;
 }
 
     return str;
 }
 
-void wxTextCtrl::SetValue(const wxString& text)
+void wxTextCtrl::ChangeValue(const wxString& text)
 {
     m_inSetValue = true;
 
 {
     m_inSetValue = true;
 
index 5db4094a341262fcc8252a7622533025989c3b06..a71654a1ecf4c42e3334deab5fa793d7410b8dad 100644 (file)
@@ -134,9 +134,13 @@ public:
     UpdatesCountFilter(int& count)
         : m_count(count)
     {
     UpdatesCountFilter(int& count)
         : m_count(count)
     {
-        wxASSERT_MSG( m_count == -1, _T("wrong initial m_updatesCount value") );
+        wxASSERT_MSG( m_count == -1 || m_count == -2,
+                      _T("wrong initial m_updatesCount value") );
 
 
-        m_count = 0;
+        if (m_count != -2)
+            m_count = 0;
+        //else: we don't want to count how many update events we get as we're going
+        //      to ignore all of them
     }
 
     ~UpdatesCountFilter()
     }
 
     ~UpdatesCountFilter()
@@ -781,7 +785,7 @@ wxString wxTextCtrl::GetRange(long from, long to) const
     return str;
 }
 
     return str;
 }
 
-void wxTextCtrl::SetValue(const wxString& value)
+void wxTextCtrl::DoSetValue(const wxString& value, int flags)
 {
     // if the text is long enough, it's faster to just set it instead of first
     // comparing it with the old one (chances are that it will be different
 {
     // if the text is long enough, it's faster to just set it instead of first
     // comparing it with the old one (chances are that it will be different
@@ -789,7 +793,7 @@ void wxTextCtrl::SetValue(const wxString& value)
     // edit controls mostly)
     if ( (value.length() > 0x400) || (value != GetValue()) )
     {
     // edit controls mostly)
     if ( (value.length() > 0x400) || (value != GetValue()) )
     {
-        DoWriteText(value, false /* not selection only */);
+        DoWriteText(value, flags);
 
         // mark the control as being not dirty - we changed its text, not the
         // user
 
         // mark the control as being not dirty - we changed its text, not the
         // user
@@ -807,7 +811,8 @@ void wxTextCtrl::SetValue(const wxString& value)
         DiscardEdits();
 
         // still send an event for consistency
         DiscardEdits();
 
         // still send an event for consistency
-        SendUpdateEvent();
+        if (flags & SetValue_SendEvent)
+            SendUpdateEvent();
     }
 }
 
     }
 }
 
@@ -1005,8 +1010,9 @@ void wxTextCtrl::WriteText(const wxString& value)
     DoWriteText(value);
 }
 
     DoWriteText(value);
 }
 
-void wxTextCtrl::DoWriteText(const wxString& value, bool selectionOnly)
+void wxTextCtrl::DoWriteText(const wxString& value, int flags)
 {
 {
+    bool selectionOnly = (flags & SetValue_SelectionOnly) != 0;
     wxString valueDos;
     if ( m_windowStyle & wxTE_MULTILINE )
         valueDos = wxTextFile::Translate(value, wxTextFileType_Dos);
     wxString valueDos;
     if ( m_windowStyle & wxTE_MULTILINE )
         valueDos = wxTextFile::Translate(value, wxTextFileType_Dos);
@@ -1070,13 +1076,16 @@ void wxTextCtrl::DoWriteText(const wxString& value, bool selectionOnly)
         // we generate exactly one of them by ignoring all but the first one in
         // SendUpdateEvent() and generating one ourselves if we hadn't got any
         // notifications from Windows
         // we generate exactly one of them by ignoring all but the first one in
         // SendUpdateEvent() and generating one ourselves if we hadn't got any
         // notifications from Windows
+        if ( !(flags & SetValue_SendEvent) )
+            m_updatesCount = -2;        // suppress any update event
+
         UpdatesCountFilter ucf(m_updatesCount);
 
         ::SendMessage(GetHwnd(), selectionOnly ? EM_REPLACESEL : WM_SETTEXT,
                       // EM_REPLACESEL takes 1 to indicate the operation should be redoable
                       selectionOnly ? 1 : 0, (LPARAM)valueDos.c_str());
 
         UpdatesCountFilter ucf(m_updatesCount);
 
         ::SendMessage(GetHwnd(), selectionOnly ? EM_REPLACESEL : WM_SETTEXT,
                       // EM_REPLACESEL takes 1 to indicate the operation should be redoable
                       selectionOnly ? 1 : 0, (LPARAM)valueDos.c_str());
 
-        if ( !ucf.GotUpdate() )
+        if ( !ucf.GotUpdate() && (flags & SetValue_SendEvent) )
         {
             SendUpdateEvent();
         }
         {
             SendUpdateEvent();
         }
@@ -1427,7 +1436,7 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value)
     // Set selection and remove it
     DoSetSelection(from, to, false /* don't scroll caret into view */);
 
     // Set selection and remove it
     DoSetSelection(from, to, false /* don't scroll caret into view */);
 
-    DoWriteText(value, true /* selection only */);
+    DoWriteText(value, SetValue_SelectionOnly);
 }
 
 void wxTextCtrl::Remove(long from, long to)
 }
 
 void wxTextCtrl::Remove(long from, long to)
@@ -1971,6 +1980,11 @@ bool wxTextCtrl::SendUpdateEvent()
             // we hadn't updated the control ourselves, this event comes from
             // the user, don't need to ignore it nor update the count
             break;
             // we hadn't updated the control ourselves, this event comes from
             // the user, don't need to ignore it nor update the count
             break;
+
+        case -2:
+            // the control was updated programmatically and we do NOT want to
+            // send events
+            return false;
     }
 
     wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId());
     }
 
     wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId());
index abea606670a97b28c7d2ab81797924451aa1f008..1a83ef5cb34dff55999b639ea3457ad53e99eb3d 100644 (file)
@@ -393,7 +393,7 @@ wxString wxTextCtrl::GetRange(long from, long to) const
     return str;
 }
 
     return str;
 }
 
-void wxTextCtrl::SetValue(const wxString& value)
+void wxTextCtrl::DoSetValue(const wxString& value, int flags)
 {
     // if the text is long enough, it's faster to just set it instead of first
     // comparing it with the old one (chances are that it will be different
 {
     // if the text is long enough, it's faster to just set it instead of first
     // comparing it with the old one (chances are that it will be different
@@ -401,7 +401,7 @@ void wxTextCtrl::SetValue(const wxString& value)
     // edit controls mostly)
     if ( (value.length() > 0x400) || (value != GetValue()) )
     {
     // edit controls mostly)
     if ( (value.length() > 0x400) || (value != GetValue()) )
     {
-        DoWriteText(value, false);
+        DoWriteText(value, flags);
 
         // for compatibility, don't move the cursor when doing SetValue()
         SetInsertionPoint(0);
 
         // for compatibility, don't move the cursor when doing SetValue()
         SetInsertionPoint(0);
@@ -409,7 +409,8 @@ void wxTextCtrl::SetValue(const wxString& value)
     else // same text
     {
         // still send an event for consistency
     else // same text
     {
         // still send an event for consistency
-        SendUpdateEvent();
+        if ( flags & SetValue_SendEvent )
+            SendUpdateEvent();
     }
 
     // we should reset the modified flag even if the value didn't really change
     }
 
     // we should reset the modified flag even if the value didn't really change
@@ -424,8 +425,9 @@ void wxTextCtrl::WriteText(const wxString& value)
     DoWriteText(value);
 }
 
     DoWriteText(value);
 }
 
-void wxTextCtrl::DoWriteText(const wxString& value, bool selectionOnly)
+void wxTextCtrl::DoWriteText(const wxString& value, int flags)
 {
 {
+    bool selectionOnly = (flags & SetValue_SelectionOnly) != 0;
     wxString valueDos;
     if ( m_windowStyle & wxTE_MULTILINE )
         valueDos = wxTextFile::Translate(value, wxTextFileType_Dos);
     wxString valueDos;
     if ( m_windowStyle & wxTE_MULTILINE )
         valueDos = wxTextFile::Translate(value, wxTextFileType_Dos);
@@ -436,7 +438,7 @@ void wxTextCtrl::DoWriteText(const wxString& value, bool selectionOnly)
     // call below which is confusing for the client code and so should be
     // avoided
     //
     // call below which is confusing for the client code and so should be
     // avoided
     //
-    if ( ( selectionOnly && HasSelection() ) )
+    if ( selectionOnly && HasSelection() )
     {
         m_suppressNextUpdate = true;
     }
     {
         m_suppressNextUpdate = true;
     }
@@ -444,7 +446,7 @@ void wxTextCtrl::DoWriteText(const wxString& value, bool selectionOnly)
     ::SendMessage(GetBuddyHwnd(), selectionOnly ? EM_REPLACESEL : WM_SETTEXT,
                   0, (LPARAM)valueDos.c_str());
 
     ::SendMessage(GetBuddyHwnd(), selectionOnly ? EM_REPLACESEL : WM_SETTEXT,
                   0, (LPARAM)valueDos.c_str());
 
-    if ( !selectionOnly )
+    if ( !selectionOnly && !( flags & SetValue_SendEvent ) )
     {
         // Windows already sends an update event for single-line
         // controls.
     {
         // Windows already sends an update event for single-line
         // controls.
@@ -641,7 +643,7 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value)
     // Set selection and remove it
     DoSetSelection(from, to, false);
 
     // Set selection and remove it
     DoSetSelection(from, to, false);
 
-    DoWriteText(value, true);
+    DoWriteText(value, SetValue_SelectionOnly);
 }
 
 void wxTextCtrl::Remove(long from, long to)
 }
 
 void wxTextCtrl::Remove(long from, long to)
index f5ac61433c7d0224fb1aea051d0b0f36bbcf0426..111a63165bd0edd45d4dcec0ddd621b70d2cecd4 100644 (file)
@@ -125,6 +125,7 @@ bool wxTextCtrl::Create(
 
     m_windowStyle = lStyle;
     m_bIsMLE = false;
 
     m_windowStyle = lStyle;
     m_bIsMLE = false;
+    m_bSkipUpdate = false;
 
     long                            lSstyle = WS_VISIBLE | WS_TABSTOP;
 
 
     long                            lSstyle = WS_VISIBLE | WS_TABSTOP;
 
@@ -343,8 +344,9 @@ wxString wxTextCtrl::GetValue() const
     return sStr;
 } // end of wxTextCtrl::GetValue
 
     return sStr;
 } // end of wxTextCtrl::GetValue
 
-void wxTextCtrl::SetValue(
-  const wxString&                   rsValue
+void wxTextCtrl::DoSetValue(
+  const wxString&                   rsValue,
+  int flags
 )
 {
     //
 )
 {
     //
@@ -355,6 +357,9 @@ void wxTextCtrl::SetValue(
     //
     if ((rsValue.length() > 0x400) || (rsValue != GetValue()))
     {
     //
     if ((rsValue.length() > 0x400) || (rsValue != GetValue()))
     {
+        if ( flags & SetValue_SendEvent )
+            m_bSkipUpdate = true;
+
         ::WinSetWindowText(GetHwnd(), (PSZ)rsValue.c_str());
         AdjustSpaceLimit();
     }
         ::WinSetWindowText(GetHwnd(), (PSZ)rsValue.c_str());
         AdjustSpaceLimit();
     }
@@ -1095,6 +1100,12 @@ bool wxTextCtrl::OS2Command(
 
         case EN_CHANGE:
             {
 
         case EN_CHANGE:
             {
+                if (m_bSkipUpdate)
+                {
+                    m_bSkipUpdate = false;
+                    break;
+                }
+
                 wxCommandEvent      vEvent( wxEVT_COMMAND_TEXT_UPDATED
                                            ,m_windowId
                                           );
                 wxCommandEvent      vEvent( wxEVT_COMMAND_TEXT_UPDATED
                                            ,m_windowId
                                           );
index b27b0c5f3b04dd5934c91c05e5a15173552acd32..7302a7fe63fb5da64ec5e5dbe8179c9f1e7da965 100644 (file)
@@ -233,6 +233,10 @@ void wxTextCtrl::SetValue(const wxString& value)
 {
 }
 
 {
 }
 
+void wxTextCtrl::ChangeValue(const wxString& value)
+{
+}
+
 #if wxUSE_RICHEDIT && (!wxUSE_UNICODE || wxUSE_UNICODE_MSLU)
 
 // TODO: using memcpy() would improve performance a lot for big amounts of text
 #if wxUSE_RICHEDIT && (!wxUSE_UNICODE || wxUSE_UNICODE_MSLU)
 
 // TODO: using memcpy() would improve performance a lot for big amounts of text
index 5dc742581b5f08660ede6e57ce4ecdce5f87e080..17ed256745af3b68c26d4d8c5664439a096d0d4d 100644 (file)
@@ -778,7 +778,7 @@ wxTextCtrl::~wxTextCtrl()
 // set/get the value
 // ----------------------------------------------------------------------------
 
 // set/get the value
 // ----------------------------------------------------------------------------
 
-void wxTextCtrl::SetValue(const wxString& value)
+void wxTextCtrl::ChangeValue(const wxString& value)
 {
     if ( IsSingleLine() && (value == GetValue()) )
     {
 {
     if ( IsSingleLine() && (value == GetValue()) )
     {
@@ -792,8 +792,12 @@ void wxTextCtrl::SetValue(const wxString& value)
     {
         SetInsertionPoint(0);
     }
     {
         SetInsertionPoint(0);
     }
+}
 
 
-    // TODO: should we generate the event or not, finally?
+void wxTextCtrl::SetValue(const wxString& value)
+{
+    ChangeValue(value);
+    SendTextUpdatedEvent();
 }
 
 const wxArrayString& wxTextCtrl::GetLines() const
 }
 
 const wxArrayString& wxTextCtrl::GetLines() const
index fdb7008a89d289020a6bd05e0776847bff087fc1..8f8aa99e48e6a81f777192f3772b8bc1e5065773 100644 (file)
@@ -277,7 +277,7 @@ wxString wxTextCtrl::GetValue() const
     return ret;
 }
 
     return ret;
 }
 
-void wxTextCtrl::SetValue(const wxString& value)
+void wxTextCtrl::ChangeValue(const wxString& value)
 {
     m_modified = false;
 
 {
     m_modified = false;