]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/clipbrd.cpp
implementation changes to closer follow MSW, crashes fixed
[wxWidgets.git] / src / msw / clipbrd.cpp
index c33ba4313da76725a04d27f5194867a50d22f855..b857b77427cfc7d412ba1400684d48173f0a4aea 100644 (file)
@@ -17,7 +17,7 @@
 // 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
 
@@ -68,7 +67,7 @@
     #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
 // ===========================================================================
@@ -164,7 +159,7 @@ bool wxIsClipboardFormatAvailable(wxDataFormat dataFormat)
         case CF_BITMAP:
             return ::IsClipboardFormatAvailable(CF_DIB) != 0;
 
-#if wxUSE_ENH_METAFILE && !defined(__WIN16__)
+#if wxUSE_ENH_METAFILE && !defined(__WIN16__) && !defined(__WXWINCE__)
         case CF_METAFILEPICT:
             return ::IsClipboardFormatAvailable(CF_ENHMETAFILE) != 0;
 #endif // wxUSE_ENH_METAFILE
@@ -174,6 +169,7 @@ bool wxIsClipboardFormatAvailable(wxDataFormat dataFormat)
     }
 }
 
+
 bool wxSetClipboardData(wxDataFormat dataFormat,
                         const void *data,
                         int width, int height)
@@ -218,22 +214,24 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
                 break;
             }
 
+#if wxUSE_WXDIB
         case wxDF_DIB:
             {
-#if wxUSE_IMAGE_LOADING_IN_MSW
                 wxBitmap *bitmap = (wxBitmap *)data;
-                HBITMAP hBitmap = (HBITMAP)bitmap->GetHBITMAP();
-                // NULL palette means to use the system one
-                HANDLE hDIB = wxBitmapToDIB(hBitmap, (HPALETTE)NULL);
-                handle = SetClipboardData(CF_DIB, hDIB);
-#endif // wxUSE_IMAGE_LOADING_IN_MSW
+
+                HGLOBAL hDIB = wxDIB::ConvertFromBitmap(GetHbitmapOf(*bitmap));
+                if ( hDIB )
+                {
+                    handle = ::SetClipboardData(CF_DIB, hDIB);
+                }
                 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;
@@ -252,7 +250,7 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
             }
 #endif // wxUSE_METAFILE
 
-#if wxUSE_ENH_METAFILE && !defined(__WIN16__)
+#if wxUSE_ENH_METAFILE && !defined(__WIN16__) && !defined(__WXWINCE__)
         case wxDF_ENHMETAFILE:
             {
                 wxEnhMetaFile *emf = (wxEnhMetaFile *)data;
@@ -390,6 +388,7 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
 
     switch ( dataFormat )
     {
+#ifndef __WXWINCE__
         case wxDF_BITMAP:
             {
                 BITMAP bm;
@@ -431,13 +430,10 @@ 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;
             }
-
+#endif
         case wxDF_METAFILE:
         case CF_SYLK:
         case CF_DIF:
@@ -465,11 +461,11 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
                 if (!s)
                     break;
 
-                LPSTR lpGlobalMemory = (LPSTR)::GlobalLock(hGlobalMemory);
+                LPSTR lpGlobalMemory = (LPSTR) GlobalLock(hGlobalMemory);
 
                 memcpy(s, lpGlobalMemory, hsize);
 
-                ::GlobalUnlock(hGlobalMemory);
+                GlobalUnlock(hGlobalMemory);
 
                 retval = s;
                 break;
@@ -489,11 +485,11 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
                 if ( !buf )
                     break;
 
-                LPSTR lpGlobalMemory = (LPSTR)::GlobalLock(hGlobalMemory);
+                LPSTR lpGlobalMemory = (LPSTR) GlobalLock(hGlobalMemory);
 
                 memcpy(buf, lpGlobalMemory, size);
 
-                ::GlobalUnlock(hGlobalMemory);
+                GlobalUnlock(hGlobalMemory);
 
                 retval = buf;
                 break;
@@ -534,6 +530,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxObject)
 wxClipboard::wxClipboard()
 {
     m_clearOnExit = FALSE;
+    m_isOpened = FALSE;
 }
 
 wxClipboard::~wxClipboard()
@@ -577,6 +574,7 @@ bool wxClipboard::Flush()
 bool wxClipboard::Open()
 {
     // OLE opens clipboard for us
+    m_isOpened = TRUE;
 #if wxUSE_OLE_CLIPBOARD
     return TRUE;
 #else
@@ -587,7 +585,7 @@ bool wxClipboard::Open()
 bool wxClipboard::IsOpened() const
 {
 #if wxUSE_OLE_CLIPBOARD
-    return TRUE;
+    return m_isOpened;
 #else
     return wxIsClipboardOpened();
 #endif
@@ -680,7 +678,7 @@ bool wxClipboard::AddData( wxDataObject *data )
 // This didn't compile, of course
 //            return wxSetClipboardData(data);
             // TODO
-            wxLogError("Not implemented.");
+            wxLogError(wxT("Not implemented."));
             return FALSE;
         }
     }
@@ -691,6 +689,7 @@ bool wxClipboard::AddData( wxDataObject *data )
 
 void wxClipboard::Close()
 {
+    m_isOpened = FALSE;
     // OLE closes clipboard for us
 #if !wxUSE_OLE_CLIPBOARD
     wxCloseClipboard();
@@ -806,7 +805,7 @@ bool wxClipboard::GetData( wxDataObject& data )
                 case CF_BITMAP:
                     formatEtc.tymed = TYMED_GDI;
                     break;
-
+#ifndef __WXWINCE__
                 case CF_METAFILEPICT:
                     formatEtc.tymed = TYMED_MFPICT;
                     break;
@@ -814,7 +813,7 @@ bool wxClipboard::GetData( wxDataObject& data )
                 case CF_ENHMETAFILE:
                     formatEtc.tymed = TYMED_ENHMF;
                     break;
-
+#endif
                 default:
                     formatEtc.tymed = TYMED_HGLOBAL;
             }
@@ -871,7 +870,7 @@ bool wxClipboard::GetData( wxDataObject& data )
             if ( !s )
                 return FALSE;
 
-            textDataObject.SetText(s);
+            textDataObject.SetText(wxString::FromAscii(s));
             delete [] s;
 
             return TRUE;