]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/mac/carbon/dataobj.cpp
fixed crash introduced in v1.41
[wxWidgets.git] / src / mac / carbon / dataobj.cpp
... / ...
CommitLineData
1///////////////////////////////////////////////////////////////////////////////
2// Name: mac/dataobj.cpp
3// Purpose: implementation of wxDataObject class
4// Author: Stefan Csomor
5// Modified by:
6// Created: 10/21/99
7// RCS-ID: $Id$
8// Copyright: (c) 1999 Stefan Csomor
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#endif
28
29#include "wx/log.h"
30#include "wx/dataobj.h"
31#include "wx/dcmemory.h"
32#include "wx/mstream.h"
33#include "wx/image.h"
34#include "wx/metafile.h"
35#include "wx/mac/private.h"
36#ifndef __DARWIN__
37#include <Scrap.h>
38#endif
39
40// ----------------------------------------------------------------------------
41// functions
42// ----------------------------------------------------------------------------
43
44// ----------------------------------------------------------------------------
45// wxDataFormat
46// ----------------------------------------------------------------------------
47
48wxDataFormat::wxDataFormat()
49{
50 m_type = wxDF_INVALID;
51 m_format = 0;
52}
53
54wxDataFormat::wxDataFormat( wxDataFormatId vType )
55{
56 SetType(vType);
57}
58
59wxDataFormat::wxDataFormat( const wxChar* zId)
60{
61 SetId(zId);
62}
63
64wxDataFormat::wxDataFormat( const wxString& rId)
65{
66 SetId(rId);
67}
68
69wxDataFormat::wxDataFormat( NativeFormat vFormat)
70{
71 SetId(vFormat);
72}
73
74void wxDataFormat::SetType( wxDataFormatId Type )
75{
76 m_type = Type;
77
78 if (m_type == wxDF_TEXT )
79 m_format = kScrapFlavorTypeText;
80 else if (m_type == wxDF_UNICODETEXT )
81 m_format = kScrapFlavorTypeUnicode ;
82 else if (m_type == wxDF_BITMAP || m_type == wxDF_METAFILE )
83 m_format = kScrapFlavorTypePicture;
84 else if (m_type == wxDF_FILENAME)
85 m_format = kDragFlavorTypeHFS ;
86 else
87 {
88 wxFAIL_MSG( wxT("invalid dataformat") );
89
90 // this is '????' but it can't be used in the code because ??' is
91 // parsed as a trigraph!
92 m_format = 0x3f3f3f3f;
93 }
94}
95
96wxString wxDataFormat::GetId() const
97{
98 wxCHECK_MSG( !IsStandard(), wxEmptyString ,
99 wxT("name of predefined format cannot be retrieved") );
100
101 return m_id ;
102}
103
104void wxDataFormat::SetId( NativeFormat format )
105{
106 m_format = format;
107
108 if (m_format == kScrapFlavorTypeText)
109 m_type = wxDF_TEXT;
110 else if (m_format == kScrapFlavorTypeUnicode )
111 m_type = wxDF_UNICODETEXT;
112 else if (m_format == kScrapFlavorTypePicture)
113 m_type = wxDF_BITMAP;
114 else if (m_format == kDragFlavorTypeHFS )
115 m_type = wxDF_FILENAME;
116 else
117 {
118 m_type = wxDF_PRIVATE;
119 char text[5] ;
120 strncpy( text , (char*) &format , 4 ) ;
121 text[4] = 0 ;
122 m_id = wxString::FromAscii( text ) ;
123 }
124}
125
126void wxDataFormat::SetId( const wxChar* zId )
127{
128 m_type = wxDF_PRIVATE;
129 m_id = zId ;
130 m_format = 'WXPR' ;
131}
132
133bool wxDataFormat::operator==(const wxDataFormat& format) const
134{
135 if ( IsStandard() || format.IsStandard() )
136 {
137 return ( format.m_type == m_type ) ;
138 }
139 else
140 {
141 return ( m_id == format.m_id ) ;
142 }
143}
144
145//-------------------------------------------------------------------------
146// wxDataObject
147//-------------------------------------------------------------------------
148
149wxDataObject::wxDataObject()
150{
151}
152
153bool wxDataObject::IsSupportedFormat(
154 const wxDataFormat& rFormat
155, Direction vDir
156) const
157{
158 size_t nFormatCount = GetFormatCount(vDir);
159
160 if (nFormatCount == 1)
161 {
162 return rFormat == GetPreferredFormat();
163 }
164 else
165 {
166 wxDataFormat* pFormats = new wxDataFormat[nFormatCount];
167 GetAllFormats( pFormats
168 ,vDir
169 );
170
171 size_t n;
172
173 for (n = 0; n < nFormatCount; n++)
174 {
175 if (pFormats[n] == rFormat)
176 break;
177 }
178
179 delete [] pFormats;
180
181 // found?
182 return n < nFormatCount;
183 }
184}
185
186// ----------------------------------------------------------------------------
187// wxTextDataObject
188// ----------------------------------------------------------------------------
189
190#if wxUSE_UNICODE
191void wxTextDataObject::GetAllFormats(wxDataFormat *formats, wxDataObjectBase::Direction dir) const
192{
193 *formats++ = wxDataFormat( wxDF_TEXT );
194 *formats = wxDataFormat( wxDF_UNICODETEXT );
195}
196
197#endif
198
199// ----------------------------------------------------------------------------
200// wxFileDataObject
201// ----------------------------------------------------------------------------
202
203bool wxFileDataObject::GetDataHere(
204 void* pBuf
205) const
206{
207 wxString sFilenames;
208
209 for (size_t i = 0; i < m_filenames.GetCount(); i++)
210 {
211 sFilenames += m_filenames[i];
212 sFilenames += (wxChar)0;
213 }
214
215 memcpy(pBuf, sFilenames.mbc_str(), sFilenames.Len() + 1);
216 return TRUE;
217}
218
219size_t wxFileDataObject::GetDataSize() const
220{
221 size_t nRes = 0;
222
223 for (size_t i = 0; i < m_filenames.GetCount(); i++)
224 {
225 nRes += m_filenames[i].Len();
226 nRes += 1;
227 }
228
229 return nRes + 1;
230}
231
232bool wxFileDataObject::SetData(
233 size_t WXUNUSED(nSize)
234, const void* pBuf
235)
236{
237 m_filenames.Empty();
238
239 // only add if this is not an empty string
240 // we can therefore clear the list by just setting an empty string
241 if ( (*(char*)pBuf) != 0 )
242 AddFile(wxString::FromAscii((char*)pBuf));
243
244 return TRUE;
245}
246
247void wxFileDataObject::AddFile(
248 const wxString& rFilename
249)
250{
251 m_filenames.Add(rFilename);
252}
253
254// ----------------------------------------------------------------------------
255// wxBitmapDataObject
256// ----------------------------------------------------------------------------
257
258wxBitmapDataObject::wxBitmapDataObject()
259{
260 Init();
261}
262
263wxBitmapDataObject::wxBitmapDataObject(
264 const wxBitmap& rBitmap
265)
266: wxBitmapDataObjectBase(rBitmap)
267{
268 Init();
269 if ( m_bitmap.Ok() )
270 {
271 m_pictHandle = m_bitmap.GetBitmapData()->GetPictHandle() ;
272 m_pictCreated = false ;
273 }
274}
275
276wxBitmapDataObject::~wxBitmapDataObject()
277{
278 Clear();
279}
280
281void wxBitmapDataObject::SetBitmap(
282 const wxBitmap& rBitmap
283)
284{
285 Clear();
286 wxBitmapDataObjectBase::SetBitmap(rBitmap);
287 if ( m_bitmap.Ok() )
288 {
289 m_pictHandle = m_bitmap.GetBitmapData()->GetPictHandle() ;
290 m_pictCreated = false ;
291 }
292}
293
294void wxBitmapDataObject::Init()
295{
296 m_pictHandle = NULL ;
297 m_pictCreated = false ;
298}
299
300void wxBitmapDataObject::Clear()
301{
302 if ( m_pictCreated && m_pictHandle )
303 {
304 KillPicture( (PicHandle) m_pictHandle ) ;
305 }
306 m_pictHandle = NULL ;
307}
308
309bool wxBitmapDataObject::GetDataHere(
310 void* pBuf
311) const
312{
313 if (!m_pictHandle)
314 {
315 wxFAIL_MSG(wxT("attempt to copy empty bitmap failed"));
316 return FALSE;
317 }
318 memcpy(pBuf, *(Handle)m_pictHandle, GetHandleSize((Handle)m_pictHandle));
319 return TRUE;
320}
321
322size_t wxBitmapDataObject::GetDataSize() const
323{
324 return GetHandleSize((Handle)m_pictHandle) ;
325}
326
327bool wxBitmapDataObject::SetData(
328 size_t nSize
329, const void* pBuf
330)
331{
332 Clear();
333 PicHandle picHandle = (PicHandle) NewHandle( nSize ) ;
334 memcpy( *picHandle , pBuf , nSize ) ;
335 m_pictHandle = picHandle ;
336 // ownership is transferred to the bitmap
337 m_pictCreated = false ;
338 Rect frame = (**picHandle).picFrame ;
339
340 wxMetafile mf ;
341 mf.SetHMETAFILE( (WXHMETAFILE) m_pictHandle ) ;
342 wxMemoryDC mdc ;
343 m_bitmap.Create( frame.right - frame.left ,frame.bottom - frame.top ) ;
344 mdc.SelectObject(m_bitmap ) ;
345 mf.Play( &mdc ) ;
346 mdc.SelectObject( wxNullBitmap ) ;
347
348 return m_bitmap.Ok();
349}
350
351#endif