X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7c74e7fe1de14f32dcd6f3c9cdd727de540bbd0e..4ceb1196bb688d56bbceca98c615fa7b9222ba1d:/src/mac/clipbrd.cpp diff --git a/src/mac/clipbrd.cpp b/src/mac/clipbrd.cpp index 36f4c0f4d9..a569f8bb71 100644 --- a/src/mac/clipbrd.cpp +++ b/src/mac/clipbrd.cpp @@ -20,49 +20,218 @@ #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() { + clipboard_opened = false ; return TRUE; } bool wxIsClipboardOpened() { - return TRUE; + return clipboard_opened; } -// get/set data - bool wxEmptyClipboard() { - ZeroScrap() ; + +#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 wxSetClipboardData(wxDataFormat dataFormat,const void *data,int width , int height) +// get/set data + +// clipboard formats + +bool wxIsClipboardFormatAvailable(wxDataFormat dataFormat) { - 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 } -void *wxGetClipboardData(wxDataFormat dataFormat, long *len) +bool wxSetClipboardData(wxDataFormat dataFormat,const void *data,int width , int height) { - return NULL; -} +#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; + } -// clipboard formats +#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; + } -bool wxIsClipboardFormatAvailable(wxDataFormat dataFormat) -{ - 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; } wxDataFormat wxEnumClipboardFormats(wxDataFormat dataFormat) @@ -80,11 +249,112 @@ bool wxGetClipboardFormatName(wxDataFormat dataFormat, wxChar *formatName, int m return FALSE; } +void *wxGetClipboardData(wxDataFormat dataFormat, long *len) +{ +#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, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxClipboardBase) wxClipboard::wxClipboard() { @@ -143,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: @@ -160,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 = @@ -176,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() @@ -188,7 +459,7 @@ void wxClipboard::Close() wxCloseClipboard(); } -bool wxClipboard::IsSupported( wxDataFormat format ) +bool wxClipboard::IsSupported( const wxDataFormat &format ) { return wxIsClipboardFormatAvailable(format); } @@ -198,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: @@ -219,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; @@ -228,7 +499,7 @@ bool wxClipboard::GetData( wxDataObject& data ) return TRUE; } -#if wxUSE_METAFILE +#if 0 // wxUSE_METAFILE case wxDF_METAFILE: { wxMetafileDataObject& metaFileDataObject = (wxMetafileDataObject &)data;