]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/textctrl.cpp
Added BCC include dir in XRC makefile
[wxWidgets.git] / src / msw / textctrl.cpp
index ea8f3eff7630a6a0118336b3fef69d9c4457482d..288f674d4275bc637d4da4a080588a53ea516b64 100644 (file)
@@ -5,8 +5,8 @@
 // Modified by:
 // Created:     04/01/98
 // RCS-ID:      $Id$
-// Copyright:   (c) Julian Smart and Markus Holzem
-// Licence:     wxWindows license
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 #include <stdlib.h>
 #include <sys/types.h>
 
-#if wxUSE_RICHEDIT && (!defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__))
+#if wxUSE_RICHEDIT
+
+// old mingw32 has richedit stuff directly in windows.h and doesn't have
+// richedit.h at all
+#if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__)
     #include <richedit.h>
 #endif
 
 
 // Watcom C++ doesn't define this
 #ifndef SCF_ALL
-#define SCF_ALL 0x0004
+    #define SCF_ALL 0x0004
 #endif
 
+#endif // wxUSE_RICHEDIT
+
 // ----------------------------------------------------------------------------
 // private functions
 // ----------------------------------------------------------------------------
@@ -407,6 +413,7 @@ WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
             // always adjust the vertical scrollbar automatically if we have it
             msStyle |= WS_VSCROLL | ES_AUTOVSCROLL;
 
+#if wxUSE_RICHEDIT
             // we have to use this style for the rich edit controls because
             // without it the vertical scrollbar never appears at all in
             // richedit 3.0 because of our ECO_NOHIDESEL hack (search for it)
@@ -414,6 +421,7 @@ WXDWORD wxTextCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const
             {
                 msStyle |= ES_DISABLENOSCROLL;
             }
+#endif // wxUSE_RICHEDIT
         }
 
         style |= wxTE_PROCESS_ENTER;
@@ -562,14 +570,16 @@ void wxTextCtrl::SetValue(const wxString& value)
     if ( (value.length() > 0x400) || (value != GetValue()) )
     {
         DoWriteText(value, FALSE /* not selection only */);
+    }
 
-        // mark the control as being not dirty - we changed its text, not the
-        // user
-        DiscardEdits();
+    // we should reset the modified flag even if the value didn't really change
 
-        // for compatibility, don't move the cursor when doing SetValue()
-        SetInsertionPoint(0);
-    }
+    // mark the control as being not dirty - we changed its text, not the
+    // user
+    DiscardEdits();
+
+    // for compatibility, don't move the cursor when doing SetValue()
+    SetInsertionPoint(0);
 }
 
 #if wxUSE_RICHEDIT && (!wxUSE_UNICODE || wxUSE_UNICODE_MSLU)
@@ -651,11 +661,13 @@ bool wxTextCtrl::StreamIn(const wxString& value,
         m_suppressNextUpdate = TRUE;
     }
 
-    if ( !::SendMessage(GetHwnd(), EM_STREAMIN,
-                        SF_TEXT |
-                        SF_UNICODE |
-                        (selectionOnly ? SFF_SELECTION : 0),
-                        (LPARAM)&eds) || eds.dwError )
+    ::SendMessage(GetHwnd(), EM_STREAMIN,
+                  SF_TEXT |
+                  SF_UNICODE |
+                  (selectionOnly ? SFF_SELECTION : 0),
+                  (LPARAM)&eds);
+
+    if ( eds.dwError )
     {
         wxLogLastError(_T("EM_STREAMIN"));
     }
@@ -906,6 +918,14 @@ void wxTextCtrl::SetInsertionPoint(long pos)
 
 void wxTextCtrl::SetInsertionPointEnd()
 {
+    // we must not do anything if the caret is already there because calling
+    // SetInsertionPoint() thaws the controls if Freeze() had been called even
+    // if it doesn't actually move the caret anywhere and so the simple fact of
+    // doing it results in horrible flicker when appending big amounts of text
+    // to the control in a few chunks (see DoAddText() test in the text sample)
+    if ( GetInsertionPoint() == GetLastPosition() )
+        return;
+
     long pos;
 
 #if wxUSE_RICHEDIT