// 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; }
// 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)
};
// 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 ) )
{
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)
{
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;
// 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 ) )
{
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)
{
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;
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)
};
// 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;
}
// 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()))
)
);
wxDragResult result;
if ( m_pIDataObject ) {
- result = ConvertDragEffectToResult(GetDropEffect(grfKeyState));
+ result = ConvertDragEffectToResult(
+ GetDropEffect(grfKeyState, m_pTarget->GetDefaultAction()));
}
else {
// can't accept data anyhow normally
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