X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7ffdaf81b5cf0573ad766c4a4e672d28422f7417..5c5ab9ebc3a7dd441c9e3b25cb3daf8f733c374f:/src/msw/clipbrd.cpp diff --git a/src/msw/clipbrd.cpp b/src/msw/clipbrd.cpp index 043d879ae2..1166f73e33 100644 --- a/src/msw/clipbrd.cpp +++ b/src/msw/clipbrd.cpp @@ -146,10 +146,27 @@ bool wxIsClipboardOpened() bool wxIsClipboardFormatAvailable(wxDataFormat dataFormat) { - // for bitmaps, DIBs will also do - return (::IsClipboardFormatAvailable(dataFormat) != 0) || - (dataFormat.GetFormatId() == CF_BITMAP && - ::IsClipboardFormatAvailable(CF_DIB)); + if ( ::IsClipboardFormatAvailable(dataFormat) ) + { + // ok from the first try + return TRUE; + } + + // for several standard formats, we can convert from some other ones too + switch ( dataFormat.GetFormatId() ) + { + // for bitmaps, DIBs will also do + case CF_BITMAP: + return ::IsClipboardFormatAvailable(CF_DIB) != 0; + +#if wxUSE_ENH_METAFILE + case CF_METAFILEPICT: + return ::IsClipboardFormatAvailable(CF_ENHMETAFILE) != 0; +#endif // wxUSE_ENH_METAFILE + + default: + return FALSE; + } } bool wxSetClipboardData(wxDataFormat dataFormat, @@ -208,7 +225,10 @@ bool wxSetClipboardData(wxDataFormat dataFormat, break; } -#if wxUSE_METAFILE + // VZ: I'm told that this code works, but it doesn't seem to work for me + // and, anyhow, I'd be highly surprized if it did. So I leave it here + // but IMNSHO it is completely broken. +#if wxUSE_METAFILE && !defined(wxMETAFILE_IS_ENH) case wxDF_METAFILE: { wxMetafile *wxMF = (wxMetafile *)data; @@ -225,7 +245,20 @@ bool wxSetClipboardData(wxDataFormat dataFormat, handle = SetClipboardData(CF_METAFILEPICT, data); break; } -#endif +#endif // wxUSE_METAFILE + +#if wxUSE_ENH_METAFILE + case wxDF_ENHMETAFILE: + { + wxEnhMetaFile *emf = (wxEnhMetaFile *)data; + wxEnhMetaFile emfCopy = *emf; + + handle = SetClipboardData(CF_ENHMETAFILE, + (void *)emfCopy.GetHENHMETAFILE()); + } + break; +#endif // wxUSE_ENH_METAFILE + case CF_SYLK: case CF_DIF: case CF_TIFF: @@ -319,7 +352,9 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) wxBM->SetWidth(bm.bmWidth); wxBM->SetHeight(bm.bmHeight); wxBM->SetDepth(bm.bmPlanes); +#if WXWIN_COMPATIBILITY_2 wxBM->SetOk(TRUE); +#endif // WXWIN_COMPATIBILITY_2 retval = wxBM; break; } @@ -419,8 +454,6 @@ bool wxGetClipboardFormatName(wxDataFormat dataFormat, IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxObject) -wxClipboard* wxTheClipboard = (wxClipboard *)NULL; - wxClipboard::wxClipboard() { m_clearOnExit = FALSE; @@ -474,9 +507,20 @@ bool wxClipboard::Open() #endif } +bool wxClipboard::IsOpened() const +{ +#if wxUSE_OLE_CLIPBOARD + return TRUE; +#else + return wxIsClipboardOpened(); +#endif +} + bool wxClipboard::SetData( wxDataObject *data ) { +#if !wxUSE_OLE_CLIPBOARD (void)wxEmptyClipboard(); +#endif // wxUSE_OLE_CLIPBOARD if ( data ) return AddData(data); @@ -569,10 +613,8 @@ bool wxClipboard::IsSupported( wxDataFormat format ) return wxIsClipboardFormatAvailable(format); } -bool wxClipboard::GetData( wxDataObject *data ) +bool wxClipboard::GetData( wxDataObject& data ) { - wxCHECK_MSG( data, FALSE, wxT("invalid data object") ); - #if wxUSE_OLE_CLIPBOARD IDataObject *pDataObject = NULL; HRESULT hr = OleGetClipboard(&pDataObject); @@ -584,7 +626,7 @@ bool wxClipboard::GetData( wxDataObject *data ) } // build the list of supported formats - size_t nFormats = data->GetFormatCount(FALSE /* for SetData() */); + size_t nFormats = data.GetFormatCount(wxDataObject::Set); wxDataFormat format, *formats; if ( nFormats == 1 ) { @@ -597,7 +639,7 @@ bool wxClipboard::GetData( wxDataObject *data ) formats = new wxDataFormat[nFormats]; } - data->GetAllFormats(formats, FALSE); + data.GetAllFormats(formats, wxDataObject::Set); // get the format enumerator bool result = FALSE; @@ -661,7 +703,6 @@ bool wxClipboard::GetData( wxDataObject *data ) formatEtc.ptd = NULL; formatEtc.dwAspect = DVASPECT_CONTENT; formatEtc.lindex = -1; - formatEtc.tymed = TYMED_HGLOBAL; size_t nSupportedFormats = supportedFormats.GetCount(); for ( size_t n = 0; !result && (n < nSupportedFormats); n++ ) @@ -669,6 +710,25 @@ bool wxClipboard::GetData( wxDataObject *data ) STGMEDIUM medium; formatEtc.cfFormat = supportedFormats[n]; + // use the appropriate tymed + switch ( formatEtc.cfFormat ) + { + case CF_BITMAP: + formatEtc.tymed = TYMED_GDI; + break; + + case CF_METAFILEPICT: + formatEtc.tymed = TYMED_MFPICT; + break; + + case CF_ENHMETAFILE: + formatEtc.tymed = TYMED_ENHMF; + break; + + default: + formatEtc.tymed = TYMED_HGLOBAL; + } + // try to get data hr = pDataObject->GetData(&formatEtc, &medium); if ( FAILED(hr) ) @@ -684,7 +744,7 @@ bool wxClipboard::GetData( wxDataObject *data ) if ( SUCCEEDED(hr) ) { // pass the data to the data object - hr = data->GetInterface()->SetData(&formatEtc, &medium, TRUE); + hr = data.GetInterface()->SetData(&formatEtc, &medium, TRUE); if ( FAILED(hr) ) { wxLogDebug(wxT("Failed to set data in wxIDataObject")); @@ -710,91 +770,56 @@ bool wxClipboard::GetData( wxDataObject *data ) #elif wxUSE_DATAOBJ wxCHECK_MSG( wxIsClipboardOpened(), FALSE, wxT("clipboard not open") ); - wxDataFormat format = data->GetFormat(); + wxDataFormat format = data.GetFormat(); switch ( format ) { case wxDF_TEXT: case wxDF_OEMTEXT: { - wxTextDataObject* textDataObject = (wxTextDataObject*) data; - char* s = (char*) wxGetClipboardData(format); - if ( s ) - { - textDataObject->SetText(s); - delete[] s; - return TRUE; - } - else + 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; + wxBitmapDataObject& bitmapDataObject = (wxBitmapDataObject &)data; wxBitmap* bitmap = (wxBitmap *)wxGetClipboardData(data->GetFormat()); - if (bitmap) - { - bitmapDataObject->SetBitmap(* bitmap); - delete bitmap; - return TRUE; - } - else + if ( !bitmap ) return FALSE; + + bitmapDataObject.SetBitmap(*bitmap); + delete bitmap; + + return TRUE; } #if wxUSE_METAFILE case wxDF_METAFILE: { - wxMetafileDataObject* metaFileDataObject = (wxMetafileDataObject *)data; + wxMetafileDataObject& metaFileDataObject = (wxMetafileDataObject &)data; wxMetafile* metaFile = (wxMetafile *)wxGetClipboardData(wxDF_METAFILE); - if (metaFile) - { - metaFileDataObject->SetMetafile(*metaFile); - delete metaFile; - return TRUE; - } - else + if ( !metaFile ) return FALSE; - } -#endif - default: - { - long len; - void *buf = wxGetClipboardData(format, &len); - if ( buf ) - { - // FIXME this is for testing only!! - ((wxPrivateDataObject *)data)->SetData(buf, len); - free(buf); - return TRUE; - } - } + metaFileDataObject.SetMetafile(*metaFile); + delete metaFile; - return FALSE; + return TRUE; + } +#endif // wxUSE_METAFILE } #else // !wxUSE_DATAOBJ - return FALSE; -#endif // wxUSE_DATAOBJ/!wxUSE_DATAOBJ -} + wxFAIL_MSG( wxT("no clipboard implementation") ); +#endif // wxUSE_OLE_CLIPBOARD/wxUSE_DATAOBJ -//----------------------------------------------------------------------------- -// wxClipboardModule -//----------------------------------------------------------------------------- - -IMPLEMENT_DYNAMIC_CLASS(wxClipboardModule,wxModule) - -bool wxClipboardModule::OnInit() -{ - wxTheClipboard = new wxClipboard(); - - return TRUE; -} - -void wxClipboardModule::OnExit() -{ - if (wxTheClipboard) delete wxTheClipboard; - wxTheClipboard = (wxClipboard*) NULL; + return FALSE; } #else