]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/textctrl.cpp
Fixed toolbar crash for MinGW/Cygwin
[wxWidgets.git] / src / msw / textctrl.cpp
index b19e84b06f029e636d12b02ea81284f2b4fd7eb1..eb7c59e6ec28153543596efcb98c06ada37f56f5 100644 (file)
@@ -234,21 +234,6 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
     if ( m_windowStyle & wxTE_NOHIDESEL )
         msStyle |= ES_NOHIDESEL;
 
     if ( m_windowStyle & wxTE_NOHIDESEL )
         msStyle |= ES_NOHIDESEL;
 
-    // we always want the characters and the arrows
-    m_lDlgCode = DLGC_WANTCHARS | DLGC_WANTARROWS;
-
-    // we may have several different cases:
-    // 1. normal case: both TAB and ENTER are used for dialog navigation
-    // 2. ctrl which wants TAB for itself: ENTER is used to pass to the next
-    //    control in the dialog
-    // 3. ctrl which wants ENTER for itself: TAB is used for dialog navigation
-    // 4. ctrl which wants both TAB and ENTER: Ctrl-ENTER is used to pass to
-    //    the next control
-    if ( m_windowStyle & wxTE_PROCESS_ENTER )
-        m_lDlgCode |= DLGC_WANTMESSAGE;
-    if ( m_windowStyle & wxTE_PROCESS_TAB )
-        m_lDlgCode |= DLGC_WANTTAB;
-
     // do create the control - either an EDIT or RICHEDIT
     wxString windowClass = wxT("EDIT");
 
     // do create the control - either an EDIT or RICHEDIT
     wxString windowClass = wxT("EDIT");
 
@@ -493,11 +478,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()) )
     {
-        // it is simpler to do this but it could be more efficient to reproduce
-        // WriteText() logic here
-        Clear();
-
-        WriteText(value);
+        DoWriteText(value, FALSE /* not selection only */);
 
         // 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
@@ -529,14 +510,18 @@ DWORD CALLBACK wxRichEditStreamIn(DWORD dwCookie, BYTE *buf, LONG cb, LONG *pcb)
     return 0;
 }
 
     return 0;
 }
 
-extern long wxEncodingToCodepage(wxFontEncoding encoding); // from strconv.cpp
+extern long wxEncodingToCodepage(wxFontEncoding encoding); // from utils.cpp
 
 #if wxUSE_UNICODE_MSLU
 
 #if wxUSE_UNICODE_MSLU
