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

Generated by: LCOV version 1.10