X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/27781f63793f6bccf76b95d3b9dcf816ccea88d6..14722c43c30918cd8fbba956b50ac3426d2fe339:/src/gtk/dataobj.cpp?ds=sidebyside diff --git a/src/gtk/dataobj.cpp b/src/gtk/dataobj.cpp index 50ef7fdc80..db02431737 100644 --- a/src/gtk/dataobj.cpp +++ b/src/gtk/dataobj.cpp @@ -33,6 +33,7 @@ GdkAtom g_textAtom = 0; GdkAtom g_altTextAtom = 0; GdkAtom g_pngAtom = 0; GdkAtom g_fileAtom = 0; +GdkAtom g_htmlAtom = 0; //------------------------------------------------------------------------- // wxDataFormat @@ -81,10 +82,13 @@ void wxDataFormat::SetType( wxDataFormatId type ) m_format = g_textAtom; else if (m_type == wxDF_TEXT) m_format = g_altTextAtom; -#else - if (m_type == wxDF_TEXT || m_type == wxDF_UNICODETEXT) +#else // !wxUSE_UNICODE + // notice that we don't map wxDF_UNICODETEXT to g_textAtom here, this + // would lead the code elsewhere to treat data objects with this format as + // containing UTF-8 data which is not true + if (m_type == wxDF_TEXT) m_format = g_textAtom; -#endif +#endif // wxUSE_UNICODE/!wxUSE_UNICODE else if (m_type == wxDF_BITMAP) m_format = g_pngAtom; @@ -92,6 +96,9 @@ void wxDataFormat::SetType( wxDataFormatId type ) if (m_type == wxDF_FILENAME) m_format = g_fileAtom; else + if (m_type == wxDF_HTML) + m_format = g_htmlAtom; + else { wxFAIL_MSG( wxT("invalid dataformat") ); } @@ -128,6 +135,9 @@ void wxDataFormat::SetId( NativeFormat format ) else if (m_format == g_fileAtom) m_type = wxDF_FILENAME; + else + if (m_format == g_htmlAtom) + m_type = wxDF_HTML; else m_type = wxDF_PRIVATE; } @@ -161,6 +171,8 @@ void wxDataFormat::PrepareFormats() g_pngAtom = gdk_atom_intern( "image/png", FALSE ); if (!g_fileAtom) g_fileAtom = gdk_atom_intern( "text/uri-list", FALSE ); + if (!g_htmlAtom) + g_htmlAtom = gdk_atom_intern( "text/html", FALSE ); } //------------------------------------------------------------------------- @@ -381,12 +393,12 @@ bool wxBitmapDataObject::SetData(size_t size, const void *buf) m_bitmap = wxBitmap(image); - return m_bitmap.Ok(); + return m_bitmap.IsOk(); } void wxBitmapDataObject::DoConvertToPng() { - if ( !m_bitmap.Ok() ) + if ( !m_bitmap.IsOk() ) return; wxCHECK_RET( wxImage::FindHandler(wxBITMAP_TYPE_PNG) != NULL, @@ -408,49 +420,101 @@ void wxBitmapDataObject::DoConvertToPng() // wxURLDataObject // ---------------------------------------------------------------------------- -wxURLDataObject::wxURLDataObject(const wxString& url) : - wxDataObjectSimple( wxDataFormat( gdk_atom_intern("text/x-moz-url",FALSE) ) ) +class wxTextURIListDataObject : public wxDataObjectSimple { - m_url = url; -} +public: + wxTextURIListDataObject(const wxString& url) + : wxDataObjectSimple(wxDataFormat(g_fileAtom)), + m_url(url) + { + } -size_t wxURLDataObject::GetDataSize() const -{ - if (m_url.empty()) - return 0; + const wxString& GetURL() const { return m_url; } + void SetURL(const wxString& url) { m_url = url; } - return 2*m_url.Len()+2; -} -bool wxURLDataObject::GetDataHere(void *buf) const -{ - if (m_url.empty()) - return false; + virtual size_t GetDataSize() const + { + // It is not totally clear whether we should include "\r\n" at the end + // of the string if there is only one URL or not, but not doing it + // doesn't seem to create any problems, so keep things simple. + return strlen(m_url.utf8_str()) + 1; + } - wxCSConv conv( "UCS2" ); - conv.FromWChar( (char*) buf, 2*m_url.Len()+2, m_url.wc_str() ); + virtual bool GetDataHere(void *buf) const + { + char* const dst = static_cast(buf); - return true; -} + strcpy(dst, m_url.utf8_str()); - // copy data from buffer to our data -bool wxURLDataObject::SetData(size_t len, const void *buf) -{ - if (len == 0) + return true; + } + + virtual bool SetData(size_t len, const void *buf) { - m_url = wxEmptyString; - return false; + const char* const src = static_cast(buf); + + // The string might be "\r\n"-terminated but this is not necessarily + // the case (e.g. when dragging an URL from Firefox, it isn't). + if ( len > 1 && src[len - 1] == '\n' ) + { + if ( len > 2 && src[len - 2] == '\r' ) + len--; + + len--; + } + + m_url = wxString::FromUTF8(src, len); + + return true; + } + + // Must provide overloads to avoid hiding them (and warnings about it) + virtual size_t GetDataSize(const wxDataFormat&) const + { + return GetDataSize(); + } + virtual bool GetDataHere(const wxDataFormat&, void *buf) const + { + return GetDataHere(buf); + } + virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) + { + return SetData(len, buf); } - wxCSConv conv( "UCS2" ); - wxWCharBuffer res = conv.cMB2WC( (const char*) buf ); - m_url = res; - int pos = m_url.Find( '\n' ); - if (pos != wxNOT_FOUND) - m_url.Remove( pos, m_url.Len() - pos ); +private: + wxString m_url; +}; - return true; +wxURLDataObject::wxURLDataObject(const wxString& url) : + m_dobjURIList(new wxTextURIListDataObject(url)), + m_dobjText(new wxTextDataObject(url)) +{ + // Use both URL-specific format and a plain text one to ensure that URLs + // can be pasted into any application. + Add(m_dobjURIList, true /* preferred */); + Add(m_dobjText); +} + +void wxURLDataObject::SetURL(const wxString& url) +{ + m_dobjURIList->SetURL(url); + m_dobjText->SetText(url); } +wxString wxURLDataObject::GetURL() const +{ + if ( GetReceivedFormat() == g_fileAtom ) + { + // If we received the URL as an URI, use it. + return m_dobjURIList->GetURL(); + } + else // Otherwise we either got it as text or didn't get anything yet. + { + // In either case using the text format should be fine. + return m_dobjText->GetText(); + } +} #endif // wxUSE_DATAOBJ