Use wxDataObject methods to retrieve data from clipboard when wxUSE_OLE==0

Dedicated wxDataObject::SetData() function can be used to import raw
clipboard data to the corresponding instances of wxDataObject and hence
there is no need to duplicate data retrieval code.
This commit is contained in:
Artur Wieczorek
2017-05-03 22:39:33 +02:00
parent 1da74cbcd2
commit b375d81499
2 changed files with 65 additions and 187 deletions

View File

@@ -431,146 +431,6 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
return true;
}
void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
{
void *retval = NULL;
switch ( dataFormat )
{
case wxDF_BITMAP:
{
BITMAP bm;
HBITMAP hBitmap = (HBITMAP) GetClipboardData(CF_BITMAP);
if (!hBitmap)
break;
HDC hdcMem = CreateCompatibleDC((HDC) NULL);
HDC hdcSrc = CreateCompatibleDC((HDC) NULL);
HBITMAP old = (HBITMAP) ::SelectObject(hdcSrc, hBitmap);
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
HBITMAP hNewBitmap = CreateBitmapIndirect(&bm);
if (!hNewBitmap)
{
SelectObject(hdcSrc, old);
DeleteDC(hdcMem);
DeleteDC(hdcSrc);
break;
}
HBITMAP old1 = (HBITMAP) SelectObject(hdcMem, hNewBitmap);
BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight,
hdcSrc, 0, 0, SRCCOPY);
// Select new bitmap out of memory DC
SelectObject(hdcMem, old1);
// Clean up
SelectObject(hdcSrc, old);
DeleteDC(hdcSrc);
DeleteDC(hdcMem);
// Create and return a new wxBitmap
wxBitmap *wxBM = new wxBitmap;
wxBM->SetHBITMAP((WXHBITMAP) hNewBitmap);
wxBM->SetWidth(bm.bmWidth);
wxBM->SetHeight(bm.bmHeight);
wxBM->SetDepth(bm.bmBitsPixels);
retval = wxBM;
break;
}
case wxDF_METAFILE:
case CF_SYLK:
case CF_DIF:
case CF_TIFF:
case CF_PALETTE:
case wxDF_DIB:
wxLogError(_("Unsupported clipboard format."));
return NULL;
case wxDF_OEMTEXT:
dataFormat = wxDF_TEXT;
// fall through
case wxDF_TEXT:
{
HANDLE hGlobalMemory = ::GetClipboardData(dataFormat);
if (!hGlobalMemory)
break;
DWORD hsize = ::GlobalSize(hGlobalMemory);
if (len)
*len = hsize;
char *s = new char[hsize];
if (!s)
break;
LPSTR lpGlobalMemory = (LPSTR) GlobalLock(hGlobalMemory);
memcpy(s, lpGlobalMemory, hsize);
GlobalUnlock(hGlobalMemory);
retval = s;
break;
}
case wxDF_UNICODETEXT:
{
HANDLE hGlobalMemory = ::GetClipboardData(CF_UNICODETEXT);
if ( hGlobalMemory )
{
DWORD size = ::GlobalSize(hGlobalMemory);
if ( len )
*len = size;
WCHAR* s = new WCHAR[(size + 1) / sizeof(WCHAR)];
if ( s )
{
LPWSTR lpGlobalMemory = (LPWSTR)::GlobalLock(hGlobalMemory);
memcpy(s, lpGlobalMemory, size);
::GlobalUnlock(hGlobalMemory);
retval = s;
}
}
}
break;
default:
{
HANDLE hGlobalMemory = ::GetClipboardData(dataFormat);
if ( !hGlobalMemory )
break;
DWORD size = ::GlobalSize(hGlobalMemory);
if ( len )
*len = size;
void *buf = malloc(size);
if ( !buf )
break;
LPSTR lpGlobalMemory = (LPSTR) GlobalLock(hGlobalMemory);
memcpy(buf, lpGlobalMemory, size);
GlobalUnlock(hGlobalMemory);
retval = buf;
break;
}
}
if ( !retval )
{
wxLogSysError(_("Failed to retrieve data from the clipboard."));
}
return retval;
}
#endif // !wxUSE_OLE_CLIPBOARD
wxDataFormat wxEnumClipboardFormats(wxDataFormat dataFormat)
@@ -1001,58 +861,76 @@ bool wxClipboard::GetData( wxDataObject& data )
{
case wxDF_TEXT:
case wxDF_OEMTEXT:
{
wxTextDataObject& textDataObject = (wxTextDataObject &)data;
char* s = (char*)wxGetClipboardData(format);
if ( !s )
return false;
textDataObject.SetText(wxString::FromAscii(s));
delete [] s;
return true;
}
case wxDF_UNICODETEXT:
{
wxTextDataObject& textDataObject = (wxTextDataObject &)data;
WCHAR* s = (WCHAR*)wxGetClipboardData(format);
if ( !s )
return false;
textDataObject.SetText(wxString(s));
delete[] s;
return true;
}
{
// System provides an automatic type conversion
// from CF_TEXT and CF_OEMTEXT to CF_UNICODETEXT
HANDLE hMem = ::GetClipboardData(CF_UNICODETEXT);
if ( hMem )
{
wxTextDataObject& textDataObject = (wxTextDataObject &)data;
const void* buf = ::GlobalLock(hMem);
DWORD size = ::GlobalSize(hMem);
bool ok = textDataObject.SetData(size, buf);
::GlobalUnlock(hMem);
return ok;
}
}
break;
case wxDF_BITMAP:
{
HANDLE hBmp = ::GetClipboardData(CF_BITMAP);
if ( hBmp )
{
wxBitmapDataObject2& bitmapDataObject = (wxBitmapDataObject2 &)data;
return bitmapDataObject.SetData(0, &hBmp);
}
}
break;
case wxDF_DIB:
{
wxBitmapDataObject& bitmapDataObject = (wxBitmapDataObject &)data;
wxBitmap* bitmap = (wxBitmap *)wxGetClipboardData(data.GetPreferredFormat());
if ( !bitmap )
return false;
{
HANDLE hMem = ::GetClipboardData(CF_DIB);
if ( hMem )
{
wxBitmapDataObject& bitmapDataObject = (wxBitmapDataObject &)data;
const void* buf = ::GlobalLock(hMem);
DWORD size = ::GlobalSize(hMem);
bool ok = bitmapDataObject.SetData(size, buf);
::GlobalUnlock(hMem);
return ok;
}
}
break;
bitmapDataObject.SetBitmap(*bitmap);
delete bitmap;
return true;
}
#if wxUSE_METAFILE
#if wxUSE_METAFILE && !defined(wxMETAFILE_IS_ENH)
case wxDF_METAFILE:
{
wxMetafileDataObject& metaFileDataObject = (wxMetafileDataObject &)data;
wxMetafile* metaFile = (wxMetafile *)wxGetClipboardData(wxDF_METAFILE);
if ( !metaFile )
return false;
{
HANDLE hMem = ::GetClipboardData(CF_METAFILEPICT);
if ( hMem )
{
wxMetafileDataObject& metaFileDataObject = (wxMetafileDataObject &)data;
const void* buf = ::GlobalLock(hMem);
DWORD size = ::GlobalSize(hMem);
bool ok = metaFileDataObject.SetData(wxDF_METAFILE, size, buf);
::GlobalUnlock(hMem);
return ok;
}
}
break;
#endif // wxUSE_METAFILE && !defined(wxMETAFILE_IS_ENH)
metaFileDataObject.SetMetafile(*metaFile);
delete metaFile;
return true;
}
#endif // wxUSE_METAFILE
#if wxUSE_ENH_METAFILE
case wxDF_ENHMETAFILE:
{
HANDLE hFile = ::GetClipboardData(CF_ENHMETAFILE);
if ( hFile )
{
wxMetafileDataObject& metaFileDataObject = (wxMetafileDataObject &)data;
return metaFileDataObject.SetData(wxDF_ENHMETAFILE, 0, &hFile);
}
}
break;
#endif // wxUSE_ENH_METAFILE
}
return false;
#else // !wxUSE_DATAOBJ