#include "wx/utils.h"
#include "wx/metafile.h"
#include "wx/clipbrd.h"
+#include "wx/intl.h"
+
+#define wxUSE_DATAOBJ 1
#include <string.h>
-#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 ;
+ 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
*/
-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)
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.GetType() )
+ {
+ 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;
}
void wxClipboard::SetClipboardString(char *str, long time)
-{/*
+{
bool got_selection;
if (clipOwner) {
delete[] cbString;
cbString = NULL;
}
- */
}
-
char *wxClipboard::GetClipboardString(long time)
{
char *str;
return str;
}
+
char *wxClipboard::GetClipboardData(char *format, long *length, long time)
{
if (clipOwner) {
return receivedString;
}
}
+*/