X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d8c736e563cbf50bc5825c1a52878403ee48f513..421a84317fc3d53ac4fd64613f1af2d19018efc5:/src/mac/clipbrd.cpp diff --git a/src/mac/clipbrd.cpp b/src/mac/clipbrd.cpp index 2f7651852a..d7a5b8bc52 100644 --- a/src/mac/clipbrd.cpp +++ b/src/mac/clipbrd.cpp @@ -1,16 +1,15 @@ ///////////////////////////////////////////////////////////////////////////// // 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 -// Licence: wxWindows licence +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ -#pragma implementation #pragma implementation "clipbrd.h" #endif @@ -21,6 +20,12 @@ #include "wx/metafile.h" #include "wx/clipbrd.h" #include "wx/intl.h" +#include "wx/log.h" + +#ifndef __DARWIN__ +#include +#endif +#include "wx/mac/uma.h" #define wxUSE_DATAOBJ 1 @@ -34,79 +39,95 @@ static const wxChar *TRACE_CLIPBOARD = _T("clipboard"); void *wxGetClipboardData(wxDataFormat dataFormat, long *len) { #if !TARGET_CARBON - OSErr err = noErr ; + OSErr err = noErr ; #else - OSStatus err = noErr ; + OSStatus err = noErr ; #endif - void * data = NULL ; - + void * data = NULL ; + Size byteCount; + switch (dataFormat.GetType()) { - case wxDF_OEMTEXT: - dataFormat = wxDF_TEXT; - // fall through + 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; + } + } - case wxDF_TEXT: - break; - default: +#if TARGET_CARBON + ScrapRef scrapRef; + + err = GetCurrentScrap( &scrapRef ); + if ( err != noTypeErr && err != memFullErr ) + { + ScrapFlavorFlags flavorFlags; + + if (( err = GetScrapFlavorFlags( scrapRef, dataFormat.GetFormatId(), &flavorFlags )) == noErr) + { + if (( err = GetScrapFlavorSize( scrapRef, dataFormat.GetFormatId(), &byteCount )) == noErr) { - wxLogError(_("Unsupported clipboard format.")); - return 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 ) + ((wxChar*)data)[byteCount/2] = 0 ; + } + else + { + delete[] ((char *)data) ; + data = NULL ; + } } + } } -#if TARGET_CARBON - ScrapRef scrapRef; - - err = GetCurrentScrap( &scrapRef ); - 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) - { - 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 ; - } - } - } - } - #else - long offset ; - Handle datahandle = NewHandle(0) ; - HLock( datahandle ) ; - GetScrap( datahandle , dataFormat.GetFormatId() , &offset ) ; - HUnlock( datahandle ) ; - if ( GetHandleSize( datahandle ) > 0 ) - { - long 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 ; - } - DisposeHandle( datahandle ) ; + long offset ; + Handle datahandle = NewHandle(0) ; + HLock( datahandle ) ; + GetScrap( datahandle , dataFormat.GetFormatId() , &offset ) ; + HUnlock( datahandle ) ; + if ( GetHandleSize( datahandle ) > 0 ) + { + 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 if ( err ) { @@ -114,10 +135,21 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) return NULL ; } + if ( dataFormat.GetType() == wxDF_TEXT && wxApp::s_macDefaultEncodingIsPC ) { - wxMacConvertToPC((char*)data) ; + wxString st = wxMacMakeStringFromCString( (char*) data ) ; +#if wxUSE_UNICODE + wxCharBuffer buf = st.ToAscii() ; +#else + const char* buf = st ; +#endif + char* newdata = new char[strlen(buf)+1] ; + memcpy( newdata , buf , strlen(buf)+1 ) ; + delete[] ((char*) data ) ; + data = newdata ; } + return data; } @@ -126,12 +158,12 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) * Generalized clipboard implementation by Matthew Flatt */ -IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxClipboardBase) +IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxObject) wxClipboard::wxClipboard() { - m_open = false ; - m_data = NULL ; + m_open = false ; + m_data = NULL ; } wxClipboard::~wxClipboard() @@ -151,16 +183,16 @@ void wxClipboard::Clear() m_data = (wxDataObject*) NULL; } #if TARGET_CARBON - OSStatus err ; - err = ClearCurrentScrap( ); + OSStatus err ; + err = ClearCurrentScrap( ); #else - OSErr err ; - err = ZeroScrap( ); + OSErr err ; + err = ZeroScrap( ); #endif - if ( err ) - { + if ( err ) + { wxLogSysError(_("Failed to empty the clipboard.")); - } + } } bool wxClipboard::Flush() @@ -182,12 +214,8 @@ bool wxClipboard::IsOpened() const bool wxClipboard::SetData( wxDataObject *data ) { - wxCHECK_MSG( m_open, FALSE, wxT("clipboard not open") ); - - 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 ); } @@ -197,8 +225,6 @@ bool wxClipboard::AddData( wxDataObject *data ) wxCHECK_MSG( data, FALSE, wxT("data is invalid") ); - wxDataFormat format = data->GetPreferredFormat(); - /* we can only store one wxDataObject */ Clear(); @@ -215,9 +241,9 @@ bool wxClipboard::AddData( wxDataObject *data ) array[i].GetId().c_str() ); #if !TARGET_CARBON - OSErr err = noErr ; + OSErr err = noErr ; #else - OSStatus err = noErr ; + OSStatus err = noErr ; #endif switch ( array[i].GetType() ) @@ -227,52 +253,49 @@ bool wxClipboard::AddData( wxDataObject *data ) { 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 + wxCharBuffer buf = wxMacStringToCString( str ) ; + err = UMAPutScrap( strlen(buf) , kScrapFlavorTypeText , (void*) buf.data() ) ; } - + break ; +#if wxUSE_UNICODE + case wxDF_UNICODETEXT : + { + wxTextDataObject* textDataObject = (wxTextDataObject*) data; + wxString str(textDataObject->GetText()); + err = UMAPutScrap( str.Length() * sizeof(wxChar) , kScrapFlavorTypeUnicode , (void*) str.wc_str() ) ; + } + break ; +#endif #if wxUSE_DRAG_AND_DROP case wxDF_METAFILE: { - wxMetafileDataObject* metaFileDataObject = + wxMetafileDataObject* metaFileDataObject = (wxMetafileDataObject*) data; - wxMetafile metaFile = metaFileDataObject->GetMetafile(); - PicHandle pict = 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 ) ; + wxMetafile metaFile = metaFileDataObject->GetMetafile(); + PicHandle pict = (PicHandle) metaFile.GetHMETAFILE() ; + HLock( (Handle) pict ) ; + err = UMAPutScrap( GetHandleSize( (Handle) pict ) , kScrapFlavorTypePicture , *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 ) , kScrapFlavorTypePicture , *pict ) ; + HUnlock( (Handle) pict ) ; + if ( created ) + KillPicture( pict ) ; + } default: - break ; + break ; } } @@ -294,34 +317,34 @@ bool wxClipboard::IsSupported( const wxDataFormat &dataFormat ) return m_data->IsSupported( dataFormat ) ; } #if TARGET_CARBON - OSStatus err = noErr; - ScrapRef scrapRef; - - err = GetCurrentScrap( &scrapRef ); - 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 FALSE; - + OSStatus err = noErr; + ScrapRef scrapRef; + + err = GetCurrentScrap( &scrapRef ); + 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 FALSE; + #else - long offset ; - Handle datahandle = NewHandle(0) ; - HLock( datahandle ) ; - GetScrap( datahandle , dataFormat.GetFormatId() , &offset ) ; - HUnlock( datahandle ) ; - bool hasData = GetHandleSize( datahandle ) > 0 ; - DisposeHandle( datahandle ) ; - return hasData ; + long offset ; + Handle datahandle = NewHandle(0) ; + HLock( datahandle ) ; + GetScrap( datahandle , dataFormat.GetFormatId() , &offset ) ; + HUnlock( datahandle ) ; + bool hasData = GetHandleSize( datahandle ) > 0 ; + DisposeHandle( datahandle ) ; + return hasData ; #endif } @@ -329,7 +352,7 @@ bool wxClipboard::GetData( wxDataObject& data ) { wxCHECK_MSG( m_open, FALSE, wxT("clipboard not open") ); - int formatcount = data.GetFormatCount() + 1 ; + size_t formatcount = data.GetFormatCount() + 1 ; wxDataFormat *array = new wxDataFormat[ formatcount ]; array[0] = data.GetPreferredFormat(); data.GetAllFormats( &array[1] ); @@ -341,12 +364,12 @@ bool wxClipboard::GetData( wxDataObject& data ) for (size_t i = 0; !transferred && i < formatcount ; i++) { wxDataFormat format = array[i] ; - if ( m_data->IsSupported( format ) ) + if ( m_data->IsSupported( format ) ) { int size = m_data->GetDataSize( format ); transferred = true ; - if (size == 0) + if (size == 0) { data.SetData(format , 0 , 0 ) ; } @@ -361,7 +384,7 @@ bool wxClipboard::GetData( wxDataObject& data ) } } /* get formats from wxDataObjects */ - if ( !transferred ) + if ( !transferred ) { for (size_t i = 0; !transferred && i < formatcount ; i++) { @@ -369,8 +392,10 @@ bool wxClipboard::GetData( wxDataObject& data ) switch ( format.GetType() ) { - case wxDF_TEXT: - case wxDF_OEMTEXT: + case wxDF_TEXT : + case wxDF_OEMTEXT : + case wxDF_BITMAP : + case wxDF_METAFILE : { long len ; char* s = (char*)wxGetClipboardData(format, &len ); @@ -382,6 +407,8 @@ bool wxClipboard::GetData( wxDataObject& data ) transferred = true ; } } + break ; + default : break ; }