]> git.saurik.com Git - wxWidgets.git/commitdiff
Applied DnD patch, adding a field for setting a default action.
authorRobert Roebling <robert@roebling.de>
Tue, 8 Mar 2005 22:50:46 +0000 (22:50 +0000)
committerRobert Roebling <robert@roebling.de>
Tue, 8 Mar 2005 22:50:46 +0000 (22:50 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32689 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dnd.h
src/gtk/dnd.cpp
src/gtk1/dnd.cpp
src/msw/ole/droptgt.cpp

index 3c893f685a53729de758d4d2d880500cc6e393b6..93bc0f1e18329230e2c31d894e23a38b722055a5 100644 (file)
@@ -141,7 +141,7 @@ public:
     // by wxDropTarget and deleted by it automatically. If you don't give it
     // here, you can use SetDataObject() later.
     wxDropTargetBase(wxDataObject *dataObject = (wxDataObject*)NULL)
-        { m_dataObject = dataObject; }
+        { m_dataObject = dataObject; m_defaultAction = wxDragNone; }
     // dtor deletes our data object
     virtual ~wxDropTargetBase()
         { delete m_dataObject; }
@@ -192,8 +192,21 @@ public:
     // with the data from the drop source if it returns true
     virtual bool GetData() = 0;
 
+    // sets the default action for drag and drop:
+    // use wxDragMove or wxDragCopy to set deafult action to move or copy
+    // and use wxDragNone (default) to set default action specified by
+    // initialization of draging (see wxDropSourceBase::DoDragDrop())
+    void SetDefaultAction(wxDragResult action)
+        { m_defaultAction = action; }
+
+    // returns default action for drag and drop or
+    // wxDragNone if this not specified
+    wxDragResult GetDefaultAction()
+        { return m_defaultAction; }
+
 protected:
     wxDataObject *m_dataObject;
+    wxDragResult m_defaultAction;
 
     DECLARE_NO_COPY_CLASS(wxDropTargetBase)
 };
