LCOV - code coverage report
Current view: top level - libreoffice/xmloff/source/text - XMLTextFrameContext.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 297 722 41.1 %
Date: 2012-12-27 Functions: 23 67 34.3 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10