]> 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 21eae488199f83bba4aef926cb36aa1c52c14bdf..fdcae65b8b9dc5e3662b702b8afdaac3069632dc 100644 (file)
 // ----------------------------------------------------------------------------
 
 #ifdef __GNUG__
-  #pragma implementation "dataobj.h"
+    #pragma implementation "dataobj.h"
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #if defined(__BORLANDC__)
-  #pragma hdrstop
+    #pragma hdrstop
 #endif
+
+#if defined(__WIN32__) && !defined(__GNUWIN32_OLD__)
+
 #ifndef WX_PRECOMP
-#include "wx/intl.h"
+    #include "wx/intl.h"
+    #include "wx/log.h"
 #endif
-#include "wx/defs.h"
 
-#if defined(__WIN32__) && !defined(__GNUWIN32__) || defined(wxUSE_NORLANDER_HEADERS)
-
-#include "wx/log.h"
 #include "wx/dataobj.h"
 
-#include <windows.h>
+#include "wx/msw/private.h"         // includes <windows.h>
+
 #ifdef wxUSE_NORLANDER_HEADERS
   #include <ole2.h>
 #endif
@@ -50,7 +51,9 @@
 
 #include <shlobj.h>
 
-#include  "wx/msw/ole/oleutils.h"
+#include "wx/msw/ole/oleutils.h"
+
+#include "wx/msw/dib.h"
 
 // ----------------------------------------------------------------------------
 // functions
     #define GetTymedName(tymed) ""
 #endif // Debug/!Debug
 
-// to be moved into wx/msw/bitmap.h
-extern size_t wxConvertBitmapToDIB(BITMAPINFO *pbi, const wxBitmap& bitmap);
-extern wxBitmap wxConvertDIBToBitmap(const BITMAPINFO *bmi);
-
 // ----------------------------------------------------------------------------
 // wxIEnumFORMATETC interface implementation
 // ----------------------------------------------------------------------------
@@ -74,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;
@@ -98,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
@@ -124,22 +135,6 @@ private:
     bool m_mustDelete;
 };
 
-// ----------------------------------------------------------------------------
-// small helper class for getting screen DC (we're working with bitmaps and
-// DIBs here)
-// ----------------------------------------------------------------------------
-
-class ScreenHDC
-{
-public:
-    ScreenHDC() { m_hdc = GetDC(NULL);    }
-   ~ScreenHDC() { ReleaseDC(NULL, m_hdc); }
-    operator HDC() const { return m_hdc;  }
-
-private:
-    HDC m_hdc;
-};
-
 // ============================================================================
 // implementation
 // ============================================================================
@@ -314,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;
 
@@ -351,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);
         }
 
@@ -374,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
@@ -425,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;
@@ -466,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:
@@ -484,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
@@ -508,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);
@@ -663,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
@@ -736,12 +741,12 @@ size_t wxBitmapDataObject::GetDataSize() const
 
 bool wxBitmapDataObject::GetDataHere(void *buf) const
 {
-    return wxConvertBitmapToDIB((BITMAPINFO *)buf, GetBitmap()) != 0;
+    return wxConvertBitmapToDIB((LPBITMAPINFO)buf, GetBitmap()) != 0;
 }
 
 bool wxBitmapDataObject::SetData(size_t len, const void *buf)
 {
-    wxBitmap bitmap(wxConvertDIBToBitmap((const BITMAPINFO *)buf));
+    wxBitmap bitmap(wxConvertDIBToBitmap((const LPBITMAPINFO)buf));
 
     if ( !bitmap.Ok() ) {
         wxFAIL_MSG(wxT("pasting/dropping invalid bitmap"));
@@ -776,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;
 
@@ -1065,7 +1070,7 @@ static size_t wxGetNumOfBitmapColors(size_t bitsPerPixel)
     }
 }
 
-size_t wxConvertBitmapToDIB(BITMAPINFO *pbi, const wxBitmap& bitmap)
+size_t wxConvertBitmapToDIB(LPBITMAPINFO pbi, const wxBitmap& bitmap)
 {
     wxASSERT_MSG( bitmap.Ok(), wxT("invalid bmp can't be converted to DIB") );
 
@@ -1139,7 +1144,7 @@ size_t wxConvertBitmapToDIB(BITMAPINFO *pbi, const wxBitmap& bitmap)
     return dwLen + bi.biSizeImage;
 }
 
-wxBitmap wxConvertDIBToBitmap(const BITMAPINFO *pbmi)
+wxBitmap wxConvertDIBToBitmap(const LPBITMAPINFO pbmi)
 {
     // here we get BITMAPINFO struct followed by the actual bitmap bits and
     // BITMAPINFO starts with BITMAPINFOHEADER followed by colour info
@@ -1177,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;
     }
 }