]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/ole/dataobj.cpp
Found bug that skrewed up display wrt horizontal
[wxWidgets.git] / src / msw / ole / dataobj.cpp
index 72e6a05a9ce2fc71ca789e622ee6d01a1fb6e5bc..fdcae65b8b9dc5e3662b702b8afdaac3069632dc 100644 (file)
@@ -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,7 +309,17 @@ 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");
+                return E_OUTOFMEMORY;
+            }
             pmedium->tymed = TYMED_MFPICT;
             break;
 
@@ -334,7 +356,7 @@ STDMETHODIMP wxIDataObject::GetData(FORMATETC *pformatetcIn, STGMEDIUM *pmedium)
     hr = GetDataHere(pformatetcIn, pmedium);
     if ( FAILED(hr) ) {
         // free resources we allocated
-        if ( pmedium->tymed == TYMED_HGLOBAL ) {
+        if ( pmedium->tymed & (TYMED_HGLOBAL | TYMED_MFPICT) ) {
             GlobalFree(pmedium->hGlobal);
         }
 
@@ -357,12 +379,15 @@ STDMETHODIMP wxIDataObject::GetDataHere(FORMATETC *pformatetc,
                 return E_UNEXPECTED;
             break;
 
-        case TYMED_MFPICT:
-            // this should be copied on bitmaps - but I don't have time for
-            // this now
-            wxFAIL_MSG(wxT("TODO - no support for metafiles in wxDataObject"));
+        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
@@ -408,12 +433,12 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc,
             m_pDataObject->SetData(wxDF_BITMAP, 0, &pmedium->hBitmap);
             break;
 
-        case TYMED_MFPICT:
-            // this should be copied on bitmaps - but I don't have time for
-            // this now
-            wxFAIL_MSG(wxT("TODO - no support for metafiles in wxDataObject"));
+        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;
@@ -449,9 +474,9 @@ 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);
+                        size = ::wcslen((const wchar_t *)pBuf);
                         break;
 #endif
                     case CF_BITMAP:
@@ -467,6 +492,10 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc,
                         size = 0;
                         break;
 
+                    case CF_METAFILEPICT:
+                        size = sizeof(METAFILEPICT);
+                        break;
+
                     default:
                         {
                             // we suppose that the size precedes the data
@@ -491,11 +520,21 @@ STDMETHODIMP wxIDataObject::SetData(FORMATETC *pformatetc,
     }
 
     if ( fRelease ) {
-        // we own the medium, so we must release it - but do *not* free the
-        // bitmap handle fi we have it because we have copied it elsewhere
-        if ( pmedium->tymed == TYMED_GDI )
+        // we own the medium, so we must release it - but do *not* free any
+        // data we pass by handle because we have copied it elsewhere
+        switch ( pmedium->tymed )
         {
-            pmedium->hBitmap = 0;
+            case TYMED_GDI:
+                pmedium->hBitmap = 0;
+                break;
+
+            case TYMED_MFPICT:
+                pmedium->hMetaFilePict = 0;
+                break;
+
+            case TYMED_ENHMF:
+                pmedium->hEnhMetaFile = 0;
+                break;
         }
 
         ReleaseStgMedium(pmedium);
@@ -646,64 +685,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 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[256];
+    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";
 
-        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
+                sprintf(s_szBuf, "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
@@ -759,7 +781,7 @@ bool wxBitmapDataObject2::GetDataHere(void *pBuf) const
     return TRUE;
 }
 
-bool wxBitmapDataObject2::SetData(size_t len, const void *pBuf)
+bool wxBitmapDataObject2::SetData(size_t WXUNUSED(len), const void *pBuf)
 {
     HBITMAP hbmp = *(HBITMAP *)pBuf;
 
@@ -1160,7 +1182,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;
     }
 }