]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/os2/dataobj.cpp
wxWinCE power build fixes.
[wxWidgets.git] / src / os2 / dataobj.cpp
... / ...
CommitLineData
1///////////////////////////////////////////////////////////////////////////////
2// Name: src/os2/dataobj.cpp
3// Purpose: implementation of wx[I]DataObject class
4// Author: David Webster
5// Modified by:
6// Created: 10/21/99
7// RCS-ID: $Id$
8// Copyright: (c) 1999 David Webster
9// Licence: wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#if wxUSE_DATAOBJ
24
25#ifndef WX_PRECOMP
26 #include "wx/intl.h"
27 #include "wx/log.h"
28#endif
29
30#include "wx/dataobj.h"
31#include "wx/mstream.h"
32#include "wx/image.h"
33
34#include "wx/os2/private.h"
35
36// ----------------------------------------------------------------------------
37// functions
38// ----------------------------------------------------------------------------
39
40// ----------------------------------------------------------------------------
41// wxDataFormat
42// ----------------------------------------------------------------------------
43
44wxString wxDataFormat::GetId() const
45{
46 wxChar zBuf[256];
47 wxString sRet;
48
49 ::WinQueryAtomName( ::WinQuerySystemAtomTable()
50 ,m_uFormat
51 ,(PSZ)zBuf
52 ,256
53 );
54 sRet = zBuf;
55 return sRet;
56} // end of wxDataFormat::GetId()
57
58void wxDataFormat::SetId (
59 const wxChar* zId
60)
61{
62 m_uFormat = ::WinAddAtom( ::WinQuerySystemAtomTable()
63 ,(PSZ)zId
64 );
65} // end of wxDataFormat::SetId
66
67class CIDataObject
68{
69public:
70 CIDataObject(wxDataObject* pDataObject);
71 ~CIDataObject();
72
73 //
74 // Operations on the DRAGITEM struct
75 //
76 bool GetData( const wxDataFormat& rFormat
77 ,char* pzBuffer
78 ,ULONG ulLen
79 );
80 void GetDataHere( const wxDataFormat& rFormat
81 ,char* pzBuffer
82 ,ULONG ulLen
83 );
84 void QueryGetData(const wxDataFormat& rFormat);
85 void SetData( const wxDataFormat& rFormat
86 ,char* pzBuffer
87 );
88private:
89 wxDataObject* m_pDataObject; // pointer to C++ class we belong to
90 DRAGITEM m_vDragItem;
91}; // end of CLASS CIDataObject
92
93bool CIDataObject::GetData ( const wxDataFormat& rFormat,
94 char* pzBuffer,
95 ULONG ulLen )
96{
97 QueryGetData(rFormat);
98 if (rFormat.GetType() == wxDF_INVALID)
99 return false;
100
101 ULONG ulSize = m_pDataObject->GetDataSize(rFormat);
102
103 if (ulSize == 0)
104 {
105 //
106 // It probably means that the method is just not implemented
107 //
108 return false;
109 }
110 if (rFormat.GetType() == wxDF_PRIVATE)
111 {
112 //
113 // For custom formats, put the size with the data - alloc the
114 // space for it
115 //
116 ulSize += sizeof(ULONG);
117 }
118
119 if (ulSize > ulLen) // not enough room to copy
120 return false;
121
122 //
123 // Copy the data
124 //
125 GetDataHere( rFormat
126 ,pzBuffer
127 ,ulSize
128 );
129 return true;
130} // end of CIDataObject::GetData
131
132void CIDataObject::GetDataHere(
133 const wxDataFormat& rFormat
134, char* pzBuffer
135, ULONG WXUNUSED(ulLen)
136)
137{
138 m_pDataObject->GetDataHere( rFormat
139 ,(void*)pzBuffer
140 );
141} // end of CIDataObject::GetDataHere
142
143void CIDataObject::QueryGetData (
144 const wxDataFormat& rFormat
145)
146{
147 m_pDataObject->IsSupportedFormat(rFormat);
148} // end of CIDataObject::QueryGetData
149
150void CIDataObject::SetData (
151 const wxDataFormat& rFormat
152, char* pzBuffer
153)
154{
155 ULONG ulSize = 0;
156
157 switch (rFormat.GetType())
158 {
159 case wxDF_TEXT:
160 case wxDF_OEMTEXT:
161 case wxDF_FILENAME:
162 case wxDF_HTML:
163 ulSize = strlen((const char *)pzBuffer);
164 break;
165
166#if wxUSE_UNICODE
167 case wxDF_UNICODETEXT:
168 ulSize = ::wcslen((const wchar_t *)pzBuffer);
169 break;
170#endif
171
172 case wxDF_BITMAP:
173 case wxDF_METAFILE:
174 case wxDF_ENHMETAFILE:
175 case wxDF_TIFF:
176 case wxDF_DIB:
177 ulSize = 0; // pass via a handle
178 break;
179
180
181 case wxDF_SYLK:
182 case wxDF_DIF:
183 case wxDF_PALETTE:
184 case wxDF_PENDATA:
185 case wxDF_RIFF:
186 case wxDF_WAVE:
187 case wxDF_LOCALE:
188 //PUNT
189 break;
190
191 case wxDF_PRIVATE:
192 size_t* p = (size_t *)pzBuffer;
193
194 ulSize = *p++;
195 pzBuffer = (char*)p;
196 break;
197 }
198 m_pDataObject->SetData( rFormat
199 ,ulSize
200 ,(void*)pzBuffer
201 );
202} // end of CIDataObject::SetData
203
204//-------------------------------------------------------------------------
205// wxDataObject
206//-------------------------------------------------------------------------
207
208wxDataObject::wxDataObject ()
209{
210 m_pDataObject = new DRAGITEM;
211} // end of wxDataObject::wxDataObject
212
213wxDataObject::~wxDataObject ()
214{
215 delete m_pDataObject;
216} // end of wxDataObject::~wxDataObject
217
218// ----------------------------------------------------------------------------
219// wxFileDataObject
220// ----------------------------------------------------------------------------
221
222bool wxFileDataObject::GetDataHere( void* pBuf ) const
223{
224 wxString sFilenames;
225
226 for (size_t i = 0; i < m_filenames.GetCount(); i++)
227 {
228 sFilenames += m_filenames[i];
229 sFilenames += (wxChar)0;
230 }
231
232 memcpy(pBuf, sFilenames.mbc_str(), sFilenames.Len() + 1);
233 return true;
234}
235
236size_t wxFileDataObject::GetDataSize() const
237{
238 size_t nRes = 0;
239
240 for (size_t i = 0; i < m_filenames.GetCount(); i++)
241 {
242 nRes += m_filenames[i].Len();
243 nRes += 1;
244 }
245
246 return nRes + 1;
247}
248
249bool wxFileDataObject::SetData( size_t WXUNUSED(nSize),
250 const void* pBuf )
251{
252 /* TODO */
253
254 wxString sFile((const wxChar *)pBuf); /* char, not wxChar */
255
256 AddFile(sFile);
257
258 return true;
259}
260
261void wxFileDataObject::AddFile(
262 const wxString& rFilename
263)
264{
265 m_filenames.Add(rFilename);
266}
267
268// ----------------------------------------------------------------------------
269// wxBitmapDataObject
270// ----------------------------------------------------------------------------
271
272wxBitmapDataObject::wxBitmapDataObject()
273{
274 Init();
275}
276
277wxBitmapDataObject::wxBitmapDataObject(
278 const wxBitmap& rBitmap
279)
280: wxBitmapDataObjectBase(rBitmap)
281{
282 Init();
283
284 DoConvertToPng();
285}
286
287wxBitmapDataObject::~wxBitmapDataObject()
288{
289 Clear();
290}
291
292void wxBitmapDataObject::SetBitmap( const wxBitmap& rBitmap )
293{
294 ClearAll();
295 wxBitmapDataObjectBase::SetBitmap(rBitmap);
296 DoConvertToPng();
297}
298
299bool wxBitmapDataObject::GetDataHere( void* pBuf ) const
300{
301 if (!m_pngSize)
302 {
303 wxFAIL_MSG(wxT("attempt to copy empty bitmap failed"));
304 return false;
305 }
306 memcpy(pBuf, m_pngData, m_pngSize);
307 return true;
308}
309
310bool wxBitmapDataObject::SetData( size_t nSize, const void* pBuf)
311{
312 Clear();
313 m_pngSize = nSize;
314 m_pngData = malloc(m_pngSize);
315
316 memcpy(m_pngData, pBuf, m_pngSize);
317
318#if wxUSE_STREAMS
319 wxMemoryInputStream vMstream((char*)m_pngData, m_pngSize);
320 wxImage vImage;
321 wxPNGHandler vHandler;
322
323 if (!vHandler.LoadFile(&vImage, vMstream))
324 {
325 return false;
326 }
327
328 m_bitmap = wxBitmap(vImage);
329#endif //wxUSE_STREAMS
330
331 return m_bitmap.Ok();
332}
333
334void wxBitmapDataObject::DoConvertToPng()
335{
336 if (!m_bitmap.Ok())
337 return;
338
339#if wxUSE_STREAMS
340 wxImage vImage = m_bitmap.ConvertToImage();
341 wxPNGHandler vHandler;
342 wxCountingOutputStream vCount;
343
344 vHandler.SaveFile(&vImage, vCount);
345
346 m_pngSize = vCount.GetSize() + 100; // sometimes the size seems to vary ???
347 m_pngData = malloc(m_pngSize);
348
349 wxMemoryOutputStream vMstream((char*) m_pngData, m_pngSize);
350
351 vHandler.SaveFile(&vImage, vMstream );
352#endif
353}
354
355#endif // wxUSE_DATAOBJ