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