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:
@@ -179,7 +179,7 @@ wxMSW:
|
|||||||
wxMemoryDC (Cairo >= 1.15.4).
|
wxMemoryDC (Cairo >= 1.15.4).
|
||||||
- Fix updating bounding box in wxDC::DrawSpline().
|
- Fix updating bounding box in wxDC::DrawSpline().
|
||||||
- Fix placing 0RGB wxBitmaps on the clipboard.
|
- Fix placing 0RGB wxBitmaps on the clipboard.
|
||||||
- Fix adding wxBitmap to clipboard when wxUSE_OLE == 0.
|
- Fix handling wxClipboard data when wxUSE_OLE == 0.
|
||||||
|
|
||||||
wxOSX:
|
wxOSX:
|
||||||
|
|
||||||
|
@@ -431,146 +431,6 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
|
|||||||
|
|
||||||
return true;
|
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
|
#endif // !wxUSE_OLE_CLIPBOARD
|
||||||
|
|
||||||
wxDataFormat wxEnumClipboardFormats(wxDataFormat dataFormat)
|
wxDataFormat wxEnumClipboardFormats(wxDataFormat dataFormat)
|
||||||
@@ -1001,58 +861,76 @@ bool wxClipboard::GetData( wxDataObject& data )
|
|||||||
{
|
{
|
||||||
case wxDF_TEXT:
|
case wxDF_TEXT:
|
||||||
case wxDF_OEMTEXT:
|
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:
|
case wxDF_UNICODETEXT:
|
||||||
{
|
{
|
||||||
wxTextDataObject& textDataObject = (wxTextDataObject &)data;
|
// System provides an automatic type conversion
|
||||||
WCHAR* s = (WCHAR*)wxGetClipboardData(format);
|
// from CF_TEXT and CF_OEMTEXT to CF_UNICODETEXT
|
||||||
if ( !s )
|
HANDLE hMem = ::GetClipboardData(CF_UNICODETEXT);
|
||||||
return false;
|
if ( hMem )
|
||||||
|
{
|
||||||
textDataObject.SetText(wxString(s));
|
wxTextDataObject& textDataObject = (wxTextDataObject &)data;
|
||||||
delete[] s;
|
const void* buf = ::GlobalLock(hMem);
|
||||||
|
DWORD size = ::GlobalSize(hMem);
|
||||||
return true;
|
bool ok = textDataObject.SetData(size, buf);
|
||||||
}
|
::GlobalUnlock(hMem);
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
case wxDF_BITMAP:
|
case wxDF_BITMAP:
|
||||||
|
{
|
||||||
|
HANDLE hBmp = ::GetClipboardData(CF_BITMAP);
|
||||||
|
if ( hBmp )
|
||||||
|
{
|
||||||
|
wxBitmapDataObject2& bitmapDataObject = (wxBitmapDataObject2 &)data;
|
||||||
|
return bitmapDataObject.SetData(0, &hBmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
case wxDF_DIB:
|
case wxDF_DIB:
|
||||||
{
|
{
|
||||||
wxBitmapDataObject& bitmapDataObject = (wxBitmapDataObject &)data;
|
HANDLE hMem = ::GetClipboardData(CF_DIB);
|
||||||
wxBitmap* bitmap = (wxBitmap *)wxGetClipboardData(data.GetPreferredFormat());
|
if ( hMem )
|
||||||
if ( !bitmap )
|
{
|
||||||
return false;
|
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);
|
#if wxUSE_METAFILE && !defined(wxMETAFILE_IS_ENH)
|
||||||
delete bitmap;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#if wxUSE_METAFILE
|
|
||||||
case wxDF_METAFILE:
|
case wxDF_METAFILE:
|
||||||
{
|
{
|
||||||
wxMetafileDataObject& metaFileDataObject = (wxMetafileDataObject &)data;
|
HANDLE hMem = ::GetClipboardData(CF_METAFILEPICT);
|
||||||
wxMetafile* metaFile = (wxMetafile *)wxGetClipboardData(wxDF_METAFILE);
|
if ( hMem )
|
||||||
if ( !metaFile )
|
{
|
||||||
return false;
|
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);
|
#if wxUSE_ENH_METAFILE
|
||||||
delete metaFile;
|
case wxDF_ENHMETAFILE:
|
||||||
|
{
|
||||||
return true;
|
HANDLE hFile = ::GetClipboardData(CF_ENHMETAFILE);
|
||||||
}
|
if ( hFile )
|
||||||
#endif // wxUSE_METAFILE
|
{
|
||||||
|
wxMetafileDataObject& metaFileDataObject = (wxMetafileDataObject &)data;
|
||||||
|
return metaFileDataObject.SetData(wxDF_ENHMETAFILE, 0, &hFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif // wxUSE_ENH_METAFILE
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
#else // !wxUSE_DATAOBJ
|
#else // !wxUSE_DATAOBJ
|
||||||
|
Reference in New Issue
Block a user