X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b8acf11e74d4ac25f9899d8d426ad04569c99e88..9bc3af3e642709425476f6232a19fe4f1bbb42b8:/src/gtk/dataobj.cpp diff --git a/src/gtk/dataobj.cpp b/src/gtk/dataobj.cpp index c742b77f15..db02431737 100644 --- a/src/gtk/dataobj.cpp +++ b/src/gtk/dataobj.cpp @@ -420,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; } - 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 ); + // 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); + } - return true; +private: + wxString m_url; +}; + +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