]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/clipbrd.cpp
better wxGetUserId/Name
[wxWidgets.git] / src / msw / clipbrd.cpp
index f15f9d8fc8ba406c4ba16b45c232e619d1c06f43..5f8cc9d74d6f1c5b941bc502449c6958bc33ac03 100644 (file)
     #include "wx/frame.h"
     #include "wx/bitmap.h"
     #include "wx/utils.h"
+    #include "wx/intl.h"
 #endif
 
 #if wxUSE_METAFILE
     #include "wx/metafile.h"
 #endif
 
+#include "wx/log.h"
 #include "wx/clipbrd.h"
 
+#include <string.h>
 #include <windows.h>
 
 #include "wx/msw/private.h"
 // therefore so is wxClipboard :-(
 #if wxUSE_DRAG_AND_DROP
     #include "wx/dataobj.h"
+
+    static bool wxSetClipboardData(wxDataObject *data);
 #endif
 
-#include <string.h>
+#ifdef __WIN16__
+    #define memcpy hmemcpy
+#endif
 
 // ===========================================================================
 // implementation
@@ -74,7 +81,7 @@ static bool gs_wxClipboardIsOpen = FALSE;
 
 bool wxOpenClipboard()
 {
-    wxCHECK_MSG( !gs_wxClipboardIsOpen, TRUE, "clipboard already opened." );
+    wxCHECK_MSG( !gs_wxClipboardIsOpen, TRUE, _T("clipboard already opened.") );
 
     wxWindow *win = wxTheApp->GetTopWindow();
     if ( win )
@@ -88,7 +95,7 @@ bool wxOpenClipboard()
     }
     else
     {
-        wxLogDebug("Can not open clipboard without a main window,");
+        wxLogDebug(_T("Can not open clipboard without a main window."));
 
         return FALSE;
     }
@@ -96,7 +103,7 @@ bool wxOpenClipboard()
 
 bool wxCloseClipboard()
 {
-    wxCHECK_MSG( gs_wxClipboardIsOpen, FALSE, "clipboard is not opened" );
+    wxCHECK_MSG( gs_wxClipboardIsOpen, FALSE, _T("clipboard is not opened") );
 
     gs_wxClipboardIsOpen = FALSE;
 
@@ -132,6 +139,38 @@ bool wxIsClipboardFormatAvailable(wxDataFormat dataFormat)
     return ::IsClipboardFormatAvailable(dataFormat) != 0;
 }
 
+#if wxUSE_DRAG_AND_DROP
+static bool wxSetClipboardData(wxDataObject *data)
+{
+    size_t size = data->GetDataSize();
+    HANDLE hGlobal = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, size);
+    if ( !hGlobal )
+    {
+        wxLogSysError(_("Failed to allocate %dKb of memory for clipboard "
+                        "transfer."), size / 1024);
+
+        return FALSE;
+    }
+
+    LPVOID lpGlobalMemory = ::GlobalLock(hGlobal);
+
+    data->GetDataHere(lpGlobalMemory);
+
+    GlobalUnlock(hGlobal);
+
+    wxDataFormat format = data->GetPreferredFormat();
+    if ( !::SetClipboardData(format, hGlobal) )
+    {
+        wxLogSysError(_("Failed to set clipboard data in format %s"),
+                      wxDataObject::GetFormatName(format));
+
+        return FALSE;
+    }
+
+    return TRUE;
+}
+#endif // wxUSE_DRAG_AND_DROP
+
 bool wxSetClipboardData(wxDataFormat dataFormat,
                         const void *data,
                         int width, int height)
