// headers
// ---------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "clipbrd.h"
#endif
#include "wx/clipbrd.h"
#include <string.h>
-#include <windows.h>
#include "wx/msw/private.h"
-#ifndef __WXMICROWIN__
+#if wxUSE_WXDIB
#include "wx/msw/dib.h"
#endif
#include "wx/dataobj.h"
#endif
-#if wxUSE_OLE
+#if wxUSE_OLE && !defined(__WXWINCE__)
// use OLE clipboard
#define wxUSE_OLE_CLIPBOARD 1
#else // !wxUSE_DATAOBJ
#include <ole2.h>
#endif // wxUSE_OLE_CLIPBOARD
-#ifdef __WIN16__
- #define memcpy hmemcpy
-#endif
-
// ===========================================================================
// implementation
// ===========================================================================
bool wxIsClipboardFormatAvailable(wxDataFormat dataFormat)
{
- if ( ::IsClipboardFormatAvailable(dataFormat) )
+ wxDataFormat::NativeFormat cf = dataFormat.GetFormatId();
+
+ if ( ::IsClipboardFormatAvailable(cf) )
{
// ok from the first try
return TRUE;
}
// for several standard formats, we can convert from some other ones too
- switch ( dataFormat.GetFormatId() )
+ switch ( cf )
{
// for bitmaps, DIBs will also do
case CF_BITMAP:
return ::IsClipboardFormatAvailable(CF_DIB) != 0;
-#if wxUSE_ENH_METAFILE && !defined(__WIN16__)
+#if wxUSE_ENH_METAFILE && !defined(__WXWINCE__)
case CF_METAFILEPICT:
return ::IsClipboardFormatAvailable(CF_ENHMETAFILE) != 0;
#endif // wxUSE_ENH_METAFILE
}
}
-#ifdef __DIGITALMARS__
-extern "C" HGLOBAL wxDIB::ConvertFromBitmap(HBITMAP hbmp);
-#endif
-
bool wxSetClipboardData(wxDataFormat dataFormat,
const void *data,
break;
}
+#if wxUSE_WXDIB
case wxDF_DIB:
{
wxBitmap *bitmap = (wxBitmap *)data;
- HGLOBAL hDIB = wxDIB::ConvertFromBitmap(GetHbitmapOf(*bitmap));
- if ( hDIB )
+ if ( bitmap && bitmap->Ok() )
{
- handle = ::SetClipboardData(CF_DIB, hDIB);
+ wxDIB dib(*bitmap);
+ if ( dib.IsOk() )
+ {
+ handle = ::SetClipboardData(CF_DIB, dib.Detach());
+ }
}
break;
}
+#endif
// 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
+ // and, anyhow, I'd be highly surprised if it did. So I leave it here
// but IMNSHO it is completely broken.
-#if wxUSE_METAFILE && !defined(wxMETAFILE_IS_ENH)
+#if wxUSE_METAFILE && !defined(wxMETAFILE_IS_ENH) && !defined(__WXWINCE__)
case wxDF_METAFILE:
{
wxMetafile *wxMF = (wxMetafile *)data;
}
#endif // wxUSE_METAFILE
-#if wxUSE_ENH_METAFILE && !defined(__WIN16__)
+#if wxUSE_ENH_METAFILE && !defined(__WXWINCE__)
case wxDF_ENHMETAFILE:
{
wxEnhMetaFile *emf = (wxEnhMetaFile *)data;
switch ( dataFormat )
{
+#ifndef __WXWINCE__
case wxDF_BITMAP:
{
BITMAP bm;
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;
}
-
+#endif
case wxDF_METAFILE:
case CF_SYLK:
case CF_DIF:
if (!s)
break;
- LPSTR lpGlobalMemory = (LPSTR)::GlobalLock(hGlobalMemory);
+ LPSTR lpGlobalMemory = (LPSTR) GlobalLock(hGlobalMemory);
memcpy(s, lpGlobalMemory, hsize);
- ::GlobalUnlock(hGlobalMemory);
+ GlobalUnlock(hGlobalMemory);
retval = s;
break;
if ( !buf )
break;
- LPSTR lpGlobalMemory = (LPSTR)::GlobalLock(hGlobalMemory);
+ LPSTR lpGlobalMemory = (LPSTR) GlobalLock(hGlobalMemory);
memcpy(buf, lpGlobalMemory, size);
- ::GlobalUnlock(hGlobalMemory);
+ GlobalUnlock(hGlobalMemory);
retval = buf;
break;
{
#if 1
// TODO
- wxLogError("Not implemented because wxMetafileDataObject does not contain width and height values.");
+ wxLogError(wxT("Not implemented because wxMetafileDataObject does not contain width and height values."));
return FALSE;
#else
wxMetafileDataObject* metaFileDataObject =
// This didn't compile, of course
// return wxSetClipboardData(data);
// TODO
- wxLogError("Not implemented.");
+ wxLogError(wxT("Not implemented."));
return FALSE;
}
}
#endif
}
-bool wxClipboard::IsSupported( wxDataFormat format )
+bool wxClipboard::IsSupported( const wxDataFormat& format )
{
return wxIsClipboardFormatAvailable(format);
}
data.GetAllFormats(formats, wxDataObject::Set);
- // get the format enumerator
+ // get the data for the given formats
+ FORMATETC formatEtc;
+ CLIPFORMAT cf;
bool result = FALSE;
- wxArrayInt supportedFormats;
+
+ // enumerate all explicit formats on the clipboard.
+ // note that this does not include implicit / synthetic (automatically
+ // converted) formats.
+#ifdef __WXDEBUG__
+ // get the format enumerator
IEnumFORMATETC *pEnumFormatEtc = NULL;
hr = pDataObject->EnumFormatEtc(DATADIR_GET, &pEnumFormatEtc);
if ( FAILED(hr) || !pEnumFormatEtc )
else
{
// ask for the supported formats and see if there are any we support
- FORMATETC formatEtc;
for ( ;; )
{
ULONG nCount;
break;
}
- CLIPFORMAT cf = formatEtc.cfFormat;
+ cf = formatEtc.cfFormat;
-#ifdef __WXDEBUG__
wxLogTrace(wxTRACE_OleCalls,
wxT("Object on the clipboard supports format %s."),
wxDataObject::GetFormatName(cf));
-#endif // Debug
-
- // is supported?
- for ( size_t n = 0; n < nFormats; n++ )
- {
- if ( formats[n].GetFormatId() == cf )
- {
- if ( supportedFormats.Index(cf) == wxNOT_FOUND )
- {
- supportedFormats.Add(cf);
- }
- }
- }
}
pEnumFormatEtc->Release();
}
+#endif // Debug
- if ( formats != &format )
- {
- delete [] formats;
- }
- //else: we didn't allocate any memory
-
- if ( !supportedFormats.IsEmpty() )
+ STGMEDIUM medium;
+ // stop at the first valid format found on the clipboard
+ for ( size_t n = 0; !result && (n < nFormats); n++ )
{
- FORMATETC formatEtc;
+ // convert to NativeFormat Id
+ cf = formats[n].GetFormatId();
+
+ // if the format is not available, try the next one
+ // this test includes implicit / sythetic formats
+ if ( !::IsClipboardFormatAvailable(cf) )
+ continue;
+
+ formatEtc.cfFormat = cf;
formatEtc.ptd = NULL;
formatEtc.dwAspect = DVASPECT_CONTENT;
formatEtc.lindex = -1;
- size_t nSupportedFormats = supportedFormats.GetCount();
- for ( size_t n = 0; !result && (n < nSupportedFormats); n++ )
+ // use the appropriate tymed
+ switch ( formatEtc.cfFormat )
{
- STGMEDIUM medium;
- formatEtc.cfFormat = supportedFormats[n];
+ case CF_BITMAP:
+ formatEtc.tymed = TYMED_GDI;
+ break;
- // use the appropriate tymed
- switch ( formatEtc.cfFormat )
- {
- case CF_BITMAP:
- formatEtc.tymed = TYMED_GDI;
- break;
+#ifndef __WXWINCE__
+ case CF_METAFILEPICT:
+ formatEtc.tymed = TYMED_MFPICT;
+ break;
- case CF_METAFILEPICT:
- formatEtc.tymed = TYMED_MFPICT;
- break;
+ case CF_ENHMETAFILE:
+ formatEtc.tymed = TYMED_ENHMF;
+ break;
+#endif
- case CF_ENHMETAFILE:
- formatEtc.tymed = TYMED_ENHMF;
- break;
+ default:
+ formatEtc.tymed = TYMED_HGLOBAL;
+ }
- default:
- formatEtc.tymed = TYMED_HGLOBAL;
+ // try to get data
+ hr = pDataObject->GetData(&formatEtc, &medium);
+ if ( FAILED(hr) )
+ {
+ // try other tymed for GDI objects
+ if ( formatEtc.cfFormat == CF_BITMAP )
+ {
+ formatEtc.tymed = TYMED_HGLOBAL;
+ hr = pDataObject->GetData(&formatEtc, &medium);
}
+ }
- // try to get data
- hr = pDataObject->GetData(&formatEtc, &medium);
+ if ( SUCCEEDED(hr) )
+ {
+ // pass the data to the data object
+ hr = data.GetInterface()->SetData(&formatEtc, &medium, TRUE);
if ( FAILED(hr) )
{
- // try other tymed for GDI objects
- if ( formatEtc.cfFormat == CF_BITMAP )
- {
- formatEtc.tymed = TYMED_HGLOBAL;
- hr = pDataObject->GetData(&formatEtc, &medium);
- }
- }
+ wxLogDebug(wxT("Failed to set data in wxIDataObject"));
- if ( SUCCEEDED(hr) )
+ // IDataObject only takes the ownership of data if it
+ // successfully got it - which is not the case here
+ ReleaseStgMedium(&medium);
+ }
+ else
{
- // pass the data to the data object
- hr = data.GetInterface()->SetData(&formatEtc, &medium, TRUE);
- if ( FAILED(hr) )
- {
- wxLogDebug(wxT("Failed to set data in wxIDataObject"));
-
- // IDataObject only takes the ownership of data if it
- // successfully got it - which is not the case here
- ReleaseStgMedium(&medium);
- }
- else
- {
- result = TRUE;
- }
+ result = TRUE;
}
- //else: unsupported tymed?
}
+ //else: unsupported tymed?
}
- //else: unsupported format
+
+ if ( formats != &format )
+ {
+ delete [] formats;
+ }
+ //else: we didn't allocate any memory
// clean up and return
pDataObject->Release();
if ( !s )
return FALSE;
- textDataObject.SetText(s);
+ textDataObject.SetText(wxString::FromAscii(s));
delete [] s;
return TRUE;