implement wxWindow::DragAcceptFiles() on all platforms

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56757 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík 2008-11-13 22:30:40 +00:00
parent 11e3af6e7e
commit 4f24cbbd3d
4 changed files with 78 additions and 1 deletions

View File

@ -355,6 +355,14 @@ public:
m_strings[i] = m_array[i];
return m_strings;
}
wxString* Release()
{
wxString *r = GetStrings();
m_strings = NULL;
return r;
}
private:
const wxArrayString& m_array;
wxString* m_strings;

View File

@ -1230,6 +1230,16 @@ public:
// NULL; it's owned by the window and will be deleted by it)
virtual void SetDropTarget( wxDropTarget *dropTarget ) = 0;
virtual wxDropTarget *GetDropTarget() const { return m_dropTarget; }
// Accept files for dragging
virtual void DragAcceptFiles(bool accept)
#ifdef __WXMSW__
// it does have common implementation but not for MSW which has its own
// native version of it
= 0
#endif // __WXMSW__
;
#endif // wxUSE_DRAG_AND_DROP
// constraints and sizers

View File

@ -600,7 +600,11 @@ public:
If @true, the window is eligible for drop file events.
If @false, the window will not accept drop file events.
@remarks Windows only.
@remarks Windows only until version 2.8.9, available on all platforms
since 2.8.10. Cannot be used together with SetDropTarget() on
non-Windows platforms.
@see SetDropTarget()
*/
virtual void DragAcceptFiles(bool accept);

View File

@ -2897,6 +2897,61 @@ bool wxWindowBase::HasFocus() const
win == wxConstCast(this, wxWindowBase)->GetMainWindowOfCompositeControl();
}
// ----------------------------------------------------------------------------
// drag and drop
// ----------------------------------------------------------------------------
#if wxUSE_DRAG_AND_DROP && !defined(__WXMSW__)
namespace
{
class DragAcceptFilesTarget : public wxFileDropTarget
{
public:
DragAcceptFilesTarget(wxWindowBase *win) : m_win(win) {}
virtual bool OnDropFiles(wxCoord x, wxCoord y,
const wxArrayString& filenames)
{
wxDropFilesEvent event(wxEVT_DROP_FILES,
filenames.size(),
wxCArrayString(filenames).Release());
event.SetEventObject(m_win);
event.m_pos.x = x;
event.m_pos.y = y;
return m_win->HandleWindowEvent(event);
}
private:
wxWindowBase * const m_win;
DECLARE_NO_COPY_CLASS(DragAcceptFilesTarget)
};
} // anonymous namespace
// Generic version of DragAcceptFiles(). It works by installing a simple
// wxFileDropTarget-to-EVT_DROP_FILES adaptor and therefore cannot be used
// together with explicit SetDropTarget() calls.
void wxWindowBase::DragAcceptFiles(bool accept)
{
if ( accept )
{
wxASSERT_MSG( !GetDropTarget(),
"cannot use DragAcceptFiles() and SetDropTarget() together" );
SetDropTarget(new DragAcceptFilesTarget(this));
}
else
{
SetDropTarget(NULL);
}
}
#endif // wxUSE_DRAG_AND_DROP && !defined(__WXMSW__)
// ----------------------------------------------------------------------------
// global functions
// ----------------------------------------------------------------------------