LCOV - code coverage report
Current view: top level - sw/source/filter/ww8 - wrtw8sty.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 752 1141 65.9 %
Date: 2012-08-25 Functions: 78 94 83.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 522 1378 37.9 %

           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                 :            : 
      30                 :            : #include <algorithm>
      31                 :            : #include <functional>
      32                 :            : 
      33                 :            : #include <com/sun/star/i18n/ScriptType.hpp>
      34                 :            : #include <rtl/tencinfo.h>
      35                 :            : #include <hintids.hxx>
      36                 :            : #include <editeng/boxitem.hxx>
      37                 :            : #include <editeng/fontitem.hxx>
      38                 :            : #include <svx/svdobj.hxx>
      39                 :            : #include <svx/svdotext.hxx>
      40                 :            : #include <svx/fmglob.hxx>
      41                 :            : #include <editeng/frmdiritem.hxx>
      42                 :            : #include <editeng/lrspitem.hxx>
      43                 :            : #include <editeng/ulspitem.hxx>
      44                 :            : #include <doc.hxx>
      45                 :            : #include <wrtww8.hxx>
      46                 :            : #include <docary.hxx>
      47                 :            : #include <poolfmt.hxx>
      48                 :            : #include <fmtpdsc.hxx>
      49                 :            : #include <pagedesc.hxx>
      50                 :            : #include <ndtxt.hxx>
      51                 :            : #include <ftninfo.hxx>
      52                 :            : #include <fmthdft.hxx>
      53                 :            : #include <section.hxx>
      54                 :            : #include <fmtcntnt.hxx>
      55                 :            : #include <fmtftn.hxx>
      56                 :            : #include <ndindex.hxx>
      57                 :            : #include <txtftn.hxx>
      58                 :            : #include <charfmt.hxx>
      59                 :            : #include <docufld.hxx>
      60                 :            : #include <dcontact.hxx>
      61                 :            : #include <fmtcnct.hxx>
      62                 :            : #include <ftnidx.hxx>
      63                 :            : #include <fmtclds.hxx>
      64                 :            : #include <lineinfo.hxx>
      65                 :            : #include <fmtline.hxx>
      66                 :            : #include <swtable.hxx>
      67                 :            : #include <msfilter.hxx>
      68                 :            : #include <swmodule.hxx>
      69                 :            : 
      70                 :            : #include <writerfilter/doctok/sprmids.hxx>
      71                 :            : 
      72                 :            : #include "writerhelper.hxx"
      73                 :            : #include "writerwordglue.hxx"
      74                 :            : #include "../inc/wwstyles.hxx"
      75                 :            : #include "ww8par.hxx"
      76                 :            : #include "ww8attributeoutput.hxx"
      77                 :            : #include "docxattributeoutput.hxx"
      78                 :            : #include "rtfattributeoutput.hxx"
      79                 :            : 
      80                 :            : using namespace sw::util;
      81                 :            : using namespace nsHdFtFlags;
      82                 :            : 
      83                 :            : struct WW8_SED
      84                 :            : {
      85                 :            :     SVBT16 aBits1;      // orientation change + internal, Default: 6
      86                 :            :     SVBT32 fcSepx;      //  FC  file offset to beginning of SEPX for section.
      87                 :            :                         //  0xFFFFFFFF for no Sprms
      88                 :            :     SVBT16 fnMpr;       //  used internally by Windows Word, Default: 0
      89                 :            :     SVBT32 fcMpr;       //  FC, points to offset in FC space for MacWord
      90                 :            :                         // Default: 0xffffffff ( nothing )
      91                 :            :                         //  cbSED is 12 (decimal)), C (hex).
      92                 :            : };
      93                 :            : 
      94                 :            : // class WW8_WrPlc0 ist erstmal nur fuer Header / Footer-Positionen, d.h. es
      95                 :            : // gibt keine inhaltstragende Struktur.
      96                 :         15 : class WW8_WrPlc0
      97                 :            : {
      98                 :            : private:
      99                 :            :     std::vector<sal_uLong> aPos;      // PTRARR von CPs / FCs
     100                 :            :     sal_uLong nOfs;
     101                 :            : 
     102                 :            :     //No copying
     103                 :            :     WW8_WrPlc0(const WW8_WrPlc0&);
     104                 :            :     WW8_WrPlc0 &operator=(const WW8_WrPlc0&);
     105                 :            : public:
     106                 :            :     WW8_WrPlc0( sal_uLong nOffset );
     107                 :         12 :     sal_uInt16 Count() const                { return aPos.size(); }
     108                 :            :     void Append( sal_uLong nStartCpOrFc );
     109                 :            :     void Write( SvStream& rStrm );
     110                 :            : };
     111                 :            : 
     112                 :            : //------------------------------------------------------------
     113                 :            : //  Styles
     114                 :            : //------------------------------------------------------------
     115                 :            : 
     116                 :            : #define WW8_RESERVED_SLOTS 15
     117                 :            : 
     118                 :            : // GetId( SwCharFmt ) zur Benutzung im Text -> nil verboten,
     119                 :            : // "Default Char Style" stattdessen
     120                 :          9 : sal_uInt16 MSWordExportBase::GetId( const SwCharFmt& rFmt ) const
     121                 :            : {
     122                 :          9 :     sal_uInt16 nRet = pStyles->GetSlot( rFmt );
     123         [ +  - ]:          9 :     return ( nRet != 0x0fff ) ? nRet : 10;      // Default Char Style
     124                 :            : }
     125                 :            : 
     126                 :            : // GetId( SwTxtFmtColl ) zur Benutzung an TextNodes -> nil verboten,
     127                 :            : // "Standard" stattdessen
     128                 :        300 : sal_uInt16 MSWordExportBase::GetId( const SwTxtFmtColl& rColl ) const
     129                 :            : {
     130                 :        300 :     sal_uInt16 nRet = pStyles->GetSlot( rColl );
     131         [ +  - ]:        300 :     return ( nRet != 0xfff ) ? nRet : 0;        // Default TxtFmtColl
     132                 :            : }
     133                 :            : 
     134                 :            : 
     135                 :            : 
     136                 :            : //typedef pFmtT
     137                 :        144 : MSWordStyles::MSWordStyles( MSWordExportBase& rExport )
     138                 :        144 :     : m_rExport( rExport )
     139                 :            : {
     140                 :            :     // if exist any Foot-/End-Notes then get from the EndNoteInfo struct
     141                 :            :     // the CharFormats. They will create it!
     142         [ +  + ]:        144 :     if ( !m_rExport.pDoc->GetFtnIdxs().empty() )
     143                 :            :     {
     144                 :          3 :         m_rExport.pDoc->GetEndNoteInfo().GetAnchorCharFmt( *m_rExport.pDoc );
     145                 :          3 :         m_rExport.pDoc->GetEndNoteInfo().GetCharFmt( *m_rExport.pDoc );
     146                 :          3 :         m_rExport.pDoc->GetFtnInfo().GetAnchorCharFmt( *m_rExport.pDoc );
     147                 :          3 :         m_rExport.pDoc->GetFtnInfo().GetCharFmt( *m_rExport.pDoc );
     148                 :            :     }
     149                 :        144 :     sal_uInt16 nAlloc = WW8_RESERVED_SLOTS + m_rExport.pDoc->GetCharFmts()->size() - 1 +
     150                 :        144 :                                          m_rExport.pDoc->GetTxtFmtColls()->size() - 1;
     151                 :            : 
     152                 :            :     // etwas grosszuegig ( bis zu 15 frei )
     153                 :        144 :     pFmtA = new SwFmt*[ nAlloc ];
     154                 :        144 :     memset( pFmtA, 0, nAlloc * sizeof( SwFmt* ) );
     155                 :            : 
     156                 :        144 :     BuildStylesTable();
     157                 :        144 : }
     158                 :            : 
     159                 :         66 : MSWordStyles::~MSWordStyles()
     160                 :            : {
     161         [ +  - ]:         66 :     delete[] pFmtA;
     162                 :         66 : }
     163                 :            : 
     164                 :            : // Sty_SetWWSlot() fuer Abhaengigkeiten der Styles -> nil ist erlaubt
     165                 :       2457 : sal_uInt16 MSWordStyles::GetSlot( const SwFmt& rFmt ) const
     166                 :            : {
     167                 :            :     sal_uInt16 n;
     168         [ +  + ]:      37236 :     for ( n = 0; n < nUsedSlots; n++ )
     169         [ +  + ]:      36999 :         if ( pFmtA[n] == &rFmt )
     170                 :       2220 :             return n;
     171                 :       2457 :     return 0xfff;                   // 0xfff: WW: nil
     172                 :            : }
     173                 :            : 
     174                 :       1074 : sal_uInt16 MSWordStyles::BuildGetSlot( const SwFmt& rFmt )
     175                 :            : {
     176                 :            :     sal_uInt16 nRet;
     177      [ +  +  + ]:       1074 :     switch ( nRet = rFmt.GetPoolFmtId() )
     178                 :            :     {
     179                 :            :         case RES_POOLCOLL_STANDARD:
     180                 :        144 :             nRet = 0;
     181                 :        144 :             break;
     182                 :            : 
     183                 :            :         case RES_POOLCOLL_HEADLINE1:
     184                 :            :         case RES_POOLCOLL_HEADLINE2:
     185                 :            :         case RES_POOLCOLL_HEADLINE3:
     186                 :            :         case RES_POOLCOLL_HEADLINE4:
     187                 :            :         case RES_POOLCOLL_HEADLINE5:
     188                 :            :         case RES_POOLCOLL_HEADLINE6:
     189                 :            :         case RES_POOLCOLL_HEADLINE7:
     190                 :            :         case RES_POOLCOLL_HEADLINE8:
     191                 :            :         case RES_POOLCOLL_HEADLINE9:
     192                 :          9 :             nRet -= RES_POOLCOLL_HEADLINE1-1;
     193                 :          9 :             break;
     194                 :            : 
     195                 :            :         default:
     196                 :        921 :             nRet = nUsedSlots++;
     197                 :        921 :             break;
     198                 :            :     }
     199                 :       1074 :     return nRet;
     200                 :            : }
     201                 :            : 
     202                 :       1074 : sal_uInt16 MSWordStyles::GetWWId( const SwFmt& rFmt ) const
     203                 :            : {
     204                 :       1074 :     sal_uInt16 nRet = ww::stiUser;    // User-Style als default
     205                 :       1074 :     sal_uInt16 nPoolId = rFmt.GetPoolFmtId();
     206         [ +  + ]:       1074 :     if( nPoolId == RES_POOLCOLL_STANDARD )
     207                 :        144 :         nRet = 0;
     208 [ +  + ][ +  + ]:        930 :     else if( nPoolId >= RES_POOLCOLL_HEADLINE1 &&
     209                 :            :              nPoolId <= RES_POOLCOLL_HEADLINE9 )
     210                 :          9 :         nRet = static_cast< sal_uInt16 >(nPoolId + 1 - RES_POOLCOLL_HEADLINE1);
     211 [ +  + ][ -  + ]:        921 :     else if( nPoolId >= RES_POOLCOLL_TOX_IDX1 &&
     212                 :            :              nPoolId <= RES_POOLCOLL_TOX_IDX3 )
     213                 :          0 :         nRet = static_cast< sal_uInt16 >(nPoolId + 10 - RES_POOLCOLL_TOX_IDX1);
     214 [ +  + ][ +  + ]:        921 :     else if( nPoolId >= RES_POOLCOLL_TOX_CNTNT1 &&
     215                 :            :              nPoolId <= RES_POOLCOLL_TOX_CNTNT5 )
     216                 :          9 :         nRet = static_cast< sal_uInt16 >(nPoolId + 19 - RES_POOLCOLL_TOX_CNTNT1);
     217 [ +  + ][ -  + ]:        912 :     else if( nPoolId >= RES_POOLCOLL_TOX_CNTNT6 &&
     218                 :            :              nPoolId <= RES_POOLCOLL_TOX_CNTNT9 )
     219                 :          0 :         nRet = static_cast< sal_uInt16 >(nPoolId + 24 - RES_POOLCOLL_TOX_CNTNT6);
     220                 :            :     else
     221   [ +  -  +  +  :        912 :         switch( nPoolId )
          -  +  -  -  -  
          +  -  +  -  +  
          +  -  -  -  -  
          +  +  -  +  +  
          -  +  +  -  -  
          -  -  -  +  -  
          +  +  +  +  -  
             -  -  -  -  
                      + ]
     222                 :            :         {
     223                 :          3 :         case RES_POOLCOLL_FOOTNOTE:         nRet = 29;  break;
     224                 :          0 :         case RES_POOLCOLL_MARGINAL:         nRet = 30;  break;
     225                 :          3 :         case RES_POOLCOLL_HEADER:           nRet = 31;  break;
     226                 :          6 :         case RES_POOLCOLL_FOOTER:           nRet = 32;  break;
     227                 :          0 :         case RES_POOLCOLL_TOX_IDXH:         nRet = 33;  break;
     228                 :        144 :         case RES_POOLCOLL_LABEL:            nRet = 34;  break;
     229                 :          0 :         case RES_POOLCOLL_LABEL_DRAWING:    nRet = 35;  break;
     230                 :          0 :         case RES_POOLCOLL_JAKETADRESS:      nRet = 36;  break;
     231                 :          0 :         case RES_POOLCOLL_SENDADRESS:       nRet = 37;  break;
     232                 :          3 :         case RES_POOLCOLL_ENDNOTE:          nRet = 43;  break;
     233                 :          0 :         case RES_POOLCOLL_TOX_AUTHORITIESH: nRet = 44;  break;
     234                 :          3 :         case RES_POOLCOLL_TOX_CNTNTH:       nRet = 46;  break;
     235                 :          0 :         case RES_POOLCOLL_BUL_LEVEL1:       nRet = 48;  break;
     236                 :        144 :         case RES_POOLCOLL_LISTS_BEGIN:      nRet = 47;  break;
     237                 :          3 :         case RES_POOLCOLL_NUM_LEVEL1:       nRet = 49;  break;
     238                 :          0 :         case RES_POOLCOLL_BUL_LEVEL2:       nRet = 54;  break;
     239                 :          0 :         case RES_POOLCOLL_BUL_LEVEL3:       nRet = 55;  break;
     240                 :          0 :         case RES_POOLCOLL_BUL_LEVEL4:       nRet = 56;  break;
     241                 :          0 :         case RES_POOLCOLL_BUL_LEVEL5:       nRet = 57;  break;
     242                 :          3 :         case RES_POOLCOLL_NUM_LEVEL2:       nRet = 58;  break;
     243                 :          3 :         case RES_POOLCOLL_NUM_LEVEL3:       nRet = 59;  break;
     244                 :          0 :         case RES_POOLCOLL_NUM_LEVEL4:       nRet = 60;  break;
     245                 :          3 :         case RES_POOLCOLL_NUM_LEVEL5:       nRet = 61;  break;
     246                 :          3 :         case RES_POOLCOLL_DOC_TITEL:        nRet = 62;  break;
     247                 :          0 :         case RES_POOLCOLL_SIGNATURE:        nRet = 64;  break;
     248                 :        144 :         case RES_POOLCOLL_TEXT:             nRet = 66;  break;
     249                 :          3 :         case RES_POOLCOLL_TEXT_MOVE:        nRet = 67;  break;
     250                 :          0 :         case RES_POOLCOLL_BUL_NONUM1:       nRet = 68;  break;
     251                 :          0 :         case RES_POOLCOLL_BUL_NONUM2:       nRet = 69;  break;
     252                 :          0 :         case RES_POOLCOLL_BUL_NONUM3:       nRet = 70;  break;
     253                 :          0 :         case RES_POOLCOLL_BUL_NONUM4:       nRet = 71;  break;
     254                 :          0 :         case RES_POOLCOLL_BUL_NONUM5:       nRet = 72;  break;
     255                 :          3 :         case RES_POOLCOLL_DOC_SUBTITEL:     nRet = 74;  break;
     256                 :          0 :         case RES_POOLCOLL_GREETING:         nRet = 75;  break;
     257                 :          3 :         case RES_POOLCOLL_TEXT_IDENT:       nRet = 77;  break;
     258                 :            : 
     259                 :          3 :         case RES_POOLCHR_FOOTNOTE_ANCHOR:   nRet = 38;  break;
     260                 :          3 :         case RES_POOLCHR_ENDNOTE_ANCHOR:    nRet = 42;  break;
     261                 :          6 :         case RES_POOLCHR_INET_NORMAL:       nRet = 85;  break;
     262                 :          0 :         case RES_POOLCHR_INET_VISIT:        nRet = 86;  break;
     263                 :          0 :         case RES_POOLCHR_HTML_STRONG:       nRet = 87;  break;
     264                 :          0 :         case RES_POOLCHR_HTML_EMPHASIS:     nRet = 88;  break;
     265                 :          0 :         case RES_POOLCHR_LINENUM:           nRet = 40;  break;
     266                 :          0 :         case RES_POOLCHR_PAGENO:            nRet = 41;  break;
     267                 :            :         }
     268                 :       1074 :     return nRet;
     269                 :            : }
     270                 :            : 
     271                 :        144 : void MSWordStyles::BuildStylesTable()
     272                 :            : {
     273                 :        144 :     nUsedSlots = WW8_RESERVED_SLOTS;    // soviele sind reserviert fuer
     274                 :            :                                         // Standard und HeadingX u.a.
     275                 :        144 :     const SwCharFmts& rArr = *m_rExport.pDoc->GetCharFmts();       // erst CharFmt
     276                 :            :     // das Default-ZeichenStyle ( 0 ) wird nicht mit ausgegeben !
     277         [ +  + ]:        264 :     for( sal_uInt16 n = 1; n < rArr.size(); n++ )
     278                 :            :     {
     279                 :        120 :         SwCharFmt* pFmt = rArr[n];
     280                 :        120 :         pFmtA[ BuildGetSlot( *pFmt ) ] = pFmt;
     281                 :            :     }
     282                 :            : 
     283                 :        144 :     const SwTxtFmtColls& rArr2 = *m_rExport.pDoc->GetTxtFmtColls();   // dann TxtFmtColls
     284                 :            :     // das Default-TextStyle ( 0 ) wird nicht mit ausgegeben !
     285         [ +  + ]:       1098 :     for( sal_uInt16 n = 1; n < rArr2.size(); n++ )
     286                 :            :     {
     287                 :        954 :         SwTxtFmtColl* pFmt = rArr2[n];
     288                 :        954 :         pFmtA[ BuildGetSlot( *pFmt ) ] = pFmt;
     289                 :            :     }
     290                 :        144 : }
     291                 :            : 
     292                 :            : /// For WW8 only - extend pO so that the size of pTableStrm is even.
     293                 :        567 : static void impl_SkipOdd( ww::bytes* pO, sal_Size nTableStrmTell )
     294                 :            : {
     295         [ +  + ]:        567 :     if ( ( nTableStrmTell + pO->size() ) & 1 )     // Start auf gerader
     296         [ +  - ]:        300 :         pO->push_back( (sal_uInt8)0 );         // Adresse
     297                 :        567 : }
     298                 :            : 
     299                 :        219 : void WW8AttributeOutput::EndStyle()
     300                 :            : {
     301                 :        219 :     impl_SkipOdd( m_rWW8Export.pO, m_rWW8Export.pTableStrm->Tell() );
     302                 :            : 
     303                 :        219 :     short nLen = m_rWW8Export.pO->size() - 2;            // Laenge des Styles
     304                 :        219 :     sal_uInt8* p = &m_rWW8Export.pO->front() + nPOPosStdLen1;
     305                 :        219 :     ShortToSVBT16( nLen, p );               // nachtragen
     306                 :        219 :     p = &m_rWW8Export.pO->front() + nPOPosStdLen2;
     307                 :        219 :     ShortToSVBT16( nLen, p );               // dito
     308                 :            : 
     309                 :        219 :     m_rWW8Export.pTableStrm->Write( m_rWW8Export.pO->data(), m_rWW8Export.pO->size() );      // ins File damit
     310                 :        219 :     m_rWW8Export.pO->clear();
     311                 :        219 : }
     312                 :            : 
     313                 :        219 : void WW8AttributeOutput::StartStyle( const String& rName, bool bPapFmt, sal_uInt16 nWwBase,
     314                 :            :     sal_uInt16 nWwNext, sal_uInt16 nWwId, sal_uInt16 /*nId*/, bool bAutoUpdate )
     315                 :            : {
     316                 :            :     sal_uInt8 aWW8_STD[ sizeof( WW8_STD ) ];
     317                 :        219 :     sal_uInt8* pData = aWW8_STD;
     318                 :        219 :     memset( &aWW8_STD, 0, sizeof( WW8_STD ) );
     319                 :            : 
     320                 :        219 :     sal_uInt16 nBit16 = 0x1000;         // fInvalHeight
     321                 :        219 :     nBit16 |= (ww::stiNil & nWwId);
     322                 :        219 :     Set_UInt16( pData, nBit16 );
     323                 :            : 
     324                 :        219 :     nBit16 = nWwBase << 4;          // istdBase
     325         [ +  + ]:        219 :     nBit16 |= bPapFmt ? 1 : 2;      // sgc
     326                 :        219 :     Set_UInt16( pData, nBit16 );
     327                 :            : 
     328                 :        219 :     nBit16 = nWwNext << 4;          // istdNext
     329         [ +  + ]:        219 :     nBit16 |= bPapFmt ? 2 : 1;      // cupx
     330                 :        219 :     Set_UInt16( pData, nBit16 );
     331                 :            : 
     332                 :        219 :     pData += sizeof( sal_uInt16 );      // bchUpe
     333                 :            : 
     334         [ +  - ]:        219 :     if( m_rWW8Export.bWrtWW8 )
     335                 :            :     {
     336         [ -  + ]:        219 :         nBit16 = bAutoUpdate ? 1 : 0;  // fAutoRedef : 1
     337                 :        219 :         Set_UInt16( pData, nBit16 );
     338                 :            :         //-------- jetzt neu:
     339                 :            :         // ab Ver8 gibts zwei Felder mehr:
     340                 :            :         //sal_uInt16    fHidden : 1;       /* hidden from UI? */
     341                 :            :         //sal_uInt16    : 14;              /* unused bits */
     342                 :            :     }
     343                 :            : 
     344                 :            : 
     345                 :            :     sal_uInt16 nLen = static_cast< sal_uInt16 >( ( pData - aWW8_STD ) + 1 +
     346         [ +  - ]:        219 :                 ((m_rWW8Export.bWrtWW8 ? 2 : 1 ) * (rName.Len() + 1)) );  // vorlaeufig
     347                 :            : 
     348                 :        219 :     nPOPosStdLen1 = m_rWW8Export.pO->size();        // Adr1 zum nachtragen der Laenge
     349                 :            : 
     350         [ +  - ]:        219 :     SwWW8Writer::InsUInt16( *m_rWW8Export.pO, nLen );
     351         [ +  - ]:        219 :     m_rWW8Export.pO->insert( m_rWW8Export.pO->end(), aWW8_STD, pData );
     352                 :            : 
     353                 :        219 :     nPOPosStdLen2 = nPOPosStdLen1 + 8;  // Adr2 zum nachtragen von "end of upx"
     354                 :            : 
     355                 :            :     // Namen schreiben
     356         [ +  - ]:        219 :     if( m_rWW8Export.bWrtWW8 )
     357                 :            :     {
     358         [ +  - ]:        219 :         SwWW8Writer::InsUInt16( *m_rWW8Export.pO, rName.Len() ); // Laenge
     359         [ +  - ]:        219 :         SwWW8Writer::InsAsString16( *m_rWW8Export.pO, rName );
     360                 :            :     }
     361                 :            :     else
     362                 :            :     {
     363         [ #  # ]:          0 :         m_rWW8Export.pO->push_back( (sal_uInt8)rName.Len() );       // Laenge
     364         [ #  # ]:          0 :         SwWW8Writer::InsAsString8( *m_rWW8Export.pO, rName, RTL_TEXTENCODING_MS_1252 );
     365                 :            :     }
     366         [ +  - ]:        219 :     m_rWW8Export.pO->push_back( (sal_uInt8)0 );             // Trotz P-String 0 am Ende!
     367                 :        219 : }
     368                 :            : 
     369                 :        288 : void MSWordStyles::SetStyleDefaults( const SwFmt& rFmt, bool bPap )
     370                 :            : {
     371                 :        288 :     const SwModify* pOldMod = m_rExport.pOutFmtNode;
     372                 :        288 :     m_rExport.pOutFmtNode = &rFmt;
     373                 :            :     bool aFlags[ static_cast< sal_uInt16 >(RES_FRMATR_END) - RES_CHRATR_BEGIN ];
     374                 :            :     sal_uInt16 nStt, nEnd, n;
     375         [ +  + ]:        288 :     if( bPap )
     376                 :        144 :        nStt = RES_PARATR_BEGIN, nEnd = RES_FRMATR_END;
     377                 :            :     else
     378                 :        144 :        nStt = RES_CHRATR_BEGIN, nEnd = RES_TXTATR_END;
     379                 :            : 
     380                 :            :     // dynamic defaults
     381                 :        288 :     const SfxItemPool& rPool = *rFmt.GetAttrSet().GetPool();
     382         [ +  + ]:      17712 :     for( n = nStt; n < nEnd; ++n )
     383         [ +  - ]:      17424 :         aFlags[ n - RES_CHRATR_BEGIN ] = 0 != rPool.GetPoolDefaultItem( n );
     384                 :            : 
     385                 :            :     // static defaults, that differs between WinWord and SO
     386         [ +  + ]:        288 :     if( bPap )
     387                 :            :     {
     388                 :        144 :         aFlags[ static_cast< sal_uInt16 >(RES_PARATR_WIDOWS) - RES_CHRATR_BEGIN ] = 1;
     389                 :        144 :         aFlags[ static_cast< sal_uInt16 >(RES_PARATR_HYPHENZONE) - RES_CHRATR_BEGIN ] = 1;
     390                 :            :     }
     391                 :            :     else
     392                 :            :     {
     393                 :        144 :         aFlags[ RES_CHRATR_FONTSIZE - RES_CHRATR_BEGIN ] = 1;
     394                 :        144 :         aFlags[ RES_CHRATR_LANGUAGE - RES_CHRATR_BEGIN ] = 1;
     395                 :            :     }
     396                 :            : 
     397                 :        288 :     const SfxItemSet* pOldI = m_rExport.GetCurItemSet();
     398                 :        288 :     m_rExport.SetCurItemSet( &rFmt.GetAttrSet() );
     399                 :            : 
     400                 :        288 :     const bool* pFlags = aFlags + ( nStt - RES_CHRATR_BEGIN );
     401         [ +  + ]:      17712 :     for ( n = nStt; n < nEnd; ++n, ++pFlags )
     402                 :            :     {
     403 [ +  + ][ +  - ]:      19839 :         if ( *pFlags && !m_rExport.ignoreAttributeForStyles( n )
         [ +  - ][ +  + ]
                 [ +  + ]
     404         [ +  - ]:       2415 :             && SFX_ITEM_SET != rFmt.GetItemState(n, false))
     405                 :            :         {
     406                 :            :             //If we are a character property then see if it is one of the
     407                 :            :             //western/asian ones that must be collapsed together for export to
     408                 :            :             //word. If so default to the western varient.
     409 [ +  + ][ +  + ]:       2865 :             if ( bPap || m_rExport.CollapseScriptsforWordOk(
                 [ +  + ]
     410         [ +  - ]:       1092 :                 i18n::ScriptType::LATIN, n) )
     411                 :            :             {
     412 [ +  - ][ +  - ]:       1677 :                 m_rExport.AttrOutput().OutputItem( rFmt.GetFmtAttr( n, true ) );
                 [ +  - ]
     413                 :            :             }
     414                 :            :         }
     415                 :            :     }
     416                 :            : 
     417                 :        288 :     m_rExport.SetCurItemSet( pOldI );
     418                 :        288 :     m_rExport.pOutFmtNode = pOldMod;
     419                 :        288 : }
     420                 :            : 
     421                 :        348 : void WW8AttributeOutput::StartStyleProperties( bool bParProp, sal_uInt16 nStyle )
     422                 :            : {
     423                 :        348 :     impl_SkipOdd( m_rWW8Export.pO, m_rWW8Export.pTableStrm->Tell() );
     424                 :            : 
     425         [ +  + ]:        348 :     sal_uInt16 nLen = ( bParProp ) ? 2 : 0;             // Default-Laenge
     426                 :        348 :     m_nStyleLenPos = m_rWW8Export.pO->size();               // Laenge zum Nachtragen
     427                 :            :                                     // Keinen Pointer merken, da sich bei
     428                 :            :                                     // _grow der Pointer aendert !
     429                 :            : 
     430                 :        348 :     SwWW8Writer::InsUInt16( *m_rWW8Export.pO, nLen );        // Style-Len
     431                 :            : 
     432                 :        348 :     m_nStyleStartSize = m_rWW8Export.pO->size();
     433                 :            : 
     434         [ +  + ]:        348 :     if ( bParProp )
     435                 :        129 :         SwWW8Writer::InsUInt16( *m_rWW8Export.pO, nStyle );     // Style-Nummer
     436                 :        348 : }
     437                 :            : 
     438                 :       2028 : void MSWordStyles::WriteProperties( const SwFmt* pFmt, bool bParProp, sal_uInt16 nPos,
     439                 :            :     bool bInsDefCharSiz )
     440                 :            : {
     441                 :       2028 :     m_rExport.AttrOutput().StartStyleProperties( bParProp, nPos );
     442                 :            : 
     443                 :            :     OSL_ENSURE( m_rExport.pCurrentStyle == NULL, "Current style not NULL" ); // set current style before calling out
     444                 :       2028 :     m_rExport.pCurrentStyle = pFmt;
     445                 :            : 
     446                 :       2028 :     m_rExport.OutputFormat( *pFmt, bParProp, !bParProp );
     447                 :            : 
     448                 :            :     OSL_ENSURE( m_rExport.pCurrentStyle == pFmt, "current style was changed" );
     449                 :            :     // reset current style...
     450                 :       2028 :     m_rExport.pCurrentStyle = NULL;
     451                 :            : 
     452         [ +  + ]:       2028 :     if ( bInsDefCharSiz  )                   // nicht abgeleitet v. anderem Style
     453                 :        288 :         SetStyleDefaults( *pFmt, bParProp );
     454                 :            : 
     455                 :       2028 :     m_rExport.AttrOutput().EndStyleProperties( bParProp );
     456                 :       2028 : }
     457                 :            : 
     458                 :        348 : void WW8AttributeOutput::EndStyleProperties( bool /*bParProp*/ )
     459                 :            : {
     460                 :        348 :     sal_uInt16 nLen = m_rWW8Export.pO->size() - m_nStyleStartSize;
     461                 :        348 :     sal_uInt8* pUpxLen = &m_rWW8Export.pO->front() + m_nStyleLenPos; // Laenge zum Nachtragen
     462                 :        348 :     ShortToSVBT16( nLen, pUpxLen );                 // Default-Laenge eintragen
     463                 :        348 : }
     464                 :            : 
     465                 :       1074 : void MSWordStyles::GetStyleData( SwFmt* pFmt, bool& bFmtColl, sal_uInt16& nBase, sal_uInt16& nNext )
     466                 :            : {
     467 [ +  + ][ +  + ]:       1074 :     bFmtColl = pFmt->Which() == RES_TXTFMTCOLL || pFmt->Which() == RES_CONDTXTFMTCOLL;
     468                 :            : 
     469                 :            :     // Default: none
     470                 :       1074 :     nBase = 0xfff;
     471                 :            : 
     472                 :            :     // Derived from?
     473         [ +  - ]:       1074 :     if ( !pFmt->IsDefault() )
     474                 :       1074 :         nBase = GetSlot( *pFmt->DerivedFrom() );
     475                 :            : 
     476                 :            :     SwFmt* pNext;
     477         [ +  + ]:       1074 :     if ( bFmtColl )
     478                 :        954 :         pNext = &((SwTxtFmtColl*)pFmt)->GetNextTxtFmtColl();
     479                 :            :     else
     480                 :        120 :         pNext = pFmt; // CharFmt: next CharFmt == self
     481                 :            : 
     482                 :       1074 :     nNext = GetSlot( *pNext );
     483                 :       1074 : }
     484                 :            : 
     485                 :        117 : void WW8AttributeOutput::DefaultStyle( sal_uInt16 nStyle )
     486                 :            : {
     487         [ +  + ]:        117 :     if ( nStyle == 10 )           // Default Char-Style ( nur WW )
     488                 :            :     {
     489         [ +  - ]:          9 :         if ( m_rWW8Export.bWrtWW8 )
     490                 :            :         {
     491                 :            :             static sal_uInt8 aDefCharSty[] = {
     492                 :            :                 0x42, 0x00,
     493                 :            :                 0x41, 0x40, 0xF2, 0xFF, 0xA1, 0x00, 0x42, 0x00,
     494                 :            :                 0x00, 0x00, 0x19, 0x00, 0x41, 0x00, 0x62, 0x00,
     495                 :            :                 0x73, 0x00, 0x61, 0x00, 0x74, 0x00, 0x7A, 0x00,
     496                 :            :                 0x2D, 0x00, 0x53, 0x00, 0x74, 0x00, 0x61, 0x00,
     497                 :            :                 0x6E, 0x00, 0x64, 0x00, 0x61, 0x00, 0x72, 0x00,
     498                 :            :                 0x64, 0x00, 0x73, 0x00, 0x63, 0x00, 0x68, 0x00,
     499                 :            :                 0x72, 0x00, 0x69, 0x00, 0x66, 0x00, 0x74, 0x00,
     500                 :            :                 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x00, 0x00,
     501                 :            :                 0x00, 0x00 };
     502                 :          9 :             m_rWW8Export.pTableStrm->Write( &aDefCharSty, sizeof( aDefCharSty ) );
     503                 :            :         }
     504                 :            :         else
     505                 :            :         {
     506                 :            :             static sal_uInt8 aDefCharSty[] = {
     507                 :            :                 0x26, 0x00,
     508                 :            :                 0x41, 0x40, 0xF2, 0xFF, 0xA1, 0x00, 0x26, 0x00,
     509                 :            :                 0x19, 0x41, 0x62, 0x73, 0x61, 0x74, 0x7A, 0x2D,
     510                 :            :                 0x53, 0x74, 0x61, 0x6E, 0x64, 0x61, 0x72, 0x64,
     511                 :            :                 0x73, 0x63, 0x68, 0x72, 0x69, 0x66, 0x74, 0x61,
     512                 :            :                 0x72, 0x74, 0x00, 0x00, 0x00, 0x00 };
     513                 :          0 :             m_rWW8Export.pTableStrm->Write( &aDefCharSty, sizeof( aDefCharSty ) );
     514                 :            :         }
     515                 :            :     }
     516                 :            :     else
     517                 :            :     {
     518                 :        108 :         sal_uInt16 n = 0;
     519         [ +  - ]:        108 :         m_rWW8Export.pTableStrm->Write( &n , 2 );   // leerer Style
     520                 :            :     }
     521                 :        117 : }
     522                 :            : 
     523                 :            : // OutputStyle geht fuer TxtFmtColls und CharFmts
     524                 :       3081 : void MSWordStyles::OutputStyle( SwFmt* pFmt, sal_uInt16 nPos )
     525                 :            : {
     526         [ +  + ]:       3081 :     if ( !pFmt )
     527                 :       2007 :         m_rExport.AttrOutput().DefaultStyle( nPos );
     528                 :            :     else
     529                 :            :     {
     530                 :            :         bool bFmtColl;
     531                 :            :         sal_uInt16 nBase, nWwNext;
     532                 :            : 
     533                 :       1074 :         GetStyleData( pFmt, bFmtColl, nBase, nWwNext );
     534                 :            : 
     535         [ +  - ]:       1074 :         String aName = pFmt->GetName();
     536 [ +  - ][ +  + ]:       1074 :         if ( aName.EqualsAscii( "Default" ) )
     537         [ +  - ]:        144 :             aName = rtl::OUString("Normal");
     538                 :            : 
     539         [ +  - ]:       1074 :         m_rExport.AttrOutput().StartStyle( aName, bFmtColl,
     540                 :       1074 :                 nBase, nWwNext, GetWWId( *pFmt ), nPos,
     541         [ +  - ]:       2148 :                 pFmt->IsAutoUpdateFmt() );
     542                 :            : 
     543         [ +  + ]:       1074 :         if ( bFmtColl )
     544         [ +  - ]:        954 :             WriteProperties( pFmt, true, nPos, nBase==0xfff );           // UPX.papx
     545                 :            : 
     546 [ +  + ][ +  + ]:       1074 :         WriteProperties( pFmt, false, nPos, bFmtColl && nBase==0xfff );  // UPX.chpx
                 [ +  - ]
     547                 :            : 
     548 [ +  - ][ +  - ]:       1074 :         m_rExport.AttrOutput().EndStyle();
                 [ +  - ]
     549                 :            :     }
     550                 :       3081 : }
     551                 :            : 
     552                 :          9 : void WW8AttributeOutput::StartStyles()
     553                 :            : {
     554                 :          9 :     WW8Fib& rFib = *m_rWW8Export.pFib;
     555                 :            : 
     556                 :          9 :     sal_uLong nCurPos = m_rWW8Export.pTableStrm->Tell();
     557         [ -  + ]:          9 :     if ( nCurPos & 1 )                   // Start auf gerader
     558                 :            :     {
     559                 :          0 :         *m_rWW8Export.pTableStrm << (char)0;        // Adresse
     560                 :          0 :         ++nCurPos;
     561                 :            :     }
     562                 :          9 :     rFib.fcStshfOrig = rFib.fcStshf = nCurPos;
     563                 :          9 :     m_nStyAnzPos = nCurPos + 2;     // Anzahl wird nachgetragen
     564                 :            : 
     565         [ +  - ]:          9 :     if ( m_rWW8Export.bWrtWW8 )
     566                 :            :     {
     567                 :            :         static sal_uInt8 aStShi[] = {
     568                 :            :             0x12, 0x00,
     569                 :            :             0x0F, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x5B, 0x00,
     570                 :            :             0x0F, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
     571                 :            :             0x00, 0x00 };
     572                 :            : 
     573                 :          9 :         m_rWW8Export.pTableStrm->Write( &aStShi, sizeof( aStShi ) );
     574                 :            :     }
     575                 :            :     else
     576                 :            :     {
     577                 :            :         static sal_uInt8 aStShi[] = {
     578                 :            :             0x0E, 0x00,
     579                 :            :             0x0F, 0x00, 0x08, 0x00, 0x01, 0x00, 0x4B, 0x00,
     580                 :            :             0x0F, 0x00, 0x00, 0x00, 0x00, 0x00 };
     581                 :          0 :         m_rWW8Export.pTableStrm->Write( &aStShi, sizeof( aStShi ) );
     582                 :            :     }
     583                 :          9 : }
     584                 :            : 
     585                 :          9 : void WW8AttributeOutput::EndStyles( sal_uInt16 nNumberOfStyles )
     586                 :            : {
     587                 :          9 :     WW8Fib& rFib = *m_rWW8Export.pFib;
     588                 :            : 
     589                 :          9 :     rFib.lcbStshfOrig = rFib.lcbStshf = m_rWW8Export.pTableStrm->Tell() - rFib.fcStshf;
     590                 :          9 :     SwWW8Writer::WriteShort( *m_rWW8Export.pTableStrm, m_nStyAnzPos, nNumberOfStyles );
     591                 :          9 : }
     592                 :            : 
     593                 :        144 : void MSWordStyles::OutputStylesTable()
     594                 :            : {
     595                 :        144 :     m_rExport.bStyDef = true;
     596                 :            : 
     597                 :        144 :     m_rExport.AttrOutput().StartStyles();
     598                 :            : 
     599                 :            :     sal_uInt16 n;
     600         [ +  + ]:       3225 :     for ( n = 0; n < nUsedSlots; n++ )
     601                 :       3081 :         OutputStyle( pFmtA[n], n );
     602                 :            : 
     603                 :        144 :     m_rExport.AttrOutput().EndStyles( nUsedSlots );
     604                 :            : 
     605                 :        144 :     m_rExport.bStyDef = false;
     606                 :        144 : }
     607                 :            : 
     608                 :            : //---------------------------------------------------------------------------
     609                 :            : //          Fonts
     610                 :            : //---------------------------------------------------------------------------
     611                 :       2460 : wwFont::wwFont(const String &rFamilyName, FontPitch ePitch, FontFamily eFamily,
     612         [ +  - ]:       2460 :     rtl_TextEncoding eChrSet, bool bWrtWW8) : mbAlt(false), mbWrtWW8(bWrtWW8), mePitch(ePitch), meFamily(eFamily), meChrSet(eChrSet)
     613                 :            : {
     614         [ +  - ]:       2460 :     FontMapExport aResult(rFamilyName);
     615         [ +  - ]:       2460 :     msFamilyNm = aResult.msPrimary;
     616         [ +  - ]:       2460 :     msAltNm = aResult.msSecondary;
     617 [ +  + ][ +  - ]:       3354 :     if (msAltNm.Len() && msAltNm != msFamilyNm &&
           [ +  -  +  - ]
                 [ +  + ]
     618                 :        894 :         (msFamilyNm.Len() + msAltNm.Len() + 2 <= 65) )
     619                 :            :     {
     620                 :            :         //max size of szFfn in 65 chars
     621                 :        894 :         mbAlt = true;
     622                 :            :     }
     623                 :            : 
     624                 :       2460 :     memset(maWW8_FFN, 0, sizeof(maWW8_FFN));
     625                 :            : 
     626         [ +  - ]:       2460 :     if (bWrtWW8)
     627                 :            :     {
     628                 :       2460 :         maWW8_FFN[0] = (sal_uInt8)( 6 - 1 + 0x22 + ( 2 * ( 1 + msFamilyNm.Len() ) ));
     629         [ +  + ]:       2460 :         if (mbAlt)
     630                 :        894 :             maWW8_FFN[0] = static_cast< sal_uInt8 >(maWW8_FFN[0] + 2 * ( 1 + msAltNm.Len()));
     631                 :            :     }
     632                 :            :     else
     633                 :            :     {
     634                 :          0 :         maWW8_FFN[0] = (sal_uInt8)( 6 - 1 + 1 + msFamilyNm.Len() );
     635         [ #  # ]:          0 :         if (mbAlt)
     636                 :          0 :             maWW8_FFN[0] = static_cast< sal_uInt8 >(maWW8_FFN[0] + 1 + msAltNm.Len());
     637                 :            :     }
     638                 :            : 
     639                 :       2460 :     sal_uInt8 aB = 0;
     640      [ +  -  + ]:       2460 :     switch(ePitch)
     641                 :            :     {
     642                 :            :         case PITCH_VARIABLE:
     643                 :        717 :             aB |= 2;    // aF.prg = 2
     644                 :        717 :             break;
     645                 :            :         case PITCH_FIXED:
     646                 :          0 :             aB |= 1;
     647                 :          0 :             break;
     648                 :            :         default:        // aF.prg = 0 : DEFAULT_PITCH (windows.h)
     649                 :       1743 :             break;
     650                 :            :     }
     651                 :       2460 :     aB |= 1 << 2;   // aF.fTrueType = 1; weiss ich nicht besser;
     652                 :            : 
     653   [ +  +  +  -  :       2460 :     switch(eFamily)
                   -  + ]
     654                 :            :     {
     655                 :            :         case FAMILY_ROMAN:
     656                 :       1056 :             aB |= 1 << 4;   // aF.ff = 1;
     657                 :       1056 :             break;
     658                 :            :         case FAMILY_SWISS:
     659                 :        360 :             aB |= 2 << 4;   // aF.ff = 2;
     660                 :        360 :             break;
     661                 :            :         case FAMILY_MODERN:
     662                 :         12 :             aB |= 3 << 4;   // aF.ff = 3;
     663                 :         12 :             break;
     664                 :            :         case FAMILY_SCRIPT:
     665                 :          0 :             aB |= 4 << 4;   // aF.ff = 4;
     666                 :          0 :             break;
     667                 :            :         case FAMILY_DECORATIVE:
     668                 :          0 :             aB |= 5 << 4;   // aF.ff = 5;
     669                 :          0 :             break;
     670                 :            :         default:            // aF.ff = 0; FF_DONTCARE (windows.h)
     671                 :       1032 :             break;
     672                 :            :     }
     673                 :       2460 :     maWW8_FFN[1] = aB;
     674                 :            : 
     675                 :       2460 :     ShortToSVBT16( 400, &maWW8_FFN[2] );        // weiss ich nicht besser
     676                 :            :                                                 // 400 == FW_NORMAL (windows.h)
     677                 :            :                                                 //
     678                 :            :     //#i61927# For unicode fonts like Arial Unicode, Word 97+ sets the chs
     679                 :            :     //to SHIFTJIS presumably to capture that it's a multi-byte encoding font
     680                 :            :     //but Word95 doesn't do this, and sets it to 0 (ANSI), so we should do the
     681                 :            :     //same
     682                 :            :     maWW8_FFN[4] = bWrtWW8 ?
     683                 :       2460 :         sw::ms::rtl_TextEncodingToWinCharset(eChrSet) :
     684 [ +  - ][ #  # ]:       2460 :         rtl_getBestWindowsCharsetFromTextEncoding(eChrSet);
                 [ +  - ]
     685                 :            : 
     686         [ +  + ]:       2460 :     if (mbAlt)
     687         [ +  - ]:       2460 :         maWW8_FFN[5] = static_cast< sal_uInt8 >(msFamilyNm.Len() + 1);
     688                 :       2460 : }
     689                 :            : 
     690                 :         96 : bool wwFont::Write(SvStream *pTableStrm) const
     691                 :            : {
     692                 :         96 :     pTableStrm->Write(maWW8_FFN, sizeof(maWW8_FFN));    // fixed part
     693         [ +  - ]:         96 :     if (mbWrtWW8)
     694                 :            :     {
     695                 :            :         // ab Ver8 sind folgende beiden Felder eingeschoben,
     696                 :            :         // werden von uns ignoriert.
     697                 :            :         //char  panose[ 10 ];       //  0x6   PANOSE
     698                 :            :         //char  fs[ 24     ];       //  0x10  FONTSIGNATURE
     699                 :         96 :         SwWW8Writer::FillCount(*pTableStrm, 0x22);
     700                 :         96 :         SwWW8Writer::WriteString16(*pTableStrm, msFamilyNm, true);
     701         [ +  + ]:         96 :         if (mbAlt)
     702                 :         21 :             SwWW8Writer::WriteString16(*pTableStrm, msAltNm, true);
     703                 :            :     }
     704                 :            :     else
     705                 :            :     {
     706                 :            :         SwWW8Writer::WriteString8(*pTableStrm, msFamilyNm, true,
     707                 :          0 :             RTL_TEXTENCODING_MS_1252);
     708         [ #  # ]:          0 :         if (mbAlt)
     709                 :            :         {
     710                 :            :             SwWW8Writer::WriteString8( *pTableStrm, msAltNm, true,
     711                 :          0 :                 RTL_TEXTENCODING_MS_1252);
     712                 :            :         }
     713                 :            :     }
     714                 :         96 :     return true;
     715                 :            : }
     716                 :            : 
     717                 :        285 : void wwFont::WriteDocx( const DocxAttributeOutput* rAttrOutput ) const
     718                 :            : {
     719                 :            :     // no font embedding, panose id, subsetting, ... implemented
     720                 :            : 
     721                 :        285 :     rAttrOutput->StartFont( msFamilyNm );
     722                 :            : 
     723         [ +  + ]:        285 :     if ( mbAlt )
     724                 :        102 :         rAttrOutput->FontAlternateName( msAltNm );
     725                 :        285 :     rAttrOutput->FontCharset( sw::ms::rtl_TextEncodingToWinCharset( meChrSet ), meChrSet );
     726                 :        285 :     rAttrOutput->FontFamilyType( meFamily );
     727                 :        285 :     rAttrOutput->FontPitchType( mePitch );
     728                 :            : 
     729                 :        285 :     rAttrOutput->EndFont();
     730                 :        285 : }
     731                 :            : 
     732                 :        705 : void wwFont::WriteRtf( const RtfAttributeOutput* rAttrOutput ) const
     733                 :            : {
     734                 :        705 :     rAttrOutput->FontFamilyType( meFamily, *this );
     735                 :        705 :     rAttrOutput->FontPitchType( mePitch );
     736                 :        705 :     rAttrOutput->FontCharset( rtl_getBestWindowsCharsetFromTextEncoding( meChrSet ) );
     737                 :        705 :     rAttrOutput->StartFont( msFamilyNm );
     738         [ +  + ]:        705 :     if ( mbAlt )
     739                 :        234 :         rAttrOutput->FontAlternateName( msAltNm );
     740                 :        705 :     rAttrOutput->EndFont();
     741                 :        705 : }
     742                 :            : 
     743                 :      16983 : bool operator<(const wwFont &r1, const wwFont &r2)
     744                 :            : {
     745                 :      16983 :     int nRet = memcmp(r1.maWW8_FFN, r2.maWW8_FFN, sizeof(r1.maWW8_FFN));
     746         [ +  + ]:      16983 :     if (nRet == 0)
     747                 :            :     {
     748                 :       5055 :         StringCompare eRet = r1.msFamilyNm.CompareTo(r2.msFamilyNm);
     749         [ +  + ]:       5055 :         if (eRet == COMPARE_EQUAL)
     750                 :       4158 :             eRet = r1.msAltNm.CompareTo(r2.msAltNm);
     751                 :       5055 :         nRet = eRet;
     752                 :            :     }
     753                 :      16983 :     return nRet < 0;
     754                 :            : }
     755                 :            : 
     756                 :            : 
     757                 :       3165 : sal_uInt16 wwFontHelper::GetId(const wwFont &rFont)
     758                 :            : {
     759                 :            :     sal_uInt16 nRet;
     760         [ +  - ]:       3165 :     ::std::map<wwFont, sal_uInt16>::const_iterator aIter = maFonts.find(rFont);
     761         [ +  + ]:       3165 :     if (aIter != maFonts.end())
     762                 :       2079 :         nRet = aIter->second;
     763                 :            :     else
     764                 :            :     {
     765                 :       1086 :         nRet = static_cast< sal_uInt16 >(maFonts.size());
     766         [ +  - ]:       1086 :         maFonts[rFont] = nRet;
     767                 :            :     }
     768                 :       3165 :     return nRet;
     769                 :            : }
     770                 :            : 
     771                 :        144 : void wwFontHelper::InitFontTable(bool bWrtWW8,const SwDoc& rDoc)
     772                 :            : {
     773                 :        144 :     mbWrtWW8 = bWrtWW8;
     774                 :            : 
     775                 :            :     GetId(wwFont(rtl::OUString("Times New Roman"), PITCH_VARIABLE,
     776 [ +  - ][ +  - ]:        144 :         FAMILY_ROMAN, RTL_TEXTENCODING_MS_1252,bWrtWW8));
         [ +  - ][ +  - ]
                 [ +  - ]
     777                 :            : 
     778                 :            :     GetId(wwFont(rtl::OUString("Symbol"), PITCH_VARIABLE, FAMILY_ROMAN,
     779 [ +  - ][ +  - ]:        144 :         RTL_TEXTENCODING_SYMBOL,bWrtWW8));
         [ +  - ][ +  - ]
                 [ +  - ]
     780                 :            : 
     781                 :            :     GetId(wwFont(rtl::OUString("Arial"), PITCH_VARIABLE, FAMILY_SWISS,
     782 [ +  - ][ +  - ]:        144 :         RTL_TEXTENCODING_MS_1252,bWrtWW8));
         [ +  - ][ +  - ]
                 [ +  - ]
     783                 :            : 
     784         [ +  - ]:        144 :     const SvxFontItem* pFont = (const SvxFontItem*)GetDfltAttr(RES_CHRATR_FONT);
     785                 :            : 
     786                 :        144 :     GetId(wwFont(pFont->GetFamilyName(), pFont->GetPitch(),
     787 [ +  - ][ +  - ]:        288 :         pFont->GetFamily(), pFont->GetCharSet(),bWrtWW8));
                 [ +  - ]
     788                 :            : 
     789                 :        144 :     const SfxItemPool& rPool = rDoc.GetAttrPool();
     790 [ +  - ][ +  - ]:        144 :     if (0 != (pFont = (const SvxFontItem*)rPool.GetPoolDefaultItem(RES_CHRATR_FONT)))
     791                 :            :     {
     792                 :        144 :         GetId(wwFont(pFont->GetFamilyName(), pFont->GetPitch(),
     793 [ +  - ][ +  - ]:        288 :             pFont->GetFamily(), pFont->GetCharSet(),bWrtWW8));
                 [ +  - ]
     794                 :            :     }
     795                 :            : 
     796         [ +  + ]:        144 :     if (!bLoadAllFonts)
     797                 :        144 :         return;
     798                 :            : 
     799                 :         78 :     const sal_uInt16 aTypes[] = { RES_CHRATR_FONT, RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_FONT, 0 };
     800         [ +  + ]:        378 :     for (const sal_uInt16* pId = aTypes; *pId; ++pId)
     801                 :            :     {
     802         [ +  - ]:        234 :         sal_uInt32 const nMaxItem = rPool.GetItemCount2( *pId );
     803         [ +  + ]:        711 :         for (sal_uInt32 nGet = 0; nGet < nMaxItem; ++nGet)
     804                 :            :         {
     805         [ +  - ]:        477 :             pFont = (const SvxFontItem*)rPool.GetItem2( *pId, nGet );
     806         [ +  + ]:        477 :             if (0 != pFont)
     807                 :            :             {
     808                 :        387 :                 GetId(wwFont(pFont->GetFamilyName(), pFont->GetPitch(),
     809 [ +  - ][ +  - ]:        774 :                             pFont->GetFamily(), pFont->GetCharSet(),bWrtWW8));
                 [ +  - ]
     810                 :            :             }
     811                 :            :         }
     812                 :            :     }
     813                 :            : }
     814                 :            : 
     815                 :          0 : sal_uInt16 wwFontHelper::GetId(const Font& rFont)
     816                 :            : {
     817         [ #  # ]:          0 :     wwFont aFont(rFont.GetName(), rFont.GetPitch(), rFont.GetFamily(),
     818 [ #  # ][ #  # ]:          0 :         rFont.GetCharSet(), mbWrtWW8);
         [ #  # ][ #  # ]
     819 [ #  # ][ #  # ]:          0 :     return GetId(aFont);
     820                 :            : }
     821                 :            : 
     822                 :       1353 : sal_uInt16 wwFontHelper::GetId(const SvxFontItem& rFont)
     823                 :            : {
     824                 :       1353 :     wwFont aFont(rFont.GetFamilyName(), rFont.GetPitch(), rFont.GetFamily(),
     825         [ +  - ]:       2706 :         rFont.GetCharSet(), mbWrtWW8);
     826 [ +  - ][ +  - ]:       1353 :     return GetId(aFont);
     827                 :            : }
     828                 :            : 
     829                 :        144 : ::std::vector< const wwFont* > wwFontHelper::AsVector() const
     830                 :            : {
     831         [ +  - ]:        144 :     ::std::vector<const wwFont *> aFontList( maFonts.size() );
     832                 :            : 
     833                 :            :     typedef ::std::map<wwFont, sal_uInt16>::const_iterator myiter;
     834                 :        144 :     myiter aEnd = maFonts.end();
     835         [ +  + ]:       1230 :     for ( myiter aIter = maFonts.begin(); aIter != aEnd; ++aIter )
     836                 :       1086 :         aFontList[aIter->second] = &aIter->first;
     837                 :            : 
     838                 :        144 :     return aFontList;
     839                 :            : }
     840                 :            : 
     841                 :          9 : void wwFontHelper::WriteFontTable(SvStream *pTableStream, WW8Fib& rFib)
     842                 :            : {
     843                 :          9 :     rFib.fcSttbfffn = pTableStream->Tell();
     844                 :            :     /*
     845                 :            :      * Reserve some space to fill in the len after we know how big it is
     846                 :            :      */
     847         [ +  - ]:          9 :     if (mbWrtWW8)
     848         [ +  - ]:          9 :         SwWW8Writer::WriteLong(*pTableStream, 0);
     849                 :            :     else
     850         [ #  # ]:          0 :         SwWW8Writer::WriteShort(*pTableStream, 0);
     851                 :            : 
     852                 :            :     /*
     853                 :            :      * Convert from fast insertion map to linear vector in the order that we
     854                 :            :      * want to write.
     855                 :            :      */
     856         [ +  - ]:          9 :     ::std::vector<const wwFont *> aFontList( AsVector() );
     857                 :            : 
     858                 :            :     /*
     859                 :            :      * Write them all to pTableStream
     860                 :            :      */
     861                 :            :     ::std::for_each(aFontList.begin(), aFontList.end(),
     862 [ +  - ][ +  - ]:          9 :         ::std::bind2nd(::std::mem_fun(&wwFont::Write),pTableStream));
                 [ +  - ]
     863                 :            : 
     864                 :            :     /*
     865                 :            :      * Write the position and len in the FIB
     866                 :            :      */
     867                 :          9 :     rFib.lcbSttbfffn = pTableStream->Tell() - rFib.fcSttbfffn;
     868         [ +  - ]:          9 :     if (mbWrtWW8)
     869         [ +  - ]:          9 :         SwWW8Writer::WriteLong( *pTableStream, rFib.fcSttbfffn, maFonts.size());
     870                 :            :     else
     871                 :            :     {
     872                 :            :         SwWW8Writer::WriteShort( *pTableStream, rFib.fcSttbfffn,
     873         [ #  # ]:          0 :             (sal_Int16)rFib.lcbSttbfffn );
     874                 :          9 :     }
     875                 :          9 : }
     876                 :            : 
     877                 :         57 : void wwFontHelper::WriteFontTable( const DocxAttributeOutput& rAttrOutput )
     878                 :            : {
     879         [ +  - ]:         57 :     ::std::vector<const wwFont *> aFontList( AsVector() );
     880                 :            : 
     881                 :            :     ::std::for_each( aFontList.begin(), aFontList.end(),
     882 [ +  - ][ +  - ]:         57 :         ::std::bind2nd( ::std::mem_fun( &wwFont::WriteDocx ), &rAttrOutput ) );
                 [ +  - ]
     883                 :         57 : }
     884                 :            : 
     885                 :         78 : void wwFontHelper::WriteFontTable( const RtfAttributeOutput& rAttrOutput )
     886                 :            : {
     887         [ +  - ]:         78 :     ::std::vector<const wwFont *> aFontList( AsVector() );
     888                 :            : 
     889                 :            :     ::std::for_each( aFontList.begin(), aFontList.end(),
     890 [ +  - ][ +  - ]:         78 :         ::std::bind2nd( ::std::mem_fun( &wwFont::WriteRtf ), &rAttrOutput ) );
                 [ +  - ]
     891                 :         78 : }
     892                 :            : 
     893                 :            : 
     894                 :         15 : WW8_WrPlc0::WW8_WrPlc0( sal_uLong nOffset )
     895                 :         15 :     : nOfs( nOffset )
     896                 :            : {
     897                 :         15 : }
     898                 :            : 
     899                 :        138 : void WW8_WrPlc0::Append( sal_uLong nStartCpOrFc )
     900                 :            : {
     901         [ +  - ]:        138 :     aPos.push_back( nStartCpOrFc - nOfs );
     902                 :        138 : }
     903                 :            : 
     904                 :         12 : void WW8_WrPlc0::Write( SvStream& rStrm )
     905                 :            : {
     906                 :         12 :     std::vector<sal_uLong>::const_iterator iter;
     907 [ +  - ][ +  - ]:         81 :     for( iter = aPos.begin(); iter != aPos.end(); ++iter )
         [ +  - ][ +  + ]
     908                 :            :     {
     909                 :            :         SVBT32 nP;
     910         [ +  - ]:         69 :         UInt32ToSVBT32( *iter, nP );
     911         [ +  - ]:         69 :         rStrm.Write( nP, 4 );
     912                 :            :     }
     913                 :         12 : }
     914                 :            : 
     915                 :            : //------------------------------------------------------------------------------
     916                 :            : 
     917                 :            : //------------------------------------------------------------------------------
     918                 :            : // class MSWordSections : Uebersetzung PageDescs in Sections
     919                 :            : //      behandelt auch Header und Footer
     920                 :            : //------------------------------------------------------------------------------
     921                 :            : 
     922                 :        144 : MSWordSections::MSWordSections( MSWordExportBase& rExport )
     923                 :        144 :     : mbDocumentIsProtected( false )
     924                 :            : {
     925                 :        144 :     const SwSectionFmt *pFmt = 0;
     926         [ +  - ]:        144 :     rExport.pAktPageDesc = &rExport.pDoc->GetPageDesc( 0 );
     927                 :            : 
     928                 :            :     const SfxPoolItem* pI;
     929         [ +  - ]:        144 :     const SwNode* pNd = rExport.pCurPam->GetCntntNode();
     930 [ +  - ][ +  - ]:        144 :     const SfxItemSet* pSet = pNd ? &((SwCntntNode*)pNd)->GetSwAttrSet() : 0;
                 [ +  - ]
     931                 :            : 
     932 [ +  - ][ +  - ]:        144 :     sal_uLong nRstLnNum =  pSet ? ((SwFmtLineNumber&)pSet->Get( RES_LINENUMBER )).GetStartValue() : 0;
     933                 :            : 
     934         [ +  - ]:        144 :     const SwTableNode* pTblNd = rExport.pCurPam->GetNode()->FindTableNode();
     935                 :            :     const SwSectionNode* pSectNd;
     936         [ -  + ]:        144 :     if ( pTblNd )
     937                 :            :     {
     938                 :          0 :         pSet = &pTblNd->GetTable().GetFrmFmt()->GetAttrSet();
     939                 :          0 :         pNd = pTblNd;
     940                 :            :     }
     941 [ +  - ][ -  + ]:        144 :     else if ( 0 != ( pSectNd = pNd->FindSectionNode() ) )
     942                 :            :     {
     943   [ #  #  #  # ]:          0 :         if ( TOX_HEADER_SECTION == pSectNd->GetSection().GetType() &&
                 [ #  # ]
     944                 :          0 :              pSectNd->StartOfSectionNode()->IsSectionNode() )
     945                 :            :         {
     946                 :          0 :             pSectNd = pSectNd->StartOfSectionNode()->GetSectionNode();
     947                 :            :         }
     948                 :            : 
     949         [ #  # ]:          0 :         if ( TOX_CONTENT_SECTION == pSectNd->GetSection().GetType() )
     950                 :            :         {
     951                 :          0 :             pNd = pSectNd;
     952         [ #  # ]:          0 :             rExport.pCurPam->GetPoint()->nNode = *pNd;
     953                 :            :         }
     954                 :            : 
     955         [ #  # ]:          0 :         if ( CONTENT_SECTION == pSectNd->GetSection().GetType() )
     956                 :          0 :             pFmt = pSectNd->GetSection().GetFmt();
     957                 :            :     }
     958                 :            : 
     959                 :            :     // Hole evtl. Pagedesc des 1. Nodes
     960         [ +  - ]:        414 :     if ( pSet &&
           [ +  +  +  - ]
                 [ +  + ]
     961         [ +  - ]:        144 :          SFX_ITEM_ON == pSet->GetItemState( RES_PAGEDESC, true, &pI ) &&
     962                 :        126 :          ( (SwFmtPageDesc*)pI )->GetPageDesc() )
     963                 :            :     {
     964         [ +  - ]:        126 :         AppendSection( *(SwFmtPageDesc*)pI, *pNd, pFmt, nRstLnNum );
     965                 :            :     }
     966                 :            :     else
     967         [ +  - ]:         18 :         AppendSection( rExport.pAktPageDesc, pFmt, nRstLnNum );
     968                 :        144 : }
     969                 :            : 
     970                 :          9 : WW8_WrPlcSepx::WW8_WrPlcSepx( MSWordExportBase& rExport )
     971                 :            :     : MSWordSections( rExport ),
     972                 :            :       pAttrs( 0 ),
     973                 :            :       pTxtPos( 0 ),
     974         [ +  - ]:          9 :       bNoMoreSections( false )
     975                 :            : {
     976                 :            :     // to be in sync with the AppendSection() call in the MSWordSections
     977                 :            :     // constructor
     978         [ +  - ]:          9 :     aCps.push_back( 0 );
     979                 :          9 : }
     980                 :            : 
     981                 :         66 : MSWordSections::~MSWordSections()
     982                 :            : {
     983         [ -  + ]:        123 : }
     984                 :            : 
     985                 :          9 : WW8_WrPlcSepx::~WW8_WrPlcSepx()
     986                 :            : {
     987                 :          9 :     sal_uInt16 nLen = aSects.size();
     988         [ +  - ]:          9 :     if( pAttrs )
     989                 :            :     {
     990         [ +  + ]:         18 :         while( nLen )
     991         [ +  - ]:          9 :             delete[] pAttrs[ --nLen ].pData;
     992         [ +  - ]:          9 :         delete[] pAttrs;
     993                 :            :     }
     994         [ +  - ]:          9 :     delete pTxtPos;
     995         [ -  + ]:         18 : }
     996                 :            : 
     997                 :          0 : sal_uInt16 MSWordSections::CurrentNumberOfColumns( const SwDoc &rDoc ) const
     998                 :            : {
     999                 :            :     OSL_ENSURE( !aSects.empty(), "no segement inserted yet" );
    1000         [ #  # ]:          0 :     if ( aSects.empty() )
    1001                 :          0 :         return 1;
    1002                 :            : 
    1003                 :          0 :     return NumberOfColumns( rDoc, aSects.back() );
    1004                 :            : }
    1005                 :            : 
    1006                 :          0 : sal_uInt16 MSWordSections::NumberOfColumns( const SwDoc &rDoc, const WW8_SepInfo& rInfo ) const
    1007                 :            : {
    1008                 :          0 :     const SwPageDesc* pPd = rInfo.pPageDesc;
    1009         [ #  # ]:          0 :     if ( !pPd )
    1010         [ #  # ]:          0 :         pPd = &rDoc.GetPageDesc( 0 );
    1011                 :            : 
    1012         [ #  # ]:          0 :     if ( !pPd )
    1013                 :            :     {
    1014                 :            :         OSL_ENSURE( pPd, "totally impossible" );
    1015                 :          0 :         return 1;
    1016                 :            :     }
    1017                 :            : 
    1018                 :          0 :     const SfxItemSet &rSet = pPd->GetMaster().GetAttrSet();
    1019         [ #  # ]:          0 :     SfxItemSet aSet( *rSet.GetPool(), RES_COL, RES_COL );
    1020                 :          0 :     aSet.SetParent( &rSet );
    1021                 :            : 
    1022                 :            :     //0xffffffff, what the hell is going on with that!, fixme most terribly
    1023 [ #  # ][ #  # ]:          0 :     if ( rInfo.pSectionFmt && (SwSectionFmt*)0xFFFFFFFF != rInfo.pSectionFmt )
    1024 [ #  # ][ #  # ]:          0 :         aSet.Put( rInfo.pSectionFmt->GetFmtAttr( RES_COL ) );
    1025                 :            : 
    1026         [ #  # ]:          0 :     const SwFmtCol& rCol = (const SwFmtCol&)aSet.Get( RES_COL );
    1027                 :          0 :     const SwColumns& rColumns = rCol.GetColumns();
    1028         [ #  # ]:          0 :     return rColumns.size();
    1029                 :            : }
    1030                 :            : 
    1031                 :         60 : const WW8_SepInfo* MSWordSections::CurrentSectionInfo()
    1032                 :            : {
    1033         [ +  - ]:         60 :     if ( !aSects.empty() )
    1034                 :         60 :         return &aSects.back();
    1035                 :            : 
    1036                 :         60 :     return NULL;
    1037                 :            : }
    1038                 :            : 
    1039                 :         18 : void MSWordSections::AppendSection( const SwPageDesc* pPd,
    1040                 :            :     const SwSectionFmt* pSectionFmt, sal_uLong nLnNumRestartNo )
    1041                 :            : {
    1042         [ +  - ]:         18 :     aSects.push_back( WW8_SepInfo( pPd, pSectionFmt, nLnNumRestartNo ) );
    1043                 :         18 :     NeedsDocumentProtected( aSects.back() );
    1044                 :         18 : }
    1045                 :            : 
    1046                 :          0 : void WW8_WrPlcSepx::AppendSep( WW8_CP nStartCp, const SwPageDesc* pPd,
    1047                 :            :     const SwSectionFmt* pSectionFmt, sal_uLong nLnNumRestartNo )
    1048                 :            : {
    1049         [ #  # ]:          0 :     if ( !bNoMoreSections )
    1050                 :            :     {
    1051                 :          0 :         aCps.push_back( nStartCp );
    1052                 :            : 
    1053                 :          0 :         AppendSection( pPd, pSectionFmt, nLnNumRestartNo );
    1054                 :            :     }
    1055                 :          0 : }
    1056                 :            : 
    1057                 :        132 : void MSWordSections::AppendSection( const SwFmtPageDesc& rPD,
    1058                 :            :     const SwNode& rNd, const SwSectionFmt* pSectionFmt, sal_uLong nLnNumRestartNo )
    1059                 :            : {
    1060                 :            :     WW8_SepInfo aI( rPD.GetPageDesc(), pSectionFmt, nLnNumRestartNo,
    1061                 :        132 :             rPD.GetNumOffset(), &rNd );
    1062         [ +  - ]:        132 :     aSects.push_back( aI );
    1063         [ +  - ]:        132 :     NeedsDocumentProtected( aI );
    1064                 :        132 : }
    1065                 :            : 
    1066                 :          0 : void WW8_WrPlcSepx::AppendSep( WW8_CP nStartCp, const SwFmtPageDesc& rPD,
    1067                 :            :     const SwNode& rNd, const SwSectionFmt* pSectionFmt, sal_uLong nLnNumRestartNo )
    1068                 :            : {
    1069         [ #  # ]:          0 :     if ( !bNoMoreSections )
    1070                 :            :     {
    1071                 :          0 :         aCps.push_back( nStartCp );
    1072                 :            : 
    1073                 :          0 :         AppendSection( rPD, rNd, pSectionFmt, nLnNumRestartNo );
    1074                 :            :     }
    1075                 :          0 : }
    1076                 :            : 
    1077                 :            : // MSWordSections::SetNum() setzt in jeder Section beim 1. Aufruf den
    1078                 :            : // Num-Pointer, alle folgenden Aufrufe werden ignoriert. Damit wird
    1079                 :            : // die erste Aufzaehlung einer Section uebernommen.
    1080                 :            : 
    1081                 :          0 : void MSWordSections::SetNum( const SwTxtNode* pNumNd )
    1082                 :            : {
    1083                 :          0 :     WW8_SepInfo& rInfo = aSects.back();
    1084         [ #  # ]:          0 :     if ( !rInfo.pNumNd ) // noch nicht belegt
    1085                 :          0 :         rInfo.pNumNd = pNumNd;
    1086                 :          0 : }
    1087                 :            : 
    1088                 :          9 : void WW8_WrPlcSepx::WriteFtnEndTxt( WW8Export& rWrt, sal_uLong nCpStt )
    1089                 :            : {
    1090                 :          9 :     sal_uInt8 nInfoFlags = 0;
    1091                 :          9 :     const SwFtnInfo& rInfo = rWrt.pDoc->GetFtnInfo();
    1092         [ -  + ]:          9 :     if( rInfo.aErgoSum.Len() )  nInfoFlags |= 0x02;
    1093         [ -  + ]:          9 :     if( rInfo.aQuoVadis.Len() ) nInfoFlags |= 0x04;
    1094                 :            : 
    1095         [ +  - ]:          9 :     sal_uInt8 nEmptyStt = rWrt.bWrtWW8 ? 0 : 6;
    1096         [ -  + ]:          9 :     if( nInfoFlags )
    1097                 :            :     {
    1098         [ #  # ]:          0 :         if( rWrt.bWrtWW8 )
    1099                 :          0 :             pTxtPos->Append( nCpStt );  // empty footenote separator
    1100                 :            : 
    1101         [ #  # ]:          0 :         if( 0x02 & nInfoFlags )         // Footenote contiunation separator
    1102                 :            :         {
    1103                 :          0 :             pTxtPos->Append( nCpStt );
    1104                 :          0 :             rWrt.WriteStringAsPara( rInfo.aErgoSum );
    1105                 :          0 :             rWrt.WriteStringAsPara( aEmptyStr );
    1106                 :          0 :             nCpStt = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    1107                 :            :         }
    1108         [ #  # ]:          0 :         else if( rWrt.bWrtWW8 )
    1109                 :          0 :             pTxtPos->Append( nCpStt );
    1110                 :            : 
    1111         [ #  # ]:          0 :         if( 0x04 & nInfoFlags )         // Footenote contiunation notice
    1112                 :            :         {
    1113                 :          0 :             pTxtPos->Append( nCpStt );
    1114                 :          0 :             rWrt.WriteStringAsPara( rInfo.aQuoVadis );
    1115                 :          0 :             rWrt.WriteStringAsPara( aEmptyStr );
    1116                 :          0 :             nCpStt = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    1117                 :            :         }
    1118         [ #  # ]:          0 :         else if( rWrt.bWrtWW8 )
    1119                 :          0 :             pTxtPos->Append( nCpStt );
    1120                 :            : 
    1121         [ #  # ]:          0 :         if( rWrt.bWrtWW8 )
    1122                 :          0 :             nEmptyStt = 3;
    1123                 :            :         else
    1124                 :          0 :             rWrt.pDop->grpfIhdt = nInfoFlags;
    1125                 :            :     }
    1126                 :            : 
    1127         [ +  + ]:         63 :     while( 6 > nEmptyStt++ )
    1128                 :         54 :         pTxtPos->Append( nCpStt );
    1129                 :            : 
    1130                 :            :     // gleich die Flags am Dop setzen
    1131                 :          9 :     WW8Dop& rDop = *rWrt.pDop;
    1132                 :            :     // Footnote Info
    1133      [ -  -  + ]:          9 :     switch( rInfo.eNum )
    1134                 :            :     {
    1135                 :          0 :     case FTNNUM_PAGE:       rDop.rncFtn = 2; break;
    1136                 :          0 :     case FTNNUM_CHAPTER:    rDop.rncFtn  = 1; break;
    1137                 :          9 :     default: rDop.rncFtn  = 0; break;
    1138                 :            :     }                                   // rncFtn
    1139                 :          9 :     rDop.nfcFtnRef = WW8Export::GetNumId( rInfo.aFmt.GetNumberingType() );
    1140                 :          9 :     rDop.nFtn = rInfo.nFtnOffset + 1;
    1141         [ +  + ]:          9 :     rDop.fpc = rWrt.bFtnAtTxtEnd ? 2 : 1;
    1142                 :            : 
    1143                 :            :     // Endnote Info
    1144                 :          9 :     rDop.rncEdn = 0;                        // rncEdn: Don't Restart
    1145                 :          9 :     const SwEndNoteInfo& rEndInfo = rWrt.pDoc->GetEndNoteInfo();
    1146                 :          9 :     rDop.nfcEdnRef = WW8Export::GetNumId( rEndInfo.aFmt.GetNumberingType() );
    1147                 :          9 :     rDop.nEdn = rEndInfo.nFtnOffset + 1;
    1148         [ +  - ]:          9 :     rDop.epc = rWrt.bEndAtTxtEnd ? 3 : 0;
    1149                 :          9 : }
    1150                 :            : 
    1151                 :         69 : void MSWordSections::SetHeaderFlag( sal_uInt8& rHeadFootFlags, const SwFmt& rFmt,
    1152                 :            :     sal_uInt8 nFlag )
    1153                 :            : {
    1154                 :            :     const SfxPoolItem* pItem;
    1155 [ +  - ][ +  +  :        138 :     if( SFX_ITEM_SET == rFmt.GetItemState(RES_HEADER, true, &pItem)
             +  +  +  - ]
                 [ +  + ]
    1156                 :         66 :         && ((SwFmtHeader*)pItem)->IsActive() &&
    1157                 :          3 :         ((SwFmtHeader*)pItem)->GetHeaderFmt() )
    1158                 :          3 :         rHeadFootFlags |= nFlag;
    1159                 :         69 : }
    1160                 :            : 
    1161                 :         69 : void MSWordSections::SetFooterFlag( sal_uInt8& rHeadFootFlags, const SwFmt& rFmt,
    1162                 :            :     sal_uInt8 nFlag )
    1163                 :            : {
    1164                 :            :     const SfxPoolItem* pItem;
    1165 [ +  - ][ +  +  :        138 :     if( SFX_ITEM_SET == rFmt.GetItemState(RES_FOOTER, true, &pItem)
             +  +  +  - ]
                 [ +  + ]
    1166                 :         66 :         && ((SwFmtFooter*)pItem)->IsActive() &&
    1167                 :          3 :         ((SwFmtFooter*)pItem)->GetFooterFmt() )
    1168                 :          3 :         rHeadFootFlags |= nFlag;
    1169                 :         69 : }
    1170                 :            : 
    1171                 :         54 : void WW8_WrPlcSepx::OutHeaderFooter( WW8Export& rWrt, bool bHeader,
    1172                 :            :                      const SwFmt& rFmt, sal_uLong& rCpPos, sal_uInt8 nHFFlags,
    1173                 :            :                      sal_uInt8 nFlag,  sal_uInt8 nBreakCode)
    1174                 :            : {
    1175         [ +  + ]:         54 :     if ( nFlag & nHFFlags )
    1176                 :            :     {
    1177                 :          6 :         pTxtPos->Append( rCpPos );
    1178                 :          6 :         rWrt.WriteHeaderFooterText( rFmt, bHeader);
    1179                 :          6 :         rWrt.WriteStringAsPara( aEmptyStr ); // CR ans Ende ( sonst mault WW )
    1180                 :          6 :         rCpPos = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    1181                 :            :     }
    1182         [ +  - ]:         48 :     else if ( rWrt.bWrtWW8 )
    1183                 :            :     {
    1184                 :         48 :         pTxtPos->Append( rCpPos );
    1185 [ +  - ][ +  + ]:         48 :         if (rWrt.bHasHdr && nBreakCode!=0)
    1186                 :            :         {
    1187                 :          9 :             rWrt.WriteStringAsPara( aEmptyStr ); // Empty paragraph for empty header/footer
    1188                 :          9 :             rWrt.WriteStringAsPara( aEmptyStr ); // a CR that WW8 needs for end of the stream
    1189                 :          9 :             rCpPos = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    1190                 :            :         }
    1191                 :            :     }
    1192                 :         54 : }
    1193                 :            : 
    1194                 :        150 : void MSWordSections::NeedsDocumentProtected(const WW8_SepInfo &rInfo)
    1195                 :            : {
    1196         [ -  + ]:        150 :     if (rInfo.IsProtected())
    1197                 :          0 :         mbDocumentIsProtected = true;
    1198                 :        150 : }
    1199                 :            : 
    1200                 :        219 : bool WW8_SepInfo::IsProtected() const
    1201                 :            : {
    1202                 :        219 :     bool bRet = false;
    1203 [ -  + ][ #  # ]:        219 :     if (
    1204                 :            :          pSectionFmt &&
    1205                 :            :          ((SwSectionFmt*)0xFFFFFFFF != pSectionFmt)
    1206                 :            :        )
    1207                 :            :     {
    1208                 :          0 :         const SwSection *pSection = pSectionFmt->GetSection();
    1209 [ #  # ][ #  # ]:          0 :         if (pSection && pSection->IsProtect())
                 [ #  # ]
    1210                 :            :         {
    1211                 :          0 :             bRet = true;
    1212                 :            :         }
    1213                 :            :     }
    1214                 :        219 :     return bRet;
    1215                 :            : }
    1216                 :            : 
    1217                 :            : 
    1218                 :          9 : void MSWordSections::CheckForFacinPg( WW8Export& rWrt ) const
    1219                 :            : {
    1220                 :            :     // 2 Werte werden gesetzt
    1221                 :            :     //      Dop.fFacingPages            == Kopf-/Fusszeilen unterschiedlich
    1222                 :            :     //      Dop.fSwapBordersFacingPgs   == gespiegelte Raender
    1223                 :          9 :     std::vector<WW8_SepInfo>::const_iterator iter = aSects.begin();
    1224 [ +  - ][ +  + ]:         18 :     for( sal_uInt16 nEnde = 0; iter != aSects.end(); ++iter )
    1225                 :            :     {
    1226                 :          9 :         const WW8_SepInfo& rSepInfo = *iter;
    1227         [ +  - ]:          9 :         if( !rSepInfo.pSectionFmt )
    1228                 :            :         {
    1229                 :          9 :             const SwPageDesc* pPd = rSepInfo.pPageDesc;
    1230         [ +  - ]:          9 :             if( pPd->GetFollow() && pPd != pPd->GetFollow() &&
           [ -  +  #  # ]
         [ #  # ][ #  # ]
                 [ -  + ]
    1231                 :          0 :                 pPd->GetFollow()->GetFollow() == pPd->GetFollow() &&
    1232                 :            :                 rSepInfo.pPDNd &&
    1233         [ #  # ]:          0 :                 pPd->IsFollowNextPageOfNode( *rSepInfo.pPDNd ) )
    1234                 :            :                 // das ist also 1.Seite und nachfolgende, also nur den
    1235                 :            :                 // follow beachten
    1236                 :          0 :                 pPd = pPd->GetFollow();
    1237                 :            : 
    1238                 :            :             // left-/right chain of pagedescs ?
    1239   [ +  -  +  -  :         27 :             else if( !( 1 & nEnde ) &&
          -  +  #  #  #  
          #  #  #  #  #  
           #  # ][ -  + ]
    1240                 :         18 :                 pPd->GetFollow() && pPd != pPd->GetFollow() &&
    1241                 :          0 :                 pPd->GetFollow()->GetFollow() == pPd &&
    1242                 :          0 :                 (( nsUseOnPage::PD_LEFT == ( nsUseOnPage::PD_ALL & pPd->ReadUseOn() ) &&
    1243                 :          0 :                    nsUseOnPage::PD_RIGHT == ( nsUseOnPage::PD_ALL & pPd->GetFollow()->ReadUseOn() )) ||
    1244                 :          0 :                  ( nsUseOnPage::PD_RIGHT == ( nsUseOnPage::PD_ALL & pPd->ReadUseOn() ) &&
    1245                 :          0 :                    nsUseOnPage::PD_LEFT == ( nsUseOnPage::PD_ALL & pPd->GetFollow()->ReadUseOn() )) ))
    1246                 :            :             {
    1247                 :          0 :                 rWrt.pDop->fFacingPages = rWrt.pDop->fMirrorMargins = true;
    1248                 :          0 :                 nEnde |= 1;
    1249                 :            :             }
    1250                 :            : 
    1251   [ +  -  +  -  :         27 :             if( !( 1 & nEnde ) &&
           -  + ][ -  + ]
    1252                 :         18 :                 ( !pPd->IsHeaderShared() || !pPd->IsFooterShared() ))
    1253                 :            :             {
    1254                 :          0 :                 rWrt.pDop->fFacingPages = true;
    1255                 :          0 :                 nEnde |= 1;
    1256                 :            :             }
    1257   [ +  -  -  + ]:         18 :             if( !( 2 & nEnde ) &&
                 [ -  + ]
    1258                 :          9 :                 nsUseOnPage::PD_MIRROR == ( nsUseOnPage::PD_MIRROR & pPd->ReadUseOn() ))
    1259                 :            :             {
    1260                 :            :                 rWrt.pDop->fSwapBordersFacingPgs =
    1261                 :          0 :                     rWrt.pDop->fMirrorMargins = true;
    1262                 :          0 :                 nEnde |= 2;
    1263                 :            :             }
    1264                 :            : 
    1265         [ -  + ]:          9 :             if( 3 == nEnde )
    1266                 :          0 :                 break;      // weiter brauchen wird nicht
    1267                 :            :         }
    1268                 :            :     }
    1269                 :          9 : }
    1270                 :            : 
    1271                 :          9 : int MSWordSections::HasBorderItem( const SwFmt& rFmt )
    1272                 :            : {
    1273                 :            :     const SfxPoolItem* pItem;
    1274         [ +  - ]:          9 :     return SFX_ITEM_SET == rFmt.GetItemState(RES_BOX, true, &pItem) &&
    1275                 :          0 :             (   ((SvxBoxItem*)pItem)->GetTop() ||
    1276                 :          0 :                 ((SvxBoxItem*)pItem)->GetBottom()  ||
    1277                 :          0 :                 ((SvxBoxItem*)pItem)->GetLeft()  ||
    1278   [ -  +  #  #  :          9 :                 ((SvxBoxItem*)pItem)->GetRight() );
             #  #  #  # ]
                 [ #  # ]
    1279                 :            : }
    1280                 :            : 
    1281                 :          9 : void WW8AttributeOutput::StartSection()
    1282                 :            : {
    1283                 :          9 :     m_rWW8Export.pO->clear();
    1284                 :          9 : }
    1285                 :            : 
    1286                 :          9 : void WW8AttributeOutput::SectionFormProtection( bool bProtected )
    1287                 :            : {
    1288                 :            :     //If the document is to be exported as protected, then if a segment
    1289                 :            :     //is not protected, set the unlocked flag
    1290 [ -  + ][ #  # ]:          9 :     if ( m_rWW8Export.pSepx->DocumentIsProtected() && !bProtected )
                 [ -  + ]
    1291                 :            :     {
    1292         [ #  # ]:          0 :         if ( m_rWW8Export.bWrtWW8 )
    1293                 :          0 :             SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SFProtected );
    1294                 :            :         else
    1295         [ #  # ]:          0 :             m_rWW8Export.pO->push_back( 139 );
    1296         [ #  # ]:          0 :         m_rWW8Export.pO->push_back( 1 );
    1297                 :            :     }
    1298                 :          9 : }
    1299                 :            : 
    1300                 :          0 : void WW8AttributeOutput::SectionLineNumbering( sal_uLong nRestartNo, const SwLineNumberInfo& rLnNumInfo )
    1301                 :            : {
    1302                 :            :     // sprmSNLnnMod - activate Line Numbering and define Modulo
    1303         [ #  # ]:          0 :     if ( m_rWW8Export.bWrtWW8 )
    1304                 :          0 :         SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SNLnnMod );
    1305                 :            :     else
    1306         [ #  # ]:          0 :         m_rWW8Export.pO->push_back( 154 );
    1307                 :          0 :     SwWW8Writer::InsUInt16( *m_rWW8Export.pO, (sal_uInt16)rLnNumInfo.GetCountBy() );
    1308                 :            : 
    1309                 :            :     // sprmSDxaLnn - xPosition of Line Number
    1310         [ #  # ]:          0 :     if ( m_rWW8Export.bWrtWW8 )
    1311                 :          0 :         SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SDxaLnn );
    1312                 :            :     else
    1313         [ #  # ]:          0 :         m_rWW8Export.pO->push_back( 155 );
    1314                 :          0 :     SwWW8Writer::InsUInt16( *m_rWW8Export.pO, (sal_uInt16)rLnNumInfo.GetPosFromLeft() );
    1315                 :            : 
    1316                 :            :     // sprmSLnc - restart number: 0 per page, 1 per section, 2 never restart
    1317 [ #  # ][ #  # ]:          0 :     if ( nRestartNo || !rLnNumInfo.IsRestartEachPage() )
                 [ #  # ]
    1318                 :            :     {
    1319         [ #  # ]:          0 :         if ( m_rWW8Export.bWrtWW8 )
    1320                 :          0 :             SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SLnc );
    1321                 :            :         else
    1322         [ #  # ]:          0 :             m_rWW8Export.pO->push_back( 152 );
    1323 [ #  # ][ #  # ]:          0 :         m_rWW8Export.pO->push_back( nRestartNo ? 1 : 2 );
    1324                 :            :     }
    1325                 :            : 
    1326                 :            :     // sprmSLnnMin - Restart the Line Number with given value
    1327         [ #  # ]:          0 :     if ( nRestartNo )
    1328                 :            :     {
    1329         [ #  # ]:          0 :         if ( m_rWW8Export.bWrtWW8 )
    1330                 :          0 :             SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SLnnMin );
    1331                 :            :         else
    1332         [ #  # ]:          0 :             m_rWW8Export.pO->push_back( 160 );
    1333                 :          0 :         SwWW8Writer::InsUInt16( *m_rWW8Export.pO, (sal_uInt16)nRestartNo - 1 );
    1334                 :            :     }
    1335                 :          0 : }
    1336                 :            : 
    1337                 :          0 : void WW8AttributeOutput::SectionTitlePage()
    1338                 :            : {
    1339                 :            :     // sprmSFTitlePage
    1340         [ #  # ]:          0 :     if ( m_rWW8Export.bWrtWW8 )
    1341                 :          0 :         SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SFTitlePage );
    1342                 :            :     else
    1343         [ #  # ]:          0 :         m_rWW8Export.pO->push_back( 143 );
    1344         [ #  # ]:          0 :     m_rWW8Export.pO->push_back( 1 );
    1345                 :          0 : }
    1346                 :            : 
    1347                 :          9 : void WW8AttributeOutput::SectionPageBorders( const SwFrmFmt* pPdFmt, const SwFrmFmt* pPdFirstPgFmt )
    1348                 :            : {
    1349         [ +  - ]:          9 :     if ( m_rWW8Export.bWrtWW8 )              // Seitenumrandung schreiben
    1350                 :            :     {
    1351         [ -  + ]:          9 :         sal_uInt16 nPgBorder = MSWordSections::HasBorderItem( *pPdFmt ) ? 0 : USHRT_MAX;
    1352         [ -  + ]:          9 :         if ( pPdFmt != pPdFirstPgFmt )
    1353                 :            :         {
    1354         [ #  # ]:          0 :             if ( MSWordSections::HasBorderItem( *pPdFirstPgFmt ) )
    1355                 :            :             {
    1356         [ #  # ]:          0 :                 if ( USHRT_MAX == nPgBorder )
    1357                 :            :                 {
    1358                 :          0 :                     nPgBorder = 1;
    1359                 :            :                     // nur die 1. Seite umrandet -> BoxItem aus dem
    1360                 :            :                     // richtigen Format besorgen
    1361                 :          0 :                     m_rWW8Export.pISet = &pPdFirstPgFmt->GetAttrSet();
    1362                 :          0 :                     OutputItem( pPdFirstPgFmt->GetFmtAttr( RES_BOX ) );
    1363                 :            :                 }
    1364                 :            :             }
    1365         [ #  # ]:          0 :             else if ( !nPgBorder )
    1366                 :          0 :                 nPgBorder = 2;
    1367                 :            :         }
    1368                 :            : 
    1369         [ -  + ]:          9 :         if ( USHRT_MAX != nPgBorder )
    1370                 :            :         {
    1371                 :            :             // Flag und das Border Attribut schreiben
    1372                 :          0 :             SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SPgbProp );
    1373                 :          0 :             SwWW8Writer::InsUInt16( *m_rWW8Export.pO, nPgBorder );
    1374                 :            :         }
    1375                 :            :     }
    1376                 :          9 : }
    1377                 :            : 
    1378                 :          0 : void WW8AttributeOutput::SectionBiDi( bool bBiDi )
    1379                 :            : {
    1380         [ #  # ]:          0 :     if ( m_rWW8Export.bWrtWW8 )
    1381                 :            :     {
    1382                 :          0 :         SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SFBiDi );
    1383 [ #  # ][ #  # ]:          0 :         m_rWW8Export.pO->push_back( bBiDi? 1: 0 );
    1384                 :            :     }
    1385                 :          0 : }
    1386                 :            : 
    1387                 :          9 : void WW8AttributeOutput::SectionPageNumbering( sal_uInt16 nNumType, sal_uInt16 nPageRestartNumber )
    1388                 :            : {
    1389                 :            :     // sprmSNfcPgn
    1390         [ +  - ]:          9 :     sal_uInt8 nb = WW8Export::GetNumId( nNumType );
    1391         [ +  - ]:          9 :     if ( m_rWW8Export.bWrtWW8 )
    1392         [ +  - ]:          9 :         SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SNfcPgn );
    1393                 :            :     else
    1394         [ #  # ]:          0 :         m_rWW8Export.pO->push_back( 147 );
    1395         [ +  - ]:          9 :     m_rWW8Export.pO->push_back( nb );
    1396                 :            : 
    1397         [ -  + ]:          9 :     if ( nPageRestartNumber )
    1398                 :            :     {
    1399                 :            :         // sprmSFPgnRestart
    1400         [ #  # ]:          0 :         if ( m_rWW8Export.bWrtWW8 )
    1401         [ #  # ]:          0 :             SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SFPgnRestart );
    1402                 :            :         else
    1403         [ #  # ]:          0 :             m_rWW8Export.pO->push_back( 150 );
    1404         [ #  # ]:          0 :         m_rWW8Export.pO->push_back( 1 );
    1405                 :            : 
    1406                 :            :         // sprmSPgnStart
    1407         [ #  # ]:          0 :         if ( m_rWW8Export.bWrtWW8 )
    1408         [ #  # ]:          0 :             SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SPgnStart );
    1409                 :            :         else
    1410         [ #  # ]:          0 :             m_rWW8Export.pO->push_back( 161 );
    1411         [ #  # ]:          0 :         SwWW8Writer::InsUInt16( *m_rWW8Export.pO, nPageRestartNumber );
    1412                 :            :     }
    1413                 :          9 : }
    1414                 :            : 
    1415                 :          9 : void WW8AttributeOutput::SectionType( sal_uInt8 nBreakCode )
    1416                 :            : {
    1417         [ -  + ]:          9 :     if ( 2 != nBreakCode ) // new page is the default
    1418                 :            :     {
    1419         [ #  # ]:          0 :         if ( m_rWW8Export.bWrtWW8 )
    1420                 :          0 :             SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::LN_SBkc );
    1421                 :            :         else
    1422         [ #  # ]:          0 :             m_rWW8Export.pO->push_back( 142 );
    1423                 :          0 :         m_rWW8Export.pO->push_back( nBreakCode );
    1424                 :            :     }
    1425                 :          9 : }
    1426                 :            : 
    1427                 :          9 : void WW8AttributeOutput::SectionWW6HeaderFooterFlags( sal_uInt8 nHeadFootFlags )
    1428                 :            : {
    1429 [ +  + ][ -  + ]:          9 :     if ( nHeadFootFlags && !m_rWW8Export.bWrtWW8 )
    1430                 :            :     {
    1431                 :          0 :         sal_uInt8 nTmpFlags = nHeadFootFlags;
    1432         [ #  # ]:          0 :         if ( m_rWW8Export.pDop->fFacingPages )
    1433                 :            :         {
    1434 [ #  # ][ #  # ]:          0 :             if ( !(nTmpFlags & WW8_FOOTER_EVEN) && (nTmpFlags & WW8_FOOTER_ODD ) )
    1435                 :          0 :                 nTmpFlags |= WW8_FOOTER_EVEN;
    1436                 :            : 
    1437 [ #  # ][ #  # ]:          0 :             if ( !(nTmpFlags & WW8_HEADER_EVEN) && (nTmpFlags & WW8_HEADER_ODD ) )
    1438                 :          0 :                 nTmpFlags |= WW8_HEADER_EVEN;
    1439                 :            :         }
    1440                 :            : 
    1441                 :            :         // sprmSGprfIhdt, wird nur noch im WW95 benoetigt
    1442         [ #  # ]:          0 :         m_rWW8Export.pO->push_back( 153 );
    1443         [ #  # ]:          0 :         m_rWW8Export.pO->push_back( nTmpFlags );
    1444                 :            :     }
    1445                 :          9 : }
    1446                 :            : 
    1447                 :          9 : void WW8Export::SetupSectionPositions( WW8_PdAttrDesc* pA )
    1448                 :            : {
    1449         [ -  + ]:          9 :     if ( !pA )
    1450                 :          9 :         return;
    1451                 :            : 
    1452         [ +  - ]:          9 :     if ( !pO->empty() )
    1453                 :            :     {                   // waren Attrs vorhanden ?
    1454                 :          9 :         pA->nLen = pO->size();
    1455                 :          9 :         pA->pData = new sal_uInt8 [pO->size()];
    1456                 :          9 :         memcpy( pA->pData, pO->data(), pO->size() );    // -> merken
    1457                 :          9 :         pO->clear();       // leeren fuer HdFt-Text
    1458                 :            :     }
    1459                 :            :     else
    1460                 :            :     {                               // keine Attrs da
    1461                 :          0 :         pA->pData = 0;
    1462                 :          0 :         pA->nLen = 0;
    1463                 :            :     }
    1464                 :            : }
    1465                 :            : 
    1466                 :          9 : void WW8Export::WriteHeadersFooters( sal_uInt8 nHeadFootFlags,
    1467                 :            :         const SwFrmFmt& rFmt, const SwFrmFmt& rLeftFmt, const SwFrmFmt& rFirstPageFmt, sal_uInt8 nBreakCode )
    1468                 :            : {
    1469 [ +  - ][ +  - ]:          9 :     sal_uLong nCpPos = Fc2Cp( Strm().Tell() );
    1470                 :            : 
    1471                 :          9 :     IncrementHdFtIndex();
    1472 [ -  + ][ +  - ]:          9 :     if ( !(nHeadFootFlags & WW8_HEADER_EVEN) && pDop->fFacingPages )
    1473         [ #  # ]:          0 :         pSepx->OutHeaderFooter( *this, true, rFmt, nCpPos, nHeadFootFlags, WW8_HEADER_ODD, nBreakCode );
    1474                 :            :     else
    1475         [ +  - ]:          9 :         pSepx->OutHeaderFooter( *this, true, rLeftFmt, nCpPos, nHeadFootFlags, WW8_HEADER_EVEN, nBreakCode );
    1476                 :          9 :     IncrementHdFtIndex();
    1477         [ +  - ]:          9 :     pSepx->OutHeaderFooter( *this, true, rFmt, nCpPos, nHeadFootFlags, WW8_HEADER_ODD, nBreakCode );
    1478                 :            : 
    1479                 :          9 :     IncrementHdFtIndex();
    1480 [ -  + ][ +  - ]:          9 :     if ( !(nHeadFootFlags & WW8_FOOTER_EVEN) && pDop->fFacingPages )
    1481         [ #  # ]:          0 :         pSepx->OutHeaderFooter( *this, false, rFmt, nCpPos, nHeadFootFlags, WW8_FOOTER_ODD, nBreakCode );
    1482                 :            :     else
    1483         [ +  - ]:          9 :         pSepx->OutHeaderFooter( *this, false, rLeftFmt, nCpPos, nHeadFootFlags, WW8_FOOTER_EVEN, nBreakCode );
    1484                 :          9 :     IncrementHdFtIndex();
    1485         [ +  - ]:          9 :     pSepx->OutHeaderFooter( *this, false, rFmt, nCpPos, nHeadFootFlags, WW8_FOOTER_ODD, nBreakCode );
    1486                 :            : 
    1487                 :            :     //#i24344# Drawing objects cannot be directly shared between main hd/ft
    1488                 :            :     //and title hd/ft so we need to differenciate them
    1489                 :          9 :     IncrementHdFtIndex();
    1490         [ +  - ]:          9 :     pSepx->OutHeaderFooter( *this, true, rFirstPageFmt, nCpPos, nHeadFootFlags, WW8_HEADER_FIRST, nBreakCode );
    1491         [ +  - ]:          9 :     pSepx->OutHeaderFooter( *this, false, rFirstPageFmt, nCpPos, nHeadFootFlags, WW8_FOOTER_FIRST, nBreakCode );
    1492                 :          9 : }
    1493                 :            : 
    1494                 :         69 : void MSWordExportBase::SectionProperties( const WW8_SepInfo& rSepInfo, WW8_PdAttrDesc* pA )
    1495                 :            : {
    1496                 :         69 :     const SwPageDesc* pPd = rSepInfo.pPageDesc;
    1497                 :            : 
    1498 [ -  + ][ #  # ]:         69 :     if ( rSepInfo.pSectionFmt && !pPd )
    1499         [ #  # ]:          0 :         pPd = &pDoc->GetPageDesc( 0 );
    1500                 :            : 
    1501                 :         69 :     pAktPageDesc = pPd;
    1502                 :            : 
    1503         [ +  - ]:         69 :     if ( !pPd )
    1504                 :         69 :         return;
    1505                 :            : 
    1506                 :         69 :     bool bOldPg = bOutPageDescs;
    1507                 :         69 :     bOutPageDescs = true;
    1508                 :            : 
    1509 [ +  - ][ +  - ]:         69 :     AttrOutput().StartSection();
    1510                 :            : 
    1511 [ +  - ][ +  - ]:         69 :     AttrOutput().SectFootnoteEndnotePr();
    1512                 :            : 
    1513                 :            :     // forms
    1514 [ +  - ][ +  - ]:         69 :     AttrOutput().SectionFormProtection( rSepInfo.IsProtected() );
                 [ +  - ]
    1515                 :            : 
    1516                 :            :     // line numbers
    1517         [ +  - ]:         69 :     const SwLineNumberInfo& rLnNumInfo = pDoc->GetLineNumberInfo();
    1518         [ -  + ]:         69 :     if ( rLnNumInfo.IsPaintLineNumbers() )
    1519 [ #  # ][ #  # ]:          0 :         AttrOutput().SectionLineNumbering( rSepInfo.nLnNumRestartNo, rLnNumInfo );
    1520                 :            : 
    1521                 :            :     /*  sprmSBkc, break code:   0 No break, 1 New column
    1522                 :            :         2 New page, 3 Even page, 4 Odd page
    1523                 :            :         */
    1524                 :         69 :     sal_uInt8 nBreakCode = 2;            // default neue Seite beginnen
    1525                 :         69 :     bool bOutPgDscSet = true, bLeftRightPgChain = false;
    1526                 :         69 :     const SwFrmFmt* pPdFmt = &pPd->GetMaster();
    1527                 :         69 :     const SwFrmFmt* pPdFirstPgFmt = pPdFmt;
    1528         [ -  + ]:         69 :     if ( rSepInfo.pSectionFmt )
    1529                 :            :     {
    1530                 :            :         // ist pSectionFmt gesetzt, dann gab es einen SectionNode
    1531                 :            :         //  gueltiger Pointer -> Section beginnt,
    1532                 :            :         //  0xfff -> Section wird beendet
    1533                 :          0 :         nBreakCode = 0;         // fortlaufender Abschnitt
    1534                 :            : 
    1535 [ #  # ][ #  # ]:          0 :         if ( rSepInfo.pPDNd && rSepInfo.pPDNd->IsCntntNode() )
                 [ #  # ]
    1536                 :            :         {
    1537 [ #  # ][ #  # ]:          0 :             if ( !NoPageBreakSection( &rSepInfo.pPDNd->GetCntntNode()->GetSwAttrSet() ) )
                 [ #  # ]
    1538                 :            :             {
    1539                 :          0 :                 nBreakCode = 2;
    1540                 :            :             }
    1541                 :            :         }
    1542                 :            : 
    1543         [ #  # ]:          0 :         if ( (SwSectionFmt*)0xFFFFFFFF != rSepInfo.pSectionFmt )
    1544                 :            :         {
    1545         [ #  # ]:          0 :             if ( nBreakCode == 0 )
    1546                 :          0 :                 bOutPgDscSet = false;
    1547                 :            : 
    1548                 :            :             // Itemset erzeugen, das das PgDesk-AttrSet beerbt:
    1549                 :            :             // als Nachkomme wird bei 'deep'-OutputItemSet
    1550                 :            :             // auch der Vorfahr abgeklappert
    1551                 :          0 :             const SfxItemSet* pPdSet = &pPdFmt->GetAttrSet();
    1552         [ #  # ]:          0 :             SfxItemSet aSet( *pPdSet->GetPool(), pPdSet->GetRanges() );
    1553                 :          0 :             aSet.SetParent( pPdSet );
    1554                 :            : 
    1555                 :            :             // am Nachkommen NUR  die Spaltigkeit gemaess Sect-Attr.
    1556                 :            :             // umsetzen
    1557 [ #  # ][ #  # ]:          0 :             aSet.Put( rSepInfo.pSectionFmt->GetFmtAttr( RES_COL ) );
    1558                 :            : 
    1559                 :            :             const SvxLRSpaceItem &rSectionLR =
    1560         [ #  # ]:          0 :                 ItemGet<SvxLRSpaceItem>( *(rSepInfo.pSectionFmt), RES_LR_SPACE );
    1561                 :            :             const SvxLRSpaceItem &rPageLR =
    1562         [ #  # ]:          0 :                 ItemGet<SvxLRSpaceItem>( *pPdFmt, RES_LR_SPACE );
    1563                 :            : 
    1564                 :          0 :             SvxLRSpaceItem aResultLR( rPageLR.GetLeft() +
    1565                 :          0 :                     rSectionLR.GetLeft(), rPageLR.GetRight() +
    1566         [ #  # ]:          0 :                     rSectionLR.GetRight(), 0, 0, RES_LR_SPACE );
    1567                 :            : 
    1568         [ #  # ]:          0 :             aSet.Put( aResultLR );
    1569                 :            : 
    1570                 :            :             // und raus damit ins WW-File
    1571                 :          0 :             const SfxItemSet* pOldI = pISet;
    1572                 :          0 :             pISet = &aSet;
    1573                 :            : 
    1574                 :            :             // Switch off test on default item values, if page description
    1575                 :            :             // set (value of <bOutPgDscSet>) isn't written.
    1576 [ #  # ][ #  # ]:          0 :             AttrOutput().OutputStyleItemSet( aSet, true, bOutPgDscSet );
    1577                 :            : 
    1578                 :            :             //Cannot export as normal page framedir, as continous sections
    1579                 :            :             //cannot contain any grid settings like proper sections
    1580 [ #  # ][ #  # ]:          0 :             AttrOutput().SectionBiDi( FRMDIR_HORI_RIGHT_TOP == TrueFrameDirection( *rSepInfo.pSectionFmt ) );
                 [ #  # ]
    1581                 :            : 
    1582 [ #  # ][ #  # ]:          0 :             pISet = pOldI;
    1583                 :            :         }
    1584                 :            :     }
    1585                 :            : 
    1586                 :         69 :     bool titlePage = false;
    1587         [ +  - ]:         69 :     if ( bOutPgDscSet )
    1588                 :            :     {
    1589                 :            :         // es ist ein Follow gesetzt und dieser zeigt nicht auf sich
    1590                 :            :         // selbst, so liegt eine Seitenverkettung vor.
    1591                 :            :         // Falls damit eine "Erste Seite" simuliert werden soll, so
    1592                 :            :         // koennen wir das auch als solches schreiben.
    1593                 :            :         // Anders sieht es mit Links/Rechts wechseln aus. Dafuer muss
    1594                 :            :         // erkannt werden, wo der Seitenwechsel statt findet. Hier ist
    1595                 :            :         // es aber dafuer zuspaet!
    1596         [ +  - ]:         69 :         if ( pPd->GetFollow() && pPd != pPd->GetFollow() &&
           [ -  +  #  # ]
         [ #  # ][ #  # ]
                 [ -  + ]
    1597                 :          0 :              pPd->GetFollow()->GetFollow() == pPd->GetFollow() &&
    1598         [ #  # ]:          0 :              ( !rSepInfo.pPDNd || pPd->IsFollowNextPageOfNode( *rSepInfo.pPDNd ) ) )
    1599                 :            :         {
    1600                 :          0 :             const SwPageDesc *pFollow = pPd->GetFollow();
    1601                 :          0 :             const SwFrmFmt& rFollowFmt = pFollow->GetMaster();
    1602 [ #  # ][ #  # ]:          0 :             if ( sw::util::IsPlausableSingleWordSection( *pPdFmt, rFollowFmt ) )
    1603                 :            :             {
    1604         [ #  # ]:          0 :                 if (rSepInfo.pPDNd)
    1605         [ #  # ]:          0 :                     pPdFirstPgFmt = pPd->GetPageFmtOfNode( *rSepInfo.pPDNd );
    1606                 :            :                 else
    1607                 :          0 :                     pPdFirstPgFmt = &pPd->GetMaster();
    1608                 :            : 
    1609                 :          0 :                 pAktPageDesc = pPd = pFollow;
    1610                 :          0 :                 pPdFmt = &rFollowFmt;
    1611                 :            : 
    1612                 :            :                 // has different headers/footers for the title page
    1613                 :          0 :                 titlePage = true;
    1614                 :            :             }
    1615                 :            :         }
    1616                 :            : 
    1617                 :            :         // The code above tries to detect if this is first page headers/footers,
    1618                 :            :         // but it doesn't work even for quite trivial testcases. As I don't actually
    1619                 :            :         // understand that code, I'll keep it. The simple and (at least for me) reliable way
    1620                 :            :         // to detect for first page seems to be just RES_POOLPAGE_FIRST.
    1621         [ -  + ]:         69 :         if( pPd->GetPoolFmtId() == RES_POOLPAGE_FIRST )
    1622                 :          0 :             titlePage = true;
    1623         [ -  + ]:         69 :         if( titlePage )
    1624 [ #  # ][ #  # ]:          0 :             AttrOutput().SectionTitlePage();
    1625                 :            : 
    1626                 :         69 :         const SfxItemSet* pOldI = pISet;
    1627                 :            : 
    1628 [ +  - ][ +  - ]:         69 :         AttrOutput().SectionPageBorders( pPdFmt, pPdFirstPgFmt );
    1629                 :            : 
    1630                 :            :         const SfxPoolItem* pItem;
    1631 [ -  + ][ #  # ]:         69 :         if ( pPdFmt != pPdFirstPgFmt && SFX_ITEM_SET ==
                 [ -  + ]
    1632         [ #  # ]:          0 :                 pPdFirstPgFmt->GetItemState( RES_PAPER_BIN, true, &pItem ) )
    1633                 :            :         {
    1634                 :          0 :             pISet = &pPdFirstPgFmt->GetAttrSet();
    1635                 :          0 :             bOutFirstPage = true;
    1636 [ #  # ][ #  # ]:          0 :             AttrOutput().OutputItem( *pItem );
    1637                 :          0 :             bOutFirstPage = false;
    1638                 :            :         }
    1639                 :            : 
    1640                 :            :         // left-/right chain of pagedescs ?
    1641 [ +  - ][ -  +  :         69 :         if ( pPd->GetFollow() && pPd != pPd->GetFollow() &&
          #  #  #  #  #  
             #  #  #  #  
              # ][ -  + ]
    1642                 :          0 :                 pPd->GetFollow()->GetFollow() == pPd &&
    1643                 :          0 :                 (( nsUseOnPage::PD_LEFT == ( nsUseOnPage::PD_ALL & pPd->ReadUseOn() ) &&
    1644                 :          0 :                    nsUseOnPage::PD_RIGHT == ( nsUseOnPage::PD_ALL & pPd->GetFollow()->ReadUseOn() )) ||
    1645                 :          0 :                  ( nsUseOnPage::PD_RIGHT == ( nsUseOnPage::PD_ALL & pPd->ReadUseOn() ) &&
    1646                 :          0 :                    nsUseOnPage::PD_LEFT == ( nsUseOnPage::PD_ALL & pPd->GetFollow()->ReadUseOn() )) ))
    1647                 :            :         {
    1648                 :          0 :             bLeftRightPgChain = true;
    1649                 :            : 
    1650                 :            :             // welches ist der Bezugspunkt ????? (links oder rechts?)
    1651                 :            :             // annahme die rechte Seite!
    1652         [ #  # ]:          0 :             if ( nsUseOnPage::PD_LEFT == ( nsUseOnPage::PD_ALL & pPd->ReadUseOn() ) )
    1653                 :            :             {
    1654                 :          0 :                 nBreakCode = 3;
    1655                 :          0 :                 pPd = pPd->GetFollow();
    1656                 :          0 :                 pPdFmt = &pPd->GetMaster();
    1657                 :            :             }
    1658                 :            :             else
    1659                 :          0 :                 nBreakCode = 4;
    1660                 :            :         }
    1661                 :            : 
    1662                 :         69 :         pISet = &pPdFmt->GetAttrSet();
    1663 [ +  - ][ +  - ]:         69 :         AttrOutput().OutputStyleItemSet( pPdFmt->GetAttrSet(), true, false );
    1664                 :         69 :         pISet = pOldI;
    1665                 :            : 
    1666                 :            :         // dann noch die restlichen Einstellungen aus dem PageDesc
    1667                 :            : 
    1668 [ +  - ][ +  - ]:         69 :         AttrOutput().SectionPageNumbering( pPd->GetNumType().GetNumberingType(), rSepInfo.nPgRestartNo );
    1669                 :            : 
    1670                 :            :         // werden es nur linke oder nur rechte Seiten?
    1671         [ +  - ]:         69 :         if ( 2 == nBreakCode )
    1672                 :            :         {
    1673         [ -  + ]:         69 :             if ( nsUseOnPage::PD_LEFT == ( nsUseOnPage::PD_ALL & pPd->ReadUseOn() ) )
    1674                 :          0 :                 nBreakCode = 3;
    1675         [ -  + ]:         69 :             else if ( nsUseOnPage::PD_RIGHT == ( nsUseOnPage::PD_ALL & pPd->ReadUseOn() ) )
    1676                 :         69 :                 nBreakCode = 4;
    1677                 :            :         }
    1678                 :            :     }
    1679                 :            : 
    1680 [ +  - ][ +  - ]:         69 :     AttrOutput().SectionType( nBreakCode );
    1681                 :            : 
    1682                 :         69 :     const SwTxtNode* pNd = rSepInfo.pNumNd;
    1683         [ -  + ]:         69 :     if ( pNd )
    1684                 :            :     {
    1685         [ #  # ]:          0 :         const SwNumRule* pRule = pNd->GetNumRule();
    1686         [ #  # ]:          0 :         if ( pRule )
    1687         [ #  # ]:          0 :             OutputOlst( *pRule );
    1688                 :            :     }
    1689                 :            : 
    1690                 :            :     // Header oder Footer
    1691                 :         69 :     sal_uInt8 nHeadFootFlags = 0;
    1692                 :            : 
    1693                 :            :     const SwFrmFmt* pPdLeftFmt = bLeftRightPgChain
    1694                 :          0 :         ? &pPd->GetFollow()->GetMaster()
    1695         [ -  + ]:         69 :         : &pPd->GetLeft();
    1696                 :            : 
    1697         [ +  - ]:         69 :     if ( nBreakCode != 0 )
    1698                 :            :     {
    1699         [ -  + ]:         69 :         if ( titlePage )
    1700                 :            :         {
    1701                 :            :             // es gibt eine ErsteSeite:
    1702         [ #  # ]:          0 :             MSWordSections::SetHeaderFlag( nHeadFootFlags, *pPdFirstPgFmt, WW8_HEADER_FIRST );
    1703         [ #  # ]:          0 :             MSWordSections::SetFooterFlag( nHeadFootFlags, *pPdFirstPgFmt, WW8_FOOTER_FIRST );
    1704                 :            :         }
    1705                 :            :         // write other headers/footers only if it's not on the first page - I'm not quite sure
    1706                 :            :         // this is technically correct, but it avoids first-page headers/footers
    1707                 :            :         // extending to all pages (bnc#654230)
    1708 [ -  + ][ #  # ]:         69 :         if( !titlePage || pPdFmt != pPdFirstPgFmt )
    1709                 :            :         {
    1710         [ +  - ]:         69 :             MSWordSections::SetHeaderFlag( nHeadFootFlags, *pPdFmt, WW8_HEADER_ODD );
    1711         [ +  - ]:         69 :             MSWordSections::SetFooterFlag( nHeadFootFlags, *pPdFmt, WW8_FOOTER_ODD );
    1712                 :            : 
    1713 [ +  - ][ -  + ]:         69 :             if ( !pPd->IsHeaderShared() || bLeftRightPgChain )
                 [ -  + ]
    1714         [ #  # ]:          0 :                 MSWordSections::SetHeaderFlag( nHeadFootFlags, *pPdLeftFmt, WW8_HEADER_EVEN );
    1715                 :            : 
    1716 [ +  - ][ -  + ]:         69 :             if ( !pPd->IsFooterShared() || bLeftRightPgChain )
                 [ -  + ]
    1717         [ #  # ]:          0 :                 MSWordSections::SetFooterFlag( nHeadFootFlags, *pPdLeftFmt, WW8_FOOTER_EVEN );
    1718                 :            :         }
    1719 [ +  - ][ +  - ]:         69 :         AttrOutput().SectionWW6HeaderFooterFlags( nHeadFootFlags );
    1720                 :            :     }
    1721                 :            : 
    1722                 :            :     // binary filters only
    1723         [ +  - ]:         69 :     SetupSectionPositions( pA );
    1724                 :            : 
    1725                 :            :     /*
    1726                 :            :        !!!!!!!!!!!
    1727                 :            :     // Umrandungen an Kopf- und Fusstexten muessten etwa so gehen:
    1728                 :            :     // Dabei muss etwas wie pOut eingebaut werden,
    1729                 :            :     // das bei jeder Spezialtext-Zeile wiederholt wird.
    1730                 :            :     const SwFrmFmt* pFFmt = rFt.GetFooterFmt();
    1731                 :            :     const SvxBoxItem& rBox = pFFmt->GetBox(false);
    1732                 :            :     OutWW8_SwFmtBox1( m_rWW8Export.pOut, rBox, false);
    1733                 :            :     !!!!!!!!!!!
    1734                 :            :     Man koennt daraus Absatzattribute machen, die dann bei jedem Absatz
    1735                 :            :     beachtet werden. Gilt fuer Hintergrund/Umrandung
    1736                 :            :     !!!!!!!!!!!
    1737                 :            :     */
    1738                 :            : 
    1739                 :         69 :     const SwTxtNode *pOldPageRoot = GetHdFtPageRoot();
    1740         [ +  + ]:         69 :     SetHdFtPageRoot( rSepInfo.pPDNd ? rSepInfo.pPDNd->GetTxtNode() : 0 );
    1741                 :            : 
    1742         [ +  - ]:         69 :     WriteHeadersFooters( nHeadFootFlags, *pPdFmt, *pPdLeftFmt, *pPdFirstPgFmt, nBreakCode );
    1743                 :            : 
    1744                 :         69 :     SetHdFtPageRoot( pOldPageRoot );
    1745                 :            : 
    1746 [ +  - ][ +  - ]:         69 :     AttrOutput().EndSection();
    1747                 :            : 
    1748                 :            :     // outside of the section properties again
    1749                 :         69 :     bOutPageDescs = bOldPg;
    1750                 :            : }
    1751                 :            : 
    1752                 :          9 : bool WW8_WrPlcSepx::WriteKFTxt( WW8Export& rWrt )
    1753                 :            : {
    1754                 :          9 :     pAttrs = new WW8_PdAttrDesc[ aSects.size() ];
    1755                 :          9 :     sal_uLong nCpStart = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    1756                 :            : 
    1757                 :            :     OSL_ENSURE( !pTxtPos, "wer hat den Pointer gesetzt?" );
    1758         [ +  - ]:          9 :     pTxtPos = new WW8_WrPlc0( nCpStart );
    1759                 :            : 
    1760                 :          9 :     WriteFtnEndTxt( rWrt, nCpStart );
    1761                 :          9 :     CheckForFacinPg( rWrt );
    1762                 :            : 
    1763                 :          9 :     unsigned int nOldIndex = rWrt.GetHdFtIndex();
    1764                 :          9 :     rWrt.SetHdFtIndex( 0 );
    1765         [ +  + ]:         18 :     for ( sal_uInt16 i = 0; i < aSects.size(); ++i )
    1766                 :            :     {
    1767                 :          9 :         WW8_PdAttrDesc* pA = pAttrs + i;
    1768                 :          9 :         pA->pData = 0;
    1769                 :          9 :         pA->nLen  = 0;
    1770                 :          9 :         pA->nSepxFcPos = 0xffffffff;                // Default: none
    1771                 :            : 
    1772                 :          9 :         WW8_SepInfo& rSepInfo = aSects[i];
    1773                 :          9 :         rWrt.SectionProperties( rSepInfo, pA );
    1774                 :            : 
    1775                 :          9 :         bNoMoreSections = true;
    1776                 :            :     }
    1777                 :          9 :     rWrt.SetHdFtIndex( nOldIndex ); //0
    1778                 :            : 
    1779         [ +  - ]:          9 :     if ( pTxtPos->Count() )
    1780                 :            :     {
    1781                 :            :         // HdFt vorhanden ?
    1782                 :          9 :         sal_uLong nCpEnd = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    1783                 :          9 :         pTxtPos->Append( nCpEnd );  // Ende letzter Hd/Ft fuer PlcfHdd
    1784                 :            : 
    1785         [ +  + ]:          9 :         if ( nCpEnd > nCpStart )
    1786                 :            :         {
    1787                 :          3 :             ++nCpEnd;
    1788                 :          3 :             pTxtPos->Append( nCpEnd + 1 );  // Ende letzter Hd/Ft fuer PlcfHdd
    1789                 :            : 
    1790                 :          3 :             rWrt.WriteStringAsPara( aEmptyStr ); // CR ans Ende ( sonst mault WW )
    1791                 :            :         }
    1792                 :          9 :         rWrt.pFldHdFt->Finish( nCpEnd, rWrt.pFib->ccpText + rWrt.pFib->ccpFtn );
    1793                 :          9 :         rWrt.pFib->ccpHdr = nCpEnd - nCpStart;
    1794                 :            :     }
    1795                 :            :     else
    1796         [ #  # ]:          0 :         delete pTxtPos, pTxtPos = 0;
    1797                 :            : 
    1798                 :          9 :     return rWrt.pFib->ccpHdr != 0;
    1799                 :            : }
    1800                 :            : 
    1801                 :          9 : void WW8_WrPlcSepx::WriteSepx( SvStream& rStrm ) const
    1802                 :            : {
    1803                 :            :     sal_uInt16 i;
    1804         [ +  + ]:         18 :     for( i = 0; i < aSects.size(); i++ )
    1805                 :            :     {
    1806                 :          9 :         WW8_PdAttrDesc* pA = pAttrs + i;
    1807 [ +  - ][ +  - ]:          9 :         if( pA->nLen && pA->pData != NULL)
    1808                 :            :         {
    1809                 :            :             SVBT16 nL;
    1810                 :          9 :             pA->nSepxFcPos = rStrm.Tell();
    1811                 :          9 :             ShortToSVBT16( pA->nLen, nL );
    1812         [ +  - ]:          9 :             rStrm.Write( nL, 2 );
    1813         [ +  - ]:          9 :             rStrm.Write( pA->pData, pA->nLen );
    1814                 :            :         }
    1815                 :            :     }
    1816                 :          9 : }
    1817                 :            : 
    1818                 :          9 : void WW8_WrPlcSepx::WritePlcSed( WW8Export& rWrt ) const
    1819                 :            : {
    1820                 :            :     OSL_ENSURE( aCps.size() == aSects.size() + 1, "WrPlcSepx: DeSync" );
    1821                 :          9 :     sal_uLong nFcStart = rWrt.pTableStrm->Tell();
    1822                 :            : 
    1823                 :            :     sal_uInt16 i;
    1824         [ +  + ]:         27 :     for( i = 0; i <= aSects.size(); i++ )
    1825                 :            :     {
    1826         [ +  - ]:         18 :         sal_uInt32 nP = aCps[i];
    1827                 :            :         SVBT32 nPos;
    1828                 :         18 :         UInt32ToSVBT32( nP, nPos );
    1829         [ +  - ]:         18 :         rWrt.pTableStrm->Write( nPos, 4 );
    1830                 :            :     }
    1831                 :            : 
    1832                 :            :     static WW8_SED aSed = {{4, 0},{0, 0, 0, 0},{0, 0},{0xff, 0xff, 0xff, 0xff}};
    1833                 :            : 
    1834         [ +  + ]:         18 :     for( i = 0; i < aSects.size(); i++ )
    1835                 :            :     {
    1836                 :          9 :         WW8_PdAttrDesc* pA = pAttrs + i;
    1837                 :          9 :         UInt32ToSVBT32( pA->nSepxFcPos, aSed.fcSepx );    // Sepx-Pos
    1838                 :          9 :         rWrt.pTableStrm->Write( &aSed, sizeof( aSed ) );
    1839                 :            :     }
    1840                 :          9 :     rWrt.pFib->fcPlcfsed = nFcStart;
    1841                 :          9 :     rWrt.pFib->lcbPlcfsed = rWrt.pTableStrm->Tell() - nFcStart;
    1842                 :          9 : }
    1843                 :            : 
    1844                 :            : 
    1845                 :          9 : void WW8_WrPlcSepx::WritePlcHdd( WW8Export& rWrt ) const
    1846                 :            : {
    1847                 :            :     // Don't write out the PlcfHdd if ccpHdd is 0: it's a validation failure case.
    1848 [ +  + ][ +  - ]:          9 :     if( rWrt.pFib->ccpHdr != 0 && pTxtPos && pTxtPos->Count() )
         [ +  - ][ +  + ]
    1849                 :            :     {
    1850                 :          3 :         rWrt.pFib->fcPlcfhdd = rWrt.pTableStrm->Tell();
    1851                 :          3 :         pTxtPos->Write( *rWrt.pTableStrm );             // Plc0
    1852                 :          3 :         rWrt.pFib->lcbPlcfhdd = rWrt.pTableStrm->Tell() -
    1853                 :          3 :                                 rWrt.pFib->fcPlcfhdd;
    1854                 :            :     }
    1855                 :          9 : }
    1856                 :            : 
    1857                 :          6 : void MSWordExportBase::WriteHeaderFooterText( const SwFmt& rFmt, bool bHeader )
    1858                 :            : {
    1859                 :            :     const SwFmtCntnt *pCntnt;
    1860         [ +  + ]:          6 :     if ( bHeader )
    1861                 :            :     {
    1862                 :          3 :         bHasHdr = true;
    1863                 :          3 :         const SwFmtHeader& rHd = rFmt.GetHeader();
    1864                 :            :         OSL_ENSURE( rHd.GetHeaderFmt(), "Header text is not here" );
    1865                 :          3 :         pCntnt = &rHd.GetHeaderFmt()->GetCntnt();
    1866                 :            :     }
    1867                 :            :     else
    1868                 :            :     {
    1869                 :          3 :         bHasFtr = true;
    1870                 :          3 :         const SwFmtFooter& rFt = rFmt.GetFooter();
    1871                 :            :         OSL_ENSURE( rFt.GetFooterFmt(), "Footer text is not here" );
    1872                 :          3 :         pCntnt = &rFt.GetFooterFmt()->GetCntnt();
    1873                 :            :     }
    1874                 :            : 
    1875                 :          6 :     const SwNodeIndex* pSttIdx = pCntnt->GetCntntIdx();
    1876                 :            : 
    1877         [ +  - ]:          6 :     if ( pSttIdx )
    1878                 :            :     {
    1879         [ +  - ]:          6 :         SwNodeIndex aIdx( *pSttIdx, 1 ),
    1880         [ +  - ]:          6 :         aEnd( *pSttIdx->GetNode().EndOfSectionNode() );
    1881                 :          6 :         sal_uLong nStart = aIdx.GetIndex();
    1882                 :          6 :         sal_uLong nEnd = aEnd.GetIndex();
    1883                 :            : 
    1884                 :            :         // Bereich also gueltiger Node
    1885         [ +  - ]:          6 :         if ( nStart < nEnd )
    1886                 :            :         {
    1887                 :          6 :             bool bOldKF = bOutKF;
    1888                 :          6 :             bOutKF = true;
    1889         [ +  - ]:          6 :             WriteSpecialText( nStart, nEnd, TXT_HDFT );
    1890                 :          6 :             bOutKF = bOldKF;
    1891                 :            :         }
    1892                 :            :         else
    1893 [ +  - ][ +  - ]:          6 :             pSttIdx = 0;
    1894                 :            :     }
    1895                 :            : 
    1896         [ -  + ]:          6 :     if ( !pSttIdx )
    1897                 :            :     {
    1898                 :            :         // es gibt keine Kopf-/Fusszeile, aber ein CR ist immer noch noetig
    1899                 :            :         OSL_ENSURE( pSttIdx, "K/F-Text nicht richtig da" );
    1900                 :          0 :         AttrOutput().EmptyParagraph(); // CR ans Ende ( sonst mault WW )
    1901                 :            :     }
    1902                 :          6 : }
    1903                 :            : 
    1904                 :            : //------------------------------------------------------------------------------
    1905                 :            : // class WW8_WrPlcFtnEdn : Sammeln der Fuss/Endnoten und Ausgeben der Texte
    1906                 :            : // und Plcs am Ende des Docs.
    1907                 :            : // WW8_WrPlcFtnEdn ist die Klasse fuer Fuss- und Endnoten
    1908                 :            : //------------------------------------------------------------------------------
    1909                 :         45 : WW8_WrPlcSubDoc::WW8_WrPlcSubDoc()
    1910         [ +  - ]:         45 :     : pTxtPos( 0 )
    1911                 :            : {
    1912                 :         45 : }
    1913                 :            : 
    1914                 :         45 : WW8_WrPlcSubDoc::~WW8_WrPlcSubDoc()
    1915                 :            : {
    1916         [ +  + ]:         45 :     delete pTxtPos;
    1917         [ -  + ]:         45 : }
    1918                 :            : 
    1919                 :          3 : void WW8_WrPlcFtnEdn::Append( WW8_CP nCp, const SwFmtFtn& rFtn )
    1920                 :            : {
    1921                 :          3 :     aCps.push_back( nCp );
    1922         [ +  - ]:          3 :     aCntnt.push_back( &rFtn );
    1923                 :          3 : }
    1924                 :            : 
    1925                 :          0 : WW8_Annotation::WW8_Annotation(const SwPostItField* pPostIt)
    1926                 :            :     :
    1927         [ #  # ]:          0 :         maDateTime( DateTime::EMPTY )
    1928                 :            : {
    1929         [ #  # ]:          0 :     mpRichText = pPostIt->GetTextObject();
    1930         [ #  # ]:          0 :     if (!mpRichText)
    1931         [ #  # ]:          0 :         msSimpleText = pPostIt->GetTxt();
    1932 [ #  # ][ #  # ]:          0 :     msOwner = pPostIt->GetPar1();
    1933 [ #  # ][ #  # ]:          0 :     maDateTime = DateTime(pPostIt->GetDate(), pPostIt->GetTime());
    1934                 :          0 : }
    1935                 :            : 
    1936                 :          0 : WW8_Annotation::WW8_Annotation(const SwRedlineData* pRedline)
    1937                 :            :     :
    1938                 :            :         mpRichText(0),
    1939         [ #  # ]:          0 :         maDateTime( DateTime::EMPTY )
    1940                 :            : {
    1941         [ #  # ]:          0 :     msSimpleText = pRedline->GetComment();
    1942 [ #  # ][ #  # ]:          0 :     msOwner = SW_MOD()->GetRedlineAuthor(pRedline->GetAuthor());
                 [ #  # ]
    1943         [ #  # ]:          0 :     maDateTime = pRedline->GetTimeStamp();
    1944                 :          0 : }
    1945                 :            : 
    1946                 :          0 : void WW8_WrPlcAnnotations::Append( WW8_CP nCp, const SwPostItField *pPostIt )
    1947                 :            : {
    1948                 :          0 :     aCps.push_back( nCp );
    1949         [ #  # ]:          0 :     WW8_Annotation* p = new WW8_Annotation(pPostIt);
    1950         [ #  # ]:          0 :     aCntnt.push_back( p );
    1951                 :          0 : }
    1952                 :            : 
    1953                 :          0 : void WW8_WrPlcAnnotations::Append( WW8_CP nCp, const SwRedlineData *pRedline )
    1954                 :            : {
    1955                 :          0 :     maProcessedRedlines.insert(pRedline);
    1956                 :          0 :     aCps.push_back( nCp );
    1957         [ #  # ]:          0 :     WW8_Annotation* p = new WW8_Annotation(pRedline);
    1958         [ #  # ]:          0 :     aCntnt.push_back( p );
    1959                 :          0 : }
    1960                 :            : 
    1961                 :          0 : bool WW8_WrPlcAnnotations::IsNewRedlineComment( const SwRedlineData *pRedline )
    1962                 :            : {
    1963 [ #  # ][ #  # ]:          0 :     return maProcessedRedlines.find(pRedline) == maProcessedRedlines.end();
    1964                 :            : }
    1965                 :            : 
    1966                 :          9 : WW8_WrPlcAnnotations::~WW8_WrPlcAnnotations()
    1967                 :            : {
    1968         [ -  + ]:          9 :     for( sal_uInt16 n=0; n < aCntnt.size(); n++ )
    1969 [ #  # ][ #  # ]:          0 :         delete (WW8_Annotation*)aCntnt[n];
                 [ #  # ]
    1970         [ -  + ]:         18 : }
    1971                 :            : 
    1972                 :         45 : bool WW8_WrPlcSubDoc::WriteGenericTxt( WW8Export& rWrt, sal_uInt8 nTTyp,
    1973                 :            :     WW8_CP& rCount )
    1974                 :            : {
    1975                 :         45 :     sal_uInt16 nLen = aCntnt.size();
    1976         [ +  + ]:         45 :     if ( !nLen )
    1977                 :         39 :         return false;
    1978                 :            : 
    1979                 :          6 :     sal_uLong nCpStart = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    1980         [ +  - ]:          6 :     pTxtPos = new WW8_WrPlc0( nCpStart );
    1981                 :            :     sal_uInt16 i;
    1982                 :            : 
    1983   [ -  +  +  - ]:          6 :     switch ( nTTyp )
    1984                 :            :     {
    1985                 :            :         case TXT_ATN:
    1986         [ #  # ]:          0 :             for ( i = 0; i < nLen; i++ )
    1987                 :            :             {
    1988                 :            :                 // Anfaenge fuer PlcfAtnTxt
    1989                 :          0 :                 pTxtPos->Append( rWrt.Fc2Cp( rWrt.Strm().Tell() ));
    1990                 :            : 
    1991                 :          0 :                 rWrt.WritePostItBegin();
    1992                 :          0 :                 const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i];
    1993         [ #  # ]:          0 :                 if (rAtn.mpRichText)
    1994                 :          0 :                     rWrt.WriteOutliner(*rAtn.mpRichText, nTTyp);
    1995                 :            :                 else
    1996                 :            :                 {
    1997         [ #  # ]:          0 :                     String sTxt(rAtn.msSimpleText);
    1998         [ #  # ]:          0 :                     sTxt.SearchAndReplaceAll(0x0A, 0x0B);
    1999 [ #  # ][ #  # ]:          0 :                     rWrt.WriteStringAsPara( sTxt );
    2000                 :            :                 }
    2001                 :            :             }
    2002                 :          0 :             break;
    2003                 :            : 
    2004                 :            :         case TXT_TXTBOX:
    2005                 :            :         case TXT_HFTXTBOX:
    2006         [ +  + ]:          6 :             for ( i = 0; i < nLen; i++ )
    2007                 :            :             {
    2008                 :            :                 // textbox - content
    2009 [ +  - ][ +  - ]:          3 :                 WW8_CP nCP = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    2010 [ +  - ][ +  - ]:          3 :                 aCps.insert( aCps.begin()+i, nCP );
    2011         [ +  - ]:          3 :                 pTxtPos->Append( nCP );
    2012                 :            : 
    2013                 :            :                 // is it an writer or sdr - textbox?
    2014         [ +  - ]:          3 :                 const SdrObject& rObj = *(SdrObject*)aCntnt[ i ];
    2015 [ +  - ][ +  - ]:          3 :                 if (rObj.GetObjInventor() == FmFormInventor)
    2016                 :            :                 {
    2017                 :          3 :                     sal_uInt8 nOldTyp = rWrt.nTxtTyp;
    2018                 :          3 :                     rWrt.nTxtTyp = nTTyp;
    2019         [ +  - ]:          3 :                     rWrt.GetOCXExp().ExportControl(rWrt,&rObj);
    2020                 :          3 :                     rWrt.nTxtTyp = nOldTyp;
    2021                 :            :                 }
    2022 [ #  # ][ #  # ]:          0 :                 else if( rObj.ISA( SdrTextObj ) )
                 [ #  # ]
    2023         [ #  # ]:          0 :                     rWrt.WriteSdrTextObj(rObj, nTTyp);
    2024                 :            :                 else
    2025                 :            :                 {
    2026         [ #  # ]:          0 :                     const SwFrmFmt* pFmt = ::FindFrmFmt( &rObj );
    2027                 :            :                     OSL_ENSURE( pFmt, "wo ist das Format geblieben?" );
    2028                 :            : 
    2029         [ #  # ]:          0 :                     const SwNodeIndex* pNdIdx = pFmt->GetCntnt().GetCntntIdx();
    2030                 :            :                     OSL_ENSURE( pNdIdx, "wo ist der StartNode der Textbox?" );
    2031                 :          0 :                     rWrt.WriteSpecialText( pNdIdx->GetIndex() + 1,
    2032                 :          0 :                                            pNdIdx->GetNode().EndOfSectionIndex(),
    2033         [ #  # ]:          0 :                                            nTTyp );
    2034                 :            :                     {
    2035         [ #  # ]:          0 :                         SwNodeIndex aContentIdx = *pNdIdx;
    2036         [ #  # ]:          0 :                         aContentIdx++;
    2037         [ #  # ]:          0 :                         if ( aContentIdx.GetNode().IsTableNode() )
    2038                 :            :                         {
    2039                 :          0 :                             bool bContainsOnlyTables = true;
    2040         [ #  # ]:          0 :                             do {
    2041         [ #  # ]:          0 :                                 aContentIdx = *(aContentIdx.GetNode().EndOfSectionNode());
    2042         [ #  # ]:          0 :                                 aContentIdx++;
    2043   [ #  #  #  # ]:          0 :                                 if ( !aContentIdx.GetNode().IsTableNode() &&
                 [ #  # ]
    2044                 :          0 :                                      aContentIdx.GetIndex() != pNdIdx->GetNode().EndOfSectionIndex() )
    2045                 :            :                                 {
    2046                 :          0 :                                     bContainsOnlyTables = false;
    2047                 :            :                                 }
    2048                 :          0 :                             } while ( aContentIdx.GetNode().IsTableNode() );
    2049         [ #  # ]:          0 :                             if ( bContainsOnlyTables )
    2050                 :            :                             {
    2051                 :            :                                 // Additional paragraph containing a space to
    2052                 :            :                                 // assure that by WW created RTF from written WW8
    2053                 :            :                                 // does not crash WW.
    2054 [ #  # ][ #  # ]:          0 :                                 rWrt.WriteStringAsPara( rtl::OUString(" ") );
                 [ #  # ]
    2055                 :            :                             }
    2056         [ #  # ]:          0 :                         }
    2057                 :            :                     }
    2058                 :            :                 }
    2059                 :            : 
    2060                 :            :                 // CR at end of one textbox text ( otherwise WW gpft :-( )
    2061         [ +  - ]:          3 :                 rWrt.WriteStringAsPara( aEmptyStr );
    2062                 :            :             }
    2063                 :          3 :             break;
    2064                 :            : 
    2065                 :            :         case TXT_EDN:
    2066                 :            :         case TXT_FTN:
    2067         [ +  + ]:          6 :             for ( i = 0; i < nLen; i++ )
    2068                 :            :             {
    2069                 :            :                 // Anfaenge fuer PlcfFtnTxt/PlcfEdnTxt
    2070                 :          3 :                 pTxtPos->Append( rWrt.Fc2Cp( rWrt.Strm().Tell() ));
    2071                 :            : 
    2072                 :            :                 // Noten-Inhalt
    2073                 :          3 :                 const SwFmtFtn* pFtn = (SwFmtFtn*)aCntnt[ i ];
    2074                 :          3 :                 rWrt.WriteFtnBegin( *pFtn );
    2075                 :          3 :                 const SwNodeIndex* pIdx = pFtn->GetTxtFtn()->GetStartNode();
    2076                 :            :                 OSL_ENSURE( pIdx, "wo ist der StartNode der Fuss-/EndNote?" );
    2077                 :          3 :                 rWrt.WriteSpecialText( pIdx->GetIndex() + 1,
    2078                 :          3 :                                        pIdx->GetNode().EndOfSectionIndex(),
    2079                 :          6 :                                        nTTyp );
    2080                 :            :             }
    2081                 :          3 :             break;
    2082                 :            : 
    2083                 :            :         default:
    2084                 :            :             OSL_ENSURE( !this, "was ist das fuer ein SubDocType?" );
    2085                 :            :     }
    2086                 :            : 
    2087                 :          6 :     pTxtPos->Append( rWrt.Fc2Cp( rWrt.Strm().Tell() ));
    2088                 :            :     // CR ans Ende ( sonst mault WW )
    2089                 :          6 :     rWrt.WriteStringAsPara( aEmptyStr );
    2090                 :            : 
    2091                 :          6 :     WW8_CP nCpEnd = rWrt.Fc2Cp( rWrt.Strm().Tell() );
    2092                 :          6 :     pTxtPos->Append( nCpEnd );
    2093                 :          6 :     rCount = nCpEnd - nCpStart;
    2094                 :            : 
    2095                 :         45 :     return ( rCount != 0 );
    2096                 :            : }
    2097                 :            : 
    2098                 :         45 : void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp,
    2099                 :            :     WW8_FC& rTxtStart, sal_Int32& rTxtCount, WW8_FC& rRefStart, sal_Int32& rRefCount ) const
    2100                 :            : {
    2101                 :            :     typedef ::std::vector<String>::iterator myiter;
    2102                 :            : 
    2103                 :         45 :     sal_uLong nFcStart = rWrt.pTableStrm->Tell();
    2104                 :         45 :     sal_uInt16 nLen = aCps.size();
    2105         [ +  + ]:         45 :     if ( !nLen )
    2106                 :         45 :         return;
    2107                 :            : 
    2108                 :            :     OSL_ENSURE( aCps.size() + 2 == pTxtPos->Count(), "WritePlc: DeSync" );
    2109                 :            : 
    2110         [ +  - ]:          6 :     ::std::vector<String> aStrArr;
    2111                 :          6 :     WW8Fib& rFib = *rWrt.pFib;              // n+1-te CP-Pos nach Handbuch
    2112                 :            :     sal_uInt16 i;
    2113                 :          6 :     bool bWriteCP = true;
    2114                 :            : 
    2115      [ -  +  + ]:          6 :     switch ( nTTyp )
    2116                 :            :     {
    2117                 :            :         case TXT_ATN:
    2118                 :            :             {
    2119                 :            :                 // then write first the GrpXstAtnOwners
    2120         [ #  # ]:          0 :                 for ( i = 0; i < nLen; ++i )
    2121                 :            :                 {
    2122         [ #  # ]:          0 :                     const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i];
    2123         [ #  # ]:          0 :                     aStrArr.push_back(rAtn.msOwner);
    2124                 :            :                 }
    2125                 :            : 
    2126                 :            :                 //sort and remove duplicates
    2127         [ #  # ]:          0 :                 ::std::sort(aStrArr.begin(), aStrArr.end());
    2128         [ #  # ]:          0 :                 myiter aIter = ::std::unique(aStrArr.begin(), aStrArr.end());
    2129         [ #  # ]:          0 :                 aStrArr.erase(aIter, aStrArr.end());
    2130                 :            : 
    2131         [ #  # ]:          0 :                 if ( rWrt.bWrtWW8 )
    2132                 :            :                 {
    2133         [ #  # ]:          0 :                     for ( i = 0; i < aStrArr.size(); ++i )
    2134                 :            :                     {
    2135         [ #  # ]:          0 :                         const String& rStr = aStrArr[i];
    2136         [ #  # ]:          0 :                         SwWW8Writer::WriteShort(*rWrt.pTableStrm, rStr.Len());
    2137                 :            :                         SwWW8Writer::WriteString16(*rWrt.pTableStrm, rStr,
    2138         [ #  # ]:          0 :                                 false);
    2139                 :            :                     }
    2140                 :            :                 }
    2141                 :            :                 else
    2142                 :            :                 {
    2143         [ #  # ]:          0 :                     for ( i = 0; i < aStrArr.size(); ++i )
    2144                 :            :                     {
    2145         [ #  # ]:          0 :                         const String& rStr = aStrArr[i];
    2146         [ #  # ]:          0 :                         *rWrt.pTableStrm << (sal_uInt8)rStr.Len();
    2147                 :            :                         SwWW8Writer::WriteString8(*rWrt.pTableStrm, rStr, false,
    2148         [ #  # ]:          0 :                                 RTL_TEXTENCODING_MS_1252);
    2149                 :            :                     }
    2150                 :            :                 }
    2151                 :            : 
    2152                 :          0 :                 rFib.fcGrpStAtnOwners = nFcStart;
    2153                 :          0 :                 nFcStart = rWrt.pTableStrm->Tell();
    2154                 :          0 :                 rFib.lcbGrpStAtnOwners = nFcStart - rFib.fcGrpStAtnOwners;
    2155                 :            : 
    2156                 :            :                 // Write the extended >= Word XP ATLD records
    2157         [ #  # ]:          0 :                 if( rWrt.bWrtWW8 )
    2158                 :            :                 {
    2159         [ #  # ]:          0 :                     for( i = 0; i < nLen; ++i )
    2160                 :            :                     {
    2161         [ #  # ]:          0 :                         const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i];
    2162                 :            : 
    2163         [ #  # ]:          0 :                         sal_uInt32 nDTTM = sw::ms::DateTime2DTTM(rAtn.maDateTime);
    2164                 :            : 
    2165         [ #  # ]:          0 :                         SwWW8Writer::WriteLong( *rWrt.pTableStrm, nDTTM );
    2166         [ #  # ]:          0 :                         SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 );
    2167         [ #  # ]:          0 :                         SwWW8Writer::WriteLong( *rWrt.pTableStrm, 0 );
    2168         [ #  # ]:          0 :                         SwWW8Writer::WriteLong( *rWrt.pTableStrm, 0 );
    2169         [ #  # ]:          0 :                         SwWW8Writer::WriteLong( *rWrt.pTableStrm, 0 );
    2170                 :            :                     }
    2171                 :            : 
    2172                 :          0 :                     rFib.fcAtrdExtra = nFcStart;
    2173                 :          0 :                     nFcStart = rWrt.pTableStrm->Tell();
    2174                 :          0 :                     rFib.lcbAtrdExtra = nFcStart - rFib.fcAtrdExtra;
    2175                 :          0 :                     rFib.fcHplxsdr = 0x01010002;  //WTF, but apparently necessary
    2176                 :          0 :                     rFib.lcbHplxsdr = 0;
    2177                 :            :                 }
    2178                 :            :             }
    2179                 :          0 :             break;
    2180                 :            :         case TXT_TXTBOX:
    2181                 :            :         case TXT_HFTXTBOX:
    2182                 :            :             {
    2183         [ +  - ]:          3 :                 pTxtPos->Write( *rWrt.pTableStrm );
    2184         [ +  - ]:          3 :                 const std::vector<sal_uInt32>* pShapeIds = GetShapeIdArr();
    2185                 :            :                 OSL_ENSURE( pShapeIds, "wo sind die ShapeIds?" );
    2186                 :            : 
    2187         [ +  + ]:          6 :                 for ( i = 0; i < nLen; ++i )
    2188                 :            :                 {
    2189                 :            :                     // write textbox story - FTXBXS
    2190                 :            :                     // is it an writer or sdr - textbox?
    2191         [ +  - ]:          3 :                     const SdrObject* pObj = (SdrObject*)aCntnt[ i ];
    2192                 :          3 :                     sal_Int32 nCnt = 1;
    2193 [ +  - ][ +  - ]:          3 :                     if ( !pObj->ISA( SdrTextObj ) )
                 [ -  + ]
    2194                 :            :                     {
    2195                 :            :                         // find the "highest" SdrObject of this
    2196         [ #  # ]:          0 :                         const SwFrmFmt& rFmt = *::FindFrmFmt( pObj );
    2197                 :            : 
    2198         [ #  # ]:          0 :                         const SwFmtChain* pChn = &rFmt.GetChain();
    2199         [ #  # ]:          0 :                         while ( pChn->GetNext() )
    2200                 :            :                         {
    2201                 :            :                             // has a chain?
    2202                 :            :                             // then calc the cur pos in the chain
    2203                 :          0 :                             ++nCnt;
    2204         [ #  # ]:          0 :                             pChn = &pChn->GetNext()->GetChain();
    2205                 :            :                         }
    2206                 :            :                     }
    2207                 :            :                     // long cTxbx / iNextReuse
    2208         [ +  - ]:          3 :                     SwWW8Writer::WriteLong( *rWrt.pTableStrm, nCnt );
    2209                 :            :                     // long cReusable
    2210         [ +  - ]:          3 :                     SwWW8Writer::WriteLong( *rWrt.pTableStrm, 0 );
    2211                 :            :                     // short fReusable
    2212         [ +  - ]:          3 :                     SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 );
    2213                 :            :                     // long reserved
    2214         [ +  - ]:          3 :                     SwWW8Writer::WriteLong( *rWrt.pTableStrm, -1 );
    2215                 :            :                     // long lid
    2216                 :            :                     SwWW8Writer::WriteLong( *rWrt.pTableStrm,
    2217 [ +  - ][ +  - ]:          3 :                             (*pShapeIds)[i]);
    2218                 :            :                     // long txidUndo
    2219         [ +  - ]:          3 :                     SwWW8Writer::WriteLong( *rWrt.pTableStrm, 0 );
    2220                 :            :                 }
    2221         [ +  - ]:          3 :                 SwWW8Writer::FillCount( *rWrt.pTableStrm, 22 );
    2222                 :          3 :                 bWriteCP = false;
    2223                 :            :             }
    2224                 :          3 :             break;
    2225                 :            :     }
    2226                 :            : 
    2227         [ +  + ]:          6 :     if ( bWriteCP )
    2228                 :            :     {
    2229                 :            :         // Schreibe CP-Positionen
    2230         [ +  + ]:          6 :         for ( i = 0; i < nLen; i++ )
    2231 [ +  - ][ +  - ]:          3 :             SwWW8Writer::WriteLong( *rWrt.pTableStrm, aCps[ i ] );
    2232                 :            : 
    2233                 :            :         // n+1-te CP-Pos nach Handbuch
    2234                 :            :         SwWW8Writer::WriteLong( *rWrt.pTableStrm,
    2235                 :            :                 rFib.ccpText + rFib.ccpFtn + rFib.ccpHdr + rFib.ccpEdn +
    2236         [ +  - ]:          3 :                 rFib.ccpTxbx + rFib.ccpHdrTxbx + 1 );
    2237                 :            : 
    2238         [ -  + ]:          3 :         if ( TXT_ATN == nTTyp )
    2239                 :            :         {
    2240         [ #  # ]:          0 :             for ( i = 0; i < nLen; ++i )
    2241                 :            :             {
    2242         [ #  # ]:          0 :                 const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i];
    2243                 :            : 
    2244                 :            :                 //aStrArr is sorted
    2245                 :            :                 myiter aIter = ::std::lower_bound(aStrArr.begin(),
    2246         [ #  # ]:          0 :                         aStrArr.end(), rAtn.msOwner);
    2247                 :            :                 OSL_ENSURE(aIter != aStrArr.end() && *aIter == rAtn.msOwner,
    2248                 :            :                         "Impossible");
    2249         [ #  # ]:          0 :                 sal_uInt16 nFndPos = static_cast< sal_uInt16 >(aIter - aStrArr.begin());
    2250 [ #  # ][ #  # ]:          0 :                 String sAuthor(*aIter);
    2251                 :          0 :                 sal_uInt8 nNameLen = (sal_uInt8)sAuthor.Len();
    2252         [ #  # ]:          0 :                 if ( nNameLen > 9 )
    2253                 :            :                 {
    2254         [ #  # ]:          0 :                     sAuthor.Erase( 9 );
    2255                 :          0 :                     nNameLen = 9;
    2256                 :            :                 }
    2257                 :            : 
    2258                 :            :                 // xstUsrInitl[ 10 ] pascal-style String holding initials
    2259                 :            :                 // of annotation author
    2260         [ #  # ]:          0 :                 if ( rWrt.bWrtWW8 )
    2261                 :            :                 {
    2262         [ #  # ]:          0 :                     SwWW8Writer::WriteShort(*rWrt.pTableStrm, nNameLen);
    2263                 :            :                     SwWW8Writer::WriteString16(*rWrt.pTableStrm, sAuthor,
    2264         [ #  # ]:          0 :                             false);
    2265                 :            :                     SwWW8Writer::FillCount( *rWrt.pTableStrm,
    2266         [ #  # ]:          0 :                             (9 - nNameLen) * 2 );
    2267                 :            : 
    2268                 :            :                 }
    2269                 :            :                 else
    2270                 :            :                 {
    2271         [ #  # ]:          0 :                     *rWrt.pTableStrm << nNameLen;
    2272                 :            :                     SwWW8Writer::WriteString8(*rWrt.pTableStrm, sAuthor,
    2273         [ #  # ]:          0 :                             false, RTL_TEXTENCODING_MS_1252);
    2274         [ #  # ]:          0 :                     SwWW8Writer::FillCount(*rWrt.pTableStrm, 9 - nNameLen);
    2275                 :            :                 }
    2276                 :            : 
    2277         [ #  # ]:          0 :                 SwWW8Writer::WriteShort( *rWrt.pTableStrm, nFndPos );
    2278         [ #  # ]:          0 :                 SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 );
    2279         [ #  # ]:          0 :                 SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 );
    2280         [ #  # ]:          0 :                 SwWW8Writer::WriteLong( *rWrt.pTableStrm, -1 );
    2281         [ #  # ]:          0 :             }
    2282                 :            :         }
    2283                 :            :         else
    2284                 :            :         {
    2285                 :          3 :             sal_uInt16 nNo = 0;
    2286         [ +  + ]:          6 :             for ( i = 0; i < nLen; ++i )             // Schreibe Flags
    2287                 :            :             {
    2288         [ +  - ]:          3 :                 const SwFmtFtn* pFtn = (SwFmtFtn*)aCntnt[ i ];
    2289                 :            :                 SwWW8Writer::WriteShort( *rWrt.pTableStrm,
    2290 [ +  - ][ +  - ]:          3 :                         pFtn->GetNumStr().Len() ? 0 : ++nNo );
    2291                 :            :             }
    2292                 :            :         }
    2293                 :            :     }
    2294                 :          6 :     rRefStart = nFcStart;
    2295                 :          6 :     nFcStart = rWrt.pTableStrm->Tell();
    2296                 :          6 :     rRefCount = nFcStart - rRefStart;
    2297                 :            : 
    2298         [ +  - ]:          6 :     pTxtPos->Write( *rWrt.pTableStrm );
    2299                 :            : 
    2300         [ +  + ]:          6 :     switch ( nTTyp )
    2301                 :            :     {
    2302                 :            :         case TXT_TXTBOX:
    2303                 :            :         case TXT_HFTXTBOX:
    2304         [ +  + ]:          6 :             for ( i = 0; i < nLen; ++i )
    2305                 :            :             {
    2306                 :            :                 // write break descriptor (BKD)
    2307                 :            :                 // short itxbxs
    2308         [ +  - ]:          3 :                 SwWW8Writer::WriteShort( *rWrt.pTableStrm, i );
    2309                 :            :                 // short dcpDepend
    2310         [ +  - ]:          3 :                 SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 );
    2311                 :            :                 // short flags : icol/fTableBreak/fColumnBreak/fMarked/
    2312                 :            :                 //               fUnk/fTextOverflow
    2313         [ +  - ]:          3 :                 SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0x800 );
    2314                 :            :             }
    2315         [ +  - ]:          3 :             SwWW8Writer::FillCount( *rWrt.pTableStrm, 6 );
    2316                 :          3 :             break;
    2317                 :            :     }
    2318                 :            : 
    2319                 :          6 :     rTxtStart = nFcStart;
    2320                 :         45 :     rTxtCount = rWrt.pTableStrm->Tell() - nFcStart;
    2321                 :            : }
    2322                 :            : 
    2323                 :          0 : const std::vector<sal_uInt32>* WW8_WrPlcSubDoc::GetShapeIdArr() const
    2324                 :            : {
    2325                 :          0 :     return 0;
    2326 [ +  - ][ +  - ]:         54 : }
    2327                 :            : 
    2328                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10