LCOV - code coverage report
Current view: top level - sw/source/core/fields - reffld.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 143 514 27.8 %
Date: 2012-08-25 Functions: 15 37 40.5 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 127 858 14.8 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*************************************************************************
       3                 :            :  *
       4                 :            :  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       5                 :            :  *
       6                 :            :  * Copyright 2000, 2010 Oracle and/or its affiliates.
       7                 :            :  *
       8                 :            :  * OpenOffice.org - a multi-platform office productivity suite
       9                 :            :  *
      10                 :            :  * This file is part of OpenOffice.org.
      11                 :            :  *
      12                 :            :  * OpenOffice.org is free software: you can redistribute it and/or modify
      13                 :            :  * it under the terms of the GNU Lesser General Public License version 3
      14                 :            :  * only, as published by the Free Software Foundation.
      15                 :            :  *
      16                 :            :  * OpenOffice.org is distributed in the hope that it will be useful,
      17                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      18                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19                 :            :  * GNU Lesser General Public License version 3 for more details
      20                 :            :  * (a copy is included in the LICENSE file that accompanied this code).
      21                 :            :  *
      22                 :            :  * You should have received a copy of the GNU Lesser General Public License
      23                 :            :  * version 3 along with OpenOffice.org.  If not, see
      24                 :            :  * <http://www.openoffice.org/license.html>
      25                 :            :  * for a copy of the LGPLv3 License.
      26                 :            :  *
      27                 :            :  ************************************************************************/
      28                 :            : 
      29                 :            : #include <com/sun/star/text/ReferenceFieldPart.hpp>
      30                 :            : #include <com/sun/star/text/ReferenceFieldSource.hpp>
      31                 :            : #include <unotools/localedatawrapper.hxx>
      32                 :            : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      33                 :            : #include <comphelper/processfactory.hxx>
      34                 :            : #include <comphelper/string.hxx>
      35                 :            : #include <editeng/unolingu.hxx>
      36                 :            : #include <doc.hxx>
      37                 :            : #include <pam.hxx>
      38                 :            : #include <cntfrm.hxx>
      39                 :            : #include <pagefrm.hxx>
      40                 :            : #include <docary.hxx>
      41                 :            : #include <fmtfld.hxx>
      42                 :            : #include <txtfld.hxx>
      43                 :            : #include <txtftn.hxx>
      44                 :            : #include <fmtrfmrk.hxx>
      45                 :            : #include <txtrfmrk.hxx>
      46                 :            : #include <fmtftn.hxx>
      47                 :            : #include <ndtxt.hxx>
      48                 :            : #include <chpfld.hxx>
      49                 :            : #include <reffld.hxx>
      50                 :            : #include <expfld.hxx>
      51                 :            : #include <txtfrm.hxx>
      52                 :            : #include <flyfrm.hxx>
      53                 :            : #include <pagedesc.hxx>
      54                 :            : #include <IMark.hxx>
      55                 :            : #include <crossrefbookmark.hxx>
      56                 :            : #include <ftnidx.hxx>
      57                 :            : #include <viewsh.hxx>
      58                 :            : #include <unofldmid.h>
      59                 :            : #include <SwStyleNameMapper.hxx>
      60                 :            : #include <shellres.hxx>
      61                 :            : #include <poolfmt.hxx>
      62                 :            : #include <poolfmt.hrc>
      63                 :            : #include <comcore.hrc>
      64                 :            : #include <numrule.hxx>
      65                 :            : #include <SwNodeNum.hxx>
      66                 :            : #include <switerator.hxx>
      67                 :            : 
      68                 :            : #include <set>
      69                 :            : #include <map>
      70                 :            : #include <algorithm> // min, max
      71                 :            : 
      72                 :            : #include <sfx2/childwin.hxx>
      73                 :            : 
      74                 :            : using namespace ::com::sun::star;
      75                 :            : using namespace ::com::sun::star::text;
      76                 :            : using namespace ::com::sun::star::lang;
      77                 :            : using ::rtl::OUString;
      78                 :            : 
      79                 :            : extern void InsertSort( std::vector<sal_uInt16>& rArr, sal_uInt16 nIdx, sal_uInt16* pInsPos = 0 );
      80                 :            : 
      81                 :          0 : void lcl_GetLayTree( const SwFrm* pFrm, std::vector<const SwFrm*>& rArr )
      82                 :            : {
      83         [ #  # ]:          0 :     while( pFrm )
      84                 :            :     {
      85         [ #  # ]:          0 :         if( pFrm->IsBodyFrm() )     // soll uns nicht weiter interessieren
      86                 :          0 :             pFrm = pFrm->GetUpper();
      87                 :            :         else
      88                 :            :         {
      89                 :          0 :             rArr.push_back( pFrm );
      90                 :            : 
      91                 :            :             // bei der Seite ist schluss
      92         [ #  # ]:          0 :             if( pFrm->IsPageFrm() )
      93                 :          0 :                 break;
      94                 :            : 
      95         [ #  # ]:          0 :             if( pFrm->IsFlyFrm() )
      96                 :          0 :                 pFrm = ((SwFlyFrm*)pFrm)->GetAnchorFrm();
      97                 :            :             else
      98                 :          0 :                 pFrm = pFrm->GetUpper();
      99                 :            :         }
     100                 :            :     }
     101                 :          0 : }
     102                 :            : 
     103                 :            : 
     104                 :          0 : sal_Bool IsFrameBehind( const SwTxtNode& rMyNd, sal_uInt16 nMySttPos,
     105                 :            :                     const SwTxtNode& rBehindNd, sal_uInt16 nSttPos )
     106                 :            : {
     107 [ #  # ][ #  # ]:          0 :     const SwTxtFrm *pMyFrm = (SwTxtFrm*)rMyNd.getLayoutFrm( rMyNd.GetDoc()->GetCurrentLayout(), 0,0,sal_False),
     108 [ #  # ][ #  # ]:          0 :                    *pFrm = (SwTxtFrm*)rBehindNd.getLayoutFrm( rBehindNd.GetDoc()->GetCurrentLayout(), 0,0,sal_False);
     109                 :            : 
     110 [ #  # ][ #  # ]:          0 :     while( pFrm && !pFrm->IsInside( nSttPos ) )
         [ #  # ][ #  # ]
     111                 :          0 :         pFrm = (SwTxtFrm*)pFrm->GetFollow();
     112 [ #  # ][ #  # ]:          0 :     while( pMyFrm && !pMyFrm->IsInside( nMySttPos ) )
         [ #  # ][ #  # ]
     113                 :          0 :         pMyFrm = (SwTxtFrm*)pMyFrm->GetFollow();
     114                 :            : 
     115 [ #  # ][ #  # ]:          0 :     if( !pFrm || !pMyFrm || pFrm == pMyFrm )
                 [ #  # ]
     116                 :          0 :         return sal_False;
     117                 :            : 
     118 [ #  # ][ #  # ]:          0 :     std::vector<const SwFrm*> aRefArr, aArr;
     119         [ #  # ]:          0 :     ::lcl_GetLayTree( pFrm, aRefArr );
     120         [ #  # ]:          0 :     ::lcl_GetLayTree( pMyFrm, aArr );
     121                 :            : 
     122                 :          0 :     sal_uInt16 nRefCnt = aRefArr.size() - 1, nCnt = aArr.size() - 1;
     123                 :          0 :     sal_Bool bVert = sal_False;
     124                 :          0 :     sal_Bool bR2L = sal_False;
     125                 :            : 
     126                 :            :     // solange bis ein Frame ungleich ist ?
     127 [ #  # ][ #  # ]:          0 :     while( nRefCnt && nCnt && aRefArr[ nRefCnt ] == aArr[ nCnt ] )
         [ #  # ][ #  # ]
     128                 :            :     {
     129                 :          0 :         const SwFrm* pTmpFrm = aArr[ nCnt ];
     130         [ #  # ]:          0 :         bVert = pTmpFrm->IsVertical();
     131         [ #  # ]:          0 :         bR2L = pTmpFrm->IsRightToLeft();
     132                 :          0 :         --nCnt, --nRefCnt;
     133                 :            :     }
     134                 :            : 
     135                 :            :     // sollte einer der Counter ueberlaeufen?
     136         [ #  # ]:          0 :     if( aRefArr[ nRefCnt ] == aArr[ nCnt ] )
     137                 :            :     {
     138         [ #  # ]:          0 :         if( nCnt )
     139                 :          0 :             --nCnt;
     140                 :            :         else
     141                 :          0 :             --nRefCnt;
     142                 :            :     }
     143                 :            : 
     144                 :          0 :     const SwFrm* pRefFrm = aRefArr[ nRefCnt ];
     145                 :          0 :     const SwFrm* pFldFrm = aArr[ nCnt ];
     146                 :            : 
     147                 :            :     // unterschiedliche Frames, dann ueberpruefe deren Y-/X-Position
     148                 :          0 :     sal_Bool bRefIsLower = sal_False;
     149         [ #  # ]:          0 :     if( ( FRM_COLUMN | FRM_CELL ) & pFldFrm->GetType() ||
           [ #  #  #  # ]
     150                 :          0 :         ( FRM_COLUMN | FRM_CELL ) & pRefFrm->GetType() )
     151                 :            :     {
     152         [ #  # ]:          0 :         if( pFldFrm->GetType() == pRefFrm->GetType() )
     153                 :            :         {
     154                 :            :             // hier ist die X-Pos wichtiger!
     155         [ #  # ]:          0 :             if( bVert )
     156                 :            :             {
     157         [ #  # ]:          0 :                 if( bR2L )
     158                 :          0 :                     bRefIsLower = pRefFrm->Frm().Top() < pFldFrm->Frm().Top() ||
     159                 :          0 :                             ( pRefFrm->Frm().Top() == pFldFrm->Frm().Top() &&
     160         [ #  # ]:          0 :                               pRefFrm->Frm().Left() < pFldFrm->Frm().Left() );
           [ #  #  #  # ]
     161                 :            :                 else
     162                 :          0 :                     bRefIsLower = pRefFrm->Frm().Top() < pFldFrm->Frm().Top() ||
     163                 :          0 :                             ( pRefFrm->Frm().Top() == pFldFrm->Frm().Top() &&
     164         [ #  # ]:          0 :                               pRefFrm->Frm().Left() > pFldFrm->Frm().Left() );
           [ #  #  #  # ]
     165                 :            :             }
     166         [ #  # ]:          0 :             else if( bR2L )
     167                 :          0 :                 bRefIsLower = pRefFrm->Frm().Left() > pFldFrm->Frm().Left() ||
     168                 :          0 :                             ( pRefFrm->Frm().Left() == pFldFrm->Frm().Left() &&
     169         [ #  # ]:          0 :                               pRefFrm->Frm().Top() < pFldFrm->Frm().Top() );
           [ #  #  #  # ]
     170                 :            :             else
     171                 :          0 :                 bRefIsLower = pRefFrm->Frm().Left() < pFldFrm->Frm().Left() ||
     172                 :          0 :                             ( pRefFrm->Frm().Left() == pFldFrm->Frm().Left() &&
     173         [ #  # ]:          0 :                               pRefFrm->Frm().Top() < pFldFrm->Frm().Top() );
           [ #  #  #  # ]
     174                 :          0 :             pRefFrm = 0;
     175                 :            :         }
     176         [ #  # ]:          0 :         else if( ( FRM_COLUMN | FRM_CELL ) & pFldFrm->GetType() )
     177                 :          0 :             pFldFrm = aArr[ nCnt - 1 ];
     178                 :            :         else
     179                 :          0 :             pRefFrm = aRefArr[ nRefCnt - 1 ];
     180                 :            :     }
     181                 :            : 
     182         [ #  # ]:          0 :     if( pRefFrm )               // als Flag missbrauchen
     183                 :            :     {
     184         [ #  # ]:          0 :         if( bVert )
     185                 :            :         {
     186         [ #  # ]:          0 :             if( bR2L )
     187                 :          0 :                 bRefIsLower = pRefFrm->Frm().Left() < pFldFrm->Frm().Left() ||
     188                 :          0 :                             ( pRefFrm->Frm().Left() == pFldFrm->Frm().Left() &&
     189         [ #  # ]:          0 :                                 pRefFrm->Frm().Top() < pFldFrm->Frm().Top() );
           [ #  #  #  # ]
     190                 :            :             else
     191                 :          0 :                 bRefIsLower = pRefFrm->Frm().Left() > pFldFrm->Frm().Left() ||
     192                 :          0 :                             ( pRefFrm->Frm().Left() == pFldFrm->Frm().Left() &&
     193         [ #  # ]:          0 :                                 pRefFrm->Frm().Top() < pFldFrm->Frm().Top() );
           [ #  #  #  # ]
     194                 :            :         }
     195         [ #  # ]:          0 :         else if( bR2L )
     196                 :          0 :             bRefIsLower = pRefFrm->Frm().Top() < pFldFrm->Frm().Top() ||
     197                 :          0 :                         ( pRefFrm->Frm().Top() == pFldFrm->Frm().Top() &&
     198         [ #  # ]:          0 :                             pRefFrm->Frm().Left() > pFldFrm->Frm().Left() );
           [ #  #  #  # ]
     199                 :            :         else
     200                 :          0 :             bRefIsLower = pRefFrm->Frm().Top() < pFldFrm->Frm().Top() ||
     201                 :          0 :                         ( pRefFrm->Frm().Top() == pFldFrm->Frm().Top() &&
     202         [ #  # ]:          0 :                             pRefFrm->Frm().Left() < pFldFrm->Frm().Left() );
           [ #  #  #  # ]
     203                 :            :     }
     204                 :          0 :     return bRefIsLower;
     205                 :            : }
     206                 :            : 
     207                 :            : /*--------------------------------------------------------------------
     208                 :            :     Beschreibung: Referenzen holen
     209                 :            :  --------------------------------------------------------------------*/
     210                 :            : 
     211                 :            : 
     212                 :         76 : SwGetRefField::SwGetRefField( SwGetRefFieldType* pFldType,
     213                 :            :                               const String& rSetRef, sal_uInt16 nSubTyp,
     214                 :            :                               sal_uInt16 nSeqenceNo, sal_uLong nFmt )
     215                 :            :     : SwField( pFldType, nFmt ),
     216                 :            :       sSetRefName( rSetRef ),
     217                 :            :       nSubType( nSubTyp ),
     218 [ +  - ][ +  - ]:         76 :       nSeqNo( nSeqenceNo )
     219                 :            : {
     220                 :         76 : }
     221                 :            : 
     222         [ +  - ]:         76 : SwGetRefField::~SwGetRefField()
     223                 :            : {
     224         [ -  + ]:        152 : }
     225                 :            : 
     226                 :          0 : String SwGetRefField::GetDescription() const
     227                 :            : {
     228         [ #  # ]:          0 :     return SW_RES(STR_REFERENCE);
     229                 :            : }
     230                 :            : 
     231                 :          0 : sal_uInt16 SwGetRefField::GetSubType() const
     232                 :            : {
     233                 :          0 :     return nSubType;
     234                 :            : }
     235                 :            : 
     236                 :          0 : void SwGetRefField::SetSubType( sal_uInt16 n )
     237                 :            : {
     238                 :          0 :     nSubType = n;
     239                 :          0 : }
     240                 :            : 
     241                 :            : // #i81002#
     242                 :          0 : bool SwGetRefField::IsRefToHeadingCrossRefBookmark() const
     243                 :            : {
     244                 :          0 :     return GetSubType() == REF_BOOKMARK &&
     245 [ #  # ][ #  # ]:          0 :         ::sw::mark::CrossRefHeadingBookmark::IsLegalName(sSetRefName);
     246                 :            : }
     247                 :            : 
     248                 :          0 : bool SwGetRefField::IsRefToNumItemCrossRefBookmark() const
     249                 :            : {
     250                 :          0 :     return GetSubType() == REF_BOOKMARK &&
     251 [ #  # ][ #  # ]:          0 :         ::sw::mark::CrossRefNumItemBookmark::IsLegalName(sSetRefName);
     252                 :            : }
     253                 :            : 
     254                 :          0 : const SwTxtNode* SwGetRefField::GetReferencedTxtNode() const
     255                 :            : {
     256         [ #  # ]:          0 :     SwDoc* pDoc = dynamic_cast<SwGetRefFieldType*>(GetTyp())->GetDoc();
     257                 :          0 :     sal_uInt16 nDummy = USHRT_MAX;
     258 [ #  # ][ #  # ]:          0 :     return SwGetRefFieldType::FindAnchor( pDoc, sSetRefName, nSubType, nSeqNo, &nDummy );
                 [ #  # ]
     259                 :            : }
     260                 :            : // #i85090#
     261                 :          0 : String SwGetRefField::GetExpandedTxtOfReferencedTxtNode() const
     262                 :            : {
     263                 :          0 :     const SwTxtNode* pReferencedTxtNode( GetReferencedTxtNode() );
     264                 :            :     return pReferencedTxtNode
     265                 :            :            ? pReferencedTxtNode->GetExpandTxt( 0, STRING_LEN, true, true )
     266         [ #  # ]:          0 :            : aEmptyStr;
     267                 :            : }
     268                 :            : 
     269                 :        336 : String SwGetRefField::Expand() const
     270                 :            : {
     271                 :        336 :     return sTxt;
     272                 :            : }
     273                 :            : 
     274                 :            : 
     275                 :          0 : String SwGetRefField::GetFieldName() const
     276                 :            : {
     277 [ #  # ][ #  # ]:          0 :     if ( GetTyp()->GetName().getLength() > 0 || sSetRefName.getLength() > 0 )
                 [ #  # ]
     278                 :            :     {
     279 [ #  # ][ #  # ]:          0 :         String aStr(GetTyp()->GetName());
     280         [ #  # ]:          0 :         aStr += ' ';
     281         [ #  # ]:          0 :         aStr += sSetRefName;
     282 [ #  # ][ #  # ]:          0 :         return aStr;
     283                 :            :     }
     284                 :            :     else
     285                 :          0 :         return Expand();
     286                 :            : }
     287                 :            : 
     288                 :            : // #i81002# - parameter <pFldTxtAttr> added
     289                 :        248 : void SwGetRefField::UpdateField( const SwTxtFld* pFldTxtAttr )
     290                 :            : {
     291         [ +  - ]:        248 :     sTxt.Erase();
     292                 :            : 
     293                 :        248 :     SwDoc* pDoc = ((SwGetRefFieldType*)GetTyp())->GetDoc();
     294                 :            :     // finding the reference target (the number)
     295                 :            :     sal_uInt16 nNumStart, nNumEnd;
     296                 :            :     SwTxtNode* pTxtNd = SwGetRefFieldType::FindAnchor(
     297                 :            :         pDoc, sSetRefName, nSubType, nSeqNo, &nNumStart, &nNumEnd
     298 [ +  - ][ +  - ]:        248 :     );
                 [ +  - ]
     299                 :            :     // not found?
     300         [ -  + ]:        248 :     if ( !pTxtNd )
     301                 :            :     {
     302 [ #  # ][ #  # ]:          0 :         sTxt = ViewShell::GetShellRes()->aGetRefFld_RefItemNotFound;
     303                 :            :         return ;
     304                 :            :     }
     305                 :            :     // where is the category name (e.g. "Illustration")?
     306         [ +  - ]:        248 :     rtl::OUString const Text = pTxtNd->GetTxt();
     307                 :        248 :     unsigned const nCatStart = Text.indexOf(sSetRefName);
     308                 :            :     unsigned const nCatEnd = nCatStart == unsigned(-1) ?
     309         [ +  + ]:        248 :         unsigned(-1) : nCatStart + sSetRefName.getLength();
     310                 :        248 :     bool const bHasCat = nCatStart != unsigned(-1);
     311                 :            : 
     312                 :            :     // length of the referenced text
     313                 :        248 :     unsigned const nLen = Text.getLength();
     314                 :            : 
     315                 :            :     // which format?
     316   [ +  -  -  -  :        248 :     switch( GetFormat() )
                   +  - ]
     317                 :            :     {
     318                 :            :     case REF_CONTENT:
     319                 :            :     case REF_ONLYNUMBER:
     320                 :            :     case REF_ONLYCAPTION:
     321                 :            :     case REF_ONLYSEQNO:
     322                 :            :         {
     323                 :            :             // needed part of Text
     324                 :            :             unsigned nStart, nEnd;
     325                 :            : 
     326   [ -  +  -  -  :          8 :             switch( nSubType )
                      - ]
     327                 :            :             {
     328                 :            :             case REF_SEQUENCEFLD:
     329                 :            : 
     330   [ #  #  #  # ]:          0 :                 switch( GetFormat() )
     331                 :            :                 {
     332                 :            :                 // "Category and Number"
     333                 :            :                 case REF_ONLYNUMBER:
     334         [ #  # ]:          0 :                     if (bHasCat) {
     335         [ #  # ]:          0 :                         nStart = std::min<unsigned>(nNumStart, nCatStart);
     336         [ #  # ]:          0 :                         nEnd = std::max<unsigned>(nNumEnd, nCatEnd);
     337                 :            :                     } else {
     338                 :          0 :                         nStart = nNumStart;
     339                 :          0 :                         nEnd = nNumEnd;
     340                 :            :                     }
     341                 :          0 :                     break;
     342                 :            : 
     343                 :            :                 // "Caption Text"
     344                 :            :                 case REF_ONLYCAPTION: {
     345                 :            :                     // next alphanumeric character after category+number
     346         [ #  # ]:          0 :                     if (const SwTxtAttr* const pTxtAttr =
     347         [ #  # ]:          0 :                         pTxtNd->GetTxtAttrForCharAt(nNumStart, RES_TXTATR_FIELD)
     348                 :            :                     ) {
     349                 :            :                         // start searching from nFrom
     350                 :            :                         unsigned const nFrom = bHasCat ?
     351 [ #  # ][ #  # ]:          0 :                             std::max<unsigned>(nNumStart + 1, nCatEnd) : nNumStart + 1;
         [ #  # ][ #  # ]
     352                 :            :                         nStart = SwGetExpField::GetReferenceTextPos(
     353                 :          0 :                             pTxtAttr->GetFld(), *pDoc, nFrom
     354         [ #  # ]:          0 :                         );
     355                 :            :                     } else {
     356                 :            :                         nStart = bHasCat ?
     357 [ #  # ][ #  # ]:          0 :                             std::max<unsigned>(nNumEnd, nCatEnd) : nNumEnd;
         [ #  # ][ #  # ]
     358                 :            :                     }
     359                 :          0 :                     nEnd = nLen;
     360                 :          0 :                     break;
     361                 :            :                 }
     362                 :            : 
     363                 :            :                 // "Numbering"
     364                 :            :                 case REF_ONLYSEQNO:
     365                 :          0 :                     nStart = nNumStart;
     366         [ #  # ]:          0 :                     nEnd = std::min<unsigned>(nStart + 1, nLen);
     367                 :          0 :                     break;
     368                 :            : 
     369                 :            :                 // "Reference" (whole Text)
     370                 :            :                 default:
     371                 :          0 :                     nStart = 0;
     372                 :          0 :                     nEnd = nLen;
     373                 :          0 :                     break;
     374                 :            :                 }
     375                 :          0 :                 break;
     376                 :            : 
     377                 :            :             case REF_BOOKMARK:
     378                 :          8 :                 nStart = nNumStart;
     379                 :            :                 // Text steht ueber verschiedene Nodes verteilt.
     380                 :            :                 // Gesamten Text oder nur bis zum Ende vom Node?
     381         [ +  - ]:          8 :                 nEnd = nNumEnd == USHRT_MAX ? nLen : nNumEnd;
     382                 :          8 :                 break;
     383                 :            : 
     384                 :            :             case REF_OUTLINE:
     385                 :          0 :                 nStart = nNumStart;
     386                 :          0 :                 nEnd = nNumEnd;
     387                 :          0 :                 break;
     388                 :            : 
     389                 :            :             case REF_FOOTNOTE:
     390                 :            :             case REF_ENDNOTE:
     391                 :            :                 // die Nummer oder den NumString besorgen
     392         [ #  # ]:          0 :                 for( unsigned i = 0; i < pDoc->GetFtnIdxs().size(); ++i )
     393                 :            :                 {
     394         [ #  # ]:          0 :                     SwTxtFtn* const pFtnIdx = pDoc->GetFtnIdxs()[i];
     395         [ #  # ]:          0 :                     if( nSeqNo == pFtnIdx->GetSeqRefNo() )
     396                 :            :                     {
     397 [ #  # ][ #  # ]:          0 :                         sTxt = pFtnIdx->GetFtn().GetViewNumStr( *pDoc );
                 [ #  # ]
     398                 :          0 :                         break;
     399                 :            :                     }
     400                 :            :                 }
     401                 :            :                 return;
     402                 :            : 
     403                 :            :             default:
     404                 :          0 :                 nStart = nNumStart;
     405                 :          0 :                 nEnd = nNumEnd;
     406                 :          0 :                 break;
     407                 :            :             }
     408                 :            : 
     409         [ +  - ]:          8 :             if( nStart != nEnd ) // ein Bereich?
     410                 :            :             {
     411 [ +  - ][ +  - ]:          8 :                 sTxt = pTxtNd->GetExpandTxt( nStart, nEnd - nStart );
                 [ +  - ]
     412                 :            : 
     413                 :            :                 // alle Sonderzeichen entfernen (durch Blanks ersetzen):
     414         [ +  - ]:          8 :                 if( sTxt.Len() )
     415                 :            :                 {
     416 [ +  - ][ +  - ]:          8 :                     sTxt = comphelper::string::remove(sTxt, 0xad);
     417 [ +  + ][ +  - ]:         96 :                     for( sal_Unicode* p = sTxt.GetBufferAccess(); *p; ++p )
     418                 :            :                     {
     419         [ -  + ]:         88 :                         if( *p < 0x20 )
     420                 :          0 :                             *p = 0x20;
     421         [ -  + ]:         88 :                         else if(*p == 0x2011)
     422                 :          0 :                             *p = '-';
     423                 :            :                     }
     424                 :            :                 }
     425                 :            :             }
     426                 :            :         }
     427                 :          8 :         break;
     428                 :            : 
     429                 :            :     case REF_PAGE:
     430                 :            :     case REF_PAGE_PGDESC:
     431                 :            :         {
     432 [ #  # ][ #  # ]:          0 :             const SwTxtFrm* pFrm = (SwTxtFrm*)pTxtNd->getLayoutFrm( pDoc->GetCurrentLayout(), 0,0,sal_False),
     433                 :          0 :                         *pSave = pFrm;
     434 [ #  # ][ #  # ]:          0 :             while( pFrm && !pFrm->IsInside( nNumStart ) )
         [ #  # ][ #  # ]
     435                 :          0 :                 pFrm = (SwTxtFrm*)pFrm->GetFollow();
     436                 :            : 
     437 [ #  # ][ #  # ]:          0 :             if( pFrm || 0 != ( pFrm = pSave ))
                 [ #  # ]
     438                 :            :             {
     439         [ #  # ]:          0 :                 sal_uInt16 nPageNo = pFrm->GetVirtPageNum();
     440                 :            :                 const SwPageFrm *pPage;
     441 [ #  # ][ #  # ]:          0 :                 if( REF_PAGE_PGDESC == GetFormat() &&
           [ #  #  #  # ]
                 [ #  # ]
     442                 :          0 :                     0 != ( pPage = pFrm->FindPageFrm() ) &&
     443                 :          0 :                     pPage->GetPageDesc() )
     444 [ #  # ][ #  # ]:          0 :                     sTxt = pPage->GetPageDesc()->GetNumType().GetNumStr( nPageNo );
                 [ #  # ]
     445                 :            :                 else
     446 [ #  # ][ #  # ]:          0 :                     sTxt = String::CreateFromInt32(nPageNo);
                 [ #  # ]
     447                 :            :             }
     448                 :            :         }
     449                 :          0 :         break;
     450                 :            : 
     451                 :            :     case REF_CHAPTER:
     452                 :            :         {
     453                 :            :             // ein bischen trickreich: suche irgend einen Frame
     454 [ #  # ][ #  # ]:          0 :             const SwFrm* pFrm = pTxtNd->getLayoutFrm( pDoc->GetCurrentLayout() );
     455         [ #  # ]:          0 :             if( pFrm )
     456                 :            :             {
     457         [ #  # ]:          0 :                 SwChapterFieldType aFldTyp;
     458         [ #  # ]:          0 :                 SwChapterField aFld( &aFldTyp, 0 );
     459                 :          0 :                 aFld.SetLevel( MAXLEVEL - 1 );
     460         [ #  # ]:          0 :                 aFld.ChangeExpansion( pFrm, pTxtNd, sal_True );
     461 [ #  # ][ #  # ]:          0 :                 sTxt = aFld.GetNumber();
                 [ #  # ]
     462                 :            :             }
     463                 :            :         }
     464                 :          0 :         break;
     465                 :            : 
     466                 :            :     case REF_UPDOWN:
     467                 :            :         {
     468                 :            :             // #i81002#
     469                 :            :             // simplified: use parameter <pFldTxtAttr>
     470 [ #  # ][ #  # ]:          0 :             if( !pFldTxtAttr || !pFldTxtAttr->GetpTxtNode() )
                 [ #  # ]
     471                 :            :                 break;
     472                 :            : 
     473                 :            :             LocaleDataWrapper aLocaleData(
     474                 :            :                             ::comphelper::getProcessServiceFactory(),
     475 [ #  # ][ #  # ]:          0 :                             SvxCreateLocale( GetLanguage() ) );
                 [ #  # ]
     476                 :            : 
     477                 :            :             // erstmal ein "Kurz" - Test - falls beide im selben
     478                 :            :             // Node stehen!
     479         [ #  # ]:          0 :             if( pFldTxtAttr->GetpTxtNode() == pTxtNd )
     480                 :            :             {
     481                 :          0 :                 sTxt = nNumStart < *pFldTxtAttr->GetStart()
     482                 :            :                             ? aLocaleData.getAboveWord()
     483 [ #  # ][ #  # ]:          0 :                             : aLocaleData.getBelowWord();
         [ #  # ][ #  # ]
     484                 :            :                 break;
     485                 :            :             }
     486                 :            : 
     487                 :          0 :             sTxt = ::IsFrameBehind( *pFldTxtAttr->GetpTxtNode(), *pFldTxtAttr->GetStart(),
     488         [ #  # ]:          0 :                                     *pTxtNd, nNumStart )
     489                 :            :                         ? aLocaleData.getAboveWord()
     490 [ #  # ][ #  # ]:          0 :                         : aLocaleData.getBelowWord();
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     491                 :            :         }
     492                 :          0 :         break;
     493                 :            :     // #i81002#
     494                 :            :     case REF_NUMBER:
     495                 :            :     case REF_NUMBER_NO_CONTEXT:
     496                 :            :     case REF_NUMBER_FULL_CONTEXT:
     497                 :            :         {
     498 [ +  - ][ +  - ]:        240 :             if ( pFldTxtAttr && pFldTxtAttr->GetpTxtNode() )
                 [ +  - ]
     499                 :            :             {
     500 [ +  - ][ +  - ]:        240 :                 sTxt = MakeRefNumStr( pFldTxtAttr->GetTxtNode(), *pTxtNd, GetFormat() );
                 [ +  - ]
     501                 :            :             }
     502                 :            :         }
     503                 :        248 :         break;
     504                 :            :     default:
     505                 :            :         OSL_FAIL("<SwGetRefField::UpdateField(..)> - unknown format type");
     506         [ +  - ]:        248 :     }
     507                 :            : }
     508                 :            : 
     509                 :            : // #i81002#
     510                 :        240 : String SwGetRefField::MakeRefNumStr( const SwTxtNode& rTxtNodeOfField,
     511                 :            :                                      const SwTxtNode& rTxtNodeOfReferencedItem,
     512                 :            :                                      const sal_uInt32 nRefNumFormat ) const
     513                 :            : {
     514   [ +  -  +  - ]:        480 :     if ( rTxtNodeOfReferencedItem.HasNumber() &&
                 [ +  - ]
     515                 :        240 :          rTxtNodeOfReferencedItem.IsCountedInList() )
     516                 :            :     {
     517                 :            :         OSL_ENSURE( rTxtNodeOfReferencedItem.GetNum(),
     518                 :            :                 "<SwGetRefField::MakeRefNumStr(..)> - referenced paragraph has number, but no <SwNodeNum> instance --> please inform OD!" );
     519                 :            : 
     520                 :            :         // Determine, up to which level the superior list labels have to be
     521                 :            :         // included - default is to include all superior list labels.
     522                 :        240 :         sal_uInt8 nRestrictInclToThisLevel( 0 );
     523                 :            :         // Determine for format REF_NUMBER the level, up to which the superior
     524                 :            :         // list labels have to be restricted, if the text node of the reference
     525                 :            :         // field and the text node of the referenced item are in the same
     526                 :            :         // document context.
     527   [ +  +  +  -  :        648 :         if ( nRefNumFormat == REF_NUMBER &&
          +  -  +  -  +  
              - ][ +  + ]
     528                 :        102 :              rTxtNodeOfField.FindFlyStartNode()
     529                 :        102 :                             == rTxtNodeOfReferencedItem.FindFlyStartNode() &&
     530                 :        102 :              rTxtNodeOfField.FindFootnoteStartNode()
     531                 :        102 :                             == rTxtNodeOfReferencedItem.FindFootnoteStartNode() &&
     532                 :        102 :              rTxtNodeOfField.FindHeaderStartNode()
     533                 :        102 :                             == rTxtNodeOfReferencedItem.FindHeaderStartNode() &&
     534                 :        102 :              rTxtNodeOfField.FindFooterStartNode()
     535                 :        102 :                             == rTxtNodeOfReferencedItem.FindFooterStartNode() )
     536                 :            :         {
     537                 :        102 :             const SwNodeNum* pNodeNumForTxtNodeOfField( 0 );
     538   [ +  +  +  - ]:        150 :             if ( rTxtNodeOfField.HasNumber() &&
                 [ +  + ]
     539                 :         48 :                  rTxtNodeOfField.GetNumRule() == rTxtNodeOfReferencedItem.GetNumRule() )
     540                 :            :             {
     541                 :         48 :                 pNodeNumForTxtNodeOfField = rTxtNodeOfField.GetNum();
     542                 :            :             }
     543                 :            :             else
     544                 :            :             {
     545                 :            :                 pNodeNumForTxtNodeOfField =
     546                 :         54 :                     rTxtNodeOfReferencedItem.GetNum()->GetPrecedingNodeNumOf( rTxtNodeOfField );
     547                 :            :             }
     548         [ +  - ]:        102 :             if ( pNodeNumForTxtNodeOfField )
     549                 :            :             {
     550         [ +  - ]:        102 :                 const SwNumberTree::tNumberVector rFieldNumVec = pNodeNumForTxtNodeOfField->GetNumberVector();
     551         [ +  - ]:        102 :                 const SwNumberTree::tNumberVector rRefItemNumVec = rTxtNodeOfReferencedItem.GetNum()->GetNumberVector();
     552                 :        102 :                 sal_uInt8 nLevel( 0 );
     553 [ +  + ][ +  - ]:        192 :                 while ( nLevel < rFieldNumVec.size() && nLevel < rRefItemNumVec.size() )
                 [ +  + ]
     554                 :            :                 {
     555 [ +  - ][ +  - ]:        170 :                     if ( rRefItemNumVec[nLevel] == rFieldNumVec[nLevel] )
                 [ +  + ]
     556                 :            :                     {
     557                 :         90 :                         nRestrictInclToThisLevel = nLevel + 1;
     558                 :            :                     }
     559                 :            :                     else
     560                 :            :                     {
     561                 :         80 :                         break;
     562                 :            :                     }
     563                 :         90 :                     ++nLevel;
     564                 :        102 :                 }
     565                 :            :             }
     566                 :            :         }
     567                 :            : 
     568                 :            :         // Determine, if superior list labels have to be included
     569                 :            :         const bool bInclSuperiorNumLabels(
     570                 :        240 :             ( nRestrictInclToThisLevel < rTxtNodeOfReferencedItem.GetActualListLevel() &&
     571 [ +  + ][ +  + ]:        240 :               ( nRefNumFormat == REF_NUMBER || nRefNumFormat == REF_NUMBER_FULL_CONTEXT ) ) );
                 [ +  + ]
     572                 :            : 
     573                 :            :         OSL_ENSURE( rTxtNodeOfReferencedItem.GetNumRule(),
     574                 :            :                 "<SwGetRefField::MakeRefNumStr(..)> - referenced numbered paragraph has no numbering rule set --> please inform OD!" );
     575                 :            :         return rTxtNodeOfReferencedItem.GetNumRule()->MakeRefNumString(
     576                 :        240 :                                             *(rTxtNodeOfReferencedItem.GetNum()),
     577                 :            :                                             bInclSuperiorNumLabels,
     578                 :        240 :                                             nRestrictInclToThisLevel );
     579                 :            :     }
     580                 :            : 
     581                 :        240 :     return String();
     582                 :            : }
     583                 :            : 
     584                 :         62 : SwField* SwGetRefField::Copy() const
     585                 :            : {
     586                 :         62 :     SwGetRefField* pFld = new SwGetRefField( (SwGetRefFieldType*)GetTyp(),
     587                 :            :                                                 sSetRefName, nSubType,
     588 [ +  - ][ +  - ]:         62 :                                                 nSeqNo, GetFormat() );
     589                 :         62 :     pFld->sTxt = sTxt;
     590                 :         62 :     return pFld;
     591                 :            : }
     592                 :            : 
     593                 :            : /*--------------------------------------------------------------------
     594                 :            :     Beschreibung: ReferenzName holen
     595                 :            :  --------------------------------------------------------------------*/
     596                 :            : 
     597                 :            : 
     598                 :          0 : const rtl::OUString& SwGetRefField::GetPar1() const
     599                 :            : {
     600                 :          0 :     return sSetRefName;
     601                 :            : }
     602                 :            : 
     603                 :            : 
     604                 :          0 : void SwGetRefField::SetPar1( const rtl::OUString& rName )
     605                 :            : {
     606                 :          0 :     sSetRefName = rName;
     607                 :          0 : }
     608                 :            : 
     609                 :            : 
     610                 :          0 : rtl::OUString SwGetRefField::GetPar2() const
     611                 :            : {
     612         [ #  # ]:          0 :     return Expand();
     613                 :            : }
     614                 :            : 
     615                 :         36 : bool SwGetRefField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
     616                 :            : {
     617   [ +  -  -  -  :         36 :     switch( nWhichId )
                   -  - ]
     618                 :            :     {
     619                 :            :     case FIELD_PROP_USHORT1:
     620                 :            :         {
     621                 :         36 :             sal_Int16 nPart = 0;
     622   [ -  -  -  -  :         36 :             switch(GetFormat())
          -  -  -  -  +  
                +  -  - ]
     623                 :            :             {
     624                 :          0 :             case REF_PAGE       : nPart = ReferenceFieldPart::PAGE                ; break;
     625                 :          0 :             case REF_CHAPTER    : nPart = ReferenceFieldPart::CHAPTER             ; break;
     626                 :          0 :             case REF_CONTENT    : nPart = ReferenceFieldPart::TEXT                ; break;
     627                 :          0 :             case REF_UPDOWN     : nPart = ReferenceFieldPart::UP_DOWN             ; break;
     628                 :          0 :             case REF_PAGE_PGDESC: nPart = ReferenceFieldPart::PAGE_DESC           ; break;
     629                 :          0 :             case REF_ONLYNUMBER : nPart = ReferenceFieldPart::CATEGORY_AND_NUMBER ; break;
     630                 :          0 :             case REF_ONLYCAPTION: nPart = ReferenceFieldPart::ONLY_CAPTION        ; break;
     631                 :          0 :             case REF_ONLYSEQNO  : nPart = ReferenceFieldPart::ONLY_SEQUENCE_NUMBER; break;
     632                 :            :             // #i81002#
     633                 :         24 :             case REF_NUMBER:              nPart = ReferenceFieldPart::NUMBER;              break;
     634                 :         12 :             case REF_NUMBER_NO_CONTEXT:   nPart = ReferenceFieldPart::NUMBER_NO_CONTEXT;   break;
     635                 :          0 :             case REF_NUMBER_FULL_CONTEXT: nPart = ReferenceFieldPart::NUMBER_FULL_CONTEXT; break;
     636                 :            :             }
     637         [ +  - ]:         36 :             rAny <<= nPart;
     638                 :            :         }
     639                 :         36 :         break;
     640                 :            :     case FIELD_PROP_USHORT2:
     641                 :            :         {
     642                 :          0 :             sal_Int16 nSource = 0;
     643   [ #  #  #  #  :          0 :             switch(nSubType)
                #  #  # ]
     644                 :            :             {
     645                 :          0 :             case  REF_SETREFATTR : nSource = ReferenceFieldSource::REFERENCE_MARK; break;
     646                 :          0 :             case  REF_SEQUENCEFLD: nSource = ReferenceFieldSource::SEQUENCE_FIELD; break;
     647                 :          0 :             case  REF_BOOKMARK   : nSource = ReferenceFieldSource::BOOKMARK; break;
     648                 :          0 :             case  REF_OUTLINE    : OSL_FAIL("not implemented"); break;
     649                 :          0 :             case  REF_FOOTNOTE   : nSource = ReferenceFieldSource::FOOTNOTE; break;
     650                 :          0 :             case  REF_ENDNOTE    : nSource = ReferenceFieldSource::ENDNOTE; break;
     651                 :            :             }
     652         [ #  # ]:          0 :             rAny <<= nSource;
     653                 :            :         }
     654                 :          0 :         break;
     655                 :            :     case FIELD_PROP_PAR1:
     656                 :            :     {
     657 [ #  # ][ #  # ]:          0 :         String  sTmp(GetPar1());
     658         [ #  # ]:          0 :         if(REF_SEQUENCEFLD == nSubType)
     659                 :            :         {
     660         [ #  # ]:          0 :             sal_uInt16 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( sTmp, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
     661         [ #  # ]:          0 :             switch( nPoolId )
     662                 :            :             {
     663                 :            :                 case RES_POOLCOLL_LABEL_ABB:
     664                 :            :                 case RES_POOLCOLL_LABEL_TABLE:
     665                 :            :                 case RES_POOLCOLL_LABEL_FRAME:
     666                 :            :                 case RES_POOLCOLL_LABEL_DRAWING:
     667         [ #  # ]:          0 :                     SwStyleNameMapper::FillProgName(nPoolId, sTmp) ;
     668                 :          0 :                 break;
     669                 :            :             }
     670                 :            :         }
     671 [ #  # ][ #  # ]:          0 :         rAny <<= rtl::OUString(sTmp);
                 [ #  # ]
     672                 :            :     }
     673                 :          0 :     break;
     674                 :            :     case FIELD_PROP_PAR3:
     675 [ #  # ][ #  # ]:          0 :         rAny <<= rtl::OUString(Expand());
     676                 :          0 :         break;
     677                 :            :     case FIELD_PROP_SHORT1:
     678         [ #  # ]:          0 :         rAny <<= (sal_Int16)nSeqNo;
     679                 :          0 :         break;
     680                 :            :     default:
     681                 :            :         OSL_FAIL("illegal property");
     682                 :            :     }
     683                 :         36 :     return true;
     684                 :            : }
     685                 :            : 
     686                 :         78 : bool SwGetRefField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
     687                 :            : {
     688         [ +  - ]:         78 :     String sTmp;
     689   [ +  +  -  -  :         78 :     switch( nWhichId )
                   +  - ]
     690                 :            :     {
     691                 :            :     case FIELD_PROP_USHORT1:
     692                 :            :         {
     693                 :         50 :             sal_Int16 nPart = 0;
     694                 :         50 :             rAny >>= nPart;
     695   [ -  -  +  -  :         50 :             switch(nPart)
          -  -  -  -  +  
                +  +  - ]
     696                 :            :             {
     697                 :          0 :             case ReferenceFieldPart::PAGE:                  nPart = REF_PAGE; break;
     698                 :          0 :             case ReferenceFieldPart::CHAPTER:               nPart = REF_CHAPTER; break;
     699                 :          2 :             case ReferenceFieldPart::TEXT:                  nPart = REF_CONTENT; break;
     700                 :          0 :             case ReferenceFieldPart::UP_DOWN:               nPart = REF_UPDOWN; break;
     701                 :          0 :             case ReferenceFieldPart::PAGE_DESC:             nPart = REF_PAGE_PGDESC; break;
     702                 :          0 :             case ReferenceFieldPart::CATEGORY_AND_NUMBER:   nPart = REF_ONLYNUMBER; break;
     703                 :          0 :             case ReferenceFieldPart::ONLY_CAPTION:          nPart = REF_ONLYCAPTION; break;
     704                 :          0 :             case ReferenceFieldPart::ONLY_SEQUENCE_NUMBER : nPart = REF_ONLYSEQNO; break;
     705                 :            :             // #i81002#
     706                 :         24 :             case ReferenceFieldPart::NUMBER:              nPart = REF_NUMBER;              break;
     707                 :         12 :             case ReferenceFieldPart::NUMBER_NO_CONTEXT:   nPart = REF_NUMBER_NO_CONTEXT;   break;
     708                 :         12 :             case ReferenceFieldPart::NUMBER_FULL_CONTEXT: nPart = REF_NUMBER_FULL_CONTEXT; break;
     709                 :          0 :             default: return false;
     710                 :            :             }
     711                 :         50 :             SetFormat(nPart);
     712                 :            :         }
     713                 :         50 :         break;
     714                 :            :     case FIELD_PROP_USHORT2:
     715                 :            :         {
     716                 :         14 :             sal_Int16 nSource = 0;
     717                 :         14 :             rAny >>= nSource;
     718   [ -  -  +  -  :         14 :             switch(nSource)
                   -  - ]
     719                 :            :             {
     720                 :          0 :             case ReferenceFieldSource::REFERENCE_MARK : nSubType = REF_SETREFATTR ; break;
     721                 :            :             case ReferenceFieldSource::SEQUENCE_FIELD :
     722                 :            :             {
     723         [ #  # ]:          0 :                 if(REF_SEQUENCEFLD == nSubType)
     724                 :          0 :                     break;
     725                 :          0 :                 nSubType = REF_SEQUENCEFLD;
     726         [ #  # ]:          0 :                 ConvertProgrammaticToUIName();
     727                 :            :             }
     728                 :          0 :             break;
     729                 :         14 :             case ReferenceFieldSource::BOOKMARK       : nSubType = REF_BOOKMARK   ; break;
     730                 :          0 :             case ReferenceFieldSource::FOOTNOTE       : nSubType = REF_FOOTNOTE   ; break;
     731                 :          0 :             case ReferenceFieldSource::ENDNOTE        : nSubType = REF_ENDNOTE    ; break;
     732                 :            :             }
     733                 :            :         }
     734                 :         14 :         break;
     735                 :            :     case FIELD_PROP_PAR1:
     736                 :            :     {
     737                 :          0 :         OUString sTmpStr;
     738                 :          0 :         rAny >>= sTmpStr;
     739         [ #  # ]:          0 :         SetPar1(sTmpStr);
     740         [ #  # ]:          0 :         ConvertProgrammaticToUIName();
     741                 :            :     }
     742                 :          0 :     break;
     743                 :            :     case FIELD_PROP_PAR3:
     744 [ #  # ][ #  # ]:          0 :         SetExpand( ::GetString( rAny, sTmp ));
     745                 :          0 :         break;
     746                 :            :     case FIELD_PROP_SHORT1:
     747                 :            :         {
     748                 :         14 :             sal_Int16 nSetSeq = 0;
     749                 :         14 :             rAny >>= nSetSeq;
     750         [ +  - ]:         14 :             if(nSetSeq >= 0)
     751                 :         14 :                 nSeqNo = nSetSeq;
     752                 :            :         }
     753                 :         14 :         break;
     754                 :            :     default:
     755                 :            :         OSL_FAIL("illegal property");
     756                 :            :     }
     757         [ +  - ]:         78 :     return true;
     758                 :            : }
     759                 :            : 
     760                 :          0 : void SwGetRefField::ConvertProgrammaticToUIName()
     761                 :            : {
     762 [ #  # ][ #  # ]:          0 :     if(GetTyp() && REF_SEQUENCEFLD == nSubType)
                 [ #  # ]
     763                 :            :     {
     764                 :          0 :         SwDoc* pDoc = ((SwGetRefFieldType*)GetTyp())->GetDoc();
     765                 :          0 :         const String& rPar1 = GetPar1();
     766                 :            :         //don't convert when the name points to an existing field type
     767 [ #  # ][ #  # ]:          0 :         if(!pDoc->GetFldType(RES_SETEXPFLD, rPar1, false))
     768                 :            :         {
     769         [ #  # ]:          0 :             sal_uInt16 nPoolId = SwStyleNameMapper::GetPoolIdFromProgName( rPar1, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
     770                 :          0 :             sal_uInt16 nResId = USHRT_MAX;
     771   [ #  #  #  #  :          0 :             switch( nPoolId )
                      # ]
     772                 :            :             {
     773                 :            :                 case RES_POOLCOLL_LABEL_ABB:
     774                 :          0 :                     nResId = STR_POOLCOLL_LABEL_ABB;
     775                 :          0 :                 break;
     776                 :            :                 case RES_POOLCOLL_LABEL_TABLE:
     777                 :          0 :                     nResId = STR_POOLCOLL_LABEL_TABLE;
     778                 :          0 :                 break;
     779                 :            :                 case RES_POOLCOLL_LABEL_FRAME:
     780                 :          0 :                     nResId = STR_POOLCOLL_LABEL_FRAME;
     781                 :          0 :                 break;
     782                 :            :                 case RES_POOLCOLL_LABEL_DRAWING:
     783                 :          0 :                     nResId = STR_POOLCOLL_LABEL_DRAWING;
     784                 :          0 :                 break;
     785                 :            :             }
     786         [ #  # ]:          0 :             if( nResId != USHRT_MAX )
     787 [ #  # ][ #  # ]:          0 :                 SetPar1(SW_RESSTR( nResId ));
     788                 :          0 :         }
     789                 :            :     }
     790                 :          0 : }
     791                 :            : 
     792                 :       1549 : SwGetRefFieldType::SwGetRefFieldType( SwDoc* pDc )
     793                 :       1549 :     : SwFieldType( RES_GETREFFLD ), pDoc( pDc )
     794                 :       1549 : {}
     795                 :            : 
     796                 :            : 
     797                 :          0 : SwFieldType* SwGetRefFieldType::Copy() const
     798                 :            : {
     799         [ #  # ]:          0 :     return new SwGetRefFieldType( pDoc );
     800                 :            : }
     801                 :            : 
     802                 :            : 
     803                 :        133 : void SwGetRefFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
     804                 :            : {
     805                 :            :     // Update auf alle GetReferenz-Felder
     806 [ +  - ][ +  - ]:        133 :     if( !pNew && !pOld )
     807                 :            :     {
     808         [ +  - ]:        133 :         SwIterator<SwFmtFld,SwFieldType> aIter( *this );
     809 [ +  - ][ +  - ]:        381 :         for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() )
                 [ +  + ]
     810                 :            :         {
     811                 :            :             // nur die GetRef-Felder Updaten
     812                 :            :             //JP 3.4.2001: Task 71231 - we need the correct language
     813                 :        248 :             SwGetRefField* pGRef = (SwGetRefField*)pFld->GetFld();
     814                 :            :             const SwTxtFld* pTFld;
     815   [ -  +  #  # ]:        248 :             if( !pGRef->GetLanguage() &&
         [ -  + ][ +  + ]
     816                 :            :                 0 != ( pTFld = pFld->GetTxtFld()) &&
     817                 :          0 :                 pTFld->GetpTxtNode() )
     818                 :            :             {
     819                 :            :                 pGRef->SetLanguage( pTFld->GetpTxtNode()->GetLang(
     820 [ #  # ][ #  # ]:          0 :                                                 *pTFld->GetStart() ) );
     821                 :            :             }
     822                 :            : 
     823                 :            :             // #i81002#
     824         [ +  - ]:        248 :             pGRef->UpdateField( pFld->GetTxtFld() );
     825         [ +  - ]:        133 :         }
     826                 :            :     }
     827                 :            :     // weiter an die Text-Felder, diese "Expandieren" den Text
     828                 :        133 :     NotifyClients( pOld, pNew );
     829                 :        133 : }
     830                 :            : 
     831                 :        248 : SwTxtNode* SwGetRefFieldType::FindAnchor( SwDoc* pDoc, const String& rRefMark,
     832                 :            :                                         sal_uInt16 nSubType, sal_uInt16 nSeqNo,
     833                 :            :                                         sal_uInt16* pStt, sal_uInt16* pEnd )
     834                 :            : {
     835                 :            :     OSL_ENSURE( pStt, "warum wird keine StartPos abgefragt?" );
     836                 :            : 
     837                 :        248 :     SwTxtNode* pTxtNd = 0;
     838   [ -  -  +  -  :        248 :     switch( nSubType )
                   -  - ]
     839                 :            :     {
     840                 :            :     case REF_SETREFATTR:
     841                 :            :         {
     842                 :          0 :             const SwFmtRefMark *pRef = pDoc->GetRefMark( rRefMark );
     843 [ #  # ][ #  # ]:          0 :             if( pRef && pRef->GetTxtRefMark() )
                 [ #  # ]
     844                 :            :             {
     845                 :          0 :                 pTxtNd = (SwTxtNode*)&pRef->GetTxtRefMark()->GetTxtNode();
     846                 :          0 :                 *pStt = *pRef->GetTxtRefMark()->GetStart();
     847         [ #  # ]:          0 :                 if( pEnd )
     848                 :          0 :                     *pEnd = *pRef->GetTxtRefMark()->GetAnyEnd();
     849                 :            :             }
     850                 :            :         }
     851                 :          0 :         break;
     852                 :            : 
     853                 :            :     case REF_SEQUENCEFLD:
     854                 :            :         {
     855                 :          0 :             SwFieldType* pFldType = pDoc->GetFldType( RES_SETEXPFLD, rRefMark, false );
     856   [ #  #  #  # ]:          0 :             if( pFldType && pFldType->GetDepends() &&
         [ #  # ][ #  # ]
     857                 :          0 :                 nsSwGetSetExpType::GSE_SEQ & ((SwSetExpFieldType*)pFldType)->GetType() )
     858                 :            :             {
     859         [ #  # ]:          0 :                 SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType );
     860 [ #  # ][ #  # ]:          0 :                 for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() )
                 [ #  # ]
     861                 :            :                 {
     862   [ #  #  #  # ]:          0 :                     if( pFld->GetTxtFld() && nSeqNo ==
                 [ #  # ]
     863                 :          0 :                         ((SwSetExpField*)pFld->GetFld())->GetSeqNumber() )
     864                 :            :                     {
     865                 :          0 :                         SwTxtFld* pTxtFld = pFld->GetTxtFld();
     866                 :          0 :                         pTxtNd = (SwTxtNode*)pTxtFld->GetpTxtNode();
     867                 :          0 :                         *pStt = *pTxtFld->GetStart();
     868         [ #  # ]:          0 :                         if( pEnd )
     869                 :          0 :                             *pEnd = (*pStt) + 1;
     870                 :          0 :                         break;
     871                 :            :                     }
     872         [ #  # ]:          0 :                 }
     873                 :            :             }
     874                 :            :         }
     875                 :          0 :         break;
     876                 :            : 
     877                 :            :     case REF_BOOKMARK:
     878                 :            :         {
     879 [ +  - ][ +  - ]:        248 :             IDocumentMarkAccess::const_iterator_t ppMark = pDoc->getIDocumentMarkAccess()->findMark(rRefMark);
                 [ +  - ]
     880 [ +  - ][ +  - ]:        248 :             if(ppMark != pDoc->getIDocumentMarkAccess()->getMarksEnd())
         [ +  - ][ +  - ]
     881                 :            :             {
     882                 :        248 :                 const ::sw::mark::IMark* pBkmk = ppMark->get();
     883         [ +  - ]:        248 :                 const SwPosition* pPos = &pBkmk->GetMarkStart();
     884                 :            : 
     885                 :        248 :                 pTxtNd = pPos->nNode.GetNode().GetTxtNode();
     886                 :        248 :                 *pStt = pPos->nContent.GetIndex();
     887         [ +  - ]:        248 :                 if(pEnd)
     888                 :            :                 {
     889 [ +  - ][ +  - ]:        248 :                     if(!pBkmk->IsExpanded())
     890                 :            :                     {
     891                 :        248 :                         *pEnd = *pStt;
     892                 :            :                         // #i81002#
     893 [ +  - ][ +  - ]:        248 :                         if(dynamic_cast< ::sw::mark::CrossRefBookmark const *>(pBkmk))
                 [ +  - ]
     894                 :            :                         {
     895                 :            :                             OSL_ENSURE( pTxtNd,
     896                 :            :                                     "<SwGetRefFieldType::FindAnchor(..)> - node marked by cross-reference bookmark isn't a text node --> crash" );
     897         [ +  - ]:        248 :                             *pEnd = pTxtNd->Len();
     898                 :            :                         }
     899                 :            :                     }
     900 [ #  # ][ #  # ]:          0 :                     else if(pBkmk->GetOtherMarkPos().nNode == pBkmk->GetMarkPos().nNode)
                 [ #  # ]
     901         [ #  # ]:          0 :                         *pEnd = pBkmk->GetMarkEnd().nContent.GetIndex();
     902                 :            :                     else
     903                 :          0 :                         *pEnd = USHRT_MAX;
     904                 :            :                 }
     905                 :            :             }
     906                 :            :         }
     907                 :        248 :         break;
     908                 :            : 
     909                 :            :     case REF_OUTLINE:
     910                 :          0 :         break;
     911                 :            : 
     912                 :            :     case REF_FOOTNOTE:
     913                 :            :     case REF_ENDNOTE:
     914                 :            :         {
     915                 :          0 :             sal_uInt16 n, nFtnCnt = pDoc->GetFtnIdxs().size();
     916                 :            :             SwTxtFtn* pFtnIdx;
     917         [ #  # ]:          0 :             for( n = 0; n < nFtnCnt; ++n )
     918         [ #  # ]:          0 :                 if( nSeqNo == (pFtnIdx = pDoc->GetFtnIdxs()[ n ])->GetSeqRefNo() )
     919                 :            :                 {
     920                 :          0 :                     SwNodeIndex* pIdx = pFtnIdx->GetStartNode();
     921         [ #  # ]:          0 :                     if( pIdx )
     922                 :            :                     {
     923         [ #  # ]:          0 :                         SwNodeIndex aIdx( *pIdx, 1 );
     924         [ #  # ]:          0 :                         if( 0 == ( pTxtNd = aIdx.GetNode().GetTxtNode()))
     925 [ #  # ][ #  # ]:          0 :                             pTxtNd = (SwTxtNode*)pDoc->GetNodes().GoNext( &aIdx );
                 [ #  # ]
     926                 :            :                     }
     927                 :          0 :                     *pStt = 0;
     928         [ #  # ]:          0 :                     if( pEnd )
     929                 :          0 :                         *pEnd = 0;
     930                 :          0 :                     break;
     931                 :            :                 }
     932                 :            :         }
     933                 :          0 :         break;
     934                 :            :     }
     935                 :            : 
     936                 :        248 :     return pTxtNd;
     937                 :            : }
     938                 :            : 
     939                 :            : 
     940                 :         14 : struct _RefIdsMap
     941                 :            : {
     942                 :            : private:
     943                 :            :     String aName;
     944                 :            :     std::set<sal_uInt16> aIds;
     945                 :            :     std::set<sal_uInt16> aDstIds;
     946                 :            :     std::map<sal_uInt16, sal_uInt16> sequencedIds; /// ID numbers sorted by sequence number.
     947                 :            :     sal_Bool bInit;
     948                 :            : 
     949                 :            :     void       Init(SwDoc& rDoc, SwDoc& rDestDoc, sal_Bool bField );
     950                 :            :     void       GetNoteIdsFromDoc( SwDoc& rDoc, std::set<sal_uInt16> &rIds );
     951                 :            :     void       GetFieldIdsFromDoc( SwDoc& rDoc, std::set<sal_uInt16> &rIds );
     952                 :            :     void       AddId( sal_uInt16 id, sal_uInt16 seqNum );
     953                 :            :     sal_uInt16 GetFirstUnusedId( std::set<sal_uInt16> &rIds );
     954                 :            : 
     955                 :            : public:
     956 [ +  - ][ +  - ]:         14 :     _RefIdsMap( const String& rName ) : aName( rName ), bInit( sal_False ) {}
                 [ +  - ]
     957                 :            : 
     958                 :            :     void Check( SwDoc& rDoc, SwDoc& rDestDoc, SwGetRefField& rFld, sal_Bool bField );
     959                 :            : 
     960                 :          0 :     String GetName() { return aName; }
     961                 :            : };
     962                 :            : 
     963                 :            : typedef boost::ptr_vector<_RefIdsMap> _RefIdsMaps;
     964                 :            : 
     965                 :            : /// Get a sorted list of the field IDs from a document.
     966                 :            : /// @param[in]     rDoc The document to search.
     967                 :            : /// @param[in,out] rIds The list of IDs found in the document.
     968                 :          0 : void _RefIdsMap::GetFieldIdsFromDoc( SwDoc& rDoc, std::set<sal_uInt16> &rIds)
     969                 :            : {
     970                 :            :     const SwTxtNode* pNd;
     971                 :            :     SwFieldType* pType;
     972                 :            : 
     973         [ #  # ]:          0 :     if( 0 != ( pType = rDoc.GetFldType( RES_SETEXPFLD, aName, false ) ))
     974                 :            :     {
     975         [ #  # ]:          0 :         SwIterator<SwFmtFld,SwFieldType> aIter( *pType );
     976 [ #  # ][ #  # ]:          0 :         for( SwFmtFld* pF = aIter.First(); pF; pF = aIter.Next() )
                 [ #  # ]
     977   [ #  #  #  # ]:          0 :             if( pF->GetTxtFld() &&
         [ #  # ][ #  # ]
     978                 :          0 :                 0 != ( pNd = pF->GetTxtFld()->GetpTxtNode() ) &&
     979         [ #  # ]:          0 :                 pNd->GetNodes().IsDocNodes() )
     980 [ #  # ][ #  # ]:          0 :                 rIds.insert( ((SwSetExpField*)pF->GetFld())->GetSeqNumber() );
     981                 :            :     }
     982                 :          0 : }
     983                 :            : 
     984                 :            : /// Get a sorted list of the footnote/endnote IDs from a document.
     985                 :            : /// @param[in]     rDoc The document to search.
     986                 :            : /// @param[in,out] rIds The list of IDs found in the document.
     987                 :          0 : void _RefIdsMap::GetNoteIdsFromDoc( SwDoc& rDoc, std::set<sal_uInt16> &rIds)
     988                 :            : {
     989         [ #  # ]:          0 :     for( sal_uInt16 n = rDoc.GetFtnIdxs().size(); n; )
     990         [ #  # ]:          0 :         rIds.insert( rDoc.GetFtnIdxs()[ --n ]->GetSeqRefNo() );
     991                 :          0 : }
     992                 :            : 
     993                 :            : /// Initialise the aIds and aDestIds collections from the source documents.
     994                 :            : /// @param[in] rDoc     The source document.
     995                 :            : /// @param[in] rDestDoc The destination document.
     996                 :            : /// @param[in] bField   True if we're interested in all fields, false for footnotes.
     997                 :          0 : void _RefIdsMap::Init( SwDoc& rDoc, SwDoc& rDestDoc, sal_Bool bField )
     998                 :            : {
     999         [ #  # ]:          0 :     if( bInit )
    1000                 :          0 :         return;
    1001                 :            : 
    1002         [ #  # ]:          0 :     if( bField )
    1003                 :            :     {
    1004                 :          0 :         GetFieldIdsFromDoc( rDestDoc, aIds );
    1005                 :          0 :         GetFieldIdsFromDoc( rDoc, aDstIds );
    1006                 :            : 
    1007                 :            :         // Define the mappings now
    1008                 :          0 :         sal_uInt16 nMaxDstId = -1;
    1009         [ #  # ]:          0 :         if ( !aIds.empty() )
    1010         [ #  # ]:          0 :             nMaxDstId = *aIds.rbegin();
    1011                 :            : 
    1012                 :            :         // Map all the src fields to their value + nMaxDstId
    1013 [ #  # ][ #  # ]:          0 :         for ( std::set<sal_uInt16>::iterator pIt = aDstIds.begin(); pIt != aDstIds.end(); ++pIt )
                 [ #  # ]
    1014 [ #  # ][ #  # ]:          0 :             AddId( ++nMaxDstId, *pIt );
    1015                 :            : 
    1016                 :            :         // Change the Sequence number of all the SetExp fields in the destination document
    1017                 :          0 :         SwFieldType* pType = rDoc.GetFldType( RES_SETEXPFLD, aName, false );
    1018         [ #  # ]:          0 :         if( pType )
    1019                 :            :         {
    1020         [ #  # ]:          0 :             SwIterator<SwFmtFld,SwFieldType> aIter( *pType );
    1021 [ #  # ][ #  # ]:          0 :             for( SwFmtFld* pF = aIter.First(); pF; pF = aIter.Next() )
                 [ #  # ]
    1022         [ #  # ]:          0 :                 if( pF->GetTxtFld() )
    1023                 :            :                 {
    1024                 :          0 :                     sal_uInt16 n = ((SwSetExpField*)pF->GetFld())->GetSeqNumber( );
    1025         [ #  # ]:          0 :                     ((SwSetExpField*)pF->GetFld())->SetSeqNumber( sequencedIds[ n ] );
    1026         [ #  # ]:          0 :                 }
    1027                 :            :         }
    1028                 :            :     }
    1029                 :            :     else
    1030                 :            :     {
    1031                 :          0 :         GetNoteIdsFromDoc( rDestDoc, aIds );
    1032                 :          0 :         GetNoteIdsFromDoc( rDoc, aDstIds );
    1033                 :            :     }
    1034                 :          0 :     bInit = sal_True;
    1035                 :            : }
    1036                 :            : 
    1037                 :            : /// Get the lowest unused ID in the passed set.
    1038                 :            : /// @param[in] rIds The set of used ID numbers.
    1039                 :            : /// @returns The lowest unused ID.
    1040                 :          0 : sal_uInt16 _RefIdsMap::GetFirstUnusedId( std::set<sal_uInt16> &rIds )
    1041                 :            : {
    1042                 :          0 :     sal_uInt16 num(0);
    1043         [ #  # ]:          0 :     std::set<sal_uInt16>::iterator it;
    1044                 :            : 
    1045 [ #  # ][ #  # ]:          0 :     for( it = rIds.begin(); it != rIds.end(); ++it )
                 [ #  # ]
    1046                 :            :     {
    1047 [ #  # ][ #  # ]:          0 :         if( num != *it )
    1048                 :            :         {
    1049                 :          0 :             return num;
    1050                 :            :         }
    1051                 :          0 :         ++num;
    1052                 :            :     }
    1053                 :          0 :     return num;
    1054                 :            : }
    1055                 :            : 
    1056                 :            : /// Add a new ID and sequence number to the "occupied" collection.
    1057                 :            : /// @param[in] id     The ID number.
    1058                 :            : /// @param[in] seqNum The sequence number.
    1059                 :          0 : void _RefIdsMap::AddId( sal_uInt16 id, sal_uInt16 seqNum )
    1060                 :            : {
    1061                 :          0 :     aIds.insert( id );
    1062                 :          0 :     sequencedIds[ seqNum ] = id;
    1063                 :          0 : }
    1064                 :            : 
    1065                 :          0 : void _RefIdsMap::Check( SwDoc& rDoc, SwDoc& rDestDoc, SwGetRefField& rFld,
    1066                 :            :                         sal_Bool bField )
    1067                 :            : {
    1068         [ #  # ]:          0 :     Init( rDoc, rDestDoc, bField);
    1069                 :            : 
    1070                 :            :     // dann teste mal, ob die Nummer schon vergeben ist
    1071                 :            :     // oder ob eine neue bestimmt werden muss.
    1072                 :          0 :     sal_uInt16 nSeqNo = rFld.GetSeqNo();
    1073 [ #  # ][ #  # ]:          0 :     if( aIds.count( nSeqNo ) && aDstIds.count( nSeqNo ))
         [ #  # ][ #  # ]
                 [ #  # ]
    1074                 :            :     {
    1075                 :            :         // Number already taken, so need a new one.
    1076 [ #  # ][ #  # ]:          0 :         if( sequencedIds.count(nSeqNo) )
    1077         [ #  # ]:          0 :             rFld.SetSeqNo( sequencedIds[nSeqNo] );
    1078                 :            :         else
    1079                 :            :         {
    1080         [ #  # ]:          0 :             sal_uInt16 n = GetFirstUnusedId( aIds );
    1081                 :            : 
    1082                 :            :             // die neue SeqNo eintragen, damit die "belegt" ist
    1083         [ #  # ]:          0 :             AddId( n, nSeqNo );
    1084                 :          0 :             rFld.SetSeqNo( n );
    1085                 :            : 
    1086                 :            :             // und noch die Fuss-/EndNote auf die neue Id umsetzen
    1087         [ #  # ]:          0 :             if( !bField )
    1088                 :            :             {
    1089                 :            :                 SwTxtFtn* pFtnIdx;
    1090         [ #  # ]:          0 :                 for( sal_uInt16 i = 0, nCnt = rDoc.GetFtnIdxs().size(); i < nCnt; ++i )
    1091 [ #  # ][ #  # ]:          0 :                     if( nSeqNo == (pFtnIdx = rDoc.GetFtnIdxs()[ i ])->GetSeqRefNo() )
    1092                 :            :                     {
    1093                 :          0 :                         pFtnIdx->SetSeqNo( n );
    1094                 :          0 :                         break;
    1095                 :            :                     }
    1096                 :            :             }
    1097                 :            :         }
    1098                 :            :     }
    1099                 :            :     else
    1100                 :            :     {
    1101         [ #  # ]:          0 :         AddId( nSeqNo, nSeqNo );
    1102                 :            :     }
    1103                 :          0 : }
    1104                 :            : 
    1105                 :            : 
    1106                 :         14 : void SwGetRefFieldType::MergeWithOtherDoc( SwDoc& rDestDoc )
    1107                 :            : {
    1108         [ +  - ]:         14 :     if( &rDestDoc != pDoc )
    1109                 :            :     {
    1110                 :            :         // dann gibt es im DestDoc RefFelder, also muessen im SourceDoc
    1111                 :            :         // alle RefFelder auf einduetige Ids in beiden Docs umgestellt
    1112                 :            :         // werden.
    1113         [ +  - ]:         14 :         _RefIdsMap aFntMap( aEmptyStr );
    1114         [ +  - ]:         14 :         _RefIdsMaps aFldMap;
    1115                 :            : 
    1116         [ +  - ]:         14 :         SwIterator<SwFmtFld,SwFieldType> aIter( *this );
    1117 [ +  - ][ #  # ]:         14 :         for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() )
                 [ -  + ]
    1118                 :            :         {
    1119                 :          0 :             SwGetRefField& rRefFld = *(SwGetRefField*)pFld->GetFld();
    1120      [ #  #  # ]:          0 :             switch( rRefFld.GetSubType() )
                 [ #  # ]
    1121                 :            :             {
    1122                 :            :             case REF_SEQUENCEFLD:
    1123                 :            :                 {
    1124                 :          0 :                     _RefIdsMap* pMap = 0;
    1125         [ #  # ]:          0 :                     for( sal_uInt16 n = aFldMap.size(); n; )
    1126                 :            :                     {
    1127 [ #  # ][ #  # ]:          0 :                         if( aFldMap[ --n ].GetName().Equals(rRefFld.GetSetRefName()) )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    1128                 :            :                         {
    1129         [ #  # ]:          0 :                             pMap = &aFldMap[ n ];
    1130                 :          0 :                             break;
    1131                 :            :                         }
    1132                 :            :                     }
    1133         [ #  # ]:          0 :                     if( !pMap )
    1134                 :            :                     {
    1135 [ #  # ][ #  # ]:          0 :                         pMap = new _RefIdsMap( rRefFld.GetSetRefName() );
         [ #  # ][ #  # ]
    1136         [ #  # ]:          0 :                         aFldMap.push_back( pMap );
    1137                 :            :                     }
    1138                 :            : 
    1139         [ #  # ]:          0 :                     pMap->Check( *pDoc, rDestDoc, rRefFld, sal_True );
    1140                 :            :                 }
    1141                 :          0 :                 break;
    1142                 :            : 
    1143                 :            :             case REF_FOOTNOTE:
    1144                 :            :             case REF_ENDNOTE:
    1145         [ #  # ]:          0 :                 aFntMap.Check( *pDoc, rDestDoc, rRefFld, sal_False );
    1146                 :          0 :                 break;
    1147                 :            :             }
    1148 [ +  - ][ +  - ]:         14 :         }
                 [ +  - ]
    1149                 :            :     }
    1150                 :         14 : }
    1151                 :            : 
    1152                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10