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 <tools/debug.hxx>
21 : #include <osl/diagnose.h>
22 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
23 : #include <com/sun/star/text/TextContentAnchorType.hpp>
24 : #include <com/sun/star/beans/XPropertySet.hpp>
25 : #include <com/sun/star/text/XTextFrame.hpp>
26 : #include <com/sun/star/container/XNamed.hpp>
27 : #include <com/sun/star/text/SizeType.hpp>
28 : #include <com/sun/star/drawing/XShape.hpp>
29 : #include <com/sun/star/document/XEventsSupplier.hpp>
30 : #include <com/sun/star/document/XEmbeddedObjectSupplier.hpp>
31 : #include <com/sun/star/io/XOutputStream.hpp>
32 : #include <com/sun/star/text/HoriOrientation.hpp>
33 : #include <com/sun/star/text/VertOrientation.hpp>
34 : #include <sax/tools/converter.hxx>
35 : #include <xmloff/xmlimp.hxx>
36 : #include <xmloff/xmltoken.hxx>
37 : #include <xmloff/xmlnmspe.hxx>
38 : #include <xmloff/nmspmap.hxx>
39 : #include <xmloff/xmluconv.hxx>
40 : #include "XMLAnchorTypePropHdl.hxx"
41 : #include "XMLEmbeddedObjectImportContext.hxx"
42 : #include <xmloff/XMLBase64ImportContext.hxx>
43 : #include "XMLReplacementImageContext.hxx"
44 : #include <xmloff/prstylei.hxx>
45 : #include <xmloff/i18nmap.hxx>
46 : #include "xexptran.hxx"
47 : #include <xmloff/shapeimport.hxx>
48 : #include <xmloff/XMLEventsImportContext.hxx>
49 : #include "XMLImageMapContext.hxx"
50 : #include "XMLTextFrameContext.hxx"
51 : #include "XMLTextListBlockContext.hxx"
52 : #include "XMLTextListItemContext.hxx"
53 : #include <xmloff/attrlist.hxx>
54 : #include <basegfx/polygon/b2dpolygon.hxx>
55 : #include <basegfx/polygon/b2dpolygontools.hxx>
56 : #include <basegfx/matrix/b2dhommatrixtools.hxx>
57 : #include <basegfx/polygon/b2dpolypolygontools.hxx>
58 : #include <map>
59 :
60 : using namespace ::com::sun::star;
61 : using namespace ::com::sun::star::uno;
62 : using namespace ::com::sun::star::text;
63 : using namespace ::com::sun::star::xml::sax;
64 : using namespace ::com::sun::star::beans;
65 : using namespace ::com::sun::star::lang;
66 : using namespace ::com::sun::star::container;
67 : using namespace ::com::sun::star::drawing;
68 : using namespace ::com::sun::star::document;
69 : using namespace ::xmloff::token;
70 : using ::com::sun::star::document::XEventsSupplier;
71 :
72 : #define XML_TEXT_FRAME_TEXTBOX 1
73 : #define XML_TEXT_FRAME_GRAPHIC 2
74 : #define XML_TEXT_FRAME_OBJECT 3
75 : #define XML_TEXT_FRAME_OBJECT_OLE 4
76 : #define XML_TEXT_FRAME_APPLET 5
77 : #define XML_TEXT_FRAME_PLUGIN 6
78 : #define XML_TEXT_FRAME_FLOATING_FRAME 7
79 :
80 : typedef ::std::map < const OUString, OUString > ParamMap;
81 :
82 2 : class XMLTextFrameContextHyperlink_Impl
83 : {
84 : OUString sHRef;
85 : OUString sName;
86 : OUString sTargetFrameName;
87 : bool bMap;
88 :
89 : public:
90 :
91 : inline XMLTextFrameContextHyperlink_Impl( const OUString& rHRef,
92 : const OUString& rName,
93 : const OUString& rTargetFrameName,
94 : bool bMap );
95 :
96 2 : const OUString& GetHRef() const { return sHRef; }
97 2 : const OUString& GetName() const { return sName; }
98 2 : const OUString& GetTargetFrameName() const { return sTargetFrameName; }
99 2 : bool GetMap() const { return bMap; }
100 : };
101 :
102 2 : inline XMLTextFrameContextHyperlink_Impl::XMLTextFrameContextHyperlink_Impl(
103 : const OUString& rHRef, const OUString& rName,
104 : const OUString& rTargetFrameName, bool bM ) :
105 : sHRef( rHRef ),
106 : sName( rName ),
107 : sTargetFrameName( rTargetFrameName ),
108 2 : bMap( bM )
109 : {
110 2 : }
111 :
112 : // Implement Title/Description Elements UI (#i73249#)
113 : class XMLTextFrameTitleOrDescContext_Impl : public SvXMLImportContext
114 : {
115 : OUString& mrTitleOrDesc;
116 :
117 : public:
118 :
119 : TYPEINFO_OVERRIDE();
120 :
121 : XMLTextFrameTitleOrDescContext_Impl( SvXMLImport& rImport,
122 : sal_uInt16 nPrfx,
123 : const OUString& rLName,
124 : OUString& rTitleOrDesc );
125 : virtual ~XMLTextFrameTitleOrDescContext_Impl();
126 :
127 : virtual void Characters( const OUString& rText ) SAL_OVERRIDE;
128 : };
129 :
130 0 : TYPEINIT1( XMLTextFrameTitleOrDescContext_Impl, SvXMLImportContext );
131 :
132 17 : XMLTextFrameTitleOrDescContext_Impl::XMLTextFrameTitleOrDescContext_Impl(
133 : SvXMLImport& rImport,
134 : sal_uInt16 nPrfx,
135 : const OUString& rLName,
136 : OUString& rTitleOrDesc )
137 : : SvXMLImportContext( rImport, nPrfx, rLName )
138 17 : , mrTitleOrDesc( rTitleOrDesc )
139 : {
140 17 : }
141 :
142 34 : XMLTextFrameTitleOrDescContext_Impl::~XMLTextFrameTitleOrDescContext_Impl()
143 : {
144 34 : }
145 :
146 16 : void XMLTextFrameTitleOrDescContext_Impl::Characters( const OUString& rText )
147 : {
148 16 : mrTitleOrDesc += rText;
149 16 : }
150 :
151 : class XMLTextFrameParam_Impl : public SvXMLImportContext
152 : {
153 : public:
154 :
155 : TYPEINFO_OVERRIDE();
156 :
157 : XMLTextFrameParam_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx,
158 : const OUString& rLName,
159 : const ::com::sun::star::uno::Reference<
160 : ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
161 : sal_uInt16 nType,
162 : ParamMap &rParamMap);
163 : virtual ~XMLTextFrameParam_Impl();
164 : };
165 :
166 0 : TYPEINIT1( XMLTextFrameParam_Impl, SvXMLImportContext );
167 :
168 0 : XMLTextFrameParam_Impl::~XMLTextFrameParam_Impl()
169 : {
170 0 : }
171 :
172 0 : XMLTextFrameParam_Impl::XMLTextFrameParam_Impl(
173 : SvXMLImport& rImport, sal_uInt16 nPrfx,
174 : const OUString& rLName,
175 : const ::com::sun::star::uno::Reference<
176 : ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
177 : sal_uInt16 /*nType*/,
178 : ParamMap &rParamMap):
179 0 : SvXMLImportContext( rImport, nPrfx, rLName )
180 : {
181 0 : OUString sName, sValue;
182 0 : bool bFoundValue = false; // to allow empty values
183 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
184 0 : for( sal_Int16 i=0; i < nAttrCount; i++ )
185 : {
186 0 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
187 0 : const OUString& rValue = xAttrList->getValueByIndex( i );
188 :
189 0 : OUString aLocalName;
190 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
191 0 : if ( XML_NAMESPACE_DRAW == nPrefix )
192 : {
193 0 : if( IsXMLToken(aLocalName, XML_VALUE) )
194 : {
195 0 : sValue = rValue;
196 0 : bFoundValue=true;
197 : }
198 0 : else if( IsXMLToken(aLocalName, XML_NAME) )
199 : {
200 0 : sName = rValue;
201 : }
202 : }
203 0 : }
204 0 : if (!sName.isEmpty() && bFoundValue )
205 0 : rParamMap[sName] = sValue;
206 0 : }
207 : class XMLTextFrameContourContext_Impl : public SvXMLImportContext
208 : {
209 : Reference < XPropertySet > xPropSet;
210 :
211 : public:
212 :
213 : TYPEINFO_OVERRIDE();
214 :
215 : XMLTextFrameContourContext_Impl( SvXMLImport& rImport, sal_uInt16 nPrfx,
216 : const OUString& rLName,
217 : const ::com::sun::star::uno::Reference<
218 : ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
219 : const Reference < XPropertySet >& rPropSet,
220 : bool bPath );
221 : virtual ~XMLTextFrameContourContext_Impl();
222 : };
223 :
224 0 : TYPEINIT1( XMLTextFrameContourContext_Impl, SvXMLImportContext );
225 :
226 0 : XMLTextFrameContourContext_Impl::XMLTextFrameContourContext_Impl(
227 : SvXMLImport& rImport,
228 : sal_uInt16 nPrfx, const OUString& rLName,
229 : const Reference< XAttributeList > & xAttrList,
230 : const Reference < XPropertySet >& rPropSet,
231 : bool bPath ) :
232 : SvXMLImportContext( rImport, nPrfx, rLName ),
233 0 : xPropSet( rPropSet )
234 : {
235 0 : OUString sD, sPoints, sViewBox;
236 0 : bool bPixelWidth = false, bPixelHeight = false;
237 0 : sal_Bool bAuto = sal_False;
238 0 : sal_Int32 nWidth = 0;
239 0 : sal_Int32 nHeight = 0;
240 :
241 : const SvXMLTokenMap& rTokenMap =
242 0 : GetImport().GetTextImport()->GetTextContourAttrTokenMap();
243 :
244 0 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
245 0 : for( sal_Int16 i=0; i < nAttrCount; i++ )
246 : {
247 0 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
248 0 : const OUString& rValue = xAttrList->getValueByIndex( i );
249 :
250 0 : OUString aLocalName;
251 : sal_uInt16 nPrefix =
252 0 : GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
253 0 : &aLocalName );
254 0 : switch( rTokenMap.Get( nPrefix, aLocalName ) )
255 : {
256 : case XML_TOK_TEXT_CONTOUR_VIEWBOX:
257 0 : sViewBox = rValue;
258 0 : break;
259 : case XML_TOK_TEXT_CONTOUR_D:
260 0 : if( bPath )
261 0 : sD = rValue;
262 0 : break;
263 : case XML_TOK_TEXT_CONTOUR_POINTS:
264 0 : if( !bPath )
265 0 : sPoints = rValue;
266 0 : break;
267 : case XML_TOK_TEXT_CONTOUR_WIDTH:
268 0 : if (::sax::Converter::convertMeasurePx(nWidth, rValue))
269 0 : bPixelWidth = true;
270 : else
271 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
272 0 : nWidth, rValue);
273 0 : break;
274 : case XML_TOK_TEXT_CONTOUR_HEIGHT:
275 0 : if (::sax::Converter::convertMeasurePx(nHeight, rValue))
276 0 : bPixelHeight = true;
277 : else
278 0 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
279 0 : nHeight, rValue);
280 0 : break;
281 : case XML_TOK_TEXT_CONTOUR_AUTO:
282 0 : bAuto = IsXMLToken(rValue, XML_TRUE);
283 0 : break;
284 : }
285 0 : }
286 :
287 0 : OUString sContourPolyPolygon("ContourPolyPolygon");
288 0 : Reference < XPropertySetInfo > xPropSetInfo = rPropSet->getPropertySetInfo();
289 :
290 0 : if(xPropSetInfo->hasPropertyByName(sContourPolyPolygon) && nWidth > 0 && nHeight > 0 && bPixelWidth == bPixelHeight && (bPath ? sD : sPoints).getLength())
291 : {
292 0 : const SdXMLImExViewBox aViewBox( sViewBox, GetImport().GetMM100UnitConverter());
293 0 : basegfx::B2DPolyPolygon aPolyPolygon;
294 0 : Any aAny;
295 :
296 0 : if( bPath )
297 : {
298 0 : basegfx::tools::importFromSvgD(aPolyPolygon, sD, GetImport().needFixPositionAfterZ(), 0);
299 : }
300 : else
301 : {
302 0 : basegfx::B2DPolygon aPolygon;
303 :
304 0 : if(basegfx::tools::importFromSvgPoints(aPolygon, sPoints))
305 : {
306 0 : aPolyPolygon = basegfx::B2DPolyPolygon(aPolygon);
307 0 : }
308 : }
309 :
310 0 : if(aPolyPolygon.count())
311 : {
312 : const basegfx::B2DRange aSourceRange(
313 : aViewBox.GetX(), aViewBox.GetY(),
314 0 : aViewBox.GetX() + aViewBox.GetWidth(), aViewBox.GetY() + aViewBox.GetHeight());
315 : const basegfx::B2DRange aTargetRange(
316 : 0.0, 0.0,
317 0 : nWidth, nHeight);
318 :
319 0 : if(!aSourceRange.equal(aTargetRange))
320 : {
321 : aPolyPolygon.transform(
322 : basegfx::tools::createSourceRangeTargetRangeTransform(
323 : aSourceRange,
324 0 : aTargetRange));
325 : }
326 :
327 0 : com::sun::star::drawing::PointSequenceSequence aPointSequenceSequence;
328 0 : basegfx::tools::B2DPolyPolygonToUnoPointSequenceSequence(aPolyPolygon, aPointSequenceSequence);
329 0 : aAny <<= aPointSequenceSequence;
330 0 : xPropSet->setPropertyValue( sContourPolyPolygon, aAny );
331 : }
332 :
333 0 : const OUString sIsPixelContour("IsPixelContour");
334 :
335 0 : if( xPropSetInfo->hasPropertyByName( sIsPixelContour ) )
336 : {
337 0 : aAny.setValue( &bPixelWidth, cppu::UnoType<bool>::get() );
338 0 : xPropSet->setPropertyValue( sIsPixelContour, aAny );
339 : }
340 :
341 0 : const OUString sIsAutomaticContour("IsAutomaticContour");
342 :
343 0 : if( xPropSetInfo->hasPropertyByName( sIsAutomaticContour ) )
344 : {
345 0 : aAny.setValue( &bAuto, cppu::UnoType<bool>::get() );
346 0 : xPropSet->setPropertyValue( sIsAutomaticContour, aAny );
347 0 : }
348 0 : }
349 0 : }
350 :
351 0 : XMLTextFrameContourContext_Impl::~XMLTextFrameContourContext_Impl()
352 : {
353 0 : }
354 :
355 : class XMLTextFrameContext_Impl : public SvXMLImportContext
356 : {
357 : ::com::sun::star::uno::Reference <
358 : ::com::sun::star::text::XTextCursor > xOldTextCursor;
359 : ::com::sun::star::uno::Reference <
360 : ::com::sun::star::beans::XPropertySet > xPropSet;
361 : ::com::sun::star::uno::Reference <
362 : ::com::sun::star::io::XOutputStream > xBase64Stream;
363 :
364 : /// old list item and block (#89891#)
365 : bool mbListContextPushed;
366 :
367 : const OUString sWidth;
368 : const OUString sWidthType;
369 : const OUString sRelativeWidth;
370 : const OUString sHeight;
371 : const OUString sRelativeHeight;
372 : const OUString sSizeType;
373 : const OUString sIsSyncWidthToHeight;
374 : const OUString sIsSyncHeightToWidth;
375 : const OUString sHoriOrient;
376 : const OUString sHoriOrientPosition;
377 : const OUString sVertOrient;
378 : const OUString sVertOrientPosition;
379 : const OUString sAnchorType;
380 : const OUString sAnchorPageNo;
381 : const OUString sGraphicURL;
382 : const OUString sGraphicFilter;
383 : const OUString sTitle;
384 : const OUString sDescription;
385 : const OUString sFrameStyleName;
386 : const OUString sGraphicRotation;
387 : const OUString sTextBoxServiceName;
388 : const OUString sGraphicServiceName;
389 :
390 : OUString m_sOrigName;
391 : OUString sName;
392 : OUString sStyleName;
393 : OUString sNextName;
394 : OUString sHRef;
395 : OUString sFilterName;
396 : OUString sCode;
397 : OUString sObject;
398 : OUString sArchive;
399 : OUString sMimeType;
400 : OUString sFrameName;
401 : OUString sAppletName;
402 : OUString sFilterService;
403 : OUString sBase64CharsLeft;
404 : OUString sTblName;
405 :
406 : ParamMap aParamMap;
407 :
408 : sal_Int32 nX;
409 : sal_Int32 nY;
410 : sal_Int32 nWidth;
411 : sal_Int32 nHeight;
412 : sal_Int32 nZIndex;
413 : sal_Int16 nPage;
414 : sal_Int16 nRotation;
415 : sal_Int16 nRelWidth;
416 : sal_Int16 nRelHeight;
417 :
418 : sal_uInt16 nType;
419 : ::com::sun::star::text::TextContentAnchorType eAnchorType;
420 :
421 : bool bMayScript : 1;
422 : bool bMinWidth : 1;
423 : bool bMinHeight : 1;
424 : bool bSyncWidth : 1;
425 : bool bSyncHeight : 1;
426 : bool bCreateFailed : 1;
427 : bool bOwnBase64Stream : 1;
428 :
429 : void Create( bool bHRefOrBase64 );
430 :
431 : public:
432 :
433 : TYPEINFO_OVERRIDE();
434 :
435 : bool CreateIfNotThere();
436 6 : const OUString& GetHRef() const { return sHRef; }
437 :
438 : XMLTextFrameContext_Impl( SvXMLImport& rImport,
439 : sal_uInt16 nPrfx,
440 : const OUString& rLName,
441 : const ::com::sun::star::uno::Reference<
442 : ::com::sun::star::xml::sax::XAttributeList > & rAttrList,
443 : ::com::sun::star::text::TextContentAnchorType eAnchorType,
444 : sal_uInt16 nType,
445 : const ::com::sun::star::uno::Reference<
446 : ::com::sun::star::xml::sax::XAttributeList > & rFrameAttrList );
447 : virtual ~XMLTextFrameContext_Impl();
448 :
449 : virtual void EndElement() SAL_OVERRIDE;
450 :
451 : virtual void Characters( const OUString& rChars ) SAL_OVERRIDE;
452 :
453 : SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
454 : const OUString& rLocalName,
455 : const ::com::sun::star::uno::Reference<
456 : ::com::sun::star::xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
457 :
458 : void SetHyperlink( const OUString& rHRef,
459 : const OUString& rName,
460 : const OUString& rTargetFrameName,
461 : bool bMap );
462 :
463 : // Implement Title/Description Elements UI (#i73249#)
464 : void SetTitle( const OUString& rTitle );
465 :
466 : void SetDesc( const OUString& rDesc );
467 :
468 : void SetName();
469 :
470 12 : ::com::sun::star::text::TextContentAnchorType GetAnchorType() const { return eAnchorType; }
471 :
472 : const ::com::sun::star::uno::Reference <
473 26 : ::com::sun::star::beans::XPropertySet >& GetPropSet() const { return xPropSet; }
474 : };
475 :
476 1959 : TYPEINIT1( XMLTextFrameContext_Impl, SvXMLImportContext );
477 :
478 369 : void XMLTextFrameContext_Impl::Create( bool /*bHRefOrBase64*/ )
479 : {
480 : rtl::Reference < XMLTextImportHelper > xTextImportHelper =
481 369 : GetImport().GetTextImport();
482 :
483 369 : switch ( nType)
484 : {
485 : case XML_TEXT_FRAME_OBJECT:
486 : case XML_TEXT_FRAME_OBJECT_OLE:
487 15 : if( xBase64Stream.is() )
488 : {
489 0 : OUString sURL( GetImport().ResolveEmbeddedObjectURLFromBase64() );
490 0 : if( !sURL.isEmpty() )
491 0 : xPropSet = GetImport().GetTextImport()
492 0 : ->createAndInsertOLEObject( GetImport(), sURL,
493 : sStyleName,
494 : sTblName,
495 0 : nWidth, nHeight );
496 : }
497 15 : else if( !sHRef.isEmpty() )
498 : {
499 10 : OUString sURL( GetImport().ResolveEmbeddedObjectURL( sHRef,
500 20 : OUString() ) );
501 :
502 10 : if( GetImport().IsPackageURL( sHRef ) )
503 : {
504 40 : xPropSet = GetImport().GetTextImport()
505 30 : ->createAndInsertOLEObject( GetImport(), sURL,
506 : sStyleName,
507 : sTblName,
508 20 : nWidth, nHeight );
509 : }
510 : else
511 : {
512 : // it should be an own OOo link that has no storage persistence
513 0 : xPropSet = GetImport().GetTextImport()
514 0 : ->createAndInsertOOoLink( GetImport(),
515 : sURL,
516 : sStyleName,
517 : sTblName,
518 0 : nWidth, nHeight );
519 10 : }
520 : }
521 : else
522 : {
523 5 : OUString sURL( "vnd.sun.star.ServiceName:" );
524 5 : sURL += sFilterService;
525 20 : xPropSet = GetImport().GetTextImport()
526 15 : ->createAndInsertOLEObject( GetImport(), sURL,
527 : sStyleName,
528 : sTblName,
529 15 : nWidth, nHeight );
530 :
531 : }
532 15 : break;
533 : case XML_TEXT_FRAME_APPLET:
534 : {
535 0 : xPropSet = GetImport().GetTextImport()
536 0 : ->createAndInsertApplet( sAppletName, sCode,
537 : bMayScript, sHRef,
538 0 : nWidth, nHeight);
539 0 : break;
540 : }
541 : case XML_TEXT_FRAME_PLUGIN:
542 : {
543 0 : if(!sHRef.isEmpty())
544 0 : GetImport().GetAbsoluteReference(sHRef);
545 0 : xPropSet = GetImport().GetTextImport()
546 0 : ->createAndInsertPlugin( sMimeType, sHRef,
547 0 : nWidth, nHeight);
548 :
549 0 : break;
550 : }
551 : case XML_TEXT_FRAME_FLOATING_FRAME:
552 : {
553 0 : xPropSet = GetImport().GetTextImport()
554 0 : ->createAndInsertFloatingFrame( sFrameName, sHRef,
555 : sStyleName,
556 0 : nWidth, nHeight);
557 0 : break;
558 : }
559 : default:
560 : {
561 354 : Reference<XMultiServiceFactory> xFactory( GetImport().GetModel(),
562 354 : UNO_QUERY );
563 354 : if( xFactory.is() )
564 : {
565 354 : OUString sServiceName;
566 354 : switch( nType )
567 : {
568 157 : case XML_TEXT_FRAME_TEXTBOX: sServiceName = sTextBoxServiceName; break;
569 197 : case XML_TEXT_FRAME_GRAPHIC: sServiceName = sGraphicServiceName; break;
570 : }
571 354 : Reference<XInterface> xIfc = xFactory->createInstance( sServiceName );
572 : DBG_ASSERT( xIfc.is(), "couldn't create frame" );
573 354 : if( xIfc.is() )
574 354 : xPropSet = Reference < XPropertySet >( xIfc, UNO_QUERY );
575 354 : }
576 : }
577 : }
578 :
579 369 : if( !xPropSet.is() )
580 : {
581 0 : bCreateFailed = true;
582 0 : return;
583 : }
584 :
585 369 : Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo();
586 :
587 : // set name
588 738 : Reference < XNamed > xNamed( xPropSet, UNO_QUERY );
589 369 : if( xNamed.is() )
590 : {
591 369 : OUString sOrigName( xNamed->getName() );
592 740 : if( sOrigName.isEmpty() ||
593 10 : (!sName.isEmpty() && sOrigName != sName) )
594 : {
595 366 : OUString sOldName( sName );
596 366 : sal_Int32 i = 0;
597 747 : while( xTextImportHelper->HasFrameByName( sName ) )
598 : {
599 15 : sName = sOldName;
600 15 : sName += OUString::number( ++i );
601 : }
602 366 : xNamed->setName( sName );
603 366 : if( sName != sOldName )
604 9 : xTextImportHelper->GetRenameMap().Add( XML_TEXT_RENAME_TYPE_FRAME,
605 18 : sOldName, sName );
606 369 : }
607 : }
608 :
609 : // frame style
610 369 : XMLPropStyleContext *pStyle = 0;
611 369 : if( !sStyleName.isEmpty() )
612 : {
613 369 : pStyle = xTextImportHelper->FindAutoFrameStyle( sStyleName );
614 369 : if( pStyle )
615 368 : sStyleName = pStyle->GetParentName();
616 : }
617 :
618 738 : Any aAny;
619 369 : if( !sStyleName.isEmpty() )
620 : {
621 369 : OUString sDisplayStyleName( GetImport().GetStyleDisplayName(
622 738 : XML_STYLE_FAMILY_SD_GRAPHICS_ID, sStyleName ) );
623 : const Reference < XNameContainer > & rStyles =
624 369 : xTextImportHelper->GetFrameStyles();
625 738 : if( rStyles.is() &&
626 369 : rStyles->hasByName( sDisplayStyleName ) )
627 : {
628 369 : aAny <<= sDisplayStyleName;
629 369 : xPropSet->setPropertyValue( sFrameStyleName, aAny );
630 369 : }
631 : }
632 :
633 : // anchor type (must be set before any other properties, because
634 : // otherwise some orientations cannot be set or will be changed
635 : // afterwards)
636 369 : aAny <<= eAnchorType;
637 369 : xPropSet->setPropertyValue( sAnchorType, aAny );
638 :
639 : // hard properties
640 369 : if( pStyle )
641 368 : pStyle->FillPropertySet( xPropSet );
642 :
643 : // x and y
644 369 : sal_Int16 nHoriOrient = HoriOrientation::NONE;
645 369 : aAny = xPropSet->getPropertyValue( sHoriOrient );
646 369 : aAny >>= nHoriOrient;
647 369 : if( HoriOrientation::NONE == nHoriOrient )
648 : {
649 288 : aAny <<= nX;
650 288 : xPropSet->setPropertyValue( sHoriOrientPosition, aAny );
651 : }
652 :
653 369 : sal_Int16 nVertOrient = VertOrientation::NONE;
654 369 : aAny = xPropSet->getPropertyValue( sVertOrient );
655 369 : aAny >>= nVertOrient;
656 369 : if( VertOrientation::NONE == nVertOrient )
657 : {
658 235 : aAny <<= nY;
659 235 : xPropSet->setPropertyValue( sVertOrientPosition, aAny );
660 : }
661 :
662 : // width
663 369 : if( nWidth > 0 )
664 : {
665 368 : aAny <<= nWidth;
666 368 : xPropSet->setPropertyValue( sWidth, aAny );
667 : }
668 369 : if( nRelWidth > 0 || nWidth > 0 )
669 : {
670 368 : aAny <<= nRelWidth;
671 368 : xPropSet->setPropertyValue( sRelativeWidth, aAny );
672 : }
673 369 : if( bSyncWidth || nWidth > 0 )
674 : {
675 368 : sal_Bool bTmp = bSyncWidth;
676 368 : aAny.setValue( &bTmp, cppu::UnoType<bool>::get() );
677 368 : xPropSet->setPropertyValue( sIsSyncWidthToHeight, aAny );
678 : }
679 526 : if( xPropSetInfo->hasPropertyByName( sWidthType ) &&
680 155 : (bMinWidth || nWidth > 0 || nRelWidth > 0 ) )
681 : {
682 : sal_Int16 nSizeType =
683 2 : (bMinWidth && XML_TEXT_FRAME_TEXTBOX == nType) ? SizeType::MIN
684 159 : : SizeType::FIX;
685 157 : aAny <<= nSizeType;
686 157 : xPropSet->setPropertyValue( sWidthType, aAny );
687 : }
688 :
689 369 : if( nHeight > 0 )
690 : {
691 368 : aAny <<= nHeight;
692 368 : xPropSet->setPropertyValue( sHeight, aAny );
693 : }
694 369 : if( nRelHeight > 0 || nHeight > 0 )
695 : {
696 368 : aAny <<= nRelHeight;
697 368 : xPropSet->setPropertyValue( sRelativeHeight, aAny );
698 : }
699 369 : if( bSyncHeight || nHeight > 0 )
700 : {
701 368 : sal_Bool bTmp = bSyncHeight;
702 368 : aAny.setValue( &bTmp, cppu::UnoType<bool>::get() );
703 368 : xPropSet->setPropertyValue( sIsSyncHeightToWidth, aAny );
704 : }
705 526 : if( xPropSetInfo->hasPropertyByName( sSizeType ) &&
706 59 : (bMinHeight || nHeight > 0 || nRelHeight > 0 ) )
707 : {
708 : sal_Int16 nSizeType =
709 98 : (bMinHeight && XML_TEXT_FRAME_TEXTBOX == nType) ? SizeType::MIN
710 255 : : SizeType::FIX;
711 157 : aAny <<= nSizeType;
712 157 : xPropSet->setPropertyValue( sSizeType, aAny );
713 : }
714 :
715 369 : if( XML_TEXT_FRAME_GRAPHIC == nType )
716 : {
717 : // URL
718 : OSL_ENSURE( !sHRef.isEmpty() || xBase64Stream.is(),
719 : "neither URL nor base64 image data given" );
720 : rtl::Reference < XMLTextImportHelper > xTxtImport =
721 197 : GetImport().GetTextImport();
722 197 : if( !sHRef.isEmpty() )
723 : {
724 144 : bool bForceLoad = xTxtImport->IsInsertMode() ||
725 144 : xTxtImport->IsBlockMode() ||
726 216 : xTxtImport->IsStylesOnlyMode() ||
727 144 : xTxtImport->IsOrganizerMode();
728 72 : sHRef = GetImport().ResolveGraphicObjectURL( sHRef, !bForceLoad );
729 : }
730 125 : else if( xBase64Stream.is() )
731 : {
732 125 : sHRef = GetImport().ResolveGraphicObjectURLFromBase64( xBase64Stream );
733 125 : xBase64Stream = 0;
734 : }
735 197 : aAny <<= sHRef;
736 197 : xPropSet->setPropertyValue( sGraphicURL, aAny );
737 :
738 : // filter name
739 197 : aAny <<=sFilterName;
740 197 : xPropSet->setPropertyValue( sGraphicFilter, aAny );
741 :
742 : // rotation
743 197 : aAny <<= nRotation;
744 197 : xPropSet->setPropertyValue( sGraphicRotation, aAny );
745 : }
746 :
747 : // page number (must be set after the frame is inserted, because it
748 : // will be overwritten then inserting the frame.
749 369 : if( TextContentAnchorType_AT_PAGE == eAnchorType && nPage > 0 )
750 : {
751 100 : aAny <<= nPage;
752 100 : xPropSet->setPropertyValue( sAnchorPageNo, aAny );
753 : }
754 :
755 726 : if( XML_TEXT_FRAME_OBJECT != nType &&
756 711 : XML_TEXT_FRAME_OBJECT_OLE != nType &&
757 708 : XML_TEXT_FRAME_APPLET != nType &&
758 708 : XML_TEXT_FRAME_PLUGIN!= nType &&
759 354 : XML_TEXT_FRAME_FLOATING_FRAME != nType)
760 : {
761 354 : Reference < XTextContent > xTxtCntnt( xPropSet, UNO_QUERY );
762 : try
763 : {
764 354 : xTextImportHelper->InsertTextContent(xTxtCntnt);
765 : }
766 0 : catch (lang::IllegalArgumentException const& e)
767 : {
768 : SAL_WARN("xmloff.text", "Cannot import part of the text - probably an image in the text frame? " << e.Message);
769 0 : return;
770 354 : }
771 : }
772 :
773 : // #107848#
774 : // Make adding the shepe to Z-Ordering dependent from if we are
775 : // inside a inside_deleted_section (redlining). That is necessary
776 : // since the shape will be removed again later. It would lead to
777 : // errors if it would stay inside the Z-Ordering. Thus, the
778 : // easiest way to solve that conflict is to not add it here.
779 1107 : if(!GetImport().HasTextImport()
780 1476 : || !GetImport().GetTextImport()->IsInsideDeleteContext())
781 : {
782 369 : Reference < XShape > xShape( xPropSet, UNO_QUERY );
783 :
784 369 : GetImport().GetShapeImport()->shapeWithZIndexAdded( xShape, nZIndex );
785 : }
786 :
787 369 : if( XML_TEXT_FRAME_TEXTBOX == nType )
788 : {
789 157 : xTextImportHelper->ConnectFrameChains( sName, sNextName, xPropSet );
790 157 : Reference < XTextFrame > xTxtFrame( xPropSet, UNO_QUERY );
791 314 : Reference < XText > xTxt = xTxtFrame->getText();
792 157 : xOldTextCursor = xTextImportHelper->GetCursor();
793 157 : xTextImportHelper->SetCursor( xTxt->createTextCursor() );
794 :
795 : // remember old list item and block (#89892#) and reset them
796 : // for the text frame
797 157 : xTextImportHelper->PushListContext();
798 314 : mbListContextPushed = true;
799 369 : }
800 : }
801 :
802 3 : void XMLTextFrameContext::removeGraphicFromImportContext(const SvXMLImportContext& rContext) const
803 : {
804 3 : const XMLTextFrameContext_Impl* pXMLTextFrameContext_Impl = dynamic_cast< const XMLTextFrameContext_Impl* >(&rContext);
805 :
806 3 : if(pXMLTextFrameContext_Impl)
807 : {
808 : try
809 : {
810 : // just dispose to delete
811 3 : uno::Reference< lang::XComponent > xComp(pXMLTextFrameContext_Impl->GetPropSet(), UNO_QUERY);
812 :
813 3 : if(xComp.is())
814 : {
815 3 : xComp->dispose();
816 3 : }
817 : }
818 0 : catch( uno::Exception& )
819 : {
820 : OSL_FAIL( "Error in cleanup of multiple graphic object import (!)" );
821 : }
822 : }
823 3 : }
824 :
825 6 : OUString XMLTextFrameContext::getGraphicURLFromImportContext(const SvXMLImportContext& rContext) const
826 : {
827 6 : OUString aRetval;
828 6 : const XMLTextFrameContext_Impl* pXMLTextFrameContext_Impl = dynamic_cast< const XMLTextFrameContext_Impl* >(&rContext);
829 :
830 6 : if(pXMLTextFrameContext_Impl)
831 : {
832 6 : return pXMLTextFrameContext_Impl->GetHRef();
833 : }
834 :
835 0 : return aRetval;
836 : }
837 :
838 746 : bool XMLTextFrameContext_Impl::CreateIfNotThere()
839 : {
840 1617 : if( !xPropSet.is() &&
841 250 : ( XML_TEXT_FRAME_OBJECT_OLE == nType ||
842 250 : XML_TEXT_FRAME_GRAPHIC == nType ) &&
843 996 : xBase64Stream.is() && !bCreateFailed )
844 : {
845 125 : if( bOwnBase64Stream )
846 0 : xBase64Stream->closeOutput();
847 125 : Create( true );
848 : }
849 :
850 746 : return xPropSet.is();
851 : }
852 :
853 369 : XMLTextFrameContext_Impl::XMLTextFrameContext_Impl(
854 : SvXMLImport& rImport,
855 : sal_uInt16 nPrfx, const OUString& rLName,
856 : const Reference< XAttributeList > & rAttrList,
857 : TextContentAnchorType eATyp,
858 : sal_uInt16 nNewType,
859 : const Reference< XAttributeList > & rFrameAttrList )
860 : : SvXMLImportContext( rImport, nPrfx, rLName )
861 : , mbListContextPushed( false )
862 : , sWidth("Width")
863 : , sWidthType("WidthType")
864 : , sRelativeWidth("RelativeWidth")
865 : , sHeight("Height")
866 : , sRelativeHeight("RelativeHeight")
867 : , sSizeType("SizeType")
868 : , sIsSyncWidthToHeight("IsSyncWidthToHeight")
869 : , sIsSyncHeightToWidth("IsSyncHeightToWidth")
870 : , sHoriOrient("HoriOrient")
871 : , sHoriOrientPosition("HoriOrientPosition")
872 : , sVertOrient("VertOrient")
873 : , sVertOrientPosition("VertOrientPosition")
874 : , sAnchorType("AnchorType")
875 : , sAnchorPageNo("AnchorPageNo")
876 : , sGraphicURL("GraphicURL")
877 : , sGraphicFilter("GraphicFilter")
878 : , sTitle("Title")
879 : , sDescription("Description")
880 : , sFrameStyleName("FrameStyleName")
881 : , sGraphicRotation("GraphicRotation")
882 : , sTextBoxServiceName("com.sun.star.text.TextFrame")
883 : , sGraphicServiceName("com.sun.star.text.GraphicObject")
884 : , nType( nNewType )
885 369 : , eAnchorType( eATyp )
886 : {
887 369 : nX = 0;
888 369 : nY = 0;
889 369 : nWidth = 0;
890 369 : nHeight = 0;
891 369 : nZIndex = -1;
892 369 : nPage = 0;
893 369 : nRotation = 0;
894 369 : nRelWidth = 0;
895 369 : nRelHeight = 0;
896 369 : bMayScript = false;
897 :
898 369 : bMinHeight = false;
899 369 : bMinWidth = false;
900 369 : bSyncWidth = false;
901 369 : bSyncHeight = false;
902 369 : bCreateFailed = false;
903 369 : bOwnBase64Stream = false;
904 :
905 : rtl::Reference < XMLTextImportHelper > xTxtImport =
906 369 : GetImport().GetTextImport();
907 : const SvXMLTokenMap& rTokenMap =
908 369 : xTxtImport->GetTextFrameAttrTokenMap();
909 :
910 369 : sal_Int16 nAttrCount = rAttrList.is() ? rAttrList->getLength() : 0;
911 369 : sal_Int16 nTotalAttrCount = nAttrCount + (rFrameAttrList.is() ? rFrameAttrList->getLength() : 0);
912 3488 : for( sal_Int16 i=0; i < nTotalAttrCount; i++ )
913 : {
914 : const OUString& rAttrName =
915 3119 : i < nAttrCount ? rAttrList->getNameByIndex( i ) : rFrameAttrList->getNameByIndex( i-nAttrCount );
916 : const OUString& rValue =
917 6238 : i < nAttrCount ? rAttrList->getValueByIndex( i ): rFrameAttrList->getValueByIndex( i-nAttrCount );
918 :
919 6238 : OUString aLocalName;
920 : sal_uInt16 nPrefix =
921 3119 : GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
922 3119 : &aLocalName );
923 3119 : switch( rTokenMap.Get( nPrefix, aLocalName ) )
924 : {
925 : case XML_TOK_TEXT_FRAME_STYLE_NAME:
926 369 : sStyleName = rValue;
927 369 : break;
928 : case XML_TOK_TEXT_FRAME_NAME:
929 360 : m_sOrigName = rValue;
930 360 : sName = rValue;
931 360 : break;
932 : case XML_TOK_TEXT_FRAME_FRAME_NAME:
933 0 : sFrameName = rValue;
934 0 : break;
935 : case XML_TOK_TEXT_FRAME_APPLET_NAME:
936 0 : sAppletName = rValue;
937 0 : break;
938 : case XML_TOK_TEXT_FRAME_ANCHOR_TYPE:
939 568 : if( TextContentAnchorType_AT_PARAGRAPH == eAnchorType ||
940 388 : TextContentAnchorType_AT_CHARACTER == eAnchorType ||
941 189 : TextContentAnchorType_AS_CHARACTER == eAnchorType )
942 : {
943 :
944 : TextContentAnchorType eNew;
945 807 : if( XMLAnchorTypePropHdl::convert( rValue, eNew ) &&
946 368 : ( TextContentAnchorType_AT_PARAGRAPH == eNew ||
947 188 : TextContentAnchorType_AT_CHARACTER == eNew ||
948 89 : TextContentAnchorType_AS_CHARACTER == eNew ||
949 0 : TextContentAnchorType_AT_PAGE == eNew) )
950 269 : eAnchorType = eNew;
951 : }
952 369 : break;
953 : case XML_TOK_TEXT_FRAME_ANCHOR_PAGE_NUMBER:
954 : {
955 : sal_Int32 nTmp;
956 100 : if (::sax::Converter::convertNumber(nTmp, rValue, 1, SHRT_MAX))
957 100 : nPage = (sal_Int16)nTmp;
958 : }
959 100 : break;
960 : case XML_TOK_TEXT_FRAME_X:
961 229 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
962 458 : nX, rValue);
963 229 : break;
964 : case XML_TOK_TEXT_FRAME_Y:
965 235 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
966 470 : nY, rValue );
967 235 : break;
968 : case XML_TOK_TEXT_FRAME_WIDTH:
969 : // relative widths are obsolete since SRC617. Remove them some day!
970 367 : if( rValue.indexOf( '%' ) != -1 )
971 : {
972 : sal_Int32 nTmp;
973 0 : ::sax::Converter::convertPercent( nTmp, rValue );
974 0 : nRelWidth = (sal_Int16)nTmp;
975 : }
976 : else
977 : {
978 367 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
979 734 : nWidth, rValue, 0 );
980 : }
981 367 : break;
982 : case XML_TOK_TEXT_FRAME_REL_WIDTH:
983 9 : if( IsXMLToken(rValue, XML_SCALE) )
984 : {
985 1 : bSyncWidth = true;
986 : }
987 : else
988 : {
989 : sal_Int32 nTmp;
990 8 : if (::sax::Converter::convertPercent( nTmp, rValue ))
991 8 : nRelWidth = (sal_Int16)nTmp;
992 : }
993 9 : break;
994 : case XML_TOK_TEXT_FRAME_MIN_WIDTH:
995 2 : if( rValue.indexOf( '%' ) != -1 )
996 : {
997 : sal_Int32 nTmp;
998 0 : ::sax::Converter::convertPercent( nTmp, rValue );
999 0 : nRelWidth = (sal_Int16)nTmp;
1000 : }
1001 : else
1002 : {
1003 2 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1004 4 : nWidth, rValue, 0 );
1005 : }
1006 2 : bMinWidth = true;
1007 2 : break;
1008 : case XML_TOK_TEXT_FRAME_HEIGHT:
1009 : // relative heights are obsolete since SRC617. Remove them some day!
1010 271 : if( rValue.indexOf( '%' ) != -1 )
1011 : {
1012 : sal_Int32 nTmp;
1013 0 : ::sax::Converter::convertPercent( nTmp, rValue );
1014 0 : nRelHeight = (sal_Int16)nTmp;
1015 : }
1016 : else
1017 : {
1018 271 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1019 542 : nHeight, rValue, 0 );
1020 : }
1021 271 : break;
1022 : case XML_TOK_TEXT_FRAME_REL_HEIGHT:
1023 9 : if( IsXMLToken( rValue, XML_SCALE ) )
1024 : {
1025 3 : bSyncHeight = true;
1026 : }
1027 6 : else if( IsXMLToken( rValue, XML_SCALE_MIN ) )
1028 : {
1029 0 : bSyncHeight = true;
1030 0 : bMinHeight = true;
1031 : }
1032 : else
1033 : {
1034 : sal_Int32 nTmp;
1035 6 : if (::sax::Converter::convertPercent( nTmp, rValue ))
1036 6 : nRelHeight = (sal_Int16)nTmp;
1037 : }
1038 9 : break;
1039 : case XML_TOK_TEXT_FRAME_MIN_HEIGHT:
1040 98 : if( rValue.indexOf( '%' ) != -1 )
1041 : {
1042 : sal_Int32 nTmp;
1043 0 : ::sax::Converter::convertPercent( nTmp, rValue );
1044 0 : nRelHeight = (sal_Int16)nTmp;
1045 : }
1046 : else
1047 : {
1048 98 : GetImport().GetMM100UnitConverter().convertMeasureToCore(
1049 196 : nHeight, rValue, 0 );
1050 : }
1051 98 : bMinHeight = true;
1052 98 : break;
1053 : case XML_TOK_TEXT_FRAME_Z_INDEX:
1054 227 : ::sax::Converter::convertNumber( nZIndex, rValue, -1 );
1055 227 : break;
1056 : case XML_TOK_TEXT_FRAME_NEXT_CHAIN_NAME:
1057 1 : sNextName = rValue;
1058 1 : break;
1059 : case XML_TOK_TEXT_FRAME_HREF:
1060 82 : sHRef = rValue;
1061 82 : break;
1062 : case XML_TOK_TEXT_FRAME_FILTER_NAME:
1063 0 : sFilterName = rValue;
1064 0 : break;
1065 : case XML_TOK_TEXT_FRAME_TRANSFORM:
1066 : {
1067 0 : OUString sValue( rValue );
1068 0 : sValue = sValue.trim();
1069 0 : const OUString aRotate(GetXMLToken(XML_ROTATE));
1070 0 : const sal_Int32 nRotateLen(aRotate.getLength());
1071 0 : sal_Int32 nLen = sValue.getLength();
1072 0 : if( nLen >= nRotateLen+3 &&
1073 0 : 0 == sValue.compareTo( aRotate, nRotateLen ) &&
1074 0 : '(' == sValue[nRotateLen] &&
1075 0 : ')' == sValue[nLen-1] )
1076 : {
1077 0 : sValue = sValue.copy( nRotateLen+1, nLen-(nRotateLen+2) );
1078 0 : sValue = sValue.trim();
1079 : sal_Int32 nVal;
1080 0 : if (::sax::Converter::convertNumber( nVal, sValue ))
1081 0 : nRotation = (sal_Int16)(nVal % 360 );
1082 0 : }
1083 : }
1084 0 : break;
1085 : case XML_TOK_TEXT_FRAME_CODE:
1086 0 : sCode = rValue;
1087 0 : break;
1088 : case XML_TOK_TEXT_FRAME_OBJECT:
1089 0 : sObject = rValue;
1090 0 : break;
1091 : case XML_TOK_TEXT_FRAME_ARCHIVE:
1092 0 : sArchive = rValue;
1093 0 : break;
1094 : case XML_TOK_TEXT_FRAME_MAY_SCRIPT:
1095 0 : bMayScript = IsXMLToken( rValue, XML_TRUE );
1096 0 : break;
1097 : case XML_TOK_TEXT_FRAME_MIME_TYPE:
1098 0 : sMimeType = rValue;
1099 0 : break;
1100 : case XML_TOK_TEXT_FRAME_NOTIFY_ON_UPDATE:
1101 0 : sTblName = rValue;
1102 0 : break;
1103 : }
1104 3119 : }
1105 :
1106 910 : if( ( (XML_TEXT_FRAME_GRAPHIC == nType ||
1107 332 : XML_TEXT_FRAME_OBJECT == nType ||
1108 372 : XML_TEXT_FRAME_OBJECT_OLE == nType) &&
1109 451 : sHRef.isEmpty() ) ||
1110 977 : ( XML_TEXT_FRAME_APPLET == nType && sCode.isEmpty() ) ||
1111 239 : ( XML_TEXT_FRAME_PLUGIN == nType &&
1112 0 : sHRef.isEmpty() && sMimeType.isEmpty() ) )
1113 499 : return; // no URL: no image or OLE object
1114 :
1115 239 : Create( true );
1116 : }
1117 :
1118 738 : XMLTextFrameContext_Impl::~XMLTextFrameContext_Impl()
1119 : {
1120 738 : }
1121 :
1122 369 : void XMLTextFrameContext_Impl::EndElement()
1123 : {
1124 369 : CreateIfNotThere();
1125 :
1126 369 : if( xOldTextCursor.is() )
1127 : {
1128 157 : GetImport().GetTextImport()->DeleteParagraph();
1129 157 : GetImport().GetTextImport()->SetCursor( xOldTextCursor );
1130 : }
1131 :
1132 : // reinstall old list item (if necessary) #89892#
1133 369 : if (mbListContextPushed) {
1134 157 : GetImport().GetTextImport()->PopListContext();
1135 : }
1136 :
1137 369 : if (( nType == XML_TEXT_FRAME_APPLET || nType == XML_TEXT_FRAME_PLUGIN ) && xPropSet.is())
1138 0 : GetImport().GetTextImport()->endAppletOrPlugin( xPropSet, aParamMap);
1139 369 : }
1140 :
1141 337 : SvXMLImportContext *XMLTextFrameContext_Impl::CreateChildContext(
1142 : sal_uInt16 nPrefix,
1143 : const OUString& rLocalName,
1144 : const Reference< XAttributeList > & xAttrList )
1145 : {
1146 337 : SvXMLImportContext *pContext = 0;
1147 :
1148 337 : if( XML_NAMESPACE_DRAW == nPrefix )
1149 : {
1150 9 : if ( (nType == XML_TEXT_FRAME_APPLET || nType == XML_TEXT_FRAME_PLUGIN) &&
1151 0 : IsXMLToken( rLocalName, XML_PARAM ) )
1152 : {
1153 0 : pContext = new XMLTextFrameParam_Impl( GetImport(),
1154 : nPrefix, rLocalName,
1155 0 : xAttrList, nType, aParamMap );
1156 : }
1157 : }
1158 328 : else if( (XML_NAMESPACE_OFFICE == nPrefix) )
1159 : {
1160 130 : if( IsXMLToken( rLocalName, XML_BINARY_DATA ) )
1161 : {
1162 125 : if( !xPropSet.is() && !xBase64Stream.is() && !bCreateFailed )
1163 : {
1164 125 : switch( nType )
1165 : {
1166 : case XML_TEXT_FRAME_GRAPHIC:
1167 250 : xBase64Stream =
1168 250 : GetImport().GetStreamForGraphicObjectURLFromBase64();
1169 125 : break;
1170 : case XML_TEXT_FRAME_OBJECT_OLE:
1171 0 : xBase64Stream =
1172 0 : GetImport().GetStreamForEmbeddedObjectURLFromBase64();
1173 0 : break;
1174 : }
1175 125 : if( xBase64Stream.is() )
1176 125 : pContext = new XMLBase64ImportContext( GetImport(), nPrefix,
1177 : rLocalName, xAttrList,
1178 125 : xBase64Stream );
1179 : }
1180 : }
1181 : }
1182 : // Correction of condition which also avoids warnings. (#i100480#)
1183 554 : if( !pContext &&
1184 217 : ( XML_TEXT_FRAME_OBJECT == nType &&
1185 5 : ( ( XML_NAMESPACE_OFFICE == nPrefix &&
1186 5 : IsXMLToken( rLocalName, XML_DOCUMENT ) ) ||
1187 0 : ( XML_NAMESPACE_MATH == nPrefix &&
1188 0 : IsXMLToken( rLocalName, XML_MATH ) ) ) ) )
1189 : {
1190 5 : if( !xPropSet.is() && !bCreateFailed )
1191 : {
1192 : XMLEmbeddedObjectImportContext *pEContext =
1193 5 : new XMLEmbeddedObjectImportContext( GetImport(), nPrefix,
1194 5 : rLocalName, xAttrList );
1195 5 : sFilterService = pEContext->GetFilterServiceName();
1196 5 : if( !sFilterService.isEmpty() )
1197 : {
1198 5 : Create( false );
1199 5 : if( xPropSet.is() )
1200 : {
1201 : Reference < XEmbeddedObjectSupplier > xEOS( xPropSet,
1202 5 : UNO_QUERY );
1203 : OSL_ENSURE( xEOS.is(),
1204 : "no embedded object supplier for own object" );
1205 10 : Reference<com::sun::star::lang::XComponent> aXComponent(xEOS->getEmbeddedObject());
1206 10 : pEContext->SetComponent( aXComponent );
1207 : }
1208 : }
1209 5 : pContext = pEContext;
1210 : }
1211 : }
1212 337 : if( !pContext && xOldTextCursor.is() ) // text-box
1213 207 : pContext = GetImport().GetTextImport()->CreateTextChildContext(
1214 207 : GetImport(), nPrefix, rLocalName, xAttrList,
1215 414 : XML_TEXT_TYPE_TEXTBOX );
1216 :
1217 337 : if( !pContext )
1218 0 : pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
1219 :
1220 337 : return pContext;
1221 : }
1222 :
1223 144 : void XMLTextFrameContext_Impl::Characters( const OUString& rChars )
1224 : {
1225 432 : if( ( XML_TEXT_FRAME_OBJECT_OLE == nType ||
1226 144 : XML_TEXT_FRAME_GRAPHIC == nType) &&
1227 144 : !xPropSet.is() && !bCreateFailed )
1228 : {
1229 0 : OUString sTrimmedChars( rChars. trim() );
1230 0 : if( !sTrimmedChars.isEmpty() )
1231 : {
1232 0 : if( !xBase64Stream.is() )
1233 : {
1234 0 : if( XML_TEXT_FRAME_GRAPHIC == nType )
1235 : {
1236 0 : xBase64Stream =
1237 0 : GetImport().GetStreamForGraphicObjectURLFromBase64();
1238 : }
1239 : else
1240 : {
1241 0 : xBase64Stream =
1242 0 : GetImport().GetStreamForEmbeddedObjectURLFromBase64();
1243 : }
1244 0 : if( xBase64Stream.is() )
1245 0 : bOwnBase64Stream = true;
1246 : }
1247 0 : if( bOwnBase64Stream && xBase64Stream.is() )
1248 : {
1249 0 : OUString sChars;
1250 0 : if( !sBase64CharsLeft.isEmpty() )
1251 : {
1252 0 : sChars = sBase64CharsLeft;
1253 0 : sChars += sTrimmedChars;
1254 0 : sBase64CharsLeft.clear();
1255 : }
1256 : else
1257 : {
1258 0 : sChars = sTrimmedChars;
1259 : }
1260 0 : Sequence< sal_Int8 > aBuffer( (sChars.getLength() / 4) * 3 );
1261 : sal_Int32 nCharsDecoded =
1262 0 : ::sax::Converter::decodeBase64SomeChars( aBuffer, sChars );
1263 0 : xBase64Stream->writeBytes( aBuffer );
1264 0 : if( nCharsDecoded != sChars.getLength() )
1265 0 : sBase64CharsLeft = sChars.copy( nCharsDecoded );
1266 : }
1267 0 : }
1268 : }
1269 144 : }
1270 :
1271 2 : void XMLTextFrameContext_Impl::SetHyperlink( const OUString& rHRef,
1272 : const OUString& rName,
1273 : const OUString& rTargetFrameName,
1274 : bool bMap )
1275 : {
1276 : static const char s_HyperLinkURL[] = "HyperLinkURL";
1277 : static const char s_HyperLinkName[] = "HyperLinkName";
1278 : static const char s_HyperLinkTarget[] = "HyperLinkTarget";
1279 : static const char s_ServerMap[] = "ServerMap";
1280 2 : if( !xPropSet.is() )
1281 0 : return;
1282 :
1283 2 : rtl::Reference< XMLTextImportHelper > xTxtImp = GetImport().GetTextImport();
1284 : Reference < XPropertySetInfo > xPropSetInfo =
1285 4 : xPropSet->getPropertySetInfo();
1286 8 : if( !xPropSetInfo.is() ||
1287 8 : !xPropSetInfo->hasPropertyByName(s_HyperLinkURL))
1288 0 : return;
1289 :
1290 4 : Any aAny;
1291 2 : aAny <<= rHRef;
1292 2 : xPropSet->setPropertyValue( s_HyperLinkURL, aAny );
1293 :
1294 2 : if (xPropSetInfo->hasPropertyByName(s_HyperLinkName))
1295 : {
1296 2 : aAny <<= rName;
1297 2 : xPropSet->setPropertyValue(s_HyperLinkName, aAny);
1298 : }
1299 :
1300 2 : if (xPropSetInfo->hasPropertyByName(s_HyperLinkTarget))
1301 : {
1302 2 : aAny <<= rTargetFrameName;
1303 2 : xPropSet->setPropertyValue( s_HyperLinkTarget, aAny );
1304 : }
1305 :
1306 2 : if (xPropSetInfo->hasPropertyByName(s_ServerMap))
1307 : {
1308 2 : aAny.setValue( &bMap, cppu::UnoType<bool>::get() );
1309 2 : xPropSet->setPropertyValue(s_ServerMap, aAny);
1310 2 : }
1311 : }
1312 :
1313 194 : void XMLTextFrameContext_Impl::SetName()
1314 : {
1315 194 : Reference<XNamed> xNamed(xPropSet, UNO_QUERY);
1316 194 : if (!m_sOrigName.isEmpty() && xNamed.is())
1317 : {
1318 193 : OUString const name(xNamed->getName());
1319 193 : if (name != m_sOrigName)
1320 : {
1321 : try
1322 : {
1323 1 : xNamed->setName(m_sOrigName);
1324 : }
1325 0 : catch (uno::Exception const& e)
1326 : { // fdo#71698 document contains 2 frames with same draw:name
1327 : SAL_INFO("xmloff.text", "SetName(): exception setting \""
1328 : << m_sOrigName << "\": " << e.Message);
1329 : }
1330 193 : }
1331 194 : }
1332 194 : }
1333 :
1334 : // Implement Title/Description Elements UI (#i73249#)
1335 5 : void XMLTextFrameContext_Impl::SetTitle( const OUString& rTitle )
1336 : {
1337 5 : if ( xPropSet.is() )
1338 : {
1339 5 : Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo();
1340 5 : if( xPropSetInfo->hasPropertyByName( sTitle ) )
1341 : {
1342 5 : xPropSet->setPropertyValue( sTitle, makeAny( rTitle ) );
1343 5 : }
1344 : }
1345 5 : }
1346 :
1347 11 : void XMLTextFrameContext_Impl::SetDesc( const OUString& rDesc )
1348 : {
1349 11 : if ( xPropSet.is() )
1350 : {
1351 11 : Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo();
1352 11 : if( xPropSetInfo->hasPropertyByName( sDescription ) )
1353 : {
1354 11 : xPropSet->setPropertyValue( sDescription, makeAny( rDesc ) );
1355 11 : }
1356 : }
1357 11 : }
1358 :
1359 180 : TYPEINIT1( XMLTextFrameContext, SvXMLImportContext );
1360 :
1361 11 : bool XMLTextFrameContext::CreateIfNotThere( ::com::sun::star::uno::Reference <
1362 : ::com::sun::star::beans::XPropertySet >& rPropSet )
1363 : {
1364 11 : SvXMLImportContext *pContext = &m_xImplContext;
1365 11 : XMLTextFrameContext_Impl *pImpl = PTR_CAST( XMLTextFrameContext_Impl, pContext );
1366 11 : if( pImpl )
1367 : {
1368 11 : if( pImpl->CreateIfNotThere() )
1369 11 : rPropSet = pImpl->GetPropSet();
1370 : }
1371 :
1372 11 : return rPropSet.is();
1373 : }
1374 :
1375 375 : XMLTextFrameContext::XMLTextFrameContext(
1376 : SvXMLImport& rImport,
1377 : sal_uInt16 nPrfx, const OUString& rLName,
1378 : const Reference< XAttributeList > & xAttrList,
1379 : TextContentAnchorType eATyp )
1380 : : SvXMLImportContext( rImport, nPrfx, rLName )
1381 : , MultiImageImportHelper()
1382 375 : , m_xAttrList( new SvXMLAttributeList( xAttrList ) )
1383 : , m_pHyperlink( 0 )
1384 : // Implement Title/Description Elements UI (#i73249#)
1385 : , m_sTitle()
1386 : , m_sDesc()
1387 : , m_eDefaultAnchorType( eATyp )
1388 : // Shapes in Writer cannot be named via context menu (#i51726#)
1389 : , m_HasAutomaticStyleWithoutParentStyle( false )
1390 750 : , m_bSupportsReplacement( false )
1391 : {
1392 375 : sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
1393 3119 : for( sal_Int16 i=0; i < nAttrCount; i++ )
1394 : {
1395 2744 : const OUString& rAttrName = xAttrList->getNameByIndex( i );
1396 :
1397 5488 : OUString aLocalName;
1398 : sal_uInt16 nPrefix =
1399 2744 : GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
1400 : // New distinguish attribute between Writer objects and Draw objects is:
1401 : // Draw objects have an automatic style without a parent style (#i51726#)
1402 3859 : if ( XML_NAMESPACE_DRAW == nPrefix &&
1403 1115 : IsXMLToken( aLocalName, XML_STYLE_NAME ) )
1404 : {
1405 375 : OUString aStyleName = xAttrList->getValueByIndex( i );
1406 375 : if( !aStyleName.isEmpty() )
1407 : {
1408 : rtl::Reference < XMLTextImportHelper > xTxtImport =
1409 375 : GetImport().GetTextImport();
1410 375 : XMLPropStyleContext* pStyle( 0L );
1411 375 : pStyle = xTxtImport->FindAutoFrameStyle( aStyleName );
1412 375 : if ( pStyle && pStyle->GetParentName().isEmpty() )
1413 : {
1414 9 : m_HasAutomaticStyleWithoutParentStyle = true;
1415 375 : }
1416 375 : }
1417 : }
1418 2843 : else if ( XML_NAMESPACE_TEXT == nPrefix &&
1419 474 : IsXMLToken( aLocalName, XML_ANCHOR_TYPE ) )
1420 : {
1421 : TextContentAnchorType eNew;
1422 1125 : if( XMLAnchorTypePropHdl::convert( xAttrList->getValueByIndex(i),
1423 2250 : eNew ) &&
1424 572 : ( TextContentAnchorType_AT_PARAGRAPH == eNew ||
1425 384 : TextContentAnchorType_AT_CHARACTER == eNew ||
1426 286 : TextContentAnchorType_AS_CHARACTER == eNew ||
1427 99 : TextContentAnchorType_AT_PAGE == eNew) )
1428 375 : m_eDefaultAnchorType = eNew;
1429 : }
1430 2744 : }
1431 375 : }
1432 :
1433 1125 : XMLTextFrameContext::~XMLTextFrameContext()
1434 : {
1435 375 : delete m_pHyperlink;
1436 750 : }
1437 :
1438 375 : void XMLTextFrameContext::EndElement()
1439 : {
1440 : /// solve if multiple image child contexts were imported
1441 375 : SvXMLImportContextRef const pMultiContext(solveMultipleImages());
1442 :
1443 : SvXMLImportContext const*const pContext =
1444 375 : (pMultiContext) ? &pMultiContext : &m_xImplContext;
1445 375 : XMLTextFrameContext_Impl *pImpl = const_cast<XMLTextFrameContext_Impl*>(PTR_CAST( XMLTextFrameContext_Impl, pContext ));
1446 : assert(!pMultiContext || pImpl);
1447 375 : if( pImpl )
1448 : {
1449 366 : pImpl->CreateIfNotThere();
1450 :
1451 : // fdo#68839: in case the surviving image was not the first one,
1452 : // it will have a counter added to its name - set the original name
1453 366 : if (pMultiContext) // do this only when necessary; esp. not for text
1454 : { // frames that may have entries in GetRenameMap()!
1455 194 : pImpl->SetName();
1456 : }
1457 :
1458 366 : if( !m_sTitle.isEmpty() )
1459 : {
1460 5 : pImpl->SetTitle( m_sTitle );
1461 : }
1462 366 : if( !m_sDesc.isEmpty() )
1463 : {
1464 11 : pImpl->SetDesc( m_sDesc );
1465 : }
1466 :
1467 366 : if( m_pHyperlink )
1468 : {
1469 2 : pImpl->SetHyperlink( m_pHyperlink->GetHRef(), m_pHyperlink->GetName(),
1470 4 : m_pHyperlink->GetTargetFrameName(), m_pHyperlink->GetMap() );
1471 2 : delete m_pHyperlink;
1472 2 : m_pHyperlink = 0;
1473 : }
1474 :
1475 375 : }
1476 375 : }
1477 :
1478 406 : SvXMLImportContext *XMLTextFrameContext::CreateChildContext(
1479 : sal_uInt16 p_nPrefix,
1480 : const OUString& rLocalName,
1481 : const Reference< XAttributeList > & xAttrList )
1482 : {
1483 406 : SvXMLImportContext *pContext = 0;
1484 :
1485 406 : if( !m_xImplContext.Is() )
1486 : {
1487 : // no child exists
1488 375 : if( XML_NAMESPACE_DRAW == p_nPrefix )
1489 : {
1490 375 : sal_uInt16 nFrameType = USHRT_MAX;
1491 375 : if( IsXMLToken( rLocalName, XML_TEXT_BOX ) )
1492 160 : nFrameType = XML_TEXT_FRAME_TEXTBOX;
1493 215 : else if( IsXMLToken( rLocalName, XML_IMAGE ) )
1494 200 : nFrameType = XML_TEXT_FRAME_GRAPHIC;
1495 15 : else if( IsXMLToken( rLocalName, XML_OBJECT ) )
1496 12 : nFrameType = XML_TEXT_FRAME_OBJECT;
1497 3 : else if( IsXMLToken( rLocalName, XML_OBJECT_OLE ) )
1498 3 : nFrameType = XML_TEXT_FRAME_OBJECT_OLE;
1499 0 : else if( IsXMLToken( rLocalName, XML_APPLET) )
1500 0 : nFrameType = XML_TEXT_FRAME_APPLET;
1501 0 : else if( IsXMLToken( rLocalName, XML_PLUGIN ) )
1502 0 : nFrameType = XML_TEXT_FRAME_PLUGIN;
1503 0 : else if( IsXMLToken( rLocalName, XML_FLOATING_FRAME ) )
1504 0 : nFrameType = XML_TEXT_FRAME_FLOATING_FRAME;
1505 :
1506 375 : if( USHRT_MAX != nFrameType )
1507 : {
1508 : // Shapes in Writer cannot be named via context menu (#i51726#)
1509 375 : if ( ( XML_TEXT_FRAME_TEXTBOX == nFrameType ||
1510 360 : XML_TEXT_FRAME_GRAPHIC == nFrameType ) &&
1511 : m_HasAutomaticStyleWithoutParentStyle )
1512 : {
1513 9 : Reference < XShapes > xShapes;
1514 9 : pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
1515 18 : GetImport(), p_nPrefix, rLocalName, xAttrList, xShapes, m_xAttrList );
1516 : }
1517 366 : else if( XML_TEXT_FRAME_PLUGIN == nFrameType )
1518 : {
1519 0 : bool bMedia = false;
1520 :
1521 : // check, if we have a media object
1522 0 : for( sal_Int16 n = 0, nAttrCount = ( xAttrList.is() ? xAttrList->getLength() : 0 ); n < nAttrCount; ++n )
1523 : {
1524 0 : OUString aLocalName;
1525 0 : sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( xAttrList->getNameByIndex( n ), &aLocalName );
1526 :
1527 0 : if( nPrefix == XML_NAMESPACE_DRAW && IsXMLToken( aLocalName, XML_MIME_TYPE ) )
1528 : {
1529 0 : if( xAttrList->getValueByIndex( n ) == "application/vnd.sun.star.media" )
1530 0 : bMedia = true;
1531 :
1532 : // leave this loop
1533 0 : n = nAttrCount - 1;
1534 : }
1535 0 : }
1536 :
1537 0 : if( bMedia )
1538 : {
1539 0 : Reference < XShapes > xShapes;
1540 0 : pContext = GetImport().GetShapeImport()->CreateFrameChildContext(
1541 0 : GetImport(), p_nPrefix, rLocalName, xAttrList, xShapes, m_xAttrList );
1542 : }
1543 : }
1544 366 : else if( XML_TEXT_FRAME_OBJECT == nFrameType ||
1545 : XML_TEXT_FRAME_OBJECT_OLE == nFrameType )
1546 : {
1547 15 : m_bSupportsReplacement = true;
1548 : }
1549 351 : else if(XML_TEXT_FRAME_GRAPHIC == nFrameType)
1550 : {
1551 194 : setSupportsMultipleContents(IsXMLToken(rLocalName, XML_IMAGE));
1552 : }
1553 :
1554 375 : if( !pContext )
1555 : {
1556 :
1557 366 : pContext = new XMLTextFrameContext_Impl( GetImport(), p_nPrefix,
1558 : rLocalName, xAttrList,
1559 : m_eDefaultAnchorType,
1560 : nFrameType,
1561 366 : m_xAttrList );
1562 : }
1563 :
1564 375 : m_xImplContext = pContext;
1565 :
1566 375 : if(getSupportsMultipleContents() && XML_TEXT_FRAME_GRAPHIC == nFrameType)
1567 : {
1568 194 : addContent(*m_xImplContext);
1569 : }
1570 : }
1571 : }
1572 : }
1573 31 : else if(getSupportsMultipleContents() && XML_NAMESPACE_DRAW == p_nPrefix && IsXMLToken(rLocalName, XML_IMAGE))
1574 : {
1575 : // read another image
1576 : pContext = new XMLTextFrameContext_Impl(
1577 3 : GetImport(), p_nPrefix, rLocalName, xAttrList,
1578 3 : m_eDefaultAnchorType, XML_TEXT_FRAME_GRAPHIC, m_xAttrList);
1579 :
1580 3 : m_xImplContext = pContext;
1581 3 : addContent(*m_xImplContext);
1582 : }
1583 38 : else if( m_bSupportsReplacement && !m_xReplImplContext &&
1584 38 : XML_NAMESPACE_DRAW == p_nPrefix &&
1585 10 : IsXMLToken( rLocalName, XML_IMAGE ) )
1586 : {
1587 : // read replacement image
1588 10 : Reference < XPropertySet > xPropSet;
1589 10 : if( CreateIfNotThere( xPropSet ) )
1590 : {
1591 10 : pContext = new XMLReplacementImageContext( GetImport(),
1592 10 : p_nPrefix, rLocalName, xAttrList, xPropSet );
1593 10 : m_xReplImplContext = pContext;
1594 10 : }
1595 : }
1596 18 : else if( m_xImplContext->ISA( XMLTextFrameContext_Impl ) )
1597 : {
1598 : // the child is a writer frame
1599 18 : if( XML_NAMESPACE_SVG == p_nPrefix )
1600 : {
1601 : // Implement Title/Description Elements UI (#i73249#)
1602 17 : const bool bOld = SvXMLImport::OOo_2x >= GetImport().getGeneratorVersion();
1603 17 : if ( bOld )
1604 : {
1605 0 : if ( IsXMLToken( rLocalName, XML_DESC ) )
1606 : {
1607 0 : pContext = new XMLTextFrameTitleOrDescContext_Impl( GetImport(),
1608 : p_nPrefix,
1609 : rLocalName,
1610 0 : m_sTitle );
1611 : }
1612 : }
1613 : else
1614 : {
1615 17 : if( IsXMLToken( rLocalName, XML_TITLE ) )
1616 : {
1617 6 : pContext = new XMLTextFrameTitleOrDescContext_Impl( GetImport(),
1618 : p_nPrefix,
1619 : rLocalName,
1620 6 : m_sTitle );
1621 : }
1622 11 : else if ( IsXMLToken( rLocalName, XML_DESC ) )
1623 : {
1624 11 : pContext = new XMLTextFrameTitleOrDescContext_Impl( GetImport(),
1625 : p_nPrefix,
1626 : rLocalName,
1627 11 : m_sDesc );
1628 : }
1629 : }
1630 : }
1631 1 : else if( XML_NAMESPACE_DRAW == p_nPrefix )
1632 : {
1633 1 : Reference < XPropertySet > xPropSet;
1634 1 : if( IsXMLToken( rLocalName, XML_CONTOUR_POLYGON ) )
1635 : {
1636 0 : if( CreateIfNotThere( xPropSet ) )
1637 0 : pContext = new XMLTextFrameContourContext_Impl( GetImport(), p_nPrefix, rLocalName,
1638 0 : xAttrList, xPropSet, false );
1639 : }
1640 1 : else if( IsXMLToken( rLocalName, XML_CONTOUR_PATH ) )
1641 : {
1642 0 : if( CreateIfNotThere( xPropSet ) )
1643 0 : pContext = new XMLTextFrameContourContext_Impl( GetImport(), p_nPrefix, rLocalName,
1644 0 : xAttrList, xPropSet, true );
1645 : }
1646 1 : else if( IsXMLToken( rLocalName, XML_IMAGE_MAP ) )
1647 : {
1648 1 : if( CreateIfNotThere( xPropSet ) )
1649 1 : pContext = new XMLImageMapContext( GetImport(), p_nPrefix, rLocalName, xPropSet );
1650 1 : }
1651 : }
1652 0 : else if( (XML_NAMESPACE_OFFICE == p_nPrefix) && IsXMLToken( rLocalName, XML_EVENT_LISTENERS ) )
1653 : {
1654 : // do we still have the frame object?
1655 0 : Reference < XPropertySet > xPropSet;
1656 0 : if( CreateIfNotThere( xPropSet ) )
1657 : {
1658 : // is it an event supplier?
1659 0 : Reference<XEventsSupplier> xEventsSupplier(xPropSet, UNO_QUERY);
1660 0 : if (xEventsSupplier.is())
1661 : {
1662 : // OK, we have the events, so create the context
1663 0 : pContext = new XMLEventsImportContext(GetImport(), p_nPrefix,
1664 0 : rLocalName, xEventsSupplier);
1665 0 : }
1666 0 : }
1667 : }
1668 : }
1669 0 : else if( p_nPrefix == XML_NAMESPACE_SVG && // #i68101#
1670 0 : (IsXMLToken( rLocalName, XML_TITLE ) || IsXMLToken( rLocalName, XML_DESC ) ) )
1671 : {
1672 0 : pContext = m_xImplContext->CreateChildContext( p_nPrefix, rLocalName, xAttrList );
1673 : }
1674 : else
1675 : {
1676 : // the child is a drawing shape
1677 : pContext = XMLShapeImportHelper::CreateFrameChildContext(
1678 0 : &m_xImplContext, p_nPrefix, rLocalName, xAttrList );
1679 : }
1680 :
1681 406 : if( !pContext )
1682 0 : pContext = new SvXMLImportContext( GetImport(), p_nPrefix, rLocalName );
1683 :
1684 406 : return pContext;
1685 : }
1686 :
1687 2 : void XMLTextFrameContext::SetHyperlink( const OUString& rHRef,
1688 : const OUString& rName,
1689 : const OUString& rTargetFrameName,
1690 : bool bMap )
1691 : {
1692 : OSL_ENSURE( !m_pHyperlink, "recursive SetHyperlink call" );
1693 2 : delete m_pHyperlink;
1694 : m_pHyperlink = new XMLTextFrameContextHyperlink_Impl(
1695 2 : rHRef, rName, rTargetFrameName, bMap );
1696 2 : }
1697 :
1698 286 : TextContentAnchorType XMLTextFrameContext::GetAnchorType() const
1699 : {
1700 286 : SvXMLImportContext *pContext = &m_xImplContext;
1701 286 : XMLTextFrameContext_Impl *pImpl = PTR_CAST( XMLTextFrameContext_Impl, pContext );
1702 286 : if( pImpl )
1703 12 : return pImpl->GetAnchorType();
1704 : else
1705 274 : return m_eDefaultAnchorType;
1706 : }
1707 :
1708 12 : Reference < XTextContent > XMLTextFrameContext::GetTextContent() const
1709 : {
1710 12 : Reference < XTextContent > xTxtCntnt;
1711 12 : SvXMLImportContext *pContext = &m_xImplContext;
1712 12 : XMLTextFrameContext_Impl *pImpl = PTR_CAST( XMLTextFrameContext_Impl, pContext );
1713 12 : if( pImpl )
1714 12 : xTxtCntnt.set( pImpl->GetPropSet(), UNO_QUERY );
1715 :
1716 12 : return xTxtCntnt;
1717 : }
1718 :
1719 0 : Reference < XShape > XMLTextFrameContext::GetShape() const
1720 : {
1721 0 : Reference < XShape > xShape;
1722 0 : SvXMLImportContext* pContext = &m_xImplContext;
1723 0 : SvXMLShapeContext* pImpl = PTR_CAST( SvXMLShapeContext, pContext );
1724 0 : if ( pImpl )
1725 : {
1726 0 : xShape = pImpl->getShape();
1727 : }
1728 :
1729 0 : return xShape;
1730 : }
1731 :
1732 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|