LCOV - code coverage report
Current view: top level - xmloff/source/text - txtparai.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 476 828 57.5 %
Date: 2014-11-03 Functions: 56 175 32.0 %
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 <xmloff/unointerfacetouniqueidentifiermapper.hxx>
      21             : #include <rtl/ustring.hxx>
      22             : #include <rtl/ustrbuf.hxx>
      23             : #include <boost/ptr_container/ptr_vector.hpp>
      24             : 
      25             : #include <com/sun/star/text/XTextFrame.hpp>
      26             : #include <com/sun/star/text/XTextCursor.hpp>
      27             : #include <com/sun/star/beans/XPropertySet.hpp>
      28             : #include <com/sun/star/beans/XPropertySetInfo.hpp>
      29             : #include <com/sun/star/text/ControlCharacter.hpp>
      30             : #include <com/sun/star/container/XIndexReplace.hpp>
      31             : #include <com/sun/star/drawing/XShapes.hpp>
      32             : #include <com/sun/star/container/XEnumerationAccess.hpp>
      33             : #include <com/sun/star/rdf/XMetadatable.hpp>
      34             : 
      35             : #include <sax/tools/converter.hxx>
      36             : 
      37             : #include <xmloff/xmlictxt.hxx>
      38             : #include <xmloff/xmlimp.hxx>
      39             : #include <xmloff/xmltoken.hxx>
      40             : #include <xmloff/nmspmap.hxx>
      41             : #include <xmloff/xmlnmspe.hxx>
      42             : #include <xmloff/txtimp.hxx>
      43             : #include "txtparai.hxx"
      44             : #include "txtfldi.hxx"
      45             : #include "XMLFootnoteImportContext.hxx"
      46             : #include "XMLTextMarkImportContext.hxx"
      47             : #include "XMLTextFrameContext.hxx"
      48             : #include <xmloff/XMLCharContext.hxx>
      49             : #include "XMLTextFrameHyperlinkContext.hxx"
      50             : #include <xmloff/XMLEventsImportContext.hxx>
      51             : #include "XMLChangeImportContext.hxx"
      52             : #include "txtlists.hxx"
      53             : 
      54             : #include <txtparaimphint.hxx>
      55       16400 : class XMLHints_Impl : public boost::ptr_vector<XMLHint_Impl> {};
      56             : 
      57             : using namespace ::com::sun::star;
      58             : using namespace ::com::sun::star::uno;
      59             : using namespace ::com::sun::star::text;
      60             : using namespace ::com::sun::star::drawing;
      61             : using namespace ::com::sun::star::beans;
      62             : using namespace ::xmloff::token;
      63             : using ::com::sun::star::container::XEnumerationAccess;
      64             : using ::com::sun::star::container::XEnumeration;
      65             : 
      66           0 : TYPEINIT1( XMLCharContext, SvXMLImportContext );
      67             : 
      68        4010 : XMLCharContext::XMLCharContext(
      69             :         SvXMLImport& rImport,
      70             :         sal_uInt16 nPrfx,
      71             :         const OUString& rLName,
      72             :         const Reference< xml::sax::XAttributeList > & xAttrList,
      73             :         sal_Unicode c,
      74             :         bool bCount ) :
      75             :     SvXMLImportContext( rImport, nPrfx, rLName )
      76             :     ,m_nControl(0)
      77             :     ,m_nCount(1)
      78        4010 :     ,m_c(c)
      79             : {
      80        4010 :     if( bCount )
      81             :     {
      82        1514 :         const SvXMLNamespaceMap& rMap = GetImport().GetNamespaceMap();
      83        1514 :         sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
      84        1704 :         for( sal_Int16 i=0; i < nAttrCount; i++ )
      85             :         {
      86         190 :             const OUString& rAttrName = xAttrList->getNameByIndex( i );
      87             : 
      88         380 :             OUString aLocalName;
      89         190 :             sal_uInt16 nPrefix =rMap.GetKeyByAttrName( rAttrName,&aLocalName );
      90         380 :             if( XML_NAMESPACE_TEXT == nPrefix &&
      91         190 :                 IsXMLToken( aLocalName, XML_C ) )
      92             :             {
      93         190 :                 sal_Int32 nTmp = xAttrList->getValueByIndex(i).toInt32();
      94         190 :                 if( nTmp > 0L )
      95             :                 {
      96         190 :                     if( nTmp > USHRT_MAX )
      97           0 :                         m_nCount = USHRT_MAX;
      98             :                     else
      99         190 :                         m_nCount = (sal_uInt16)nTmp;
     100             :                 }
     101             :             }
     102         190 :         }
     103             :     }
     104        4010 : }
     105             : 
     106          48 : XMLCharContext::XMLCharContext(
     107             :         SvXMLImport& rImp,
     108             :         sal_uInt16 nPrfx,
     109             :         const OUString& rLName,
     110             :         const Reference< xml::sax::XAttributeList > &,
     111             :         sal_Int16 nControl ) :
     112             :     SvXMLImportContext( rImp, nPrfx, rLName )
     113             :     ,m_nControl(nControl)
     114             :     ,m_nCount(0)
     115          48 :     ,m_c(0)
     116             : {
     117          48 : }
     118             : 
     119        8116 : XMLCharContext::~XMLCharContext()
     120             : {
     121        8116 : }
     122        4058 : void XMLCharContext::EndElement()
     123             : {
     124        4058 :     if ( !m_nCount )
     125          48 :         InsertControlCharacter( m_nControl );
     126             :     else
     127             :     {
     128        4010 :         if( 1U == m_nCount )
     129             :         {
     130        3820 :             OUString sBuff( &m_c, 1 );
     131        3820 :             InsertString(sBuff);
     132             :         }
     133             :         else
     134             :         {
     135         190 :             OUStringBuffer sBuff( m_nCount );
     136        1326 :             while( m_nCount-- )
     137         946 :                 sBuff.append( &m_c, 1 );
     138             : 
     139         190 :             InsertString(sBuff.makeStringAndClear() );
     140             :         }
     141             :     }
     142        4058 : }
     143          48 : void XMLCharContext::InsertControlCharacter(sal_Int16   _nControl)
     144             : {
     145          48 :     GetImport().GetTextImport()->InsertControlCharacter( _nControl );
     146          48 : }
     147        4010 : void XMLCharContext::InsertString(const OUString& _sString)
     148             : {
     149        4010 :     GetImport().GetTextImport()->InsertString( _sString );
     150        4010 : }
     151             : 
     152             : /** import start of reference (<text:reference-start>) */
     153           0 : class XMLStartReferenceContext_Impl : public SvXMLImportContext
     154             : {
     155             : public:
     156             :     TYPEINFO_OVERRIDE();
     157             : 
     158             :     // Do everything in constructor. Well ...
     159             :     XMLStartReferenceContext_Impl (
     160             :         SvXMLImport& rImport,
     161             :         sal_uInt16 nPrefix,
     162             :         const OUString& rLocalName,
     163             :         XMLHints_Impl& rHnts,
     164             :         const Reference<xml::sax::XAttributeList> & xAttrList);
     165             : 
     166             :     static bool FindName(
     167             :         SvXMLImport& rImport,
     168             :         const Reference<xml::sax::XAttributeList> & xAttrList,
     169             :         OUString& rName);
     170             : };
     171             : 
     172           0 : TYPEINIT1( XMLStartReferenceContext_Impl, SvXMLImportContext );
     173             : 
     174           0 : XMLStartReferenceContext_Impl::XMLStartReferenceContext_Impl(
     175             :     SvXMLImport& rImport,
     176             :     sal_uInt16 nPrefix,
     177             :     const OUString& rLocalName,
     178             :     XMLHints_Impl& rHints,
     179             :     const Reference<xml::sax::XAttributeList> & xAttrList) :
     180           0 :         SvXMLImportContext(rImport, nPrefix, rLocalName)
     181             : {
     182           0 :     OUString sName;
     183             : 
     184           0 :     if (FindName(GetImport(), xAttrList, sName))
     185             :     {
     186             :         XMLHint_Impl* pHint = new XMLReferenceHint_Impl(
     187           0 :             sName, rImport.GetTextImport()->GetCursor()->getStart() );
     188             : 
     189             :         // degenerates to point reference, if no end is found!
     190           0 :         pHint->SetEnd(rImport.GetTextImport()->GetCursor()->getStart() );
     191             : 
     192           0 :         rHints.push_back(pHint);
     193           0 :     }
     194           0 : }
     195             : 
     196           0 : bool XMLStartReferenceContext_Impl::FindName(
     197             :     SvXMLImport& rImport,
     198             :     const Reference<xml::sax::XAttributeList> & xAttrList,
     199             :     OUString& rName)
     200             : {
     201           0 :     bool bNameOK( false );
     202             : 
     203             :     // find name attribute first
     204           0 :     const sal_Int16 nLength( xAttrList->getLength() );
     205           0 :     for (sal_Int16 nAttr = 0; nAttr < nLength; nAttr++)
     206             :     {
     207           0 :         OUString sLocalName;
     208           0 :         const sal_uInt16 nPrefix = rImport.GetNamespaceMap().
     209           0 :             GetKeyByAttrName( xAttrList->getNameByIndex(nAttr),
     210           0 :                               &sLocalName );
     211             : 
     212           0 :         if ( (XML_NAMESPACE_TEXT == nPrefix) &&
     213           0 :              IsXMLToken(sLocalName, XML_NAME)   )
     214             :         {
     215           0 :             rName = xAttrList->getValueByIndex(nAttr);
     216           0 :             bNameOK = true;
     217             :         }
     218           0 :     }
     219             : 
     220           0 :     return bNameOK;
     221             : }
     222             : 
     223             : /** import end of reference (<text:reference-end>) */
     224           0 : class XMLEndReferenceContext_Impl : public SvXMLImportContext
     225             : {
     226             : public:
     227             :     TYPEINFO_OVERRIDE();
     228             : 
     229             :     // Do everything in constructor. Well ...
     230             :     XMLEndReferenceContext_Impl(
     231             :         SvXMLImport& rImport,
     232             :         sal_uInt16 nPrefix,
     233             :         const OUString& rLocalName,
     234             :         XMLHints_Impl& rHnts,
     235             :         const Reference<xml::sax::XAttributeList> & xAttrList);
     236             : };
     237             : 
     238           0 : TYPEINIT1( XMLEndReferenceContext_Impl, SvXMLImportContext );
     239             : 
     240           0 : XMLEndReferenceContext_Impl::XMLEndReferenceContext_Impl(
     241             :     SvXMLImport& rImport,
     242             :     sal_uInt16 nPrefix,
     243             :     const OUString& rLocalName,
     244             :     XMLHints_Impl& rHints,
     245             :     const Reference<xml::sax::XAttributeList> & xAttrList) :
     246           0 :         SvXMLImportContext(rImport, nPrefix, rLocalName)
     247             : {
     248           0 :     OUString sName;
     249             : 
     250             :     // borrow from XMLStartReferenceContext_Impl
     251           0 :     if (XMLStartReferenceContext_Impl::FindName(GetImport(), xAttrList, sName))
     252             :     {
     253             :         // search for reference start
     254           0 :         sal_uInt16 nCount = rHints.size();
     255           0 :         for(sal_uInt16 nPos = 0; nPos < nCount; nPos++)
     256             :         {
     257           0 :             XMLHint_Impl *pHint = &rHints[nPos];
     258           0 :             if ( pHint->IsReference() &&
     259           0 :                  sName.equals( static_cast<XMLReferenceHint_Impl *>(pHint)->GetRefName()) )
     260             :             {
     261             :                 // set end and stop searching
     262           0 :                 pHint->SetEnd(GetImport().GetTextImport()->
     263           0 :                                      GetCursor()->getStart() );
     264           0 :                 break;
     265             :             }
     266             :         }
     267             :         // else: no start (in this paragraph) -> ignore
     268           0 :     }
     269           0 : }
     270             : 
     271             : class XMLImpSpanContext_Impl : public SvXMLImportContext
     272             : {
     273             :     XMLHints_Impl&      rHints;
     274             :     XMLStyleHint_Impl   *pHint;
     275             : 
     276             :     bool&                rIgnoreLeadingSpace;
     277             : 
     278             :     sal_uInt8            nStarFontsConvFlags;
     279             : 
     280             : public:
     281             : 
     282             :     TYPEINFO_OVERRIDE();
     283             : 
     284             :     XMLImpSpanContext_Impl(
     285             :             SvXMLImport& rImport,
     286             :             sal_uInt16 nPrfx,
     287             :             const OUString& rLName,
     288             :             const Reference< xml::sax::XAttributeList > & xAttrList,
     289             :             XMLHints_Impl& rHnts,
     290             :             bool& rIgnLeadSpace,
     291             :             sal_uInt8 nSFConvFlags
     292             :                           );
     293             : 
     294             :     virtual ~XMLImpSpanContext_Impl();
     295             : 
     296             :     static SvXMLImportContext *CreateChildContext(
     297             :             SvXMLImport& rImport,
     298             :             sal_uInt16 nPrefix, const OUString& rLocalName,
     299             :             const Reference< xml::sax::XAttributeList > & xAttrList,
     300             :             sal_uInt16 nToken, XMLHints_Impl& rHnts,
     301             :             bool& rIgnLeadSpace,
     302             :             sal_uInt8 nStarFontsConvFlags = 0
     303             :              );
     304             :     virtual SvXMLImportContext *CreateChildContext(
     305             :             sal_uInt16 nPrefix, const OUString& rLocalName,
     306             :             const Reference< xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
     307             : 
     308             :     virtual void Characters( const OUString& rChars ) SAL_OVERRIDE;
     309             : };
     310             : 
     311             : class XMLImpHyperlinkContext_Impl : public SvXMLImportContext
     312             : {
     313             :     XMLHints_Impl&  mrHints;
     314             :     XMLHyperlinkHint_Impl   *mpHint;
     315             : 
     316             :     bool&       mrbIgnoreLeadingSpace;
     317             : 
     318             : public:
     319             : 
     320             :     TYPEINFO_OVERRIDE();
     321             : 
     322             :     XMLImpHyperlinkContext_Impl(
     323             :             SvXMLImport& rImport,
     324             :             sal_uInt16 nPrfx,
     325             :             const OUString& rLName,
     326             :             const Reference< xml::sax::XAttributeList > & xAttrList,
     327             :             XMLHints_Impl& rHnts,
     328             :             bool& rIgnLeadSpace );
     329             : 
     330             :     virtual ~XMLImpHyperlinkContext_Impl();
     331             : 
     332             :     virtual SvXMLImportContext *CreateChildContext(
     333             :             sal_uInt16 nPrefix, const OUString& rLocalName,
     334             :             const Reference< xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
     335             : 
     336             :     virtual void Characters( const OUString& rChars ) SAL_OVERRIDE;
     337             : };
     338             : 
     339           0 : TYPEINIT1( XMLImpHyperlinkContext_Impl, SvXMLImportContext );
     340             : 
     341           8 : XMLImpHyperlinkContext_Impl::XMLImpHyperlinkContext_Impl(
     342             :     SvXMLImport& rImport,
     343             :     sal_uInt16 nPrfx,
     344             :     const OUString& rLName,
     345             :     const Reference< xml::sax::XAttributeList > & xAttrList,
     346             :     XMLHints_Impl& rHnts,
     347             :     bool& rIgnLeadSpace )
     348             :     : SvXMLImportContext( rImport, nPrfx, rLName )
     349             :     , mrHints( rHnts )
     350          24 :     , mpHint( new XMLHyperlinkHint_Impl( GetImport().GetTextImport()->GetCursorAsRange()->getStart() ) )
     351          32 :     , mrbIgnoreLeadingSpace( rIgnLeadSpace )
     352             : {
     353           8 :     OUString sShow;
     354           8 :     const SvXMLTokenMap& rTokenMap = GetImport().GetTextImport()->GetTextHyperlinkAttrTokenMap();
     355             : 
     356           8 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     357          32 :     for ( sal_Int16 i = 0; i < nAttrCount; i++ )
     358             :     {
     359          24 :         const OUString& rAttrName = xAttrList->getNameByIndex( i );
     360          48 :         const OUString& rValue = xAttrList->getValueByIndex( i );
     361             : 
     362          48 :         OUString aLocalName;
     363          24 :         const sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName, &aLocalName );
     364          24 :         switch (rTokenMap.Get( nPrefix, aLocalName ))
     365             :         {
     366             :         case XML_TOK_TEXT_HYPERLINK_HREF:
     367           8 :             mpHint->SetHRef( GetImport().GetAbsoluteReference( rValue ) );
     368           8 :             break;
     369             :         case XML_TOK_TEXT_HYPERLINK_NAME:
     370           0 :             mpHint->SetName( rValue );
     371           0 :             break;
     372             :         case XML_TOK_TEXT_HYPERLINK_TARGET_FRAME:
     373           0 :             mpHint->SetTargetFrameName( rValue );
     374           0 :             break;
     375             :         case XML_TOK_TEXT_HYPERLINK_SHOW:
     376           0 :             sShow = rValue;
     377           0 :             break;
     378             :         case XML_TOK_TEXT_HYPERLINK_STYLE_NAME:
     379           4 :             mpHint->SetStyleName( rValue );
     380           4 :             break;
     381             :         case XML_TOK_TEXT_HYPERLINK_VIS_STYLE_NAME:
     382           4 :             mpHint->SetVisitedStyleName( rValue );
     383           4 :             break;
     384             :         }
     385          24 :     }
     386             : 
     387           8 :     if( !sShow.isEmpty() && mpHint->GetTargetFrameName().isEmpty() )
     388             :     {
     389           0 :         if( IsXMLToken( sShow, XML_NEW ) )
     390             :             mpHint->SetTargetFrameName(
     391           0 :                     OUString( "_blank"  ) );
     392           0 :         else if( IsXMLToken( sShow, XML_REPLACE ) )
     393             :             mpHint->SetTargetFrameName(
     394           0 :                     OUString( "_self"  ) );
     395             :     }
     396             : 
     397           8 :     if ( mpHint->GetHRef().isEmpty() )
     398             :     {
     399             :         // hyperlink without an URL is not imported.
     400           0 :         delete mpHint;
     401           0 :         mpHint = NULL;
     402             :     }
     403             :     else
     404             :     {
     405           8 :         mrHints.push_back( mpHint );
     406           8 :     }
     407           8 : }
     408             : 
     409          24 : XMLImpHyperlinkContext_Impl::~XMLImpHyperlinkContext_Impl()
     410             : {
     411           8 :     if( mpHint != NULL )
     412           8 :         mpHint->SetEnd( GetImport().GetTextImport()
     413           8 :                             ->GetCursorAsRange()->getStart() );
     414          16 : }
     415             : 
     416           4 : SvXMLImportContext *XMLImpHyperlinkContext_Impl::CreateChildContext(
     417             :         sal_uInt16 nPrefix, const OUString& rLocalName,
     418             :         const Reference< xml::sax::XAttributeList > & xAttrList )
     419             : {
     420           4 :     if ( (nPrefix == XML_NAMESPACE_OFFICE) &&
     421           0 :          IsXMLToken(rLocalName, XML_EVENT_LISTENERS) )
     422             :     {
     423             :         XMLEventsImportContext* pCtxt = new XMLEventsImportContext(
     424           0 :             GetImport(), nPrefix, rLocalName);
     425           0 :         mpHint->SetEventsContext(pCtxt);
     426           0 :         return pCtxt;
     427             :     }
     428             :     else
     429             :     {
     430             :         const SvXMLTokenMap& rTokenMap =
     431           4 :             GetImport().GetTextImport()->GetTextPElemTokenMap();
     432           4 :         sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName );
     433             : 
     434             :         return XMLImpSpanContext_Impl::CreateChildContext(
     435           4 :             GetImport(), nPrefix, rLocalName, xAttrList,
     436           8 :             nToken, mrHints, mrbIgnoreLeadingSpace );
     437             :     }
     438             : }
     439             : 
     440          12 : void XMLImpHyperlinkContext_Impl::Characters( const OUString& rChars )
     441             : {
     442          12 :     GetImport().GetTextImport()->InsertString( rChars, mrbIgnoreLeadingSpace );
     443          12 : }
     444             : 
     445             : class XMLImpRubyBaseContext_Impl : public SvXMLImportContext
     446             : {
     447             :     XMLHints_Impl&  rHints;
     448             : 
     449             :     bool&       rIgnoreLeadingSpace;
     450             : 
     451             : public:
     452             : 
     453             :     TYPEINFO_OVERRIDE();
     454             : 
     455             :     XMLImpRubyBaseContext_Impl(
     456             :             SvXMLImport& rImport,
     457             :             sal_uInt16 nPrfx,
     458             :             const OUString& rLName,
     459             :             const Reference< xml::sax::XAttributeList > & xAttrList,
     460             :             XMLHints_Impl& rHnts,
     461             :             bool& rIgnLeadSpace );
     462             : 
     463             :     virtual ~XMLImpRubyBaseContext_Impl();
     464             : 
     465             :     virtual SvXMLImportContext *CreateChildContext(
     466             :             sal_uInt16 nPrefix, const OUString& rLocalName,
     467             :             const Reference< xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
     468             : 
     469             :     virtual void Characters( const OUString& rChars ) SAL_OVERRIDE;
     470             : };
     471             : 
     472           0 : TYPEINIT1( XMLImpRubyBaseContext_Impl, SvXMLImportContext );
     473             : 
     474          24 : XMLImpRubyBaseContext_Impl::XMLImpRubyBaseContext_Impl(
     475             :         SvXMLImport& rImport,
     476             :         sal_uInt16 nPrfx,
     477             :         const OUString& rLName,
     478             :         const Reference< xml::sax::XAttributeList > &,
     479             :         XMLHints_Impl& rHnts,
     480             :         bool& rIgnLeadSpace ) :
     481             :     SvXMLImportContext( rImport, nPrfx, rLName ),
     482             :     rHints( rHnts ),
     483          24 :     rIgnoreLeadingSpace( rIgnLeadSpace )
     484             : {
     485          24 : }
     486             : 
     487          48 : XMLImpRubyBaseContext_Impl::~XMLImpRubyBaseContext_Impl()
     488             : {
     489          48 : }
     490             : 
     491          12 : SvXMLImportContext *XMLImpRubyBaseContext_Impl::CreateChildContext(
     492             :         sal_uInt16 nPrefix, const OUString& rLocalName,
     493             :         const Reference< xml::sax::XAttributeList > & xAttrList )
     494             : {
     495             :     const SvXMLTokenMap& rTokenMap =
     496          12 :         GetImport().GetTextImport()->GetTextPElemTokenMap();
     497          12 :     sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName );
     498             : 
     499          12 :     return XMLImpSpanContext_Impl::CreateChildContext( GetImport(), nPrefix,
     500             :                                                        rLocalName, xAttrList,
     501          24 :                                nToken, rHints, rIgnoreLeadingSpace );
     502             : }
     503             : 
     504          12 : void XMLImpRubyBaseContext_Impl::Characters( const OUString& rChars )
     505             : {
     506          12 :     GetImport().GetTextImport()->InsertString( rChars, rIgnoreLeadingSpace );
     507          12 : }
     508             : 
     509             : class XMLImpRubyContext_Impl : public SvXMLImportContext
     510             : {
     511             :     XMLHints_Impl&  rHints;
     512             : 
     513             :     bool&       rIgnoreLeadingSpace;
     514             : 
     515             :     Reference < XTextRange > m_xStart;
     516             :     OUString        m_sStyleName;
     517             :     OUString        m_sTextStyleName;
     518             :     OUString        m_sText;
     519             : 
     520             : public:
     521             : 
     522             :     TYPEINFO_OVERRIDE();
     523             : 
     524             :     XMLImpRubyContext_Impl(
     525             :             SvXMLImport& rImport,
     526             :             sal_uInt16 nPrfx,
     527             :             const OUString& rLName,
     528             :             const Reference< xml::sax::XAttributeList > & xAttrList,
     529             :             XMLHints_Impl& rHnts,
     530             :             bool& rIgnLeadSpace );
     531             : 
     532             :     virtual ~XMLImpRubyContext_Impl();
     533             : 
     534             :     virtual SvXMLImportContext *CreateChildContext(
     535             :             sal_uInt16 nPrefix, const OUString& rLocalName,
     536             :             const Reference< xml::sax::XAttributeList > & xAttrList ) SAL_OVERRIDE;
     537             : 
     538           0 :     void SetTextStyleName( const OUString& s ) { m_sTextStyleName = s; }
     539          24 :     void AppendText( const OUString& s ) { m_sText += s; }
     540             : };
     541             : 
     542             : class XMLImpRubyTextContext_Impl : public SvXMLImportContext
     543             : {
     544             :     XMLImpRubyContext_Impl & m_rRubyContext;
     545             : 
     546             : public:
     547             : 
     548             :     TYPEINFO_OVERRIDE();
     549             : 
     550             :     XMLImpRubyTextContext_Impl(
     551             :             SvXMLImport& rImport,
     552             :             sal_uInt16 nPrfx,
     553             :             const OUString& rLName,
     554             :             const Reference< xml::sax::XAttributeList > & xAttrList,
     555             :             XMLImpRubyContext_Impl & rParent );
     556             : 
     557             :     virtual ~XMLImpRubyTextContext_Impl();
     558             : 
     559             :     virtual void Characters( const OUString& rChars ) SAL_OVERRIDE;
     560             : };
     561             : 
     562           0 : TYPEINIT1( XMLImpRubyTextContext_Impl, SvXMLImportContext );
     563             : 
     564          24 : XMLImpRubyTextContext_Impl::XMLImpRubyTextContext_Impl(
     565             :         SvXMLImport& rImport,
     566             :         sal_uInt16 nPrfx,
     567             :         const OUString& rLName,
     568             :         const Reference< xml::sax::XAttributeList > & xAttrList,
     569             :         XMLImpRubyContext_Impl & rParent )
     570             :     : SvXMLImportContext( rImport, nPrfx, rLName )
     571          24 :     , m_rRubyContext( rParent )
     572             : {
     573          24 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     574          24 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
     575             :     {
     576           0 :         const OUString& rAttrName = xAttrList->getNameByIndex( i );
     577           0 :         const OUString& rValue = xAttrList->getValueByIndex( i );
     578             : 
     579           0 :         OUString aLocalName;
     580             :         sal_uInt16 nPrefix =
     581           0 :             GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
     582           0 :                                                             &aLocalName );
     583           0 :         if( XML_NAMESPACE_TEXT == nPrefix &&
     584           0 :             IsXMLToken( aLocalName, XML_STYLE_NAME ) )
     585             :         {
     586           0 :             m_rRubyContext.SetTextStyleName( rValue );
     587           0 :             break;
     588             :         }
     589           0 :     }
     590          24 : }
     591             : 
     592          48 : XMLImpRubyTextContext_Impl::~XMLImpRubyTextContext_Impl()
     593             : {
     594          48 : }
     595             : 
     596          24 : void XMLImpRubyTextContext_Impl::Characters( const OUString& rChars )
     597             : {
     598          24 :     m_rRubyContext.AppendText( rChars );
     599          24 : }
     600             : 
     601           0 : TYPEINIT1( XMLImpRubyContext_Impl, SvXMLImportContext );
     602             : 
     603          24 : XMLImpRubyContext_Impl::XMLImpRubyContext_Impl(
     604             :         SvXMLImport& rImport,
     605             :         sal_uInt16 nPrfx,
     606             :         const OUString& rLName,
     607             :         const Reference< xml::sax::XAttributeList > & xAttrList,
     608             :         XMLHints_Impl& rHnts,
     609             :         bool& rIgnLeadSpace ) :
     610             :     SvXMLImportContext( rImport, nPrfx, rLName ),
     611             :     rHints( rHnts ),
     612             :     rIgnoreLeadingSpace( rIgnLeadSpace )
     613          24 :     , m_xStart( GetImport().GetTextImport()->GetCursorAsRange()->getStart() )
     614             : {
     615          24 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     616          24 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
     617             :     {
     618          24 :         const OUString& rAttrName = xAttrList->getNameByIndex( i );
     619          24 :         const OUString& rValue = xAttrList->getValueByIndex( i );
     620             : 
     621          24 :         OUString aLocalName;
     622             :         sal_uInt16 nPrefix =
     623          24 :             GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
     624          24 :                                                             &aLocalName );
     625          48 :         if( XML_NAMESPACE_TEXT == nPrefix &&
     626          24 :             IsXMLToken( aLocalName, XML_STYLE_NAME ) )
     627             :         {
     628          24 :             m_sStyleName = rValue;
     629          24 :             break;
     630             :         }
     631           0 :     }
     632          24 : }
     633             : 
     634          72 : XMLImpRubyContext_Impl::~XMLImpRubyContext_Impl()
     635             : {
     636             :     const rtl::Reference < XMLTextImportHelper > xTextImport(
     637          24 :         GetImport().GetTextImport());
     638             :     const Reference < XTextCursor > xAttrCursor(
     639          48 :         xTextImport->GetText()->createTextCursorByRange( m_xStart ));
     640          48 :     xAttrCursor->gotoRange(xTextImport->GetCursorAsRange()->getStart(),
     641          48 :             sal_True);
     642          24 :     xTextImport->SetRuby( GetImport(), xAttrCursor,
     643          72 :          m_sStyleName, m_sTextStyleName, m_sText );
     644          48 : }
     645             : 
     646          48 : SvXMLImportContext *XMLImpRubyContext_Impl::CreateChildContext(
     647             :         sal_uInt16 nPrefix, const OUString& rLocalName,
     648             :         const Reference< xml::sax::XAttributeList > & xAttrList )
     649             : {
     650             :     SvXMLImportContext *pContext;
     651          48 :     if( XML_NAMESPACE_TEXT == nPrefix )
     652             :     {
     653          48 :         if( IsXMLToken( rLocalName, XML_RUBY_BASE ) )
     654          24 :             pContext = new XMLImpRubyBaseContext_Impl( GetImport(), nPrefix,
     655             :                                                        rLocalName,
     656             :                                                        xAttrList,
     657             :                                                        rHints,
     658          24 :                                                        rIgnoreLeadingSpace );
     659          24 :         else if( IsXMLToken( rLocalName, XML_RUBY_TEXT ) )
     660          24 :             pContext = new XMLImpRubyTextContext_Impl( GetImport(), nPrefix,
     661             :                                                        rLocalName,
     662             :                                                        xAttrList,
     663          24 :                                                        *this );
     664             :         else
     665             :             pContext = new SvXMLImportContext(
     666           0 :                 GetImport(), nPrefix, rLocalName );
     667             :     }
     668             :     else
     669             :         pContext = SvXMLImportContext::CreateChildContext( nPrefix, rLocalName,
     670           0 :                                                             xAttrList );
     671             : 
     672          48 :     return pContext;
     673             : }
     674             : 
     675             : /** for text:meta and text:meta-field
     676             :  */
     677             : class XMLMetaImportContextBase : public SvXMLImportContext
     678             : {
     679             :     XMLHints_Impl&    m_rHints;
     680             : 
     681             :     bool& m_rIgnoreLeadingSpace;
     682             : 
     683             :     /// start position
     684             :     Reference<XTextRange> m_xStart;
     685             : 
     686             : protected:
     687             :     OUString m_XmlId;
     688             : 
     689             : public:
     690             :     TYPEINFO_OVERRIDE();
     691             : 
     692             :     XMLMetaImportContextBase(
     693             :         SvXMLImport& i_rImport,
     694             :         const sal_uInt16 i_nPrefix,
     695             :         const OUString& i_rLocalName,
     696             :         XMLHints_Impl& i_rHints,
     697             :         bool & i_rIgnoreLeadingSpace );
     698             : 
     699             :     virtual ~XMLMetaImportContextBase();
     700             : 
     701             :     virtual void StartElement(
     702             :             const Reference<xml::sax::XAttributeList> & i_xAttrList) SAL_OVERRIDE;
     703             : 
     704             :     virtual void EndElement() SAL_OVERRIDE;
     705             : 
     706             :     virtual SvXMLImportContext *CreateChildContext(
     707             :             sal_uInt16 i_nPrefix, const OUString& i_rLocalName,
     708             :             const Reference< xml::sax::XAttributeList > & i_xAttrList) SAL_OVERRIDE;
     709             : 
     710             :     virtual void Characters( const OUString& i_rChars ) SAL_OVERRIDE;
     711             : 
     712             :     virtual void ProcessAttribute(sal_uInt16 const i_nPrefix,
     713             :         OUString const & i_rLocalName, OUString const & i_rValue);
     714             : 
     715             :     virtual void InsertMeta(const Reference<XTextRange> & i_xInsertionRange)
     716             :         = 0;
     717             : };
     718             : 
     719           0 : TYPEINIT1( XMLMetaImportContextBase, SvXMLImportContext );
     720             : 
     721          80 : XMLMetaImportContextBase::XMLMetaImportContextBase(
     722             :         SvXMLImport& i_rImport,
     723             :         const sal_uInt16 i_nPrefix,
     724             :         const OUString& i_rLocalName,
     725             :         XMLHints_Impl& i_rHints,
     726             :         bool & i_rIgnoreLeadingSpace )
     727             :     : SvXMLImportContext( i_rImport, i_nPrefix, i_rLocalName )
     728             :     , m_rHints( i_rHints )
     729             :     , m_rIgnoreLeadingSpace( i_rIgnoreLeadingSpace )
     730          80 :     , m_xStart( GetImport().GetTextImport()->GetCursorAsRange()->getStart() )
     731             : {
     732          80 : }
     733             : 
     734          80 : XMLMetaImportContextBase::~XMLMetaImportContextBase()
     735             : {
     736          80 : }
     737             : 
     738          80 : void XMLMetaImportContextBase::StartElement(
     739             :         const Reference<xml::sax::XAttributeList> & i_xAttrList)
     740             : {
     741          80 :     const sal_Int16 nAttrCount(i_xAttrList.is() ? i_xAttrList->getLength() : 0);
     742         182 :     for ( sal_Int16 i = 0; i < nAttrCount; ++i )
     743             :     {
     744         102 :         const OUString& rAttrName( i_xAttrList->getNameByIndex( i ) );
     745         204 :         const OUString& rValue( i_xAttrList->getValueByIndex( i ) );
     746             : 
     747         204 :         OUString sLocalName;
     748             :         const sal_uInt16 nPrefix(
     749         102 :             GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
     750         102 :                                                             &sLocalName ));
     751         102 :         ProcessAttribute(nPrefix, sLocalName, rValue);
     752         102 :     }
     753          80 : }
     754             : 
     755          80 : void XMLMetaImportContextBase::EndElement()
     756             : {
     757             :     SAL_WARN_IF(!m_xStart.is(), "xmloff.text", "no mxStart?");
     758         160 :     if (!m_xStart.is()) return;
     759             : 
     760             :     const Reference<XTextRange> xEndRange(
     761          80 :         GetImport().GetTextImport()->GetCursorAsRange()->getStart() );
     762             : 
     763             :     // create range for insertion
     764             :     const Reference<XTextCursor> xInsertionCursor(
     765         160 :         GetImport().GetTextImport()->GetText()->createTextCursorByRange(
     766         160 :             xEndRange) );
     767          80 :     xInsertionCursor->gotoRange(m_xStart, sal_True);
     768             : 
     769         160 :     InsertMeta(xInsertionCursor);
     770             : }
     771             : 
     772          28 : SvXMLImportContext * XMLMetaImportContextBase::CreateChildContext(
     773             :             sal_uInt16 i_nPrefix, const OUString& i_rLocalName,
     774             :             const Reference< xml::sax::XAttributeList > & i_xAttrList )
     775             : {
     776             :     const SvXMLTokenMap& rTokenMap(
     777          28 :         GetImport().GetTextImport()->GetTextPElemTokenMap() );
     778          28 :     const sal_uInt16 nToken( rTokenMap.Get( i_nPrefix, i_rLocalName ) );
     779             : 
     780          28 :     return XMLImpSpanContext_Impl::CreateChildContext( GetImport(), i_nPrefix,
     781          56 :         i_rLocalName, i_xAttrList, nToken, m_rHints, m_rIgnoreLeadingSpace );
     782             : }
     783             : 
     784          52 : void XMLMetaImportContextBase::Characters( const OUString& i_rChars )
     785             : {
     786          52 :     GetImport().GetTextImport()->InsertString(i_rChars, m_rIgnoreLeadingSpace);
     787          52 : }
     788             : 
     789          78 : void XMLMetaImportContextBase::ProcessAttribute(sal_uInt16 const i_nPrefix,
     790             :     OUString const & i_rLocalName, OUString const & i_rValue)
     791             : {
     792          78 :     if ( (XML_NAMESPACE_XML == i_nPrefix) && IsXMLToken(i_rLocalName, XML_ID) )
     793             :     {
     794          74 :         m_XmlId = i_rValue;
     795             :     }
     796          78 : }
     797             : 
     798             : /** text:meta */
     799          76 : class XMLMetaImportContext : public XMLMetaImportContextBase
     800             : {
     801             :     // RDFa
     802             :     bool m_bHaveAbout;
     803             :     OUString m_sAbout;
     804             :     OUString m_sProperty;
     805             :     OUString m_sContent;
     806             :     OUString m_sDatatype;
     807             : 
     808             : public:
     809             :     TYPEINFO_OVERRIDE();
     810             : 
     811             :     XMLMetaImportContext(
     812             :         SvXMLImport& i_rImport,
     813             :         const sal_uInt16 i_nPrefix,
     814             :         const OUString& i_rLocalName,
     815             :         XMLHints_Impl& i_rHints,
     816             :         bool & i_rIgnoreLeadingSpace );
     817             : 
     818             :     virtual void ProcessAttribute(sal_uInt16 const i_nPrefix,
     819             :         OUString const & i_rLocalName, OUString const & i_rValue) SAL_OVERRIDE;
     820             : 
     821             :     virtual void InsertMeta(const Reference<XTextRange> & i_xInsertionRange) SAL_OVERRIDE;
     822             : };
     823             : 
     824           0 : TYPEINIT1( XMLMetaImportContext, XMLMetaImportContextBase );
     825             : 
     826          38 : XMLMetaImportContext::XMLMetaImportContext(
     827             :         SvXMLImport& i_rImport,
     828             :         const sal_uInt16 i_nPrefix,
     829             :         const OUString& i_rLocalName,
     830             :         XMLHints_Impl& i_rHints,
     831             :         bool & i_rIgnoreLeadingSpace )
     832             :     : XMLMetaImportContextBase( i_rImport, i_nPrefix, i_rLocalName,
     833             :             i_rHints, i_rIgnoreLeadingSpace )
     834          38 :     , m_bHaveAbout(false)
     835             : {
     836          38 : }
     837             : 
     838          54 : void XMLMetaImportContext::ProcessAttribute(sal_uInt16 const i_nPrefix,
     839             :     OUString const & i_rLocalName, OUString const & i_rValue)
     840             : {
     841          54 :     if ( XML_NAMESPACE_XHTML == i_nPrefix )
     842             :     {
     843             :         // RDFa
     844          16 :         if ( IsXMLToken( i_rLocalName, XML_ABOUT) )
     845             :         {
     846           4 :             m_sAbout = i_rValue;
     847           4 :             m_bHaveAbout = true;
     848             :         }
     849          12 :         else if ( IsXMLToken( i_rLocalName, XML_PROPERTY) )
     850             :         {
     851           4 :             m_sProperty = i_rValue;
     852             :         }
     853           8 :         else if ( IsXMLToken( i_rLocalName, XML_CONTENT) )
     854             :         {
     855           4 :             m_sContent = i_rValue;
     856             :         }
     857           4 :         else if ( IsXMLToken( i_rLocalName, XML_DATATYPE) )
     858             :         {
     859           4 :             m_sDatatype = i_rValue;
     860             :         }
     861             :     }
     862             :     else
     863             :     {
     864             :         XMLMetaImportContextBase::ProcessAttribute(
     865          38 :             i_nPrefix, i_rLocalName, i_rValue);
     866             :     }
     867          54 : }
     868             : 
     869          38 : void XMLMetaImportContext::InsertMeta(
     870             :     const Reference<XTextRange> & i_xInsertionRange)
     871             : {
     872             :     SAL_WARN_IF(m_bHaveAbout == m_sProperty.isEmpty(), "xmloff.text", "XMLMetaImportContext::InsertMeta: invalid RDFa?");
     873          38 :     if (!m_XmlId.isEmpty() || (m_bHaveAbout && !m_sProperty.isEmpty()))
     874             :     {
     875             :         // insert mark
     876             :         const uno::Reference<rdf::XMetadatable> xMeta(
     877             :             XMLTextMarkImportContext::CreateAndInsertMark(
     878          36 :                 GetImport(),
     879             :                 OUString("com.sun.star.text.InContentMetadata"),
     880             :                 OUString(),
     881             :                 i_xInsertionRange, m_XmlId),
     882          72 :             uno::UNO_QUERY);
     883             :         SAL_WARN_IF(!xMeta.is(), "xmloff.text", "cannot insert Meta?");
     884             : 
     885          36 :         if (xMeta.is() && m_bHaveAbout)
     886             :         {
     887           4 :             GetImport().AddRDFa(xMeta,
     888           8 :                 m_sAbout, m_sProperty, m_sContent, m_sDatatype);
     889          36 :         }
     890             :     }
     891             :     else
     892             :     {
     893             :         SAL_INFO("xmloff.text", "invalid <text:meta>: no xml:id, no valid RDFa");
     894             :     }
     895          38 : }
     896             : 
     897             : /** text:meta-field */
     898          84 : class XMLMetaFieldImportContext : public XMLMetaImportContextBase
     899             : {
     900             :     OUString m_DataStyleName;
     901             : 
     902             : public:
     903             :     TYPEINFO_OVERRIDE();
     904             : 
     905             :     XMLMetaFieldImportContext(
     906             :         SvXMLImport& i_rImport,
     907             :         const sal_uInt16 i_nPrefix,
     908             :         const OUString& i_rLocalName,
     909             :         XMLHints_Impl& i_rHints,
     910             :         bool & i_rIgnoreLeadingSpace );
     911             : 
     912             :     virtual void ProcessAttribute(sal_uInt16 const i_nPrefix,
     913             :         OUString const & i_rLocalName, OUString const & i_rValue) SAL_OVERRIDE;
     914             : 
     915             :     virtual void InsertMeta(const Reference<XTextRange> & i_xInsertionRange) SAL_OVERRIDE;
     916             : };
     917             : 
     918           0 : TYPEINIT1( XMLMetaFieldImportContext, XMLMetaImportContextBase );
     919             : 
     920          42 : XMLMetaFieldImportContext::XMLMetaFieldImportContext(
     921             :         SvXMLImport& i_rImport,
     922             :         const sal_uInt16 i_nPrefix,
     923             :         const OUString& i_rLocalName,
     924             :         XMLHints_Impl& i_rHints,
     925             :         bool & i_rIgnoreLeadingSpace )
     926             :     : XMLMetaImportContextBase( i_rImport, i_nPrefix, i_rLocalName,
     927          42 :             i_rHints, i_rIgnoreLeadingSpace )
     928             : {
     929          42 : }
     930             : 
     931          48 : void XMLMetaFieldImportContext::ProcessAttribute(sal_uInt16 const i_nPrefix,
     932             :     OUString const & i_rLocalName, OUString const & i_rValue)
     933             : {
     934          56 :     if ( XML_NAMESPACE_STYLE == i_nPrefix &&
     935           8 :          IsXMLToken( i_rLocalName, XML_DATA_STYLE_NAME ) )
     936             :     {
     937           8 :         m_DataStyleName = i_rValue;
     938             :     }
     939             :     else
     940             :     {
     941             :         XMLMetaImportContextBase::ProcessAttribute(
     942          40 :             i_nPrefix, i_rLocalName, i_rValue);
     943             :     }
     944          48 : }
     945             : 
     946          42 : void XMLMetaFieldImportContext::InsertMeta(
     947             :     const Reference<XTextRange> & i_xInsertionRange)
     948             : {
     949          42 :     if (!m_XmlId.isEmpty()) // valid?
     950             :     {
     951             :         // insert mark
     952             :         const Reference<XPropertySet> xPropertySet(
     953             :             XMLTextMarkImportContext::CreateAndInsertMark(
     954          40 :                 GetImport(),
     955             :                 OUString("com.sun.star.text.textfield.MetadataField"),
     956             :                 OUString(),
     957             :                 i_xInsertionRange, m_XmlId),
     958          80 :             UNO_QUERY);
     959             :         SAL_WARN_IF(!xPropertySet.is(), "xmloff.text", "cannot insert MetaField?");
     960          82 :         if (!xPropertySet.is()) return;
     961             : 
     962          40 :         if (!m_DataStyleName.isEmpty())
     963             :         {
     964           8 :             bool isDefaultLanguage(true);
     965             : 
     966           8 :             const sal_Int32 nKey( GetImport().GetTextImport()->GetDataStyleKey(
     967          16 :                                    m_DataStyleName, & isDefaultLanguage) );
     968             : 
     969           8 :             if (-1 != nKey)
     970             :             {
     971             :                 static OUString sPropertyIsFixedLanguage(
     972           8 :                     OUString("IsFixedLanguage") );
     973           8 :                 Any any;
     974           8 :                 any <<= nKey;
     975           8 :                 xPropertySet->setPropertyValue(
     976           8 :                     OUString("NumberFormat"), any);
     977          16 :                 if ( xPropertySet->getPropertySetInfo()->
     978           8 :                         hasPropertyByName( sPropertyIsFixedLanguage ) )
     979             :                 {
     980           8 :                     any <<= static_cast<bool>(!isDefaultLanguage);
     981           8 :                     xPropertySet->setPropertyValue( sPropertyIsFixedLanguage,
     982           8 :                         any );
     983           8 :                 }
     984             :             }
     985          40 :         }
     986             :     }
     987             :     else
     988             :     {
     989             :         SAL_INFO("xmloff.text", "invalid <text:meta-field>: no xml:id");
     990             :     }
     991             : }
     992             : 
     993             : /**
     994             :  * Process index marks.
     995             :  *
     996             :  * All *-mark-end index marks should instantiate *this* class (because
     997             :  * it doesn't process attributes other than ID), while the *-mark and
     998             :  * *-mark-start classes should instantiate the apporpiate subclasses.
     999             :  */
    1000           0 : class XMLIndexMarkImportContext_Impl : public SvXMLImportContext
    1001             : {
    1002             :     const OUString sAlternativeText;
    1003             : 
    1004             :     XMLHints_Impl& rHints;
    1005             :     const enum XMLTextPElemTokens eToken;
    1006             :     OUString sID;
    1007             : 
    1008             : public:
    1009             :     TYPEINFO_OVERRIDE();
    1010             : 
    1011             :     XMLIndexMarkImportContext_Impl(
    1012             :         SvXMLImport& rImport,
    1013             :         sal_uInt16 nPrefix,
    1014             :         const OUString& rLocalName,
    1015             :         enum XMLTextPElemTokens nTok,
    1016             :         XMLHints_Impl& rHnts);
    1017             : 
    1018             :     void StartElement(const Reference<xml::sax::XAttributeList> & xAttrList) SAL_OVERRIDE;
    1019             : 
    1020             : protected:
    1021             : 
    1022             :     /// process all attributes
    1023             :     void ProcessAttributes(const Reference<xml::sax::XAttributeList> & xAttrList,
    1024             :                            Reference<beans::XPropertySet>& rPropSet);
    1025             : 
    1026             :     /**
    1027             :      * All marks can be created immediately. Since we don't care about
    1028             :      * the element content, ProcessAttribute should set the properties
    1029             :      * immediately.
    1030             :      *
    1031             :      * This method tolerates an empty PropertySet; subclasses however
    1032             :      * are not expected to.
    1033             :      */
    1034             :     virtual void ProcessAttribute(sal_uInt16 nNamespace,
    1035             :                                   const OUString& sLocalName,
    1036             :                                   const OUString& sValue,
    1037             :                                   Reference<beans::XPropertySet>& rPropSet);
    1038             : 
    1039             :     static void GetServiceName(OUString& sServiceName,
    1040             :                                enum XMLTextPElemTokens nToken);
    1041             : 
    1042             :     bool CreateMark(Reference<beans::XPropertySet>& rPropSet,
    1043             :                         const OUString& rServiceName);
    1044             : };
    1045             : 
    1046           0 : TYPEINIT1( XMLIndexMarkImportContext_Impl, SvXMLImportContext );
    1047             : 
    1048           0 : XMLIndexMarkImportContext_Impl::XMLIndexMarkImportContext_Impl(
    1049             :     SvXMLImport& rImport,
    1050             :     sal_uInt16 nPrefix,
    1051             :     const OUString& rLocalName,
    1052             :     enum XMLTextPElemTokens eTok,
    1053             :     XMLHints_Impl& rHnts) :
    1054             :         SvXMLImportContext(rImport, nPrefix, rLocalName),
    1055             :         sAlternativeText("AlternativeText"),
    1056             :         rHints(rHnts),
    1057           0 :         eToken(eTok)
    1058             : {
    1059           0 : }
    1060             : 
    1061           0 : void XMLIndexMarkImportContext_Impl::StartElement(
    1062             :     const Reference<xml::sax::XAttributeList> & xAttrList)
    1063             : {
    1064             :     // get Cursor position (needed for all cases)
    1065             :     Reference<XTextRange> xPos(
    1066           0 :         GetImport().GetTextImport()->GetCursor()->getStart());
    1067           0 :     Reference<beans::XPropertySet> xMark;
    1068             : 
    1069           0 :     switch (eToken)
    1070             :     {
    1071             :         case XML_TOK_TEXT_TOC_MARK:
    1072             :         case XML_TOK_TEXT_USER_INDEX_MARK:
    1073             :         case XML_TOK_TEXT_ALPHA_INDEX_MARK:
    1074             :         {
    1075             :             // single mark: create mark and insert
    1076           0 :             OUString sService;
    1077           0 :             GetServiceName(sService, eToken);
    1078           0 :             if (CreateMark(xMark, sService))
    1079             :             {
    1080           0 :                 ProcessAttributes(xAttrList, xMark);
    1081           0 :                 XMLHint_Impl* pHint = new XMLIndexMarkHint_Impl(xMark, xPos);
    1082           0 :                 rHints.push_back(pHint);
    1083             :             }
    1084             :             // else: can't create mark -> ignore
    1085           0 :             break;
    1086             :         }
    1087             : 
    1088             :         case XML_TOK_TEXT_TOC_MARK_START:
    1089             :         case XML_TOK_TEXT_USER_INDEX_MARK_START:
    1090             :         case XML_TOK_TEXT_ALPHA_INDEX_MARK_START:
    1091             :         {
    1092             :             // start: create mark and insert (if ID is found)
    1093           0 :             OUString sService;
    1094           0 :             GetServiceName(sService, eToken);
    1095           0 :             if (CreateMark(xMark, sService))
    1096             :             {
    1097           0 :                 ProcessAttributes(xAttrList, xMark);
    1098           0 :                 if (!sID.isEmpty())
    1099             :                 {
    1100             :                     // process only if we find an ID
    1101             :                     XMLHint_Impl* pHint =
    1102           0 :                         new XMLIndexMarkHint_Impl(xMark, xPos, sID);
    1103           0 :                     rHints.push_back(pHint);
    1104             :                 }
    1105             :                 // else: no ID -> we'll never find the end -> ignore
    1106             :             }
    1107             :             // else: can't create mark -> ignore
    1108           0 :             break;
    1109             :         }
    1110             : 
    1111             :         case XML_TOK_TEXT_TOC_MARK_END:
    1112             :         case XML_TOK_TEXT_USER_INDEX_MARK_END:
    1113             :         case XML_TOK_TEXT_ALPHA_INDEX_MARK_END:
    1114             :         {
    1115             :             // end: search for ID and set end of mark
    1116             : 
    1117             :             // call process attributes with empty XPropertySet:
    1118           0 :             ProcessAttributes(xAttrList, xMark);
    1119           0 :             if (!sID.isEmpty())
    1120             :             {
    1121             :                 // if we have an ID, find the hint and set the end position
    1122           0 :                 sal_uInt16 nCount = rHints.size();
    1123           0 :                 for(sal_uInt16 nPos = 0; nPos < nCount; nPos++)
    1124             :                 {
    1125           0 :                     XMLHint_Impl *pHint = &rHints[nPos];
    1126           0 :                     if ( pHint->IsIndexMark() &&
    1127             :                          sID.equals(
    1128           0 :                              static_cast<XMLIndexMarkHint_Impl *>(pHint)->GetID()) )
    1129             :                     {
    1130             :                         // set end and stop searching
    1131           0 :                         pHint->SetEnd(xPos);
    1132           0 :                         break;
    1133             :                     }
    1134             :                 }
    1135             :             }
    1136             :             // else: no ID -> ignore
    1137           0 :             break;
    1138             :         }
    1139             : 
    1140             :         default:
    1141             :             SAL_WARN("xmloff.text", "unknown index mark type!");
    1142           0 :             break;
    1143           0 :     }
    1144           0 : }
    1145             : 
    1146           0 : void XMLIndexMarkImportContext_Impl::ProcessAttributes(
    1147             :     const Reference<xml::sax::XAttributeList> & xAttrList,
    1148             :     Reference<beans::XPropertySet>& rPropSet)
    1149             : {
    1150             :     // process attributes
    1151           0 :     sal_Int16 nLength = xAttrList->getLength();
    1152           0 :     for(sal_Int16 i=0; i<nLength; i++)
    1153             :     {
    1154           0 :         OUString sLocalName;
    1155           0 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
    1156           0 :             GetKeyByAttrName( xAttrList->getNameByIndex(i), &sLocalName );
    1157             : 
    1158             :         ProcessAttribute(nPrefix, sLocalName,
    1159           0 :                          xAttrList->getValueByIndex(i),
    1160           0 :                          rPropSet);
    1161           0 :     }
    1162           0 : }
    1163             : 
    1164           0 : void XMLIndexMarkImportContext_Impl::ProcessAttribute(
    1165             :     sal_uInt16 nNamespace,
    1166             :     const OUString& sLocalName,
    1167             :     const OUString& sValue,
    1168             :     Reference<beans::XPropertySet>& rPropSet)
    1169             : {
    1170             :     // we only know ID + string-value attribute;
    1171             :     // (former: marks, latter: -start + -end-marks)
    1172             :     // the remainder is handled in sub-classes
    1173           0 :     switch (eToken)
    1174             :     {
    1175             :         case XML_TOK_TEXT_TOC_MARK:
    1176             :         case XML_TOK_TEXT_USER_INDEX_MARK:
    1177             :         case XML_TOK_TEXT_ALPHA_INDEX_MARK:
    1178           0 :             if ( (XML_NAMESPACE_TEXT == nNamespace) &&
    1179           0 :                  IsXMLToken( sLocalName, XML_STRING_VALUE ) )
    1180             :             {
    1181           0 :                 rPropSet->setPropertyValue(sAlternativeText, uno::makeAny(sValue));
    1182             :             }
    1183             :             // else: ignore!
    1184           0 :             break;
    1185             : 
    1186             :         case XML_TOK_TEXT_TOC_MARK_START:
    1187             :         case XML_TOK_TEXT_USER_INDEX_MARK_START:
    1188             :         case XML_TOK_TEXT_ALPHA_INDEX_MARK_START:
    1189             :         case XML_TOK_TEXT_TOC_MARK_END:
    1190             :         case XML_TOK_TEXT_USER_INDEX_MARK_END:
    1191             :         case XML_TOK_TEXT_ALPHA_INDEX_MARK_END:
    1192           0 :             if ( (XML_NAMESPACE_TEXT == nNamespace) &&
    1193           0 :                  IsXMLToken( sLocalName, XML_ID ) )
    1194             :             {
    1195           0 :                 sID = sValue;
    1196             :             }
    1197             :             // else: ignore
    1198           0 :             break;
    1199             : 
    1200             :         default:
    1201             :             SAL_WARN("xmloff.text", "unknown index mark type!");
    1202           0 :             break;
    1203             :     }
    1204           0 : }
    1205             : 
    1206             : static const sal_Char sAPI_com_sun_star_text_ContentIndexMark[] =
    1207             :         "com.sun.star.text.ContentIndexMark";
    1208             : static const sal_Char sAPI_com_sun_star_text_UserIndexMark[] =
    1209             :         "com.sun.star.text.UserIndexMark";
    1210             : static const sal_Char sAPI_com_sun_star_text_DocumentIndexMark[] =
    1211             :         "com.sun.star.text.DocumentIndexMark";
    1212             : 
    1213           0 : void XMLIndexMarkImportContext_Impl::GetServiceName(
    1214             :     OUString& sServiceName,
    1215             :     enum XMLTextPElemTokens eToken)
    1216             : {
    1217           0 :     switch (eToken)
    1218             :     {
    1219             :         case XML_TOK_TEXT_TOC_MARK:
    1220             :         case XML_TOK_TEXT_TOC_MARK_START:
    1221             :         case XML_TOK_TEXT_TOC_MARK_END:
    1222             :         {
    1223             :             OUString sTmp(
    1224           0 :                 sAPI_com_sun_star_text_ContentIndexMark);
    1225           0 :             sServiceName = sTmp;
    1226           0 :             break;
    1227             :         }
    1228             : 
    1229             :         case XML_TOK_TEXT_USER_INDEX_MARK:
    1230             :         case XML_TOK_TEXT_USER_INDEX_MARK_START:
    1231             :         case XML_TOK_TEXT_USER_INDEX_MARK_END:
    1232             :         {
    1233             :             OUString sTmp(
    1234           0 :                 sAPI_com_sun_star_text_UserIndexMark);
    1235           0 :             sServiceName = sTmp;
    1236           0 :             break;
    1237             :         }
    1238             : 
    1239             :         case XML_TOK_TEXT_ALPHA_INDEX_MARK:
    1240             :         case XML_TOK_TEXT_ALPHA_INDEX_MARK_START:
    1241             :         case XML_TOK_TEXT_ALPHA_INDEX_MARK_END:
    1242             :         {
    1243             :             OUString sTmp(
    1244           0 :                 sAPI_com_sun_star_text_DocumentIndexMark);
    1245           0 :             sServiceName = sTmp;
    1246           0 :             break;
    1247             :         }
    1248             : 
    1249             :         default:
    1250             :         {
    1251             :             SAL_WARN("xmloff.text", "unknown index mark type!");
    1252           0 :             OUString sTmp;
    1253           0 :             sServiceName = sTmp;
    1254           0 :             break;
    1255             :         }
    1256             :     }
    1257           0 : }
    1258             : 
    1259           0 : bool XMLIndexMarkImportContext_Impl::CreateMark(
    1260             :     Reference<beans::XPropertySet>& rPropSet,
    1261             :     const OUString& rServiceName)
    1262             : {
    1263             :     Reference<lang::XMultiServiceFactory>
    1264           0 :         xFactory(GetImport().GetModel(), UNO_QUERY);
    1265             : 
    1266           0 :     if( xFactory.is() )
    1267             :     {
    1268           0 :         Reference<beans::XPropertySet> xPropSet( xFactory->createInstance(rServiceName), UNO_QUERY );
    1269           0 :         if (xPropSet.is())
    1270           0 :             rPropSet = xPropSet;
    1271           0 :         return true;
    1272             :     }
    1273             : 
    1274           0 :     return false;
    1275             : }
    1276             : 
    1277           0 : class XMLTOCMarkImportContext_Impl : public XMLIndexMarkImportContext_Impl
    1278             : {
    1279             :     const OUString sLevel;
    1280             : 
    1281             : public:
    1282             :     TYPEINFO_OVERRIDE();
    1283             : 
    1284             :     XMLTOCMarkImportContext_Impl(
    1285             :         SvXMLImport& rImport,
    1286             :         sal_uInt16 nPrefix,
    1287             :         const OUString& rLocalName,
    1288             :         enum XMLTextPElemTokens nTok,
    1289             :         XMLHints_Impl& rHnts);
    1290             : 
    1291             : protected:
    1292             : 
    1293             :     /** process outline level */
    1294             :     virtual void ProcessAttribute(sal_uInt16 nNamespace,
    1295             :                                   const OUString& sLocalName,
    1296             :                                   const OUString& sValue,
    1297             :                                   Reference<beans::XPropertySet>& rPropSet) SAL_OVERRIDE;
    1298             : };
    1299             : 
    1300           0 : TYPEINIT1( XMLTOCMarkImportContext_Impl, XMLIndexMarkImportContext_Impl );
    1301             : 
    1302           0 : XMLTOCMarkImportContext_Impl::XMLTOCMarkImportContext_Impl(
    1303             :     SvXMLImport& rImport, sal_uInt16 nPrefix, const OUString& rLocalName,
    1304             :     enum XMLTextPElemTokens nTok, XMLHints_Impl& rHnts) :
    1305             :         XMLIndexMarkImportContext_Impl(rImport, nPrefix, rLocalName,
    1306             :                                        nTok, rHnts),
    1307           0 :         sLevel("Level")
    1308             : {
    1309           0 : }
    1310             : 
    1311           0 : void XMLTOCMarkImportContext_Impl::ProcessAttribute(
    1312             :     sal_uInt16 nNamespace,
    1313             :     const OUString& sLocalName,
    1314             :     const OUString& sValue,
    1315             :     Reference<beans::XPropertySet>& rPropSet)
    1316             : {
    1317             :     SAL_WARN_IF(!rPropSet.is(), "xmloff.text", "need PropertySet");
    1318             : 
    1319           0 :     if ((XML_NAMESPACE_TEXT == nNamespace) &&
    1320           0 :         IsXMLToken( sLocalName, XML_OUTLINE_LEVEL ) )
    1321             :     {
    1322             :         // ouline level: set Level property
    1323             :         sal_Int32 nTmp;
    1324           0 :         if (::sax::Converter::convertNumber( nTmp, sValue )
    1325           0 :              && nTmp >= 1
    1326           0 :              && nTmp < GetImport().GetTextImport()->
    1327           0 :                               GetChapterNumbering()->getCount() )
    1328             :         {
    1329           0 :             rPropSet->setPropertyValue(sLevel, uno::makeAny((sal_Int16)(nTmp - 1)));
    1330             :         }
    1331             :         // else: value out of range -> ignore
    1332             :     }
    1333             :     else
    1334             :     {
    1335             :         // else: delegate to superclass
    1336             :         XMLIndexMarkImportContext_Impl::ProcessAttribute(
    1337           0 :             nNamespace, sLocalName, sValue, rPropSet);
    1338             :     }
    1339           0 : }
    1340             : 
    1341           0 : class XMLUserIndexMarkImportContext_Impl : public XMLIndexMarkImportContext_Impl
    1342             : {
    1343             :     const OUString sUserIndexName;
    1344             :     const OUString sLevel;
    1345             : 
    1346             : public:
    1347             :     TYPEINFO_OVERRIDE();
    1348             : 
    1349             :     XMLUserIndexMarkImportContext_Impl(
    1350             :         SvXMLImport& rImport,
    1351             :         sal_uInt16 nPrefix,
    1352             :         const OUString& rLocalName,
    1353             :         enum XMLTextPElemTokens nTok,
    1354             :         XMLHints_Impl& rHnts);
    1355             : 
    1356             : protected:
    1357             : 
    1358             :     /** process index name */
    1359             :     virtual void ProcessAttribute(sal_uInt16 nNamespace,
    1360             :                                   const OUString& sLocalName,
    1361             :                                   const OUString& sValue,
    1362             :                                   Reference<beans::XPropertySet>& rPropSet) SAL_OVERRIDE;
    1363             : };
    1364             : 
    1365           0 : TYPEINIT1( XMLUserIndexMarkImportContext_Impl, XMLIndexMarkImportContext_Impl);
    1366             : 
    1367           0 : XMLUserIndexMarkImportContext_Impl::XMLUserIndexMarkImportContext_Impl(
    1368             :     SvXMLImport& rImport, sal_uInt16 nPrefix, const OUString& rLocalName,
    1369             :     enum XMLTextPElemTokens nTok, XMLHints_Impl& rHnts) :
    1370             :         XMLIndexMarkImportContext_Impl(rImport, nPrefix, rLocalName,
    1371             :                                        nTok, rHnts),
    1372             :         sUserIndexName("UserIndexName"),
    1373           0 :         sLevel("Level")
    1374             : {
    1375           0 : }
    1376             : 
    1377           0 : void XMLUserIndexMarkImportContext_Impl::ProcessAttribute(
    1378             :     sal_uInt16 nNamespace, const OUString& sLocalName, const OUString& sValue,
    1379             :     Reference<beans::XPropertySet>& rPropSet)
    1380             : {
    1381           0 :     if ( XML_NAMESPACE_TEXT == nNamespace )
    1382             :     {
    1383           0 :         if ( IsXMLToken( sLocalName, XML_INDEX_NAME ) )
    1384             :         {
    1385           0 :             rPropSet->setPropertyValue(sUserIndexName, uno::makeAny(sValue));
    1386             :         }
    1387           0 :         else if ( IsXMLToken( sLocalName, XML_OUTLINE_LEVEL ) )
    1388             :         {
    1389             :             // ouline level: set Level property
    1390             :             sal_Int32 nTmp;
    1391           0 :             if (::sax::Converter::convertNumber(
    1392             :                 nTmp, sValue, 0,
    1393           0 :                GetImport().GetTextImport()->GetChapterNumbering()->getCount()))
    1394             :             {
    1395           0 :                 rPropSet->setPropertyValue(sLevel, uno::makeAny(static_cast<sal_Int16>(nTmp - 1)));
    1396             :             }
    1397             :             // else: value out of range -> ignore
    1398             :         }
    1399             :         else
    1400             :         {
    1401             :             // else: unknown text property: delegate to super class
    1402             :             XMLIndexMarkImportContext_Impl::ProcessAttribute(
    1403           0 :                 nNamespace, sLocalName, sValue, rPropSet);
    1404             :         }
    1405             :     }
    1406             :     else
    1407             :     {
    1408             :         // else: unknown namespace: delegate to super class
    1409             :         XMLIndexMarkImportContext_Impl::ProcessAttribute(
    1410           0 :             nNamespace, sLocalName, sValue, rPropSet);
    1411             :     }
    1412           0 : }
    1413             : 
    1414           0 : class XMLAlphaIndexMarkImportContext_Impl : public XMLIndexMarkImportContext_Impl
    1415             : {
    1416             :     const OUString sPrimaryKey;
    1417             :     const OUString sSecondaryKey;
    1418             :     const OUString sTextReading;
    1419             :     const OUString sPrimaryKeyReading;
    1420             :     const OUString sSecondaryKeyReading;
    1421             :     const OUString sMainEntry;
    1422             : 
    1423             : public:
    1424             :     TYPEINFO_OVERRIDE();
    1425             : 
    1426             :     XMLAlphaIndexMarkImportContext_Impl(
    1427             :         SvXMLImport& rImport,
    1428             :         sal_uInt16 nPrefix,
    1429             :         const OUString& rLocalName,
    1430             :         enum XMLTextPElemTokens nTok,
    1431             :         XMLHints_Impl& rHnts);
    1432             : 
    1433             : protected:
    1434             : 
    1435             :     /** process primary + secondary keys */
    1436             :     virtual void ProcessAttribute(sal_uInt16 nNamespace,
    1437             :                                   const OUString& sLocalName,
    1438             :                                   const OUString& sValue,
    1439             :                                   Reference<beans::XPropertySet>& rPropSet) SAL_OVERRIDE;
    1440             : };
    1441             : 
    1442           0 : TYPEINIT1( XMLAlphaIndexMarkImportContext_Impl,
    1443             :            XMLIndexMarkImportContext_Impl );
    1444             : 
    1445           0 : XMLAlphaIndexMarkImportContext_Impl::XMLAlphaIndexMarkImportContext_Impl(
    1446             :     SvXMLImport& rImport, sal_uInt16 nPrefix, const OUString& rLocalName,
    1447             :     enum XMLTextPElemTokens nTok, XMLHints_Impl& rHnts) :
    1448             :         XMLIndexMarkImportContext_Impl(rImport, nPrefix, rLocalName,
    1449             :                                        nTok, rHnts),
    1450             :         sPrimaryKey("PrimaryKey"),
    1451             :         sSecondaryKey("SecondaryKey"),
    1452             :         sTextReading("TextReading"),
    1453             :         sPrimaryKeyReading("PrimaryKeyReading"),
    1454             :         sSecondaryKeyReading("SecondaryKeyReading"),
    1455           0 :         sMainEntry("IsMainEntry")
    1456             : {
    1457           0 : }
    1458             : 
    1459           0 : void XMLAlphaIndexMarkImportContext_Impl::ProcessAttribute(
    1460             :     sal_uInt16 nNamespace, const OUString& sLocalName, const OUString& sValue,
    1461             :     Reference<beans::XPropertySet>& rPropSet)
    1462             : {
    1463           0 :     if (XML_NAMESPACE_TEXT == nNamespace)
    1464             :     {
    1465           0 :         if ( IsXMLToken( sLocalName, XML_KEY1 ) )
    1466             :         {
    1467           0 :             rPropSet->setPropertyValue(sPrimaryKey, uno::makeAny(sValue));
    1468             :         }
    1469           0 :         else if ( IsXMLToken( sLocalName, XML_KEY2 ) )
    1470             :         {
    1471           0 :             rPropSet->setPropertyValue(sSecondaryKey, uno::makeAny(sValue));
    1472             :         }
    1473           0 :         else if ( IsXMLToken( sLocalName, XML_KEY1_PHONETIC ) )
    1474             :         {
    1475           0 :             rPropSet->setPropertyValue(sPrimaryKeyReading, uno::makeAny(sValue));
    1476             :         }
    1477           0 :         else if ( IsXMLToken( sLocalName, XML_KEY2_PHONETIC ) )
    1478             :         {
    1479           0 :             rPropSet->setPropertyValue(sSecondaryKeyReading, uno::makeAny(sValue));
    1480             :         }
    1481           0 :         else if ( IsXMLToken( sLocalName, XML_STRING_VALUE_PHONETIC ) )
    1482             :         {
    1483           0 :             rPropSet->setPropertyValue(sTextReading, uno::makeAny(sValue));
    1484             :         }
    1485           0 :         else if ( IsXMLToken( sLocalName, XML_MAIN_ENTRY ) )
    1486             :         {
    1487           0 :             bool bMainEntry = false;
    1488           0 :             bool bTmp(false);
    1489             : 
    1490           0 :             if (::sax::Converter::convertBool(bTmp, sValue))
    1491           0 :                 bMainEntry = bTmp;
    1492             : 
    1493           0 :             rPropSet->setPropertyValue(sMainEntry, uno::makeAny(bMainEntry));
    1494             :         }
    1495             :         else
    1496             :         {
    1497             :             XMLIndexMarkImportContext_Impl::ProcessAttribute(
    1498           0 :                 nNamespace, sLocalName, sValue, rPropSet);
    1499             :         }
    1500             :     }
    1501             :     else
    1502             :     {
    1503             :         XMLIndexMarkImportContext_Impl::ProcessAttribute(
    1504           0 :             nNamespace, sLocalName, sValue, rPropSet);
    1505             :     }
    1506           0 : }
    1507             : 
    1508           0 : TYPEINIT1( XMLImpSpanContext_Impl, SvXMLImportContext );
    1509             : 
    1510       10144 : XMLImpSpanContext_Impl::XMLImpSpanContext_Impl(
    1511             :         SvXMLImport& rImport,
    1512             :         sal_uInt16 nPrfx,
    1513             :         const OUString& rLName,
    1514             :         const Reference< xml::sax::XAttributeList > & xAttrList,
    1515             :         XMLHints_Impl& rHnts,
    1516             :         bool& rIgnLeadSpace,
    1517             :         sal_uInt8 nSFConvFlags
    1518             :                                               )
    1519             : :   SvXMLImportContext( rImport, nPrfx, rLName )
    1520             : ,   rHints( rHnts )
    1521             : ,   pHint( 0  )
    1522             : ,   rIgnoreLeadingSpace( rIgnLeadSpace )
    1523       10144 : ,   nStarFontsConvFlags( nSFConvFlags & (CONV_FROM_STAR_BATS|CONV_FROM_STAR_MATH) )
    1524             : {
    1525       10144 :     OUString aStyleName;
    1526             : 
    1527       10144 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
    1528       20288 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
    1529             :     {
    1530       10144 :         const OUString& rAttrName = xAttrList->getNameByIndex( i );
    1531             : 
    1532       20288 :         OUString aLocalName;
    1533             :         sal_uInt16 nPrefix =
    1534       10144 :             GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
    1535       10144 :                                                             &aLocalName );
    1536       20288 :         if( XML_NAMESPACE_TEXT == nPrefix &&
    1537       10144 :             IsXMLToken( aLocalName, XML_STYLE_NAME ) )
    1538       10144 :             aStyleName = xAttrList->getValueByIndex( i );
    1539       10144 :     }
    1540             : 
    1541       10144 :     if( !aStyleName.isEmpty() )
    1542             :     {
    1543             :         pHint = new XMLStyleHint_Impl( aStyleName,
    1544       10144 :                   GetImport().GetTextImport()->GetCursorAsRange()->getStart() );
    1545       10144 :             rHints.push_back( pHint );
    1546       10144 :     }
    1547       10144 : }
    1548             : 
    1549       30432 : XMLImpSpanContext_Impl::~XMLImpSpanContext_Impl()
    1550             : {
    1551       10144 :     if( pHint )
    1552       10144 :         pHint->SetEnd( GetImport().GetTextImport()
    1553       10144 :                             ->GetCursorAsRange()->getStart() );
    1554       20288 : }
    1555             : 
    1556       21594 : SvXMLImportContext *XMLImpSpanContext_Impl::CreateChildContext(
    1557             :         SvXMLImport& rImport,
    1558             :         sal_uInt16 nPrefix, const OUString& rLocalName,
    1559             :         const Reference< xml::sax::XAttributeList > & xAttrList,
    1560             :         sal_uInt16 nToken,
    1561             :         XMLHints_Impl& rHints,
    1562             :         bool& rIgnoreLeadingSpace,
    1563             :         sal_uInt8 nStarFontsConvFlags
    1564             :      )
    1565             : {
    1566       21594 :     SvXMLImportContext *pContext = 0;
    1567             : 
    1568       21594 :     switch( nToken )
    1569             :     {
    1570             :     case XML_TOK_TEXT_SPAN:
    1571             :         pContext = new XMLImpSpanContext_Impl( rImport, nPrefix,
    1572             :                                                rLocalName, xAttrList,
    1573             :                                                rHints,
    1574             :                                                rIgnoreLeadingSpace
    1575             :                                                ,nStarFontsConvFlags
    1576       10144 :                                              );
    1577       10144 :         break;
    1578             : 
    1579             :     case XML_TOK_TEXT_TAB_STOP:
    1580             :         pContext = new XMLCharContext( rImport, nPrefix,
    1581             :                                                rLocalName, xAttrList,
    1582        2496 :                                                0x0009, false );
    1583        2496 :         rIgnoreLeadingSpace = false;
    1584        2496 :         break;
    1585             : 
    1586             :     case XML_TOK_TEXT_LINE_BREAK:
    1587             :         pContext = new XMLCharContext( rImport, nPrefix,
    1588             :                                                rLocalName, xAttrList,
    1589          48 :                                                ControlCharacter::LINE_BREAK );
    1590          48 :         rIgnoreLeadingSpace = false;
    1591          48 :         break;
    1592             : 
    1593             :     case XML_TOK_TEXT_S:
    1594             :         pContext = new XMLCharContext( rImport, nPrefix,
    1595             :                                                rLocalName, xAttrList,
    1596        1514 :                                                0x0020, true );
    1597        1514 :         break;
    1598             : 
    1599             :     case XML_TOK_TEXT_HYPERLINK:
    1600             :     {
    1601             :         // test for HyperLinkURL property. If present, insert link as
    1602             :         // text property (StarWriter), else try to insert as text
    1603             :         // field (StarCalc, StarDraw, ...)
    1604          10 :         Reference< beans::XPropertySet > xPropSet( rImport.GetTextImport()->GetCursor(), UNO_QUERY );
    1605             : 
    1606          20 :         const OUString sHyperLinkURL("HyperLinkURL");
    1607             : 
    1608          10 :         if ( xPropSet->getPropertySetInfo()->hasPropertyByName( sHyperLinkURL ) )
    1609             :         {
    1610             :             pContext = new XMLImpHyperlinkContext_Impl(
    1611             :                     rImport,
    1612             :                     nPrefix,
    1613             :                     rLocalName,
    1614             :                     xAttrList,
    1615             :                     rHints,
    1616           8 :                     rIgnoreLeadingSpace );
    1617             :         }
    1618             :         else
    1619             :         {
    1620           2 :             pContext = new XMLUrlFieldImportContext( rImport, *rImport.GetTextImport().get(), nPrefix, rLocalName );
    1621             :             //whitespace handling like other fields
    1622           2 :             rIgnoreLeadingSpace = false;
    1623             : 
    1624             :         }
    1625          20 :         break;
    1626             :     }
    1627             : 
    1628             :     case XML_TOK_TEXT_RUBY:
    1629             :         pContext = new XMLImpRubyContext_Impl( rImport, nPrefix,
    1630             :                                                rLocalName, xAttrList,
    1631             :                                                rHints,
    1632          24 :                                                rIgnoreLeadingSpace );
    1633          24 :         break;
    1634             : 
    1635             :     case XML_TOK_TEXT_NOTE:
    1636          36 :         if (rImport.GetTextImport()->IsInFrame())
    1637             :         {
    1638             :             // we must not insert footnotes into text frames
    1639             :             pContext = new SvXMLImportContext( rImport, nPrefix,
    1640           0 :                                                rLocalName );
    1641             :         }
    1642             :         else
    1643             :         {
    1644             :             pContext = new XMLFootnoteImportContext( rImport,
    1645          72 :                                                      *rImport.GetTextImport().get(),
    1646          36 :                                                      nPrefix, rLocalName );
    1647             :         }
    1648          36 :         rIgnoreLeadingSpace = false;
    1649          36 :         break;
    1650             : 
    1651             :     case XML_TOK_TEXT_REFERENCE:
    1652             :     case XML_TOK_TEXT_BOOKMARK:
    1653             :     case XML_TOK_TEXT_BOOKMARK_START:
    1654             :     case XML_TOK_TEXT_BOOKMARK_END:
    1655             :         pContext = new XMLTextMarkImportContext( rImport,
    1656        7956 :                                                  *rImport.GetTextImport().get(),
    1657        3978 :                                                  nPrefix, rLocalName );
    1658        3978 :         break;
    1659             : 
    1660             :     case XML_TOK_TEXT_FIELDMARK:
    1661             :     case XML_TOK_TEXT_FIELDMARK_START:
    1662             :     case XML_TOK_TEXT_FIELDMARK_END:
    1663             :         pContext = new XMLTextMarkImportContext( rImport,
    1664           0 :                                                  *rImport.GetTextImport().get(),
    1665           0 :                                                  nPrefix, rLocalName );
    1666           0 :         break;
    1667             : 
    1668             :     case XML_TOK_TEXT_REFERENCE_START:
    1669             :         pContext = new XMLStartReferenceContext_Impl( rImport,
    1670             :                                                       nPrefix, rLocalName,
    1671           0 :                                                       rHints, xAttrList );
    1672           0 :         break;
    1673             : 
    1674             :     case XML_TOK_TEXT_REFERENCE_END:
    1675             :         pContext = new XMLEndReferenceContext_Impl( rImport,
    1676             :                                                     nPrefix, rLocalName,
    1677           0 :                                                     rHints, xAttrList );
    1678           0 :         break;
    1679             : 
    1680             :     case XML_TOK_TEXT_FRAME:
    1681             :         {
    1682             :             Reference < XTextRange > xAnchorPos =
    1683         284 :                 rImport.GetTextImport()->GetCursor()->getStart();
    1684             :             XMLTextFrameContext *pTextFrameContext =
    1685             :                 new XMLTextFrameContext( rImport, nPrefix,
    1686             :                                          rLocalName, xAttrList,
    1687         284 :                                          TextContentAnchorType_AS_CHARACTER );
    1688             :             // Remove check for text content. (#i33242#)
    1689             :             // Check for text content is done on the processing of the hint
    1690         284 :             if( TextContentAnchorType_AT_CHARACTER ==
    1691         284 :                                             pTextFrameContext->GetAnchorType() )
    1692             :             {
    1693             :                 rHints.push_back( new XMLTextFrameHint_Impl(
    1694          18 :                     pTextFrameContext, xAnchorPos ) );
    1695             :             }
    1696         284 :             pContext = pTextFrameContext;
    1697         284 :             rIgnoreLeadingSpace = false;
    1698             :         }
    1699         284 :         break;
    1700             :     case XML_TOK_DRAW_A:
    1701             :         {
    1702           4 :             Reference < XTextRange > xAnchorPos(rImport.GetTextImport()->GetCursor()->getStart());
    1703             :             pContext =
    1704             :                 new XMLTextFrameHyperlinkContext( rImport, nPrefix,
    1705             :                                         rLocalName, xAttrList,
    1706           4 :                                         TextContentAnchorType_AS_CHARACTER );
    1707             :             XMLTextFrameHint_Impl *pHint =
    1708           4 :                 new XMLTextFrameHint_Impl( pContext, xAnchorPos);
    1709           4 :             rHints.push_back( pHint );
    1710             :         }
    1711           4 :         break;
    1712             : 
    1713             :     case XML_TOK_TEXT_TOC_MARK:
    1714             :     case XML_TOK_TEXT_TOC_MARK_START:
    1715             :         pContext = new XMLTOCMarkImportContext_Impl(
    1716             :             rImport, nPrefix, rLocalName,
    1717           0 :             (enum XMLTextPElemTokens)nToken, rHints);
    1718           0 :         break;
    1719             : 
    1720             :     case XML_TOK_TEXT_USER_INDEX_MARK:
    1721             :     case XML_TOK_TEXT_USER_INDEX_MARK_START:
    1722             :         pContext = new XMLUserIndexMarkImportContext_Impl(
    1723             :             rImport, nPrefix, rLocalName,
    1724           0 :             (enum XMLTextPElemTokens)nToken, rHints);
    1725           0 :         break;
    1726             : 
    1727             :     case XML_TOK_TEXT_ALPHA_INDEX_MARK:
    1728             :     case XML_TOK_TEXT_ALPHA_INDEX_MARK_START:
    1729             :         pContext = new XMLAlphaIndexMarkImportContext_Impl(
    1730             :             rImport, nPrefix, rLocalName,
    1731           0 :             (enum XMLTextPElemTokens)nToken, rHints);
    1732           0 :         break;
    1733             : 
    1734             :     case XML_TOK_TEXT_TOC_MARK_END:
    1735             :     case XML_TOK_TEXT_USER_INDEX_MARK_END:
    1736             :     case XML_TOK_TEXT_ALPHA_INDEX_MARK_END:
    1737             :         pContext = new XMLIndexMarkImportContext_Impl(
    1738             :             rImport, nPrefix, rLocalName, (enum XMLTextPElemTokens)nToken,
    1739           0 :             rHints);
    1740           0 :         break;
    1741             : 
    1742             :     case XML_TOK_TEXTP_CHANGE_START:
    1743             :     case XML_TOK_TEXTP_CHANGE_END:
    1744             :     case XML_TOK_TEXTP_CHANGE:
    1745             :         pContext = new XMLChangeImportContext(
    1746             :             rImport, nPrefix, rLocalName,
    1747             :             (nToken != XML_TOK_TEXTP_CHANGE_END),
    1748             :             (nToken != XML_TOK_TEXTP_CHANGE_START),
    1749          28 :             false);
    1750          28 :         break;
    1751             : 
    1752             :     case XML_TOK_TEXT_META:
    1753             :         pContext = new XMLMetaImportContext(rImport, nPrefix, rLocalName,
    1754          38 :             rHints, rIgnoreLeadingSpace );
    1755          38 :         break;
    1756             : 
    1757             :     case XML_TOK_TEXT_META_FIELD:
    1758             :         pContext = new XMLMetaFieldImportContext(rImport, nPrefix, rLocalName,
    1759          42 :             rHints, rIgnoreLeadingSpace );
    1760          42 :         break;
    1761             : 
    1762             :     default:
    1763             :         // none of the above? then it's probably  a text field!
    1764             :         pContext =
    1765             :             XMLTextFieldImportContext::CreateTextFieldImportContext(
    1766        5896 :                 rImport, *rImport.GetTextImport().get(), nPrefix, rLocalName,
    1767        5896 :                 nToken);
    1768             :         // #108784# import draw elements (except control shapes in headers)
    1769        9052 :         if( pContext == NULL &&
    1770        3266 :             !( rImport.GetTextImport()->IsInHeaderFooter() &&
    1771             :                nPrefix == XML_NAMESPACE_DRAW &&
    1772           6 :                IsXMLToken( rLocalName, XML_CONTROL ) ) )
    1773             :         {
    1774         104 :             Reference < XShapes > xShapes;
    1775             :             SvXMLShapeContext* pShapeContext = rImport.GetShapeImport()->CreateGroupChildContext(
    1776         104 :                 rImport, nPrefix, rLocalName, xAttrList, xShapes );
    1777         104 :             pContext = pShapeContext;
    1778             :             // OD 2004-04-20 #i26791# - keep shape in a text frame hint to
    1779             :             // adjust its anchor position, if its at-character anchored
    1780             :             Reference < XTextRange > xAnchorPos =
    1781         208 :                 rImport.GetTextImport()->GetCursor()->getStart();
    1782         208 :             rHints.push_back( new XMLDrawHint_Impl( pShapeContext, xAnchorPos ) );
    1783             :         }
    1784        2948 :         if( !pContext )
    1785             :         {
    1786             :             // ignore unknown content
    1787             :             pContext =
    1788           0 :                 new SvXMLImportContext( rImport, nPrefix, rLocalName );
    1789             :         }
    1790             :         // Behind fields, shapes and any unknown content blanks aren't ignored
    1791        2948 :         rIgnoreLeadingSpace = false;
    1792             :     }
    1793             : 
    1794       21594 :     return pContext;
    1795             : }
    1796             : 
    1797        4272 : SvXMLImportContext *XMLImpSpanContext_Impl::CreateChildContext(
    1798             :         sal_uInt16 nPrefix, const OUString& rLocalName,
    1799             :         const Reference< xml::sax::XAttributeList > & xAttrList )
    1800             : {
    1801             :     const SvXMLTokenMap& rTokenMap =
    1802        4272 :         GetImport().GetTextImport()->GetTextPElemTokenMap();
    1803        4272 :     sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName );
    1804             : 
    1805        4272 :     return CreateChildContext( GetImport(), nPrefix, rLocalName, xAttrList,
    1806             :                                nToken, rHints, rIgnoreLeadingSpace
    1807             :                                ,nStarFontsConvFlags
    1808        8544 :                              );
    1809             : }
    1810             : 
    1811        9132 : void XMLImpSpanContext_Impl::Characters( const OUString& rChars )
    1812             : {
    1813        9132 :     OUString sStyleName;
    1814        9132 :     if( pHint )
    1815        9132 :         sStyleName = pHint->GetStyleName();
    1816             :     OUString sChars =
    1817        9132 :         GetImport().GetTextImport()->ConvertStarFonts( rChars, sStyleName,
    1818             :                                                        nStarFontsConvFlags,
    1819       27396 :                                                        false, GetImport() );
    1820       18264 :     GetImport().GetTextImport()->InsertString( sChars, rIgnoreLeadingSpace );
    1821        9132 : }
    1822             : 
    1823           0 : TYPEINIT1( XMLParaContext, SvXMLImportContext );
    1824             : 
    1825       10688 : XMLParaContext::XMLParaContext(
    1826             :         SvXMLImport& rImport,
    1827             :         sal_uInt16 nPrfx,
    1828             :         const OUString& rLName,
    1829             :         const Reference< xml::sax::XAttributeList > & xAttrList,
    1830             :         bool bHead ) :
    1831             :     SvXMLImportContext( rImport, nPrfx, rLName ),
    1832       21376 :     xStart( rImport.GetTextImport()->GetCursorAsRange()->getStart() ),
    1833             :     m_bHaveAbout(false),
    1834       10688 :     nOutlineLevel( IsXMLToken( rLName, XML_H ) ? 1 : -1 ),
    1835             :     pHints( 0 ),
    1836             :     // Lost outline numbering in master document (#i73509#)
    1837             :     mbOutlineLevelAttrFound( false ),
    1838             :     bIgnoreLeadingSpace( true ),
    1839             :     bHeading( bHead ),
    1840             :     bIsListHeader( false ),
    1841             :     bIsRestart (false),
    1842             :     nStartValue(0),
    1843       42752 :     nStarFontsConvFlags( 0 )
    1844             : {
    1845             :     const SvXMLTokenMap& rTokenMap =
    1846       10688 :         GetImport().GetTextImport()->GetTextPAttrTokenMap();
    1847             : 
    1848       10688 :     bool bHaveXmlId( false );
    1849       21376 :     OUString aCondStyleName, sClassNames;
    1850             : 
    1851       10688 :     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
    1852       19536 :     for( sal_Int16 i=0; i < nAttrCount; i++ )
    1853             :     {
    1854        8848 :         const OUString& rAttrName = xAttrList->getNameByIndex( i );
    1855       17696 :         const OUString& rValue = xAttrList->getValueByIndex( i );
    1856             : 
    1857       17696 :         OUString aLocalName;
    1858             :         sal_uInt16 nPrefix =
    1859        8848 :             GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
    1860        8848 :                                                             &aLocalName );
    1861        8848 :         switch( rTokenMap.Get( nPrefix, aLocalName ) )
    1862             :         {
    1863             :         case XML_TOK_TEXT_P_XMLID:
    1864          30 :             m_sXmlId = rValue;
    1865          30 :             bHaveXmlId = true;
    1866          30 :             break;
    1867             :         case XML_TOK_TEXT_P_ABOUT:
    1868          68 :             m_sAbout = rValue;
    1869          68 :             m_bHaveAbout = true;
    1870          68 :             break;
    1871             :         case XML_TOK_TEXT_P_PROPERTY:
    1872          68 :             m_sProperty = rValue;
    1873          68 :             break;
    1874             :         case XML_TOK_TEXT_P_CONTENT:
    1875          20 :             m_sContent = rValue;
    1876          20 :             break;
    1877             :         case XML_TOK_TEXT_P_DATATYPE:
    1878          14 :             m_sDatatype = rValue;
    1879          14 :             break;
    1880             :         case XML_TOK_TEXT_P_TEXTID:
    1881           0 :             if (!bHaveXmlId) { m_sXmlId = rValue; }
    1882           0 :             break;
    1883             :         case XML_TOK_TEXT_P_STYLE_NAME:
    1884        8502 :             sStyleName = rValue;
    1885        8502 :             break;
    1886             :         case XML_TOK_TEXT_P_CLASS_NAMES:
    1887           0 :             sClassNames = rValue;
    1888           0 :             break;
    1889             :         case XML_TOK_TEXT_P_COND_STYLE_NAME:
    1890           0 :             aCondStyleName = rValue;
    1891           0 :             break;
    1892             :         case XML_TOK_TEXT_P_LEVEL:
    1893             :             {
    1894          76 :                 sal_Int32 nTmp = rValue.toInt32();
    1895          76 :                 if( nTmp > 0L )
    1896             :                 {
    1897          76 :                     if( nTmp > 127 )
    1898           0 :                         nTmp = 127;
    1899          76 :                     nOutlineLevel = (sal_Int8)nTmp;
    1900             :                 }
    1901             :                 // Lost outline numbering in master document (#i73509#)
    1902          76 :                 mbOutlineLevelAttrFound = true;
    1903             :             }
    1904          76 :             break;
    1905             :         case XML_TOK_TEXT_P_IS_LIST_HEADER:
    1906             :             {
    1907           0 :                 bool bBool(false);
    1908           0 :                 if( ::sax::Converter::convertBool( bBool, rValue ) )
    1909             :                 {
    1910           0 :                     bIsListHeader = bBool;
    1911             :                 }
    1912             :             }
    1913           0 :             break;
    1914             :         case XML_TOK_TEXT_P_RESTART_NUMBERING:
    1915             :             {
    1916           2 :                 bool bBool(false);
    1917           2 :                 if (::sax::Converter::convertBool(bBool, rValue))
    1918             :                 {
    1919           2 :                     bIsRestart = bBool;
    1920             :                 }
    1921             :             }
    1922           2 :             break;
    1923             :         case XML_TOK_TEXT_P_START_VALUE:
    1924             :             {
    1925             :                 nStartValue = sal::static_int_cast< sal_Int16 >(
    1926           2 :                     rValue.toInt32());
    1927             :             }
    1928           2 :             break;
    1929             :         }
    1930        8848 :     }
    1931             : 
    1932       10688 :     if( !aCondStyleName.isEmpty() )
    1933           0 :         sStyleName = aCondStyleName;
    1934       10688 :     else if( !sClassNames.isEmpty() )
    1935             :     {
    1936           0 :         sal_Int32 nDummy = 0;
    1937           0 :         sStyleName = sClassNames.getToken( 0, ' ', nDummy );
    1938       10688 :     }
    1939       10688 : }
    1940             : 
    1941       32064 : XMLParaContext::~XMLParaContext()
    1942             : {
    1943             :     rtl::Reference < XMLTextImportHelper > xTxtImport(
    1944       10688 :         GetImport().GetTextImport());
    1945       21376 :     Reference < XTextRange > xCrsrRange( xTxtImport->GetCursorAsRange() );
    1946       10688 :     if( !xCrsrRange.is() )
    1947           0 :         return; // Robust (defect file)
    1948       21376 :     Reference < XTextRange > xEnd(xCrsrRange->getStart());
    1949             : 
    1950             :     // if we have an id set for this paragraph, get a cursor for this
    1951             :     // paragraph and register it with the given identifier
    1952             :     // FIXME: this is just temporary, and should be removed when
    1953             :     // EditEngine paragraphs implement XMetadatable!
    1954       10688 :     if (!m_sXmlId.isEmpty())
    1955             :     {
    1956          30 :         Reference < XTextCursor > xIdCursor( xTxtImport->GetText()->createTextCursorByRange( xStart ) );
    1957          30 :         if( xIdCursor.is() )
    1958             :         {
    1959          30 :             xIdCursor->gotoRange( xEnd, sal_True );
    1960          30 :             GetImport().getInterfaceToIdentifierMapper().registerReference(
    1961          60 :                 m_sXmlId, Reference<XInterface>( xIdCursor, UNO_QUERY ));
    1962          30 :         }
    1963             :     }
    1964             : 
    1965             :     // insert a paragraph break
    1966       10688 :     xTxtImport->InsertControlCharacter( ControlCharacter::APPEND_PARAGRAPH );
    1967             : 
    1968             :     // create a cursor that select the whole last paragraph
    1969       21376 :     Reference < XTextCursor > xAttrCursor;
    1970             :     try {
    1971       10688 :         xAttrCursor = xTxtImport->GetText()->createTextCursorByRange( xStart );
    1972       10688 :         if( !xAttrCursor.is() )
    1973           0 :             return; // Robust (defect file)
    1974           0 :     } catch (const uno::Exception &) {
    1975             :         // createTextCursorByRange() likes to throw runtime exception, even
    1976             :         // though it just means 'we were unable to create the cursor'
    1977           0 :         return;
    1978             :     }
    1979       10688 :     xAttrCursor->gotoRange( xEnd, sal_True );
    1980             : 
    1981             :     // xml:id for RDF metadata
    1982       10688 :     if (!m_sXmlId.isEmpty() || m_bHaveAbout || !m_sProperty.isEmpty())
    1983             :     {
    1984             :         try {
    1985             :             const uno::Reference<container::XEnumerationAccess> xEA
    1986          72 :                 (xAttrCursor, uno::UNO_QUERY_THROW);
    1987             :             const uno::Reference<container::XEnumeration> xEnum(
    1988         144 :                 xEA->createEnumeration(), uno::UNO_QUERY_THROW);
    1989             :             SAL_WARN_IF(!xEnum->hasMoreElements(), "xmloff.text", "xml:id: no paragraph?");
    1990          72 :             if (xEnum->hasMoreElements()) {
    1991          72 :                 uno::Reference<rdf::XMetadatable> xMeta;
    1992          72 :                 xEnum->nextElement() >>= xMeta;
    1993             :                 SAL_WARN_IF(!xMeta.is(), "xmloff.text", "xml:id: not XMetadatable");
    1994          72 :                 GetImport().SetXmlId(xMeta, m_sXmlId);
    1995          72 :                 if (m_bHaveAbout)
    1996             :                 {
    1997          68 :                     GetImport().AddRDFa(xMeta,
    1998         136 :                         m_sAbout, m_sProperty, m_sContent, m_sDatatype);
    1999             :                 }
    2000          72 :                 SAL_WARN_IF(xEnum->hasMoreElements(), "xmloff.text", "xml:id: > 1 paragraph?");
    2001          72 :             }
    2002           0 :         } catch (const uno::Exception &) {
    2003             :             SAL_INFO("xmloff.text", "XMLParaContext::~XMLParaContext: exception");
    2004             :         }
    2005             :     }
    2006             : 
    2007       21376 :     OUString const sCellParaStyleName(xTxtImport->GetCellParaStyleDefault());
    2008       10688 :     if( !sCellParaStyleName.isEmpty() )
    2009             :     {
    2010             :         /* Suppress handling of outline and list attributes,
    2011             :            because of side effects of method <SetStyleAndAttrs(..)> (#i80724#)
    2012             :         */
    2013         932 :         xTxtImport->SetStyleAndAttrs( GetImport(), xAttrCursor,
    2014             :                                       sCellParaStyleName,
    2015             :                                       true,
    2016             :                                       false, -1, // suppress outline handling
    2017         932 :                                       false );   // suppress list attributes handling
    2018             :     }
    2019             : 
    2020             :     // #103445# for headings without style name, find the proper style
    2021       10688 :     if( bHeading && sStyleName.isEmpty() )
    2022           0 :         xTxtImport->FindOutlineStyleName( sStyleName, nOutlineLevel );
    2023             : 
    2024             :     // set style and hard attributes at the previous paragraph
    2025             :     // Add parameter <mbOutlineLevelAttrFound> (#i73509#)
    2026       21376 :     sStyleName = xTxtImport->SetStyleAndAttrs( GetImport(), xAttrCursor,
    2027             :                                                sStyleName,
    2028             :                                                true,
    2029             :                                                mbOutlineLevelAttrFound,
    2030       10688 :                                                bHeading ? nOutlineLevel : -1 );
    2031             : 
    2032             :     // handle list style header
    2033       10688 :     if (bHeading && (bIsListHeader || bIsRestart))
    2034             :     {
    2035           2 :         Reference<XPropertySet> xPropSet( xAttrCursor, UNO_QUERY );
    2036             : 
    2037           2 :         if (xPropSet.is())
    2038             :         {
    2039           2 :             if (bIsListHeader)
    2040             :             {
    2041             :                 OUString sNumberingIsNumber
    2042           0 :                     ("NumberingIsNumber");
    2043           0 :                 if(xPropSet->getPropertySetInfo()->
    2044           0 :                    hasPropertyByName(sNumberingIsNumber))
    2045             :                 {
    2046           0 :                     xPropSet->setPropertyValue
    2047           0 :                         (sNumberingIsNumber, makeAny( false ) );
    2048           0 :                 }
    2049             :             }
    2050           2 :             if (bIsRestart)
    2051             :             {
    2052             :                 OUString sParaIsNumberingRestart
    2053           2 :                     ("ParaIsNumberingRestart");
    2054             :                 OUString sNumberingStartValue
    2055           4 :                     ("NumberingStartValue");
    2056           4 :                 if (xPropSet->getPropertySetInfo()->
    2057           2 :                     hasPropertyByName(sParaIsNumberingRestart))
    2058             :                 {
    2059           2 :                     xPropSet->setPropertyValue
    2060           2 :                         (sParaIsNumberingRestart, makeAny(true));
    2061             :                 }
    2062             : 
    2063           4 :                 if (xPropSet->getPropertySetInfo()->
    2064           2 :                     hasPropertyByName(sNumberingStartValue))
    2065             :                 {
    2066           2 :                     xPropSet->setPropertyValue
    2067           2 :                         (sNumberingStartValue, makeAny(nStartValue));
    2068           2 :                 }
    2069             :             }
    2070             : 
    2071           2 :         }
    2072             :     }
    2073             : 
    2074       10688 :     if( pHints && !pHints->empty() )
    2075             :     {
    2076       16434 :         for( sal_uInt16 i=0; i<pHints->size(); i++ )
    2077             :         {
    2078       10278 :             XMLHint_Impl *pHint = &(*pHints)[i];
    2079       10278 :             xAttrCursor->gotoRange( pHint->GetStart(), sal_False );
    2080       10278 :             xAttrCursor->gotoRange( pHint->GetEnd(), sal_True );
    2081       10278 :             switch( pHint->GetType() )
    2082             :             {
    2083             :             case XML_HINT_STYLE:
    2084             :                 {
    2085             :                     const OUString& rStyleName =
    2086       10144 :                             static_cast<XMLStyleHint_Impl *>(pHint)->GetStyleName();
    2087       10144 :                     if( !rStyleName.isEmpty() )
    2088       10144 :                         xTxtImport->SetStyleAndAttrs( GetImport(),
    2089             :                                                       xAttrCursor, rStyleName,
    2090       10144 :                                                       false );
    2091             :                 }
    2092       10144 :                 break;
    2093             :             case XML_HINT_REFERENCE:
    2094             :                 {
    2095             :                     const OUString& rRefName =
    2096           0 :                             static_cast<XMLReferenceHint_Impl *>(pHint)->GetRefName();
    2097           0 :                     if( !rRefName.isEmpty() )
    2098             :                     {
    2099           0 :                         if( !pHint->GetEnd().is() )
    2100           0 :                             pHint->SetEnd(xEnd);
    2101             : 
    2102             :                         // reference name uses rStyleName member
    2103             :                         // borrow from XMLTextMarkImportContext
    2104             :                         XMLTextMarkImportContext::CreateAndInsertMark(
    2105           0 :                             GetImport(),
    2106             :                             OUString( "com.sun.star.text.ReferenceMark"),
    2107             :                             rRefName,
    2108           0 :                             xAttrCursor);
    2109             :                     }
    2110             :                 }
    2111           0 :                 break;
    2112             :             case XML_HINT_HYPERLINK:
    2113             :                 {
    2114             :                     const XMLHyperlinkHint_Impl *pHHint =
    2115           8 :                         static_cast<const XMLHyperlinkHint_Impl *>(pHint);
    2116           8 :                     xTxtImport->SetHyperlink( GetImport(),
    2117             :                                               xAttrCursor,
    2118           8 :                                               pHHint->GetHRef(),
    2119           8 :                                               pHHint->GetName(),
    2120           8 :                                               pHHint->GetTargetFrameName(),
    2121           8 :                                               pHHint->GetStyleName(),
    2122           8 :                                               pHHint->GetVisitedStyleName(),
    2123          16 :                                               pHHint->GetEventsContext() );
    2124             :                 }
    2125           8 :                 break;
    2126             :             case XML_HINT_INDEX_MARK:
    2127             :                 {
    2128             :                     Reference<beans::XPropertySet> xMark(
    2129           0 :                         static_cast<const XMLIndexMarkHint_Impl *>(pHint)->GetMark());
    2130           0 :                     Reference<XTextContent> xContent(xMark, UNO_QUERY);
    2131           0 :                     xTxtImport->GetText()->insertTextContent(
    2132           0 :                         xAttrCursor, xContent, sal_True );
    2133             :                 }
    2134           0 :                 break;
    2135             :             case XML_HINT_TEXT_FRAME:
    2136             :                 {
    2137             :                     const XMLTextFrameHint_Impl *pFHint =
    2138          22 :                         static_cast<const XMLTextFrameHint_Impl *>(pHint);
    2139             :                     // Check for text content (#i33242#)
    2140             :                     Reference < XTextContent > xTextContent =
    2141          22 :                                                     pFHint->GetTextContent();
    2142          22 :                     if ( xTextContent.is() )
    2143             :                     {
    2144             :                         /* Core impl. of the unification of drawing objects and
    2145             :                            Writer fly frames (#i26791#)
    2146             :                         */
    2147          22 :                         if ( pFHint->IsBoundAtChar() )
    2148             :                         {
    2149          18 :                             xTextContent->attach( xAttrCursor );
    2150             :                         }
    2151             :                     }
    2152             :                     /* Consider, that hint can also contain a shape -
    2153             :                        e.g. drawing object of type 'Text'. (#i33242#)
    2154             :                     */
    2155             :                     else
    2156             :                     {
    2157           0 :                         Reference < XShape > xShape = pFHint->GetShape();
    2158           0 :                         if ( xShape.is() )
    2159             :                         {
    2160             :                             // determine anchor type
    2161           0 :                             Reference < XPropertySet > xPropSet( xShape, UNO_QUERY );
    2162             :                             TextContentAnchorType eAnchorType =
    2163           0 :                                             TextContentAnchorType_AT_PARAGRAPH;
    2164             :                             {
    2165           0 :                                 OUString sAnchorType( "AnchorType"  );
    2166           0 :                                 Any aAny = xPropSet->getPropertyValue( sAnchorType );
    2167           0 :                                 aAny >>= eAnchorType;
    2168             :                             }
    2169           0 :                             if ( TextContentAnchorType_AT_CHARACTER == eAnchorType )
    2170             :                             {
    2171             :                                 // set anchor position for at-character anchored objects
    2172           0 :                                 Reference<XTextRange> xRange(xAttrCursor, UNO_QUERY);
    2173           0 :                                 Any aPos;
    2174           0 :                                 aPos <<= xRange;
    2175           0 :                                 OUString sTextRange( "TextRange"  );
    2176           0 :                                 xPropSet->setPropertyValue(sTextRange, aPos);
    2177           0 :                             }
    2178           0 :                         }
    2179          22 :                     }
    2180             :                 }
    2181          22 :                 break;
    2182             :             /* Core impl. of the unification of drawing objects and
    2183             :                Writer fly frames (#i26791#)
    2184             :             */
    2185             :             case XML_HINT_DRAW:
    2186             :                 {
    2187             :                     const XMLDrawHint_Impl *pDHint =
    2188         104 :                         static_cast<const XMLDrawHint_Impl*>(pHint);
    2189             :                     // Improvement: hint directly provides the shape. (#i33242#)
    2190         104 :                     Reference < XShape > xShape = pDHint->GetShape();
    2191         104 :                     if ( xShape.is() )
    2192             :                     {
    2193             :                         // determine anchor type
    2194          86 :                         Reference < XPropertySet > xPropSet( xShape, UNO_QUERY );
    2195          86 :                         TextContentAnchorType eAnchorType = TextContentAnchorType_AT_PARAGRAPH;
    2196             :                         {
    2197          86 :                             OUString sAnchorType( "AnchorType"  );
    2198         172 :                             Any aAny = xPropSet->getPropertyValue( sAnchorType );
    2199         172 :                             aAny >>= eAnchorType;
    2200             :                         }
    2201          86 :                         if ( TextContentAnchorType_AT_CHARACTER == eAnchorType )
    2202             :                         {
    2203             :                             // set anchor position for at-character anchored objects
    2204           0 :                             Reference<XTextRange> xRange(xAttrCursor, UNO_QUERY);
    2205           0 :                             Any aPos;
    2206           0 :                             aPos <<= xRange;
    2207           0 :                             OUString sTextRange( "TextRange"  );
    2208           0 :                             xPropSet->setPropertyValue(sTextRange, aPos);
    2209          86 :                         }
    2210         104 :                     }
    2211             :                 }
    2212         104 :                 break;
    2213             :             default:
    2214             :                 SAL_WARN( "xmloff.text", "What's this" );
    2215           0 :                 break;
    2216             :             }
    2217             :         }
    2218             :     }
    2219       21376 :     delete pHints;
    2220       21376 : }
    2221             : 
    2222       17278 : SvXMLImportContext *XMLParaContext::CreateChildContext(
    2223             :         sal_uInt16 nPrefix, const OUString& rLocalName,
    2224             :         const Reference< xml::sax::XAttributeList > & xAttrList )
    2225             : {
    2226             :     const SvXMLTokenMap& rTokenMap =
    2227       17278 :         GetImport().GetTextImport()->GetTextPElemTokenMap();
    2228       17278 :     sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName );
    2229       17278 :     if( !pHints )
    2230        8200 :         pHints = new XMLHints_Impl;
    2231             :     return XMLImpSpanContext_Impl::CreateChildContext(
    2232       17278 :                                 GetImport(), nPrefix, rLocalName, xAttrList,
    2233             :                                    nToken, *pHints, bIgnoreLeadingSpace
    2234             :                                 , nStarFontsConvFlags
    2235       34556 :                                                      );
    2236             : }
    2237             : 
    2238        8646 : void XMLParaContext::Characters( const OUString& rChars )
    2239             : {
    2240             :     OUString sChars =
    2241        8646 :         GetImport().GetTextImport()->ConvertStarFonts( rChars, sStyleName,
    2242             :                                                        nStarFontsConvFlags,
    2243       17292 :                                                        true, GetImport() );
    2244        8646 :     GetImport().GetTextImport()->InsertString( sChars, bIgnoreLeadingSpace );
    2245        8646 : }
    2246             : 
    2247           0 : TYPEINIT1( XMLNumberedParaContext, SvXMLImportContext );
    2248             : 
    2249           0 : XMLNumberedParaContext::XMLNumberedParaContext(
    2250             :         SvXMLImport& i_rImport,
    2251             :         sal_uInt16 i_nPrefix,
    2252             :         const OUString& i_rLocalName,
    2253             :         const Reference< xml::sax::XAttributeList > & i_xAttrList ) :
    2254             :     SvXMLImportContext( i_rImport, i_nPrefix, i_rLocalName ),
    2255             :     m_Level(0),
    2256             :     m_StartValue(-1),
    2257             :     m_ListId(),
    2258           0 :     m_xNumRules()
    2259             : {
    2260           0 :     OUString StyleName;
    2261             : 
    2262             :     const SvXMLTokenMap& rTokenMap(
    2263           0 :         i_rImport.GetTextImport()->GetTextNumberedParagraphAttrTokenMap() );
    2264             : 
    2265           0 :     const sal_Int16 nAttrCount( i_xAttrList.is() ?
    2266           0 :         i_xAttrList->getLength() : 0 );
    2267           0 :     for ( sal_Int16 i=0; i < nAttrCount; i++ )
    2268             :     {
    2269           0 :         const OUString& rAttrName( i_xAttrList->getNameByIndex( i )  );
    2270           0 :         const OUString& rValue   ( i_xAttrList->getValueByIndex( i ) );
    2271             : 
    2272           0 :         OUString aLocalName;
    2273             :         const sal_uInt16 nPrefix(
    2274           0 :             GetImport().GetNamespaceMap().GetKeyByAttrName(
    2275           0 :                 rAttrName, &aLocalName ) );
    2276           0 :         switch( rTokenMap.Get( nPrefix, aLocalName ) )
    2277             :         {
    2278             :             case XML_TOK_TEXT_NUMBERED_PARAGRAPH_XMLID:
    2279           0 :                 m_XmlId = rValue;
    2280             : //FIXME: there is no UNO API for lists
    2281           0 :                 break;
    2282             :             case XML_TOK_TEXT_NUMBERED_PARAGRAPH_LIST_ID:
    2283           0 :                 m_ListId = rValue;
    2284           0 :                 break;
    2285             :             case XML_TOK_TEXT_NUMBERED_PARAGRAPH_LEVEL:
    2286             :                 {
    2287           0 :                     sal_Int32 nTmp = rValue.toInt32();
    2288           0 :                     if ( nTmp >= 1 && nTmp <= SHRT_MAX ) {
    2289           0 :                         m_Level = static_cast<sal_uInt16>(nTmp) - 1;
    2290             :                     }
    2291             :                 }
    2292           0 :                 break;
    2293             :             case XML_TOK_TEXT_NUMBERED_PARAGRAPH_STYLE_NAME:
    2294           0 :                 StyleName = rValue;
    2295           0 :                 break;
    2296             :             case XML_TOK_TEXT_NUMBERED_PARAGRAPH_CONTINUE_NUMBERING:
    2297             :                 // this attribute is deprecated
    2298             : //                ContinuteNumbering = IsXMLToken(rValue, XML_TRUE);
    2299           0 :                 break;
    2300             :             case XML_TOK_TEXT_NUMBERED_PARAGRAPH_START_VALUE:
    2301             :                 {
    2302           0 :                     sal_Int32 nTmp = rValue.toInt32();
    2303           0 :                     if ( nTmp >= 0 && nTmp <= SHRT_MAX ) {
    2304           0 :                         m_StartValue = static_cast<sal_Int16>(nTmp);
    2305             :                     }
    2306             :                 }
    2307           0 :                 break;
    2308             :         }
    2309           0 :     }
    2310             : 
    2311             :     XMLTextListsHelper& rTextListsHelper(
    2312           0 :         i_rImport.GetTextImport()->GetTextListHelper() );
    2313           0 :     if (m_ListId.isEmpty())
    2314             :       {
    2315             :         SAL_WARN_IF( i_rImport.GetODFVersion() == "1.2", "xmloff.text", "invalid numbered-paragraph: no list-id (1.2)" );
    2316           0 :         m_ListId = rTextListsHelper.GetNumberedParagraphListId(m_Level,
    2317           0 :             StyleName);
    2318             :         SAL_WARN_IF(m_ListId.isEmpty(), "xmloff.text", "numbered-paragraph: no ListId");
    2319           0 :         if (m_ListId.isEmpty()) {
    2320           0 :             return;
    2321             :         }
    2322             :     }
    2323           0 :     m_xNumRules = rTextListsHelper.EnsureNumberedParagraph( i_rImport,
    2324           0 :         m_ListId, m_Level, StyleName);
    2325             : 
    2326             :     SAL_WARN_IF(!m_xNumRules.is(), "xmloff.text", "numbered-paragraph: no NumRules");
    2327             : 
    2328           0 :     i_rImport.GetTextImport()->GetTextListHelper().PushListContext( this );
    2329             : }
    2330             : 
    2331           0 : XMLNumberedParaContext::~XMLNumberedParaContext()
    2332             : {
    2333           0 : }
    2334             : 
    2335           0 : void XMLNumberedParaContext::EndElement()
    2336             : {
    2337           0 :     if (!m_ListId.isEmpty()) {
    2338           0 :         GetImport().GetTextImport()->PopListContext();
    2339             :     }
    2340           0 : }
    2341             : 
    2342           0 : SvXMLImportContext *XMLNumberedParaContext::CreateChildContext(
    2343             :     sal_uInt16 i_nPrefix, const OUString& i_rLocalName,
    2344             :     const Reference< xml::sax::XAttributeList > & i_xAttrList )
    2345             : {
    2346           0 :     SvXMLImportContext *pContext( 0 );
    2347             : 
    2348           0 :     if ( XML_NAMESPACE_TEXT == i_nPrefix )
    2349             :     {
    2350           0 :         bool bIsHeader( IsXMLToken( i_rLocalName, XML_H ) );
    2351           0 :         if ( bIsHeader || IsXMLToken( i_rLocalName, XML_P ) )
    2352             :         {
    2353           0 :             pContext = new XMLParaContext( GetImport(),
    2354           0 :                 i_nPrefix, i_rLocalName, i_xAttrList, bIsHeader );
    2355             : // ignore text:number       } else if (IsXMLToken( i_rLocalName, XML_NUMBER )) {
    2356             :         }
    2357             :     }
    2358             : 
    2359           0 :     if (!pContext) {
    2360             :         pContext = SvXMLImportContext::CreateChildContext(
    2361           0 :             i_nPrefix, i_rLocalName, i_xAttrList );
    2362             :     }
    2363             : 
    2364           0 :     return pContext;
    2365             : }
    2366             : 
    2367             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10