]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/ole/dropsrc.cpp
add support for alpha in color dialog on OSX, see #14127
[wxWidgets.git] / src / msw / ole / dropsrc.cpp
index 86f31d8c585e78e0c5453a76e49f1aee8d53e9a3..9118eecef8f3afb0ac61bc415a215a3de0be6a06 100644 (file)
@@ -1,12 +1,12 @@
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        msw/ole/dropsrc.cpp
+// Name:        src/msw/ole/dropsrc.cpp
 // Purpose:     implementation of wxIDropSource and wxDropSource
 // Author:      Vadim Zeitlin
 // Modified by:
 // Created:     10.05.98
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
-  #pragma implementation "dropsrc.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #if defined(__BORLANDC__)
   #pragma hdrstop
 #endif
-#ifndef WX_PRECOMP
-#include "wx/window.h"
-#endif
 
-#include "wx/setup.h"
+#if wxUSE_OLE && wxUSE_DRAG_AND_DROP
 
-#if wxUSE_DRAG_AND_DROP
+#ifndef WX_PRECOMP
+    #include "wx/window.h"
+    #include "wx/log.h"
+#endif
 
-#include "wx/log.h"
-#include "wx/dataobj.h"
-#include "wx/msw/ole/dropsrc.h"
+#include "wx/dnd.h"
 
-#include <windows.h>
-#ifdef wxUSE_NORLANDER_HEADERS
-#include <ole2.h>
-#endif
+#include "wx/msw/private.h"
 
-#ifndef __WIN32__
-  #include <ole2.h>
-  #include <olestd.h>
+// for some compilers, the entire ole2.h must be included, not only oleauto.h
+#if wxUSE_NORLANDER_HEADERS || defined(__WATCOMC__) || defined(__WXWINCE__)
+    #include <ole2.h>
 #endif
 
 #include <oleauto.h>
@@ -61,16 +52,19 @@ class wxIDropSource : public IDropSource
 {
 public:
   wxIDropSource(wxDropSource *pDropSource);
-
-  DECLARE_IUNKNOWN_METHODS;
+  virtual ~wxIDropSource() { }
 
   // IDropSource
   STDMETHODIMP QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState);
   STDMETHODIMP GiveFeedback(DWORD dwEffect);
 
+    DECLARE_IUNKNOWN_METHODS;
+
 private:
   DWORD         m_grfInitKeyState;  // button which started the d&d operation
   wxDropSource *m_pDropSource;      // pointer to C++ class we belong to
+
+  wxDECLARE_NO_COPY_CLASS(wxIDropSource);
 };
 
 // ============================================================================
@@ -93,7 +87,6 @@ wxIDropSource::wxIDropSource(wxDropSource *pDropSource)
 
   m_pDropSource = pDropSource;
   m_grfInitKeyState = 0;
-  m_cRef = 0;
 }
 
 // Name    : wxIDropSource::QueryContinueDrag
@@ -140,8 +133,7 @@ STDMETHODIMP wxIDropSource::GiveFeedback(DWORD dwEffect)
   else
     effect = wxDragNone;
 
-  if ( m_pDropSource->GiveFeedback(effect,
-                                   (dwEffect & DROPEFFECT_SCROLL) != 0 ) )
+  if ( m_pDropSource->GiveFeedback(effect) )
     return S_OK;
 
   return DRAGDROP_S_USEDEFAULTCURSORS;
@@ -156,46 +148,50 @@ STDMETHODIMP wxIDropSource::GiveFeedback(DWORD dwEffect)
 // common part of all ctors
 void wxDropSource::Init()
 {
-  m_pIDropSource = new wxIDropSource(this);
-  m_pIDropSource->AddRef();
-}
-
-wxDropSource::wxDropSource(wxWindow* WXUNUSED(win))
-{
-  Init();
-  m_pData = NULL;
+    m_pIDropSource = new wxIDropSource(this);
+    m_pIDropSource->AddRef();
 }
 
-wxDropSource::wxDropSource(wxDataObject& data, wxWindow* WXUNUSED(win))
+wxDropSource::wxDropSource(wxWindow* WXUNUSED(win),
+                           const wxCursor &cursorCopy,
+                           const wxCursor &cursorMove,
+                           const wxCursor &cursorStop)
+            : wxDropSourceBase(cursorCopy, cursorMove, cursorStop)
 {
-  Init();
-  SetData(data);
+    Init();
 }
 
