X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e75491071dbefcada61175e3eb89ce4edf335983..4ceb1196bb688d56bbceca98c615fa7b9222ba1d:/src/mac/carbon/clipbrd.cpp diff --git a/src/mac/carbon/clipbrd.cpp b/src/mac/carbon/clipbrd.cpp index 828b8984fc..a569f8bb71 100644 --- a/src/mac/carbon/clipbrd.cpp +++ b/src/mac/carbon/clipbrd.cpp @@ -20,71 +20,342 @@ #include "wx/utils.h" #include "wx/metafile.h" #include "wx/clipbrd.h" +#include "wx/intl.h" + +#define wxUSE_DATAOBJ 1 #include +// open/close + +bool clipboard_opened = false ; + bool wxOpenClipboard() { + clipboard_opened = true ; return TRUE; } bool wxCloseClipboard() { - return FALSE; + clipboard_opened = false ; + return TRUE; } -bool wxEmptyClipboard() +bool wxIsClipboardOpened() { - ZeroScrap() ; - return FALSE; + return clipboard_opened; } -bool wxClipboardOpen() +bool wxEmptyClipboard() { - // TODO - return FALSE; + +#if TARGET_CARBON + OSStatus err ; + err = ClearCurrentScrap( ); +#else + OSErr err ; + err = ZeroScrap( ); +#endif + if ( err ) + { + wxLogSysError(_("Failed to empty the clipboard.")); + return FALSE ; + } + return TRUE; } -bool wxIsClipboardFormatAvailable(int dataFormat) +// get/set data + +// clipboard formats + +bool wxIsClipboardFormatAvailable(wxDataFormat dataFormat) { - // TODO - return FALSE; +#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; + +#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 ; +#endif } -bool wxSetClipboardData(int dataFormat, wxObject *obj, int width, int height) +bool wxSetClipboardData(wxDataFormat dataFormat,const void *data,int width , int height) { - // TODO - return FALSE; +#if !TARGET_CARBON + OSErr err = noErr ; +#else + OSStatus err = noErr ; +#endif + + switch (dataFormat.GetType()) + { + case wxDF_BITMAP: + { + /* + wxBitmap *bitmap = (wxBitmap *)data; + + HDC hdcMem = CreateCompatibleDC((HDC) NULL); + HDC hdcSrc = CreateCompatibleDC((HDC) NULL); + HBITMAP old = (HBITMAP) + ::SelectObject(hdcSrc, (HBITMAP)bitmap->GetHBITMAP()); + HBITMAP hBitmap = CreateCompatibleBitmap(hdcSrc, + bitmap->GetWidth(), + bitmap->GetHeight()); + if (!hBitmap) + { + SelectObject(hdcSrc, old); + DeleteDC(hdcMem); + DeleteDC(hdcSrc); + return FALSE; + } + + HBITMAP old1 = (HBITMAP) SelectObject(hdcMem, hBitmap); + BitBlt(hdcMem, 0, 0, bitmap->GetWidth(), bitmap->GetHeight(), + hdcSrc, 0, 0, SRCCOPY); + + // Select new bitmap out of memory DC + SelectObject(hdcMem, old1); + + // Set the data + handle = ::SetClipboardData(CF_BITMAP, hBitmap); + + // Clean up + SelectObject(hdcSrc, old); + DeleteDC(hdcSrc); + DeleteDC(hdcMem); + */ + break; + } + + case wxDF_DIB: + { + /* +#if wxUSE_IMAGE_LOADING_IN_MSW + wxBitmap *bitmap = (wxBitmap *)data; + HBITMAP hBitmap = (HBITMAP)bitmap->GetHBITMAP(); + // NULL palette means to use the system one + HANDLE hDIB = wxBitmapToDIB(hBitmap, (HPALETTE)NULL); + handle = SetClipboardData(CF_DIB, hDIB); +#endif // wxUSE_IMAGE_LOADING_IN_MSW +*/ + break; + } + +#if wxUSE_METAFILE + case wxDF_METAFILE: + { + wxMetafile *wxMF = (wxMetafile *)data; + PicHandle pict = wxMF->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_SYLK: + case wxDF_DIF: + case wxDF_TIFF: + case wxDF_PALETTE: + default: + { + wxLogError(_("Unsupported clipboard format.")); + return FALSE; + } + + case wxDF_OEMTEXT: + dataFormat = wxDF_TEXT; + // fall through + + case wxDF_TEXT: + { + wxString mac ; + if ( wxApp::s_macDefaultEncodingIsPC ) + { + mac = wxMacMakeMacStringFromPC((char *)data) ; + } + else + { + mac = (char *)data ; + } +#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 ( err ) + { + wxLogSysError(_("Failed to set clipboard data.")); + + return FALSE; + } + + return TRUE; } -wxObject *wxGetClipboardData(int dataFormat, long *len) +wxDataFormat wxEnumClipboardFormats(wxDataFormat dataFormat) { - // TODO - return NULL; + return wxDataFormat(); } -int wxEnumClipboardFormats(int dataFormat) +int wxRegisterClipboardFormat(wxChar *formatName) { - // TODO return 0; } -int wxRegisterClipboardFormat(char *formatName) +bool wxGetClipboardFormatName(wxDataFormat dataFormat, wxChar *formatName, int maxCount) { - // TODO - return 0; + return FALSE; } -bool wxGetClipboardFormatName(int dataFormat, char *formatName, int maxCount) +void *wxGetClipboardData(wxDataFormat dataFormat, long *len) { - // TODO - return FALSE; +#if !TARGET_CARBON + OSErr err = noErr ; +#else + OSStatus err = noErr ; +#endif + void * data = NULL ; + + switch (dataFormat.GetType()) + { + case wxDF_BITMAP: + case wxDF_DIB: +#if wxUSE_METAFILE + case wxDF_METAFILE: +#endif + case wxDF_SYLK: + case wxDF_DIF: + case wxDF_TIFF: + case wxDF_PALETTE: + default: + { + wxLogError(_("Unsupported clipboard format.")); + return NULL; + } + + case wxDF_OEMTEXT: + dataFormat = wxDF_TEXT; + // fall through + + case wxDF_TEXT: + break; + } + +#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[] 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 ) ; +#endif + if ( err ) + { + wxLogSysError(_("Failed to get clipboard data.")); + + return NULL ; + } + if ( dataFormat.GetType() == wxDF_TEXT && wxApp::s_macDefaultEncodingIsPC ) + { + wxMacConvertToPC((char*)data) ; + } + return data; } + /* * Generalized clipboard implementation by Matthew Flatt */ +IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxClipboardBase) + wxClipboard::wxClipboard() { m_clearOnExit = FALSE; @@ -142,9 +413,9 @@ bool wxClipboard::AddData( wxDataObject *data ) #if wxUSE_DATAOBJ wxCHECK_MSG( wxIsClipboardOpened(), FALSE, wxT("clipboard not open") ); - wxDataFormat format = data->GetFormat(); + wxDataFormat format = data->GetPreferredFormat(); - switch ( format ) + switch ( format.GetType() ) { case wxDF_TEXT: case wxDF_OEMTEXT: @@ -159,10 +430,10 @@ bool wxClipboard::AddData( wxDataObject *data ) { wxBitmapDataObject* bitmapDataObject = (wxBitmapDataObject*) data; wxBitmap bitmap(bitmapDataObject->GetBitmap()); - return wxSetClipboardData(data->GetFormat(), &bitmap); + return wxSetClipboardData(format, &bitmap); } -#if wxUSE_METAFILE +#if 0 // wxUSE_METAFILE case wxDF_METAFILE: { wxMetafileDataObject* metaFileDataObject = @@ -175,11 +446,12 @@ bool wxClipboard::AddData( wxDataObject *data ) #endif // wxUSE_METAFILE default: - return wxSetClipboardData(data); + // return wxSetClipboardData(data); + break ; } #else // !wxUSE_DATAOBJ - return FALSE; #endif + return FALSE; } void wxClipboard::Close() @@ -187,7 +459,7 @@ void wxClipboard::Close() wxCloseClipboard(); } -bool wxClipboard::IsSupported( wxDataFormat format ) +bool wxClipboard::IsSupported( const wxDataFormat &format ) { return wxIsClipboardFormatAvailable(format); } @@ -197,8 +469,8 @@ bool wxClipboard::GetData( wxDataObject& data ) #if wxUSE_DATAOBJ wxCHECK_MSG( wxIsClipboardOpened(), FALSE, wxT("clipboard not open") ); - wxDataFormat format = data.GetFormat(); - switch ( format ) + wxDataFormat format = data.GetPreferredFormat(); + switch ( format.GetType() ) { case wxDF_TEXT: case wxDF_OEMTEXT: @@ -218,7 +490,7 @@ bool wxClipboard::GetData( wxDataObject& data ) case wxDF_DIB: { wxBitmapDataObject& bitmapDataObject = (wxBitmapDataObject &)data; - wxBitmap* bitmap = (wxBitmap *)wxGetClipboardData(data->GetFormat()); + wxBitmap* bitmap = (wxBitmap *)wxGetClipboardData(format ); if ( !bitmap ) return FALSE; @@ -227,7 +499,7 @@ bool wxClipboard::GetData( wxDataObject& data ) return TRUE; } -#if wxUSE_METAFILE +#if 0 // wxUSE_METAFILE case wxDF_METAFILE: { wxMetafileDataObject& metaFileDataObject = (wxMetafileDataObject &)data;