X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/95fd868c8f92ed40f3a4f16a1b3a38f7ee7d44ec..b16de7461ac6d97b0b04a5ce4e73447925e93416:/src/mac/carbon/clipbrd.cpp diff --git a/src/mac/carbon/clipbrd.cpp b/src/mac/carbon/clipbrd.cpp index 7059fae3c2..20c8f1acec 100644 --- a/src/mac/carbon/clipbrd.cpp +++ b/src/mac/carbon/clipbrd.cpp @@ -1,18 +1,17 @@ ///////////////////////////////////////////////////////////////////////////// // Name: clipbrd.cpp // Purpose: Clipboard functionality -// Author: AUTHOR +// Author: Stefan Csomor // Modified by: -// Created: ??/??/98 +// Created: 1998-01-01 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR +// Copyright: (c) Stefan Csomor // 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" @@ -23,10 +22,10 @@ #include "wx/intl.h" #include "wx/log.h" -#include "wx/mac/private.h" #ifndef __DARWIN__ #include #endif +#include "wx/mac/uma.h" #define wxUSE_DATAOBJ 1 @@ -44,55 +43,69 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) #else OSStatus err = noErr ; #endif - void * data = NULL ; - Size byteCount; - + void * data = NULL ; + Size byteCount; + switch (dataFormat.GetType()) { - case wxDF_OEMTEXT: - dataFormat = wxDF_TEXT; - // fall through - - case wxDF_TEXT: - break; - default: - { - wxLogError(_("Unsupported clipboard format.")); - return NULL; - } + case wxDF_OEMTEXT: + dataFormat = wxDF_TEXT; + // fall through + + case wxDF_TEXT: + break; + case wxDF_UNICODETEXT: + break; + case wxDF_BITMAP : + case wxDF_METAFILE : + break ; + default: + // 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) { - if ( dataFormat.GetType() == wxDF_TEXT ) - byteCount++ ; - - data = new char[ byteCount ] ; - if (( err = GetScrapFlavorData( scrapRef, dataFormat.GetFormatId(), &byteCount , data )) == noErr ) - { - *len = byteCount ; - if ( dataFormat.GetType() == wxDF_TEXT ) - ((char*)data)[byteCount] = 0 ; - } - else - { - delete[] ((char *)data) ; - data = NULL ; - } + Size allocSize = byteCount ; + if ( dataFormat.GetType() == wxDF_TEXT ) + allocSize += 1 ; + else if ( dataFormat.GetType() == wxDF_UNICODETEXT ) + allocSize += 2 ; + + data = new char[ allocSize ] ; + + if (( err = GetScrapFlavorData( scrapRef, dataFormat.GetFormatId(), &byteCount , data )) == noErr ) + { + *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 + { + delete[] ((char *)data) ; + data = NULL ; + } } } } - + #else long offset ; Handle datahandle = NewHandle(0) ; @@ -101,16 +114,21 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) HUnlock( datahandle ) ; if ( GetHandleSize( datahandle ) > 0 ) { - byteCount = GetHandleSize( datahandle ) ; - if ( dataFormat.GetType() == wxDF_TEXT ) - data = new char[ byteCount + 1] ; - else - data = new char[ byteCount ] ; - - memcpy( (char*) data , (char*) *datahandle , byteCount ) ; - if ( dataFormat.GetType() == wxDF_TEXT ) - ((char*)data)[byteCount] = 0 ; - *len = byteCount ; + byteCount = GetHandleSize( datahandle ) ; + 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 ) + ((char*)data)[byteCount] = 0 ; + if ( dataFormat.GetType() == wxDF_UNICODETEXT ) + ((wxChar*)data)[byteCount/2] = 0 ; + *len = byteCount ; } DisposeHandle( datahandle ) ; #endif @@ -120,10 +138,12 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) 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; } @@ -136,8 +156,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxObject) wxClipboard::wxClipboard() { - m_open = false ; - m_data = NULL ; + m_open = false ; + m_data = NULL ; } wxClipboard::~wxClipboard() @@ -171,12 +191,12 @@ void wxClipboard::Clear() 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 ; } @@ -188,27 +208,28 @@ bool wxClipboard::IsOpened() const 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 ); @@ -218,69 +239,43 @@ bool wxClipboard::AddData( wxDataObject *data ) 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() ; - } - #if !TARGET_CARBON - err = PutScrap( mac.Length() , 'TEXT' , mac.c_str() ) ; - #else - ScrapRef scrap; - err = GetCurrentScrap (&scrap); - if ( !err ) - { - err = PutScrapFlavor (scrap, 'TEXT', 0, mac.Length(), mac.c_str()); - } - #endif - } - 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 ) ; - #if !TARGET_CARBON - err = PutScrap( GetHandleSize( (Handle) pict ) , 'PICT' , *pict ) ; - #else - ScrapRef scrap; - err = GetCurrentScrap (&scrap); - if ( !err ) - { - err = PutScrapFlavor (scrap, 'PICT', 0, GetHandleSize((Handle) pict), *pict); - } - #endif - HUnlock( (Handle) pict ) ; - } - break ; -#endif - case wxDF_BITMAP: - case wxDF_DIB: - 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; @@ -290,35 +285,45 @@ bool wxClipboard::AddData( wxDataObject *data ) 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) ; @@ -333,7 +338,7 @@ bool wxClipboard::IsSupported( const wxDataFormat &dataFormat ) 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 ]; @@ -344,58 +349,63 @@ bool wxClipboard::GetData( wxDataObject& data ) 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: - { - 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