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
1063bba73cSAndrew Rist *
1163bba73cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
1263bba73cSAndrew Rist *
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.
1963bba73cSAndrew Rist *
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 {
505*1f882ec4SArmin Le Grand // process view box
506*1f882ec4SArmin Le Grand SdXMLImExViewBox aViewBox(sViewBoxString, GetImport().GetMM100UnitConverter());
507*1f882ec4SArmin Le Grand
508*1f882ec4SArmin Le Grand // get polygon sequence
509*1f882ec4SArmin Le Grand basegfx::B2DPolygon aPolygon;
510*1f882ec4SArmin Le Grand
511*1f882ec4SArmin Le Grand if(basegfx::tools::importFromSvgPoints(aPolygon, sPointsString))
512*1f882ec4SArmin Le Grand {
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;
520*1f882ec4SArmin Le Grand rPropertySet->setPropertyValue(sPolygon, aAny);
521*1f882ec4SArmin Le Grand }
522*1f882ec4SArmin Le Grand }
523*1f882ec4SArmin Le Grand
524*1f882ec4SArmin Le Grand // parent properties
525*1f882ec4SArmin Le Grand 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 }
710cdf0e10cSrcweir
711