X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ff654490b7cb185631a1dc4621094d88643ccf41..7d6a4d96961eac84d05db8bb24c64d39003f6e54:/src/gtk/dataobj.cpp diff --git a/src/gtk/dataobj.cpp b/src/gtk/dataobj.cpp index 6ea3dc4f2f..c742b77f15 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; } @@ -143,22 +153,26 @@ void wxDataFormat::PrepareFormats() { // VZ: GNOME included in RedHat 6.1 uses the MIME types below and not the // atoms STRING and file:ALL as the old code was, but normal X apps - // use STRING for text selection when transfering the data via + // use STRING for text selection when transferring the data via // clipboard, for example, so do use STRING for now (GNOME apps will // probably support STRING as well for compatibility anyhow), but use // text/uri-list for file dnd because compatibility is not important // here (with whom?) if (!g_textAtom) + { #if wxUSE_UNICODE g_textAtom = gdk_atom_intern( "UTF8_STRING", FALSE ); g_altTextAtom = gdk_atom_intern( "STRING", FALSE ); #else g_textAtom = gdk_atom_intern( "STRING" /* "text/plain" */, FALSE ); #endif + } if (!g_pngAtom) 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 ); } //------------------------------------------------------------------------- @@ -256,7 +270,7 @@ bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *buf) // (filenames prefixed by "file:") delimited by "\r\n". size includes // the trailing zero (in theory, not for Nautilus in early GNOME // versions). - + m_filenames.Empty(); const gchar *nexttemp = (const gchar*) buf; @@ -274,7 +288,7 @@ bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *buf) nexttemp = temp+len; break; } - + return true; } if (temp[len] == '\r') @@ -287,17 +301,17 @@ bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *buf) } len++; } - + if (len == 0) break; - + // required to give it a trailing zero gchar *uri = g_strndup( temp, len ); - + gchar *fn = g_filename_from_uri( uri, NULL, NULL ); - + g_free( uri ); - + if (fn) { AddFile( wxConvFileName->cMB2WX( fn ) ); @@ -379,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, @@ -402,4 +416,53 @@ void wxBitmapDataObject::DoConvertToPng() image.SaveFile(mstream, wxBITMAP_TYPE_PNG); } +// ---------------------------------------------------------------------------- +// wxURLDataObject +// ---------------------------------------------------------------------------- + +wxURLDataObject::wxURLDataObject(const wxString& url) : + wxDataObjectSimple( wxDataFormat( gdk_atom_intern("text/x-moz-url",FALSE) ) ) +{ + m_url = url; +} + +size_t wxURLDataObject::GetDataSize() const +{ + if (m_url.empty()) + return 0; + + return 2*m_url.Len()+2; +} + +bool wxURLDataObject::GetDataHere(void *buf) const +{ + if (m_url.empty()) + return false; + + wxCSConv conv( "UCS2" ); + conv.FromWChar( (char*) buf, 2*m_url.Len()+2, m_url.wc_str() ); + + return true; +} + + // copy data from buffer to our data +bool wxURLDataObject::SetData(size_t len, const void *buf) +{ + if (len == 0) + { + m_url = wxEmptyString; + return false; + } + + 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 ); + + return true; +} + + #endif // wxUSE_DATAOBJ