X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bbf1f0e5cffb8c01696eb26e254857a61f017d70..f85afd4e46af8d5432aefa584bb3e54a8eac5522:/src/msw/ole/droptgt.cpp diff --git a/src/msw/ole/droptgt.cpp b/src/msw/ole/droptgt.cpp index 7ff89237d5..7101ef5eb2 100644 --- a/src/msw/ole/droptgt.cpp +++ b/src/msw/ole/droptgt.cpp @@ -2,8 +2,8 @@ // Name: ole/droptgt.cpp // Purpose: wxDropTarget implementation // Author: Vadim Zeitlin -// Modified by: -// Created: +// Modified by: +// Created: // RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows license @@ -22,35 +22,35 @@ #endif // For compilers that support precompilation, includes "wx.h". -#define IN_WX_MAIN_CPP #include "wx/wxprec.h" #if defined(__BORLANDC__) #pragma hdrstop #endif -#include +#include "wx/setup.h" -#if USE_DRAG_AND_DROP +#if wxUSE_DRAG_AND_DROP -#include +#include "wx/log.h" #ifdef __WIN32__ -#ifndef __GNUWIN32__ -#include // for DROPFILES structure -#endif + #ifndef __GNUWIN32__ + #include // for DROPFILES structure + #endif #else -#include + #include #endif -#include +#include "wx/dataobj.h" +#include "wx/msw/ole/droptgt.h" #ifndef __WIN32__ -#include -#include + #include + #include #endif -#include +#include "wx/msw/ole/oleutils.h" // ---------------------------------------------------------------------------- // IDropTarget interface: forward all interesting things to wxDropTarget @@ -70,9 +70,9 @@ public: STDMETHODIMP DragLeave(void); STDMETHODIMP Drop(LPDATAOBJECT, DWORD, POINTL, LPDWORD); - // @@ we assume that if QueryGetData() returns S_OK, than we can really - // get data in this format, so we remember here the format for which - // QueryGetData() succeeded + // we assume that if QueryGetData() returns S_OK, than we can really get data + // in this format, so we remember here the format for which QueryGetData() + // succeeded void SetSupportedFormat(wxDataFormat cfFormat) { m_cfFormat = cfFormat; } DECLARE_IUNKNOWN_METHODS; @@ -93,11 +93,11 @@ private: // Name : static wxDropTarget::GetDropEffect // Purpose : determine the drop operation from keyboard/mouse state. -// Returns : DWORD combined from DROPEFFECT_xxx constants +// Returns : DWORD combined from DROPEFFECT_xxx constants // Params : [in] DWORD flags kbd & mouse flags as passed to // IDropTarget methods // Notes : We do "move" normally and "copy" if is pressed, -// which is the standard behaviour (currently there is no +// which is the standard behaviour (currently there is no // way to redefine it) DWORD wxIDropTarget::GetDropEffect(DWORD flags) { @@ -105,15 +105,15 @@ DWORD wxIDropTarget::GetDropEffect(DWORD flags) } wxIDropTarget::wxIDropTarget(wxDropTarget *pTarget) -{ - m_cRef = 0; +{ + m_cRef = 0; m_pTarget = pTarget; - m_cfFormat = 0; - m_pIDataObject = NULL; + m_cfFormat = wxDF_INVALID; + m_pIDataObject = NULL; } -wxIDropTarget::~wxIDropTarget() -{ +wxIDropTarget::~wxIDropTarget() +{ } BEGIN_IID_TABLE(wxIDropTarget) @@ -123,44 +123,6 @@ END_IID_TABLE; IMPLEMENT_IUNKNOWN_METHODS(wxIDropTarget) -#if 0 - STDMETHODIMP wxIDropTarget::QueryInterface(REFIID riid, void **ppv) - { -// wxLogQueryInterface(wxIDropTarget, riid); - - if ( IsIidFromList(riid, ms_aIids, WXSIZEOF(ms_aIids)) ) { - *ppv = this; - AddRef(); - - return S_OK; - } - else { - *ppv = NULL; - - return (HRESULT) E_NOINTERFACE; - } - } - - STDMETHODIMP_(ULONG) wxIDropTarget::AddRef() - { - wxLogAddRef(wxIDropTarget, m_cRef); - - return ++m_cRef; - } - - STDMETHODIMP_(ULONG) wxIDropTarget::Release() - { - wxLogRelease(wxIDropTarget, m_cRef); - - if ( --m_cRef == 0 ) { - delete this; - return 0; - } - else - return m_cRef; - } -#endif - // Name : wxIDropTarget::DragEnter // Purpose : Called when the mouse enters the window (dragging something) // Returns : S_OK @@ -168,13 +130,13 @@ IMPLEMENT_IUNKNOWN_METHODS(wxIDropTarget) // [in] DWORD grfKeyState : kbd & mouse state // [in] POINTL pt : mouse coordinates // [out]DWORD *pdwEffect : effect flag -// Notes : +// Notes : STDMETHODIMP wxIDropTarget::DragEnter(IDataObject *pIDataSource, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) { - wxLogDebug("IDropTarget::DragEnter"); + wxLogDebug(T("IDropTarget::DragEnter")); wxASSERT( m_pIDataObject == NULL ); @@ -185,8 +147,8 @@ STDMETHODIMP wxIDropTarget::DragEnter(IDataObject *pIDataSource, return S_OK; } - // @@ should check the point also? - + // TODO should check the point also? + *pdwEffect = GetDropEffect(grfKeyState); // get hold of the data object @@ -206,7 +168,7 @@ STDMETHODIMP wxIDropTarget::DragEnter(IDataObject *pIDataSource, // Params : [in] DWORD grfKeyState kbd & mouse state // [in] POINTL pt mouse coordinates // [out]LPDWORD pdwEffect effect flag -// Notes : We're called on every WM_MOUSEMOVE, so this function should be +// Notes : We're called on every WM_MOUSEMOVE, so this function should be // very efficient. STDMETHODIMP wxIDropTarget::DragOver(DWORD grfKeyState, POINTL pt, @@ -214,7 +176,7 @@ STDMETHODIMP wxIDropTarget::DragOver(DWORD grfKeyState, { // there are too many of them... wxLogDebug("IDropTarget::DragOver"); - *pdwEffect = m_pIDataObject == NULL ? DROPEFFECT_NONE + *pdwEffect = m_pIDataObject == NULL ? DROPEFFECT_NONE : GetDropEffect(grfKeyState); return S_OK; } @@ -225,49 +187,49 @@ STDMETHODIMP wxIDropTarget::DragOver(DWORD grfKeyState, // Notes : good place to do any clean-up STDMETHODIMP wxIDropTarget::DragLeave() { - wxLogDebug("IDropTarget::DragLeave"); + wxLogDebug(T("IDropTarget::DragLeave")); // remove the UI feedback m_pTarget->OnLeave(); // release the held object RELEASE_AND_NULL(m_pIDataObject); - + return S_OK; } // Name : wxIDropTarget::Drop -// Purpose : Instructs the drop target to paste data that was just now +// Purpose : Instructs the drop target to paste data that was just now // dropped on it. // Returns : S_OK // Params : [in] IDataObject *pIDataSource the data to paste // [in] DWORD grfKeyState kbd & mouse state // [in] POINTL pt where the drop occured? // [ouy]DWORD *pdwEffect operation effect -// Notes : -STDMETHODIMP wxIDropTarget::Drop(IDataObject *pIDataSource, - DWORD grfKeyState, - POINTL pt, +// Notes : +STDMETHODIMP wxIDropTarget::Drop(IDataObject *pIDataSource, + DWORD grfKeyState, + POINTL pt, DWORD *pdwEffect) { - wxLogDebug("IDropTarget::Drop"); + wxLogDebug(T("IDropTarget::Drop")); - // @@ I don't know why there is this parameter, but so far I assume - // that it's the same we've already got in DragEnter + // TODO I don't know why there is this parameter, but so far I assume + // that it's the same we've already got in DragEnter wxASSERT( m_pIDataObject == pIDataSource ); STGMEDIUM stm; - *pdwEffect = DROPEFFECT_NONE; - + *pdwEffect = DROPEFFECT_NONE; + // should be set by SetSupportedFormat() call - wxASSERT( m_cfFormat != 0 ); + wxASSERT( m_cfFormat != wxDF_INVALID ); FORMATETC fmtMemory; fmtMemory.cfFormat = m_cfFormat; - fmtMemory.ptd = NULL; + fmtMemory.ptd = NULL; fmtMemory.dwAspect = DVASPECT_CONTENT; fmtMemory.lindex = -1; - fmtMemory.tymed = TYMED_HGLOBAL; // @@@@ to add other media + fmtMemory.tymed = TYMED_HGLOBAL; // TODO to add other media HRESULT hr = pIDataSource->GetData(&fmtMemory, &stm); if ( SUCCEEDED(hr) ) { @@ -301,7 +263,7 @@ STDMETHODIMP wxIDropTarget::Drop(IDataObject *pIDataSource, wxDropTarget::wxDropTarget() { - // create an IDropTarget implementation which will notify us about + // create an IDropTarget implementation which will notify us about // d&d operations. m_pIDropTarget = new wxIDropTarget(this); m_pIDropTarget->AddRef(); @@ -320,7 +282,7 @@ bool wxDropTarget::Register(WXHWND hwnd) { HRESULT hr = ::CoLockObjectExternal(m_pIDropTarget, TRUE, FALSE); if ( FAILED(hr) ) { - // wxLogApiError("CoLockObjectExternal", hr); + wxLogApiError("CoLockObjectExternal", hr); return FALSE; } @@ -328,7 +290,7 @@ bool wxDropTarget::Register(WXHWND hwnd) if ( FAILED(hr) ) { ::CoLockObjectExternal(m_pIDropTarget, FALSE, FALSE); - // wxLogApiError("RegisterDragDrop", hr); + wxLogApiError("RegisterDragDrop", hr); return FALSE; } @@ -339,9 +301,8 @@ void wxDropTarget::Revoke(WXHWND hwnd) { HRESULT hr = ::RevokeDragDrop((HWND) hwnd); - if ( FAILED(hr) ) - { - // wxLogApiError("RevokeDragDrop", hr); + if ( FAILED(hr) ) { + wxLogApiError("RevokeDragDrop", hr); } ::CoLockObjectExternal(m_pIDropTarget, FALSE, TRUE); @@ -354,22 +315,22 @@ bool wxDropTarget::IsAcceptedData(IDataObject *pIDataSource) const { // this strucutre describes a data of any type (first field will be // changing) being passed through global memory block. - static FORMATETC s_fmtMemory = { + static FORMATETC s_fmtMemory = { 0, - NULL, - DVASPECT_CONTENT, - -1, - TYMED_HGLOBAL + NULL, + DVASPECT_CONTENT, + -1, + TYMED_HGLOBAL }; // cycle thorugh all supported formats for ( size_t n = 0; n < GetFormatCount(); n++ ) { s_fmtMemory.cfFormat = GetFormat(n); - // @ don't use SUCCEEDED macro here: QueryGetData returns 1 (whatever it - // means) for file drag and drop + // NB: don't use SUCCEEDED macro here: QueryGetData returns 1 (whatever it + // means) for file drag and drop if ( pIDataSource->QueryGetData(&s_fmtMemory) == S_OK ) { // remember this format: we'll later ask for data in it - m_pIDropTarget->SetSupportedFormat(s_fmtMemory.cfFormat); + m_pIDropTarget->SetSupportedFormat((unsigned int)s_fmtMemory.cfFormat); return TRUE; } } @@ -383,7 +344,7 @@ bool wxDropTarget::IsAcceptedData(IDataObject *pIDataSource) const bool wxTextDropTarget::OnDrop(long x, long y, const void *pData) { - return OnDropText(x, y, (const char *)pData); + return OnDropText(x, y, (const wxChar *)pData); } size_t wxTextDropTarget::GetFormatCount() const @@ -393,7 +354,7 @@ size_t wxTextDropTarget::GetFormatCount() const wxDataFormat wxTextDropTarget::GetFormat(size_t WXUNUSED(n)) const { - return CF_TEXT; + return wxDF_TEXT; } // ============================================================================ @@ -403,33 +364,33 @@ wxDataFormat wxTextDropTarget::GetFormat(size_t WXUNUSED(n)) const bool wxFileDropTarget::OnDrop(long x, long y, const void *pData) { // the documentation states that the first member of DROPFILES structure - // is a "DWORD offset of double NUL terminated file list". What they mean by + // is a "DWORD offset of double NUL terminated file list". What they mean by // this (I wonder if you see it immediately) is that the list starts at // ((char *)&(pDropFiles.pFiles)) + pDropFiles.pFiles. We're also advised to // use DragQueryFile to work with this structure, but not told where and how // to get HDROP. - HDROP hdrop = (HDROP)pData; // @@ it works, but I'm not sure about it + HDROP hdrop = (HDROP)pData; // NB: it works, but I'm not sure about it // get number of files (magic value -1) - UINT nFiles = ::DragQueryFile(hdrop, -1, NULL, 0); - + UINT nFiles = ::DragQueryFile(hdrop, (unsigned)-1, NULL, 0u); + // for each file get the length, allocate memory and then get the name - char **aszFiles = new char *[nFiles]; + wxChar **aszFiles = new wxChar *[nFiles]; UINT len, n; for ( n = 0; n < nFiles; n++ ) { // +1 for terminating NUL len = ::DragQueryFile(hdrop, n, NULL, 0) + 1; - aszFiles[n] = new char[len]; + aszFiles[n] = new wxChar[len]; UINT len2 = ::DragQueryFile(hdrop, n, aszFiles[n], len); if ( len2 != len - 1 ) { - wxLogDebug("In wxFileDropTarget::OnDrop DragQueryFile returned %d " - "characters, %d expected.", len2, len - 1); + wxLogDebug(T("In wxFileDropTarget::OnDrop DragQueryFile returned %d " + "characters, %d expected."), len2, len - 1); } } - bool bResult = OnDropFiles(x, y, nFiles, (const char**) aszFiles); + bool bResult = OnDropFiles(x, y, nFiles, (const wxChar**) aszFiles); // free memory for ( n = 0; n < nFiles; n++ ) { @@ -448,12 +409,12 @@ size_t wxFileDropTarget::GetFormatCount() const wxDataFormat wxFileDropTarget::GetFormat(size_t WXUNUSED(n)) const { #ifdef __WIN32__ - return CF_HDROP; + return wxDF_FILENAME; #else // TODO: how to implement this in WIN16? - return CF_TEXT; + return wxDF_TEXT; #endif } #endif - // USE_DRAG_AND_DROP + // wxUSE_DRAG_AND_DROP