-void wxDropSource::SetData(wxDataObject& data)
+wxDropSource::wxDropSource(wxDataObject& data,
+                           wxWindow* WXUNUSED(win),
+                           const wxCursor &cursorCopy,
+                           const wxCursor &cursorMove,
+                           const wxCursor &cursorStop)
+            : wxDropSourceBase(cursorCopy, cursorMove, cursorStop)
 {
-  m_pData = &data;
+    Init();
+    SetData(data);
 }
 
 wxDropSource::~wxDropSource()
 {
-  m_pIDropSource->Release();
+    m_pIDropSource->Release();
 }
 
 // Name    : DoDragDrop
 // Purpose : start drag and drop operation
 // Returns : wxDragResult - the code of performed operation
-// Params  : [in] bool bAllowMove: if false, only copy is allowed
+// Params  : [in] int flags: specifies if moving is allowe (or only copying)
 // Notes   : you must call SetData() before if you had used def ctor
-wxDragResult wxDropSource::DoDragDrop(bool bAllowMove)
+wxDragResult wxDropSource::DoDragDrop(int flags)
 {
-  wxCHECK_MSG( m_pData != NULL, wxDragNone, _T("No data in wxDropSource!") );
+  wxCHECK_MSG( m_data != NULL, wxDragNone, wxT("No data in wxDropSource!") );
 
   DWORD dwEffect;
-  HRESULT hr = ::DoDragDrop(m_pData->GetInterface(),
+  HRESULT hr = ::DoDragDrop(m_data->GetInterface(),
                             m_pIDropSource,
-                            bAllowMove ? DROPEFFECT_COPY | DROPEFFECT_MOVE
-                                       : DROPEFFECT_COPY,
+                            (flags & wxDrag_AllowMove)
+                                ? DROPEFFECT_COPY | DROPEFFECT_MOVE
+                                : DROPEFFECT_COPY,
                             &dwEffect);
 
   if ( hr == DRAGDROP_S_CANCEL ) {
@@ -207,11 +203,8 @@ wxDragResult wxDropSource::DoDragDrop(bool bAllowMove)
     }
     else if ( dwEffect & DROPEFFECT_MOVE ) {
       // consistency check: normally, we shouldn't get "move" at all
-      // here if !bAllowMove, but in practice it does happen quite often
-      if ( bAllowMove )
-        return wxDragMove;
-      else
-        return wxDragCopy;
+      // here if we don't allow it, but in practice it does happen quite often
+      return (flags & wxDrag_AllowMove) ? wxDragMove : wxDragCopy;
     }
     else {
       // not copy or move
@@ -220,11 +213,12 @@ wxDragResult wxDropSource::DoDragDrop(bool bAllowMove)
   }
   else {
     if ( FAILED(hr) ) {
-      wxLogApiError("DoDragDrop", hr);
-      wxLogError(_T("Drag & drop operation failed."));
+      wxLogApiError(wxT("DoDragDrop"), hr);
+      wxLogError(wxT("Drag & drop operation failed."));
     }
     else {
-      wxLogDebug(_T("Unexpected success return code %08lx from DoDragDrop."), hr);
+      wxLogDebug(wxT("Unexpected success return code %08lx from DoDragDrop."),
+                 hr);
     }
 
     return wxDragError;
@@ -235,11 +229,20 @@ wxDragResult wxDropSource::DoDragDrop(bool bAllowMove)
 // Purpose : visually inform the user about d&d operation state
 // Returns : bool: true if we do all ourselves or false for default feedback
 // Params  : [in] DragResult effect - what would happen if we dropped now
-//           [in] bool bScrolling   - true if target is scrolling
 // Notes   : here we just leave this stuff for default implementation
-bool wxDropSource::GiveFeedback(wxDragResult effect, bool bScrolling)
+bool wxDropSource::GiveFeedback(wxDragResult effect)
 {
-  return FALSE;
+    const wxCursor& cursor = GetCursor(effect);
+    if ( cursor.IsOk() )
+    {
+        ::SetCursor((HCURSOR)cursor.GetHCURSOR());
+
+        return true;
+    }
+    else
+    {
+        return false;
+    }
 }
 
-#endif  //USE_DRAG_AND_DROP
+#endif  // wxUSE_OLE && wxUSE_DRAG_AND_DROP