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