@@ -193,11 +232,7 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
             {
                 wxMetafile *wxMF = (wxMetafile *)data;
                 HANDLE data = GlobalAlloc(GHND, sizeof(METAFILEPICT) + 1);
-#ifdef __WINDOWS_386__
-                METAFILEPICT *mf = (METAFILEPICT *)MK_FP32(GlobalLock(data));
-#else
                 METAFILEPICT *mf = (METAFILEPICT *)GlobalLock(data);
-#endif
 
                 mf->mm = wxMF->GetWindowsMappingMode();
                 mf->xExt = width;
@@ -234,19 +269,9 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
                 HANDLE hGlobalMemory = GlobalAlloc(GHND, l);
                 if ( hGlobalMemory )
                 {
-#ifdef __WINDOWS_386__
-                    LPSTR lpGlobalMemory = (LPSTR)MK_FP32(GlobalLock(hGlobalMemory));
-#else
                     LPSTR lpGlobalMemory = (LPSTR)GlobalLock(hGlobalMemory);
-#endif
 
-#ifdef __WIN32__
                     memcpy(lpGlobalMemory, s, l);
-#elif defined(__WATCOMC__) && defined(__WINDOWS_386__)
-                    memcpy(lpGlobalMemory, s, l);
-#else
-                    hmemcpy(lpGlobalMemory, s, l);
-#endif
 
                     GlobalUnlock(hGlobalMemory);
                 }
@@ -324,7 +349,6 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
         case CF_TIFF:
         case CF_PALETTE:
         case wxDF_DIB:
-        default:
             {
                 wxLogError(_("Unsupported clipboard format."));
                 return FALSE;
@@ -348,25 +372,39 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
                 if (!s)
                     break;
 
-#ifdef __WINDOWS_386__
-                LPSTR lpGlobalMemory = (LPSTR)MK_FP32(GlobalLock(hGlobalMemory));
-#else
                 LPSTR lpGlobalMemory = (LPSTR)::GlobalLock(hGlobalMemory);
-#endif
 
-#ifdef __WIN32__
-                memcpy(s, lpGlobalMemory, hsize);
-#elif __WATCOMC__ && defined(__WINDOWS_386__)
                 memcpy(s, lpGlobalMemory, hsize);
-#else
-                hmemcpy(s, lpGlobalMemory, hsize);
-#endif
 
                 ::GlobalUnlock(hGlobalMemory);
 
                 retval = s;
                 break;
             }
+
+        default:
+            {
+                HANDLE hGlobalMemory = ::GetClipboardData(dataFormat);
+                if ( !hGlobalMemory )
+                    break;
+
+                DWORD size = ::GlobalSize(hGlobalMemory);
+                if ( len )
+                    *len = size;
+
+                void *buf = malloc(size);
+                if ( !buf )
+                    break;
+
+                LPSTR lpGlobalMemory = (LPSTR)::GlobalLock(hGlobalMemory);
+
+                memcpy(buf, lpGlobalMemory, size);
+
+                ::GlobalUnlock(hGlobalMemory);
+
+                retval = buf;
+                break;
+            }
     }
 
     if ( !retval )
@@ -377,18 +415,18 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
     return retval;
 }
 
-wxDataFormat  wxEnumClipboardFormats(wxDataFormat dataFormat)
+wxDataFormat wxEnumClipboardFormats(wxDataFormat dataFormat)
 {
-  return (wxDataFormat)::EnumClipboardFormats(dataFormat);
+  return ::EnumClipboardFormats(dataFormat);
 }
 
-int wxRegisterClipboardFormat(char *formatName)
+int wxRegisterClipboardFormat(wxChar *formatName)
 {
   return ::RegisterClipboardFormat(formatName);
 }
 
 bool wxGetClipboardFormatName(wxDataFormat dataFormat,
-                              char *formatName,
+                              wxChar *formatName,
                               int maxCount)
 {
   return ::GetClipboardFormatName((int)dataFormat, formatName, maxCount) > 0;
@@ -432,10 +470,10 @@ bool wxClipboard::SetData( wxDataObject *data )
 
 bool wxClipboard::AddData( wxDataObject *data )
 {
-    wxCHECK_MSG( data, FALSE, "data is invalid" );
+    wxCHECK_MSG( data, FALSE, _T("data is invalid") );
 
 #if wxUSE_DRAG_AND_DROP
-    wxCHECK_MSG( wxIsClipboardOpened(), FALSE, "clipboard not open" );
+    wxCHECK_MSG( wxIsClipboardOpened(), FALSE, _T("clipboard not open") );
 
     wxDataFormat format = data->GetFormat();
 
@@ -470,16 +508,11 @@ bool wxClipboard::AddData( wxDataObject *data )
 #endif // wxUSE_METAFILE
 
         default:
-            wxLogError(_("Can not put data in format '%s' on clipboard."),
-                       wxDataObject::GetFormatName(format));
-
-            return FALSE;
+            return wxSetClipboardData(data);
     }
-
+#else // !wxUSE_DRAG_AND_DROP
     return FALSE;
-#else
-    return FALSE;
-#endif
+#endif // wxUSE_DRAG_AND_DROP/!wxUSE_DRAG_AND_DROP
 }
 
 void wxClipboard::Close()
@@ -494,7 +527,7 @@ bool wxClipboard::IsSupported( wxDataFormat format )
 
 bool wxClipboard::GetData( wxDataObject *data )
 {
-    wxCHECK_MSG( wxIsClipboardOpened(), FALSE, "clipboard not open" );
+    wxCHECK_MSG( wxIsClipboardOpened(), FALSE, _T("clipboard not open") );
 
 #if wxUSE_DRAG_AND_DROP
     wxDataFormat format = data->GetFormat();
@@ -545,8 +578,18 @@ bool wxClipboard::GetData( wxDataObject *data )
         }
 #endif
         default:
-            wxLogError(_("Can not get data in format '%s' from clipboard."),
-                       wxDataObject::GetFormatName(format));
+            {
+                long len;
+                void *buf = wxGetClipboardData(format, &len);
+                if ( buf )
+                {
+                    // FIXME this is for testing only!!
+                    ((wxPrivateDataObject *)data)->SetData(buf, len);
+                    free(buf);
+
+                    return TRUE;
+                }
+            }
 
             return FALSE;
     }