1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/os2/dataobj.cpp
3 // Purpose: implementation of wx[I]DataObject class
4 // Author: David Webster
8 // Copyright: (c) 1999 David Webster
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
25 #include "wx/dataobj.h"
33 #include "wx/mstream.h"
35 #include "wx/os2/private.h"
37 // ----------------------------------------------------------------------------
39 // ----------------------------------------------------------------------------
41 // ----------------------------------------------------------------------------
43 // ----------------------------------------------------------------------------
45 wxString wxDataFormat::GetId() const
50 ::WinQueryAtomName( ::WinQuerySystemAtomTable()
57 } // end of wxDataFormat::GetId()
59 void wxDataFormat::SetId (
63 m_uFormat = ::WinAddAtom( ::WinQuerySystemAtomTable()
66 } // end of wxDataFormat::SetId
71 CIDataObject(wxDataObject* pDataObject);
75 // Operations on the DRAGITEM struct
77 bool GetData( const wxDataFormat& rFormat
81 void GetDataHere( const wxDataFormat& rFormat
85 void QueryGetData(const wxDataFormat& rFormat);
86 void SetData( const wxDataFormat& rFormat
90 wxDataObject* m_pDataObject; // pointer to C++ class we belong to
92 }; // end of CLASS CIDataObject
94 bool CIDataObject::GetData ( const wxDataFormat& rFormat,
98 QueryGetData(rFormat);
99 if (rFormat.GetType() == wxDF_INVALID)
102 ULONG ulSize = m_pDataObject->GetDataSize(rFormat);
107 // It probably means that the method is just not implemented
111 if (rFormat.GetType() == wxDF_PRIVATE)
114 // For custom formats, put the size with the data - alloc the
117 ulSize += sizeof(ULONG);
120 if (ulSize > ulLen) // not enough room to copy
131 } // end of CIDataObject::GetData
133 void CIDataObject::GetDataHere(
134 const wxDataFormat& rFormat
136 , ULONG WXUNUSED(ulLen)
139 m_pDataObject->GetDataHere( rFormat
142 } // end of CIDataObject::GetDataHere
144 void CIDataObject::QueryGetData (
145 const wxDataFormat& rFormat
148 m_pDataObject->IsSupportedFormat(rFormat);
149 } // end of CIDataObject::QueryGetData
151 void CIDataObject::SetData (
152 const wxDataFormat& rFormat
158 switch (rFormat.GetType())
164 ulSize = strlen((const char *)pzBuffer);
168 case wxDF_UNICODETEXT:
169 ulSize = ::wcslen((const wchar_t *)pzBuffer);
175 case wxDF_ENHMETAFILE:
178 ulSize = 0; // pass via a handle
193 size_t* p = (size_t *)pzBuffer;
199 m_pDataObject->SetData( rFormat
203 } // end of CIDataObject::SetData
205 //-------------------------------------------------------------------------
207 //-------------------------------------------------------------------------
209 wxDataObject::wxDataObject ()
211 m_pDataObject = new DRAGITEM;
212 } // end of wxDataObject::wxDataObject
214 wxDataObject::~wxDataObject ()
216 delete m_pDataObject;
217 } // end of wxDataObject::~wxDataObject
219 // ----------------------------------------------------------------------------
221 // ----------------------------------------------------------------------------
223 bool wxFileDataObject::GetDataHere( void* pBuf ) const
227 for (size_t i = 0; i < m_filenames.GetCount(); i++)
229 sFilenames += m_filenames[i];
230 sFilenames += (wxChar)0;
233 memcpy(pBuf, sFilenames.mbc_str(), sFilenames.length() + 1);
237 size_t wxFileDataObject::GetDataSize() const
241 for (size_t i = 0; i < m_filenames.GetCount(); i++)
243 nRes += m_filenames[i].length();
250 bool wxFileDataObject::SetData( size_t WXUNUSED(nSize),
255 wxString sFile((const wxChar *)pBuf); /* char, not wxChar */
262 void wxFileDataObject::AddFile(
263 const wxString& rFilename
266 m_filenames.Add(rFilename);
269 // ----------------------------------------------------------------------------
270 // wxBitmapDataObject
271 // ----------------------------------------------------------------------------
273 wxBitmapDataObject::wxBitmapDataObject()
278 wxBitmapDataObject::wxBitmapDataObject(
279 const wxBitmap& rBitmap
281 : wxBitmapDataObjectBase(rBitmap)
288 wxBitmapDataObject::~wxBitmapDataObject()
293 void wxBitmapDataObject::SetBitmap( const wxBitmap& rBitmap )
296 wxBitmapDataObjectBase::SetBitmap(rBitmap);
300 bool wxBitmapDataObject::GetDataHere( void* pBuf ) const
304 wxFAIL_MSG(wxT("attempt to copy empty bitmap failed"));
307 memcpy(pBuf, m_pngData, m_pngSize);
311 bool wxBitmapDataObject::SetData( size_t nSize, const void* pBuf)
315 m_pngData = malloc(m_pngSize);
317 memcpy(m_pngData, pBuf, m_pngSize);
320 wxMemoryInputStream vMstream((char*)m_pngData, m_pngSize);
322 wxPNGHandler vHandler;
324 if (!vHandler.LoadFile(&vImage, vMstream))
329 m_bitmap = wxBitmap(vImage);
330 #endif //wxUSE_STREAMS
332 return m_bitmap.Ok();
335 void wxBitmapDataObject::DoConvertToPng()
341 wxImage vImage = m_bitmap.ConvertToImage();
342 wxPNGHandler vHandler;
343 wxCountingOutputStream vCount;
345 vHandler.SaveFile(&vImage, vCount);
347 m_pngSize = vCount.GetSize() + 100; // sometimes the size seems to vary ???
348 m_pngData = malloc(m_pngSize);
350 wxMemoryOutputStream vMstream((char*) m_pngData, m_pngSize);
352 vHandler.SaveFile(&vImage, vMstream );
356 #endif // wxUSE_DATAOBJ