LCOV - code coverage report
Current view: top level - sw/source/core/doc - number.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 498 663 75.1 %
Date: 2014-11-03 Functions: 65 88 73.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <hintids.hxx>
      21             : 
      22             : #include <string.h>
      23             : #include <vcl/font.hxx>
      24             : #include <editeng/brushitem.hxx>
      25             : #include <editeng/lrspitem.hxx>
      26             : #include <editeng/numitem.hxx>
      27             : #include <svl/grabbagitem.hxx>
      28             : #include <fmtornt.hxx>
      29             : #include <doc.hxx>
      30             : #include <pam.hxx>
      31             : #include <charfmt.hxx>
      32             : #include <paratr.hxx>
      33             : #include <frmfmt.hxx>
      34             : #include <ndtxt.hxx>
      35             : #include <docary.hxx>
      36             : #include <docsh.hxx>
      37             : #include <SwStyleNameMapper.hxx>
      38             : 
      39             : // Needed to load default bullet list configuration
      40             : #include <unotools/configitem.hxx>
      41             : 
      42             : #include <numrule.hxx>
      43             : #include <SwNodeNum.hxx>
      44             : 
      45             : #include <boost/unordered_map.hpp>
      46             : 
      47             : #include <list.hxx>
      48             : #include <algorithm>
      49             : 
      50             : #include <unotools/saveopt.hxx>
      51             : 
      52             : #include <IDocumentListsAccess.hxx>
      53             : #include <IDocumentStylePoolAccess.hxx>
      54             : #include <IDocumentState.hxx>
      55             : 
      56             : using namespace ::com::sun::star;
      57             : 
      58             : sal_uInt16 SwNumRule::mnRefCount = 0;
      59             : SwNumFmt* SwNumRule::maBaseFmts[ RULE_END ][ MAXLEVEL ] = {
      60             :     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
      61             : 
      62             : SwNumFmt* SwNumRule::maLabelAlignmentBaseFmts[ RULE_END ][ MAXLEVEL ] = {
      63             :     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
      64             : 
      65             : const sal_uInt16 SwNumRule::maDefNumIndents[ MAXLEVEL ] = {
      66             : //inch:   0,5  1,0  1,5  2,0   2,5   3,0   3,5   4,0   4,5   5,0
      67             :         1440/4, 1440/2, 1440*3/4, 1440, 1440*5/4, 1440*3/2, 1440*7/4, 1440*2,
      68             :         1440*9/4, 1440*5/2
      69             : };
      70             : 
      71       14398 : OUString SwNumRule::GetOutlineRuleName()
      72             : {
      73       14398 :     return OUString("Outline");
      74             : }
      75             : 
      76    16142864 : const SwNumFmt& SwNumRule::Get( sal_uInt16 i ) const
      77             : {
      78             :     OSL_ASSERT( i < MAXLEVEL && meRuleType < RULE_END );
      79    16142864 :     return maFmts[ i ]
      80    10140066 :            ? *maFmts[ i ]
      81     6002798 :            : ( meDefaultNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION
      82           0 :                ? *maBaseFmts[ meRuleType ][ i ]
      83    48428592 :                : *maLabelAlignmentBaseFmts[ meRuleType ][ i ] );
      84             : }
      85             : 
      86    10684734 : const SwNumFmt* SwNumRule::GetNumFmt( sal_uInt16 i ) const
      87             : {
      88    10684734 :     const SwNumFmt * pResult = NULL;
      89             : 
      90             :     OSL_ASSERT( i < MAXLEVEL && meRuleType < RULE_END );
      91    10684734 :     if ( i < MAXLEVEL && meRuleType < RULE_END)
      92             :     {
      93    10684734 :         pResult = maFmts[ i ];
      94             :     }
      95             : 
      96    10684734 :     return pResult;
      97             : }
      98             : 
      99             : // #i91400#
     100        7846 : void SwNumRule::SetName( const OUString & rName,
     101             :                          IDocumentListsAccess& rDocListAccess)
     102             : {
     103        7846 :     if ( msName != rName )
     104             :     {
     105          30 :         if (mpNumRuleMap)
     106             :         {
     107           0 :             mpNumRuleMap->erase(msName);
     108           0 :             (*mpNumRuleMap)[rName] = this;
     109             : 
     110           0 :             if ( !GetDefaultListId().isEmpty() )
     111             :             {
     112           0 :                 rDocListAccess.trackChangeOfListStyleName( msName, rName );
     113             :             }
     114             :         }
     115             : 
     116          30 :         msName = rName;
     117             :     }
     118        7846 : }
     119             : 
     120      358520 : void SwNumRule::GetTxtNodeList( SwNumRule::tTxtNodeList& rTxtNodeList ) const
     121             : {
     122      358520 :     rTxtNodeList = maTxtNodeList;
     123      358520 : }
     124             : 
     125        1816 : SwNumRule::tTxtNodeList::size_type SwNumRule::GetTxtNodeListSize() const
     126             : {
     127        1816 :     return maTxtNodeList.size();
     128             : }
     129             : 
     130        7670 : void SwNumRule::AddTxtNode( SwTxtNode& rTxtNode )
     131             : {
     132             :     tTxtNodeList::iterator aIter =
     133        7670 :         std::find( maTxtNodeList.begin(), maTxtNodeList.end(), &rTxtNode );
     134             : 
     135        7670 :     if ( aIter == maTxtNodeList.end() )
     136             :     {
     137        7670 :         maTxtNodeList.push_back( &rTxtNode );
     138             :     }
     139        7670 : }
     140             : 
     141        7670 : void SwNumRule::RemoveTxtNode( SwTxtNode& rTxtNode )
     142             : {
     143             :     tTxtNodeList::iterator aIter =
     144        7670 :         std::find( maTxtNodeList.begin(), maTxtNodeList.end(), &rTxtNode );
     145             : 
     146        7670 :     if ( aIter != maTxtNodeList.end() )
     147             :     {
     148        7670 :         maTxtNodeList.erase( aIter );
     149             :     }
     150        7670 : }
     151             : 
     152       42684 : void SwNumRule::SetNumRuleMap(boost::unordered_map<OUString, SwNumRule *, OUStringHash> *
     153             :                               pNumRuleMap)
     154             : {
     155       42684 :     mpNumRuleMap = pNumRuleMap;
     156       42684 : }
     157             : 
     158       46780 : sal_uInt16 SwNumRule::GetNumIndent( sal_uInt8 nLvl )
     159             : {
     160             :     OSL_ENSURE( MAXLEVEL > nLvl, "NumLevel is out of range" );
     161       46780 :     return maDefNumIndents[ nLvl ];
     162             : }
     163             : 
     164          30 : sal_uInt16 SwNumRule::GetBullIndent( sal_uInt8 nLvl )
     165             : {
     166             :     OSL_ENSURE( MAXLEVEL > nLvl, "NumLevel is out of range" );
     167          30 :     return maDefNumIndents[ nLvl ];
     168             : }
     169             : 
     170       17168 : static void lcl_SetRuleChgd( SwTxtNode& rNd, sal_uInt8 nLevel )
     171             : {
     172       17168 :     if( rNd.GetActualListLevel() == nLevel )
     173        2044 :         rNd.NumRuleChgd();
     174       17168 : }
     175             : 
     176      187024 : SwNumFmt::SwNumFmt() :
     177             :     SvxNumberFormat(SVX_NUM_ARABIC),
     178             :     SwClient( 0 ),
     179      187024 :     pVertOrient(new SwFmtVertOrient( 0, text::VertOrientation::NONE))
     180      374048 :     ,cGrfBulletCP(USHRT_MAX)//For i120928,record the cp info of graphic within bullet
     181             : {
     182      187024 : }
     183             : 
     184     9810254 : SwNumFmt::SwNumFmt( const SwNumFmt& rFmt) :
     185             :     SvxNumberFormat(rFmt),
     186             :     SwClient( rFmt.GetRegisteredInNonConst() ),
     187    19620508 :     pVertOrient(new SwFmtVertOrient( 0, rFmt.GetVertOrient()))
     188    29430762 :     ,cGrfBulletCP(rFmt.cGrfBulletCP)//For i120928,record the cp info of graphic within bullet
     189             : {
     190     9810254 :     sal_Int16 eMyVertOrient = rFmt.GetVertOrient();
     191     9810254 :     SetGraphicBrush( rFmt.GetBrush(), &rFmt.GetGraphicSize(),
     192     9810254 :                                                 &eMyVertOrient);
     193     9810254 : }
     194             : 
     195     3038460 : SwNumFmt::SwNumFmt(const SvxNumberFormat& rNumFmt, SwDoc* pDoc)
     196             :     : SvxNumberFormat(rNumFmt)
     197     6076920 :     , pVertOrient(new SwFmtVertOrient( 0, rNumFmt.GetVertOrient()))
     198     9115380 :     , cGrfBulletCP(USHRT_MAX)
     199             : {
     200     3038460 :     sal_Int16 eMyVertOrient = rNumFmt.GetVertOrient();
     201     3038460 :     SetGraphicBrush( rNumFmt.GetBrush(), &rNumFmt.GetGraphicSize(),
     202     3038460 :                                                 &eMyVertOrient);
     203     3038460 :     const OUString rCharStyleName = rNumFmt.SvxNumberFormat::GetCharFmtName();
     204     3038460 :     if( !rCharStyleName.isEmpty() )
     205             :     {
     206       19626 :         SwCharFmt* pCFmt = pDoc->FindCharFmtByName( rCharStyleName );
     207       19626 :         if( !pCFmt )
     208             :         {
     209             :             sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( rCharStyleName,
     210           0 :                                             nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
     211             :             pCFmt = nId != USHRT_MAX
     212           0 :                         ? pDoc->getIDocumentStylePoolAccess().GetCharFmtFromPool( nId )
     213           0 :                         : pDoc->MakeCharFmt( rCharStyleName, 0 );
     214             :         }
     215       19626 :         pCFmt->Add( this );
     216             :     }
     217     3018834 :     else if( GetRegisteredIn() )
     218           0 :         GetRegisteredInNonConst()->Remove( this );
     219     3038460 : }
     220             : 
     221    33426954 : SwNumFmt::~SwNumFmt()
     222             : {
     223    13035278 :     delete pVertOrient;
     224    20391676 : }
     225             : 
     226           0 : void SwNumFmt::NotifyGraphicArrived()
     227             : {
     228           0 :     if( GetCharFmt() )
     229           0 :         UpdateNumNodes( (SwDoc*)GetCharFmt()->GetDoc() );
     230           0 : }
     231             : 
     232             : // #i22362#
     233        4494 : bool SwNumFmt::IsEnumeration() const
     234             : {
     235             :     // #i30655# native numbering did not work any longer
     236             :     // using this code. Therefore HBRINKM and I agreed upon defining
     237             :     // IsEnumeration() as !IsItemize()
     238        4494 :     return !IsItemize();
     239             : }
     240             : 
     241        5930 : bool SwNumFmt::IsItemize() const
     242             : {
     243             :     bool bResult;
     244             : 
     245        5930 :     switch(GetNumberingType())
     246             :     {
     247             :     case SVX_NUM_CHAR_SPECIAL:
     248             :     case SVX_NUM_BITMAP:
     249         696 :         bResult = true;
     250             : 
     251         696 :         break;
     252             : 
     253             :     default:
     254        5234 :         bResult = false;
     255             :     }
     256             : 
     257        5930 :     return bResult;
     258             : 
     259             : }
     260             : 
     261       20440 : SwNumFmt& SwNumFmt::operator=( const SwNumFmt& rNumFmt)
     262             : {
     263       20440 :     SvxNumberFormat::operator=(rNumFmt);
     264       20440 :     if( rNumFmt.GetRegisteredIn() )
     265       20406 :         rNumFmt.GetRegisteredInNonConst()->Add( this );
     266          34 :     else if( GetRegisteredIn() )
     267           0 :         GetRegisteredInNonConst()->Remove( this );
     268             :     //For i120928,record the cp info of graphic within bullet
     269       20440 :     cGrfBulletCP = rNumFmt.cGrfBulletCP;
     270       20440 :     return *this;
     271             : }
     272             : 
     273     7483188 : bool SwNumFmt::operator==( const SwNumFmt& rNumFmt) const
     274             : {
     275    14586314 :     bool bRet = SvxNumberFormat::operator==(rNumFmt) &&
     276    14586314 :         GetRegisteredIn() == rNumFmt.GetRegisteredIn();
     277     7483188 :     return bRet;
     278             : }
     279             : 
     280       29668 : void SwNumFmt::SetCharFmt( SwCharFmt* pChFmt)
     281             : {
     282       29668 :     if( pChFmt )
     283       25658 :         pChFmt->Add( this );
     284        4010 :     else if( GetRegisteredIn() )
     285           0 :         GetRegisteredInNonConst()->Remove( this );
     286       29668 : }
     287             : 
     288       56040 : void SwNumFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
     289             : {
     290             :     // Look for the NumRules object in the Doc where this NumFormat is set.
     291             :     // The format does not need to exist!
     292       56040 :     const SwCharFmt* pFmt = 0;
     293       56040 :     sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
     294       56040 :     switch( nWhich )
     295             :     {
     296             :     case RES_ATTRSET_CHG:
     297             :     case RES_FMT_CHG:
     298       56040 :         pFmt = GetCharFmt();
     299       56040 :         break;
     300             :     }
     301             : 
     302       56040 :     if( pFmt && !pFmt->GetDoc()->IsInDtor() )
     303       30358 :         UpdateNumNodes( (SwDoc*)pFmt->GetDoc() );
     304             :     else
     305       25682 :         CheckRegistration( pOld, pNew );
     306       56040 : }
     307             : 
     308       19846 : void SwNumFmt::SetCharFmtName(const OUString& rSet)
     309             : {
     310       19846 :     SvxNumberFormat::SetCharFmtName(rSet);
     311       19846 : }
     312             : 
     313           0 : OUString SwNumFmt::GetCharFmtName() const
     314             : {
     315           0 :     if((SwCharFmt*)GetRegisteredIn())
     316           0 :         return ((SwCharFmt*)GetRegisteredIn())->GetName();
     317             : 
     318           0 :     return OUString();
     319             : }
     320             : 
     321    12848792 : void    SwNumFmt::SetGraphicBrush( const SvxBrushItem* pBrushItem, const Size* pSize,
     322             :     const sal_Int16* pOrient)
     323             : {
     324    12848792 :     if(pOrient)
     325    12848714 :         pVertOrient->SetVertOrient( *pOrient );
     326    12848792 :     SvxNumberFormat::SetGraphicBrush( pBrushItem, pSize, pOrient);
     327    12848792 : }
     328             : 
     329           0 : void    SwNumFmt::SetVertOrient(sal_Int16 eSet)
     330             : {
     331           0 :     SvxNumberFormat::SetVertOrient(eSet);
     332           0 : }
     333             : 
     334    19620508 : sal_Int16   SwNumFmt::GetVertOrient() const
     335             : {
     336    19620508 :     return SvxNumberFormat::GetVertOrient();
     337             : }
     338             : 
     339       30358 : void SwNumFmt::UpdateNumNodes( SwDoc* pDoc )
     340             : {
     341       30358 :     bool bDocIsModified = pDoc->getIDocumentState().IsModified();
     342       30358 :     bool bFnd = false;
     343             :     const SwNumRule* pRule;
     344      831146 :     for( sal_uInt16 n = pDoc->GetNumRuleTbl().size(); !bFnd && n; )
     345             :     {
     346      770430 :         pRule = pDoc->GetNumRuleTbl()[ --n ];
     347     8298482 :         for( sal_uInt8 i = 0; i < MAXLEVEL; ++i )
     348     7556002 :             if( pRule->GetNumFmt( i ) == this )
     349             :             {
     350       27950 :                 SwNumRule::tTxtNodeList aTxtNodeList;
     351       27950 :                 pRule->GetTxtNodeList( aTxtNodeList );
     352      135354 :                 for ( SwNumRule::tTxtNodeList::iterator aIter = aTxtNodeList.begin();
     353       90236 :                       aIter != aTxtNodeList.end(); ++aIter )
     354             :                 {
     355       17168 :                     lcl_SetRuleChgd( *(*aIter), i );
     356             :                 }
     357       27950 :                 bFnd = true;
     358       27950 :                 break;
     359             :             }
     360             :     }
     361             : 
     362       30358 :     if( bFnd && !bDocIsModified )
     363           0 :         pDoc->getIDocumentState().ResetModified();
     364       30358 : }
     365             : 
     366         646 : const SwFmtVertOrient*      SwNumFmt::GetGraphicOrientation() const
     367             : {
     368         646 :     sal_Int16  eOrient = SvxNumberFormat::GetVertOrient();
     369         646 :     if(text::VertOrientation::NONE == eOrient)
     370         646 :         return 0;
     371             :     else
     372             :     {
     373           0 :         pVertOrient->SetVertOrient(eOrient);
     374           0 :         return pVertOrient;
     375             :     }
     376             : }
     377             : 
     378       42660 : SwNumRule::SwNumRule( const OUString& rNm,
     379             :                       const SvxNumberFormat::SvxNumPositionAndSpaceMode eDefaultNumberFormatPositionAndSpaceMode,
     380             :                       SwNumRuleType eType,
     381             :                       bool bAutoFlg )
     382             :   : maTxtNodeList(),
     383             :     maParagraphStyleList(),
     384             :     mpNumRuleMap(0),
     385             :     msName( rNm ),
     386             :     meRuleType( eType ),
     387             :     mnPoolFmtId( USHRT_MAX ),
     388             :     mnPoolHelpId( USHRT_MAX ),
     389             :     mnPoolHlpFileId( UCHAR_MAX ),
     390             :     mbAutoRuleFlag( bAutoFlg ),
     391             :     mbInvalidRuleFlag( true ),
     392             :     mbContinusNum( false ),
     393             :     mbAbsSpaces( false ),
     394             :     mbHidden( false ),
     395             :     mbCountPhantoms( true ),
     396             :     meDefaultNumberFormatPositionAndSpaceMode( eDefaultNumberFormatPositionAndSpaceMode ),
     397       42660 :     msDefaultListId()
     398             : {
     399       42660 :     if( !mnRefCount++ )          // for the first time, initialize
     400             :     {
     401             :         SwNumFmt* pFmt;
     402             :         sal_uInt8 n;
     403             : 
     404             :         // numbering:
     405             :         // position-and-space mode LABEL_WIDTH_AND_POSITION:
     406       51425 :         for( n = 0; n < MAXLEVEL; ++n )
     407             :         {
     408       46750 :             pFmt = new SwNumFmt;
     409       46750 :             pFmt->SetIncludeUpperLevels( 1 );
     410       46750 :             pFmt->SetStart( 1 );
     411       46750 :             pFmt->SetLSpace( lNumIndent );
     412       46750 :             pFmt->SetAbsLSpace( lNumIndent + SwNumRule::GetNumIndent( n ) );
     413       46750 :             pFmt->SetFirstLineOffset( lNumFirstLineOffset );
     414       46750 :             pFmt->SetSuffix( "." );
     415       46750 :             pFmt->SetBulletChar( numfunc::GetBulletChar(n));
     416       46750 :             SwNumRule::maBaseFmts[ NUM_RULE ][ n ] = pFmt;
     417             :         }
     418             :         // position-and-space mode LABEL_ALIGNMENT
     419             :         // first line indent of general numbering in inch: -0,25 inch
     420        4675 :         const long cFirstLineIndent = -1440/4;
     421             :         // indent values of general numbering in inch:
     422             :         //  0,5         0,75        1,0         1,25        1,5
     423             :         //  1,75        2,0         2,25        2,5         2,75
     424             :         const long cIndentAt[ MAXLEVEL ] = {
     425             :             1440/2,     1440*3/4,   1440,       1440*5/4,   1440*3/2,
     426        4675 :             1440*7/4,   1440*2,     1440*9/4,   1440*5/2,   1440*11/4 };
     427       51425 :         for( n = 0; n < MAXLEVEL; ++n )
     428             :         {
     429       46750 :             pFmt = new SwNumFmt;
     430       46750 :             pFmt->SetIncludeUpperLevels( 1 );
     431       46750 :             pFmt->SetStart( 1 );
     432       46750 :             pFmt->SetPositionAndSpaceMode( SvxNumberFormat::LABEL_ALIGNMENT );
     433       46750 :             pFmt->SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
     434       46750 :             pFmt->SetListtabPos( cIndentAt[ n ] );
     435       46750 :             pFmt->SetFirstLineIndent( cFirstLineIndent );
     436       46750 :             pFmt->SetIndentAt( cIndentAt[ n ] );
     437       46750 :             pFmt->SetSuffix( "." );
     438       46750 :             pFmt->SetBulletChar( numfunc::GetBulletChar(n));
     439       46750 :             SwNumRule::maLabelAlignmentBaseFmts[ NUM_RULE ][ n ] = pFmt;
     440             :         }
     441             : 
     442             :         // outline:
     443             :         // position-and-space mode LABEL_WIDTH_AND_POSITION:
     444       51425 :         for( n = 0; n < MAXLEVEL; ++n )
     445             :         {
     446       46750 :             pFmt = new SwNumFmt;
     447       46750 :             pFmt->SetNumberingType(SVX_NUM_NUMBER_NONE);
     448       46750 :             pFmt->SetIncludeUpperLevels( MAXLEVEL );
     449       46750 :             pFmt->SetStart( 1 );
     450       46750 :             pFmt->SetCharTextDistance( lOutlineMinTextDistance );
     451       46750 :             pFmt->SetBulletChar( numfunc::GetBulletChar(n));
     452       46750 :             SwNumRule::maBaseFmts[ OUTLINE_RULE ][ n ] = pFmt;
     453             :         }
     454             :         // position-and-space mode LABEL_ALIGNMENT:
     455             :         // indent values of default outline numbering in inch:
     456             :         //  0,3         0,4         0,5         0,6         0,7
     457             :         //  0,8         0,9         1,0         1,1         1,2
     458             :         const long cOutlineIndentAt[ MAXLEVEL ] = {
     459             :             1440*3/10,  1440*2/5,   1440/2,     1440*3/5,   1440*7/10,
     460        4675 :             1440*4/5,   1440*9/10,  1440,       1440*11/10, 1440*6/5 };
     461       51425 :         for( n = 0; n < MAXLEVEL; ++n )
     462             :         {
     463       46750 :             pFmt = new SwNumFmt;
     464       46750 :             pFmt->SetNumberingType(SVX_NUM_NUMBER_NONE);
     465       46750 :             pFmt->SetIncludeUpperLevels( MAXLEVEL );
     466       46750 :             pFmt->SetStart( 1 );
     467       46750 :             pFmt->SetPositionAndSpaceMode( SvxNumberFormat::LABEL_ALIGNMENT );
     468       46750 :             pFmt->SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
     469       46750 :             pFmt->SetListtabPos( cOutlineIndentAt[ n ] );
     470       46750 :             pFmt->SetFirstLineIndent( -cOutlineIndentAt[ n ] );
     471       46750 :             pFmt->SetIndentAt( cOutlineIndentAt[ n ] );
     472       46750 :             pFmt->SetBulletChar( numfunc::GetBulletChar(n));
     473       46750 :             SwNumRule::maLabelAlignmentBaseFmts[ OUTLINE_RULE ][ n ] = pFmt;
     474             :         }
     475             :     }
     476       42660 :     memset( maFmts, 0, sizeof( maFmts ));
     477             :     OSL_ENSURE( !msName.isEmpty(), "NumRule without a name!" );
     478       42660 : }
     479             : 
     480      627664 : SwNumRule::SwNumRule( const SwNumRule& rNumRule )
     481             :     : maTxtNodeList(),
     482             :       maParagraphStyleList(),
     483             :       mpNumRuleMap(0),
     484             :       msName( rNumRule.msName ),
     485             :       meRuleType( rNumRule.meRuleType ),
     486      627664 :       mnPoolFmtId( rNumRule.GetPoolFmtId() ),
     487      627664 :       mnPoolHelpId( rNumRule.GetPoolHelpId() ),
     488      627664 :       mnPoolHlpFileId( rNumRule.GetPoolHlpFileId() ),
     489             :       mbAutoRuleFlag( rNumRule.mbAutoRuleFlag ),
     490             :       mbInvalidRuleFlag( true ),
     491             :       mbContinusNum( rNumRule.mbContinusNum ),
     492             :       mbAbsSpaces( rNumRule.mbAbsSpaces ),
     493             :       mbHidden( rNumRule.mbHidden ),
     494             :       mbCountPhantoms( true ),
     495             :       meDefaultNumberFormatPositionAndSpaceMode( rNumRule.meDefaultNumberFormatPositionAndSpaceMode ),
     496     2510656 :       msDefaultListId( rNumRule.msDefaultListId )
     497             : {
     498      627664 :     ++mnRefCount;
     499      627664 :     memset( maFmts, 0, sizeof( maFmts ));
     500     6904304 :     for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
     501     6276640 :         if( rNumRule.maFmts[ n ] )
     502     3432840 :             Set( n, *rNumRule.maFmts[ n ] );
     503      627664 : }
     504             : 
     505     1340622 : SwNumRule::~SwNumRule()
     506             : {
     507     7373421 :     for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
     508     6703110 :         delete maFmts[ n ];
     509             : 
     510      670311 :     if (mpNumRuleMap)
     511             :     {
     512       42677 :         mpNumRuleMap->erase(GetName());
     513             :     }
     514             : 
     515      670311 :     if( !--mnRefCount )          // the last one closes the door (?)
     516             :     {
     517             :             // Numbering:
     518        4666 :             SwNumFmt** ppFmts = (SwNumFmt**)SwNumRule::maBaseFmts;
     519             :             int n;
     520             : 
     521       51326 :             for( n = 0; n < MAXLEVEL; ++n, ++ppFmts )
     522       46660 :                 delete *ppFmts, *ppFmts = 0;
     523             : 
     524             :             // Outline:
     525       51326 :             for( n = 0; n < MAXLEVEL; ++n, ++ppFmts )
     526       46660 :                 delete *ppFmts, *ppFmts = 0;
     527             : 
     528        4666 :             ppFmts = (SwNumFmt**)SwNumRule::maLabelAlignmentBaseFmts;
     529       51326 :             for( n = 0; n < MAXLEVEL; ++n, ++ppFmts )
     530       46660 :                 delete *ppFmts, *ppFmts = 0;
     531       51326 :             for( n = 0; n < MAXLEVEL; ++n, ++ppFmts )
     532       46660 :                 delete *ppFmts, *ppFmts = 0;
     533             :     }
     534             : 
     535      670311 :     maTxtNodeList.clear();
     536      670311 :     maParagraphStyleList.clear();
     537      670311 : }
     538             : 
     539      588634 : void SwNumRule::CheckCharFmts( SwDoc* pDoc )
     540             : {
     541             :     SwCharFmt* pFmt;
     542     6474974 :     for( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
     543     5927852 :         if( maFmts[ n ] && 0 != ( pFmt = maFmts[ n ]->GetCharFmt() ) &&
     544       41512 :             pFmt->GetDoc() != pDoc )
     545             :         {
     546             :             // copy
     547           0 :             SwNumFmt* pNew = new SwNumFmt( *maFmts[ n ] );
     548           0 :             pNew->SetCharFmt( pDoc->CopyCharFmt( *pFmt ) );
     549           0 :             delete maFmts[ n ];
     550           0 :             maFmts[ n ] = pNew;
     551             :         }
     552      588634 : }
     553             : 
     554        7838 : SwNumRule& SwNumRule::operator=( const SwNumRule& rNumRule )
     555             : {
     556        7838 :     if( this != &rNumRule )
     557             :     {
     558       86218 :         for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
     559       78380 :             Set( n, rNumRule.maFmts[ n ] );
     560             : 
     561        7838 :         meRuleType = rNumRule.meRuleType;
     562        7838 :         msName = rNumRule.msName;
     563        7838 :         mbAutoRuleFlag = rNumRule.mbAutoRuleFlag;
     564        7838 :         mbInvalidRuleFlag = true;
     565        7838 :         mbContinusNum = rNumRule.mbContinusNum;
     566        7838 :         mbAbsSpaces = rNumRule.mbAbsSpaces;
     567        7838 :         mbHidden = rNumRule.mbHidden;
     568        7838 :         mnPoolFmtId = rNumRule.GetPoolFmtId();
     569        7838 :         mnPoolHelpId = rNumRule.GetPoolHelpId();
     570        7838 :         mnPoolHlpFileId = rNumRule.GetPoolHlpFileId();
     571             :     }
     572        7838 :     return *this;
     573             : }
     574             : 
     575        2610 : bool SwNumRule::operator==( const SwNumRule& rRule ) const
     576             : {
     577        5220 :     bool bRet = meRuleType == rRule.meRuleType &&
     578        5220 :                 msName == rRule.msName &&
     579        5220 :                 mbAutoRuleFlag == rRule.mbAutoRuleFlag &&
     580        5220 :                 mbContinusNum == rRule.mbContinusNum &&
     581        5220 :                 mbAbsSpaces == rRule.mbAbsSpaces &&
     582        5220 :                 mnPoolFmtId == rRule.GetPoolFmtId() &&
     583        7830 :                 mnPoolHelpId == rRule.GetPoolHelpId() &&
     584        5220 :                 mnPoolHlpFileId == rRule.GetPoolHlpFileId();
     585        2610 :     if( bRet )
     586             :     {
     587       26854 :         for( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
     588       24444 :             if( !( rRule.Get( n ) == Get( n ) ))
     589             :             {
     590         200 :                 bRet = false;
     591         200 :                 break;
     592             :             }
     593             :     }
     594        2610 :     return bRet;
     595             : }
     596             : 
     597     3815658 : void SwNumRule::Set( sal_uInt16 i, const SwNumFmt& rNumFmt )
     598             : {
     599             :     OSL_ENSURE( i < MAXLEVEL, "Serious defect, please inform OD" );
     600     3815658 :     if( i < MAXLEVEL )
     601             :     {
     602     3815658 :         if( !maFmts[ i ] || !(rNumFmt == Get( i )) )
     603             :         {
     604     3789864 :             delete maFmts[ i ];
     605     3789864 :             maFmts[ i ] = new SwNumFmt( rNumFmt );
     606     3789864 :             mbInvalidRuleFlag = true;
     607             :         }
     608             :     }
     609     3815658 : }
     610             : 
     611     1978662 : void SwNumRule::Set( sal_uInt16 i, const SwNumFmt* pNumFmt )
     612             : {
     613             :     OSL_ENSURE( i < MAXLEVEL, "Serious defect, please inform OD" );
     614     1978662 :     if( i >= MAXLEVEL )
     615     1978662 :         return;
     616     1978662 :     SwNumFmt* pOld = maFmts[ i ];
     617     1978662 :     if( !pOld )
     618             :     {
     619      359708 :         if( pNumFmt )
     620             :         {
     621      341534 :             maFmts[ i ] = new SwNumFmt( *pNumFmt );
     622      341534 :             mbInvalidRuleFlag = true;
     623             :         }
     624             :     }
     625     1618954 :     else if( !pNumFmt )
     626           0 :         delete pOld, maFmts[ i ] = 0, mbInvalidRuleFlag = true;
     627     1618954 :     else if( *pOld != *pNumFmt )
     628       20440 :         *pOld = *pNumFmt, mbInvalidRuleFlag = true;
     629             : }
     630             : 
     631         294 : OUString SwNumRule::MakeNumString( const SwNodeNum& rNum, bool bInclStrings,
     632             :                                 bool bOnlyArabic ) const
     633             : {
     634         294 :     if (rNum.IsCounted())
     635             :         return MakeNumString(rNum.GetNumberVector(),
     636         294 :                              bInclStrings, bOnlyArabic, MAXLEVEL);
     637             : 
     638           0 :     return OUString();
     639             : }
     640             : 
     641        7050 : OUString SwNumRule::MakeNumString( const SwNumberTree::tNumberVector & rNumVector,
     642             :                                  const bool bInclStrings,
     643             :                                  const bool bOnlyArabic,
     644             :                                  const unsigned int _nRestrictToThisLevel,
     645             :                                  SwNumRule::Extremities* pExtremities ) const
     646             : {
     647        7050 :     OUString aStr;
     648             : 
     649        7050 :     unsigned int nLevel = rNumVector.size() - 1;
     650             : 
     651        7050 :     if ( pExtremities )
     652        1744 :         pExtremities->nPrefixChars = pExtremities->nSuffixChars = 0;
     653             : 
     654        7050 :     if ( nLevel > _nRestrictToThisLevel )
     655             :     {
     656         676 :         nLevel = _nRestrictToThisLevel;
     657             :     }
     658             : 
     659        7050 :     if (nLevel < MAXLEVEL)
     660             :     {
     661        7050 :         const SwNumFmt& rMyNFmt = Get( static_cast<sal_uInt16>(nLevel) );
     662             : 
     663             :         {
     664        7050 :             sal_uInt8 i = static_cast<sal_uInt8>(nLevel);
     665             : 
     666       21146 :             if( !IsContinusNum() &&
     667             :                 // - do not include upper levels, if level isn't numbered.
     668       13678 :                 rMyNFmt.GetNumberingType() != SVX_NUM_NUMBER_NONE &&
     669        6628 :                 rMyNFmt.GetIncludeUpperLevels() )  // Just the own level?
     670             :             {
     671        6628 :                 sal_uInt8 n = rMyNFmt.GetIncludeUpperLevels();
     672        6628 :                 if( 1 < n )
     673             :                 {
     674         452 :                     if( i+1 >= n )
     675         452 :                         i -= n - 1;
     676             :                     else
     677           0 :                         i = 0;
     678             :                 }
     679             :             }
     680             : 
     681       15054 :             for( ; i <= nLevel; ++i )
     682             :             {
     683        8004 :                 const SwNumFmt& rNFmt = Get( i );
     684        8004 :                 if( SVX_NUM_NUMBER_NONE == rNFmt.GetNumberingType() )
     685             :                 {
     686             :                     // Should 1.1.1 --> 2. NoNum --> 1..1 or 1.1 ??
     687             :                     //                 if( i != rNum.nMyLevel )
     688             :                     //                    aStr += ".";
     689         464 :                     continue;
     690             :                 }
     691             : 
     692        7540 :                 if( rNumVector[ i ] )
     693             :                 {
     694        7290 :                     if( bOnlyArabic )
     695        1086 :                         aStr += OUString::number( rNumVector[ i ] );
     696             :                     else
     697        6204 :                         aStr += rNFmt.GetNumStr( rNumVector[ i ] );
     698             :                 }
     699             :                 else
     700         250 :                     aStr += "0";        // all 0 level are a 0
     701        7540 :                 if( i != nLevel && !aStr.isEmpty() )
     702         908 :                     aStr += ".";
     703             :             }
     704             : 
     705             :             // The type doesn't have any number, so don't append
     706             :             // the post-/prefix string
     707       19646 :             if( bInclStrings && !bOnlyArabic &&
     708       19646 :                 SVX_NUM_CHAR_SPECIAL != rMyNFmt.GetNumberingType() &&
     709        6298 :                 SVX_NUM_BITMAP != rMyNFmt.GetNumberingType() )
     710             :             {
     711        6298 :                 const OUString sPrefix = rMyNFmt.GetPrefix();
     712       12596 :                 const OUString sSuffix = rMyNFmt.GetSuffix();
     713             : 
     714        6298 :                 aStr = sPrefix + aStr + sSuffix;
     715        6298 :                 if ( pExtremities )
     716             :                 {
     717        1744 :                     pExtremities->nPrefixChars = sPrefix.getLength();
     718        1744 :                     pExtremities->nSuffixChars = sSuffix.getLength();
     719        6298 :                 }
     720             :             }
     721             :         }
     722             :     }
     723             : 
     724        7050 :     return aStr;
     725             : }
     726             : 
     727         914 : OUString SwNumRule::MakeRefNumString( const SwNodeNum& rNodeNum,
     728             :                                     const bool bInclSuperiorNumLabels,
     729             :                                     const sal_uInt8 nRestrictInclToThisLevel ) const
     730             : {
     731         914 :     OUString aRefNumStr;
     732             : 
     733         914 :     if ( rNodeNum.GetLevelInListTree() >= 0 )
     734             :     {
     735         914 :         bool bOldHadPrefix = true;
     736             : 
     737         914 :         const SwNodeNum* pWorkingNodeNum( &rNodeNum );
     738        1048 :         do
     739             :         {
     740        1940 :             bool bMakeNumStringForPhantom( false );
     741        1940 :             if ( pWorkingNodeNum->IsPhantom() )
     742             :             {
     743           0 :                 int nListLevel = pWorkingNodeNum->GetLevelInListTree();
     744             : 
     745           0 :                 if (nListLevel < 0)
     746           0 :                     nListLevel = 0;
     747             : 
     748           0 :                 if (nListLevel >= MAXLEVEL)
     749           0 :                     nListLevel = MAXLEVEL - 1;
     750             : 
     751           0 :                 SwNumFmt aFmt( Get( static_cast<sal_uInt16>(nListLevel) ) );
     752           0 :                 bMakeNumStringForPhantom = aFmt.IsEnumeration() &&
     753           0 :                                            SVX_NUM_NUMBER_NONE != aFmt.GetNumberingType();
     754             : 
     755             :             }
     756        5624 :             if ( bMakeNumStringForPhantom ||
     757        3880 :                  ( !pWorkingNodeNum->IsPhantom() &&
     758        3880 :                    pWorkingNodeNum->GetTxtNode() &&
     759        1940 :                    pWorkingNodeNum->GetTxtNode()->HasNumber() ) )
     760             :             {
     761             :                 Extremities aExtremities;
     762             :                 OUString aPrevStr = MakeNumString( pWorkingNodeNum->GetNumberVector(),
     763             :                                                  true, false, MAXLEVEL,
     764        1744 :                                                  &aExtremities);
     765        1744 :                 sal_Int32 nStrip = 0;
     766        3868 :                 while ( nStrip < aExtremities.nPrefixChars )
     767             :                 {
     768        1338 :                     const sal_Unicode c = aPrevStr[nStrip];
     769        1338 :                     if ( c!='\t' && c!=' ')
     770         958 :                         break;
     771         380 :                     ++nStrip;
     772             :                 }
     773             : 
     774        1744 :                 if (nStrip)
     775             :                 {
     776         380 :                     aPrevStr = aPrevStr.copy( nStrip );
     777         380 :                     aExtremities.nPrefixChars -= nStrip;
     778             :                 }
     779             : 
     780        1744 :                 if (bOldHadPrefix &&
     781        1566 :                      aExtremities.nSuffixChars &&
     782        1566 :                      !aExtremities.nPrefixChars
     783             :                    )
     784             :                 {
     785        1216 :                     aPrevStr = aPrevStr.copy(0,
     786        1216 :                         aPrevStr.getLength() - aExtremities.nSuffixChars);
     787             :                 }
     788             : 
     789        1744 :                 bOldHadPrefix = ( aExtremities.nPrefixChars >  0);
     790             : 
     791        1744 :                 aRefNumStr = aPrevStr + aRefNumStr;
     792             :             }
     793             : 
     794        1940 :             if ( bInclSuperiorNumLabels && pWorkingNodeNum->GetLevelInListTree() > 0 )
     795             :             {
     796        1048 :                 sal_uInt8 n = Get( static_cast<sal_uInt16>(pWorkingNodeNum->GetLevelInListTree()) ).GetIncludeUpperLevels();
     797        1048 :                 pWorkingNodeNum = dynamic_cast<SwNodeNum*>(pWorkingNodeNum->GetParent());
     798             :                 // skip parents, whose list label is already contained in the actual list label.
     799        2096 :                 while ( pWorkingNodeNum && n > 1 )
     800             :                 {
     801           0 :                     pWorkingNodeNum = dynamic_cast<SwNodeNum*>(pWorkingNodeNum->GetParent());
     802           0 :                     --n;
     803             :                 }
     804             :             }
     805             :             else
     806             :             {
     807         892 :                 break;
     808             :             }
     809        1048 :         } while ( pWorkingNodeNum &&
     810        2096 :                   pWorkingNodeNum->GetLevelInListTree() >= 0 &&
     811        1048 :                   static_cast<sal_uInt8>(pWorkingNodeNum->GetLevelInListTree()) >= nRestrictInclToThisLevel );
     812             :     }
     813             : 
     814         914 :     return aRefNumStr;
     815             : }
     816             : 
     817             : /** Copy method of SwNumRule
     818             : 
     819             :     A kind of copy constructor, so that the num formats are attached to the
     820             :     right CharFormats of a Document.
     821             :     Copies the NumFormats and returns itself. */
     822          40 : SwNumRule& SwNumRule::CopyNumRule( SwDoc* pDoc, const SwNumRule& rNumRule )
     823             : {
     824         440 :     for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
     825             :     {
     826         400 :         Set( n, rNumRule.maFmts[ n ] );
     827         400 :         if( maFmts[ n ] && maFmts[ n ]->GetCharFmt() &&
     828           0 :             !pDoc->GetCharFmts()->Contains( maFmts[n]->GetCharFmt() ))
     829             :             // If we copy across different Documents, then copy the
     830             :             // corresponding CharFormat into the new Document.
     831           0 :             maFmts[n]->SetCharFmt( pDoc->CopyCharFmt( *maFmts[n]->
     832           0 :                                         GetCharFmt() ) );
     833             :     }
     834          40 :     meRuleType = rNumRule.meRuleType;
     835          40 :     msName = rNumRule.msName;
     836          40 :     mbAutoRuleFlag = rNumRule.mbAutoRuleFlag;
     837          40 :     mnPoolFmtId = rNumRule.GetPoolFmtId();
     838          40 :     mnPoolHelpId = rNumRule.GetPoolHelpId();
     839          40 :     mnPoolHlpFileId = rNumRule.GetPoolHlpFileId();
     840          40 :     mbInvalidRuleFlag = true;
     841          40 :     return *this;
     842             : }
     843             : 
     844      303846 : void SwNumRule::SetSvxRule(const SvxNumRule& rNumRule, SwDoc* pDoc)
     845             : {
     846     3342306 :     for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
     847             :     {
     848     3038460 :         const SvxNumberFormat* pSvxFmt = rNumRule.Get(n);
     849     3038460 :         delete maFmts[n];
     850     3038460 :         maFmts[n] = pSvxFmt ? new SwNumFmt(*pSvxFmt, pDoc) : 0;
     851             :     }
     852             : 
     853      303846 :     mbInvalidRuleFlag = true;
     854      303846 :     mbContinusNum = rNumRule.IsContinuousNumbering();
     855      303846 : }
     856             : 
     857      330952 : SvxNumRule SwNumRule::MakeSvxNumRule() const
     858             : {
     859             :     SvxNumRule aRule(NUM_CONTINUOUS|NUM_CHAR_TEXT_DISTANCE|NUM_CHAR_STYLE|
     860             :                         NUM_ENABLE_LINKED_BMP|NUM_ENABLE_EMBEDDED_BMP,
     861             :                         MAXLEVEL, mbContinusNum,
     862             :                         meRuleType ==
     863             :                             NUM_RULE ?
     864             :                                 SVX_RULETYPE_NUMBERING :
     865      330952 :                                     SVX_RULETYPE_OUTLINE_NUMBERING );
     866     3640472 :     for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
     867             :     {
     868     3309520 :         SwNumFmt aNumFmt = Get(n);
     869     3309520 :         if(aNumFmt.GetCharFmt())
     870       19846 :             aNumFmt.SetCharFmtName(aNumFmt.GetCharFmt()->GetName());
     871     3309520 :         aRule.SetLevel(n, aNumFmt, maFmts[n] != 0);
     872     3309520 :     }
     873      330952 :     return aRule;
     874             : }
     875             : 
     876      588886 : void SwNumRule::SetInvalidRule(bool bFlag)
     877             : {
     878      588886 :     if (bFlag)
     879             :     {
     880      291584 :         std::set< SwList* > aLists;
     881      291584 :         tTxtNodeList::iterator aIter;
     882      293662 :         for ( aIter = maTxtNodeList.begin(); aIter != maTxtNodeList.end(); ++aIter )
     883             :         {
     884        2078 :             const SwTxtNode* pTxtNode = *aIter;
     885             :             // #i111681# - applying patch from cmc
     886        2078 :             SwList* pList = pTxtNode->GetDoc()->getIDocumentListsAccess().getListByName( pTxtNode->GetListId() );
     887             :             OSL_ENSURE( pList, "<SwNumRule::SetInvalidRule(..)> - list at which the text node is registered at does not exist. This is a serious issue --> please inform OD.");
     888        2078 :             if ( pList )
     889             :             {
     890        2078 :                 aLists.insert( pList );
     891             :             }
     892             :         }
     893             :         std::for_each( aLists.begin(), aLists.end(),
     894      291584 :                        std::mem_fun( &SwList::InvalidateListTree ) );
     895             :     }
     896             : 
     897      588886 :     mbInvalidRuleFlag = bFlag;
     898      588886 : }
     899             : 
     900             : /// change indent of all list levels by given difference
     901           0 : void SwNumRule::ChangeIndent( const short nDiff )
     902             : {
     903           0 :     for ( sal_uInt16 i = 0; i < MAXLEVEL; ++i )
     904             :     {
     905           0 :         SwNumFmt aTmpNumFmt( Get(i) );
     906             : 
     907             :         const SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode(
     908           0 :                                         aTmpNumFmt.GetPositionAndSpaceMode() );
     909           0 :         if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
     910             :         {
     911             :             short nNewIndent = nDiff +
     912           0 :                                aTmpNumFmt.GetAbsLSpace();
     913           0 :             if ( nNewIndent < 0 )
     914             :             {
     915           0 :                 nNewIndent = 0;
     916             :             }
     917           0 :             aTmpNumFmt.SetAbsLSpace( nNewIndent );
     918             :         }
     919           0 :         else if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
     920             :         {
     921             :             // adjust also the list tab position, if a list tab stop is applied
     922           0 :             if ( aTmpNumFmt.GetLabelFollowedBy() == SvxNumberFormat::LISTTAB )
     923             :             {
     924           0 :                 const long nNewListTab = aTmpNumFmt.GetListtabPos() +  nDiff;
     925           0 :                 aTmpNumFmt.SetListtabPos( nNewListTab );
     926             :             }
     927             : 
     928           0 :             const long nNewIndent = nDiff +
     929           0 :                               aTmpNumFmt.GetIndentAt();
     930           0 :             aTmpNumFmt.SetIndentAt( nNewIndent );
     931             :         }
     932             : 
     933           0 :         Set( i, aTmpNumFmt );
     934           0 :     }
     935             : 
     936           0 :     SetInvalidRule( true );
     937           0 : }
     938             : 
     939             : /// set indent of certain list level to given value
     940           0 : void SwNumRule::SetIndent( const short nNewIndent,
     941             :                            const sal_uInt16 nListLevel )
     942             : {
     943           0 :     SwNumFmt aTmpNumFmt( Get(nListLevel) );
     944             : 
     945             :     const SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode(
     946           0 :                                         aTmpNumFmt.GetPositionAndSpaceMode() );
     947           0 :     if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
     948             :     {
     949           0 :         aTmpNumFmt.SetAbsLSpace( nNewIndent );
     950             :     }
     951           0 :     else if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
     952             :     {
     953             :         // adjust also the list tab position, if a list tab stop is applied
     954           0 :         if ( aTmpNumFmt.GetLabelFollowedBy() == SvxNumberFormat::LISTTAB )
     955             :         {
     956           0 :             const long nNewListTab = aTmpNumFmt.GetListtabPos() +
     957           0 :                                      ( nNewIndent - aTmpNumFmt.GetIndentAt() );
     958           0 :             aTmpNumFmt.SetListtabPos( nNewListTab );
     959             :         }
     960             : 
     961           0 :         aTmpNumFmt.SetIndentAt( nNewIndent );
     962             :     }
     963             : 
     964           0 :     SetInvalidRule( true );
     965           0 : }
     966             : 
     967             : /// set indent of first list level to given value and change other list level's
     968             : /// indents accordingly
     969           0 : void SwNumRule::SetIndentOfFirstListLevelAndChangeOthers( const short nNewIndent )
     970             : {
     971           0 :     SwNumFmt aTmpNumFmt( Get(0) );
     972             : 
     973           0 :     short nDiff( 0 );
     974             :     const SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode(
     975           0 :                                         aTmpNumFmt.GetPositionAndSpaceMode() );
     976           0 :     if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
     977             :     {
     978             :         nDiff = nNewIndent
     979           0 :                 - aTmpNumFmt.GetFirstLineOffset()
     980           0 :                 - aTmpNumFmt.GetAbsLSpace();
     981             :     }
     982           0 :     else if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
     983             :     {
     984             :         nDiff = static_cast<short>(nNewIndent
     985           0 :                                    - aTmpNumFmt.GetIndentAt());
     986             :     }
     987           0 :     if ( nDiff != 0  )
     988             :     {
     989           0 :         ChangeIndent( nDiff );
     990           0 :     }
     991           0 : }
     992             : 
     993      297302 : void SwNumRule::Validate()
     994             : {
     995      297302 :     std::set< SwList* > aLists;
     996      297302 :     tTxtNodeList::iterator aIter;
     997      298956 :     for ( aIter = maTxtNodeList.begin(); aIter != maTxtNodeList.end(); ++aIter )
     998             :     {
     999        1654 :         const SwTxtNode* pTxtNode = *aIter;
    1000        1654 :         aLists.insert( pTxtNode->GetDoc()->getIDocumentListsAccess().getListByName( pTxtNode->GetListId() ) );
    1001             :     }
    1002             :     std::for_each( aLists.begin(), aLists.end(),
    1003      297302 :                    std::mem_fun( &SwList::ValidateListTree ) );
    1004             : 
    1005      297302 :     SetInvalidRule(false);
    1006      297302 : }
    1007             : 
    1008        5098 : void SwNumRule::SetCountPhantoms(bool bCountPhantoms)
    1009             : {
    1010        5098 :     mbCountPhantoms = bCountPhantoms;
    1011        5098 : }
    1012             : 
    1013        1680 : SwNumRule::tParagraphStyleList::size_type SwNumRule::GetParagraphStyleListSize() const
    1014             : {
    1015        1680 :     return maParagraphStyleList.size();
    1016             : }
    1017             : 
    1018        1052 : void SwNumRule::AddParagraphStyle( SwTxtFmtColl& rTxtFmtColl )
    1019             : {
    1020             :     tParagraphStyleList::iterator aIter =
    1021        1052 :         std::find( maParagraphStyleList.begin(), maParagraphStyleList.end(), &rTxtFmtColl );
    1022             : 
    1023        1052 :     if ( aIter == maParagraphStyleList.end() )
    1024             :     {
    1025         806 :         maParagraphStyleList.push_back( &rTxtFmtColl );
    1026             :     }
    1027        1052 : }
    1028             : 
    1029           0 : void SwNumRule::RemoveParagraphStyle( SwTxtFmtColl& rTxtFmtColl )
    1030             : {
    1031             :     tParagraphStyleList::iterator aIter =
    1032           0 :         std::find( maParagraphStyleList.begin(), maParagraphStyleList.end(), &rTxtFmtColl );
    1033             : 
    1034           0 :     if ( aIter != maParagraphStyleList.end() )
    1035             :     {
    1036           0 :         maParagraphStyleList.erase( aIter );
    1037             :     }
    1038           0 : }
    1039             : 
    1040        8834 : void SwNumRule::GetGrabBagItem(uno::Any& rVal) const
    1041             : {
    1042        8834 :     if (mpGrabBagItem.get())
    1043        8828 :         mpGrabBagItem->QueryValue(rVal);
    1044             :     else
    1045             :     {
    1046           6 :         uno::Sequence<beans::PropertyValue> aValue(0);
    1047           6 :         rVal = uno::makeAny(aValue);
    1048             :     }
    1049        8834 : }
    1050             : 
    1051       26962 : void SwNumRule::SetGrabBagItem(const uno::Any& rVal)
    1052             : {
    1053       26962 :     if (!mpGrabBagItem.get())
    1054       26962 :         mpGrabBagItem.reset(new SfxGrabBagItem);
    1055             : 
    1056       26962 :     mpGrabBagItem->PutValue(rVal);
    1057       26962 : }
    1058             : 
    1059             : namespace numfunc
    1060             : {
    1061             :     /** class containing default bullet list configuration data */
    1062             :     class SwDefBulletConfig : private utl::ConfigItem
    1063             :     {
    1064             :         public:
    1065             :             static SwDefBulletConfig& getInstance();
    1066             : 
    1067           6 :             inline OUString GetFontname() const
    1068             :             {
    1069           6 :                 return msFontname;
    1070             :             }
    1071             : 
    1072           0 :             inline bool IsFontnameUserDefined() const
    1073             :             {
    1074           0 :                 return mbUserDefinedFontname;
    1075             :             }
    1076             : 
    1077         108 :             inline const vcl::Font& GetFont() const
    1078             :             {
    1079         108 :                 return *mpFont;
    1080             :             }
    1081             : 
    1082      187000 :             inline sal_Unicode GetChar( sal_uInt8 p_nListLevel ) const
    1083             :             {
    1084      187000 :                 if (p_nListLevel >= MAXLEVEL)
    1085             :                 {
    1086           0 :                     p_nListLevel = MAXLEVEL - 1;
    1087             :                 }
    1088             : 
    1089      187000 :                 return mnLevelChars[p_nListLevel];
    1090             :             }
    1091             : 
    1092             :             SwDefBulletConfig();
    1093             :             virtual ~SwDefBulletConfig();
    1094             : 
    1095             :         private:
    1096             :             /** sets internal default bullet configuration data to default values */
    1097             :             void SetToDefault();
    1098             : 
    1099             :             /** returns sequence of default bullet configuration property names */
    1100             :             uno::Sequence<OUString> GetPropNames() const;
    1101             : 
    1102             :             /** loads default bullet configuration properties and applies
    1103             :                 values to internal data */
    1104             :             void LoadConfig();
    1105             : 
    1106             :             /** initialize font instance for default bullet list */
    1107             :             void InitFont();
    1108             : 
    1109             :             /** catches notification about changed default bullet configuration data */
    1110             :             virtual void Notify( const uno::Sequence<OUString>& aPropertyNames ) SAL_OVERRIDE;
    1111             :             virtual void Commit() SAL_OVERRIDE;
    1112             : 
    1113             :             // default bullet list configuration data
    1114             :             OUString msFontname;
    1115             :             bool mbUserDefinedFontname;
    1116             :             FontWeight meFontWeight;
    1117             :             FontItalic meFontItalic;
    1118             :             sal_Unicode mnLevelChars[MAXLEVEL];
    1119             : 
    1120             :             // default bullet list font instance
    1121             :             vcl::Font* mpFont;
    1122             :     };
    1123             : 
    1124             :     namespace
    1125             :     {
    1126             :         class theSwDefBulletConfig
    1127             :             : public rtl::Static<SwDefBulletConfig, theSwDefBulletConfig>{};
    1128             :     }
    1129             : 
    1130      187114 :     SwDefBulletConfig& SwDefBulletConfig::getInstance()
    1131             :     {
    1132      187114 :         return theSwDefBulletConfig::get();
    1133             :     }
    1134             : 
    1135          86 :     SwDefBulletConfig::SwDefBulletConfig()
    1136             :         : ConfigItem( OUString("Office.Writer/Numbering/DefaultBulletList") ),
    1137             :           // default bullet font is now OpenSymbol
    1138             :           msFontname( OUString("OpenSymbol") ),
    1139             :           mbUserDefinedFontname( false ),
    1140             :           meFontWeight( WEIGHT_DONTKNOW ),
    1141             :           meFontItalic( ITALIC_NONE ),
    1142          86 :           mpFont( 0 )
    1143             :     {
    1144          86 :         SetToDefault();
    1145          86 :         LoadConfig();
    1146          86 :         InitFont();
    1147             : 
    1148             :         // enable notification for changes on default bullet configuration change
    1149          86 :         EnableNotification( GetPropNames() );
    1150          86 :     }
    1151             : 
    1152         172 :     SwDefBulletConfig::~SwDefBulletConfig()
    1153             :     {
    1154          86 :         delete mpFont;
    1155          86 :     }
    1156             : 
    1157          86 :     void SwDefBulletConfig::SetToDefault()
    1158             :     {
    1159          86 :         msFontname = "OpenSymbol";
    1160          86 :         mbUserDefinedFontname = false;
    1161          86 :         meFontWeight = WEIGHT_DONTKNOW;
    1162          86 :         meFontItalic = ITALIC_NONE;
    1163             : 
    1164          86 :         mnLevelChars[0] = 0x2022;
    1165          86 :         mnLevelChars[1] = 0x25e6;
    1166          86 :         mnLevelChars[2] = 0x25aa;
    1167          86 :         mnLevelChars[3] = 0x2022;
    1168          86 :         mnLevelChars[4] = 0x25e6;
    1169          86 :         mnLevelChars[5] = 0x25aa;
    1170          86 :         mnLevelChars[6] = 0x2022;
    1171          86 :         mnLevelChars[7] = 0x25e6;
    1172          86 :         mnLevelChars[8] = 0x25aa;
    1173          86 :         mnLevelChars[9] = 0x2022;
    1174          86 :     }
    1175             : 
    1176         172 :     uno::Sequence<OUString> SwDefBulletConfig::GetPropNames() const
    1177             :     {
    1178         172 :         uno::Sequence<OUString> aPropNames(13);
    1179         172 :         OUString* pNames = aPropNames.getArray();
    1180         172 :         pNames[0] = "BulletFont/FontFamilyname";
    1181         172 :         pNames[1] = "BulletFont/FontWeight";
    1182         172 :         pNames[2] = "BulletFont/FontItalic";
    1183         172 :         pNames[3] = "BulletCharLvl1";
    1184         172 :         pNames[4] = "BulletCharLvl2";
    1185         172 :         pNames[5] = "BulletCharLvl3";
    1186         172 :         pNames[6] = "BulletCharLvl4";
    1187         172 :         pNames[7] = "BulletCharLvl5";
    1188         172 :         pNames[8] = "BulletCharLvl6";
    1189         172 :         pNames[9] = "BulletCharLvl7";
    1190         172 :         pNames[10] = "BulletCharLvl8";
    1191         172 :         pNames[11] = "BulletCharLvl9";
    1192         172 :         pNames[12] = "BulletCharLvl10";
    1193             : 
    1194         172 :         return aPropNames;
    1195             :     }
    1196             : 
    1197          86 :     void SwDefBulletConfig::LoadConfig()
    1198             :     {
    1199          86 :         uno::Sequence<OUString> aPropNames = GetPropNames();
    1200             :         uno::Sequence<uno::Any> aValues =
    1201         172 :                                                     GetProperties( aPropNames );
    1202          86 :         const uno::Any* pValues = aValues.getConstArray();
    1203             :         OSL_ENSURE( aValues.getLength() == aPropNames.getLength(),
    1204             :                 "<SwDefBulletConfig::SwDefBulletConfig()> - GetProperties failed");
    1205          86 :         if ( aValues.getLength() == aPropNames.getLength() )
    1206             :         {
    1207        1204 :             for ( int nProp = 0; nProp < aPropNames.getLength(); ++nProp )
    1208             :             {
    1209        1118 :                 if ( pValues[nProp].hasValue() )
    1210             :                 {
    1211           0 :                     switch ( nProp )
    1212             :                     {
    1213             :                         case 0:
    1214             :                         {
    1215           0 :                             OUString aStr;
    1216           0 :                             pValues[nProp] >>= aStr;
    1217           0 :                             msFontname = aStr;
    1218           0 :                             mbUserDefinedFontname = true;
    1219             :                         }
    1220           0 :                         break;
    1221             :                         case 1:
    1222             :                         case 2:
    1223             :                         {
    1224           0 :                             sal_uInt8 nTmp = 0;
    1225           0 :                             pValues[nProp] >>= nTmp;
    1226           0 :                             if ( nProp == 1 )
    1227           0 :                                 meFontWeight = static_cast<FontWeight>(nTmp);
    1228           0 :                             else if ( nProp == 2 )
    1229           0 :                                 meFontItalic = static_cast<FontItalic>(nTmp);
    1230             :                         }
    1231           0 :                         break;
    1232             :                         case 3:
    1233             :                         case 4:
    1234             :                         case 5:
    1235             :                         case 6:
    1236             :                         case 7:
    1237             :                         case 8:
    1238             :                         case 9:
    1239             :                         case 10:
    1240             :                         case 11:
    1241             :                         case 12:
    1242             :                         {
    1243           0 :                             sal_Unicode cChar = sal_Unicode();
    1244           0 :                             pValues[nProp] >>= cChar;
    1245           0 :                             mnLevelChars[nProp-3] = cChar;
    1246             :                         }
    1247           0 :                         break;
    1248             :                     }
    1249             :                 }
    1250             :             }
    1251          86 :         }
    1252             : 
    1253          86 :     }
    1254             : 
    1255          86 :     void SwDefBulletConfig::InitFont()
    1256             :     {
    1257          86 :         delete mpFont;
    1258             : 
    1259          86 :         mpFont = new vcl::Font( msFontname, OUString(), Size( 0, 14 ) );
    1260          86 :         mpFont->SetWeight( meFontWeight );
    1261          86 :         mpFont->SetItalic( meFontItalic );
    1262          86 :         mpFont->SetCharSet( RTL_TEXTENCODING_SYMBOL );
    1263          86 :     }
    1264             : 
    1265           0 :     void SwDefBulletConfig::Notify( const uno::Sequence<OUString>& )
    1266             :     {
    1267           0 :         SetToDefault();
    1268           0 :         LoadConfig();
    1269           0 :         InitFont();
    1270           0 :     }
    1271             : 
    1272           0 :     void SwDefBulletConfig::Commit()
    1273             :     {
    1274           0 :     }
    1275             : 
    1276           6 :     OUString GetDefBulletFontname()
    1277             :     {
    1278           6 :         return SwDefBulletConfig::getInstance().GetFontname();
    1279             :     }
    1280             : 
    1281           0 :     bool IsDefBulletFontUserDefined()
    1282             :     {
    1283           0 :         return SwDefBulletConfig::getInstance().IsFontnameUserDefined();
    1284             :     }
    1285             : 
    1286         108 :     const vcl::Font& GetDefBulletFont()
    1287             :     {
    1288         108 :         return SwDefBulletConfig::getInstance().GetFont();
    1289             :     }
    1290             : 
    1291      187000 :     sal_Unicode GetBulletChar( sal_uInt8 nLevel )
    1292             :     {
    1293      187000 :         return SwDefBulletConfig::getInstance().GetChar( nLevel );
    1294             :     }
    1295             : 
    1296             :     /** class containing configuration data about user interface behavior
    1297             :         regarding lists and list items.
    1298             :         configuration item about behavior of <TAB>/<SHIFT-TAB>-key at first
    1299             :         position of first list item
    1300             :     */
    1301           0 :     class SwNumberingUIBehaviorConfig : private utl::ConfigItem
    1302             :     {
    1303             :         public:
    1304             :             static SwNumberingUIBehaviorConfig& getInstance();
    1305             : 
    1306           0 :             inline bool ChangeIndentOnTabAtFirstPosOfFirstListItem() const
    1307             :             {
    1308           0 :                 return mbChangeIndentOnTabAtFirstPosOfFirstListItem;
    1309             :             }
    1310             : 
    1311             :             SwNumberingUIBehaviorConfig();
    1312             : 
    1313             :         private:
    1314             : 
    1315             :             /** sets internal configuration data to default values */
    1316             :             void SetToDefault();
    1317             : 
    1318             :             /** returns sequence of configuration property names */
    1319             :             com::sun::star::uno::Sequence<OUString> GetPropNames() const;
    1320             : 
    1321             :             /** loads configuration properties and applies values to internal data */
    1322             :             void LoadConfig();
    1323             : 
    1324             :             /** catches notification about changed configuration data */
    1325             :             virtual void Notify( const com::sun::star::uno::Sequence<OUString>& aPropertyNames ) SAL_OVERRIDE;
    1326             :             virtual void Commit() SAL_OVERRIDE;
    1327             : 
    1328             :             // configuration data
    1329             :             bool mbChangeIndentOnTabAtFirstPosOfFirstListItem;
    1330             :     };
    1331             : 
    1332             :     namespace
    1333             :     {
    1334             :         class theSwNumberingUIBehaviorConfig : public rtl::Static<SwNumberingUIBehaviorConfig, theSwNumberingUIBehaviorConfig>{};
    1335             :     }
    1336             : 
    1337           0 :     SwNumberingUIBehaviorConfig& SwNumberingUIBehaviorConfig::getInstance()
    1338             :     {
    1339           0 :         return theSwNumberingUIBehaviorConfig::get();
    1340             :     }
    1341             : 
    1342           0 :     SwNumberingUIBehaviorConfig::SwNumberingUIBehaviorConfig()
    1343             :         : ConfigItem( OUString("Office.Writer/Numbering/UserInterfaceBehavior") ),
    1344           0 :           mbChangeIndentOnTabAtFirstPosOfFirstListItem( true )
    1345             :     {
    1346           0 :         SetToDefault();
    1347           0 :         LoadConfig();
    1348             : 
    1349             :         // enable notification for changes on configuration change
    1350           0 :         EnableNotification( GetPropNames() );
    1351           0 :     }
    1352             : 
    1353           0 :     void SwNumberingUIBehaviorConfig::SetToDefault()
    1354             :     {
    1355           0 :         mbChangeIndentOnTabAtFirstPosOfFirstListItem = true;
    1356           0 :     }
    1357             : 
    1358           0 :     com::sun::star::uno::Sequence<OUString> SwNumberingUIBehaviorConfig::GetPropNames() const
    1359             :     {
    1360           0 :         com::sun::star::uno::Sequence<OUString> aPropNames(1);
    1361           0 :         OUString* pNames = aPropNames.getArray();
    1362           0 :         pNames[0] = "ChangeIndentOnTabAtFirstPosOfFirstListItem";
    1363             : 
    1364           0 :         return aPropNames;
    1365             :     }
    1366             : 
    1367           0 :     void SwNumberingUIBehaviorConfig::Commit() {}
    1368             : 
    1369           0 :     void SwNumberingUIBehaviorConfig::LoadConfig()
    1370             :     {
    1371           0 :         com::sun::star::uno::Sequence<OUString> aPropNames = GetPropNames();
    1372             :         com::sun::star::uno::Sequence<com::sun::star::uno::Any> aValues =
    1373           0 :                                                     GetProperties( aPropNames );
    1374           0 :         const com::sun::star::uno::Any* pValues = aValues.getConstArray();
    1375             :         OSL_ENSURE( aValues.getLength() == aPropNames.getLength(),
    1376             :                 "<SwNumberingUIBehaviorConfig::LoadConfig()> - GetProperties failed");
    1377           0 :         if ( aValues.getLength() == aPropNames.getLength() )
    1378             :         {
    1379           0 :             for ( int nProp = 0; nProp < aPropNames.getLength(); ++nProp )
    1380             :             {
    1381           0 :                 if ( pValues[nProp].hasValue() )
    1382             :                 {
    1383           0 :                     switch ( nProp )
    1384             :                     {
    1385             :                         case 0:
    1386             :                         {
    1387           0 :                             pValues[nProp] >>= mbChangeIndentOnTabAtFirstPosOfFirstListItem;
    1388             :                         }
    1389           0 :                         break;
    1390             :                         default:
    1391             :                         {
    1392             :                             OSL_FAIL( "<SwNumberingUIBehaviorConfig::LoadConfig()> - unknown configuration property");
    1393             :                         }
    1394             :                     }
    1395             :                 }
    1396             :             }
    1397           0 :         }
    1398           0 :     }
    1399             : 
    1400           0 :     void SwNumberingUIBehaviorConfig::Notify( const com::sun::star::uno::Sequence<OUString>& aPropertyNames )
    1401             :     {
    1402             :         (void) aPropertyNames;
    1403           0 :         SetToDefault();
    1404           0 :         LoadConfig();
    1405           0 :     }
    1406             : 
    1407           0 :     bool ChangeIndentOnTabAtFirstPosOfFirstListItem()
    1408             :     {
    1409           0 :         return SwNumberingUIBehaviorConfig::getInstance().ChangeIndentOnTabAtFirstPosOfFirstListItem();
    1410             :     }
    1411             : 
    1412       41426 :     SvxNumberFormat::SvxNumPositionAndSpaceMode GetDefaultPositionAndSpaceMode()
    1413             :     {
    1414             :         SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode;
    1415       41426 :         SvtSaveOptions aSaveOptions;
    1416       41426 :         switch ( aSaveOptions.GetODFDefaultVersion() )
    1417             :         {
    1418             :             case SvtSaveOptions::ODFVER_010:
    1419             :             case SvtSaveOptions::ODFVER_011:
    1420             :             {
    1421           0 :                 ePosAndSpaceMode = SvxNumberFormat::LABEL_WIDTH_AND_POSITION;
    1422             :             }
    1423           0 :             break;
    1424             :             default: // ODFVER_UNKNOWN or ODFVER_012
    1425             :             {
    1426       41426 :                 ePosAndSpaceMode = SvxNumberFormat::LABEL_ALIGNMENT;
    1427             :             }
    1428             :         }
    1429             : 
    1430       41426 :         return ePosAndSpaceMode;
    1431             :     }
    1432         270 : }
    1433             : 
    1434             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10