X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/265b0c070b7531a31d79e79fd44142f5a807b23d..35cd9dba7b1e71937fa59949fd7e6f005a2c11d6:/src/msw/ole/dataobj.cpp?ds=sidebyside diff --git a/src/msw/ole/dataobj.cpp b/src/msw/ole/dataobj.cpp index 14d98afe93..b2521b7143 100644 --- a/src/msw/ole/dataobj.cpp +++ b/src/msw/ole/dataobj.cpp @@ -39,7 +39,7 @@ #include "wx/msw/private.h" // includes -#ifdef wxUSE_NORLANDER_HEADERS +#if wxUSE_NORLANDER_HEADERS #include #endif #include @@ -73,6 +73,12 @@ class wxIEnumFORMATETC : public IEnumFORMATETC { public: wxIEnumFORMATETC(const wxDataFormat* formats, ULONG nCount); + + // to suppress the gcc warning about "class has virtual functions but non + // virtual dtor" +#ifdef __GNUG__ + virtual +#endif ~wxIEnumFORMATETC() { delete [] m_formats; } DECLARE_IUNKNOWN_METHODS; @@ -97,6 +103,12 @@ class wxIDataObject : public IDataObject { public: wxIDataObject(wxDataObject *pDataObject); + + // to suppress the gcc warning about "class has virtual functions but non + // virtual dtor" +#ifdef __GNUG__ + virtual +#endif ~wxIDataObject(); // normally, wxDataObject controls our lifetime (i.e. we're deleted when it @@ -297,11 +309,15 @@ STDMETHODIMP wxIDataObject::GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium) pmedium->tymed = TYMED_GDI; break; + case wxDF_ENHMETAFILE: + pmedium->tymed = TYMED_ENHMF; + break; + case wxDF_METAFILE: pmedium->hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(METAFILEPICT)); if ( !pmedium->hGlobal ) { - wxLogLastError("GlobalAlloc"); + wxLogLastError(wxT("GlobalAlloc")); return E_OUTOFMEMORY; } pmedium->tymed = TYMED_MFPICT; @@ -325,7 +341,7 @@ STDMETHODIMP wxIDataObject::GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium) HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, size); if ( hGlobal == NULL ) { - wxLogLastError("GlobalAlloc"); + wxLogLastError(wxT("GlobalAlloc")); return E_OUTOFMEMORY; } @@ -363,7 +379,15 @@ STDMETHODIMP wxIDataObject::GetDataHere(FORMATETC *pformatetc, return E_UNEXPECTED; break; + case TYMED_ENHMF: + if ( !m_pDataObject->GetDataHere(wxDF_ENHMETAFILE, + &pmedium->hEnhMetaFile) ) + return E_UNEXPECTED; + break; + case TYMED_MFPICT: + // fall through - we pass METAFILEPICT through HGLOBAL + case TYMED_HGLOBAL: { // copy data @@ -409,7 +433,12 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc, m_pDataObject->SetData(wxDF_BITMAP, 0, &pmedium->hBitmap); break; + case TYMED_ENHMF: + m_pDataObject->SetData(wxDF_ENHMETAFILE, 0, &pmedium->hEnhMetaFile); + break; + case TYMED_MFPICT: + // fall through - we pass METAFILEPICT through HGLOBAL case TYMED_HGLOBAL: { wxDataFormat format = pformatetc->cfFormat; @@ -428,7 +457,7 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc, // copy data void *pBuf = GlobalLock(pmedium->hGlobal); if ( pBuf == NULL ) { - wxLogLastError("GlobalLock"); + wxLogLastError(wxT("GlobalLock")); return E_OUTOFMEMORY; } @@ -445,9 +474,13 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc, case CF_OEMTEXT: size = strlen((const char *)pBuf); break; -#ifndef __WATCOMC__ +#if !defined(__WATCOMC__) && ! (defined(__BORLANDC__) && (__BORLANDC__ < 0x500)) case CF_UNICODETEXT: - size = wcslen((const wchar_t *)pBuf); +#if (defined(__BORLANDC__) && (__BORLANDC__ > 0x530)) + size = std::wcslen((const wchar_t *)pBuf); +#else + size = ::wcslen((const wchar_t *)pBuf); +#endif break; #endif case CF_BITMAP: @@ -473,6 +506,10 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc, size_t *p = (size_t *)pBuf; size = *p++; pBuf = p; + if (! format.IsStandard() ) { + // see GetData for coresponding increment + size -= sizeof(size_t); + } } } @@ -502,6 +539,10 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc, case TYMED_MFPICT: pmedium->hMetaFilePict = 0; break; + + case TYMED_ENHMF: + pmedium->hEnhMetaFile = 0; + break; } ReleaseStgMedium(pmedium); @@ -652,64 +693,47 @@ void wxDataObject::SetAutoDelete() m_pIDataObject = NULL; } -bool wxDataObject::IsSupportedFormat(const wxDataFormat& format) const -{ - size_t nFormatCount = GetFormatCount(); - if ( nFormatCount == 1 ) { - return format == GetPreferredFormat(); - } - else { - wxDataFormat *formats = new wxDataFormat[nFormatCount]; - GetAllFormats(formats); +#ifdef __WXDEBUG__ - size_t n; - for ( n = 0; n < nFormatCount; n++ ) { - if ( formats[n] == format ) - break; - } +const wxChar *wxDataObject::GetFormatName(wxDataFormat format) +{ + // case 'xxx' is not a valid value for switch of enum 'wxDataFormat' + #ifdef __VISUALC__ + #pragma warning(disable:4063) + #endif // VC++ + + static wxChar s_szBuf[256]; + switch ( format ) { + case CF_TEXT: return wxT("CF_TEXT"); + case CF_BITMAP: return wxT("CF_BITMAP"); + case CF_METAFILEPICT: return wxT("CF_METAFILEPICT"); + case CF_SYLK: return wxT("CF_SYLK"); + case CF_DIF: return wxT("CF_DIF"); + case CF_TIFF: return wxT("CF_TIFF"); + case CF_OEMTEXT: return wxT("CF_OEMTEXT"); + case CF_DIB: return wxT("CF_DIB"); + case CF_PALETTE: return wxT("CF_PALETTE"); + case CF_PENDATA: return wxT("CF_PENDATA"); + case CF_RIFF: return wxT("CF_RIFF"); + case CF_WAVE: return wxT("CF_WAVE"); + case CF_UNICODETEXT: return wxT("CF_UNICODETEXT"); + case CF_ENHMETAFILE: return wxT("CF_ENHMETAFILE"); + case CF_HDROP: return wxT("CF_HDROP"); + case CF_LOCALE: return wxT("CF_LOCALE"); - delete [] formats; + default: + if ( !::GetClipboardFormatName(format, s_szBuf, WXSIZEOF(s_szBuf)) ) + { + // it must be a new predefined format we don't know the name of + wxSprintf(s_szBuf, wxT("unknown CF (0x%04x)"), format.GetFormatId()); + } - // found? - return n < nFormatCount; + return s_szBuf; } -} - -#ifdef __WXDEBUG__ -const char *wxDataObject::GetFormatName(wxDataFormat format) -{ - // case 'xxx' is not a valid value for switch of enum 'wxDataFormat' - #ifdef __VISUALC__ - #pragma warning(disable:4063) - #endif // VC++ - - static char s_szBuf[128]; - switch ( format ) { - case CF_TEXT: return "CF_TEXT"; - case CF_BITMAP: return "CF_BITMAP"; - case CF_METAFILEPICT: return "CF_METAFILEPICT"; - case CF_SYLK: return "CF_SYLK"; - case CF_DIF: return "CF_DIF"; - case CF_TIFF: return "CF_TIFF"; - case CF_OEMTEXT: return "CF_OEMTEXT"; - case CF_DIB: return "CF_DIB"; - case CF_PALETTE: return "CF_PALETTE"; - case CF_PENDATA: return "CF_PENDATA"; - case CF_RIFF: return "CF_RIFF"; - case CF_WAVE: return "CF_WAVE"; - case CF_UNICODETEXT: return "CF_UNICODETEXT"; - case CF_ENHMETAFILE: return "CF_ENHMETAFILE"; - case CF_HDROP: return "CF_HDROP"; - case CF_LOCALE: return "CF_LOCALE"; - default: - sprintf(s_szBuf, "clipboard format 0x%x (unknown)", format); - return s_szBuf; - } - - #ifdef __VISUALC__ - #pragma warning(default:4063) - #endif // VC++ + #ifdef __VISUALC__ + #pragma warning(default:4063) + #endif // VC++ } #endif // Debug @@ -772,7 +796,7 @@ bool wxBitmapDataObject2::SetData(size_t WXUNUSED(len), const void *pBuf) BITMAP bmp; if ( !GetObject(hbmp, sizeof(BITMAP), &bmp) ) { - wxLogLastError("GetObject(HBITMAP)"); + wxLogLastError(wxT("GetObject(HBITMAP)")); } wxBitmap bitmap(bmp.bmWidth, bmp.bmHeight, bmp.bmPlanes); @@ -807,7 +831,7 @@ size_t wxBitmapDataObject::GetDataSize(const wxDataFormat& format) const if ( !GetDIBits(hdc, (HBITMAP)m_bitmap.GetHBITMAP(), 0, 0, NULL, &bi, DIB_RGB_COLORS) ) { - wxLogLastError("GetDIBits(NULL)"); + wxLogLastError(wxT("GetDIBits(NULL)")); return 0; } @@ -840,7 +864,7 @@ bool wxBitmapDataObject::GetDataHere(const wxDataFormat& format, BITMAPINFO *pbi = (BITMAPINFO *)pBuf; if ( !GetDIBits(hdc, hbmp, 0, 0, NULL, pbi, DIB_RGB_COLORS) ) { - wxLogLastError("GetDIBits(NULL)"); + wxLogLastError(wxT("GetDIBits(NULL)")); return 0; } @@ -849,7 +873,7 @@ bool wxBitmapDataObject::GetDataHere(const wxDataFormat& format, if ( !GetDIBits(hdc, hbmp, 0, pbi->bmiHeader.biHeight, pbi + 1, pbi, DIB_RGB_COLORS) ) { - wxLogLastError("GetDIBits"); + wxLogLastError(wxT("GetDIBits")); return FALSE; } @@ -879,7 +903,7 @@ bool wxBitmapDataObject::SetData(const wxDataFormat& format, pbmi + 1, pbmi, DIB_RGB_COLORS); if ( !hbmp ) { - wxLogLastError("CreateDIBitmap"); + wxLogLastError(wxT("CreateDIBitmap")); } m_bitmap.SetWidth(pbmih->biWidth); @@ -893,7 +917,7 @@ bool wxBitmapDataObject::SetData(const wxDataFormat& format, BITMAP bmp; if ( !GetObject(hbmp, sizeof(BITMAP), &bmp) ) { - wxLogLastError("GetObject(HBITMAP)"); + wxLogLastError(wxT("GetObject(HBITMAP)")); } m_bitmap.SetWidth(bmp.bmWidth); @@ -943,8 +967,8 @@ bool wxFileDataObject::SetData(size_t WXUNUSED(size), const void *pData) m_filenames.Add(str); if ( len2 != len - 1 ) { - wxLogDebug(wxT("In wxFileDropTarget::OnDrop DragQueryFile returned" - " %d characters, %d expected."), len2, len - 1); + wxLogDebug(wxT("In wxFileDropTarget::OnDrop DragQueryFile returned\ + %d characters, %d expected."), len2, len - 1); } } @@ -1067,7 +1091,7 @@ size_t wxConvertBitmapToDIB(LPBITMAPINFO pbi, const wxBitmap& bitmap) HBITMAP hbmp = (HBITMAP)bitmap.GetHBITMAP(); if ( !GetObject(hbmp, sizeof(bm), &bm) ) { - wxLogLastError("GetObject(bitmap)"); + wxLogLastError(wxT("GetObject(bitmap)")); return 0; } @@ -1105,7 +1129,7 @@ size_t wxConvertBitmapToDIB(LPBITMAPINFO pbi, const wxBitmap& bitmap) ScreenHDC hdc; if ( !GetDIBits(hdc, hbmp, 0, bi.biHeight, NULL, pbi, DIB_RGB_COLORS) ) { - wxLogLastError("GetDIBits(NULL)"); + wxLogLastError(wxT("GetDIBits(NULL)")); return 0; } @@ -1120,7 +1144,7 @@ size_t wxConvertBitmapToDIB(LPBITMAPINFO pbi, const wxBitmap& bitmap) void *image = (char *)pbi + dwLen; if ( !GetDIBits(hdc, hbmp, 0, bi.biHeight, image, pbi, DIB_RGB_COLORS) ) { - wxLogLastError("GetDIBits"); + wxLogLastError(wxT("GetDIBits")); return 0; } @@ -1143,7 +1167,7 @@ wxBitmap wxConvertDIBToBitmap(const LPBITMAPINFO pbmi) image, pbmi, DIB_RGB_COLORS); if ( !hbmp ) { - wxLogLastError("CreateDIBitmap"); + wxLogLastError(wxT("CreateDIBitmap")); } wxBitmap bitmap(pbmih->biWidth, pbmih->biHeight, pbmih->biBitCount); @@ -1166,7 +1190,7 @@ static const wxChar *GetTymedName(DWORD tymed) case TYMED_MFPICT: return wxT("TYMED_MFPICT"); case TYMED_ENHMF: return wxT("TYMED_ENHMF"); default: - wxSprintf(s_szBuf, wxT("type of media format %d (unknown)"), tymed); + wxSprintf(s_szBuf, wxT("type of media format %ld (unknown)"), tymed); return s_szBuf; } }