]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/dobjcmn.cpp
Allow retrieving the descent and external leading of empty strings.
[wxWidgets.git] / src / common / dobjcmn.cpp
index eb2d539c39cf28022b87d367d53303f00a50b020..3486edefb9e5b6f0e7393dba9407d105eaf6d0d5 100644 (file)
@@ -24,6 +24,8 @@
     #include "wx/app.h"
 #endif
 
+#include "wx/textbuf.h"
+
 // ----------------------------------------------------------------------------
 // lists
 // ----------------------------------------------------------------------------
@@ -299,13 +301,14 @@ bool wxTextDataObject::SetData(const wxDataFormat& format,
 
 size_t wxTextDataObject::GetDataSize(const wxDataFormat& format) const
 {
+    const wxString& text = GetText();
     if ( format == wxDF_UNICODETEXT || wxLocaleIsUtf8 )
     {
-        return m_text.utf8_length();
+        return text.utf8_length();
     }
     else // wxDF_TEXT
     {
-        const wxCharBuffer buf(wxConvLocal.cWC2MB(m_text.wc_str()));
+        const wxCharBuffer buf(wxConvLocal.cWC2MB(text.wc_str()));
         return buf ? strlen(buf) : 0;
     }
 }
@@ -315,13 +318,14 @@ bool wxTextDataObject::GetDataHere(const wxDataFormat& format, void *buf) const
     if ( !buf )
         return false;
 
+    const wxString& text = GetText();
     if ( format == wxDF_UNICODETEXT || wxLocaleIsUtf8 )
     {
-        memcpy(buf, m_text.utf8_str(), m_text.utf8_length());
+        memcpy(buf, text.utf8_str(), text.utf8_length());
     }
     else // wxDF_TEXT
     {
-        const wxCharBuffer bufLocal(wxConvLocal.cWC2MB(m_text.wc_str()));
+        const wxCharBuffer bufLocal(wxConvLocal.cWC2MB(text.wc_str()));
         if ( !bufLocal )
             return false;
 
@@ -346,11 +350,11 @@ bool wxTextDataObject::SetData(const wxDataFormat& format,
         // is not in UTF-8 so do an extra check for tranquility, it shouldn't
         // matter much if we lose a bit of performance when pasting from
         // clipboard
-        m_text = wxString::FromUTF8(buf, len);
+        SetText(wxString::FromUTF8(buf, len));
     }
     else // wxDF_TEXT, convert from current (non-UTF8) locale
     {
-        m_text = wxConvLocal.cMB2WC(buf, len, NULL);
+        SetText(wxConvLocal.cMB2WC(buf, len, NULL));
     }
 
     return true;
@@ -404,44 +408,58 @@ 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<wxChar*>(buf),
+              textNative.t_str(),
+              textNative.length() + 1);
 
     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<const wxChar*>(buf), len/sizeof(wxChar));
+    SetText(wxTextBuffer::Translate(text, wxTextFileType_Unix));
 
     return true;
 }
 
 #endif // different wxTextDataObject implementations
 
+// ----------------------------------------------------------------------------
+// wxHTMLDataObject
+// ----------------------------------------------------------------------------
+
 size_t wxHTMLDataObject::GetDataSize() const
 {
-    size_t size = 0;
-    // Windows and Mac always use UTF-8, and docs suggest GTK does as well.
-    wxCharBuffer buffer =  wxConvUTF8.cWX2MB( GetHTML().c_str() );
+    // Ensure that the temporary string returned by GetHTML() is kept alive for
+    // as long as we need it here.
+    const wxString& htmlStr = GetHTML();
+    const wxScopedCharBuffer buffer(htmlStr.utf8_str());
+
+    size_t size = buffer.length();
 
-    if (buffer) 
-    {
-        size = strlen( buffer );
 #ifdef __WXMSW__
-        // On Windows we need to add some stuff to the string to satisfy 
-        // its clipboard format requirements.
-        size += 400;
+    // On Windows we need to add some stuff to the string to satisfy
+    // its clipboard format requirements.
+    size += 400;
 #endif
-    }
 
     return size;
 }
@@ -452,14 +470,15 @@ bool wxHTMLDataObject::GetDataHere(void *buf) const
         return false;
 
     // Windows and Mac always use UTF-8, and docs suggest GTK does as well.
-    wxCharBuffer html =  wxConvUTF8.cWX2MB( GetHTML().c_str() );
+    const wxString& htmlStr = GetHTML();
+    const wxScopedCharBuffer html(htmlStr.utf8_str());
     if ( !html )
         return false;
 
-    size_t bytes = GetDataSize();
+    char* const buffer = static_cast<char*>(buf);
+
 #ifdef __WXMSW__
     // add the extra info that the MSW clipboard format requires.
-    char* buffer = new char[bytes];
 
         // Create a template string for the HTML header...
     strcpy(buffer,
@@ -500,11 +519,9 @@ bool wxHTMLDataObject::GetDataHere(void *buf) const
     sprintf(ptr+12, "%08u", (unsigned)(strstr(buffer, "<!--EndFrag") - buffer));
     *(ptr+12+8) = '\r';
 #else
-    wxCharBuffer buffer = html;
+    strcpy(buffer, html);
 #endif // __WXMSW__
 
-    memcpy( (char*) buf, buffer, bytes );
-
     return true;
 }
 
@@ -514,24 +531,24 @@ bool wxHTMLDataObject::SetData(size_t WXUNUSED(len), const void *buf)
         return false;
 
     // Windows and Mac always use UTF-8, and docs suggest GTK does as well.
-    wxWCharBuffer buffer =  wxConvUTF8.cMB2WX( (const char*)buf );
+    wxString html = wxString::FromUTF8(static_cast<const char*>(buf));
 
-    wxString html(buffer);
+#ifdef __WXMSW__
     // To be consistent with other platforms, we only add the Fragment part
     // of the Windows HTML clipboard format to the data object.
-#ifdef __WXMSW__
     int fragmentStart = html.rfind("StartFragment");
     int fragmentEnd = html.rfind("EndFragment");
 
-    if (fragmentStart != wxNOT_FOUND && fragmentEnd != wxNOT_FOUND) 
+    if (fragmentStart != wxNOT_FOUND && fragmentEnd != wxNOT_FOUND)
     {
         int startCommentEnd = html.find("-->", fragmentStart) + 3;
         int endCommentStart = html.rfind("<!--", fragmentEnd);
-        
+
         if (startCommentEnd != wxNOT_FOUND && endCommentStart != wxNOT_FOUND)
             html = html.Mid(startCommentEnd, endCommentStart - startCommentEnd);
     }
-#endif
+#endif // __WXMSW__
+
     SetHTML( html );
 
     return true;