]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/ole/droptgt.cpp
fixed crash on startup under GTK
[wxWidgets.git] / src / msw / ole / droptgt.cpp
index 329716dd277048155c397a15a0275ca110a7db34..46da03329de8afb6eeedc28115bad92937d29924 100644 (file)
@@ -6,7 +6,7 @@
 // Created:
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
@@ -17,7 +17,7 @@
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "droptgt.h"
 #endif
 
 
 #include "wx/setup.h"
 
-#if wxUSE_DRAG_AND_DROP
+#if wxUSE_OLE && wxUSE_DRAG_AND_DROP
 
+#include "wx/msw/private.h"
 #include "wx/log.h"
 
+#ifdef __WXWINCE__
+    #include <winreg.h>
+    #include <ole2.h>
+#endif
+
 #ifdef __WIN32__
-    #ifndef __GNUWIN32__
+    #if !defined(__GNUWIN32__) || wxUSE_NORLANDER_HEADERS
+        #if wxCHECK_W32API_VERSION( 1, 0 )
+            #include "wx/msw/wrapwin.h"
+        #endif
         #include <shlobj.h>            // for DROPFILES structure
     #endif
 #else
 
 #include "wx/dnd.h"
 
-#ifndef __WIN32__
-    #include <ole2.h>
-    #include <olestd.h>
-#endif
-
 #include "wx/msw/ole/oleutils.h"
 
 // ----------------------------------------------------------------------------
@@ -61,7 +65,7 @@ class wxIDropTarget : public IDropTarget
 {
 public:
     wxIDropTarget(wxDropTarget *p);
-    ~wxIDropTarget();
+    virtual ~wxIDropTarget();
 
     // accessors for wxDropTarget
     void SetHwnd(HWND hwnd) { m_hwnd = hwnd; }
@@ -82,6 +86,8 @@ protected:
 
     // get default drop effect for given keyboard flags
     static inline DWORD GetDropEffect(DWORD flags);
+
+    DECLARE_NO_COPY_CLASS(wxIDropTarget)
 };
 
 // ----------------------------------------------------------------------------
@@ -110,7 +116,6 @@ DWORD wxIDropTarget::GetDropEffect(DWORD flags)
 
 wxIDropTarget::wxIDropTarget(wxDropTarget *pTarget)
 {
-  m_cRef         = 0;
   m_pTarget      = pTarget;
   m_pIDataObject = NULL;
 }
