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