X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6dddc146fbea484558c02c18ea8250549329c70e..83498ef2b0a77944b3f7f3539b7bef6387c384a0:/src/os2/dataobj.cpp diff --git a/src/os2/dataobj.cpp b/src/os2/dataobj.cpp index 80c9b8479c..683c8a4ed4 100644 --- a/src/os2/dataobj.cpp +++ b/src/os2/dataobj.cpp @@ -6,7 +6,7 @@ // Created: 10/21/99 // RCS-ID: $Id$ // Copyright: (c) 1999 David Webster -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -25,12 +25,16 @@ #include "wx/wxprec.h" #ifndef WX_PRECOMP -#include "wx/intl.h" + #include "wx/defs.h" + #include "wx/intl.h" + #include "wx/log.h" #endif -#include "wx/defs.h" -#include "wx/log.h" +#if wxUSE_DATAOBJ + #include "wx/dataobj.h" +#include "wx/mstream.h" +#include "wx/image.h" #define INCL_DOS #include @@ -39,188 +43,200 @@ // functions // ---------------------------------------------------------------------------- -#ifdef __WXDEBUG__ - static const wxChar *GetTymedName(DWORD tymed); -#endif // Debug - // ---------------------------------------------------------------------------- // wxDataFormat // ---------------------------------------------------------------------------- -wxDataFormat::wxDataFormat( - wxDataFormatId vType -) -{ - PrepareFormats(); - m_vType = wxDF_INVALID; - m_vFormat = 0; -} - -wxDataFormat::wxDataFormat( - wxDataFormatId vType -) +wxString wxDataFormat::GetId() const { - PrepareFormats(); - SetType(vType); -} + wxChar zBuf[256]; + wxString sRet; + + ::WinQueryAtomName( ::WinQuerySystemAtomTable() + ,m_uFormat + ,(PSZ)zBuf + ,256 + ); + sRet = zBuf; + return sRet; +} // end of wxDataFormat::GetId() -wxDataFormat::wxDataFormat( +void wxDataFormat::SetId ( const wxChar* zId ) { - PrepareFormats(); - SetId(zId); -} + m_uFormat = ::WinAddAtom( ::WinQuerySystemAtomTable() + ,(PSZ)zId + ); +} // end of wxDataFormat::SetId -wxDataFormat::wxDataFormat( - const wxString& rId -) +class CIDataObject { - PrepareFormats(); - SetId(rId); -} - -wxDataFormat::wxDataFormat( - NativeFormat vFormat -) +public: + CIDataObject(wxDataObject* pDataObject); + ~CIDataObject(); + + // + // Operations on the DRAGITEM struct + // + bool GetData( const wxDataFormat& rFormat + ,char* pzBuffer + ,ULONG ulLen + ); + void GetDataHere( const wxDataFormat& rFormat + ,char* pzBuffer + ,ULONG ulLen + ); + void QueryGetData(const wxDataFormat& rFormat); + void SetData( const wxDataFormat& rFormat + ,char* pzBuffer + ); +private: + wxDataObject* m_pDataObject; // pointer to C++ class we belong to + DRAGITEM m_vDragItem; +}; // end of CLASS CIDataObject + +bool CIDataObject::GetData ( const wxDataFormat& rFormat, + char* pzBuffer, + ULONG ulLen ) { - PrepareFormats(); - SetId(vFormat); -} + QueryGetData(rFormat); + if (rFormat.GetType() == wxDF_INVALID) + return FALSE; -void wxDataFormat::SetType( - wxDataFormatId vType -) -{ - m_vType = vType; - - if (m_vType == wxDF_TEXT) - m_vFormat = 0; - else - if (m_vType == wxDF_BITMAP) - m_vFormat = 0; - else - if (m_vType == wxDF_FILENAME) - m_vFormat = 0; - else + ULONG ulSize = m_pDataObject->GetDataSize(rFormat); + + if (ulSize == 0) { - wxFAIL_MSG( wxT("invalid dataformat") ); + // + // It probably means that the method is just not implemented + // + return FALSE; + } + if (rFormat.GetType() == wxDF_PRIVATE) + { + // + // For custom formats, put the size with the data - alloc the + // space for it + // + ulSize += sizeof(ULONG); } -} -wxDataFormatId wxDataFormat::GetType() const -{ - return m_vType; -} + if (ulSize > ulLen) // not enough room to copy + return FALSE; -wxString wxDataFormat::GetId() const + // + // Copy the data + // + GetDataHere( rFormat + ,pzBuffer + ,ulSize + ); + return true; +} // end of CIDataObject::GetData + +void CIDataObject::GetDataHere( + const wxDataFormat& rFormat +, char* pzBuffer +, ULONG WXUNUSED(ulLen) +) { - wxString sRet(""); // TODO: gdk_atom_name( m_format ) ); - return sRet; -} + m_pDataObject->GetDataHere( rFormat + ,(void*)pzBuffer + ); +} // end of CIDataObject::GetDataHere -void wxDataFormat::SetId( - NativeFormat vFormat +void CIDataObject::QueryGetData ( + const wxDataFormat& rFormat ) { - m_vFormat = vFormat; -// TODO: -/* - if (m_format == g_textAtom) - m_type = wxDF_TEXT; - else - if (m_format == g_pngAtom) - m_type = wxDF_BITMAP; - else - if (m_format == g_fileAtom) - m_type = wxDF_FILENAME; - else - m_type = wxDF_PRIVATE; -*/ -} + m_pDataObject->IsSupportedFormat(rFormat); +} // end of CIDataObject::QueryGetData -void wxDataFormat::SetId( - const wxChar* zId +void CIDataObject::SetData ( + const wxDataFormat& rFormat +, char* pzBuffer ) { - wxString tmp(zId); + ULONG ulSize = 0; - m_vType = wxDF_PRIVATE; - m_vFormat = 0;// TODO: get the format gdk_atom_intern( wxMBSTRINGCAST tmp.mbc_str(), FALSE ); -} + switch (rFormat.GetType()) + { + case wxDF_TEXT: + case wxDF_OEMTEXT: + case wxDF_FILENAME: + case wxDF_HTML: + ulSize = strlen((const char *)pzBuffer); + break; + +#if wxUSE_UNICODE + case wxDF_UNICODETEXT: + ulSize = ::wcslen((const wchar_t *)pzBuffer); + break; +#endif -void wxDataFormat::PrepareFormats() -{ -// TODO: -/* - if (!g_textAtom) - g_textAtom = gdk_atom_intern( "STRING", FALSE ); - if (!g_pngAtom) - g_pngAtom = gdk_atom_intern( "image/png", FALSE ); - if (!g_fileAtom) - g_fileAtom = gdk_atom_intern( "file:ALL", FALSE ); -*/ -} + case wxDF_BITMAP: + case wxDF_METAFILE: + case wxDF_ENHMETAFILE: + case wxDF_TIFF: + case wxDF_DIB: + ulSize = 0; // pass via a handle + break; + + + case wxDF_SYLK: + case wxDF_DIF: + case wxDF_PALETTE: + case wxDF_PENDATA: + case wxDF_RIFF: + case wxDF_WAVE: + case wxDF_LOCALE: + //PUNT + break; + + case wxDF_PRIVATE: + size_t* p = (size_t *)pzBuffer; + + ulSize = *p++; + pzBuffer = (char*)p; + break; + } + m_pDataObject->SetData( rFormat + ,ulSize + ,(void*)pzBuffer + ); +} // end of CIDataObject::SetData //------------------------------------------------------------------------- // wxDataObject //------------------------------------------------------------------------- -wxDataObject::wxDataObject() +wxDataObject::wxDataObject () { -} + m_pDataObject = new DRAGITEM; +} // end of wxDataObject::wxDataObject -bool wxDataObject::IsSupportedFormat( - const wxDataFormat& rFormat -, Direction vDir -) const +wxDataObject::~wxDataObject () { - size_t nFormatCount = GetFormatCount(vDir); - - if (nFormatCount == 1) - { - return rFormat == GetPreferredFormat(); - } - else - { - wxDataFormat* pFormats = new wxDataFormat[nFormatCount]; - GetAllFormats( rFormats - ,vDir - ); - - size_t n; - - for (n = 0; n < nFormatCount; n++) - { - if (rFormats[n] == rFormat) - break; - } - - delete [] rFormats; - - // found? - return n < nFormatCount; - } -} + delete m_pDataObject; +} // end of wxDataObject::~wxDataObject // ---------------------------------------------------------------------------- // wxFileDataObject // ---------------------------------------------------------------------------- -bool wxFileDataObject::GetDataHere( - void* pBuf -) const +bool wxFileDataObject::GetDataHere( void* pBuf ) const { wxString sFilenames; for (size_t i = 0; i < m_filenames.GetCount(); i++) { - filenames += m_filenames[i]; - filenames += (wxChar)0; + sFilenames += m_filenames[i]; + sFilenames += (wxChar)0; } - memcpy(pBuf, filenames.mbc_str(), filenames.Len() + 1); - return TRUE; + memcpy(pBuf, sFilenames.mbc_str(), sFilenames.Len() + 1); + return true; } size_t wxFileDataObject::GetDataSize() const @@ -236,18 +252,16 @@ size_t wxFileDataObject::GetDataSize() const return nRes + 1; } -bool wxFileDataObject::SetData( - size_t WXUNUSED(nSize) -, const void* pBuf -) +bool wxFileDataObject::SetData( size_t WXUNUSED(nSize), + const void* pBuf ) { /* TODO */ - wxString sFile( (const char *)pBuf); /* char, not wxChar */ + wxString sFile((const wxChar *)pBuf); /* char, not wxChar */ AddFile(sFile); - return TRUE; + return true; } void wxFileDataObject::AddFile( @@ -281,18 +295,14 @@ wxBitmapDataObject::~wxBitmapDataObject() Clear(); } -void wxBitmapDataObject::SetBitmap( - const wxBitmap& rBitmap -) +void wxBitmapDataObject::SetBitmap( const wxBitmap& rBitmap ) { ClearAll(); wxBitmapDataObjectBase::SetBitmap(rBitmap); DoConvertToPng(); } -bool wxBitmapDataObject::GetDataHere( - void* pBuf -) const +bool wxBitmapDataObject::GetDataHere( void* pBuf ) const { if (!m_pngSize) { @@ -300,7 +310,7 @@ bool wxBitmapDataObject::GetDataHere( return FALSE; } memcpy(pBuf, m_pngData, m_pngSize); - return TRUE; + return true; } bool wxBitmapDataObject::SetData( @@ -314,6 +324,7 @@ bool wxBitmapDataObject::SetData( memcpy(m_pngData, pBuf, m_pngSize); +#if wxUSE_STREAMS wxMemoryInputStream vMstream((char*)m_pngData, m_pngSize); wxImage vImage; wxPNGHandler vHandler; @@ -323,7 +334,9 @@ bool wxBitmapDataObject::SetData( return FALSE; } - m_bitmap = vImage.ConvertToBitmap(); + m_bitmap = wxBitmap(vImage); +#endif //wxUSE_STREAMS + return m_bitmap.Ok(); } @@ -332,16 +345,20 @@ void wxBitmapDataObject::DoConvertToPng() if (!m_bitmap.Ok()) return; - wxImage vImage(m_bitmap); +#if wxUSE_STREAMS + wxImage vImage = m_bitmap.ConvertToImage(); wxPNGHandler vHandler; wxCountingOutputStream vCount; - vHandler.SaveFile(&rImage, vCount); + vHandler.SaveFile(&vImage, vCount); m_pngSize = vCount.GetSize() + 100; // sometimes the size seems to vary ??? m_pngData = malloc(m_pngSize); - wxMemoryOutputStream mstream((char*) m_pngData, m_pngSize); + wxMemoryOutputStream vMstream((char*) m_pngData, m_pngSize); + vHandler.SaveFile(&vImage, vMstream ); +#endif } +#endif // wxUSE_DATAOBJ