-bool wxTextCtrl::StreamIn(const wxString& value, wxFontEncoding WXUNUSED(encoding))
+bool wxTextCtrl::StreamIn(const wxString& value,
+                          wxFontEncoding WXUNUSED(encoding),
+                          bool selectionOnly)
 {
     const wchar_t *wpc = value.c_str();
 {
     const wchar_t *wpc = value.c_str();
-#else
-bool wxTextCtrl::StreamIn(const wxString& value, wxFontEncoding encoding)
+#else // !wxUSE_UNICODE_MSLU
+bool wxTextCtrl::StreamIn(const wxString& value,
+                          wxFontEncoding encoding,
+                          bool selectionOnly)
 {
     // we have to use EM_STREAMIN to force richedit control 2.0+ to show any
     // text in the non default charset - otherwise it thinks it knows better
 {
     // we have to use EM_STREAMIN to force richedit control 2.0+ to show any
     // text in the non default charset - otherwise it thinks it knows better
@@ -552,9 +537,15 @@ bool wxTextCtrl::StreamIn(const wxString& value, wxFontEncoding encoding)
 
     // next translate to Unicode using this code page
     int len = ::MultiByteToWideChar(codepage, 0, value, -1, NULL, 0);
 
     // next translate to Unicode using this code page
     int len = ::MultiByteToWideChar(codepage, 0, value, -1, NULL, 0);
+
+#if wxUSE_WCHAR_T
     wxWCharBuffer wchBuf(len);
     wxWCharBuffer wchBuf(len);
+#else
+    wchar_t *wchBuf = (wchar_t *)malloc((len + 1)*sizeof(wchar_t));
+#endif
+
     if ( !::MultiByteToWideChar(codepage, 0, value, -1,
     if ( !::MultiByteToWideChar(codepage, 0, value, -1,
-                                (wchar_t *)wchBuf.data(), len) )
+                                (wchar_t *)(const wchar_t *)wchBuf, len) )
     {
         wxLogLastError(_T("MultiByteToWideChar"));
     }
     {
         wxLogLastError(_T("MultiByteToWideChar"));
     }
@@ -570,20 +561,29 @@ bool wxTextCtrl::StreamIn(const wxString& value, wxFontEncoding encoding)
     eds.pfnCallback = (EDITSTREAMCALLBACK)wxRichEditStreamIn;
 
     if ( !::SendMessage(GetHwnd(), EM_STREAMIN,
     eds.pfnCallback = (EDITSTREAMCALLBACK)wxRichEditStreamIn;
 
     if ( !::SendMessage(GetHwnd(), EM_STREAMIN,
-                        SF_TEXT | SF_UNICODE | SFF_SELECTION,
+                        SF_TEXT |
+                        SF_UNICODE |
+                        (selectionOnly ? SFF_SELECTION : 0),
                         (LPARAM)&eds) || eds.dwError )
     {
         wxLogLastError(_T("EM_STREAMIN"));
                         (LPARAM)&eds) || eds.dwError )
     {
         wxLogLastError(_T("EM_STREAMIN"));
-
-        return FALSE;
     }
 
     }
 
+#if !wxUSE_WCHAR_T
+    free(wchBuf);
+#endif // !wxUSE_WCHAR_T
+
     return TRUE;
 }
 
 #endif // wxUSE_RICHEDIT
 
 void wxTextCtrl::WriteText(const wxString& value)
     return TRUE;
 }
 
 #endif // wxUSE_RICHEDIT
 
 void wxTextCtrl::WriteText(const wxString& value)
+{
+    DoWriteText(value);
+}
+
+void wxTextCtrl::DoWriteText(const wxString& value, bool selectionOnly)
 {
     wxString valueDos;
     if ( m_windowStyle & wxTE_MULTILINE )
 {
     wxString valueDos;
     if ( m_windowStyle & wxTE_MULTILINE )
@@ -609,7 +609,7 @@ void wxTextCtrl::WriteText(const wxString& value)
         // but EM_STREAMIN works
         if ( wxGetOsVersion() == wxWIN95 && GetRichVersion() > 1 )
         {
         // but EM_STREAMIN works
         if ( wxGetOsVersion() == wxWIN95 && GetRichVersion() > 1 )
         {
-           done = StreamIn(valueDos, wxFONTENCODING_SYSTEM);
+           done = StreamIn(valueDos, wxFONTENCODING_SYSTEM, selectionOnly);
         }
 #endif // wxUSE_UNICODE_MSLU
 
         }
 #endif // wxUSE_UNICODE_MSLU
 
@@ -627,7 +627,7 @@ void wxTextCtrl::WriteText(const wxString& value)
                wxFontEncoding encoding = font.GetEncoding();
                if ( encoding != wxFONTENCODING_SYSTEM )
                {
                wxFontEncoding encoding = font.GetEncoding();
                if ( encoding != wxFONTENCODING_SYSTEM )
                {
-                   done = StreamIn(valueDos, encoding);
+                   done = StreamIn(valueDos, encoding, selectionOnly);
                }
             }
         }
                }
             }
         }
