X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7e99520bd3fc092bbbcbc38bb699a0236618ea40..8b49ecd77ad6163ffc378c01b7bb9e1ce152c8dd:/src/os2/dataobj.cpp?ds=sidebyside diff --git a/src/os2/dataobj.cpp b/src/os2/dataobj.cpp index 3763a035a1..5ec5bb269d 100644 --- a/src/os2/dataobj.cpp +++ b/src/os2/dataobj.cpp @@ -49,158 +49,179 @@ // wxDataFormat // ---------------------------------------------------------------------------- -wxDataFormat::wxDataFormat() -{ - m_vType = wxDF_INVALID; - m_vFormat = 0; -} - -wxDataFormat::wxDataFormat( - wxDataFormatId vType -) +wxString wxDataFormat::GetId() const { - PrepareFormats(); - SetType(vType); -} + char zBuf[256]; + wxString sRet; + + ::WinQueryAtomName( ::WinQuerySystemAtomTable() + ,m_uFormat + ,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() + ,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 -{ - wxString sRet(""); // TODO: gdk_atom_name( m_format ) ); - return sRet; -} + // + // Copy the data + // + GetDataHere( rFormat + ,pzBuffer + ,ulSize + ); + return TRUE; +} // end of CIDataObject::GetData -void wxDataFormat::SetId( - NativeFormat vFormat +void CIDataObject::GetDataHere( + const wxDataFormat& rFormat +, char* pzBuffer +, ULONG WXUNUSED(ulLen) ) { - 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->GetDataHere( rFormat + ,(void*)pzBuffer + ); +} // end of CIDataObject::GetDataHere -void wxDataFormat::SetId( - const wxChar* zId +void CIDataObject::QueryGetData ( + const wxDataFormat& rFormat ) { - wxString tmp(zId); - - m_vType = wxDF_PRIVATE; - m_vFormat = 0;// TODO: get the format gdk_atom_intern( wxMBSTRINGCAST tmp.mbc_str(), FALSE ); -} + m_pDataObject->IsSupportedFormat(rFormat); +} // end of CIDataObject::QueryGetData -void wxDataFormat::PrepareFormats() +void CIDataObject::SetData ( + const wxDataFormat& rFormat +, char* pzBuffer +) { -// 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 ); -*/ -} + ULONG ulSize; + + switch (rFormat.GetType()) + { + case wxDF_TEXT: + case wxDF_OEMTEXT: + case wxDF_FILENAME: + case wxDF_HTML: + ulSize = strlen((const char *)pzBuffer); + break; + + case wxDF_UNICODETEXT: + ulSize = ::wcslen((const wchar_t *)pzBuffer); + break; + + 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( pFormats - ,vDir - ); - - size_t n; - - for (n = 0; n < nFormatCount; n++) - { - if (pFormats[n] == rFormat) - break; - } - - delete [] pFormats; - - // found? - return n < nFormatCount; - } -} + delete m_pDataObject; +} // end of wxDataObject::~wxDataObject // ---------------------------------------------------------------------------- // wxFileDataObject @@ -323,7 +344,7 @@ bool wxBitmapDataObject::SetData( return FALSE; } - m_bitmap = vImage.ConvertToBitmap(); + m_bitmap = wxBitmap(vImage); #endif //wxUSE_STREAMS return m_bitmap.Ok(); @@ -335,7 +356,7 @@ void wxBitmapDataObject::DoConvertToPng() return; #if wxUSE_STREAMS - wxImage vImage(m_bitmap); + wxImage vImage = m_bitmap.ConvertToImage(); wxPNGHandler vHandler; wxCountingOutputStream vCount;