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