@@ -637,6 +637,11 @@ void wxTextCtrl::WriteText(const wxString& value)
     if ( !done )
 #endif // wxUSE_RICHEDIT
     {
     if ( !done )
 #endif // wxUSE_RICHEDIT
     {
+        if ( !selectionOnly )
+        {
+            SetSelection(-1, -1);
+        }
+
         ::SendMessage(GetHwnd(), EM_REPLACESEL, 0, (LPARAM)valueDos.c_str());
     }
 
         ::SendMessage(GetHwnd(), EM_REPLACESEL, 0, (LPARAM)valueDos.c_str());
     }
 
@@ -1082,7 +1087,7 @@ bool wxTextCtrl::MSWShouldPreProcessMessage(WXMSG* pMsg)
     // usual preprocessing for them
     if ( msg->message == WM_KEYDOWN )
     {
     // usual preprocessing for them
     if ( msg->message == WM_KEYDOWN )
     {
-        WORD vkey = msg->wParam;
+        WORD vkey = (WORD) msg->wParam;
         if ( (HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN )
         {
             if ( vkey == VK_BACK )
         if ( (HIWORD(msg->lParam) & KF_ALTDOWN) == KF_ALTDOWN )
         {
             if ( vkey == VK_BACK )
@@ -1153,6 +1158,32 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
     event.Skip();
 }
 
     event.Skip();
 }
 
+long wxTextCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+{
+    // we always want the characters and the arrows
+    if ( nMsg == WM_GETDLGCODE )
+    {
+        // we always want the chars and the arrows
+        long lDlgCode = DLGC_WANTCHARS | DLGC_WANTARROWS;
+
+        // we may have several different cases:
+        // 1. normal case: both TAB and ENTER are used for dialog navigation
+        // 2. ctrl which wants TAB for itself: ENTER is used to pass to the next
+        //    control in the dialog
+        // 3. ctrl which wants ENTER for itself: TAB is used for dialog navigation
+        // 4. ctrl which wants both TAB and ENTER: Ctrl-ENTER is used to pass to
+        //    the next control
+        if ( m_windowStyle & wxTE_PROCESS_ENTER )
+            lDlgCode |= DLGC_WANTMESSAGE;
+        if ( m_windowStyle & wxTE_PROCESS_TAB )
+            lDlgCode |= DLGC_WANTTAB;
+
+        return lDlgCode;
+    }
+
+    return wxTextCtrlBase::MSWWindowProc(nMsg, wParam, lParam);
+}
+
 bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
 {
     switch (param)
 bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
 {
     switch (param)
@@ -1406,7 +1437,7 @@ void wxTextCtrl::OnUpdateRedo(wxUpdateUIEvent& event)
 // EN_LINK processing
 // ----------------------------------------------------------------------------
 
 // EN_LINK processing
 // ----------------------------------------------------------------------------
 
-bool wxTextCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
+bool wxTextCtrl::MSWOnNotify(int WXUNUSED(idCtrl), WXLPARAM lParam, WXLPARAM *result)
 {
     NMHDR *hdr = (NMHDR* )lParam;
     if ( hdr->code == EN_LINK )
 {
     NMHDR *hdr = (NMHDR* )lParam;
     if ( hdr->code == EN_LINK )
@@ -1681,18 +1712,18 @@ bool wxRichEditModule::Load(int version)
     // make it the index in the array
     version--;
 
     // make it the index in the array
     version--;
 
-    if ( ms_hRichEdit[version] )
-    {
-        // we've already got this one
-        return TRUE;
-    }
-
     if ( ms_hRichEdit[version] == (HINSTANCE)-1 )
     {
         // we had already tried to load it and failed
         return FALSE;
     }
 
     if ( ms_hRichEdit[version] == (HINSTANCE)-1 )
     {
         // we had already tried to load it and failed
         return FALSE;
     }
 
+    if ( ms_hRichEdit[version] )
+    {
+        // we've already got this one
+        return TRUE;
+    }
+
     wxString dllname = version ? _T("riched20") : _T("riched32");
     dllname += _T(".dll");
 
     wxString dllname = version ? _T("riched20") : _T("riched32");
     dllname += _T(".dll");