// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-#pragma implementation
-#pragma implementation "clipbrd.h"
-#endif
+#include "wx/wxprec.h"
+
+#if wxUSE_CLIPBOARD
#include "wx/app.h"
#include "wx/frame.h"
#endif
void * data = NULL ;
Size byteCount;
-
+
switch (dataFormat.GetType())
{
case wxDF_OEMTEXT:
dataFormat = wxDF_TEXT;
// fall through
-
+
case wxDF_TEXT:
break;
+ case wxDF_UNICODETEXT:
+ break;
case wxDF_BITMAP :
case wxDF_METAFILE :
break ;
default:
- {
- wxLogError(_("Unsupported clipboard format."));
- return NULL;
- }
+ // custom datatype
+ break ;
}
-
+
#if TARGET_CARBON
ScrapRef scrapRef;
-
+
err = GetCurrentScrap( &scrapRef );
- if ( err != noTypeErr && err != memFullErr )
+ if ( err != noTypeErr && err != memFullErr )
{
ScrapFlavorFlags flavorFlags;
-
+
if (( err = GetScrapFlavorFlags( scrapRef, dataFormat.GetFormatId(), &flavorFlags )) == noErr)
{
if (( err = GetScrapFlavorSize( scrapRef, dataFormat.GetFormatId(), &byteCount )) == noErr)
{
+ Size allocSize = byteCount ;
if ( dataFormat.GetType() == wxDF_TEXT )
- byteCount++ ;
-
- data = new char[ byteCount ] ;
+ allocSize += 1 ;
+ else if ( dataFormat.GetType() == wxDF_UNICODETEXT )
+ allocSize += 2 ;
+
+ data = new char[ allocSize ] ;
+
if (( err = GetScrapFlavorData( scrapRef, dataFormat.GetFormatId(), &byteCount , data )) == noErr )
{
- *len = byteCount ;
- if ( dataFormat.GetType() == wxDF_TEXT )
+ *len = allocSize ;
+ if ( dataFormat.GetType() == wxDF_TEXT )
((char*)data)[byteCount] = 0 ;
+ if ( dataFormat.GetType() == wxDF_UNICODETEXT )
+ {
+ // "data" format is UTF16, so 2 bytes = one character
+ // wxChar size depends on platform, so just clear last 2 bytes
+ ((char*)data)[byteCount] = 0;
+ ((char*)data)[byteCount+1] = 0;
+ }
}
else
{
}
}
}
-
+
#else
long offset ;
Handle datahandle = NewHandle(0) ;
if ( GetHandleSize( datahandle ) > 0 )
{
byteCount = GetHandleSize( datahandle ) ;
- if ( dataFormat.GetType() == wxDF_TEXT )
- data = new char[ byteCount + 1] ;
- else
- data = new char[ byteCount ] ;
-
+ Size allocSize = byteCount ;
+ if ( dataFormat.GetType() == wxDF_TEXT )
+ allocSize += 1 ;
+ else if ( dataFormat.GetType() == wxDF_UNICODETEXT )
+ allocSize += 2 ;
+
+ data = new char[ allocSize ] ;
+
memcpy( (char*) data , (char*) *datahandle , byteCount ) ;
- if ( dataFormat.GetType() == wxDF_TEXT )
+ if ( dataFormat.GetType() == wxDF_TEXT )
((char*)data)[byteCount] = 0 ;
+ if ( dataFormat.GetType() == wxDF_UNICODETEXT )
+ ((wxChar*)data)[byteCount/2] = 0 ;
*len = byteCount ;
}
DisposeHandle( datahandle ) ;
if ( err )
{
wxLogSysError(_("Failed to get clipboard data."));
-
+
return NULL ;
}
- if ( dataFormat.GetType() == wxDF_TEXT && wxApp::s_macDefaultEncodingIsPC )
+
+ if ( dataFormat.GetType() == wxDF_TEXT )
{
- wxMacConvertToPC((char*)data,(char*)data,byteCount) ;
+ wxMacConvertNewlines10To13( (char*) data ) ;
}
+
return data;
}
bool wxClipboard::Flush()
{
- return FALSE;
+ return false;
}
bool wxClipboard::Open()
{
- wxCHECK_MSG( !m_open, FALSE, wxT("clipboard already open") );
+ wxCHECK_MSG( !m_open, false, wxT("clipboard already open") );
m_open = true ;
return true ;
}
bool wxClipboard::SetData( wxDataObject *data )
{
- wxCHECK_MSG( m_open, FALSE, wxT("clipboard not open") );
+ wxCHECK_MSG( m_open, false, wxT("clipboard not open") );
- wxCHECK_MSG( data, FALSE, wxT("data is invalid") );
+ wxCHECK_MSG( data, false, wxT("data is invalid") );
Clear();
-
+ // as we can only store one wxDataObject, this is the same in this
+ // implementation
return AddData( data );
}
bool wxClipboard::AddData( wxDataObject *data )
{
- wxCHECK_MSG( m_open, FALSE, wxT("clipboard not open") );
+ wxCHECK_MSG( m_open, false, wxT("clipboard not open") );
- wxCHECK_MSG( data, FALSE, wxT("data is invalid") );
+ wxCHECK_MSG( data, false, wxT("data is invalid") );
- /* we can only store one wxDataObject */
+ // we can only store one wxDataObject
Clear();
m_data = data;
- /* get formats from wxDataObjects */
+ // get formats from wxDataObjects
wxDataFormat *array = new wxDataFormat[ m_data->GetFormatCount() ];
m_data->GetAllFormats( array );
wxT("wxClipboard now supports atom %s"),
array[i].GetId().c_str() );
-#if !TARGET_CARBON
- OSErr err = noErr ;
-#else
- OSStatus err = noErr ;
-#endif
-
- switch ( array[i].GetType() )
- {
- case wxDF_TEXT:
- case wxDF_OEMTEXT:
- {
- wxTextDataObject* textDataObject = (wxTextDataObject*) data;
- wxString str(textDataObject->GetText());
- wxString mac ;
- if ( wxApp::s_macDefaultEncodingIsPC )
- {
- mac = wxMacMakeMacStringFromPC(textDataObject->GetText()) ;
- }
- else
- {
- mac = textDataObject->GetText() ;
- }
- err = UMAPutScrap( mac.Length() , 'TEXT' , (void*) mac.c_str() ) ;
- }
- break ;
-
-#if wxUSE_DRAG_AND_DROP
- case wxDF_METAFILE:
- {
- wxMetafileDataObject* metaFileDataObject =
- (wxMetafileDataObject*) data;
- wxMetafile metaFile = metaFileDataObject->GetMetafile();
- PicHandle pict = (PicHandle) metaFile.GetHMETAFILE() ;
- HLock( (Handle) pict ) ;
- err = UMAPutScrap( GetHandleSize( (Handle) pict ) , 'PICT' , *pict ) ;
- HUnlock( (Handle) pict ) ;
- }
- break ;
-#endif
- case wxDF_BITMAP:
- case wxDF_DIB:
- {
- bool created = false ;
- PicHandle pict = NULL ;
-
- wxBitmapDataObject* bitmapDataObject = (wxBitmapDataObject*) data ;
- pict = (PicHandle) bitmapDataObject->GetBitmap().GetPict( &created ) ;
-
- HLock( (Handle) pict ) ;
- err = UMAPutScrap( GetHandleSize( (Handle) pict ) , 'PICT' , *pict ) ;
- HUnlock( (Handle) pict ) ;
- if ( created )
- KillPicture( pict ) ;
- }
- default:
- break ;
- }
-
+ size_t sz = data->GetDataSize( array[i] ) ;
+ void* buf = malloc( sz + 1 ) ;
+ if ( buf )
+ {
+ // empty the buffer because in some case GetDataHere does not fill buf
+ memset(buf, 0, sz+1);
+ data->GetDataHere( array[i] , buf ) ;
+ OSType mactype = 0 ;
+ switch ( array[i].GetType() )
+ {
+ case wxDF_TEXT:
+ case wxDF_OEMTEXT:
+ mactype = kScrapFlavorTypeText ;
+ sz -= 1;
+ break ;
+ #if wxUSE_UNICODE
+ case wxDF_UNICODETEXT :
+ mactype = kScrapFlavorTypeUnicode ;
+ sz -= 2;
+ break ;
+ #endif
+ #if wxUSE_DRAG_AND_DROP
+ case wxDF_METAFILE:
+ mactype = kScrapFlavorTypePicture ;
+ break ;
+ #endif
+ case wxDF_BITMAP:
+ case wxDF_DIB:
+ mactype = kScrapFlavorTypePicture ;
+ break ;
+ default:
+ mactype = (OSType)(array[i].GetFormatId());
+ break ;
+ }
+ UMAPutScrap( sz , mactype , buf ) ;
+ free( buf ) ;
+ }
}
delete[] array;
void wxClipboard::Close()
{
+ wxCHECK_RET( m_open, wxT("clipboard not open") );
+
m_open = false ;
+
+ // Get rid of cached object. If this is not done copying from another application will
+ // only work once
+ if (m_data)
+ {
+ delete m_data;
+ m_data = (wxDataObject*) NULL;
+ }
}
bool wxClipboard::IsSupported( const wxDataFormat &dataFormat )
{
- if ( m_data )
- {
- return m_data->IsSupported( dataFormat ) ;
- }
+ if ( m_data )
+ {
+ return m_data->IsSupported( dataFormat ) ;
+ }
#if TARGET_CARBON
OSStatus err = noErr;
ScrapRef scrapRef;
-
+
err = GetCurrentScrap( &scrapRef );
- if ( err != noTypeErr && err != memFullErr )
+ if ( err != noTypeErr && err != memFullErr )
{
ScrapFlavorFlags flavorFlags;
Size byteCount;
-
+
if (( err = GetScrapFlavorFlags( scrapRef, dataFormat.GetFormatId(), &flavorFlags )) == noErr)
{
if (( err = GetScrapFlavorSize( scrapRef, dataFormat.GetFormatId(), &byteCount )) == noErr)
{
- return TRUE ;
+ return true ;
}
}
}
- return FALSE;
-
+ return false;
+
#else
long offset ;
Handle datahandle = NewHandle(0) ;
bool wxClipboard::GetData( wxDataObject& data )
{
- wxCHECK_MSG( m_open, FALSE, wxT("clipboard not open") );
+ wxCHECK_MSG( m_open, false, wxT("clipboard not open") );
size_t formatcount = data.GetFormatCount() + 1 ;
wxDataFormat *array = new wxDataFormat[ formatcount ];
if ( m_data )
{
- for (size_t i = 0; !transferred && i < formatcount ; i++)
- {
- wxDataFormat format = array[i] ;
- if ( m_data->IsSupported( format ) )
- {
- int size = m_data->GetDataSize( format );
- transferred = true ;
-
- if (size == 0)
- {
- data.SetData(format , 0 , 0 ) ;
- }
- else
+ for (size_t i = 0; !transferred && i < formatcount ; i++)
+ {
+ wxDataFormat format = array[i] ;
+ if ( m_data->IsSupported( format ) )
{
- char *d = new char[size];
- m_data->GetDataHere( format , (void*) d );
- data.SetData( format , size , d ) ;
- delete[] d ;
+ int size = m_data->GetDataSize( format );
+ transferred = true ;
+
+ if (size == 0)
+ {
+ data.SetData(format , 0 , 0 ) ;
+ }
+ else
+ {
+ char *d = new char[size];
+ m_data->GetDataHere( format , (void*) d );
+ data.SetData( format , size , d ) ;
+ delete[] d ;
+ }
}
- }
- }
+ }
}
- /* get formats from wxDataObjects */
- if ( !transferred )
+
+ // get formats from wxDataObjects
+ if ( !transferred )
{
- for (size_t i = 0; !transferred && i < formatcount ; i++)
- {
- wxDataFormat format = array[i] ;
-
- switch ( format.GetType() )
- {
- case wxDF_TEXT :
- case wxDF_OEMTEXT :
- case wxDF_BITMAP :
- case wxDF_METAFILE :
- {
- long len ;
- char* s = (char*)wxGetClipboardData(format, &len );
- if ( s )
- {
- data.SetData( format , len , s ) ;
- delete [] s;
-
- transferred = true ;
- }
- }
- break ;
-
- default :
+ for (size_t i = 0; !transferred && i < formatcount ; i++)
+ {
+ wxDataFormat format = array[i] ;
+
+ switch ( format.GetType() )
+ {
+ // NOTE: this is usable for all data types
+ case wxDF_TEXT :
+ case wxDF_UNICODETEXT:
+ case wxDF_OEMTEXT :
+ case wxDF_BITMAP :
+ case wxDF_METAFILE :
+ default :
+ {
+ long len ;
+ char* s = (char*)wxGetClipboardData(format, &len );
+ if ( s )
+ {
+ data.SetData( format , len , s ) ;
+ delete [] s;
+
+ transferred = true ;
+ }
+ }
break ;
- }
- }
+ }
+ }
}
delete[] array ;
return transferred ;
}
+
+#endif