LCOV - code coverage report
Current view: top level - editeng/source/rtf - svxrtf.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 759 0.0 %
Date: 2012-08-25 Functions: 0 46 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 1148 0.0 %

           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 <ctype.h>
      31                 :            : #include <tools/diagnose_ex.h>
      32                 :            : #include <rtl/tencinfo.h>
      33                 :            : #include <svl/itemiter.hxx>
      34                 :            : #include <svl/whiter.hxx>
      35                 :            : #include <svtools/rtftoken.h>
      36                 :            : #include <svl/itempool.hxx>
      37                 :            : 
      38                 :            : #include <comphelper/string.hxx>
      39                 :            : 
      40                 :            : #include <com/sun/star/lang/Locale.hpp>
      41                 :            : #include <editeng/scriptspaceitem.hxx>
      42                 :            : #include <editeng/fontitem.hxx>
      43                 :            : #include <editeng/colritem.hxx>
      44                 :            : #include <editeng/svxrtf.hxx>
      45                 :            : #include <editeng/editids.hrc>
      46                 :            : #include <vcl/svapp.hxx>
      47                 :            : 
      48                 :            : #include <com/sun/star/document/XDocumentProperties.hpp>
      49                 :            : 
      50                 :            : 
      51                 :            : using namespace ::com::sun::star;
      52                 :            : 
      53                 :            : 
      54                 :          0 : CharSet lcl_GetDefaultTextEncodingForRTF()
      55                 :            : {
      56                 :            : 
      57                 :          0 :     ::com::sun::star::lang::Locale aLocale;
      58                 :          0 :     ::rtl::OUString aLangString;
      59                 :            : 
      60 [ #  # ][ #  # ]:          0 :     aLocale = Application::GetSettings().GetLocale();
      61                 :          0 :     aLangString = aLocale.Language;
      62                 :            : 
      63 [ #  # ][ #  # ]:          0 :     if ( aLangString == "ru" || aLangString == "uk" )
                 [ #  # ]
      64                 :          0 :         return RTL_TEXTENCODING_MS_1251;
      65         [ #  # ]:          0 :     if ( aLangString == "tr" )
      66                 :          0 :         return RTL_TEXTENCODING_MS_1254;
      67                 :            :     else
      68                 :          0 :         return RTL_TEXTENCODING_MS_1252;
      69                 :            : }
      70                 :            : 
      71                 :            : // -------------- Methods --------------------
      72                 :            : 
      73                 :          0 : SvxRTFParser::SvxRTFParser( SfxItemPool& rPool, SvStream& rIn,
      74                 :            :             uno::Reference<document::XDocumentProperties> i_xDocProps,
      75                 :            :             int bReadNewDoc )
      76                 :            :     : SvRTFParser( rIn, 5 ),
      77                 :            :     rStrm(rIn),
      78                 :            :     pInsPos( 0 ),
      79                 :            :     pAttrPool( &rPool ),
      80                 :            :     m_xDocProps( i_xDocProps ),
      81                 :            :     pRTFDefaults( 0 ),
      82 [ #  # ][ #  # ]:          0 :     nVersionNo( 0 )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
      83                 :            : {
      84                 :          0 :     bNewDoc = bReadNewDoc;
      85                 :            : 
      86                 :          0 :     bChkStyleAttr = bCalcValue = bReadDocInfo = bIsInReadStyleTab = sal_False;
      87                 :          0 :     bIsLeftToRightDef = sal_True;
      88                 :            : 
      89                 :            :     {
      90         [ #  # ]:          0 :         RTFPlainAttrMapIds aTmp( rPool );
      91                 :            :         aPlainMap.insert( aPlainMap.begin(), (sal_uInt16*)&aTmp,
      92         [ #  # ]:          0 :                 (sal_uInt16*)&aTmp + (sizeof( RTFPlainAttrMapIds ) / sizeof(sal_uInt16)) );
      93                 :            :     }
      94                 :            :     {
      95         [ #  # ]:          0 :         RTFPardAttrMapIds aTmp( rPool );
      96                 :            :         aPardMap.insert( aPardMap.begin(), (sal_uInt16*)&aTmp,
      97         [ #  # ]:          0 :                 (sal_uInt16*)&aTmp + (sizeof( RTFPardAttrMapIds ) / sizeof(sal_uInt16)) );
      98                 :            :     }
      99 [ #  # ][ #  # ]:          0 :     pDfltFont = new Font;
     100         [ #  # ]:          0 :     pDfltColor = new Color;
     101                 :          0 : }
     102                 :            : 
     103                 :          0 : void SvxRTFParser::EnterEnvironment()
     104                 :            : {
     105                 :          0 : }
     106                 :            : 
     107                 :          0 : void SvxRTFParser::LeaveEnvironment()
     108                 :            : {
     109                 :          0 : }
     110                 :            : 
     111                 :          0 : void SvxRTFParser::ResetPard()
     112                 :            : {
     113                 :          0 : }
     114                 :            : 
     115 [ #  # ][ #  # ]:          0 : SvxRTFParser::~SvxRTFParser()
         [ #  # ][ #  # ]
     116                 :            : {
     117         [ #  # ]:          0 :     if( !aColorTbl.empty() )
     118         [ #  # ]:          0 :         ClearColorTbl();
     119         [ #  # ]:          0 :     if( !aAttrStack.empty() )
     120         [ #  # ]:          0 :         ClearAttrStack();
     121                 :            : 
     122 [ #  # ][ #  # ]:          0 :     delete pRTFDefaults;
     123                 :            : 
     124 [ #  # ][ #  # ]:          0 :     delete pInsPos;
     125 [ #  # ][ #  # ]:          0 :     delete pDfltFont;
     126                 :          0 :     delete pDfltColor;
     127         [ #  # ]:          0 : }
     128                 :            : 
     129                 :          0 : void SvxRTFParser::SetInsPos( const SvxPosition& rNew )
     130                 :            : {
     131         [ #  # ]:          0 :     if( pInsPos )
     132         [ #  # ]:          0 :         delete pInsPos;
     133                 :          0 :     pInsPos = rNew.Clone();
     134                 :          0 : }
     135                 :            : 
     136                 :          0 : SvParserState SvxRTFParser::CallParser()
     137                 :            : {
     138                 :            :     DBG_ASSERT( pInsPos, "no insertion position");
     139                 :            : 
     140         [ #  # ]:          0 :     if( !pInsPos )
     141                 :          0 :         return SVPAR_ERROR;
     142                 :            : 
     143         [ #  # ]:          0 :     if( !aColorTbl.empty() )
     144                 :          0 :         ClearColorTbl();
     145         [ #  # ]:          0 :     if( !aFontTbl.empty() )
     146                 :          0 :         ClearFontTbl();
     147         [ #  # ]:          0 :     if( !aStyleTbl.empty() )
     148                 :          0 :         ClearStyleTbl();
     149         [ #  # ]:          0 :     if( !aAttrStack.empty() )
     150                 :          0 :         ClearAttrStack();
     151                 :            : 
     152                 :          0 :     bIsSetDfltTab = sal_False;
     153                 :          0 :     bNewGroup = sal_False;
     154                 :          0 :     nDfltFont = 0;
     155                 :            : 
     156                 :          0 :     sBaseURL.Erase();
     157                 :            : 
     158                 :            :     // generate the correct WhichId table from the set WhichIds.
     159                 :          0 :     BuildWhichTbl();
     160                 :            : 
     161                 :          0 :     return SvRTFParser::CallParser();
     162                 :            : }
     163                 :            : 
     164                 :          0 : void SvxRTFParser::Continue( int nToken )
     165                 :            : {
     166                 :          0 :     SvRTFParser::Continue( nToken );
     167                 :            : 
     168         [ #  # ]:          0 :     if( SVPAR_PENDING != GetStatus() )
     169                 :            :     {
     170                 :          0 :         SetAllAttrOfStk();
     171                 :            :     //Regardless of what "color 0" is, word defaults to auto as the default colour.
     172                 :            :     //e.g. see #i7713#
     173                 :            :      }
     174                 :          0 : }
     175                 :            : 
     176                 :            : 
     177                 :            : // is called for each token that is recognized in CallParser
     178                 :          0 : void SvxRTFParser::NextToken( int nToken )
     179                 :            : {
     180                 :            :     sal_Unicode cCh;
     181   [ #  #  #  #  :          0 :     switch( nToken )
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     182                 :            :     {
     183                 :          0 :     case RTF_COLORTBL:      ReadColorTable();       break;
     184                 :          0 :     case RTF_FONTTBL:       ReadFontTable();        break;
     185                 :          0 :     case RTF_STYLESHEET:    ReadStyleTable();       break;
     186                 :            : 
     187                 :            :     case RTF_DEFF:
     188         [ #  # ]:          0 :             if( bNewDoc )
     189                 :            :             {
     190         [ #  # ]:          0 :                 if( !aFontTbl.empty() )
     191                 :            :                     // Can immediately be set
     192                 :          0 :                     SetDefault( nToken, nTokenValue );
     193                 :            :                 else
     194                 :            :                     // is set after reading the font table
     195                 :          0 :                     nDfltFont = int(nTokenValue);
     196                 :            :             }
     197                 :          0 :             break;
     198                 :            : 
     199                 :            :     case RTF_DEFTAB:
     200                 :            :     case RTF_DEFLANG:
     201         [ #  # ]:          0 :             if( bNewDoc )
     202                 :          0 :                 SetDefault( nToken, nTokenValue );
     203                 :          0 :             break;
     204                 :            : 
     205                 :            : 
     206                 :          0 :     case RTF_PICT:          ReadBitmapData();       break;
     207                 :            : 
     208                 :          0 :     case RTF_LINE:          cCh = '\n'; goto INSINGLECHAR;
     209                 :          0 :     case RTF_TAB:           cCh = '\t'; goto INSINGLECHAR;
     210                 :          0 :     case RTF_SUBENTRYINDEX: cCh = ':';  goto INSINGLECHAR;
     211                 :            : 
     212                 :          0 :     case RTF_EMDASH:            cCh = 0x2014;   goto INSINGLECHAR;
     213                 :          0 :     case RTF_ENDASH:            cCh = 0x2013;   goto INSINGLECHAR;
     214                 :          0 :     case RTF_BULLET:            cCh = 0x2022;   goto INSINGLECHAR;
     215                 :          0 :     case RTF_LQUOTE:            cCh = 0x2018;   goto INSINGLECHAR;
     216                 :          0 :     case RTF_RQUOTE:            cCh = 0x2019;   goto INSINGLECHAR;
     217                 :          0 :     case RTF_LDBLQUOTE:         cCh = 0x201C;   goto INSINGLECHAR;
     218                 :          0 :     case RTF_RDBLQUOTE:         cCh = 0x201D;   goto INSINGLECHAR;
     219                 :            : INSINGLECHAR:
     220         [ #  # ]:          0 :         aToken = rtl::OUString(cCh);
     221                 :            :         // no Break, aToken is set as Text
     222                 :            :     case RTF_TEXTTOKEN:
     223                 :            :         {
     224                 :          0 :             InsertText();
     225                 :            :             // all collected Attributes are set
     226         [ #  # ]:          0 :             for( sal_uInt16 n = aAttrSetList.size(); n; )
     227                 :            :             {
     228                 :          0 :                 SvxRTFItemStackType* pStkSet = &aAttrSetList[--n];
     229                 :          0 :                 SetAttrSet( *pStkSet );
     230                 :          0 :                 aAttrSetList.pop_back();
     231                 :            :             }
     232                 :            :         }
     233                 :          0 :         break;
     234                 :            : 
     235                 :            : 
     236                 :            :     case RTF_PAR:
     237                 :          0 :         InsertPara();
     238                 :          0 :         break;
     239                 :            :     case '{':
     240         [ #  # ]:          0 :         if (bNewGroup)          // Nesting!
     241                 :          0 :             _GetAttrSet();
     242                 :          0 :         EnterEnvironment();
     243                 :          0 :         bNewGroup = true;
     244                 :          0 :         break;
     245                 :            :     case '}':
     246         [ #  # ]:          0 :         if( !bNewGroup )        // Empty Group ??
     247                 :          0 :             AttrGroupEnd();
     248                 :          0 :         LeaveEnvironment();
     249                 :          0 :         bNewGroup = false;
     250                 :          0 :         break;
     251                 :            :     case RTF_INFO:
     252 [ #  # ][ #  # ]:          0 :         if (bReadDocInfo && bNewDoc && m_xDocProps.is())
         [ #  # ][ #  # ]
     253                 :          0 :             ReadInfo();
     254                 :            :         else
     255                 :          0 :             SkipGroup();
     256                 :          0 :         break;
     257                 :            : 
     258                 :            :     // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     259                 :            :     // First overwrite all (all have to be in one group!!)
     260                 :            :     // Could also appear in the RTF-filewithout the IGNORE-Flag; all Groups
     261                 :            :     // with the IGNORE-Flag are overwritten in the default branch.
     262                 :            : 
     263                 :            :     case RTF_SWG_PRTDATA:
     264                 :            :     case RTF_FIELD:
     265                 :            :     case RTF_ATNID:
     266                 :            :     case RTF_ANNOTATION:
     267                 :            : 
     268                 :            :     case RTF_BKMKSTART:
     269                 :            :     case RTF_BKMKEND:
     270                 :            :     case RTF_BKMK_KEY:
     271                 :            :     case RTF_XE:
     272                 :            :     case RTF_TC:
     273                 :            :     case RTF_NEXTFILE:
     274                 :            :     case RTF_TEMPLATE:
     275                 :            :     // RTF_SHPRSLT disabled for #i19718#
     276                 :          0 :                             SkipGroup();
     277                 :          0 :                             break;
     278                 :            :     // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     279                 :            : 
     280                 :            :     case RTF_PGDSCNO:
     281                 :            :     case RTF_PGBRK:
     282                 :            :     case RTF_SHADOW:
     283         [ #  # ]:          0 :             if( RTF_IGNOREFLAG != GetStackPtr( -1 )->nTokenId )
     284                 :          0 :                 break;
     285                 :          0 :             nToken = SkipToken( -1 );
     286         [ #  # ]:          0 :             if( '{' == GetStackPtr( -1 )->nTokenId )
     287                 :          0 :                 nToken = SkipToken( -1 );
     288                 :            : 
     289                 :          0 :             ReadAttr( nToken, &GetAttrSet() );
     290                 :          0 :             break;
     291                 :            : 
     292                 :            :     default:
     293      [ #  #  # ]:          0 :         switch( nToken & ~(0xff | RTF_SWGDEFS) )
     294                 :            :         {
     295                 :            :         case RTF_PARFMT:        // hier gibts keine Swg-Defines
     296                 :          0 :             ReadAttr( nToken, &GetAttrSet() );
     297                 :          0 :             break;
     298                 :            : 
     299                 :            :         case RTF_CHRFMT:
     300                 :            :         case RTF_BRDRDEF:
     301                 :            :         case RTF_TABSTOPDEF:
     302                 :            : 
     303         [ #  # ]:          0 :             if( RTF_SWGDEFS & nToken)
     304                 :            :             {
     305         [ #  # ]:          0 :                 if( RTF_IGNOREFLAG != GetStackPtr( -1 )->nTokenId )
     306                 :          0 :                     break;
     307                 :          0 :                 nToken = SkipToken( -1 );
     308         [ #  # ]:          0 :                 if( '{' == GetStackPtr( -1 )->nTokenId )
     309                 :            :                 {
     310                 :          0 :                     nToken = SkipToken( -1 );
     311                 :            :                 }
     312                 :            :             }
     313                 :          0 :             ReadAttr( nToken, &GetAttrSet() );
     314                 :          0 :             break;
     315                 :            :         default:
     316                 :            :             {
     317         [ #  # ]:          0 :                 if( /*( '{' == GetStackPtr( -1 )->nTokenId ) ||*/
           [ #  #  #  # ]
     318                 :          0 :                     ( RTF_IGNOREFLAG == GetStackPtr( -1 )->nTokenId &&
     319                 :          0 :                       '{' == GetStackPtr( -2 )->nTokenId ) )
     320                 :          0 :                     SkipGroup();
     321                 :            :             }
     322                 :          0 :             break;
     323                 :            :         }
     324                 :          0 :         break;
     325                 :            :     }
     326                 :          0 : }
     327                 :            : 
     328                 :          0 : void SvxRTFParser::ReadStyleTable()
     329                 :            : {
     330                 :          0 :     int nToken, bSaveChkStyleAttr = bChkStyleAttr;
     331                 :          0 :     sal_uInt16 nStyleNo = 0;
     332                 :          0 :     int _nOpenBrakets = 1;      // the first was already detected earlier!!
     333 [ #  # ][ #  # ]:          0 :     SvxRTFStyleType* pStyle = new SvxRTFStyleType( *pAttrPool, &aWhichMap[0] );
                 [ #  # ]
     334 [ #  # ][ #  # ]:          0 :     pStyle->aAttrSet.Put( GetRTFDefaults() );
     335                 :            : 
     336                 :          0 :     bIsInReadStyleTab = sal_True;
     337                 :          0 :     bChkStyleAttr = sal_False;      // Do not check Attribute against the Styles
     338                 :            : 
     339 [ #  # ][ #  # ]:          0 :     while( _nOpenBrakets && IsParserWorking() )
                 [ #  # ]
     340                 :            :     {
     341 [ #  # ][ #  #  :          0 :         switch( nToken = GetNextToken() )
          #  #  #  #  #  
                   #  # ]
     342                 :            :         {
     343 [ #  # ][ #  # ]:          0 :         case '}':       if( --_nOpenBrakets && IsParserWorking() )
                 [ #  # ]
     344                 :            :                             // Style has been completely read,
     345                 :            :                             // so this is still a stable status
     346         [ #  # ]:          0 :                             SaveState( RTF_STYLESHEET );
     347                 :          0 :                         break;
     348                 :            :         case '{':
     349                 :            :             {
     350 [ #  # ][ #  # ]:          0 :                 if( RTF_IGNOREFLAG != GetNextToken() )
     351         [ #  # ]:          0 :                     nToken = SkipToken( -1 );
     352 [ #  # ][ #  # ]:          0 :                 else if( RTF_UNKNOWNCONTROL != ( nToken = GetNextToken() ) &&
         [ #  # ][ #  # ]
     353                 :            :                             RTF_PN != nToken )
     354         [ #  # ]:          0 :                     nToken = SkipToken( -2 );
     355                 :            :                 else
     356                 :            :                 {
     357                 :            :                     // filter out at once
     358         [ #  # ]:          0 :                     ReadUnknownData();
     359         [ #  # ]:          0 :                     nToken = GetNextToken();
     360         [ #  # ]:          0 :                     if( '}' != nToken )
     361                 :          0 :                         eState = SVPAR_ERROR;
     362                 :          0 :                     break;
     363                 :            :                 }
     364                 :          0 :                 ++_nOpenBrakets;
     365                 :            :             }
     366                 :          0 :             break;
     367                 :            : 
     368                 :          0 :         case RTF_SBASEDON:  pStyle->nBasedOn = sal_uInt16(nTokenValue); pStyle->bBasedOnIsSet=sal_True; break;
     369                 :          0 :         case RTF_SNEXT:     pStyle->nNext = sal_uInt16(nTokenValue);    break;
     370                 :            :         case RTF_OUTLINELEVEL:
     371                 :          0 :         case RTF_SOUTLVL:   pStyle->nOutlineNo = sal_uInt8(nTokenValue);    break;
     372                 :          0 :         case RTF_S:         nStyleNo = (short)nTokenValue;          break;
     373                 :          0 :         case RTF_CS:        nStyleNo = (short)nTokenValue;
     374                 :          0 :                             pStyle->bIsCharFmt = sal_True;
     375                 :          0 :                             break;
     376                 :            : 
     377                 :            :         case RTF_TEXTTOKEN:
     378                 :            :             {
     379 [ #  # ][ #  # ]:          0 :                 pStyle->sName = DelCharAtEnd( aToken, ';' );
     380                 :            : 
     381         [ #  # ]:          0 :                 if( !aStyleTbl.empty() )
     382                 :            :                 {
     383         [ #  # ]:          0 :                     aStyleTbl.erase(nStyleNo);
     384                 :            :                 }
     385                 :            :                 // All data from the font is available, so off to the table
     386         [ #  # ]:          0 :                 aStyleTbl.insert( nStyleNo , pStyle);
     387 [ #  # ][ #  # ]:          0 :                 pStyle = new SvxRTFStyleType( *pAttrPool, &aWhichMap[0] );
                 [ #  # ]
     388 [ #  # ][ #  # ]:          0 :                 pStyle->aAttrSet.Put( GetRTFDefaults() );
     389                 :          0 :                 nStyleNo = 0;
     390                 :            :             }
     391                 :          0 :             break;
     392                 :            :         default:
     393      [ #  #  # ]:          0 :             switch( nToken & ~(0xff | RTF_SWGDEFS) )
     394                 :            :             {
     395                 :            :             case RTF_PARFMT:        // hier gibts keine Swg-Defines
     396         [ #  # ]:          0 :                 ReadAttr( nToken, &pStyle->aAttrSet );
     397                 :          0 :                 break;
     398                 :            : 
     399                 :            :             case RTF_CHRFMT:
     400                 :            :             case RTF_BRDRDEF:
     401                 :            :             case RTF_TABSTOPDEF:
     402                 :            : 
     403         [ #  # ]:          0 :                 if( RTF_SWGDEFS & nToken)
     404                 :            :                 {
     405 [ #  # ][ #  # ]:          0 :                     if( RTF_IGNOREFLAG != GetStackPtr( -1 )->nTokenId )
     406                 :          0 :                         break;
     407         [ #  # ]:          0 :                     nToken = SkipToken( -1 );
     408 [ #  # ][ #  # ]:          0 :                     if( '{' == GetStackPtr( -1 )->nTokenId )
     409                 :            :                     {
     410         [ #  # ]:          0 :                         nToken = SkipToken( -1 );
     411                 :            :                     }
     412                 :            :                 }
     413         [ #  # ]:          0 :                 ReadAttr( nToken, &pStyle->aAttrSet );
     414                 :          0 :                 break;
     415                 :            :             }
     416                 :          0 :             break;
     417                 :            :         }
     418                 :            :     }
     419 [ #  # ][ #  # ]:          0 :     delete pStyle;          // Delete the Last Style
     420         [ #  # ]:          0 :     SkipToken( -1 );        // the closing brace is evaluated "above"
     421                 :            : 
     422                 :            :     // Flag back to old state
     423                 :          0 :     bChkStyleAttr = bSaveChkStyleAttr;
     424                 :          0 :     bIsInReadStyleTab = sal_False;
     425                 :          0 : }
     426                 :            : 
     427                 :          0 : void SvxRTFParser::ReadColorTable()
     428                 :            : {
     429                 :            :     int nToken;
     430                 :          0 :     sal_uInt8 nRed = 0xff, nGreen = 0xff, nBlue = 0xff;
     431                 :            : 
     432 [ #  # ][ #  # ]:          0 :     while( '}' != ( nToken = GetNextToken() ) && IsParserWorking() )
                 [ #  # ]
     433                 :            :     {
     434   [ #  #  #  #  :          0 :         switch( nToken )
                   #  # ]
     435                 :            :         {
     436                 :          0 :         case RTF_RED:   nRed = sal_uInt8(nTokenValue);      break;
     437                 :          0 :         case RTF_GREEN: nGreen = sal_uInt8(nTokenValue);        break;
     438                 :          0 :         case RTF_BLUE:  nBlue = sal_uInt8(nTokenValue);     break;
     439                 :            : 
     440                 :            :         case RTF_TEXTTOKEN:
     441 [ #  # ][ #  # ]:          0 :             if( 1 == aToken.Len()
     442                 :          0 :                     ? aToken.GetChar( 0 ) != ';'
     443                 :          0 :                     : STRING_NOTFOUND == aToken.Search( ';' ) )
     444                 :          0 :                 break;      // At least the ';' must be found
     445                 :            : 
     446                 :            :             // else no break !!
     447                 :            : 
     448                 :            :         case ';':
     449         [ #  # ]:          0 :             if( IsParserWorking() )
     450                 :            :             {
     451                 :            :                 // one color is finished, fill in the table
     452                 :            :                 // try to map the values to SV internal names
     453         [ #  # ]:          0 :                 ColorPtr pColor = new Color( nRed, nGreen, nBlue );
     454 [ #  # ][ #  # ]:          0 :                 if( aColorTbl.empty() &&
         [ #  # ][ #  # ]
                 [ #  # ]
     455                 :            :                     sal_uInt8(-1) == nRed && sal_uInt8(-1) == nGreen && sal_uInt8(-1) == nBlue )
     456                 :          0 :                     pColor->SetColor( COL_AUTO );
     457         [ #  # ]:          0 :                 aColorTbl.push_back( pColor );
     458                 :          0 :                 nRed = 0, nGreen = 0, nBlue = 0;
     459                 :            : 
     460                 :            :                 // Color has been completely read,
     461                 :            :                 // so this is still a stable status
     462         [ #  # ]:          0 :                 SaveState( RTF_COLORTBL );
     463                 :            :             }
     464                 :          0 :             break;
     465                 :            :         }
     466                 :            :     }
     467                 :          0 :     SkipToken( -1 );        // the closing brace is evaluated "above"
     468                 :          0 : }
     469                 :            : 
     470                 :          0 : void SvxRTFParser::ReadFontTable()
     471                 :            : {
     472                 :            :     int nToken;
     473                 :          0 :     int _nOpenBrakets = 1;      // the first was already detected earlier!!
     474 [ #  # ][ #  # ]:          0 :     Font* pFont = new Font();
     475                 :          0 :     short nFontNo(0), nInsFontNo (0);
     476 [ #  # ][ #  # ]:          0 :     String sAltNm, sFntNm;
     477                 :          0 :     sal_Bool bIsAltFntNm = sal_False, bCheckNewFont;
     478                 :            : 
     479         [ #  # ]:          0 :     CharSet nSystemChar = lcl_GetDefaultTextEncodingForRTF();
     480         [ #  # ]:          0 :     pFont->SetCharSet( nSystemChar );
     481         [ #  # ]:          0 :     SetEncoding( nSystemChar );
     482                 :            : 
     483 [ #  # ][ #  # ]:          0 :     while( _nOpenBrakets && IsParserWorking() )
                 [ #  # ]
     484                 :            :     {
     485                 :          0 :         bCheckNewFont = sal_False;
     486 [ #  # ][ #  #  :          0 :         switch( ( nToken = GetNextToken() ))
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     487                 :            :         {
     488                 :            :             case '}':
     489                 :          0 :                 bIsAltFntNm = sal_False;
     490                 :            :                 // Style has been completely read,
     491                 :            :                 // so this is still a stable status
     492 [ #  # ][ #  # ]:          0 :                 if( --_nOpenBrakets <= 1 && IsParserWorking() )
                 [ #  # ]
     493         [ #  # ]:          0 :                     SaveState( RTF_FONTTBL );
     494                 :          0 :                 bCheckNewFont = sal_True;
     495                 :          0 :                 nInsFontNo = nFontNo;
     496                 :          0 :                 break;
     497                 :            :             case '{':
     498 [ #  # ][ #  # ]:          0 :                 if( RTF_IGNOREFLAG != GetNextToken() )
     499         [ #  # ]:          0 :                     nToken = SkipToken( -1 );
     500                 :            :                 // immediately skip unknown and all known but non-evaluated
     501                 :            :                 // groups
     502 [ #  # ][ #  # ]:          0 :                 else if( RTF_UNKNOWNCONTROL != ( nToken = GetNextToken() ) &&
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     503                 :            :                         RTF_PANOSE != nToken && RTF_FNAME != nToken &&
     504                 :            :                         RTF_FONTEMB != nToken && RTF_FONTFILE != nToken )
     505         [ #  # ]:          0 :                     nToken = SkipToken( -2 );
     506                 :            :                 else
     507                 :            :                 {
     508                 :            :                     // filter out at once
     509         [ #  # ]:          0 :                     ReadUnknownData();
     510         [ #  # ]:          0 :                     nToken = GetNextToken();
     511         [ #  # ]:          0 :                     if( '}' != nToken )
     512                 :          0 :                         eState = SVPAR_ERROR;
     513                 :          0 :                     break;
     514                 :            :                 }
     515                 :          0 :                 ++_nOpenBrakets;
     516                 :          0 :                 break;
     517                 :            :             case RTF_FROMAN:
     518         [ #  # ]:          0 :                 pFont->SetFamily( FAMILY_ROMAN );
     519                 :          0 :                 break;
     520                 :            :             case RTF_FSWISS:
     521         [ #  # ]:          0 :                 pFont->SetFamily( FAMILY_SWISS );
     522                 :          0 :                 break;
     523                 :            :             case RTF_FMODERN:
     524         [ #  # ]:          0 :                 pFont->SetFamily( FAMILY_MODERN );
     525                 :          0 :                 break;
     526                 :            :             case RTF_FSCRIPT:
     527         [ #  # ]:          0 :                 pFont->SetFamily( FAMILY_SCRIPT );
     528                 :          0 :                 break;
     529                 :            :             case RTF_FDECOR:
     530         [ #  # ]:          0 :                 pFont->SetFamily( FAMILY_DECORATIVE );
     531                 :          0 :                 break;
     532                 :            :             // for technical/symbolic font of the CharSet is changed!
     533                 :            :             case RTF_FTECH:
     534         [ #  # ]:          0 :                 pFont->SetCharSet( RTL_TEXTENCODING_SYMBOL );
     535                 :            :                 // deliberate fall through
     536                 :            :             case RTF_FNIL:
     537         [ #  # ]:          0 :                 pFont->SetFamily( FAMILY_DONTKNOW );
     538                 :          0 :                 break;
     539                 :            :             case RTF_FCHARSET:
     540         [ #  # ]:          0 :                 if (-1 != nTokenValue)
     541                 :            :                 {
     542                 :            :                     CharSet nCharSet = rtl_getTextEncodingFromWindowsCharset(
     543         [ #  # ]:          0 :                         (sal_uInt8)nTokenValue);
     544         [ #  # ]:          0 :                     pFont->SetCharSet(nCharSet);
     545                 :            :                     //When we're in a font, the fontname is in the font
     546                 :            :                     //charset, except for symbol fonts I believe
     547         [ #  # ]:          0 :                     if (nCharSet == RTL_TEXTENCODING_SYMBOL)
     548                 :          0 :                         nCharSet = RTL_TEXTENCODING_DONTKNOW;
     549         [ #  # ]:          0 :                     SetEncoding(nCharSet);
     550                 :            :                 }
     551                 :          0 :                 break;
     552                 :            :             case RTF_FPRQ:
     553      [ #  #  # ]:          0 :                 switch( nTokenValue )
     554                 :            :                 {
     555                 :            :                     case 1:
     556         [ #  # ]:          0 :                         pFont->SetPitch( PITCH_FIXED );
     557                 :          0 :                         break;
     558                 :            :                     case 2:
     559         [ #  # ]:          0 :                         pFont->SetPitch( PITCH_VARIABLE );
     560                 :          0 :                         break;
     561                 :            :                 }
     562                 :          0 :                 break;
     563                 :            :             case RTF_F:
     564                 :          0 :                 bCheckNewFont = sal_True;
     565                 :          0 :                 nInsFontNo = nFontNo;
     566                 :          0 :                 nFontNo = (short)nTokenValue;
     567                 :          0 :                 break;
     568                 :            :             case RTF_FALT:
     569                 :          0 :                 bIsAltFntNm = sal_True;
     570                 :          0 :                 break;
     571                 :            :             case RTF_TEXTTOKEN:
     572         [ #  # ]:          0 :                 DelCharAtEnd( aToken, ';' );
     573         [ #  # ]:          0 :                 if ( aToken.Len() )
     574                 :            :                 {
     575         [ #  # ]:          0 :                     if( bIsAltFntNm )
     576         [ #  # ]:          0 :                         sAltNm = aToken;
     577                 :            :                     else
     578         [ #  # ]:          0 :                         sFntNm = aToken;
     579                 :            :                 }
     580                 :          0 :                 break;
     581                 :            :         }
     582                 :            : 
     583 [ #  # ][ #  # ]:          0 :         if( bCheckNewFont && 1 >= _nOpenBrakets && sFntNm.Len() )  // one font is ready
         [ #  # ][ #  # ]
     584                 :            :         {
     585                 :            :             // All data from the font is available, so off to the table
     586         [ #  # ]:          0 :             if (sAltNm.Len())
     587 [ #  # ][ #  # ]:          0 :                 (sFntNm += ';' ) += sAltNm;
     588                 :            : 
     589 [ #  # ][ #  # ]:          0 :             pFont->SetName( sFntNm );
     590         [ #  # ]:          0 :             aFontTbl.insert( nInsFontNo, pFont );
     591 [ #  # ][ #  # ]:          0 :             pFont = new Font();
     592         [ #  # ]:          0 :             pFont->SetCharSet( nSystemChar );
     593         [ #  # ]:          0 :             sAltNm.Erase();
     594         [ #  # ]:          0 :             sFntNm.Erase();
     595                 :            :         }
     596                 :            :     }
     597                 :            :     // the last one we have to delete manually
     598 [ #  # ][ #  # ]:          0 :     delete pFont;
     599         [ #  # ]:          0 :     SkipToken( -1 );        // the closing brace is evaluated "above"
     600                 :            : 
     601                 :            :     // set the default font in the Document
     602 [ #  # ][ #  # ]:          0 :     if( bNewDoc && IsParserWorking() )
                 [ #  # ]
     603 [ #  # ][ #  # ]:          0 :         SetDefault( RTF_DEFF, nDfltFont );
                 [ #  # ]
     604                 :          0 : }
     605                 :            : 
     606                 :          0 : void SvxRTFParser::ReadBitmapData()
     607                 :            : {
     608                 :          0 :     SvRTFParser::ReadBitmapData();
     609                 :          0 : }
     610                 :            : 
     611                 :          0 : void SvxRTFParser::ReadOLEData()
     612                 :            : {
     613                 :          0 :     SvRTFParser::ReadOLEData();
     614                 :          0 : }
     615                 :            : 
     616                 :          0 : String& SvxRTFParser::GetTextToEndGroup( String& rStr )
     617                 :            : {
     618                 :          0 :     rStr.Erase( 0 );
     619                 :          0 :     int _nOpenBrakets = 1, nToken;  // the first was already detected earlier!!
     620                 :            : 
     621 [ #  # ][ #  # ]:          0 :     while( _nOpenBrakets && IsParserWorking() )
                 [ #  # ]
     622                 :            :     {
     623   [ #  #  #  # ]:          0 :         switch( nToken = GetNextToken() )
     624                 :            :         {
     625                 :          0 :         case '}':       --_nOpenBrakets;    break;
     626                 :            :         case '{':
     627                 :            :             {
     628         [ #  # ]:          0 :                 if( RTF_IGNOREFLAG != GetNextToken() )
     629                 :          0 :                     nToken = SkipToken( -1 );
     630         [ #  # ]:          0 :                 else if( RTF_UNKNOWNCONTROL != GetNextToken() )
     631                 :          0 :                     nToken = SkipToken( -2 );
     632                 :            :                 else
     633                 :            :                 {
     634                 :            :                     // filter out at once
     635                 :          0 :                     ReadUnknownData();
     636                 :          0 :                     nToken = GetNextToken();
     637         [ #  # ]:          0 :                     if( '}' != nToken )
     638                 :          0 :                         eState = SVPAR_ERROR;
     639                 :          0 :                     break;
     640                 :            :                 }
     641                 :          0 :                 ++_nOpenBrakets;
     642                 :            :             }
     643                 :          0 :             break;
     644                 :            : 
     645                 :            :         case RTF_TEXTTOKEN:
     646                 :          0 :             rStr += aToken;
     647                 :          0 :             break;
     648                 :            :         }
     649                 :            :     }
     650                 :          0 :     SkipToken( -1 );        // the closing brace is evaluated "above"
     651                 :          0 :     return rStr;
     652                 :            : }
     653                 :            : 
     654                 :          0 : util::DateTime SvxRTFParser::GetDateTimeStamp( )
     655                 :            : {
     656                 :          0 :     util::DateTime aDT;
     657                 :          0 :     sal_Bool bWeiter = sal_True;
     658                 :            : 
     659 [ #  # ][ #  # ]:          0 :     while( bWeiter && IsParserWorking() )
                 [ #  # ]
     660                 :            :     {
     661                 :          0 :         int nToken = GetNextToken();
     662   [ #  #  #  #  :          0 :         switch( nToken )
                   #  # ]
     663                 :            :         {
     664                 :          0 :         case RTF_YR:    aDT.Year = (sal_uInt16)nTokenValue;     break;
     665                 :          0 :         case RTF_MO:    aDT.Month = (sal_uInt16)nTokenValue;    break;
     666                 :          0 :         case RTF_DY:    aDT.Day = (sal_uInt16)nTokenValue;      break;
     667                 :          0 :         case RTF_HR:    aDT.Hours = (sal_uInt16)nTokenValue;    break;
     668                 :          0 :         case RTF_MIN:   aDT.Minutes = (sal_uInt16)nTokenValue;  break;
     669                 :            :         default:
     670                 :          0 :             bWeiter = sal_False;
     671                 :            :         }
     672                 :            :     }
     673                 :          0 :     SkipToken( -1 );        // the closing brace is evaluated "above"
     674                 :          0 :     return aDT;
     675                 :            : }
     676                 :            : 
     677                 :          0 : void SvxRTFParser::ReadInfo( const sal_Char* pChkForVerNo )
     678                 :            : {
     679                 :          0 :     int _nOpenBrakets = 1, nToken;  // the first was already detected earlier!!
     680                 :            :     DBG_ASSERT(m_xDocProps.is(),
     681                 :            :         "SvxRTFParser::ReadInfo: no DocumentProperties");
     682 [ #  # ][ #  # ]:          0 :     String sStr, sComment;
     683                 :          0 :     long nVersNo = 0;
     684                 :            : 
     685 [ #  # ][ #  # ]:          0 :     while( _nOpenBrakets && IsParserWorking() )
                 [ #  # ]
     686                 :            :     {
     687 [ #  # ][ #  #  :          0 :         switch( nToken = GetNextToken() )
          #  #  #  #  #  
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     688                 :            :         {
     689                 :          0 :         case '}':       --_nOpenBrakets;    break;
     690                 :            :         case '{':
     691                 :            :             {
     692 [ #  # ][ #  # ]:          0 :                 if( RTF_IGNOREFLAG != GetNextToken() )
     693         [ #  # ]:          0 :                     nToken = SkipToken( -1 );
     694 [ #  # ][ #  # ]:          0 :                 else if( RTF_UNKNOWNCONTROL != GetNextToken() )
     695         [ #  # ]:          0 :                     nToken = SkipToken( -2 );
     696                 :            :                 else
     697                 :            :                 {
     698                 :            :                     // filter out at once
     699         [ #  # ]:          0 :                     ReadUnknownData();
     700         [ #  # ]:          0 :                     nToken = GetNextToken();
     701         [ #  # ]:          0 :                     if( '}' != nToken )
     702                 :          0 :                         eState = SVPAR_ERROR;
     703                 :          0 :                     break;
     704                 :            :                 }
     705                 :          0 :                 ++_nOpenBrakets;
     706                 :            :             }
     707                 :          0 :             break;
     708                 :            : 
     709                 :            :         case RTF_TITLE:
     710 [ #  # ][ #  # ]:          0 :             m_xDocProps->setTitle( GetTextToEndGroup( sStr ) );
         [ #  # ][ #  # ]
     711                 :          0 :             break;
     712                 :            :         case RTF_SUBJECT:
     713 [ #  # ][ #  # ]:          0 :             m_xDocProps->setSubject( GetTextToEndGroup( sStr ) );
         [ #  # ][ #  # ]
     714                 :          0 :             break;
     715                 :            :         case RTF_AUTHOR:
     716 [ #  # ][ #  # ]:          0 :             m_xDocProps->setAuthor( GetTextToEndGroup( sStr ) );
         [ #  # ][ #  # ]
     717                 :          0 :             break;
     718                 :            :         case RTF_OPERATOR:
     719 [ #  # ][ #  # ]:          0 :             m_xDocProps->setModifiedBy( GetTextToEndGroup( sStr ) );
         [ #  # ][ #  # ]
     720                 :          0 :             break;
     721                 :            :         case RTF_KEYWORDS:
     722                 :            :             {
     723 [ #  # ][ #  # ]:          0 :                 ::rtl::OUString sTemp = GetTextToEndGroup( sStr );
     724         [ #  # ]:          0 :                 m_xDocProps->setKeywords(
     725 [ #  # ][ #  # ]:          0 :                     ::comphelper::string::convertCommaSeparated(sTemp) );
                 [ #  # ]
     726                 :          0 :                 break;
     727                 :            :             }
     728                 :            :         case RTF_DOCCOMM:
     729 [ #  # ][ #  # ]:          0 :             m_xDocProps->setDescription( GetTextToEndGroup( sStr ) );
         [ #  # ][ #  # ]
     730                 :          0 :             break;
     731                 :            : 
     732                 :            :         case RTF_HLINKBASE:
     733 [ #  # ][ #  # ]:          0 :             sBaseURL = GetTextToEndGroup( sStr ) ;
     734                 :          0 :             break;
     735                 :            : 
     736                 :            :         case RTF_CREATIM:
     737 [ #  # ][ #  # ]:          0 :             m_xDocProps->setCreationDate( GetDateTimeStamp() );
                 [ #  # ]
     738                 :          0 :             break;
     739                 :            : 
     740                 :            :         case RTF_REVTIM:
     741 [ #  # ][ #  # ]:          0 :             m_xDocProps->setModificationDate( GetDateTimeStamp() );
                 [ #  # ]
     742                 :          0 :             break;
     743                 :            : 
     744                 :            :         case RTF_PRINTIM:
     745 [ #  # ][ #  # ]:          0 :             m_xDocProps->setPrintDate( GetDateTimeStamp() );
                 [ #  # ]
     746                 :          0 :             break;
     747                 :            : 
     748                 :            :         case RTF_COMMENT:
     749         [ #  # ]:          0 :             GetTextToEndGroup( sComment );
     750                 :          0 :             break;
     751                 :            : 
     752                 :            :         case RTF_BUPTIM:
     753         [ #  # ]:          0 :             SkipGroup();
     754                 :          0 :             break;
     755                 :            : 
     756                 :            :         case RTF_VERN:
     757                 :          0 :             nVersNo = nTokenValue;
     758                 :          0 :             break;
     759                 :            : 
     760                 :            :         case RTF_EDMINS:
     761                 :            :         case RTF_ID:
     762                 :            :         case RTF_VERSION:
     763                 :            :         case RTF_NOFPAGES:
     764                 :            :         case RTF_NOFWORDS:
     765                 :            :         case RTF_NOFCHARS:
     766         [ #  # ]:          0 :             NextToken( nToken );
     767                 :          0 :             break;
     768                 :            : 
     769                 :            : //      default:
     770                 :            :         }
     771                 :            :     }
     772                 :            : 
     773 [ #  # ][ #  # ]:          0 :     if( pChkForVerNo &&
                 [ #  # ]
     774         [ #  # ]:          0 :         COMPARE_EQUAL == sComment.CompareToAscii( pChkForVerNo ))
     775                 :          0 :         nVersionNo = nVersNo;
     776                 :            : 
     777 [ #  # ][ #  # ]:          0 :     SkipToken( -1 );        // the closing brace is evaluated "above"
                 [ #  # ]
     778                 :          0 : }
     779                 :            : 
     780                 :            : 
     781                 :          0 : void SvxRTFParser::ClearColorTbl()
     782                 :            : {
     783         [ #  # ]:          0 :     while ( !aColorTbl.empty() )
     784                 :            :     {
     785                 :          0 :         delete aColorTbl.back();
     786                 :          0 :         aColorTbl.pop_back();
     787                 :            :     }
     788                 :          0 : }
     789                 :            : 
     790                 :          0 : void SvxRTFParser::ClearFontTbl()
     791                 :            : {
     792                 :          0 :     aFontTbl.clear();
     793                 :          0 : }
     794                 :            : 
     795                 :          0 : void SvxRTFParser::ClearStyleTbl()
     796                 :            : {
     797                 :          0 :     aStyleTbl.clear();
     798                 :          0 : }
     799                 :            : 
     800                 :          0 : void SvxRTFParser::ClearAttrStack()
     801                 :            : {
     802                 :            :     SvxRTFItemStackType* pTmp;
     803         [ #  # ]:          0 :     for( size_t nCnt = aAttrStack.size(); nCnt; --nCnt )
     804                 :            :     {
     805                 :          0 :         pTmp = aAttrStack.back();
     806                 :          0 :         aAttrStack.pop_back();
     807         [ #  # ]:          0 :         delete pTmp;
     808                 :            :     }
     809                 :          0 : }
     810                 :            : 
     811                 :          0 : String& SvxRTFParser::DelCharAtEnd( String& rStr, const sal_Unicode cDel )
     812                 :            : {
     813 [ #  # ][ #  # ]:          0 :     if( rStr.Len() && ' ' == rStr.GetChar( 0 ))
                 [ #  # ]
     814 [ #  # ][ #  # ]:          0 :         rStr = comphelper::string::stripStart(rStr, ' ');
     815 [ #  # ][ #  # ]:          0 :     if( rStr.Len() && ' ' == rStr.GetChar( rStr.Len()-1 ))
                 [ #  # ]
     816 [ #  # ][ #  # ]:          0 :         rStr = comphelper::string::stripEnd(rStr, ' ');
     817 [ #  # ][ #  # ]:          0 :     if( rStr.Len() && cDel == rStr.GetChar( rStr.Len()-1 ))
                 [ #  # ]
     818                 :          0 :         rStr.Erase( rStr.Len()-1 );
     819                 :          0 :     return rStr;
     820                 :            : }
     821                 :            : 
     822                 :            : 
     823                 :          0 : const Font& SvxRTFParser::GetFont( sal_uInt16 nId )
     824                 :            : {
     825 [ #  # ][ #  # ]:          0 :     SvxRTFFontTbl::const_iterator it = aFontTbl.find( nId );
     826                 :            :     const Font* pFont;
     827 [ #  # ][ #  # ]:          0 :     if( it == aFontTbl.end() )
                 [ #  # ]
     828                 :            :     {
     829                 :            :         const SvxFontItem& rDfltFont = (const SvxFontItem&)
     830                 :            :                         pAttrPool->GetDefaultItem(
     831 [ #  # ][ #  # ]:          0 :                     ((RTFPlainAttrMapIds*)&aPlainMap[0])->nFont );
     832 [ #  # ][ #  # ]:          0 :         pDfltFont->SetName( rDfltFont.GetStyleName() );
     833         [ #  # ]:          0 :         pDfltFont->SetFamily( rDfltFont.GetFamily() );
     834                 :          0 :         pFont = pDfltFont;
     835                 :            :     }
     836                 :            :     else
     837         [ #  # ]:          0 :         pFont = it->second;
     838                 :          0 :     return *pFont;
     839                 :            : }
     840                 :            : 
     841                 :          0 : SvxRTFItemStackType* SvxRTFParser::_GetAttrSet( int bCopyAttr )
     842                 :            : {
     843 [ #  # ][ #  # ]:          0 :     SvxRTFItemStackType* pAkt = aAttrStack.empty() ? 0 : aAttrStack.back();
     844                 :            :     SvxRTFItemStackType* pNew;
     845         [ #  # ]:          0 :     if( pAkt )
     846 [ #  # ][ #  # ]:          0 :         pNew = new SvxRTFItemStackType( *pAkt, *pInsPos, bCopyAttr );
     847                 :            :     else
     848                 :          0 :         pNew = new SvxRTFItemStackType( *pAttrPool, &aWhichMap[0],
     849 [ #  # ][ #  # ]:          0 :                                         *pInsPos );
                 [ #  # ]
     850 [ #  # ][ #  # ]:          0 :     pNew->SetRTFDefaults( GetRTFDefaults() );
     851                 :            : 
     852         [ #  # ]:          0 :     aAttrStack.push_back( pNew );
     853                 :          0 :     bNewGroup = sal_False;
     854                 :          0 :     return pNew;
     855                 :            : }
     856                 :            : 
     857                 :            : 
     858                 :          0 : void SvxRTFParser::_ClearStyleAttr( SvxRTFItemStackType& rStkType )
     859                 :            : {
     860                 :            :     // check attributes to the attributes of the stylesheet or to
     861                 :            :     // the default attrs of the document
     862                 :          0 :     SfxItemSet &rSet = rStkType.GetAttrSet();
     863                 :          0 :     const SfxItemPool& rPool = *rSet.GetPool();
     864                 :            :     const SfxPoolItem* pItem;
     865         [ #  # ]:          0 :     SfxWhichIter aIter( rSet );
     866                 :            : 
     867   [ #  #  #  # ]:          0 :     if( !IsChkStyleAttr() ||
         [ #  # ][ #  # ]
     868                 :          0 :         !rStkType.GetAttrSet().Count() ||
     869         [ #  # ]:          0 :         aStyleTbl.count( rStkType.nStyleNo ) == 0 )
     870                 :            :     {
     871 [ #  # ][ #  # ]:          0 :         for( sal_uInt16 nWhich = aIter.GetCurWhich(); nWhich; nWhich = aIter.NextWhich() )
     872                 :            :         {
     873 [ #  # ][ #  # ]:          0 :             if( SFX_WHICH_MAX > nWhich &&
         [ #  # ][ #  # ]
     874         [ #  # ]:          0 :                 SFX_ITEM_SET == rSet.GetItemState( nWhich, sal_False, &pItem ) &&
     875 [ #  # ][ #  # ]:          0 :                      rPool.GetDefaultItem( nWhich ) == *pItem )
     876         [ #  # ]:          0 :                 rSet.ClearItem( nWhich );       // delete
     877                 :            :         }
     878                 :            :     }
     879                 :            :     else
     880                 :            :     {
     881                 :            :         // Delete all Attributes, which are already defined in the Style,
     882                 :            :         // from the current AttrSet.
     883 [ #  # ][ #  # ]:          0 :         SvxRTFStyleType* pStyle = aStyleTbl.find( rStkType.nStyleNo )->second;
     884                 :          0 :         SfxItemSet &rStyleSet = pStyle->aAttrSet;
     885                 :            :         const SfxPoolItem* pSItem;
     886 [ #  # ][ #  # ]:          0 :         for( sal_uInt16 nWhich = aIter.GetCurWhich(); nWhich; nWhich = aIter.NextWhich() )
     887                 :            :         {
     888 [ #  # ][ #  # ]:          0 :             if( SFX_ITEM_SET == rStyleSet.GetItemState( nWhich, sal_True, &pSItem ))
     889                 :            :             {
     890 [ #  # ][ #  # ]:          0 :                 if( SFX_ITEM_SET == rSet.GetItemState( nWhich, sal_False, &pItem )
         [ #  # ][ #  # ]
     891         [ #  # ]:          0 :                     && *pItem == *pSItem )
     892         [ #  # ]:          0 :                     rSet.ClearItem( nWhich );       // delete
     893                 :            :             }
     894 [ #  # ][ #  # ]:          0 :             else if( SFX_WHICH_MAX > nWhich &&
         [ #  # ][ #  # ]
     895         [ #  # ]:          0 :                     SFX_ITEM_SET == rSet.GetItemState( nWhich, sal_False, &pItem ) &&
     896 [ #  # ][ #  # ]:          0 :                      rPool.GetDefaultItem( nWhich ) == *pItem )
     897         [ #  # ]:          0 :                 rSet.ClearItem( nWhich );       // delete
     898                 :            :         }
     899         [ #  # ]:          0 :     }
     900                 :          0 : }
     901                 :            : 
     902                 :          0 : void SvxRTFParser::AttrGroupEnd()   // process the current, delete from Stack
     903                 :            : {
     904         [ #  # ]:          0 :     if( !aAttrStack.empty() )
     905                 :            :     {
     906         [ #  # ]:          0 :         SvxRTFItemStackType *pOld = aAttrStack.empty() ? 0 : aAttrStack.back();
     907                 :          0 :         aAttrStack.pop_back();
     908         [ #  # ]:          0 :         SvxRTFItemStackType *pAkt = aAttrStack.empty() ? 0 : aAttrStack.back();
     909                 :            : 
     910                 :            :         do {        // middle check loop
     911                 :          0 :             sal_uLong nOldSttNdIdx = pOld->pSttNd->GetIdx();
     912   [ #  #  #  #  :          0 :             if( !pOld->pChildList &&
           #  # ][ #  # ]
           [ #  #  #  # ]
     913                 :          0 :                 ((!pOld->aAttrSet.Count() && !pOld->nStyleNo ) ||
     914                 :          0 :                 (nOldSttNdIdx == pInsPos->GetNodeIdx() &&
     915                 :          0 :                 pOld->nSttCnt == pInsPos->GetCntIdx() )))
     916                 :          0 :                 break;          // no attributes or Area
     917                 :            : 
     918                 :            :             // set only the attributes that are different from the parent
     919 [ #  # ][ #  # ]:          0 :             if( pAkt && pOld->aAttrSet.Count() )
                 [ #  # ]
     920                 :            :             {
     921         [ #  # ]:          0 :                 SfxItemIter aIter( pOld->aAttrSet );
     922                 :          0 :                 const SfxPoolItem* pItem = aIter.GetCurItem(), *pGet;
     923                 :          0 :                 while( sal_True )
     924                 :            :                 {
     925 [ #  # ][ #  # ]:          0 :                     if( SFX_ITEM_SET == pAkt->aAttrSet.GetItemState(
                 [ #  # ]
     926         [ #  # ]:          0 :                         pItem->Which(), sal_False, &pGet ) &&
     927         [ #  # ]:          0 :                         *pItem == *pGet )
     928         [ #  # ]:          0 :                         pOld->aAttrSet.ClearItem( pItem->Which() );
     929                 :            : 
     930         [ #  # ]:          0 :                     if( aIter.IsAtEnd() )
     931                 :          0 :                         break;
     932         [ #  # ]:          0 :                     pItem = aIter.NextItem();
     933                 :            :                 }
     934                 :            : 
     935 [ #  # ][ #  # ]:          0 :                 if( !pOld->aAttrSet.Count() && !pOld->pChildList &&
         [ #  # ][ #  # ]
     936                 :          0 :                     !pOld->nStyleNo )
     937 [ #  # ][ #  # ]:          0 :                     break;
     938                 :            :             }
     939                 :            : 
     940                 :            :             // Set all attributes which have been defined from start until here
     941                 :          0 :             int bCrsrBack = !pInsPos->GetCntIdx();
     942         [ #  # ]:          0 :             if( bCrsrBack )
     943                 :            :             {
     944                 :            :                 // at the beginning of a paragraph? Move back one position
     945                 :          0 :                 sal_uLong nNd = pInsPos->GetNodeIdx();
     946                 :          0 :                 MovePos( sal_False );
     947                 :            :                 // if can not move backward then later dont move forward !
     948                 :          0 :                 bCrsrBack = nNd != pInsPos->GetNodeIdx();
     949                 :            :             }
     950                 :            : 
     951   [ #  #  #  #  :          0 :             if( ( pOld->pSttNd->GetIdx() < pInsPos->GetNodeIdx() ||
           #  # ][ #  # ]
     952                 :          0 :                 ( pOld->pSttNd->GetIdx() == pInsPos->GetNodeIdx() &&
     953                 :          0 :                 pOld->nSttCnt <= pInsPos->GetCntIdx() ))
     954                 :            :                 )
     955                 :            :             {
     956         [ #  # ]:          0 :                 if( !bCrsrBack )
     957                 :            :                 {
     958                 :            :                     // all pard attributes are only valid until the previous
     959                 :            :                     // paragraph !!
     960         [ #  # ]:          0 :                     if( nOldSttNdIdx == pInsPos->GetNodeIdx() )
     961                 :            :                     {
     962                 :            :                     }
     963                 :            :                     else
     964                 :            :                     {
     965                 :            :                         // Now it gets complicated:
     966                 :            :                         // - all character attributes sre keep the area
     967                 :            :                         // - all paragraph attributes to get the area
     968                 :            :                         //   up to the previous paragraph
     969                 :            :                         SvxRTFItemStackType* pNew = new SvxRTFItemStackType(
     970         [ #  # ]:          0 :                                     *pOld, *pInsPos, sal_True );
     971                 :          0 :                         pNew->aAttrSet.SetParent( pOld->aAttrSet.GetParent() );
     972                 :            : 
     973                 :            :                         // Delete all paragraph attributes from pNew
     974   [ #  #  #  # ]:          0 :                         for( sal_uInt16 n = 0; n < aPardMap.size() &&
                 [ #  # ]
     975                 :          0 :                                             pNew->aAttrSet.Count(); ++n )
     976         [ #  # ]:          0 :                             if( aPardMap[n] )
     977                 :          0 :                                 pNew->aAttrSet.ClearItem( aPardMap[n] );
     978                 :          0 :                         pNew->SetRTFDefaults( GetRTFDefaults() );
     979                 :            : 
     980                 :            :                         // Were there any?
     981         [ #  # ]:          0 :                         if( pNew->aAttrSet.Count() == pOld->aAttrSet.Count() )
     982         [ #  # ]:          0 :                             delete pNew;
     983                 :            :                         else
     984                 :            :                         {
     985                 :          0 :                             pNew->nStyleNo = 0;
     986                 :            : 
     987                 :            :                             // Now span the real area of pNew from old
     988                 :          0 :                             SetEndPrevPara( pOld->pEndNd, pOld->nEndCnt );
     989                 :          0 :                             pNew->nSttCnt = 0;
     990                 :            : 
     991         [ #  # ]:          0 :                             if( IsChkStyleAttr() )
     992                 :            :                             {
     993                 :          0 :                                 _ClearStyleAttr( *pOld );
     994                 :          0 :                                 _ClearStyleAttr( *pNew );   //#i10381#, methinks.
     995                 :            :                             }
     996                 :            : 
     997         [ #  # ]:          0 :                             if( pAkt )
     998                 :            :                             {
     999                 :          0 :                                 pAkt->Add( pOld );
    1000                 :          0 :                                 pAkt->Add( pNew );
    1001                 :            :                             }
    1002                 :            :                             else
    1003                 :            :                             {
    1004                 :            :                                 // Last off the stack, thus cache it until the next text was
    1005                 :            :                                 // read. (Span no attributes!)
    1006                 :            : 
    1007                 :          0 :                                 aAttrSetList.push_back( pOld );
    1008                 :          0 :                                 aAttrSetList.push_back( pNew );
    1009                 :            :                             }
    1010                 :          0 :                             pOld = 0;   // Do not delete pOld
    1011                 :          0 :                             break;
    1012                 :            :                         }
    1013                 :            :                     }
    1014                 :            :                 }
    1015                 :            : 
    1016                 :          0 :                 pOld->pEndNd = pInsPos->MakeNodeIdx();
    1017                 :          0 :                 pOld->nEndCnt = pInsPos->GetCntIdx();
    1018                 :            : 
    1019                 :            :                 /*
    1020                 :            :                 #i21422#
    1021                 :            :                 If the parent (pAkt) sets something e.g. , and the child (pOld)
    1022                 :            :                 unsets it and the style both are based on has it unset then
    1023                 :            :                 clearing the pOld by looking at the style is clearly a disaster
    1024                 :            :                 as the text ends up with pAkts bold and not pOlds no bold, this
    1025                 :            :                 should be rethought out. For the moment its safest to just do
    1026                 :            :                 the clean if we have no parent, all we suffer is too many
    1027                 :            :                 redundant properties.
    1028                 :            :                 */
    1029 [ #  # ][ #  # ]:          0 :                 if (IsChkStyleAttr() && !pAkt)
                 [ #  # ]
    1030                 :          0 :                     _ClearStyleAttr( *pOld );
    1031                 :            : 
    1032         [ #  # ]:          0 :                 if( pAkt )
    1033                 :            :                 {
    1034                 :          0 :                     pAkt->Add( pOld );
    1035                 :            :                     // split up and create new entry, because it make no sense
    1036                 :            :                     // to create a "so long" depend list. Bug 95010
    1037 [ #  # ][ #  # ]:          0 :                     if( bCrsrBack && 50 < pAkt->pChildList->size() )
                 [ #  # ]
    1038                 :            :                     {
    1039                 :            :                         // at the beginning of a paragraph? Move back one position
    1040         [ #  # ]:          0 :                         MovePos( sal_True );
    1041                 :          0 :                         bCrsrBack = sal_False;
    1042                 :            : 
    1043                 :            :                         // Open a new Group.
    1044                 :            :                         SvxRTFItemStackType* pNew = new SvxRTFItemStackType(
    1045 [ #  # ][ #  # ]:          0 :                                                 *pAkt, *pInsPos, sal_True );
    1046 [ #  # ][ #  # ]:          0 :                         pNew->SetRTFDefaults( GetRTFDefaults() );
    1047                 :            : 
    1048                 :            :                         // Set all until here valid Attributes
    1049         [ #  # ]:          0 :                         AttrGroupEnd();
    1050 [ #  # ][ #  # ]:          0 :                         pAkt = aAttrStack.empty() ? 0 : aAttrStack.back();  // can be changed after AttrGroupEnd!
    1051         [ #  # ]:          0 :                         pNew->aAttrSet.SetParent( pAkt ? &pAkt->aAttrSet : 0 );
    1052         [ #  # ]:          0 :                         aAttrStack.push_back( pNew );
    1053                 :          0 :                         pAkt = pNew;
    1054                 :            :                     }
    1055                 :            :                 }
    1056                 :            :                 else
    1057                 :            :                     // Last off the stack, thus cache it until the next text was
    1058                 :            :                     // read. (Span no attributes!)
    1059                 :          0 :                     aAttrSetList.push_back( pOld );
    1060                 :            : 
    1061                 :          0 :                 pOld = 0;
    1062                 :            :             }
    1063                 :            : 
    1064         [ #  # ]:          0 :             if( bCrsrBack )
    1065                 :            :                 // at the beginning of a paragraph? Move back one position
    1066                 :          0 :                 MovePos( sal_True );
    1067                 :            : 
    1068                 :            :         } while( sal_False );
    1069                 :            : 
    1070         [ #  # ]:          0 :         if( pOld )
    1071         [ #  # ]:          0 :             delete pOld;
    1072                 :            : 
    1073                 :          0 :         bNewGroup = sal_False;
    1074                 :            :     }
    1075                 :          0 : }
    1076                 :            : 
    1077                 :          0 : void SvxRTFParser::SetAllAttrOfStk()        // end all Attr. and set it into doc
    1078                 :            : {
    1079                 :            :     // repeat until all attributes will be taken from stack
    1080         [ #  # ]:          0 :     while( !aAttrStack.empty() )
    1081                 :          0 :         AttrGroupEnd();
    1082                 :            : 
    1083         [ #  # ]:          0 :     for( sal_uInt16 n = aAttrSetList.size(); n; )
    1084                 :            :     {
    1085                 :          0 :         SvxRTFItemStackType* pStkSet = &aAttrSetList[--n];
    1086                 :          0 :         SetAttrSet( *pStkSet );
    1087                 :          0 :         aAttrSetList.pop_back();
    1088                 :            :     }
    1089                 :          0 : }
    1090                 :            : 
    1091                 :            : // sets all the attributes that are different from the current
    1092                 :          0 : void SvxRTFParser::SetAttrSet( SvxRTFItemStackType &rSet )
    1093                 :            : {
    1094                 :            :     // Was DefTab never read? then set to default
    1095         [ #  # ]:          0 :     if( !bIsSetDfltTab )
    1096                 :          0 :         SetDefault( RTF_DEFTAB, 720 );
    1097                 :            : 
    1098         [ #  # ]:          0 :     if( rSet.pChildList )
    1099                 :          0 :         rSet.Compress( *this );
    1100 [ #  # ][ #  # ]:          0 :     if( rSet.aAttrSet.Count() || rSet.nStyleNo )
                 [ #  # ]
    1101                 :          0 :         SetAttrInDoc( rSet );
    1102                 :            : 
    1103                 :            :     // then process all the children
    1104         [ #  # ]:          0 :     if( rSet.pChildList )
    1105         [ #  # ]:          0 :         for( sal_uInt16 n = 0; n < rSet.pChildList->size(); ++n )
    1106                 :          0 :             SetAttrSet( (*rSet.pChildList)[ n ] );
    1107                 :          0 : }
    1108                 :            : 
    1109                 :            :     // Has no Text been inserted yet? (SttPos from the top Stack entry!)
    1110                 :          0 : int SvxRTFParser::IsAttrSttPos()
    1111                 :            : {
    1112         [ #  # ]:          0 :     SvxRTFItemStackType* pAkt = aAttrStack.empty() ? 0 : aAttrStack.back();
    1113                 :          0 :     return !pAkt || (pAkt->pSttNd->GetIdx() == pInsPos->GetNodeIdx() &&
    1114   [ #  #  #  # ]:          0 :         pAkt->nSttCnt == pInsPos->GetCntIdx());
                 [ #  # ]
    1115                 :            : }
    1116                 :            : 
    1117                 :            : 
    1118                 :          0 : void SvxRTFParser::SetAttrInDoc( SvxRTFItemStackType & )
    1119                 :            : {
    1120                 :          0 : }
    1121                 :            : 
    1122                 :          0 : void SvxRTFParser::BuildWhichTbl()
    1123                 :            : {
    1124                 :          0 :     aWhichMap.clear();
    1125         [ #  # ]:          0 :     aWhichMap.push_back( 0 );
    1126                 :            : 
    1127                 :            :     // Building a Which-Map 'rWhichMap' from an Array of
    1128                 :            :     // 'pWhichIds' frm Which-Ids. It has the long 'nWhichIds'.
    1129                 :            :     // The Which-Map is not going to be deleted.
    1130                 :          0 :     SvParser::BuildWhichTbl( aWhichMap, (sal_uInt16*)&aPardMap[0], aPardMap.size() );
    1131                 :          0 :     SvParser::BuildWhichTbl( aWhichMap, (sal_uInt16*)&aPlainMap[0], aPlainMap.size() );
    1132                 :          0 : }
    1133                 :            : 
    1134                 :          0 : const SfxItemSet& SvxRTFParser::GetRTFDefaults()
    1135                 :            : {
    1136         [ #  # ]:          0 :     if( !pRTFDefaults )
    1137                 :            :     {
    1138         [ #  # ]:          0 :         pRTFDefaults = new SfxItemSet( *pAttrPool, &aWhichMap[0] );
    1139                 :            :         sal_uInt16 nId;
    1140         [ #  # ]:          0 :         if( 0 != ( nId = ((RTFPardAttrMapIds*)&aPardMap[0])->nScriptSpace ))
    1141                 :            :         {
    1142         [ #  # ]:          0 :             SvxScriptSpaceItem aItem( sal_False, nId );
    1143         [ #  # ]:          0 :             if( bNewDoc )
    1144         [ #  # ]:          0 :                 pAttrPool->SetPoolDefaultItem( aItem );
    1145                 :            :             else
    1146 [ #  # ][ #  # ]:          0 :                 pRTFDefaults->Put( aItem );
    1147                 :            :         }
    1148                 :            :     }
    1149                 :          0 :     return *pRTFDefaults;
    1150                 :            : }
    1151                 :            : 
    1152                 :            : 
    1153                 :          0 : SvxRTFStyleType::SvxRTFStyleType( SfxItemPool& rPool, const sal_uInt16* pWhichRange )
    1154         [ #  # ]:          0 :     : aAttrSet( rPool, pWhichRange )
    1155                 :            : {
    1156                 :          0 :     nOutlineNo = sal_uInt8(-1);         // not set
    1157                 :          0 :     nBasedOn = 0;
    1158                 :          0 :     bBasedOnIsSet = sal_False;          //$flr #117411#
    1159                 :          0 :     nNext = 0;
    1160                 :          0 :     bIsCharFmt = sal_False;
    1161                 :          0 : }
    1162                 :            : 
    1163                 :            : 
    1164                 :          0 : SvxRTFItemStackType::SvxRTFItemStackType(
    1165                 :            :         SfxItemPool& rPool, const sal_uInt16* pWhichRange,
    1166                 :            :         const SvxPosition& rPos )
    1167                 :            :     : aAttrSet( rPool, pWhichRange ),
    1168                 :            :     pChildList( 0 ),
    1169                 :          0 :     nStyleNo( 0 )
    1170                 :            : {
    1171         [ #  # ]:          0 :     pSttNd = rPos.MakeNodeIdx();
    1172         [ #  # ]:          0 :     nSttCnt = rPos.GetCntIdx();
    1173                 :          0 :     pEndNd = pSttNd;
    1174                 :          0 :     nEndCnt = nSttCnt;
    1175                 :          0 : }
    1176                 :            : 
    1177                 :          0 : SvxRTFItemStackType::SvxRTFItemStackType(
    1178                 :            :         const SvxRTFItemStackType& rCpy,
    1179                 :            :         const SvxPosition& rPos,
    1180                 :            :         int bCopyAttr )
    1181                 :          0 :     : aAttrSet( *rCpy.aAttrSet.GetPool(), rCpy.aAttrSet.GetRanges() ),
    1182                 :            :     pChildList( 0 ),
    1183                 :          0 :     nStyleNo( rCpy.nStyleNo )
    1184                 :            : {
    1185         [ #  # ]:          0 :     pSttNd = rPos.MakeNodeIdx();
    1186         [ #  # ]:          0 :     nSttCnt = rPos.GetCntIdx();
    1187                 :          0 :     pEndNd = pSttNd;
    1188                 :          0 :     nEndCnt = nSttCnt;
    1189                 :            : 
    1190                 :          0 :     aAttrSet.SetParent( &rCpy.aAttrSet );
    1191         [ #  # ]:          0 :     if( bCopyAttr )
    1192         [ #  # ]:          0 :         aAttrSet.Put( rCpy.aAttrSet );
    1193                 :          0 : }
    1194                 :            : 
    1195                 :          0 : SvxRTFItemStackType::~SvxRTFItemStackType()
    1196                 :            : {
    1197         [ #  # ]:          0 :     if( pChildList )
    1198 [ #  # ][ #  # ]:          0 :         delete pChildList;
    1199         [ #  # ]:          0 :     if( pSttNd != pEndNd )
    1200 [ #  # ][ #  # ]:          0 :         delete pEndNd;
    1201 [ #  # ][ #  # ]:          0 :     delete pSttNd;
    1202                 :          0 : }
    1203                 :            : 
    1204                 :          0 : void SvxRTFItemStackType::Add( SvxRTFItemStackType* pIns )
    1205                 :            : {
    1206         [ #  # ]:          0 :     if( !pChildList )
    1207         [ #  # ]:          0 :          pChildList = new SvxRTFItemStackList();
    1208                 :          0 :     pChildList->push_back( pIns );
    1209                 :          0 : }
    1210                 :            : 
    1211                 :          0 : void SvxRTFItemStackType::SetStartPos( const SvxPosition& rPos )
    1212                 :            : {
    1213         [ #  # ]:          0 :     if (pSttNd != pEndNd)
    1214         [ #  # ]:          0 :         delete pEndNd;
    1215         [ #  # ]:          0 :     delete pSttNd;
    1216                 :          0 :     pSttNd = rPos.MakeNodeIdx();
    1217                 :          0 :     pEndNd = pSttNd;
    1218                 :          0 :     nSttCnt = rPos.GetCntIdx();
    1219                 :          0 : }
    1220                 :            : 
    1221                 :          0 : void SvxRTFItemStackType::MoveFullNode(const SvxNodeIdx &rOldNode,
    1222                 :            :     const SvxNodeIdx &rNewNode)
    1223                 :            : {
    1224                 :          0 :     bool bSameEndAsStart = (pSttNd == pEndNd) ? true : false;
    1225                 :            : 
    1226         [ #  # ]:          0 :     if (GetSttNodeIdx() == rOldNode.GetIdx())
    1227                 :            :     {
    1228         [ #  # ]:          0 :         delete pSttNd;
    1229                 :          0 :         pSttNd = rNewNode.Clone();
    1230         [ #  # ]:          0 :         if (bSameEndAsStart)
    1231                 :          0 :             pEndNd = pSttNd;
    1232                 :            :     }
    1233                 :            : 
    1234 [ #  # ][ #  # ]:          0 :     if (!bSameEndAsStart && GetEndNodeIdx() == rOldNode.GetIdx())
                 [ #  # ]
    1235                 :            :     {
    1236         [ #  # ]:          0 :         delete pEndNd;
    1237                 :          0 :         pEndNd = rNewNode.Clone();
    1238                 :            :     }
    1239                 :            : 
    1240                 :            :     //And the same for all the children
    1241         [ #  # ]:          0 :     sal_uInt16 nCount = pChildList ? pChildList->size() : 0;
    1242         [ #  # ]:          0 :     for (sal_uInt16 i = 0; i < nCount; ++i)
    1243                 :            :     {
    1244                 :          0 :         SvxRTFItemStackType* pStk = &(*pChildList)[i];
    1245                 :          0 :         pStk->MoveFullNode(rOldNode, rNewNode);
    1246                 :            :     }
    1247                 :          0 : }
    1248                 :            : 
    1249                 :          0 : bool SvxRTFParser::UncompressableStackEntry(const SvxRTFItemStackType &) const
    1250                 :            : {
    1251                 :          0 :     return false;
    1252                 :            : }
    1253                 :            : 
    1254                 :          0 : void SvxRTFItemStackType::Compress( const SvxRTFParser& rParser )
    1255                 :            : {
    1256         [ #  # ]:          0 :     ENSURE_OR_RETURN_VOID(pChildList, "Compress: no ChildList" );
    1257         [ #  # ]:          0 :     ENSURE_OR_RETURN_VOID(!pChildList->empty(), "Compress: ChildList empty");
    1258                 :            : 
    1259                 :            :     sal_uInt16 n;
    1260         [ #  # ]:          0 :     SvxRTFItemStackType* pTmp = &(*pChildList)[0];
    1261                 :            : 
    1262 [ #  # ][ #  # ]:          0 :     if( !pTmp->aAttrSet.Count() ||
         [ #  # ][ #  # ]
    1263 [ #  # ][ #  # ]:          0 :         pSttNd->GetIdx() != pTmp->pSttNd->GetIdx() ||
    1264                 :            :         nSttCnt != pTmp->nSttCnt )
    1265                 :            :         return;
    1266                 :            : 
    1267                 :          0 :     SvxNodeIdx* pLastNd = pTmp->pEndNd;
    1268                 :          0 :     xub_StrLen nLastCnt = pTmp->nEndCnt;
    1269                 :            : 
    1270         [ #  # ]:          0 :     SfxItemSet aMrgSet( pTmp->aAttrSet );
    1271         [ #  # ]:          0 :     for( n = 1; n < pChildList->size(); ++n )
    1272                 :            :     {
    1273         [ #  # ]:          0 :         pTmp = &(*pChildList)[n];
    1274         [ #  # ]:          0 :         if( pTmp->pChildList )
    1275         [ #  # ]:          0 :             pTmp->Compress( rParser );
    1276                 :            : 
    1277 [ #  # ][ #  # ]:          0 :         if( !pTmp->nSttCnt
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1278 [ #  # ][ #  # ]:          0 :             ? (pLastNd->GetIdx()+1 != pTmp->pSttNd->GetIdx() ||
    1279         [ #  # ]:          0 :                !rParser.IsEndPara( pLastNd, nLastCnt ) )
    1280                 :            :             : ( pTmp->nSttCnt != nLastCnt ||
    1281 [ #  # ][ #  # ]:          0 :                 pLastNd->GetIdx() != pTmp->pSttNd->GetIdx() ))
    1282                 :            :         {
    1283         [ #  # ]:          0 :             while( ++n < pChildList->size() )
    1284 [ #  # ][ #  # ]:          0 :                 if( (pTmp = &(*pChildList)[n])->pChildList )
    1285         [ #  # ]:          0 :                     pTmp->Compress( rParser );
    1286                 :            :             return;
    1287                 :            :         }
    1288                 :            : 
    1289 [ #  # ][ #  # ]:          0 :         if (rParser.UncompressableStackEntry(*pTmp))
    1290                 :            :             return;
    1291                 :            : 
    1292         [ #  # ]:          0 :         if( n )
    1293                 :            :         {
    1294                 :            :             // Search for all which are set over the whole area
    1295         [ #  # ]:          0 :             SfxItemIter aIter( aMrgSet );
    1296                 :            :             const SfxPoolItem* pItem;
    1297                 :          0 :             do {
    1298                 :          0 :                 sal_uInt16 nWhich = aIter.GetCurItem()->Which();
    1299 [ #  # ][ #  # ]:          0 :                 if( SFX_ITEM_SET != pTmp->aAttrSet.GetItemState( nWhich,
                 [ #  # ]
    1300 [ #  # ][ #  # ]:          0 :                       sal_False, &pItem ) || *pItem != *aIter.GetCurItem() )
    1301         [ #  # ]:          0 :                     aMrgSet.ClearItem( nWhich );
    1302                 :            : 
    1303         [ #  # ]:          0 :                 if( aIter.IsAtEnd() )
    1304                 :          0 :                     break;
    1305         [ #  # ]:          0 :                 aIter.NextItem();
    1306                 :            :             } while( sal_True );
    1307                 :            : 
    1308         [ #  # ]:          0 :             if( !aMrgSet.Count() )
    1309 [ #  # ][ #  # ]:          0 :                 return;
    1310                 :            :         }
    1311                 :            : 
    1312                 :          0 :         pLastNd = pTmp->pEndNd;
    1313                 :          0 :         nLastCnt = pTmp->nEndCnt;
    1314                 :            :     }
    1315                 :            : 
    1316 [ #  # ][ #  # ]:          0 :     if( pEndNd->GetIdx() != pLastNd->GetIdx() || nEndCnt != nLastCnt )
         [ #  # ][ #  # ]
                 [ #  # ]
    1317                 :            :         return;
    1318                 :            : 
    1319                 :            :     // It can be merged
    1320         [ #  # ]:          0 :     aAttrSet.Put( aMrgSet );
    1321                 :            : 
    1322         [ #  # ]:          0 :     for( n = 0; n < pChildList->size(); ++n )
    1323                 :            :     {
    1324         [ #  # ]:          0 :         pTmp = &(*pChildList)[n];
    1325         [ #  # ]:          0 :         pTmp->aAttrSet.Differentiate( aMrgSet );
    1326                 :            : 
    1327 [ #  # ][ #  # ]:          0 :         if( !pTmp->pChildList && !pTmp->aAttrSet.Count() && !pTmp->nStyleNo )
         [ #  # ][ #  # ]
    1328                 :            :         {
    1329 [ #  # ][ #  # ]:          0 :             pChildList->erase( pChildList->begin() + n );
                 [ #  # ]
    1330                 :          0 :             --n;
    1331                 :          0 :             continue;
    1332                 :            :         }
    1333                 :            :     }
    1334         [ #  # ]:          0 :     if( pChildList->empty() )
    1335                 :            :     {
    1336 [ #  # ][ #  # ]:          0 :         delete pChildList;
    1337                 :          0 :         pChildList = 0;
    1338 [ #  # ][ #  # ]:          0 :     }
    1339                 :            : }
    1340                 :          0 : void SvxRTFItemStackType::SetRTFDefaults( const SfxItemSet& rDefaults )
    1341                 :            : {
    1342         [ #  # ]:          0 :     if( rDefaults.Count() )
    1343                 :            :     {
    1344         [ #  # ]:          0 :         SfxItemIter aIter( rDefaults );
    1345                 :          0 :         do {
    1346                 :          0 :             sal_uInt16 nWhich = aIter.GetCurItem()->Which();
    1347 [ #  # ][ #  # ]:          0 :             if( SFX_ITEM_SET != aAttrSet.GetItemState( nWhich, sal_False ))
    1348         [ #  # ]:          0 :                 aAttrSet.Put( *aIter.GetCurItem() );
    1349                 :            : 
    1350         [ #  # ]:          0 :             if( aIter.IsAtEnd() )
    1351                 :          0 :                 break;
    1352         [ #  # ]:          0 :             aIter.NextItem();
    1353         [ #  # ]:          0 :         } while( sal_True );
    1354                 :            :     }
    1355                 :          0 : }
    1356                 :            : 
    1357                 :            : 
    1358                 :          0 : RTFPlainAttrMapIds::RTFPlainAttrMapIds( const SfxItemPool& rPool )
    1359                 :            : {
    1360                 :          0 :     nCaseMap = rPool.GetTrueWhich( SID_ATTR_CHAR_CASEMAP, sal_False );
    1361                 :          0 :     nBgColor = rPool.GetTrueWhich( SID_ATTR_BRUSH_CHAR, sal_False );
    1362                 :          0 :     nColor = rPool.GetTrueWhich( SID_ATTR_CHAR_COLOR, sal_False );
    1363                 :          0 :     nContour = rPool.GetTrueWhich( SID_ATTR_CHAR_CONTOUR, sal_False );
    1364                 :          0 :     nCrossedOut = rPool.GetTrueWhich( SID_ATTR_CHAR_STRIKEOUT, sal_False );
    1365                 :          0 :     nEscapement = rPool.GetTrueWhich( SID_ATTR_CHAR_ESCAPEMENT, sal_False );
    1366                 :          0 :     nFont = rPool.GetTrueWhich( SID_ATTR_CHAR_FONT, sal_False );
    1367                 :          0 :     nFontHeight = rPool.GetTrueWhich( SID_ATTR_CHAR_FONTHEIGHT, sal_False );
    1368                 :          0 :     nKering = rPool.GetTrueWhich( SID_ATTR_CHAR_KERNING, sal_False );
    1369                 :          0 :     nLanguage = rPool.GetTrueWhich( SID_ATTR_CHAR_LANGUAGE, sal_False );
    1370                 :          0 :     nPosture = rPool.GetTrueWhich( SID_ATTR_CHAR_POSTURE, sal_False );
    1371                 :          0 :     nShadowed = rPool.GetTrueWhich( SID_ATTR_CHAR_SHADOWED, sal_False );
    1372                 :          0 :     nUnderline = rPool.GetTrueWhich( SID_ATTR_CHAR_UNDERLINE, sal_False );
    1373                 :          0 :     nOverline = rPool.GetTrueWhich( SID_ATTR_CHAR_OVERLINE, sal_False );
    1374                 :          0 :     nWeight = rPool.GetTrueWhich( SID_ATTR_CHAR_WEIGHT, sal_False );
    1375                 :          0 :     nWordlineMode = rPool.GetTrueWhich( SID_ATTR_CHAR_WORDLINEMODE, sal_False );
    1376                 :          0 :     nAutoKerning = rPool.GetTrueWhich( SID_ATTR_CHAR_AUTOKERN, sal_False );
    1377                 :            : 
    1378                 :          0 :     nCJKFont = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_FONT, sal_False );
    1379                 :          0 :     nCJKFontHeight = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_FONTHEIGHT, sal_False );
    1380                 :          0 :     nCJKLanguage = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_LANGUAGE, sal_False );
    1381                 :          0 :     nCJKPosture = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_POSTURE, sal_False );
    1382                 :          0 :     nCJKWeight = rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_WEIGHT, sal_False );
    1383                 :          0 :     nCTLFont = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_FONT, sal_False );
    1384                 :          0 :     nCTLFontHeight = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_FONTHEIGHT, sal_False );
    1385                 :          0 :     nCTLLanguage = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_LANGUAGE, sal_False );
    1386                 :          0 :     nCTLPosture = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_POSTURE, sal_False );
    1387                 :          0 :     nCTLWeight = rPool.GetTrueWhich( SID_ATTR_CHAR_CTL_WEIGHT, sal_False );
    1388                 :          0 :     nEmphasis = rPool.GetTrueWhich( SID_ATTR_CHAR_EMPHASISMARK, sal_False );
    1389                 :          0 :     nTwoLines = rPool.GetTrueWhich( SID_ATTR_CHAR_TWO_LINES, sal_False );
    1390                 :          0 :     nRuby = 0; //rPool.GetTrueWhich( SID_ATTR_CHAR_CJK_RUBY, sal_False );
    1391                 :          0 :     nCharScaleX = rPool.GetTrueWhich( SID_ATTR_CHAR_SCALEWIDTH, sal_False );
    1392                 :          0 :     nHorzVert = rPool.GetTrueWhich( SID_ATTR_CHAR_ROTATED, sal_False );
    1393                 :          0 :     nRelief = rPool.GetTrueWhich( SID_ATTR_CHAR_RELIEF, sal_False );
    1394                 :          0 :     nHidden = rPool.GetTrueWhich( SID_ATTR_CHAR_HIDDEN, sal_False );
    1395                 :          0 : }
    1396                 :            : 
    1397                 :          0 : RTFPardAttrMapIds ::RTFPardAttrMapIds ( const SfxItemPool& rPool )
    1398                 :            : {
    1399                 :          0 :     nLinespacing = rPool.GetTrueWhich( SID_ATTR_PARA_LINESPACE, sal_False );
    1400                 :          0 :     nAdjust = rPool.GetTrueWhich( SID_ATTR_PARA_ADJUST, sal_False );
    1401                 :          0 :     nTabStop = rPool.GetTrueWhich( SID_ATTR_TABSTOP, sal_False );
    1402                 :          0 :     nHyphenzone = rPool.GetTrueWhich( SID_ATTR_PARA_HYPHENZONE, sal_False );
    1403                 :          0 :     nLRSpace = rPool.GetTrueWhich( SID_ATTR_LRSPACE, sal_False );
    1404                 :          0 :     nULSpace = rPool.GetTrueWhich( SID_ATTR_ULSPACE, sal_False );
    1405                 :          0 :     nBrush = rPool.GetTrueWhich( SID_ATTR_BRUSH, sal_False );
    1406                 :          0 :     nBox = rPool.GetTrueWhich( SID_ATTR_BORDER_OUTER, sal_False );
    1407                 :          0 :     nShadow = rPool.GetTrueWhich( SID_ATTR_BORDER_SHADOW, sal_False );
    1408                 :          0 :     nOutlineLvl = rPool.GetTrueWhich( SID_ATTR_PARA_OUTLLEVEL, sal_False );
    1409                 :          0 :     nSplit = rPool.GetTrueWhich( SID_ATTR_PARA_SPLIT, sal_False );
    1410                 :          0 :     nKeep = rPool.GetTrueWhich( SID_ATTR_PARA_KEEP, sal_False );
    1411                 :          0 :     nFontAlign = rPool.GetTrueWhich( SID_PARA_VERTALIGN, sal_False );
    1412                 :          0 :     nScriptSpace = rPool.GetTrueWhich( SID_ATTR_PARA_SCRIPTSPACE, sal_False );
    1413                 :          0 :     nHangPunct = rPool.GetTrueWhich( SID_ATTR_PARA_HANGPUNCTUATION, sal_False );
    1414                 :          0 :     nForbRule = rPool.GetTrueWhich( SID_ATTR_PARA_FORBIDDEN_RULES, sal_False );
    1415                 :          0 :     nDirection = rPool.GetTrueWhich( SID_ATTR_FRAMEDIRECTION, sal_False );
    1416                 :          0 : }
    1417                 :            : 
    1418                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10