Example #1
0
STDMETHODIMP CSVGSwatchesDlg::Drop(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect)
{
	ASSERT(0);
#if 0
	POINT point;
	point.x = pt.x;
	point.y = pt.y;
	ScreenToClient(&point);

	COleDataObjectWrapper dataObject;
	dataObject.Attach(pDataObject);

	HGLOBAL hData;

	if (m_viewGroup)
	{
		CComPtr<IEXMLDocument> eXMLDocument;
		m_viewGroup->get_eXMLDocument(&eXMLDocument);

	#if 0
		if (hData = dataObject.GetGlobalData(CF_HDROP))
		{
			DROPFILES* dp = (DROPFILES*)GlobalLock(hData);
			if (dp)
			{
				char* p = (char*)(dp+1);

				int i = 0;
				TCHAR filename[512];
				while (*p)
				{
					filename[i++] = *p++;
				}
				filename[i] = 0;

				CHTMDesignFrame* pFrame = NULL;
				m_pFrameSet->OnButtonDown(0, point, 0, FALSE, &pFrame);
				if (pFrame)
				{
					pFrame->m_pElement->setAttribute(L"src", _bstr_t(filename));
					//m_pDocument->CreateHTMLTree();
					//m_pDocument->UpdateAllViews(NULL);
				}
			}

			GlobalUnlock(hData);

			{
				BuildFrames();

				OnSize();
				InvalidateRect(NULL, TRUE);
			}

			*pdwEffect = DROPEFFECT_COPY;
		}
		else
	#endif
		if (hData = dataObject.GetGlobalData(CF_UNICODETEXT))
		{
			WCHAR* text = (WCHAR*)GlobalLock(hData);
			int len = GlobalSize(hData);

			CComPtr<ILSVGDocument> svgdocument;
			svgdocument.CoCreateInstance(CLSID_LSVGDocument);

			VARIANT_BOOL bsuccess;
			svgdocument->loadXML(_bstr_t(text), &bsuccess);

			if (bsuccess)
			{
				CComQIPtr<IEDocument> eDocument = eXMLDocument;

				IUndoManager* undoManager;
				eDocument->get_undoManager(&undoManager);

				CComObject<CUndoParent>* pParentUndo;
				CComObject<CUndoParent>::CreateInstance(&pParentUndo);
				if (pParentUndo)
				{
					pParentUndo->AddRef();	// ???
					undoManager->Open(pParentUndo);

					CComPtr<ILSVGElement> svgDefsElement;
					eXMLDocument->FindOrCreateSVGDefs(&svgDefsElement);

					if (svgDefsElement)
					{
						CComPtr<ILDOMElement> documentElement;
						svgdocument->get_documentElement(&documentElement);

						CComPtr<ILDOMNode> node;
						documentElement->get_firstChild(&node);
						while (node)
						{
							CComPtr<ILDOMNode> nextSibling;
							node->get_nextSibling(&nextSibling);

							CComQIPtr<ILSVGGradientElement> svgGradientElement = node;
							if (svgGradientElement)
							{
								m_listView.m_xmlDocument->adoptNode(svgGradientElement, NULL);

								CComObject<CWEUndoNewElement>* pUndo;
								CComObject<CWEUndoNewElement>::CreateInstance(&pUndo);
								if (pUndo)
								{
								//	pUndo->AddRef();
									pUndo->m_pDocument = static_cast<CEXMLDocument*>(eXMLDocument.p);

									pUndo->DoInitial(undoManager, svgGradientElement, svgDefsElement, NULL);
								}
							}

							node = nextSibling;
						}
					}

					undoManager->Close(pParentUndo, TRUE/*commit*/);
				}
			}

			GlobalUnlock(hData);
			//return TRUE;
		}
	}
#endif

	return S_OK;
}
STDMETHODIMP CXMiLFilesControl::Drop(IDataObject * pDataObject, DWORD grfKeyState, POINTL pt, DWORD * pdwEffect)
{
//	CWebSite* pWebSite = (CWebSite*)m_document.p;

	CSiteDir* pParent;

	if (m_prevDropItem)
	{
		DWORD state;
		m_treeCtl->GetItemState(m_prevDropItem, &state);
		m_treeCtl->SetItemState(m_prevDropItem, state &~ 2);

		CSiteItem* pItem;
		m_treeCtl->GetItemInfo(m_prevDropItem, (DWORD*)&pItem, NULL, NULL);

		if (pItem->m_type == 1)	// Dropped on directory
			pParent = (CSiteDir*)pItem;
		else
			pParent = pItem->m_parent;

		m_prevDropItem = NULL;
	}
	else
	{
		pParent = m_pRootDir;
	}

	COleDataObjectWrapper dataObject;
	dataObject.Attach(pDataObject);

	HGLOBAL hData;

	if (hData = dataObject.GetGlobalData(CF_HDROP))
	{
		DROPFILES* dp = (DROPFILES*)GlobalLock(hData);
		if (dp)
		{
			CArray<_bstr_t,_bstr_t&> filenames;

			if (dp->fWide)
			{
				WCHAR* p = (WCHAR*)(dp+1);
				while (*p)
				{
					_bstr_t file = p;
					p += file.length() + 1;
					filenames.Add(file);
				}
			}
			else
			{
				char* p = (char*)(dp+1);
				while (*p)
				{
					_bstr_t file = p;
					p += file.length() + 1;
					filenames.Add(file);
				}
			}

			SAFEARRAYBOUND rgsabound[1];
			rgsabound[0].lLbound = 0;
			rgsabound[0].cElements = filenames.GetSize();
    		SAFEARRAY* sa = SafeArrayCreate(VT_BSTR, 1, rgsabound);
			if (sa)
			{
				for (int i = 0; i < filenames.GetSize(); i++)
				{
					_bstr_t& filepath = filenames[i];

					long ix[1];
					ix[0] = i;
					SafeArrayPutElement(sa, ix, (BSTR)filepath/*.copy()*/);
				}

				long nFilesCopied;
				CopyMoveFiles(pParent->GetFullPathName(), sa, VARIANT_FALSE, &nFilesCopied);

				SafeArrayDestroy(sa);
			}

			GlobalUnlock(hData);

			*pdwEffect = DROPEFFECT_COPY;
		}
	}

	return S_OK;
}