예제 #1
0
LRESULT CEditGradientDlg::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// Create default gradient
	if (m_viewGroup)
	{
		CComPtr<IEXMLDocument> eXMLDocument;
		m_viewGroup->get_eXMLDocument(&eXMLDocument);

		CComQIPtr<IEDocument> eDocument = eXMLDocument;

		CComPtr<ILDOMDocument> document;
		eXMLDocument->get_DOMDocument(&document);

//		CSVGFilterOptionsDlg dlg;
//		dlg.m_document = document;

//		if (dlg.DoModal(GetMainHwnd()) == IDOK)
		{
			CComPtr<IOleUndoManager> 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<ILSVGElement> svgElement;
					document->createElementNS(L"http://www.w3.org/2000/svg", L"linearGradient", (ILDOMElement**)&svgElement);

					if (svgElement)
					{
						// TODO, create unique ID

						CComBSTR id = L"gradient";

						svgElement->setAttribute(L"id", id);
						svgElement->setAttribute(L"gradientUnits", L"userSpaceOnUse");
						svgElement->setAttribute(L"x1", L"0%");
						svgElement->setAttribute(L"y1", L"0%");
						svgElement->setAttribute(L"x2", L"100%");
						svgElement->setAttribute(L"y2", L"0%");

						// black
						{
							CComPtr<ILDOMElement> stop;
							document->createElementNS(L"http://www.w3.org/2000/svg", L"stop", &stop);
							stop->setAttribute(L"offset", L"0");
							stop->setAttribute(L"style", L"stop-color:#000000");

							svgElement->appendChild(stop, NULL);
						}

						// white
						{
							CComPtr<ILDOMElement> stop;
							document->createElementNS(L"http://www.w3.org/2000/svg", L"stop", &stop);
							stop->setAttribute(L"offset", L"1");
							stop->setAttribute(L"style", L"stop-color:#ffffff");

							svgElement->appendChild(stop, NULL);
						}

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

							pUndo->DoInitial(undoManager, svgElement, svgDefsElement, NULL);

							// TODO: do this here?
							CComPtr<IEXMLViewGroup> viewGroup;
							eXMLDocument->GetActiveViewGroup(&viewGroup);
							if (viewGroup)
							{
								//CWebXMLViewGroup* pViewGroup = static_cast<CWebXMLViewGroup*>(viewGroup.p);

								CComPtr<IEElement> pElement;
								eXMLDocument->GetEElementFromDOMElement(svgElement, &pElement);

								CComBSTR gradient;
								gradient = L"url(#";
								gradient += id;
								gradient += L")";

								if (SelectionCanHavePaint(viewGroup))
								{
#if 0
									CComPtr<ILCSSStyleDeclaration> style;
									viewGroup->GetCurrentSelectionCSSStyle(&style);
#endif

									ATLASSERT(0);
#if 0
									style->setProperty(gApp->m_strokeOrFill == 0? L"stroke": L"fill", gradient, NULL);
#endif

#if 0
									viewGroup->ApplyCurrentSelectionCSSStyle();
#endif
								}

							//
								static_cast<CEXMLDocument*>(eXMLDocument.p)->m_lastGradient = gradient;
							//

								viewGroup->ActivateElement(pElement, 0, NULL);
							}
						}
					}
				}

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

	return 0;
}