X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/62490e9ea7b3675a8d703433b7f0f480476d5d27..14722c43c30918cd8fbba956b50ac3426d2fe339:/src/gtk/dataobj.cpp diff --git a/src/gtk/dataobj.cpp b/src/gtk/dataobj.cpp index 55c81cfc77..db02431737 100644 --- a/src/gtk/dataobj.cpp +++ b/src/gtk/dataobj.cpp @@ -420,30 +420,101 @@ void wxBitmapDataObject::DoConvertToPng() // wxURLDataObject // ---------------------------------------------------------------------------- -wxURLDataObject::wxURLDataObject(const wxString& url) : - wxDataObjectSimple( wxDataFormat( g_fileAtom ) ) +class wxTextURIListDataObject : public wxDataObjectSimple { - m_url = url; -} +public: + wxTextURIListDataObject(const wxString& url) + : wxDataObjectSimple(wxDataFormat(g_fileAtom)), + m_url(url) + { + } + + const wxString& GetURL() const { return m_url; } + void SetURL(const wxString& url) { m_url = url; } + + + 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; + } + + virtual bool GetDataHere(void *buf) const + { + char* const dst = static_cast(buf); + + strcpy(dst, m_url.utf8_str()); + + return true; + } + + virtual bool SetData(size_t len, const void *buf) + { + 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); -size_t wxURLDataObject::GetDataSize() const + 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); + } + +private: + wxString m_url; +}; + +wxURLDataObject::wxURLDataObject(const wxString& url) : + m_dobjURIList(new wxTextURIListDataObject(url)), + m_dobjText(new wxTextDataObject(url)) { - return strlen(m_url.utf8_str()) + 1; + // 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); } -bool wxURLDataObject::GetDataHere(void *buf) const +void wxURLDataObject::SetURL(const wxString& url) { - strcpy(static_cast(buf), m_url.utf8_str()); - - return true; + m_dobjURIList->SetURL(url); + m_dobjText->SetText(url); } -bool wxURLDataObject::SetData(size_t len, const void *buf) +wxString wxURLDataObject::GetURL() const { - m_url = wxString::FromUTF8(static_cast(buf), len); - - return true; + 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