From: Vadim Zeitlin Date: Sun, 29 Jul 2012 22:08:50 +0000 (+0000) Subject: Translate wxTextDataObject to/from native EOL format. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/229f00eb69472782a51a862b5f7e0ad059d906f7 Translate wxTextDataObject to/from native EOL format. The text data should use CR LF EOLs under Windows but the data inside the program typically has only LF EOLs, so translate between them automatically in wxTextDataObject. Closes #14444. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72259 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/common/dobjcmn.cpp b/src/common/dobjcmn.cpp index 4c1acaa837..0eeea52fb2 100644 --- a/src/common/dobjcmn.cpp +++ b/src/common/dobjcmn.cpp @@ -24,6 +24,8 @@ #include "wx/app.h" #endif +#include "wx/textbuf.h" + // ---------------------------------------------------------------------------- // lists // ---------------------------------------------------------------------------- @@ -406,29 +408,44 @@ bool wxTextDataObject::SetData(const wxDataFormat& format, #else // !wxNEEDS_UTF{8,16}_FOR_TEXT_DATAOBJ +// NB: This branch, using native wxChar for the clipboard, is only used under +// Windows currently. It's just a coincidence, but Windows is also the only +// platform where we need to convert the text to the native EOL format, so +// wxTextBuffer::Translate() is only used here and not in the code above. + size_t wxTextDataObject::GetDataSize() const { - return GetTextLength() * sizeof(wxChar); + return (wxTextBuffer::Translate(GetText()).length() + 1)*sizeof(wxChar); } bool wxTextDataObject::GetDataHere(void *buf) const { + const wxString textNative = wxTextBuffer::Translate(GetText()); + // NOTE: use wxTmemcpy() instead of wxStrncpy() to allow // retrieval of strings with embedded NULLs - wxTmemcpy( (wxChar*)buf, GetText().c_str(), GetTextLength() ); + wxTmemcpy(static_cast(buf), + textNative.c_str(), + (textNative.length() + 1)*sizeof(wxChar)); return true; } bool wxTextDataObject::SetData(size_t len, const void *buf) { - SetText( wxString((const wxChar*)buf, len/sizeof(wxChar)) ); + const wxString + text = wxString(static_cast(buf), len/sizeof(wxChar)); + SetText(wxTextBuffer::Translate(text, wxTextFileType_Unix)); return true; } #endif // different wxTextDataObject implementations +// ---------------------------------------------------------------------------- +// wxHTMLDataObject +// ---------------------------------------------------------------------------- + size_t wxHTMLDataObject::GetDataSize() const { const wxScopedCharBuffer buffer(GetHTML().utf8_str());