index 02701c7a5408c48ff8befae7b3a87d692c741ec8..b8b6ecfb7f76de4eb897a2fd6da1e91eb4675b87 100644 (file)
@@ -187,6 +187,9 @@ static gboolean target_drag_motion( GtkWidget *WXUNUSED(widget),
     // only good if we don't have our own preferences - but also the actions
     // field
     wxDragResult result;
+    if (drop_target->GetDefaultAction() == wxDragNone)
+    {
+        // use default action set by wxDropSource::DoDragDrop()
     if ( (gs_flagsForDrag & wxDrag_DefaultMove) == wxDrag_DefaultMove &&
             (context->actions & GDK_ACTION_MOVE ) )
     {
@@ -204,6 +207,21 @@ static gboolean target_drag_motion( GtkWidget *WXUNUSED(widget),
             result = wxDragCopy;
         }
     }
+    }
+    else if (drop_target->GetDefaultAction() == wxDragMove &&
+                (context->actions & GDK_ACTION_MOVE))
+    {
+       result = wxDragMove;
+    }
+    else
+    {
+        if (context->actions & GDK_ACTION_COPY)
+            result = wxDragCopy;
+        else if (context->actions & GDK_ACTION_MOVE)
+            result = wxDragMove;
+        else
+            result = wxDragNone;
+    }
 
     if (drop_target->m_firstMotion)
     {
@@ -220,9 +238,7 @@ static gboolean target_drag_motion( GtkWidget *WXUNUSED(widget),
     if (ret)
     {
         GdkDragAction action;
-        if ((result == wxDragCopy) && (context->actions & GDK_ACTION_COPY) ||
-            (result == wxDragMove) && !(context->actions & GDK_ACTION_MOVE) ||
-            (result == wxDragLink) && !(context->actions & GDK_ACTION_LINK))
+        if (result == wxDragCopy)
             action = GDK_ACTION_COPY;
         else if (result == wxDragLink)
             action = GDK_ACTION_LINK;
index 02701c7a5408c48ff8befae7b3a87d692c741ec8..b8b6ecfb7f76de4eb897a2fd6da1e91eb4675b87 100644 (file)
@@ -187,6 +187,9 @@ static gboolean target_drag_motion( GtkWidget *WXUNUSED(widget),
     // only good if we don't have our own preferences - but also the actions
     // field
     wxDragResult result;
+    if (drop_target->GetDefaultAction() == wxDragNone)
+    {
+        // use default action set by wxDropSource::DoDragDrop()
     if ( (gs_flagsForDrag & wxDrag_DefaultMove) == wxDrag_DefaultMove &&
             (context->actions & GDK_ACTION_MOVE ) )
     {
@@ -204,6 +207,21 @@ static gboolean target_drag_motion( GtkWidget *WXUNUSED(widget),
             result = wxDragCopy;
         }
     }
+    }
+    else if (drop_target->GetDefaultAction() == wxDragMove &&
+                (context->actions & GDK_ACTION_MOVE))
+    {
+       result = wxDragMove;
+    }
+    else
+    {
+        if (context->actions & GDK_ACTION_COPY)
+            result = wxDragCopy;
+        else if (context->actions & GDK_ACTION_MOVE)
+            result = wxDragMove;
+        else
+            result = wxDragNone;
+    }
 
     if (drop_target->m_firstMotion)
     {
@@ -220,9 +238,7 @@ static gboolean target_drag_motion( GtkWidget *WXUNUSED(widget),
     if (ret)
     {
         GdkDragAction action;
-        if ((result == wxDragCopy) && (context->actions & GDK_ACTION_COPY) ||
-            (result == wxDragMove) && !(context->actions & GDK_ACTION_MOVE) ||
-            (result == wxDragLink) && !(context->actions & GDK_ACTION_LINK))
+        if (result == wxDragCopy)
             action = GDK_ACTION_COPY;
         else if (result == wxDragLink)
             action = GDK_ACTION_LINK;
index 2aee28affe3a5f6002020b6b88b3281a9b461cc3..7072586f09c8c9241cddd744562368fb73855c32 100644 (file)
@@ -85,7 +85,7 @@ protected:
     HWND          m_hwnd;         // window we're associated with
 
     // get default drop effect for given keyboard flags
-    static inline DWORD GetDropEffect(DWORD flags);
+    static inline DWORD GetDropEffect(DWORD flags, wxDragResult defaultAction);
 
     DECLARE_NO_COPY_CLASS(wxIDropTarget)
 };
@@ -109,8 +109,10 @@ static DWORD ConvertDragResultToEffect(wxDragResult result);
 // Notes   : We do "move" normally and "copy" if <Ctrl> is pressed,
 //           which is the standard behaviour (currently there is no
 //           way to redefine it)
-DWORD wxIDropTarget::GetDropEffect(DWORD flags)
+DWORD wxIDropTarget::GetDropEffect(DWORD flags, wxDragResult defaultAction)
 {
+  if (defaultAction == wxDragCopy)
+    return flags & MK_SHIFT ? DROPEFFECT_MOVE : DROPEFFECT_COPY;
   return flags & MK_CONTROL ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
 }
 
@@ -189,8 +191,8 @@ STDMETHODIMP wxIDropTarget::DragEnter(IDataObject *pIDataSource,
 
     // give some visual feedback
     *pdwEffect = ConvertDragResultToEffect(
-                    m_pTarget->OnEnter(pt.x, pt.y,
-                        ConvertDragEffectToResult(GetDropEffect(grfKeyState))
+        m_pTarget->OnEnter(pt.x, pt.y, ConvertDragEffectToResult(
+            GetDropEffect(grfKeyState, m_pTarget->GetDefaultAction()))
                     )
                  );
 
@@ -214,7 +216,8 @@ STDMETHODIMP wxIDropTarget::DragOver(DWORD   grfKeyState,
 
     wxDragResult result;
     if ( m_pIDataObject ) {
-        result = ConvertDragEffectToResult(GetDropEffect(grfKeyState));
+        result = ConvertDragEffectToResult(
+            GetDropEffect(grfKeyState, m_pTarget->GetDefaultAction()));
     }
     else {
         // can't accept data anyhow normally
@@ -286,7 +289,8 @@ STDMETHODIMP wxIDropTarget::Drop(IDataObject *pIDataSource,
         m_pTarget->SetDataSource(pIDataSource);
 
         // and now it has the data
-        wxDragResult rc = ConvertDragEffectToResult(GetDropEffect(grfKeyState));
+        wxDragResult rc = ConvertDragEffectToResult(
+            GetDropEffect(grfKeyState, m_pTarget->GetDefaultAction()));
         rc = m_pTarget->OnData(pt.x, pt.y, rc);
         if ( wxIsDragResultOk(rc) ) {
             // operation succeeded