///////////////////////////////////////////////////////////////////////////////
-// Name: mac/dataobj.cpp
+// Name: src/mac/carbon/dataobj.cpp
// Purpose: implementation of wxDataObject class
// Author: Stefan Csomor
// Modified by:
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
-// ============================================================================
-// declarations
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-// headers
-// ----------------------------------------------------------------------------
-
-#ifdef __GNUG__
- #pragma implementation "dataobj.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
+#if wxUSE_DATAOBJ
+
+#include "wx/dataobj.h"
+
#ifndef WX_PRECOMP
-#include "wx/intl.h"
+ #include "wx/intl.h"
+ #include "wx/log.h"
+ #include "wx/dcmemory.h"
+ #include "wx/image.h"
#endif
-#include "wx/defs.h"
-#include "wx/log.h"
-#include "wx/dataobj.h"
#include "wx/mstream.h"
-#include "wx/image.h"
+#include "wx/metafile.h"
+#include "wx/tokenzr.h"
+
#include "wx/mac/private.h"
+
+#ifndef __DARWIN__
#include <Scrap.h>
+#endif
-// ----------------------------------------------------------------------------
-// functions
-// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// wxDataFormat
m_format = 0;
}
-wxDataFormat::wxDataFormat( wxDataFormatId vType )
+wxDataFormat::wxDataFormat( wxDataFormatId vType )
{
- SetType(vType);
+ SetType( vType );
}
-wxDataFormat::wxDataFormat( const wxChar* zId)
+wxDataFormat::wxDataFormat( const wxChar *zId )
{
- SetId(zId);
+ SetId( zId );
}
-wxDataFormat::wxDataFormat( const wxString& rId)
+wxDataFormat::wxDataFormat( const wxString& rId )
{
- SetId(rId);
+ SetId( rId );
}
-wxDataFormat::wxDataFormat( NativeFormat vFormat)
+wxDataFormat::wxDataFormat( NativeFormat vFormat )
{
- SetId(vFormat);
+ SetId( vFormat );
}
-void wxDataFormat::SetType( wxDataFormatId Type )
+void wxDataFormat::SetType( wxDataFormatId dataType )
{
- m_type = Type;
+ m_type = dataType;
- if (m_type == wxDF_TEXT )
+ switch (m_type)
+ {
+ case wxDF_TEXT:
m_format = kScrapFlavorTypeText;
- else if (m_type == wxDF_UNICODETEXT )
- m_format = kScrapFlavorTypeUnicode ;
- else if (m_type == wxDF_BITMAP || m_type == wxDF_METAFILE )
+ break;
+
+ case wxDF_UNICODETEXT:
+ m_format = kScrapFlavorTypeUnicode;
+ break;
+
+ case wxDF_BITMAP:
+ case wxDF_METAFILE:
m_format = kScrapFlavorTypePicture;
- else if (m_type == wxDF_FILENAME)
- m_format = kDragFlavorTypeHFS ;
- else
- {
- wxFAIL_MSG( wxT("invalid dataformat") );
+ break;
- // this is '????' but it can't be used in the code because ??' is
- // parsed as a trigraph!
+ case wxDF_FILENAME:
+ m_format = kDragFlavorTypeHFS;
+ break;
+
+ default:
+ wxFAIL_MSG( wxT("invalid data format") );
+
+ // NB: this translates to '????' ASCII but it can't be used in the code
+ // because '??' will get parsed as a trigraph!
m_format = 0x3f3f3f3f;
+ break;
}
}
wxString wxDataFormat::GetId() const
{
- // note that m_format is not a pointer to string, it *is* itself a 4
- // character string
- char text[5] ;
- strncpy( text , (char*) &m_format , 4 ) ;
- text[4] = 0 ;
+ wxCHECK_MSG( !IsStandard(), wxEmptyString,
+ wxT("name of predefined format cannot be retrieved") );
- return wxString::FromAscii( text ) ;
+ return m_id;
}
-void wxDataFormat::SetId( NativeFormat format )
+void wxDataFormat::SetId( NativeFormat format )
{
m_format = format;
- if (m_format == kScrapFlavorTypeText)
+ switch (m_format)
+ {
+ case kScrapFlavorTypeText:
m_type = wxDF_TEXT;
- else if (m_format == kScrapFlavorTypeUnicode )
+ break;
+
+ case kScrapFlavorTypeUnicode:
m_type = wxDF_UNICODETEXT;
- else if (m_format == kScrapFlavorTypePicture)
+ break;
+
+ case kScrapFlavorTypePicture:
m_type = wxDF_BITMAP;
- else if (m_format == kDragFlavorTypeHFS )
+ break;
+
+ case kDragFlavorTypeHFS:
m_type = wxDF_FILENAME;
- else
+ break;
+
+ default:
m_type = wxDF_PRIVATE;
+ char text[5];
+ memcpy( text, (const char*)&format, 4 );
+ text[4] = 0;
+ m_id = wxString::FromAscii( text );
+ break;
+ }
}
void wxDataFormat::SetId( const wxChar* zId )
{
m_type = wxDF_PRIVATE;
- m_format = 0;// TODO: get the format gdk_atom_intern( wxMBSTRINGCAST tmp.mbc_str(), FALSE );
+ m_id = zId;
+ m_format = 'WXPR';
+}
+
+bool wxDataFormat::operator==(const wxDataFormat& format) const
+{
+ if (IsStandard() || format.IsStandard())
+ return (format.m_type == m_type);
+ else
+ return (m_id == format.m_id);
}
//-------------------------------------------------------------------------
{
}
-bool wxDataObject::IsSupportedFormat(
- const wxDataFormat& rFormat
-, Direction vDir
-) const
+bool wxDataObject::IsSupportedFormat( const wxDataFormat& rFormat, Direction vDir ) const
{
- size_t nFormatCount = GetFormatCount(vDir);
+ size_t nFormatCount = GetFormatCount( vDir );
+ bool found = false;
if (nFormatCount == 1)
{
- return rFormat == GetPreferredFormat();
+ found = (rFormat == GetPreferredFormat());
}
else
{
- wxDataFormat* pFormats = new wxDataFormat[nFormatCount];
- GetAllFormats( pFormats
- ,vDir
- );
-
- size_t n;
+ wxDataFormat *pFormats = new wxDataFormat[nFormatCount];
+ GetAllFormats( pFormats, vDir );
- for (n = 0; n < nFormatCount; n++)
+ for (size_t n = 0; n < nFormatCount; n++)
{
if (pFormats[n] == rFormat)
+ {
+ found = true;
break;
+ }
}
delete [] pFormats;
-
- // found?
- return n < nFormatCount;
}
+
+ return found;
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#if wxUSE_UNICODE
-void wxTextDataObject::GetAllFormats(wxDataFormat *formats, wxDataObjectBase::Direction dir) const
+void wxTextDataObject::GetAllFormats( wxDataFormat *formats, wxDataObjectBase::Direction dir ) const
{
*formats++ = wxDataFormat( wxDF_TEXT );
*formats = wxDataFormat( wxDF_UNICODETEXT );
}
-
#endif
// ----------------------------------------------------------------------------
// wxFileDataObject
// ----------------------------------------------------------------------------
-bool wxFileDataObject::GetDataHere(
- void* pBuf
-) const
+void wxFileDataObject::GetFileNames( wxCharBuffer &buf ) const
{
- wxString sFilenames;
+ wxString filenames;
for (size_t i = 0; i < m_filenames.GetCount(); i++)
{
- sFilenames += m_filenames[i];
- sFilenames += (wxChar)0;
+ filenames += m_filenames[i];
+ filenames += wxT('\n');
}
- memcpy(pBuf, sFilenames.mbc_str(), sFilenames.Len() + 1);
- return TRUE;
+ buf = filenames.fn_str();
+}
+
+bool wxFileDataObject::GetDataHere( void *pBuf ) const
+{
+ if (pBuf == NULL)
+ return false;
+
+ wxCharBuffer buf;
+ size_t buffLength;
+
+ GetFileNames( buf );
+ buffLength = strlen( buf );
+ memcpy( pBuf, (const char*)buf, buffLength + 1 );
+
+ return true;
}
size_t wxFileDataObject::GetDataSize() const
{
- size_t nRes = 0;
+ wxCharBuffer buf;
+ size_t buffLength;
- for (size_t i = 0; i < m_filenames.GetCount(); i++)
- {
- nRes += m_filenames[i].Len();
- nRes += 1;
- }
+ GetFileNames( buf );
+ buffLength = strlen( buf );
- return nRes + 1;
+ return buffLength + 1;
}
-bool wxFileDataObject::SetData(
- size_t WXUNUSED(nSize)
-, const void* pBuf
-)
+bool wxFileDataObject::SetData( size_t nSize, const void *pBuf )
{
- m_filenames.Empty();
+ wxString filenames;
- // only add if this is not an empty string
- // we can therefore clear the list by just setting an empty string
- if ( (*(char*)pBuf) != 0 )
- AddFile(wxString::FromAscii((char*)pBuf));
+#if wxUSE_UNICODE
+ filenames = wxString( (const char*)pBuf, *wxConvFileName );
+#else
+ filenames = wxString (wxConvLocal.cWC2WX(wxConvFileName->cMB2WC( (const char*)pBuf)));
+#endif
- return TRUE;
+ m_filenames = wxStringTokenize( filenames, wxT("\n"), wxTOKEN_STRTOK );
+
+ return true;
}
-void wxFileDataObject::AddFile(
- const wxString& rFilename
-)
+void wxFileDataObject::AddFile( const wxString& rFilename )
{
- m_filenames.Add(rFilename);
+ m_filenames.Add( rFilename );
}
// ----------------------------------------------------------------------------
Init();
}
-wxBitmapDataObject::wxBitmapDataObject(
- const wxBitmap& rBitmap
-)
-: wxBitmapDataObjectBase(rBitmap)
+wxBitmapDataObject::wxBitmapDataObject( const wxBitmap& rBitmap )
+: wxBitmapDataObjectBase( rBitmap )
{
Init();
- if ( m_bitmap.Ok() )
+
+ if (m_bitmap.Ok())
{
- m_pictHandle = m_bitmap.GetPict( &m_pictCreated ) ;
+ m_pictHandle = m_bitmap.GetBitmapData()->GetPictHandle();
+ m_pictCreated = false;
}
}
Clear();
}
-void wxBitmapDataObject::SetBitmap(
- const wxBitmap& rBitmap
-)
+void wxBitmapDataObject::SetBitmap( const wxBitmap& rBitmap )
{
Clear();
- wxBitmapDataObjectBase::SetBitmap(rBitmap);
- if ( m_bitmap.Ok() )
+ wxBitmapDataObjectBase::SetBitmap( rBitmap );
+ if (m_bitmap.Ok())
{
- m_pictHandle = m_bitmap.GetPict( &m_pictCreated ) ;
+ m_pictHandle = m_bitmap.GetBitmapData()->GetPictHandle();
+ m_pictCreated = false;
}
}
-void wxBitmapDataObject::Init()
-{
- m_pictHandle = NULL ;
- m_pictCreated = false ;
-}
+void wxBitmapDataObject::Init()
+{
+ m_pictHandle = NULL;
+ m_pictCreated = false;
+}
-void wxBitmapDataObject::Clear()
+void wxBitmapDataObject::Clear()
{
- if ( m_pictCreated && m_pictHandle )
+ if (m_pictHandle != NULL)
{
- KillPicture( (PicHandle) m_pictHandle ) ;
+#ifndef __LP64__
+ if (m_pictCreated)
+ KillPicture( (PicHandle)m_pictHandle );
+#endif
+ m_pictHandle = NULL;
}
- m_pictHandle = NULL ;
+
+ m_pictCreated = false;
}
-bool wxBitmapDataObject::GetDataHere(
- void* pBuf
-) const
+bool wxBitmapDataObject::GetDataHere( void *pBuf ) const
{
- if (!m_pictHandle)
+ if (m_pictHandle == NULL)
{
- wxFAIL_MSG(wxT("attempt to copy empty bitmap failed"));
- return FALSE;
+ wxFAIL_MSG( wxT("attempt to copy empty bitmap failed") );
+ return false;
}
- memcpy(pBuf, *(Handle)m_pictHandle, GetHandleSize((Handle)m_pictHandle));
- return TRUE;
+
+ if (pBuf == NULL)
+ return false;
+
+ memcpy( pBuf, *(Handle)m_pictHandle, GetHandleSize( (Handle)m_pictHandle ) );
+
+ return true;
}
size_t wxBitmapDataObject::GetDataSize() const
{
- return GetHandleSize((Handle)m_pictHandle) ;
+ if (m_pictHandle != NULL)
+ return GetHandleSize( (Handle)m_pictHandle );
+ else
+ return 0;
}
-bool wxBitmapDataObject::SetData(
- size_t nSize
-, const void* pBuf
-)
+bool wxBitmapDataObject::SetData( size_t nSize, const void *pBuf )
{
Clear();
- PicHandle picHandle = (PicHandle) NewHandle( nSize ) ;
- memcpy( *picHandle , pBuf , nSize ) ;
- m_pictHandle = picHandle ;
- m_pictCreated = false ;
- Rect frame = (**picHandle).picFrame ;
-
- m_bitmap.SetPict( picHandle ) ;
- m_bitmap.SetWidth( frame.right - frame.left ) ;
- m_bitmap.SetHeight( frame.bottom - frame.top ) ;
+
+ if ((pBuf == NULL) || (nSize == 0))
+ return false;
+
+ PicHandle picHandle = (PicHandle)NewHandle( nSize );
+ memcpy( *picHandle, pBuf, nSize );
+ m_pictHandle = picHandle;
+
+ // ownership is transferred to the bitmap
+ m_pictCreated = false;
+#ifndef __LP64__
+ Rect frame;
+ wxMacGetPictureBounds( picHandle, &frame );
+
+ wxMetafile mf;
+ mf.SetHMETAFILE( (WXHMETAFILE)m_pictHandle );
+ wxMemoryDC mdc;
+ m_bitmap.Create( frame.right - frame.left, frame.bottom - frame.top );
+ mdc.SelectObject( m_bitmap );
+ mf.Play( &mdc );
+ mdc.SelectObject( wxNullBitmap );
+#endif
+
return m_bitmap.Ok();
}
+
+#endif