// Name: ole/droptgt.cpp
// Purpose: wxDropTarget implementation
// Author: Vadim Zeitlin
-// Modified by:
-// Created:
+// Modified by:
+// Created:
// RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// Licence: wxWindows license
#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 <wx/setup.h>
+#include "wx/setup.h"
-#if USE_DRAG_AND_DROP
+#if wxUSE_DRAG_AND_DROP
-#include <wx/log.h>
+#include "wx/log.h"
#ifdef __WIN32__
-#ifndef __GNUWIN32__
-#include <shlobj.h> // for DROPFILES structure
-#endif
+ #ifndef __GNUWIN32__
+ #include <shlobj.h> // for DROPFILES structure
+ #endif
#else
-#include <shellapi.h>
+ #include <shellapi.h>
#endif
-#include <wx/msw/ole/droptgt.h>
+#include "wx/dataobj.h"
+#include "wx/msw/ole/droptgt.h"
#ifndef __WIN32__
-#include <ole2.h>
-#include <olestd.h>
+ #include <ole2.h>
+ #include <olestd.h>
#endif
-#include <wx/msw/ole/oleutils.h>
+#include "wx/msw/ole/oleutils.h"
// ----------------------------------------------------------------------------
// IDropTarget interface: forward all interesting things to wxDropTarget
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;
// 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 <Ctrl> 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)
{
}
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)
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
// [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 );
return S_OK;
}
- // @@ should check the point also?
-
+ // TODO should check the point also?
+
*pdwEffect = GetDropEffect(grfKeyState);
// get hold of the data object
// 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,
{
// 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;
}
// 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) ) {
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();
{
HRESULT hr = ::CoLockObjectExternal(m_pIDropTarget, TRUE, FALSE);
if ( FAILED(hr) ) {
- // wxLogApiError("CoLockObjectExternal", hr);
+ wxLogApiError("CoLockObjectExternal", hr);
return FALSE;
}
if ( FAILED(hr) ) {
::CoLockObjectExternal(m_pIDropTarget, FALSE, FALSE);
- // wxLogApiError("RegisterDragDrop", hr);
+ wxLogApiError("RegisterDragDrop", hr);
return FALSE;
}
{
HRESULT hr = ::RevokeDragDrop((HWND) hwnd);
- if ( FAILED(hr) )
- {
- // wxLogApiError("RevokeDragDrop", hr);
+ if ( FAILED(hr) ) {
+ wxLogApiError("RevokeDragDrop", hr);
}
::CoLockObjectExternal(m_pIDropTarget, FALSE, TRUE);
{
// 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;
}
}
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
wxDataFormat wxTextDropTarget::GetFormat(size_t WXUNUSED(n)) const
{
- return CF_TEXT;
+ return wxDF_TEXT;
}
// ============================================================================
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++ ) {
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