From 4f24cbbd3dbbf3eb45225b36044c41e76b1e5eef Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Thu, 13 Nov 2008 22:30:40 +0000 Subject: [PATCH] implement wxWindow::DragAcceptFiles() on all platforms git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56757 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/arrstr.h | 8 +++++++ include/wx/window.h | 10 ++++++++ interface/wx/window.h | 6 ++++- src/common/wincmn.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 1 deletion(-) diff --git a/include/wx/arrstr.h b/include/wx/arrstr.h index 95b9506fdc..6da3cb2a32 100644 --- a/include/wx/arrstr.h +++ b/include/wx/arrstr.h @@ -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; diff --git a/include/wx/window.h b/include/wx/window.h index 268fee782e..fb66bf004e 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -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 diff --git a/interface/wx/window.h b/interface/wx/window.h index bc0f7c33f5..cbb1e4e8d0 100644 --- a/interface/wx/window.h +++ b/interface/wx/window.h @@ -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); diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 531c674c39..6eac63e1a9 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -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 // ---------------------------------------------------------------------------- -- 2.45.2