X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/51edda6af0e2005c1cc581331863984f0ef48b5d..11a2ce5ad289cb21b35cc21131b46f75dd4af060:/src/msw/clipbrd.cpp diff --git a/src/msw/clipbrd.cpp b/src/msw/clipbrd.cpp index 6b93ebf988..7f07e896eb 100644 --- a/src/msw/clipbrd.cpp +++ b/src/msw/clipbrd.cpp @@ -55,15 +55,20 @@ #include <windows.h> #include "wx/msw/private.h" + +#ifndef __WXMICROWIN__ #include "wx/msw/dib.h" +#endif // wxDataObject is tied to OLE/drag and drop implementation, therefore so are // the functions using wxDataObject in wxClipboard -#define wxUSE_DATAOBJ wxUSE_DRAG_AND_DROP +//#define wxUSE_DATAOBJ wxUSE_DRAG_AND_DROP #if wxUSE_DATAOBJ #include "wx/dataobj.h" +#endif +#if wxUSE_OLE // use OLE clipboard #define wxUSE_OLE_CLIPBOARD 1 #else // !wxUSE_DATAOBJ @@ -146,10 +151,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 && !defined(__WIN16__) + case CF_METAFILEPICT: + return ::IsClipboardFormatAvailable(CF_ENHMETAFILE) != 0; +#endif // wxUSE_ENH_METAFILE + + default: + return FALSE; + } } bool wxSetClipboardData(wxDataFormat dataFormat, @@ -202,13 +224,16 @@ bool wxSetClipboardData(wxDataFormat dataFormat, wxBitmap *bitmap = (wxBitmap *)data; HBITMAP hBitmap = (HBITMAP)bitmap->GetHBITMAP(); // NULL palette means to use the system one - HANDLE hDIB = wxBitmapToDIB(hBitmap, (HPALETTE)NULL); + HANDLE hDIB = wxBitmapToDIB(hBitmap, (HPALETTE)NULL); handle = SetClipboardData(CF_DIB, hDIB); #endif // wxUSE_IMAGE_LOADING_IN_MSW 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 +250,20 @@ bool wxSetClipboardData(wxDataFormat dataFormat, handle = SetClipboardData(CF_METAFILEPICT, data); break; } -#endif +#endif // wxUSE_METAFILE + +#if wxUSE_ENH_METAFILE && !defined(__WIN16__) + 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: @@ -260,6 +298,80 @@ bool wxSetClipboardData(wxDataFormat dataFormat, handle = SetClipboardData(dataFormat, hGlobalMemory); break; } + // Only tested with non-Unicode, Visual C++ 6.0 so far +#if defined(__VISUALC__) && !defined(UNICODE) + case wxDF_HTML: + { + char* html = (char *)data; + + // Create temporary buffer for HTML header... + char *buf = new char [400 + strlen(html)]; + if(!buf) return FALSE; + + // Get clipboard id for HTML format... + static int cfid = 0; + if(!cfid) cfid = RegisterClipboardFormat(wxT("HTML Format")); + + // Create a template string for the HTML header... + strcpy(buf, + "Version:0.9\r\n" + "StartHTML:00000000\r\n" + "EndHTML:00000000\r\n" + "StartFragment:00000000\r\n" + "EndFragment:00000000\r\n" + "<html><body>\r\n" + "<!--StartFragment -->\r\n"); + + // Append the HTML... + strcat(buf, html); + strcat(buf, "\r\n"); + // Finish up the HTML format... + strcat(buf, + "<!--EndFragment-->\r\n" + "</body>\r\n" + "</html>"); + + // Now go back, calculate all the lengths, and write out the + // necessary header information. Note, wsprintf() truncates the + // string when you overwrite it so you follow up with code to replace + // the 0 appended at the end with a '\r'... + char *ptr = strstr(buf, "StartHTML"); + wsprintf(ptr+10, "%08u", strstr(buf, "<html>") - buf); + *(ptr+10+8) = '\r'; + + ptr = strstr(buf, "EndHTML"); + wsprintf(ptr+8, "%08u", strlen(buf)); + *(ptr+8+8) = '\r'; + + ptr = strstr(buf, "StartFragment"); + wsprintf(ptr+14, "%08u", strstr(buf, "<!--StartFrag") - buf); + *(ptr+14+8) = '\r'; + + ptr = strstr(buf, "EndFragment"); + wsprintf(ptr+12, "%08u", strstr(buf, "<!--EndFrag") - buf); + *(ptr+12+8) = '\r'; + + // Now you have everything in place ready to put on the + // clipboard. + + // Allocate global memory for transfer... + HGLOBAL hText = GlobalAlloc(GMEM_MOVEABLE |GMEM_DDESHARE, strlen(buf)+4); + + // Put your string in the global memory... + ptr = (char *)GlobalLock(hText); + strcpy(ptr, buf); + GlobalUnlock(hText); + + handle = ::SetClipboardData(cfid, hText); + + // Free memory... + GlobalFree(hText); + + // Clean up... + delete [] buf; + break; + } +#endif } if ( handle == 0 ) @@ -319,7 +431,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; } @@ -330,10 +444,8 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) case CF_TIFF: case CF_PALETTE: case wxDF_DIB: - { - wxLogError(_("Unsupported clipboard format.")); - return FALSE; - } + wxLogError(_("Unsupported clipboard format.")); + return NULL; case wxDF_OEMTEXT: dataFormat = wxDF_TEXT; @@ -398,7 +510,7 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) wxDataFormat wxEnumClipboardFormats(wxDataFormat dataFormat) { - return ::EnumClipboardFormats(dataFormat); + return (wxDataFormat::NativeFormat)::EnumClipboardFormats(dataFormat); } int wxRegisterClipboardFormat(wxChar *formatName) @@ -437,7 +549,7 @@ void wxClipboard::Clear() #if wxUSE_OLE_CLIPBOARD if ( FAILED(OleSetClipboard(NULL)) ) { - wxLogLastError("OleSetClipboard(NULL)"); + wxLogLastError(wxT("OleSetClipboard(NULL)")); } #endif } @@ -447,7 +559,7 @@ bool wxClipboard::Flush() #if wxUSE_OLE_CLIPBOARD if ( FAILED(OleFlushClipboard()) ) { - wxLogLastError("OleFlushClipboard"); + wxLogLastError(wxT("OleFlushClipboard")); return FALSE; } @@ -525,7 +637,7 @@ bool wxClipboard::AddData( wxDataObject *data ) #elif wxUSE_DATAOBJ wxCHECK_MSG( wxIsClipboardOpened(), FALSE, wxT("clipboard not open") ); - wxDataFormat format = data->GetFormat(); + wxDataFormat format = data->GetPreferredFormat(); switch ( format ) { @@ -542,23 +654,35 @@ bool wxClipboard::AddData( wxDataObject *data ) { wxBitmapDataObject* bitmapDataObject = (wxBitmapDataObject*) data; wxBitmap bitmap(bitmapDataObject->GetBitmap()); - return wxSetClipboardData(data->GetFormat(), &bitmap); + return wxSetClipboardData(data->GetPreferredFormat(), &bitmap); } #if wxUSE_METAFILE case wxDF_METAFILE: { - wxMetafileDataObject* metaFileDataObject = +#if 1 + // TODO + wxLogError("Not implemented because wxMetafileDataObject does not contain width and height values."); + return FALSE; +#else + wxMetafileDataObject* metaFileDataObject = (wxMetafileDataObject*) data; wxMetafile metaFile = metaFileDataObject->GetMetafile(); return wxSetClipboardData(wxDF_METAFILE, &metaFile, metaFileDataObject->GetWidth(), metaFileDataObject->GetHeight()); +#endif } #endif // wxUSE_METAFILE default: - return wxSetClipboardData(data); + { +// This didn't compile, of course +// return wxSetClipboardData(data); + // TODO + wxLogError("Not implemented."); + return FALSE; + } } #else // !wxUSE_DATAOBJ return FALSE; @@ -592,7 +716,8 @@ bool wxClipboard::GetData( wxDataObject& data ) // build the list of supported formats size_t nFormats = data.GetFormatCount(wxDataObject::Set); - wxDataFormat format, *formats; + wxDataFormat format; + wxDataFormat *formats; if ( nFormats == 1 ) { // the most common case @@ -668,7 +793,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++ ) @@ -676,6 +800,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) ) @@ -717,7 +860,7 @@ bool wxClipboard::GetData( wxDataObject& data ) #elif wxUSE_DATAOBJ wxCHECK_MSG( wxIsClipboardOpened(), FALSE, wxT("clipboard not open") ); - wxDataFormat format = data.GetFormat(); + wxDataFormat format = data.GetPreferredFormat(); switch ( format ) { case wxDF_TEXT: @@ -738,7 +881,7 @@ bool wxClipboard::GetData( wxDataObject& data ) case wxDF_DIB: { wxBitmapDataObject& bitmapDataObject = (wxBitmapDataObject &)data; - wxBitmap* bitmap = (wxBitmap *)wxGetClipboardData(data->GetFormat()); + wxBitmap* bitmap = (wxBitmap *)wxGetClipboardData(data.GetPreferredFormat()); if ( !bitmap ) return FALSE; @@ -762,14 +905,12 @@ bool wxClipboard::GetData( wxDataObject& data ) } #endif // wxUSE_METAFILE } + return FALSE; #else // !wxUSE_DATAOBJ wxFAIL_MSG( wxT("no clipboard implementation") ); -#endif // wxUSE_OLE_CLIPBOARD/wxUSE_DATAOBJ - return FALSE; +#endif // wxUSE_OLE_CLIPBOARD/wxUSE_DATAOBJ } -#else - #error "Please turn wxUSE_CLIPBOARD on to compile this file." #endif // wxUSE_CLIPBOARD