1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_xmloff.hxx"
24 #include "XMLImageMapContext.hxx"
25 #include <rtl/ustrbuf.hxx>
26 #include <com/sun/star/uno/Reference.h>
27 #include <com/sun/star/beans/XPropertySet.hpp>
28 #include <com/sun/star/beans/XPropertySetInfo.hpp>
29 #include <com/sun/star/xml/sax/XAttributeList.hpp>
30 #include <com/sun/star/container/XIndexContainer.hpp>
31 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
32 #include <com/sun/star/drawing/PointSequenceSequence.hpp>
33 #include <com/sun/star/document/XEventsSupplier.hpp>
34 #include <com/sun/star/awt/Rectangle.hpp>
35 #include <xmloff/xmltoken.hxx>
36 #include <xmloff/xmlimp.hxx>
37 #include <xmloff/xmltkmap.hxx>
38 #include "xmloff/xmlnmspe.hxx"
39 #include <xmloff/nmspmap.hxx>
40 #include <xmloff/xmluconv.hxx>
41 #include "xexptran.hxx"
42 #include "xmloff/xmlerror.hxx"
43 #include <xmloff/XMLEventsImportContext.hxx>
44 #include "XMLStringBufferImportContext.hxx"
45 #include <tools/debug.hxx>
46 #include <basegfx/polygon/b2dpolygon.hxx>
47 #include <basegfx/polygon/b2dpolygontools.hxx>
48 
49 using namespace ::com::sun::star;
50 using namespace ::xmloff::token;
51 
52 using ::rtl::OUString;
53 using ::rtl::OUStringBuffer;
54 using ::com::sun::star::beans::XPropertySet;
55 using ::com::sun::star::beans::XPropertySetInfo;
56 using ::com::sun::star::container::XIndexContainer;
57 using ::com::sun::star::lang::XMultiServiceFactory;
58 using ::com::sun::star::uno::Reference;
59 using ::com::sun::star::uno::UNO_QUERY;
60 using ::com::sun::star::xml::sax::XAttributeList;
61 using ::com::sun::star::uno::XInterface;
62 using ::com::sun::star::uno::Any;
63 using ::com::sun::star::drawing::PointSequenceSequence;
64 using ::com::sun::star::document::XEventsSupplier;
65 
66 
67 enum XMLImageMapToken
68 {
69 	XML_TOK_IMAP_URL,
70 	XML_TOK_IMAP_X,
71 	XML_TOK_IMAP_Y,
72 	XML_TOK_IMAP_CENTER_X,
73 	XML_TOK_IMAP_CENTER_Y,
74 	XML_TOK_IMAP_WIDTH,
75 	XML_TOK_IMAP_HEIGTH,
76 	XML_TOK_IMAP_POINTS,
77 	XML_TOK_IMAP_VIEWBOX,
78 	XML_TOK_IMAP_NOHREF,
79 	XML_TOK_IMAP_NAME,
80 	XML_TOK_IMAP_RADIUS,
81 	XML_TOK_IMAP_TARGET
82 };
83 
84 static __FAR_DATA SvXMLTokenMapEntry aImageMapObjectTokenMap[] =
85 {
86 	{ XML_NAMESPACE_XLINK,	XML_HREF,			XML_TOK_IMAP_URL 			},
87 	{ XML_NAMESPACE_OFFICE,	XML_NAME,			XML_TOK_IMAP_NAME			},
88 	{ XML_NAMESPACE_DRAW,	XML_NOHREF, 		XML_TOK_IMAP_NOHREF			},
89 	{ XML_NAMESPACE_SVG,	XML_X,				XML_TOK_IMAP_X				},
90 	{ XML_NAMESPACE_SVG,	XML_Y,				XML_TOK_IMAP_Y				},
91 	{ XML_NAMESPACE_SVG,	XML_CX,			    XML_TOK_IMAP_CENTER_X		},
92 	{ XML_NAMESPACE_SVG,	XML_CY,			    XML_TOK_IMAP_CENTER_Y		},
93 	{ XML_NAMESPACE_SVG,	XML_WIDTH,			XML_TOK_IMAP_WIDTH			},
94 	{ XML_NAMESPACE_SVG,	XML_HEIGHT,		    XML_TOK_IMAP_HEIGTH			},
95 	{ XML_NAMESPACE_SVG,	XML_R,				XML_TOK_IMAP_RADIUS			},
96 	{ XML_NAMESPACE_SVG,	XML_VIEWBOX,		XML_TOK_IMAP_VIEWBOX		},
97 	{ XML_NAMESPACE_DRAW,	XML_POINTS,		    XML_TOK_IMAP_POINTS			},
98 	{ XML_NAMESPACE_OFFICE, XML_TARGET_FRAME_NAME, XML_TOK_IMAP_TARGET		},
99 	XML_TOKEN_MAP_END
100 };
101 
102 
103 
104 class XMLImageMapObjectContext : public SvXMLImportContext
105 {
106 
107 protected:
108 
109 	const ::rtl::OUString sBoundary;
110 	const ::rtl::OUString sCenter;
111 	const ::rtl::OUString sTitle;
112 	const ::rtl::OUString sDescription;
113 	const ::rtl::OUString sImageMap;
114 	const ::rtl::OUString sIsActive;
115 	const ::rtl::OUString sName;
116 	const ::rtl::OUString sPolygon;
117 	const ::rtl::OUString sRadius;
118 	const ::rtl::OUString sTarget;
119 	const ::rtl::OUString sURL;
120 
121 	::rtl::OUString sServiceName;
122 
123 	Reference<XIndexContainer> xImageMap;	/// the image map
124 	Reference<XPropertySet> xMapEntry;		/// one map-entry (one area)
125 
126 	::rtl::OUString sUrl;
127 	::rtl::OUString sTargt;
128 	::rtl::OUStringBuffer sDescriptionBuffer;
129 	::rtl::OUStringBuffer sTitleBuffer;
130 	::rtl::OUString sNam;
131 	sal_Bool bIsActive;
132 
133 	sal_Bool bValid;
134 
135 public:
136 	TYPEINFO();
137 
138 	XMLImageMapObjectContext(
139 		SvXMLImport& rImport,
140 		sal_uInt16 nPrefix,
141 		const ::rtl::OUString& rLocalName,
142 		::com::sun::star::uno::Reference<
143 			::com::sun::star::container::XIndexContainer> xMap,
144 		const sal_Char* pServiceName);
145 
146 	void StartElement(
147 		const ::com::sun::star::uno::Reference<
148 		::com::sun::star::xml::sax::XAttributeList >& xAttrList );
149 
150 	void EndElement();
151 
152 	SvXMLImportContext *CreateChildContext(
153 		sal_uInt16 nPrefix,
154 		const ::rtl::OUString& rLocalName,
155 		const ::com::sun::star::uno::Reference<
156 			::com::sun::star::xml::sax::XAttributeList> & xAttrList );
157 
158 protected:
159 
160 	virtual void ProcessAttribute(
161 		enum XMLImageMapToken eToken,
162 		const ::rtl::OUString& rValue);
163 
164 	virtual void Prepare(
165 		::com::sun::star::uno::Reference<
166 			::com::sun::star::beans::XPropertySet> & rPropertySet);
167 };
168 
169 
170 TYPEINIT1( XMLImageMapObjectContext, SvXMLImportContext );
171 
XMLImageMapObjectContext(SvXMLImport & rImport,sal_uInt16 nPrefix,const OUString & rLocalName,Reference<XIndexContainer> xMap,const sal_Char * pServiceName)172 XMLImageMapObjectContext::XMLImageMapObjectContext(
173 	SvXMLImport& rImport,
174 	sal_uInt16 nPrefix,
175 	const OUString& rLocalName,
176 	Reference<XIndexContainer> xMap,
177 	const sal_Char* pServiceName) :
178 		SvXMLImportContext(rImport, nPrefix, rLocalName),
179 		sBoundary(RTL_CONSTASCII_USTRINGPARAM("Boundary")),
180 		sCenter(RTL_CONSTASCII_USTRINGPARAM("Center")),
181 		sTitle(RTL_CONSTASCII_USTRINGPARAM("Title")),
182 		sDescription(RTL_CONSTASCII_USTRINGPARAM("Description")),
183 		sImageMap(RTL_CONSTASCII_USTRINGPARAM("ImageMap")),
184 		sIsActive(RTL_CONSTASCII_USTRINGPARAM("IsActive")),
185 		sName(RTL_CONSTASCII_USTRINGPARAM("Name")),
186 		sPolygon(RTL_CONSTASCII_USTRINGPARAM("Polygon")),
187 		sRadius(RTL_CONSTASCII_USTRINGPARAM("Radius")),
188 		sTarget(RTL_CONSTASCII_USTRINGPARAM("Target")),
189 		sURL(RTL_CONSTASCII_USTRINGPARAM("URL")),
190 		xImageMap(xMap),
191 		bIsActive(sal_True),
192 		bValid(sal_False)
193 {
194 	DBG_ASSERT(NULL != pServiceName,
195 			   "Please supply the image map object service name");
196 
197 	Reference<XMultiServiceFactory> xFactory(GetImport().GetModel(),UNO_QUERY);
198 	if( xFactory.is() )
199 	{
200 		Reference<XInterface> xIfc = xFactory->createInstance(
201 			OUString::createFromAscii(pServiceName));
202 		DBG_ASSERT(xIfc.is(), "can't create image map object!");
203 		if( xIfc.is() )
204 		{
205 			Reference<XPropertySet> xPropertySet( xIfc, UNO_QUERY );
206 
207 			xMapEntry = xPropertySet;
208 		}
209 		// else: can't create service -> ignore
210 	}
211 	// else: can't even get factory -> ignore
212 }
213 
StartElement(const Reference<XAttributeList> & xAttrList)214 void XMLImageMapObjectContext::StartElement(
215 	const Reference<XAttributeList >& xAttrList )
216 {
217 	SvXMLTokenMap aMap(aImageMapObjectTokenMap);
218 
219 	sal_Int16 nLength = xAttrList->getLength();
220 	for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++)
221 	{
222 		OUString sLocalName;
223 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
224 			GetKeyByAttrName( xAttrList->getNameByIndex(nAttr),
225 							  &sLocalName );
226 		OUString sValue = xAttrList->getValueByIndex(nAttr);
227 
228 		ProcessAttribute(
229 			(enum XMLImageMapToken)aMap.Get(nPrefix, sLocalName), sValue);
230 	}
231 }
232 
EndElement()233 void XMLImageMapObjectContext::EndElement()
234 {
235 	// only create and insert image map object if validity flag is set
236 	// (and we actually have an image map)
237 	if ( bValid && xImageMap.is() && xMapEntry.is() )
238 	{
239 		// set values
240 		Prepare( xMapEntry );
241 
242 		// insert into image map
243 		Any aAny;
244 		aAny <<= xMapEntry;
245 		xImageMap->insertByIndex( xImageMap->getCount(), aAny );
246 	}
247 	// else: not valid -> don't create and insert
248 }
249 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<XAttributeList> & xAttrList)250 SvXMLImportContext* XMLImageMapObjectContext::CreateChildContext(
251 	sal_uInt16 nPrefix,
252 	const OUString& rLocalName,
253 	const Reference<XAttributeList> & xAttrList )
254 {
255 	if ( (XML_NAMESPACE_OFFICE == nPrefix) &&
256 		 IsXMLToken(rLocalName, XML_EVENT_LISTENERS) )
257 	{
258 		Reference<XEventsSupplier> xEvents( xMapEntry, UNO_QUERY );
259 		return new XMLEventsImportContext(
260 			GetImport(), nPrefix, rLocalName, xEvents);
261 	}
262 	else if ( (XML_NAMESPACE_SVG == nPrefix) &&
263 			  IsXMLToken(rLocalName, XML_TITLE) )
264 	{
265 		return new XMLStringBufferImportContext(
266 			GetImport(), nPrefix, rLocalName, sTitleBuffer);
267 	}
268 	else if ( (XML_NAMESPACE_SVG == nPrefix) &&
269 			  IsXMLToken(rLocalName, XML_DESC) )
270 	{
271 		return new XMLStringBufferImportContext(
272 			GetImport(), nPrefix, rLocalName, sDescriptionBuffer);
273 	}
274 	else
275 		return SvXMLImportContext::CreateChildContext(nPrefix, rLocalName,
276 													  xAttrList);
277 
278 }
279 
ProcessAttribute(enum XMLImageMapToken eToken,const OUString & rValue)280 void XMLImageMapObjectContext::ProcessAttribute(
281 	enum XMLImageMapToken eToken,
282 	const OUString& rValue)
283 {
284 	switch (eToken)
285 	{
286 		case XML_TOK_IMAP_URL:
287 			sUrl = GetImport().GetAbsoluteReference(rValue);
288 			break;
289 
290 		case XML_TOK_IMAP_TARGET:
291 			sTargt = rValue;
292 			break;
293 
294 		case XML_TOK_IMAP_NOHREF:
295 			bIsActive = ! IsXMLToken(rValue, XML_NOHREF);
296 			break;
297 
298 		case XML_TOK_IMAP_NAME:
299 			sNam = rValue;
300 			break;
301 		default:
302 			// do nothing
303 			break;
304 	}
305 }
306 
Prepare(Reference<XPropertySet> & rPropertySet)307 void XMLImageMapObjectContext::Prepare(
308 	Reference<XPropertySet> & rPropertySet)
309 {
310 	rPropertySet->setPropertyValue( sURL, Any( sUrl ) );
311 	rPropertySet->setPropertyValue( sTitle, Any( sTitleBuffer.makeStringAndClear() ) );
312 	rPropertySet->setPropertyValue( sDescription, Any( sDescriptionBuffer.makeStringAndClear() ) );
313 	rPropertySet->setPropertyValue( sTarget, Any( sTargt ) );
314 	rPropertySet->setPropertyValue( sIsActive, Any( bIsActive ) );
315 	rPropertySet->setPropertyValue( sName, Any( sNam ) );
316 }
317 
318 
319 
320 class XMLImageMapRectangleContext : public XMLImageMapObjectContext
321 {
322 	awt::Rectangle aRectangle;
323 
324 	sal_Bool bXOK;
325 	sal_Bool bYOK;
326 	sal_Bool bWidthOK;
327 	sal_Bool bHeightOK;
328 
329 public:
330 	TYPEINFO();
331 
332 	XMLImageMapRectangleContext(
333 		SvXMLImport& rImport,
334 		sal_uInt16 nPrefix,
335 		const ::rtl::OUString& rLocalName,
336 		::com::sun::star::uno::Reference<
337 			::com::sun::star::container::XIndexContainer> xMap);
338 
339 	virtual ~XMLImageMapRectangleContext();
340 
341 protected:
342 	virtual void ProcessAttribute(
343 		enum XMLImageMapToken eToken,
344 		const ::rtl::OUString& rValue);
345 
346 	virtual void Prepare(
347 		::com::sun::star::uno::Reference<
348 			::com::sun::star::beans::XPropertySet> & rPropertySet);
349 };
350 
351 
352 
353 TYPEINIT1(XMLImageMapRectangleContext, XMLImageMapObjectContext);
354 
XMLImageMapRectangleContext(SvXMLImport & rImport,sal_uInt16 nPrefix,const OUString & rLocalName,Reference<XIndexContainer> xMap)355 XMLImageMapRectangleContext::XMLImageMapRectangleContext(
356 	SvXMLImport& rImport,
357 	sal_uInt16 nPrefix,
358 	const OUString& rLocalName,
359 	Reference<XIndexContainer> xMap) :
360 		XMLImageMapObjectContext(rImport, nPrefix, rLocalName, xMap,
361 								 "com.sun.star.image.ImageMapRectangleObject"),
362 		bXOK(sal_False),
363 		bYOK(sal_False),
364 		bWidthOK(sal_False),
365 		bHeightOK(sal_False)
366 {
367 }
368 
~XMLImageMapRectangleContext()369 XMLImageMapRectangleContext::~XMLImageMapRectangleContext()
370 {
371 }
372 
ProcessAttribute(enum XMLImageMapToken eToken,const OUString & rValue)373 void XMLImageMapRectangleContext::ProcessAttribute(
374 	enum XMLImageMapToken eToken,
375 	const OUString& rValue)
376 {
377 	sal_Int32 nTmp;
378 	switch (eToken)
379 	{
380 		case XML_TOK_IMAP_X:
381 			if (GetImport().GetMM100UnitConverter().convertMeasure(nTmp,
382 																   rValue))
383 			{
384 				aRectangle.X = nTmp;
385 				bXOK = sal_True;
386 			}
387 			break;
388 		case XML_TOK_IMAP_Y:
389 			if (GetImport().GetMM100UnitConverter().convertMeasure(nTmp,
390 																   rValue))
391 			{
392 				aRectangle.Y = nTmp;
393 				bYOK = sal_True;
394 			}
395 			break;
396 		case XML_TOK_IMAP_WIDTH:
397 			if (GetImport().GetMM100UnitConverter().convertMeasure(nTmp,
398 																   rValue))
399 			{
400 				aRectangle.Width = nTmp;
401 				bWidthOK = sal_True;
402 			}
403 			break;
404 		case XML_TOK_IMAP_HEIGTH:
405 			if (GetImport().GetMM100UnitConverter().convertMeasure(nTmp,
406 																   rValue))
407 			{
408 				aRectangle.Height = nTmp;
409 				bHeightOK = sal_True;
410 			}
411 			break;
412 		default:
413 			XMLImageMapObjectContext::ProcessAttribute(eToken, rValue);
414 	}
415 
416 	bValid = bHeightOK && bXOK && bYOK && bWidthOK;
417 }
418 
Prepare(Reference<XPropertySet> & rPropertySet)419 void XMLImageMapRectangleContext::Prepare(
420 	Reference<XPropertySet> & rPropertySet)
421 {
422 	Any aAny;
423 	aAny <<= aRectangle;
424 	rPropertySet->setPropertyValue( sBoundary, aAny );
425 
426 	// common properties handled by super class
427 	XMLImageMapObjectContext::Prepare(rPropertySet);
428 }
429 
430 
431 class XMLImageMapPolygonContext : public XMLImageMapObjectContext
432 {
433 	::rtl::OUString sViewBoxString;
434 	::rtl::OUString sPointsString;
435 
436 	sal_Bool bViewBoxOK;
437 	sal_Bool bPointsOK;
438 
439 public:
440 	TYPEINFO();
441 
442 	XMLImageMapPolygonContext(
443 		SvXMLImport& rImport,
444 		sal_uInt16 nPrefix,
445 		const ::rtl::OUString& rLocalName,
446 		::com::sun::star::uno::Reference<
447 			::com::sun::star::container::XIndexContainer> xMap);
448 
449 	virtual ~XMLImageMapPolygonContext();
450 
451 protected:
452 	virtual void ProcessAttribute(
453 		enum XMLImageMapToken eToken,
454 		const ::rtl::OUString& rValue);
455 
456 	virtual void Prepare(
457 		::com::sun::star::uno::Reference<
458 			::com::sun::star::beans::XPropertySet> & rPropertySet);
459 };
460 
461 
462 
463 TYPEINIT1(XMLImageMapPolygonContext, XMLImageMapObjectContext);
464 
XMLImageMapPolygonContext(SvXMLImport & rImport,sal_uInt16 nPrefix,const OUString & rLocalName,Reference<XIndexContainer> xMap)465 XMLImageMapPolygonContext::XMLImageMapPolygonContext(
466 	SvXMLImport& rImport,
467 	sal_uInt16 nPrefix,
468 	const OUString& rLocalName,
469 	Reference<XIndexContainer> xMap) :
470 		XMLImageMapObjectContext(rImport, nPrefix, rLocalName, xMap,
471 								 "com.sun.star.image.ImageMapPolygonObject"),
472 		bViewBoxOK(sal_False),
473 		bPointsOK(sal_False)
474 {
475 }
476 
~XMLImageMapPolygonContext()477 XMLImageMapPolygonContext::~XMLImageMapPolygonContext()
478 {
479 }
480 
ProcessAttribute(enum XMLImageMapToken eToken,const OUString & rValue)481 void XMLImageMapPolygonContext::ProcessAttribute(
482 	enum XMLImageMapToken eToken,
483 	const OUString& rValue)
484 {
485 	switch (eToken)
486 	{
487 		case XML_TOK_IMAP_POINTS:
488 			sPointsString = rValue;
489 			bPointsOK = sal_True;
490 			break;
491 		case XML_TOK_IMAP_VIEWBOX:
492 			sViewBoxString = rValue;
493 			bViewBoxOK = sal_True;
494 			break;
495 		default:
496 			XMLImageMapObjectContext::ProcessAttribute(eToken, rValue);
497 			break;
498 	}
499 
500 	bValid = bViewBoxOK && bPointsOK;
501 }
502 
Prepare(Reference<XPropertySet> & rPropertySet)503 void XMLImageMapPolygonContext::Prepare(Reference<XPropertySet> & rPropertySet)
504 {
505     // process view box
506     SdXMLImExViewBox aViewBox(sViewBoxString, GetImport().GetMM100UnitConverter());
507 
508     // get polygon sequence
509     basegfx::B2DPolygon aPolygon;
510 
511     if(basegfx::tools::importFromSvgPoints(aPolygon, sPointsString))
512     {
513         if(aPolygon.count())
514         {
515             com::sun::star::drawing::PointSequence aPointSequence;
516             uno::Any aAny;
517 
518             basegfx::tools::B2DPolygonToUnoPointSequence(aPolygon, aPointSequence);
519             aAny <<= aPointSequence;
520             rPropertySet->setPropertyValue(sPolygon, aAny);
521         }
522     }
523 
524     // parent properties
525     XMLImageMapObjectContext::Prepare(rPropertySet);
526 }
527 
528 class XMLImageMapCircleContext : public XMLImageMapObjectContext
529 {
530 	awt::Point aCenter;
531 	sal_Int32 nRadius;
532 
533 	sal_Bool bXOK;
534 	sal_Bool bYOK;
535 	sal_Bool bRadiusOK;
536 
537 public:
538 	TYPEINFO();
539 
540 	XMLImageMapCircleContext(
541 		SvXMLImport& rImport,
542 		sal_uInt16 nPrefix,
543 		const ::rtl::OUString& rLocalName,
544 		::com::sun::star::uno::Reference<
545 			::com::sun::star::container::XIndexContainer> xMap);
546 
547 	virtual ~XMLImageMapCircleContext();
548 
549 protected:
550 	virtual void ProcessAttribute(
551 		enum XMLImageMapToken eToken,
552 		const ::rtl::OUString& rValue);
553 
554 	virtual void Prepare(
555 		::com::sun::star::uno::Reference<
556 			::com::sun::star::beans::XPropertySet> & rPropertySet);
557 };
558 
559 TYPEINIT1(XMLImageMapCircleContext, XMLImageMapObjectContext);
560 
XMLImageMapCircleContext(SvXMLImport & rImport,sal_uInt16 nPrefix,const OUString & rLocalName,Reference<XIndexContainer> xMap)561 XMLImageMapCircleContext::XMLImageMapCircleContext(
562 	SvXMLImport& rImport,
563 	sal_uInt16 nPrefix,
564 	const OUString& rLocalName,
565 	Reference<XIndexContainer> xMap) :
566 		XMLImageMapObjectContext(rImport, nPrefix, rLocalName, xMap,
567 								 "com.sun.star.image.ImageMapCircleObject"),
568 		bXOK(sal_False),
569 		bYOK(sal_False),
570 		bRadiusOK(sal_False)
571 {
572 }
573 
~XMLImageMapCircleContext()574 XMLImageMapCircleContext::~XMLImageMapCircleContext()
575 {
576 }
577 
ProcessAttribute(enum XMLImageMapToken eToken,const OUString & rValue)578 void XMLImageMapCircleContext::ProcessAttribute(
579 	enum XMLImageMapToken eToken,
580 	const OUString& rValue)
581 {
582 	sal_Int32 nTmp;
583 	switch (eToken)
584 	{
585 		case XML_TOK_IMAP_CENTER_X:
586 			if (GetImport().GetMM100UnitConverter().convertMeasure(nTmp,
587 																   rValue))
588 			{
589 				aCenter.X = nTmp;
590 				bXOK = sal_True;
591 			}
592 			break;
593 		case XML_TOK_IMAP_CENTER_Y:
594 			if (GetImport().GetMM100UnitConverter().convertMeasure(nTmp,
595 																   rValue))
596 			{
597 				aCenter.Y = nTmp;
598 				bYOK = sal_True;
599 			}
600 			break;
601 		case XML_TOK_IMAP_RADIUS:
602 			if (GetImport().GetMM100UnitConverter().convertMeasure(nTmp,
603 																   rValue))
604 			{
605 				nRadius = nTmp;
606 				bRadiusOK = sal_True;
607 			}
608 			break;
609 		default:
610 			XMLImageMapObjectContext::ProcessAttribute(eToken, rValue);
611 	}
612 
613 	bValid = bRadiusOK && bXOK && bYOK;
614 }
615 
Prepare(Reference<XPropertySet> & rPropertySet)616 void XMLImageMapCircleContext::Prepare(
617 	Reference<XPropertySet> & rPropertySet)
618 {
619 	// center (x,y)
620 	Any aAny;
621 	aAny <<= aCenter;
622 	rPropertySet->setPropertyValue( sCenter, aAny );
623 
624 	// radius
625 	aAny <<= nRadius;
626 	rPropertySet->setPropertyValue( sRadius, aAny );
627 
628 	// common properties handled by super class
629 	XMLImageMapObjectContext::Prepare(rPropertySet);
630 }
631 
632 
633 
634 
635 
636 
637 
638 
639 
640 
641 TYPEINIT1(XMLImageMapContext, SvXMLImportContext);
642 
XMLImageMapContext(SvXMLImport & rImport,sal_uInt16 nPrefix,const OUString & rLocalName,Reference<XPropertySet> & rPropertySet)643 XMLImageMapContext::XMLImageMapContext(
644 	SvXMLImport& rImport,
645 	sal_uInt16 nPrefix,
646 	const OUString& rLocalName,
647 	Reference<XPropertySet> & rPropertySet) :
648 		SvXMLImportContext(rImport, nPrefix, rLocalName),
649 		sImageMap(RTL_CONSTASCII_USTRINGPARAM("ImageMap")),
650 		xPropertySet(rPropertySet)
651 
652 {
653 	try
654 	{
655 		Reference < XPropertySetInfo > xInfo =
656 			xPropertySet->getPropertySetInfo();
657 		if( xInfo.is() && xInfo->hasPropertyByName( sImageMap ) )
658 			xPropertySet->getPropertyValue(sImageMap) >>= xImageMap;
659 	}
660 	catch( com::sun::star::uno::Exception e )
661 	{
662 		uno::Sequence<OUString> aSeq(0);
663         rImport.SetError( XMLERROR_FLAG_WARNING | XMLERROR_API, aSeq, e.Message, NULL );
664 	}
665 }
666 
~XMLImageMapContext()667 XMLImageMapContext::~XMLImageMapContext()
668 {
669 }
670 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const Reference<XAttributeList> & xAttrList)671 SvXMLImportContext *XMLImageMapContext::CreateChildContext(
672 	sal_uInt16 nPrefix,
673 	const OUString& rLocalName,
674 	const Reference<XAttributeList> & xAttrList )
675 {
676 	SvXMLImportContext* pContext = NULL;
677 
678 	if ( XML_NAMESPACE_DRAW == nPrefix )
679 	{
680 		if ( IsXMLToken(rLocalName, XML_AREA_RECTANGLE) )
681 		{
682 			pContext = new XMLImageMapRectangleContext(
683 				GetImport(), nPrefix, rLocalName, xImageMap);
684 		}
685 		else if ( IsXMLToken(rLocalName, XML_AREA_POLYGON) )
686 		{
687 			pContext = new XMLImageMapPolygonContext(
688 				GetImport(), nPrefix, rLocalName, xImageMap);
689 		}
690 		else if ( IsXMLToken(rLocalName, XML_AREA_CIRCLE) )
691 		{
692 			pContext = new XMLImageMapCircleContext(
693 				GetImport(), nPrefix, rLocalName, xImageMap);
694 		}
695 	}
696 	else
697 		pContext = SvXMLImportContext::CreateChildContext(nPrefix, rLocalName,
698 														  xAttrList);
699 
700 	return pContext;
701 }
702 
EndElement()703 void XMLImageMapContext::EndElement()
704 {
705 	Reference < XPropertySetInfo > xInfo =
706 		xPropertySet->getPropertySetInfo();
707 	if( xInfo.is() && xInfo->hasPropertyByName( sImageMap ) )
708 		xPropertySet->setPropertyValue(sImageMap, uno::makeAny( xImageMap ) );
709 }
710 
711