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