X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/519cb848a8f4c91c73421bb75314754284e593a4..3ce946d47ef03fcf330b0a28c0ff815ea480da55:/src/mac/carbon/clipbrd.cpp?ds=sidebyside diff --git a/src/mac/carbon/clipbrd.cpp b/src/mac/carbon/clipbrd.cpp index 28a4b9ef3f..1e99ca3ce7 100644 --- a/src/mac/carbon/clipbrd.cpp +++ b/src/mac/carbon/clipbrd.cpp @@ -20,96 +20,275 @@ #include "wx/utils.h" #include "wx/metafile.h" #include "wx/clipbrd.h" +#include "wx/intl.h" + +#define wxUSE_DATAOBJ 1 #include -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxObject) -IMPLEMENT_ABSTRACT_CLASS(wxClipboardClient, wxObject) -#endif +// 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 ; + if ( GetScrap( NULL , dataFormat.GetFormatId() , &offset ) > 0 ) + { + return TRUE ; + } + return FALSE; +#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; + return NULL; } + /* * Generalized clipboard implementation by Matthew Flatt */ -wxClipboard *wxTheClipboard = NULL; +IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxClipboardBase) -void wxInitClipboard() +wxClipboard::wxClipboard() { - if (!wxTheClipboard) - wxTheClipboard = new wxClipboard; + m_clearOnExit = FALSE; } -wxClipboard::wxClipboard() +wxClipboard::~wxClipboard() { - clipOwner = NULL; - cbString = NULL; + if ( m_clearOnExit ) + { + Clear(); + } } -wxClipboard::~wxClipboard() +void wxClipboard::Clear() { - if (clipOwner) - clipOwner->BeingReplaced(); - if (cbString) - delete[] cbString; +} + +bool wxClipboard::Flush() +{ + return FALSE; +} + +bool wxClipboard::Open() +{ + return wxOpenClipboard(); +} + +bool wxClipboard::IsOpened() const +{ + return wxIsClipboardOpened(); } static int FormatStringToID(char *str) @@ -120,6 +299,130 @@ static int FormatStringToID(char *str) return wxRegisterClipboardFormat(str); } +bool wxClipboard::SetData( wxDataObject *data ) +{ + (void)wxEmptyClipboard(); + + if ( data ) + return AddData(data); + else + return TRUE; +} + +bool wxClipboard::AddData( wxDataObject *data ) +{ + wxCHECK_MSG( data, FALSE, wxT("data is invalid") ); + +#if wxUSE_DATAOBJ + wxCHECK_MSG( wxIsClipboardOpened(), FALSE, wxT("clipboard not open") ); + + wxDataFormat format = data->GetPreferredFormat(); + + switch ( format.GetType() ) + { + case wxDF_TEXT: + case wxDF_OEMTEXT: + { + wxTextDataObject* textDataObject = (wxTextDataObject*) data; + wxString str(textDataObject->GetText()); + return wxSetClipboardData(format, str.c_str()); + } + + case wxDF_BITMAP: + case wxDF_DIB: + { + wxBitmapDataObject* bitmapDataObject = (wxBitmapDataObject*) data; + wxBitmap bitmap(bitmapDataObject->GetBitmap()); + return wxSetClipboardData(format, &bitmap); + } + +#if 0 // wxUSE_METAFILE + case wxDF_METAFILE: + { + wxMetafileDataObject* metaFileDataObject = + (wxMetafileDataObject*) data; + wxMetafile metaFile = metaFileDataObject->GetMetafile(); + return wxSetClipboardData(wxDF_METAFILE, &metaFile, + metaFileDataObject->GetWidth(), + metaFileDataObject->GetHeight()); + } +#endif // wxUSE_METAFILE + + default: + // return wxSetClipboardData(data); + break ; + } +#else // !wxUSE_DATAOBJ +#endif + return FALSE; +} + +void wxClipboard::Close() +{ + wxCloseClipboard(); +} + +bool wxClipboard::IsSupported( const wxDataFormat &format ) +{ + return wxIsClipboardFormatAvailable(format); +} + +bool wxClipboard::GetData( wxDataObject& data ) +{ +#if wxUSE_DATAOBJ + wxCHECK_MSG( wxIsClipboardOpened(), FALSE, wxT("clipboard not open") ); + + wxDataFormat format = data.GetPreferredFormat(); + switch ( format ) + { + case wxDF_TEXT: + case wxDF_OEMTEXT: + { + wxTextDataObject& textDataObject = (wxTextDataObject &)data; + char* s = (char*)wxGetClipboardData(format); + if ( !s ) + return FALSE; + + textDataObject.SetText(s); + delete [] s; + + return TRUE; + } + + case wxDF_BITMAP: + case wxDF_DIB: + { + wxBitmapDataObject& bitmapDataObject = (wxBitmapDataObject &)data; + wxBitmap* bitmap = (wxBitmap *)wxGetClipboardData(format ); + if ( !bitmap ) + return FALSE; + + bitmapDataObject.SetBitmap(*bitmap); + delete bitmap; + + return TRUE; + } +#if 0 // wxUSE_METAFILE + case wxDF_METAFILE: + { + wxMetafileDataObject& metaFileDataObject = (wxMetafileDataObject &)data; + wxMetafile* metaFile = (wxMetafile *)wxGetClipboardData(wxDF_METAFILE); + if ( !metaFile ) + return FALSE; + + metaFileDataObject.SetMetafile(*metaFile); + delete metaFile; + + return TRUE; + } +#endif // wxUSE_METAFILE + } +#else // !wxUSE_DATAOBJ + wxFAIL_MSG( wxT("no clipboard implementation") ); +#endif + return FALSE; +} +/* void wxClipboard::SetClipboardClient(wxClipboardClient *client, long time) { bool got_selection; @@ -167,7 +470,7 @@ wxClipboardClient *wxClipboard::GetClipboardClient() } void wxClipboard::SetClipboardString(char *str, long time) -{/* +{ bool got_selection; if (clipOwner) { @@ -193,9 +496,7 @@ void wxClipboard::SetClipboardString(char *str, long time) delete[] cbString; cbString = NULL; } - */ } - char *wxClipboard::GetClipboardString(long time) { char *str; @@ -210,6 +511,7 @@ char *wxClipboard::GetClipboardString(long time) return str; } + char *wxClipboard::GetClipboardData(char *format, long *length, long time) { if (clipOwner) { @@ -233,4 +535,5 @@ char *wxClipboard::GetClipboardData(char *format, long *length, long time) return receivedString; } } +*/