@@ -139,9 +144,31 @@ STDMETHODIMP wxIDropTarget::DragEnter(IDataObject *pIDataSource,
                                       POINTL       pt,
                                       DWORD       *pdwEffect)
 {
-    wxLogDebug(wxT("IDropTarget::DragEnter"));
+    wxLogTrace(wxTRACE_OleCalls, wxT("IDropTarget::DragEnter"));
 
-    wxASSERT( m_pIDataObject == NULL );
+    wxASSERT_MSG( m_pIDataObject == NULL,
+                  _T("drop target must have data object") );
+
+    // show the list of formats supported by the source data object for the
+    // debugging purposes, this is quite useful sometimes - please don't remove
+#if 0
+    IEnumFORMATETC *penumFmt;
+    if ( SUCCEEDED(pIDataSource->EnumFormatEtc(DATADIR_GET, &penumFmt)) )
+    {
+        FORMATETC fmt;
+        while ( penumFmt->Next(1, &fmt, NULL) == S_OK )
+        {
+            wxLogDebug(_T("Drop source supports format %s"),
+                       wxDataObject::GetFormatName(fmt.cfFormat));
+        }
+
+        penumFmt->Release();
+    }
+    else
+    {
+        wxLogLastError(_T("IDataObject::EnumFormatEtc"));
+    }
+#endif // 0
 
     if ( !m_pTarget->IsAcceptedData(pIDataSource) ) {
         // we don't accept this kind of data
@@ -157,7 +184,7 @@ STDMETHODIMP wxIDropTarget::DragEnter(IDataObject *pIDataSource,
     // we need client coordinates to pass to wxWin functions
     if ( !ScreenToClient(m_hwnd, (POINT *)&pt) )
     {
-        wxLogLastError("ScreenToClient");
+        wxLogLastError(wxT("ScreenToClient"));
     }
 
     // give some visual feedback
@@ -197,7 +224,7 @@ STDMETHODIMP wxIDropTarget::DragOver(DWORD   grfKeyState,
     // we need client coordinates to pass to wxWin functions
     if ( !ScreenToClient(m_hwnd, (POINT *)&pt) )
     {
-        wxLogLastError("ScreenToClient");
+        wxLogLastError(wxT("ScreenToClient"));
     }
 
     *pdwEffect = ConvertDragResultToEffect(
@@ -213,7 +240,7 @@ STDMETHODIMP wxIDropTarget::DragOver(DWORD   grfKeyState,
 // Notes   : good place to do any clean-up
 STDMETHODIMP wxIDropTarget::DragLeave()
 {
-  wxLogDebug(wxT("IDropTarget::DragLeave"));
+  wxLogTrace(wxTRACE_OleCalls, wxT("IDropTarget::DragLeave"));
 
   // remove the UI feedback
   m_pTarget->OnLeave();
@@ -238,7 +265,7 @@ STDMETHODIMP wxIDropTarget::Drop(IDataObject *pIDataSource,
                                  POINTL       pt,
                                  DWORD       *pdwEffect)
 {
-    wxLogDebug(wxT("IDropTarget::Drop"));
+    wxLogTrace(wxTRACE_OleCalls, wxT("IDropTarget::Drop"));
 
     // TODO I don't know why there is this parameter, but so far I assume
     //      that it's the same we've already got in DragEnter
@@ -250,7 +277,7 @@ STDMETHODIMP wxIDropTarget::Drop(IDataObject *pIDataSource,
     // we need client coordinates to pass to wxWin functions
     if ( !ScreenToClient(m_hwnd, (POINT *)&pt) )
     {
-        wxLogLastError("ScreenToClient");
+        wxLogLastError(wxT("ScreenToClient"));
     }
 
     // first ask the drop target if it wants data
@@ -260,7 +287,7 @@ STDMETHODIMP wxIDropTarget::Drop(IDataObject *pIDataSource,
 
         // and now it has the data
         wxDragResult rc = ConvertDragEffectToResult(GetDropEffect(grfKeyState));
-        m_pTarget->OnData(pt.x, pt.y, rc);
+        rc = m_pTarget->OnData(pt.x, pt.y, rc);
         if ( wxIsDragResultOk(rc) ) {
             // operation succeeded
             *pdwEffect = ConvertDragResultToEffect(rc);
@@ -303,17 +330,24 @@ wxDropTarget::~wxDropTarget()
 
 bool wxDropTarget::Register(WXHWND hwnd)
 {
-    HRESULT hr = ::CoLockObjectExternal(m_pIDropTarget, TRUE, FALSE);
+    HRESULT hr;
+
+    // May exist in later WinCE versions
+#ifndef __WXWINCE__
+    hr = ::CoLockObjectExternal(m_pIDropTarget, TRUE, FALSE);
     if ( FAILED(hr) ) {
-        wxLogApiError("CoLockObjectExternal", hr);
+        wxLogApiError(wxT("CoLockObjectExternal"), hr);
         return FALSE;
     }
+#endif
 
     hr = ::RegisterDragDrop((HWND) hwnd, m_pIDropTarget);
     if ( FAILED(hr) ) {
+    // May exist in later WinCE versions
+#ifndef __WXWINCE__
         ::CoLockObjectExternal(m_pIDropTarget, FALSE, FALSE);
-
-        wxLogApiError("RegisterDragDrop", hr);
+#endif
+        wxLogApiError(wxT("RegisterDragDrop"), hr);
         return FALSE;
     }
 
@@ -328,10 +362,13 @@ void wxDropTarget::Revoke(WXHWND hwnd)
     HRESULT hr = ::RevokeDragDrop((HWND) hwnd);
 
     if ( FAILED(hr) ) {
-        wxLogApiError("RevokeDragDrop", hr);
+        wxLogApiError(wxT("RevokeDragDrop"), hr);
     }
 
+    // May exist in later WinCE versions
+#ifndef __WXWINCE__
     ::CoLockObjectExternal(m_pIDropTarget, FALSE, TRUE);
+#endif
 
     m_pIDropTarget->SetHwnd(0);
 }
@@ -377,11 +414,11 @@ bool wxDropTarget::GetData()
             rc = TRUE;
         }
         else {
-            wxLogLastError("IDataObject::SetData()");
+            wxLogApiError(wxT("IDataObject::SetData()"), hr);
         }
     }
     else {
-        wxLogLastError("IDataObject::GetData()");
+        wxLogApiError(wxT("IDataObject::GetData()"), hr);
     }
 
     return rc;
@@ -421,7 +458,8 @@ wxDataFormat wxDropTarget::GetSupportedFormat(IDataObject *pIDataSource) const
 
     // get the list of supported formats
     size_t nFormats = m_dataObject->GetFormatCount(wxDataObject::Set);
-    wxDataFormat format, *formats;
+    wxDataFormat format;
+    wxDataFormat *formats;
     formats = nFormats == 1 ? &format :  new wxDataFormat[nFormats];
 
     m_dataObject->GetAllFormats(formats, wxDataObject::Set);
@@ -458,6 +496,9 @@ static wxDragResult ConvertDragEffectToResult(DWORD dwEffect)
         case DROPEFFECT_COPY:
             return wxDragCopy;
 
+        case DROPEFFECT_LINK:
+            return wxDragLink;
+
         case DROPEFFECT_MOVE:
             return wxDragMove;
 
@@ -476,6 +517,9 @@ static DWORD ConvertDragResultToEffect(wxDragResult result)
         case wxDragCopy:
             return DROPEFFECT_COPY;
 
+        case wxDragLink:
+            return DROPEFFECT_LINK;
+
         case wxDragMove:
             return DROPEFFECT_MOVE;