// 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
extern long wxEncodingToCodepage(wxFontEncoding encoding); // from strconv.cpp
#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();
-#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
// next translate to Unicode using this code page
int len = ::MultiByteToWideChar(codepage, 0, value, -1, NULL, 0);
+
+#if wxUSE_WCHAR_T
wxWCharBuffer wchBuf(len);
+#else
+ wchar_t *wchBuf = (wchar_t *)malloc((len + 1)*sizeof(wchar_t));
+#endif
+
if ( !::MultiByteToWideChar(codepage, 0, value, -1,
- (wchar_t *)wchBuf.data(), len) )
+ (wchar_t *)(const wchar_t *)wchBuf, len) )
{
wxLogLastError(_T("MultiByteToWideChar"));
}
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"));
-
- return FALSE;
}
+#if !wxUSE_WCHAR_T
+ free(wchBuf);
+#endif // !wxUSE_WCHAR_T
+
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 )
// but EM_STREAMIN works
if ( wxGetOsVersion() == wxWIN95 && GetRichVersion() > 1 )
{
- done = StreamIn(valueDos, wxFONTENCODING_SYSTEM);
+ done = StreamIn(valueDos, wxFONTENCODING_SYSTEM, selectionOnly);
}
#endif // wxUSE_UNICODE_MSLU
wxFontEncoding encoding = font.GetEncoding();
if ( encoding != wxFONTENCODING_SYSTEM )
{
- done = StreamIn(valueDos, encoding);
+ done = StreamIn(valueDos, encoding, selectionOnly);
}
}
}
if ( !done )
#endif // wxUSE_RICHEDIT
{
+ if ( !selectionOnly )
+ {
+ SetSelection(-1, -1);
+ }
+
::SendMessage(GetHwnd(), EM_REPLACESEL, 0, (LPARAM)valueDos.c_str());
}
// 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] )
+ {
+ // we've already got this one
+ return TRUE;
+ }
+
wxString dllname = version ? _T("riched20") : _T("riched32");
dllname += _T(".dll");