LCOV - code coverage report
Current view: top level - sw/source/core/doc - number.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 507 675 75.1 %
Date: 2015-06-13 12:38:46 Functions: 66 90 73.3 %
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 <list.hxx>
      46             : 
      47             : #include <algorithm>
      48             : #include <unordered_map>
      49             : #include <libxml/xmlwriter.h>
      50             : 
      51             : #include <unotools/saveopt.hxx>
      52             : 
      53             : #include <IDocumentListsAccess.hxx>
      54             : #include <IDocumentStylePoolAccess.hxx>
      55             : #include <IDocumentState.hxx>
      56             : 
      57             : using namespace ::com::sun::star;
      58             : 
      59             : sal_uInt16 SwNumRule::mnRefCount = 0;
      60             : SwNumFormat* SwNumRule::maBaseFormats[ RULE_END ][ MAXLEVEL ] = {
      61             :     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
      62             : 
      63             : SwNumFormat* SwNumRule::maLabelAlignmentBaseFormats[ RULE_END ][ MAXLEVEL ] = {
      64             :     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
      65             : 
      66             : const sal_uInt16 SwNumRule::maDefNumIndents[ MAXLEVEL ] = {
      67             : //inch:   0,5  1,0  1,5  2,0   2,5   3,0   3,5   4,0   4,5   5,0
      68             :         1440/4, 1440/2, 1440*3/4, 1440, 1440*5/4, 1440*3/2, 1440*7/4, 1440*2,
      69             :         1440*9/4, 1440*5/2
      70             : };
      71             : 
      72       10615 : OUString SwNumRule::GetOutlineRuleName()
      73             : {
      74       10615 :     return OUString("Outline");
      75             : }
      76             : 
      77     8451540 : const SwNumFormat& SwNumRule::Get( sal_uInt16 i ) const
      78             : {
      79             :     OSL_ASSERT( i < MAXLEVEL && meRuleType < RULE_END );
      80     8451540 :     return maFormats[ i ]
      81     5357404 :            ? *maFormats[ i ]
      82     3094136 :            : ( meDefaultNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION
      83           0 :                ? *maBaseFormats[ meRuleType ][ i ]
      84    25354620 :                : *maLabelAlignmentBaseFormats[ meRuleType ][ i ] );
      85             : }
      86             : 
      87     5703959 : const SwNumFormat* SwNumRule::GetNumFormat( sal_uInt16 i ) const
      88             : {
      89     5703959 :     const SwNumFormat * pResult = NULL;
      90             : 
      91             :     OSL_ASSERT( i < MAXLEVEL && meRuleType < RULE_END );
      92     5703959 :     if ( i < MAXLEVEL && meRuleType < RULE_END)
      93             :     {
      94     5703959 :         pResult = maFormats[ i ];
      95             :     }
      96             : 
      97     5703959 :     return pResult;
      98             : }
      99             : 
     100             : // #i91400#
     101        6826 : void SwNumRule::SetName( const OUString & rName,
     102             :                          IDocumentListsAccess& rDocListAccess)
     103             : {
     104        6826 :     if ( msName != rName )
     105             :     {
     106          15 :         if (mpNumRuleMap)
     107             :         {
     108           0 :             mpNumRuleMap->erase(msName);
     109           0 :             (*mpNumRuleMap)[rName] = this;
     110             : 
     111           0 :             if ( !GetDefaultListId().isEmpty() )
     112             :             {
     113           0 :                 rDocListAccess.trackChangeOfListStyleName( msName, rName );
     114             :             }
     115             :         }
     116             : 
     117          15 :         msName = rName;
     118             :     }
     119        6826 : }
     120             : 
     121      189749 : void SwNumRule::GetTextNodeList( SwNumRule::tTextNodeList& rTextNodeList ) const
     122             : {
     123      189749 :     rTextNodeList = maTextNodeList;
     124      189749 : }
     125             : 
     126        1331 : SwNumRule::tTextNodeList::size_type SwNumRule::GetTextNodeListSize() const
     127             : {
     128        1331 :     return maTextNodeList.size();
     129             : }
     130             : 
     131        6187 : void SwNumRule::AddTextNode( SwTextNode& rTextNode )
     132             : {
     133             :     tTextNodeList::iterator aIter =
     134        6187 :         std::find( maTextNodeList.begin(), maTextNodeList.end(), &rTextNode );
     135             : 
     136        6187 :     if ( aIter == maTextNodeList.end() )
     137             :     {
     138        6187 :         maTextNodeList.push_back( &rTextNode );
     139             :     }
     140        6187 : }
     141             : 
     142        6187 : void SwNumRule::RemoveTextNode( SwTextNode& rTextNode )
     143             : {
     144             :     tTextNodeList::iterator aIter =
     145        6187 :         std::find( maTextNodeList.begin(), maTextNodeList.end(), &rTextNode );
     146             : 
     147        6187 :     if ( aIter != maTextNodeList.end() )
     148             :     {
     149        6187 :         maTextNodeList.erase( aIter );
     150             :     }
     151        6187 : }
     152             : 
     153       22610 : void SwNumRule::SetNumRuleMap(std::unordered_map<OUString, SwNumRule *, OUStringHash> *
     154             :                               pNumRuleMap)
     155             : {
     156       22610 :     mpNumRuleMap = pNumRuleMap;
     157       22610 : }
     158             : 
     159       25658 : sal_uInt16 SwNumRule::GetNumIndent( sal_uInt8 nLvl )
     160             : {
     161             :     OSL_ENSURE( MAXLEVEL > nLvl, "NumLevel is out of range" );
     162       25658 :     return maDefNumIndents[ nLvl ];
     163             : }
     164             : 
     165          62 : sal_uInt16 SwNumRule::GetBullIndent( sal_uInt8 nLvl )
     166             : {
     167             :     OSL_ENSURE( MAXLEVEL > nLvl, "NumLevel is out of range" );
     168          62 :     return maDefNumIndents[ nLvl ];
     169             : }
     170             : 
     171       21321 : static void lcl_SetRuleChgd( SwTextNode& rNd, sal_uInt8 nLevel )
     172             : {
     173       21321 :     if( rNd.GetActualListLevel() == nLevel )
     174        2530 :         rNd.NumRuleChgd();
     175       21321 : }
     176             : 
     177      102482 : SwNumFormat::SwNumFormat() :
     178             :     SvxNumberFormat(SVX_NUM_ARABIC),
     179             :     SwClient( 0 ),
     180      102482 :     pVertOrient(new SwFormatVertOrient( 0, text::VertOrientation::NONE))
     181      204964 :     ,cGrfBulletCP(USHRT_MAX)//For i120928,record the cp info of graphic within bullet
     182             : {
     183      102482 : }
     184             : 
     185     5121953 : SwNumFormat::SwNumFormat( const SwNumFormat& rFormat) :
     186             :     SvxNumberFormat(rFormat),
     187             :     SwClient( rFormat.GetRegisteredInNonConst() ),
     188    10243906 :     pVertOrient(new SwFormatVertOrient( 0, rFormat.GetVertOrient()))
     189    15365859 :     ,cGrfBulletCP(rFormat.cGrfBulletCP)//For i120928,record the cp info of graphic within bullet
     190             : {
     191     5121953 :     sal_Int16 eMyVertOrient = rFormat.GetVertOrient();
     192     5121953 :     SetGraphicBrush( rFormat.GetBrush(), &rFormat.GetGraphicSize(),
     193     5121953 :                                                 &eMyVertOrient);
     194     5121953 : }
     195             : 
     196     1555310 : SwNumFormat::SwNumFormat(const SvxNumberFormat& rNumFormat, SwDoc* pDoc)
     197             :     : SvxNumberFormat(rNumFormat)
     198     3110620 :     , pVertOrient(new SwFormatVertOrient( 0, rNumFormat.GetVertOrient()))
     199     4665930 :     , cGrfBulletCP(USHRT_MAX)
     200             : {
     201     1555310 :     sal_Int16 eMyVertOrient = rNumFormat.GetVertOrient();
     202     1555310 :     SetGraphicBrush( rNumFormat.GetBrush(), &rNumFormat.GetGraphicSize(),
     203     1555310 :                                                 &eMyVertOrient);
     204     1555310 :     const OUString rCharStyleName = rNumFormat.SvxNumberFormat::GetCharFormatName();
     205     1555310 :     if( !rCharStyleName.isEmpty() )
     206             :     {
     207       12213 :         SwCharFormat* pCFormat = pDoc->FindCharFormatByName( rCharStyleName );
     208       12213 :         if( !pCFormat )
     209             :         {
     210             :             sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( rCharStyleName,
     211           0 :                                             nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
     212             :             pCFormat = nId != USHRT_MAX
     213           0 :                         ? pDoc->getIDocumentStylePoolAccess().GetCharFormatFromPool( nId )
     214           0 :                         : pDoc->MakeCharFormat( rCharStyleName, 0 );
     215             :         }
     216       12213 :         pCFormat->Add( this );
     217             :     }
     218     1543097 :     else if( GetRegisteredIn() )
     219           0 :         GetRegisteredInNonConst()->Remove( this );
     220     1555310 : }
     221             : 
     222    17377439 : SwNumFormat::~SwNumFormat()
     223             : {
     224     6779335 :     delete pVertOrient;
     225    10598104 : }
     226             : 
     227           0 : void SwNumFormat::NotifyGraphicArrived()
     228             : {
     229           0 :     if( GetCharFormat() )
     230           0 :         UpdateNumNodes( GetCharFormat()->GetDoc() );
     231           0 : }
     232             : 
     233             : // #i22362#
     234        4046 : bool SwNumFormat::IsEnumeration() const
     235             : {
     236             :     // #i30655# native numbering did not work any longer
     237             :     // using this code. Therefore HBRINKM and I agreed upon defining
     238             :     // IsEnumeration() as !IsItemize()
     239        4046 :     return !IsItemize();
     240             : }
     241             : 
     242        5065 : bool SwNumFormat::IsItemize() const
     243             : {
     244             :     bool bResult;
     245             : 
     246        5065 :     switch(GetNumberingType())
     247             :     {
     248             :     case SVX_NUM_CHAR_SPECIAL:
     249             :     case SVX_NUM_BITMAP:
     250         705 :         bResult = true;
     251             : 
     252         705 :         break;
     253             : 
     254             :     default:
     255        4360 :         bResult = false;
     256             :     }
     257             : 
     258        5065 :     return bResult;
     259             : 
     260             : }
     261             : 
     262       13203 : SwNumFormat& SwNumFormat::operator=( const SwNumFormat& rNumFormat)
     263             : {
     264       13203 :     SvxNumberFormat::operator=(rNumFormat);
     265       13203 :     if( rNumFormat.GetRegisteredIn() )
     266       13198 :         rNumFormat.GetRegisteredInNonConst()->Add( this );
     267           5 :     else if( GetRegisteredIn() )
     268           0 :         GetRegisteredInNonConst()->Remove( this );
     269             :     //For i120928,record the cp info of graphic within bullet
     270       13203 :     cGrfBulletCP = rNumFormat.cGrfBulletCP;
     271       13203 :     return *this;
     272             : }
     273             : 
     274     3880721 : bool SwNumFormat::operator==( const SwNumFormat& rNumFormat) const
     275             : {
     276     7558317 :     bool bRet = SvxNumberFormat::operator==(rNumFormat) &&
     277     7558317 :         GetRegisteredIn() == rNumFormat.GetRegisteredIn();
     278     3880721 :     return bRet;
     279             : }
     280             : 
     281       20355 : void SwNumFormat::SetCharFormat( SwCharFormat* pChFormat)
     282             : {
     283       20355 :     if( pChFormat )
     284       15252 :         pChFormat->Add( this );
     285        5103 :     else if( GetRegisteredIn() )
     286           0 :         GetRegisteredInNonConst()->Remove( this );
     287       20355 : }
     288             : 
     289       33678 : void SwNumFormat::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
     290             : {
     291             :     // Look for the NumRules object in the Doc where this NumFormat is set.
     292             :     // The format does not need to exist!
     293       33678 :     const SwCharFormat* pFormat = 0;
     294       33678 :     sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
     295       33678 :     switch( nWhich )
     296             :     {
     297             :     case RES_ATTRSET_CHG:
     298             :     case RES_FMT_CHG:
     299       33648 :         pFormat = GetCharFormat();
     300       33648 :         break;
     301             :     }
     302             : 
     303       33678 :     if( pFormat && !pFormat->GetDoc()->IsInDtor() )
     304       18267 :         UpdateNumNodes( const_cast<SwDoc*>(pFormat->GetDoc()) );
     305             :     else
     306       15411 :         CheckRegistration( pOld, pNew );
     307       33678 : }
     308             : 
     309       13023 : void SwNumFormat::SetCharFormatName(const OUString& rSet)
     310             : {
     311       13023 :     SvxNumberFormat::SetCharFormatName(rSet);
     312       13023 : }
     313             : 
     314           0 : OUString SwNumFormat::GetCharFormatName() const
     315             : {
     316           0 :     if(static_cast<const SwCharFormat*>(GetRegisteredIn()))
     317           0 :         return static_cast<const SwCharFormat*>(GetRegisteredIn())->GetName();
     318             : 
     319           0 :     return OUString();
     320             : }
     321             : 
     322     6677303 : void    SwNumFormat::SetGraphicBrush( const SvxBrushItem* pBrushItem, const Size* pSize,
     323             :     const sal_Int16* pOrient)
     324             : {
     325     6677303 :     if(pOrient)
     326     6677264 :         pVertOrient->SetVertOrient( *pOrient );
     327     6677303 :     SvxNumberFormat::SetGraphicBrush( pBrushItem, pSize, pOrient);
     328     6677303 : }
     329             : 
     330           0 : void    SwNumFormat::SetVertOrient(sal_Int16 eSet)
     331             : {
     332           0 :     SvxNumberFormat::SetVertOrient(eSet);
     333           0 : }
     334             : 
     335    10243906 : sal_Int16   SwNumFormat::GetVertOrient() const
     336             : {
     337    10243906 :     return SvxNumberFormat::GetVertOrient();
     338             : }
     339             : 
     340       18267 : void SwNumFormat::UpdateNumNodes( SwDoc* pDoc )
     341             : {
     342       18267 :     bool bDocIsModified = pDoc->getIDocumentState().IsModified();
     343       18267 :     bool bFnd = false;
     344      454933 :     for( SwNumRuleTable::size_type n = pDoc->GetNumRuleTable().size(); !bFnd && n; )
     345             :     {
     346      418399 :         const SwNumRule* pRule = pDoc->GetNumRuleTable()[ --n ];
     347     4497883 :         for( sal_uInt8 i = 0; i < MAXLEVEL; ++i )
     348     4096143 :             if( pRule->GetNumFormat( i ) == this )
     349             :             {
     350       16659 :                 SwNumRule::tTextNodeList aTextNodeList;
     351       16659 :                 pRule->GetTextNodeList( aTextNodeList );
     352      113940 :                 for ( SwNumRule::tTextNodeList::iterator aIter = aTextNodeList.begin();
     353       75960 :                       aIter != aTextNodeList.end(); ++aIter )
     354             :                 {
     355       21321 :                     lcl_SetRuleChgd( *(*aIter), i );
     356             :                 }
     357       16659 :                 bFnd = true;
     358       16659 :                 break;
     359             :             }
     360             :     }
     361             : 
     362       18267 :     if( bFnd && !bDocIsModified )
     363           0 :         pDoc->getIDocumentState().ResetModified();
     364       18267 : }
     365             : 
     366         323 : const SwFormatVertOrient*      SwNumFormat::GetGraphicOrientation() const
     367             : {
     368         323 :     sal_Int16  eOrient = SvxNumberFormat::GetVertOrient();
     369         323 :     if(text::VertOrientation::NONE == eOrient)
     370         323 :         return 0;
     371             :     else
     372             :     {
     373           0 :         pVertOrient->SetVertOrient(eOrient);
     374           0 :         return pVertOrient;
     375             :     }
     376             : }
     377             : 
     378       22590 : SwNumRule::SwNumRule( const OUString& rNm,
     379             :                       const SvxNumberFormat::SvxNumPositionAndSpaceMode eDefaultNumberFormatPositionAndSpaceMode,
     380             :                       SwNumRuleType eType,
     381             :                       bool bAutoFlg )
     382             :   : maTextNodeList(),
     383             :     maParagraphStyleList(),
     384             :     mpNumRuleMap(0),
     385             :     msName( rNm ),
     386             :     meRuleType( eType ),
     387             :     mnPoolFormatId( 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       22590 :     msDefaultListId()
     398             : {
     399       22590 :     if( !mnRefCount++ )          // for the first time, initialize
     400             :     {
     401             :         SwNumFormat* pFormat;
     402             :         sal_uInt8 n;
     403             : 
     404             :         // numbering:
     405             :         // position-and-space mode LABEL_WIDTH_AND_POSITION:
     406       28160 :         for( n = 0; n < MAXLEVEL; ++n )
     407             :         {
     408       25600 :             pFormat = new SwNumFormat;
     409       25600 :             pFormat->SetIncludeUpperLevels( 1 );
     410       25600 :             pFormat->SetStart( 1 );
     411       25600 :             pFormat->SetAbsLSpace( lNumIndent + SwNumRule::GetNumIndent( n ) );
     412       25600 :             pFormat->SetFirstLineOffset( lNumFirstLineOffset );
     413       25600 :             pFormat->SetSuffix( "." );
     414       25600 :             pFormat->SetBulletChar( numfunc::GetBulletChar(n));
     415       25600 :             SwNumRule::maBaseFormats[ NUM_RULE ][ n ] = pFormat;
     416             :         }
     417             :         // position-and-space mode LABEL_ALIGNMENT
     418             :         // first line indent of general numbering in inch: -0,25 inch
     419        2560 :         const long cFirstLineIndent = -1440/4;
     420             :         // indent values of general numbering in inch:
     421             :         //  0,5         0,75        1,0         1,25        1,5
     422             :         //  1,75        2,0         2,25        2,5         2,75
     423             :         const long cIndentAt[ MAXLEVEL ] = {
     424             :             1440/2,     1440*3/4,   1440,       1440*5/4,   1440*3/2,
     425        2560 :             1440*7/4,   1440*2,     1440*9/4,   1440*5/2,   1440*11/4 };
     426       28160 :         for( n = 0; n < MAXLEVEL; ++n )
     427             :         {
     428       25600 :             pFormat = new SwNumFormat;
     429       25600 :             pFormat->SetIncludeUpperLevels( 1 );
     430       25600 :             pFormat->SetStart( 1 );
     431       25600 :             pFormat->SetPositionAndSpaceMode( SvxNumberFormat::LABEL_ALIGNMENT );
     432       25600 :             pFormat->SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
     433       25600 :             pFormat->SetListtabPos( cIndentAt[ n ] );
     434       25600 :             pFormat->SetFirstLineIndent( cFirstLineIndent );
     435       25600 :             pFormat->SetIndentAt( cIndentAt[ n ] );
     436       25600 :             pFormat->SetSuffix( "." );
     437       25600 :             pFormat->SetBulletChar( numfunc::GetBulletChar(n));
     438       25600 :             SwNumRule::maLabelAlignmentBaseFormats[ NUM_RULE ][ n ] = pFormat;
     439             :         }
     440             : 
     441             :         // outline:
     442             :         // position-and-space mode LABEL_WIDTH_AND_POSITION:
     443       28160 :         for( n = 0; n < MAXLEVEL; ++n )
     444             :         {
     445       25600 :             pFormat = new SwNumFormat;
     446       25600 :             pFormat->SetNumberingType(SVX_NUM_NUMBER_NONE);
     447       25600 :             pFormat->SetIncludeUpperLevels( MAXLEVEL );
     448       25600 :             pFormat->SetStart( 1 );
     449       25600 :             pFormat->SetCharTextDistance( lOutlineMinTextDistance );
     450       25600 :             pFormat->SetBulletChar( numfunc::GetBulletChar(n));
     451       25600 :             SwNumRule::maBaseFormats[ OUTLINE_RULE ][ n ] = pFormat;
     452             :         }
     453             :         // position-and-space mode LABEL_ALIGNMENT:
     454             :         // indent values of default outline numbering in inch:
     455             :         //  0,3         0,4         0,5         0,6         0,7
     456             :         //  0,8         0,9         1,0         1,1         1,2
     457             :         const long cOutlineIndentAt[ MAXLEVEL ] = {
     458             :             1440*3/10,  1440*2/5,   1440/2,     1440*3/5,   1440*7/10,
     459        2560 :             1440*4/5,   1440*9/10,  1440,       1440*11/10, 1440*6/5 };
     460       28160 :         for( n = 0; n < MAXLEVEL; ++n )
     461             :         {
     462       25600 :             pFormat = new SwNumFormat;
     463       25600 :             pFormat->SetNumberingType(SVX_NUM_NUMBER_NONE);
     464       25600 :             pFormat->SetIncludeUpperLevels( MAXLEVEL );
     465       25600 :             pFormat->SetStart( 1 );
     466       25600 :             pFormat->SetPositionAndSpaceMode( SvxNumberFormat::LABEL_ALIGNMENT );
     467       25600 :             pFormat->SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
     468       25600 :             pFormat->SetListtabPos( cOutlineIndentAt[ n ] );
     469       25600 :             pFormat->SetFirstLineIndent( -cOutlineIndentAt[ n ] );
     470       25600 :             pFormat->SetIndentAt( cOutlineIndentAt[ n ] );
     471       25600 :             pFormat->SetBulletChar( numfunc::GetBulletChar(n));
     472       25600 :             SwNumRule::maLabelAlignmentBaseFormats[ OUTLINE_RULE ][ n ] = pFormat;
     473             :         }
     474             :     }
     475       22590 :     memset( maFormats, 0, sizeof( maFormats ));
     476             :     OSL_ENSURE( !msName.isEmpty(), "NumRule without a name!" );
     477       22590 : }
     478             : 
     479      325902 : SwNumRule::SwNumRule( const SwNumRule& rNumRule )
     480             :     : maTextNodeList(),
     481             :       maParagraphStyleList(),
     482             :       mpNumRuleMap(0),
     483             :       msName( rNumRule.msName ),
     484             :       meRuleType( rNumRule.meRuleType ),
     485      325902 :       mnPoolFormatId( rNumRule.GetPoolFormatId() ),
     486      325902 :       mnPoolHelpId( rNumRule.GetPoolHelpId() ),
     487      325902 :       mnPoolHlpFileId( rNumRule.GetPoolHlpFileId() ),
     488             :       mbAutoRuleFlag( rNumRule.mbAutoRuleFlag ),
     489             :       mbInvalidRuleFlag( true ),
     490             :       mbContinusNum( rNumRule.mbContinusNum ),
     491             :       mbAbsSpaces( rNumRule.mbAbsSpaces ),
     492             :       mbHidden( rNumRule.mbHidden ),
     493             :       mbCountPhantoms( true ),
     494             :       meDefaultNumberFormatPositionAndSpaceMode( rNumRule.meDefaultNumberFormatPositionAndSpaceMode ),
     495     1303608 :       msDefaultListId( rNumRule.msDefaultListId )
     496             : {
     497      325902 :     ++mnRefCount;
     498      325902 :     memset( maFormats, 0, sizeof( maFormats ));
     499     3584922 :     for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
     500     3259020 :         if( rNumRule.maFormats[ n ] )
     501     1792292 :             Set( n, *rNumRule.maFormats[ n ] );
     502      325902 : }
     503             : 
     504      696954 : SwNumRule::~SwNumRule()
     505             : {
     506     3833247 :     for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
     507     3484770 :         delete maFormats[ n ];
     508             : 
     509      348477 :     if (mpNumRuleMap)
     510             :     {
     511       22601 :         mpNumRuleMap->erase(GetName());
     512             :     }
     513             : 
     514      348477 :     if( !--mnRefCount )          // the last one closes the door (?)
     515             :     {
     516             :             // Numbering:
     517        2552 :             SwNumFormat** ppFormats = &SwNumRule::maBaseFormats[0][0];
     518             :             int n;
     519             : 
     520       28072 :             for( n = 0; n < MAXLEVEL; ++n, ++ppFormats )
     521       25520 :                 delete *ppFormats, *ppFormats = 0;
     522             : 
     523             :             // Outline:
     524       28072 :             for( n = 0; n < MAXLEVEL; ++n, ++ppFormats )
     525       25520 :                 delete *ppFormats, *ppFormats = 0;
     526             : 
     527        2552 :             ppFormats = &SwNumRule::maLabelAlignmentBaseFormats[0][0];
     528       28072 :             for( n = 0; n < MAXLEVEL; ++n, ++ppFormats )
     529       25520 :                 delete *ppFormats, *ppFormats = 0;
     530       28072 :             for( n = 0; n < MAXLEVEL; ++n, ++ppFormats )
     531       25520 :                 delete *ppFormats, *ppFormats = 0;
     532             :     }
     533             : 
     534      348477 :     maTextNodeList.clear();
     535      348477 :     maParagraphStyleList.clear();
     536      348477 : }
     537             : 
     538      304152 : void SwNumRule::CheckCharFormats( SwDoc* pDoc )
     539             : {
     540     3345672 :     for( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
     541             :     {
     542             :         SwCharFormat* pFormat;
     543     3067498 :         if( maFormats[ n ] && 0 != ( pFormat = maFormats[ n ]->GetCharFormat() ) &&
     544       25978 :             pFormat->GetDoc() != pDoc )
     545             :         {
     546             :             // copy
     547         110 :             SwNumFormat* pNew = new SwNumFormat( *maFormats[ n ] );
     548         110 :             pNew->SetCharFormat( pDoc->CopyCharFormat( *pFormat ) );
     549         110 :             delete maFormats[ n ];
     550         110 :             maFormats[ n ] = pNew;
     551             :         }
     552             :     }
     553      304152 : }
     554             : 
     555        6812 : SwNumRule& SwNumRule::operator=( const SwNumRule& rNumRule )
     556             : {
     557        6812 :     if( this != &rNumRule )
     558             :     {
     559       74932 :         for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
     560       68120 :             Set( n, rNumRule.maFormats[ n ] );
     561             : 
     562        6812 :         meRuleType = rNumRule.meRuleType;
     563        6812 :         msName = rNumRule.msName;
     564        6812 :         mbAutoRuleFlag = rNumRule.mbAutoRuleFlag;
     565        6812 :         mbInvalidRuleFlag = true;
     566        6812 :         mbContinusNum = rNumRule.mbContinusNum;
     567        6812 :         mbAbsSpaces = rNumRule.mbAbsSpaces;
     568        6812 :         mbHidden = rNumRule.mbHidden;
     569        6812 :         mnPoolFormatId = rNumRule.GetPoolFormatId();
     570        6812 :         mnPoolHelpId = rNumRule.GetPoolHelpId();
     571        6812 :         mnPoolHlpFileId = rNumRule.GetPoolHlpFileId();
     572             :     }
     573        6812 :     return *this;
     574             : }
     575             : 
     576        2681 : bool SwNumRule::operator==( const SwNumRule& rRule ) const
     577             : {
     578        5362 :     bool bRet = meRuleType == rRule.meRuleType &&
     579        5362 :                 msName == rRule.msName &&
     580        5362 :                 mbAutoRuleFlag == rRule.mbAutoRuleFlag &&
     581        5362 :                 mbContinusNum == rRule.mbContinusNum &&
     582        5362 :                 mbAbsSpaces == rRule.mbAbsSpaces &&
     583        5362 :                 mnPoolFormatId == rRule.GetPoolFormatId() &&
     584        8043 :                 mnPoolHelpId == rRule.GetPoolHelpId() &&
     585        5362 :                 mnPoolHlpFileId == rRule.GetPoolHlpFileId();
     586        2681 :     if( bRet )
     587             :     {
     588       27753 :         for( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
     589       25253 :             if( !( rRule.Get( n ) == Get( n ) ))
     590             :             {
     591         181 :                 bRet = false;
     592         181 :                 break;
     593             :             }
     594             :     }
     595        2681 :     return bRet;
     596             : }
     597             : 
     598     2007533 : void SwNumRule::Set( sal_uInt16 i, const SwNumFormat& rNumFormat )
     599             : {
     600             :     OSL_ENSURE( i < MAXLEVEL, "Serious defect, please inform OD" );
     601     2007533 :     if( i < MAXLEVEL )
     602             :     {
     603     2007533 :         if( !maFormats[ i ] || !(rNumFormat == Get( i )) )
     604             :         {
     605     1982032 :             delete maFormats[ i ];
     606     1982032 :             maFormats[ i ] = new SwNumFormat( rNumFormat );
     607     1982032 :             mbInvalidRuleFlag = true;
     608             :         }
     609             :     }
     610     2007533 : }
     611             : 
     612     1048191 : void SwNumRule::Set( sal_uInt16 i, const SwNumFormat* pNumFormat )
     613             : {
     614             :     OSL_ENSURE( i < MAXLEVEL, "Serious defect, please inform OD" );
     615     1048191 :     if( i >= MAXLEVEL )
     616     1048191 :         return;
     617     1048191 :     SwNumFormat* pOld = maFormats[ i ];
     618     1048191 :     if( !pOld )
     619             :     {
     620      195118 :         if( pNumFormat )
     621             :         {
     622      179327 :             maFormats[ i ] = new SwNumFormat( *pNumFormat );
     623      179327 :             mbInvalidRuleFlag = true;
     624             :         }
     625             :     }
     626      853073 :     else if( !pNumFormat )
     627           0 :         delete pOld, maFormats[ i ] = 0, mbInvalidRuleFlag = true;
     628      853073 :     else if( *pOld != *pNumFormat )
     629       13203 :         *pOld = *pNumFormat, mbInvalidRuleFlag = true;
     630             : }
     631             : 
     632        1534 : OUString SwNumRule::MakeNumString( const SwNodeNum& rNum, bool bInclStrings,
     633             :                                 bool bOnlyArabic ) const
     634             : {
     635        1534 :     if (rNum.IsCounted())
     636             :         return MakeNumString(rNum.GetNumberVector(),
     637        1534 :                              bInclStrings, bOnlyArabic, MAXLEVEL);
     638             : 
     639           0 :     return OUString();
     640             : }
     641             : 
     642        9931 : OUString SwNumRule::MakeNumString( const SwNumberTree::tNumberVector & rNumVector,
     643             :                                  const bool bInclStrings,
     644             :                                  const bool bOnlyArabic,
     645             :                                  const unsigned int _nRestrictToThisLevel,
     646             :                                  SwNumRule::Extremities* pExtremities ) const
     647             : {
     648        9931 :     OUString aStr;
     649             : 
     650        9931 :     unsigned int nLevel = rNumVector.size() - 1;
     651             : 
     652        9931 :     if ( pExtremities )
     653        1749 :         pExtremities->nPrefixChars = pExtremities->nSuffixChars = 0;
     654             : 
     655        9931 :     if ( nLevel > _nRestrictToThisLevel )
     656             :     {
     657         651 :         nLevel = _nRestrictToThisLevel;
     658             :     }
     659             : 
     660        9931 :     if (nLevel < MAXLEVEL)
     661             :     {
     662        9931 :         const SwNumFormat& rMyNFormat = Get( static_cast<sal_uInt16>(nLevel) );
     663             : 
     664             :         {
     665        9931 :             sal_uInt8 i = static_cast<sal_uInt8>(nLevel);
     666             : 
     667       29227 :             if( !IsContinusNum() &&
     668             :                 // - do not include upper levels, if level isn't numbered.
     669       17317 :                 rMyNFormat.GetNumberingType() != SVX_NUM_NUMBER_NONE &&
     670        7386 :                 rMyNFormat.GetIncludeUpperLevels() )  // Just the own level?
     671             :             {
     672        7386 :                 sal_uInt8 n = rMyNFormat.GetIncludeUpperLevels();
     673        7386 :                 if( 1 < n )
     674             :                 {
     675         391 :                     if( i+1 >= n )
     676         391 :                         i -= n - 1;
     677             :                     else
     678           0 :                         i = 0;
     679             :                 }
     680             :             }
     681             : 
     682       20729 :             for( ; i <= nLevel; ++i )
     683             :             {
     684       10798 :                 const SwNumFormat& rNFormat = Get( i );
     685       10798 :                 if( SVX_NUM_NUMBER_NONE == rNFormat.GetNumberingType() )
     686             :                 {
     687             :                     // Should 1.1.1 --> 2. NoNum --> 1..1 or 1.1 ??
     688             :                     //                 if( i != rNum.nMyLevel )
     689             :                     //                    aStr += ".";
     690        2002 :                     continue;
     691             :                 }
     692             : 
     693        8796 :                 if( rNumVector[ i ] )
     694             :                 {
     695        8570 :                     if( bOnlyArabic )
     696         985 :                         aStr += OUString::number( rNumVector[ i ] );
     697             :                     else
     698        7585 :                         aStr += rNFormat.GetNumStr( rNumVector[ i ] );
     699             :                 }
     700             :                 else
     701         226 :                     aStr += "0";        // all 0 level are a 0
     702        8796 :                 if( i != nLevel && !aStr.isEmpty() )
     703         844 :                     aStr += ".";
     704             :             }
     705             : 
     706             :             // The type doesn't have any number, so don't append
     707             :             // the post-/prefix string
     708       28337 :             if( bInclStrings && !bOnlyArabic &&
     709       28337 :                 SVX_NUM_CHAR_SPECIAL != rMyNFormat.GetNumberingType() &&
     710        9203 :                 SVX_NUM_BITMAP != rMyNFormat.GetNumberingType() )
     711             :             {
     712        9203 :                 const OUString sPrefix = rMyNFormat.GetPrefix();
     713       18406 :                 const OUString sSuffix = rMyNFormat.GetSuffix();
     714             : 
     715        9203 :                 aStr = sPrefix + aStr + sSuffix;
     716        9203 :                 if ( pExtremities )
     717             :                 {
     718        1749 :                     pExtremities->nPrefixChars = sPrefix.getLength();
     719        1749 :                     pExtremities->nSuffixChars = sSuffix.getLength();
     720        9203 :                 }
     721             :             }
     722             :         }
     723             :     }
     724             : 
     725        9931 :     return aStr;
     726             : }
     727             : 
     728         919 : OUString SwNumRule::MakeRefNumString( const SwNodeNum& rNodeNum,
     729             :                                     const bool bInclSuperiorNumLabels,
     730             :                                     const sal_uInt8 nRestrictInclToThisLevel ) const
     731             : {
     732         919 :     OUString aRefNumStr;
     733             : 
     734         919 :     if ( rNodeNum.GetLevelInListTree() >= 0 )
     735             :     {
     736         919 :         bool bOldHadPrefix = true;
     737             : 
     738         919 :         const SwNodeNum* pWorkingNodeNum( &rNodeNum );
     739        1050 :         do
     740             :         {
     741        1947 :             bool bMakeNumStringForPhantom( false );
     742        1947 :             if ( pWorkingNodeNum->IsPhantom() )
     743             :             {
     744           0 :                 int nListLevel = pWorkingNodeNum->GetLevelInListTree();
     745             : 
     746           0 :                 if (nListLevel < 0)
     747           0 :                     nListLevel = 0;
     748             : 
     749           0 :                 if (nListLevel >= MAXLEVEL)
     750           0 :                     nListLevel = MAXLEVEL - 1;
     751             : 
     752           0 :                 SwNumFormat aFormat( Get( static_cast<sal_uInt16>(nListLevel) ) );
     753           0 :                 bMakeNumStringForPhantom = aFormat.IsEnumeration() &&
     754           0 :                                            SVX_NUM_NUMBER_NONE != aFormat.GetNumberingType();
     755             : 
     756             :             }
     757        5643 :             if ( bMakeNumStringForPhantom ||
     758        3894 :                  ( !pWorkingNodeNum->IsPhantom() &&
     759        3894 :                    pWorkingNodeNum->GetTextNode() &&
     760        1947 :                    pWorkingNodeNum->GetTextNode()->HasNumber() ) )
     761             :             {
     762             :                 Extremities aExtremities;
     763             :                 OUString aPrevStr = MakeNumString( pWorkingNodeNum->GetNumberVector(),
     764             :                                                  true, false, MAXLEVEL,
     765        1749 :                                                  &aExtremities);
     766        1749 :                 sal_Int32 nStrip = 0;
     767        3878 :                 while ( nStrip < aExtremities.nPrefixChars )
     768             :                 {
     769        1344 :                     const sal_Unicode c = aPrevStr[nStrip];
     770        1344 :                     if ( c!='\t' && c!=' ')
     771         964 :                         break;
     772         380 :                     ++nStrip;
     773             :                 }
     774             : 
     775        1749 :                 if (nStrip)
     776             :                 {
     777         380 :                     aPrevStr = aPrevStr.copy( nStrip );
     778         380 :                     aExtremities.nPrefixChars -= nStrip;
     779             :                 }
     780             : 
     781        1749 :                 if (bOldHadPrefix &&
     782        1566 :                      aExtremities.nSuffixChars &&
     783        1566 :                      !aExtremities.nPrefixChars
     784             :                    )
     785             :                 {
     786        1216 :                     aPrevStr = aPrevStr.copy(0,
     787        1216 :                         aPrevStr.getLength() - aExtremities.nSuffixChars);
     788             :                 }
     789             : 
     790        1749 :                 bOldHadPrefix = ( aExtremities.nPrefixChars >  0);
     791             : 
     792        1749 :                 aRefNumStr = aPrevStr + aRefNumStr;
     793             :             }
     794             : 
     795        1947 :             if ( bInclSuperiorNumLabels && pWorkingNodeNum->GetLevelInListTree() > 0 )
     796             :             {
     797        1050 :                 sal_uInt8 n = Get( static_cast<sal_uInt16>(pWorkingNodeNum->GetLevelInListTree()) ).GetIncludeUpperLevels();
     798        1050 :                 pWorkingNodeNum = dynamic_cast<SwNodeNum*>(pWorkingNodeNum->GetParent());
     799             :                 // skip parents, whose list label is already contained in the actual list label.
     800        2100 :                 while ( pWorkingNodeNum && n > 1 )
     801             :                 {
     802           0 :                     pWorkingNodeNum = dynamic_cast<SwNodeNum*>(pWorkingNodeNum->GetParent());
     803           0 :                     --n;
     804             :                 }
     805             :             }
     806             :             else
     807             :             {
     808         897 :                 break;
     809             :             }
     810        1050 :         } while ( pWorkingNodeNum &&
     811        2100 :                   pWorkingNodeNum->GetLevelInListTree() >= 0 &&
     812        1050 :                   static_cast<sal_uInt8>(pWorkingNodeNum->GetLevelInListTree()) >= nRestrictInclToThisLevel );
     813             :     }
     814             : 
     815         919 :     return aRefNumStr;
     816             : }
     817             : 
     818             : /** Copy method of SwNumRule
     819             : 
     820             :     A kind of copy constructor, so that the num formats are attached to the
     821             :     right CharFormats of a Document.
     822             :     Copies the NumFormats and returns itself. */
     823          70 : SwNumRule& SwNumRule::CopyNumRule( SwDoc* pDoc, const SwNumRule& rNumRule )
     824             : {
     825         770 :     for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
     826             :     {
     827         700 :         Set( n, rNumRule.maFormats[ n ] );
     828         700 :         if( maFormats[ n ] && maFormats[ n ]->GetCharFormat() &&
     829           0 :             !pDoc->GetCharFormats()->Contains( maFormats[n]->GetCharFormat() ))
     830             :             // If we copy across different Documents, then copy the
     831             :             // corresponding CharFormat into the new Document.
     832           0 :             maFormats[n]->SetCharFormat( pDoc->CopyCharFormat( *maFormats[n]->
     833           0 :                                         GetCharFormat() ) );
     834             :     }
     835          70 :     meRuleType = rNumRule.meRuleType;
     836          70 :     msName = rNumRule.msName;
     837          70 :     mbAutoRuleFlag = rNumRule.mbAutoRuleFlag;
     838          70 :     mnPoolFormatId = rNumRule.GetPoolFormatId();
     839          70 :     mnPoolHelpId = rNumRule.GetPoolHelpId();
     840          70 :     mnPoolHlpFileId = rNumRule.GetPoolHlpFileId();
     841          70 :     mbInvalidRuleFlag = true;
     842          70 :     return *this;
     843             : }
     844             : 
     845      155531 : void SwNumRule::SetSvxRule(const SvxNumRule& rNumRule, SwDoc* pDoc)
     846             : {
     847     1710841 :     for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
     848             :     {
     849     1555310 :         const SvxNumberFormat* pSvxFormat = rNumRule.Get(n);
     850     1555310 :         delete maFormats[n];
     851     1555310 :         maFormats[n] = pSvxFormat ? new SwNumFormat(*pSvxFormat, pDoc) : 0;
     852             :     }
     853             : 
     854      155531 :     mbInvalidRuleFlag = true;
     855      155531 :     mbContinusNum = rNumRule.IsContinuousNumbering();
     856      155531 : }
     857             : 
     858      169466 : SvxNumRule SwNumRule::MakeSvxNumRule() const
     859             : {
     860             :     SvxNumRule aRule(SvxNumRuleFlags::CONTINUOUS | SvxNumRuleFlags::CHAR_TEXT_DISTANCE | SvxNumRuleFlags::CHAR_STYLE |
     861      338932 :                      SvxNumRuleFlags::ENABLE_LINKED_BMP | SvxNumRuleFlags::ENABLE_EMBEDDED_BMP,
     862             :                      MAXLEVEL, mbContinusNum,
     863      338932 :                      meRuleType == NUM_RULE ? SvxNumRuleType::NUMBERING : SvxNumRuleType::OUTLINE_NUMBERING );
     864     1864126 :     for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
     865             :     {
     866     1694660 :         SwNumFormat aNumFormat = Get(n);
     867     1694660 :         if(aNumFormat.GetCharFormat())
     868       13023 :             aNumFormat.SetCharFormatName(aNumFormat.GetCharFormat()->GetName());
     869     1694660 :         aRule.SetLevel(n, aNumFormat, maFormats[n] != 0);
     870     1694660 :     }
     871      169466 :     return aRule;
     872             : }
     873             : 
     874      309284 : void SwNumRule::SetInvalidRule(bool bFlag)
     875             : {
     876      309284 :     if (bFlag)
     877             :     {
     878      153011 :         std::set< SwList* > aLists;
     879      153011 :         tTextNodeList::iterator aIter;
     880      156449 :         for ( aIter = maTextNodeList.begin(); aIter != maTextNodeList.end(); ++aIter )
     881             :         {
     882        3438 :             const SwTextNode* pTextNode = *aIter;
     883             :             // #i111681# - applying patch from cmc
     884        3438 :             SwList* pList = pTextNode->GetDoc()->getIDocumentListsAccess().getListByName( pTextNode->GetListId() );
     885             :             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.");
     886        3438 :             if ( pList )
     887             :             {
     888        3438 :                 aLists.insert( pList );
     889             :             }
     890             :         }
     891             :         std::for_each( aLists.begin(), aLists.end(),
     892      153011 :                        std::mem_fun( &SwList::InvalidateListTree ) );
     893             :     }
     894             : 
     895      309284 :     mbInvalidRuleFlag = bFlag;
     896      309284 : }
     897             : 
     898             : /// change indent of all list levels by given difference
     899           0 : void SwNumRule::ChangeIndent( const short nDiff )
     900             : {
     901           0 :     for ( sal_uInt16 i = 0; i < MAXLEVEL; ++i )
     902             :     {
     903           0 :         SwNumFormat aTmpNumFormat( Get(i) );
     904             : 
     905             :         const SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode(
     906           0 :                                         aTmpNumFormat.GetPositionAndSpaceMode() );
     907           0 :         if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
     908             :         {
     909             :             short nNewIndent = nDiff +
     910           0 :                                aTmpNumFormat.GetAbsLSpace();
     911           0 :             if ( nNewIndent < 0 )
     912             :             {
     913           0 :                 nNewIndent = 0;
     914             :             }
     915           0 :             aTmpNumFormat.SetAbsLSpace( nNewIndent );
     916             :         }
     917           0 :         else if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
     918             :         {
     919             :             // adjust also the list tab position, if a list tab stop is applied
     920           0 :             if ( aTmpNumFormat.GetLabelFollowedBy() == SvxNumberFormat::LISTTAB )
     921             :             {
     922           0 :                 const long nNewListTab = aTmpNumFormat.GetListtabPos() +  nDiff;
     923           0 :                 aTmpNumFormat.SetListtabPos( nNewListTab );
     924             :             }
     925             : 
     926           0 :             const long nNewIndent = nDiff +
     927           0 :                               aTmpNumFormat.GetIndentAt();
     928           0 :             aTmpNumFormat.SetIndentAt( nNewIndent );
     929             :         }
     930             : 
     931           0 :         Set( i, aTmpNumFormat );
     932           0 :     }
     933             : 
     934           0 :     SetInvalidRule( true );
     935           0 : }
     936             : 
     937             : /// set indent of certain list level to given value
     938           0 : void SwNumRule::SetIndent( const short nNewIndent,
     939             :                            const sal_uInt16 nListLevel )
     940             : {
     941           0 :     SwNumFormat aTmpNumFormat( Get(nListLevel) );
     942             : 
     943             :     const SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode(
     944           0 :                                         aTmpNumFormat.GetPositionAndSpaceMode() );
     945           0 :     if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
     946             :     {
     947           0 :         aTmpNumFormat.SetAbsLSpace( nNewIndent );
     948             :     }
     949           0 :     else if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
     950             :     {
     951             :         // adjust also the list tab position, if a list tab stop is applied
     952           0 :         if ( aTmpNumFormat.GetLabelFollowedBy() == SvxNumberFormat::LISTTAB )
     953             :         {
     954           0 :             const long nNewListTab = aTmpNumFormat.GetListtabPos() +
     955           0 :                                      ( nNewIndent - aTmpNumFormat.GetIndentAt() );
     956           0 :             aTmpNumFormat.SetListtabPos( nNewListTab );
     957             :         }
     958             : 
     959           0 :         aTmpNumFormat.SetIndentAt( nNewIndent );
     960             :     }
     961             : 
     962           0 :     SetInvalidRule( true );
     963           0 : }
     964             : 
     965             : /// set indent of first list level to given value and change other list level's
     966             : /// indents accordingly
     967           0 : void SwNumRule::SetIndentOfFirstListLevelAndChangeOthers( const short nNewIndent )
     968             : {
     969           0 :     SwNumFormat aTmpNumFormat( Get(0) );
     970             : 
     971           0 :     short nDiff( 0 );
     972             :     const SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode(
     973           0 :                                         aTmpNumFormat.GetPositionAndSpaceMode() );
     974           0 :     if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
     975             :     {
     976             :         nDiff = nNewIndent
     977           0 :                 - aTmpNumFormat.GetFirstLineOffset()
     978           0 :                 - aTmpNumFormat.GetAbsLSpace();
     979             :     }
     980           0 :     else if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
     981             :     {
     982             :         nDiff = static_cast<short>(nNewIndent
     983           0 :                                    - aTmpNumFormat.GetIndentAt());
     984             :     }
     985           0 :     if ( nDiff != 0  )
     986             :     {
     987           0 :         ChangeIndent( nDiff );
     988           0 :     }
     989           0 : }
     990             : 
     991      156273 : void SwNumRule::Validate()
     992             : {
     993      156273 :     std::set< SwList* > aLists;
     994      156273 :     tTextNodeList::iterator aIter;
     995      158665 :     for ( aIter = maTextNodeList.begin(); aIter != maTextNodeList.end(); ++aIter )
     996             :     {
     997        2392 :         const SwTextNode* pTextNode = *aIter;
     998        2392 :         aLists.insert( pTextNode->GetDoc()->getIDocumentListsAccess().getListByName( pTextNode->GetListId() ) );
     999             :     }
    1000             :     std::for_each( aLists.begin(), aLists.end(),
    1001      156273 :                    std::mem_fun( &SwList::ValidateListTree ) );
    1002             : 
    1003      156273 :     SetInvalidRule(false);
    1004      156273 : }
    1005             : 
    1006        2989 : void SwNumRule::SetCountPhantoms(bool bCountPhantoms)
    1007             : {
    1008        2989 :     mbCountPhantoms = bCountPhantoms;
    1009        2989 : }
    1010             : 
    1011        1189 : SwNumRule::tParagraphStyleList::size_type SwNumRule::GetParagraphStyleListSize() const
    1012             : {
    1013        1189 :     return maParagraphStyleList.size();
    1014             : }
    1015             : 
    1016        1902 : void SwNumRule::AddParagraphStyle( SwTextFormatColl& rTextFormatColl )
    1017             : {
    1018             :     tParagraphStyleList::iterator aIter =
    1019        1902 :         std::find( maParagraphStyleList.begin(), maParagraphStyleList.end(), &rTextFormatColl );
    1020             : 
    1021        1902 :     if ( aIter == maParagraphStyleList.end() )
    1022             :     {
    1023        1693 :         maParagraphStyleList.push_back( &rTextFormatColl );
    1024             :     }
    1025        1902 : }
    1026             : 
    1027           7 : void SwNumRule::RemoveParagraphStyle( SwTextFormatColl& rTextFormatColl )
    1028             : {
    1029             :     tParagraphStyleList::iterator aIter =
    1030           7 :         std::find( maParagraphStyleList.begin(), maParagraphStyleList.end(), &rTextFormatColl );
    1031             : 
    1032           7 :     if ( aIter != maParagraphStyleList.end() )
    1033             :     {
    1034           7 :         maParagraphStyleList.erase( aIter );
    1035             :     }
    1036           7 : }
    1037             : 
    1038           0 : void SwNumRule::dumpAsXml(xmlTextWriterPtr pWriter) const
    1039             : {
    1040           0 :     xmlTextWriterStartElement(pWriter, BAD_CAST("swNumRule"));
    1041           0 :     xmlTextWriterWriteAttribute(pWriter, BAD_CAST("msName"), BAD_CAST(msName.toUtf8().getStr()));
    1042           0 :     xmlTextWriterWriteAttribute(pWriter, BAD_CAST("mnPoolFormatId"), BAD_CAST(OString::number(mnPoolFormatId).getStr()));
    1043           0 :     xmlTextWriterWriteAttribute(pWriter, BAD_CAST("mbAutoRuleFlag"), BAD_CAST(OString::boolean(mbAutoRuleFlag).getStr()));
    1044           0 :     xmlTextWriterEndElement(pWriter);
    1045           0 : }
    1046             : 
    1047        4641 : void SwNumRule::GetGrabBagItem(uno::Any& rVal) const
    1048             : {
    1049        4641 :     if (mpGrabBagItem.get())
    1050        4437 :         mpGrabBagItem->QueryValue(rVal);
    1051             :     else
    1052             :     {
    1053         204 :         uno::Sequence<beans::PropertyValue> aValue(0);
    1054         204 :         rVal = uno::makeAny(aValue);
    1055             :     }
    1056        4641 : }
    1057             : 
    1058       13571 : void SwNumRule::SetGrabBagItem(const uno::Any& rVal)
    1059             : {
    1060       13571 :     if (!mpGrabBagItem.get())
    1061       13571 :         mpGrabBagItem.reset(new SfxGrabBagItem);
    1062             : 
    1063       13571 :     mpGrabBagItem->PutValue(rVal);
    1064       13571 : }
    1065             : 
    1066             : namespace numfunc
    1067             : {
    1068             :     /** class containing default bullet list configuration data */
    1069             :     class SwDefBulletConfig : private utl::ConfigItem
    1070             :     {
    1071             :         public:
    1072             :             static SwDefBulletConfig& getInstance();
    1073             : 
    1074           1 :             inline OUString GetFontname() const
    1075             :             {
    1076           1 :                 return msFontname;
    1077             :             }
    1078             : 
    1079           0 :             inline bool IsFontnameUserDefined() const
    1080             :             {
    1081           0 :                 return mbUserDefinedFontname;
    1082             :             }
    1083             : 
    1084         153 :             inline const vcl::Font& GetFont() const
    1085             :             {
    1086         153 :                 return *mpFont;
    1087             :             }
    1088             : 
    1089      102400 :             inline sal_Unicode GetChar( sal_uInt8 p_nListLevel ) const
    1090             :             {
    1091      102400 :                 if (p_nListLevel >= MAXLEVEL)
    1092             :                 {
    1093           0 :                     p_nListLevel = MAXLEVEL - 1;
    1094             :                 }
    1095             : 
    1096      102400 :                 return mnLevelChars[p_nListLevel];
    1097             :             }
    1098             : 
    1099             :             SwDefBulletConfig();
    1100             :             virtual ~SwDefBulletConfig();
    1101             : 
    1102             :         private:
    1103             :             /** sets internal default bullet configuration data to default values */
    1104             :             void SetToDefault();
    1105             : 
    1106             :             /** returns sequence of default bullet configuration property names */
    1107             :             static uno::Sequence<OUString> GetPropNames();
    1108             : 
    1109             :             /** loads default bullet configuration properties and applies
    1110             :                 values to internal data */
    1111             :             void LoadConfig();
    1112             : 
    1113             :             /** initialize font instance for default bullet list */
    1114             :             void InitFont();
    1115             : 
    1116             :             /** catches notification about changed default bullet configuration data */
    1117             :             virtual void Notify( const uno::Sequence<OUString>& aPropertyNames ) SAL_OVERRIDE;
    1118             :             virtual void ImplCommit() SAL_OVERRIDE;
    1119             : 
    1120             :             // default bullet list configuration data
    1121             :             OUString msFontname;
    1122             :             bool mbUserDefinedFontname;
    1123             :             FontWeight meFontWeight;
    1124             :             FontItalic meFontItalic;
    1125             :             sal_Unicode mnLevelChars[MAXLEVEL];
    1126             : 
    1127             :             // default bullet list font instance
    1128             :             vcl::Font* mpFont;
    1129             :     };
    1130             : 
    1131             :     namespace
    1132             :     {
    1133             :         class theSwDefBulletConfig
    1134             :             : public rtl::Static<SwDefBulletConfig, theSwDefBulletConfig>{};
    1135             :     }
    1136             : 
    1137      102554 :     SwDefBulletConfig& SwDefBulletConfig::getInstance()
    1138             :     {
    1139      102554 :         return theSwDefBulletConfig::get();
    1140             :     }
    1141             : 
    1142          58 :     SwDefBulletConfig::SwDefBulletConfig()
    1143             :         : ConfigItem( OUString("Office.Writer/Numbering/DefaultBulletList") ),
    1144             :           // default bullet font is now OpenSymbol
    1145             :           msFontname( OUString("OpenSymbol") ),
    1146             :           mbUserDefinedFontname( false ),
    1147             :           meFontWeight( WEIGHT_DONTKNOW ),
    1148             :           meFontItalic( ITALIC_NONE ),
    1149          58 :           mpFont( 0 )
    1150             :     {
    1151          58 :         SetToDefault();
    1152          58 :         LoadConfig();
    1153          58 :         InitFont();
    1154             : 
    1155             :         // enable notification for changes on default bullet configuration change
    1156          58 :         EnableNotification( GetPropNames() );
    1157          58 :     }
    1158             : 
    1159         116 :     SwDefBulletConfig::~SwDefBulletConfig()
    1160             :     {
    1161          58 :         delete mpFont;
    1162          58 :     }
    1163             : 
    1164          58 :     void SwDefBulletConfig::SetToDefault()
    1165             :     {
    1166          58 :         msFontname = "OpenSymbol";
    1167          58 :         mbUserDefinedFontname = false;
    1168          58 :         meFontWeight = WEIGHT_DONTKNOW;
    1169          58 :         meFontItalic = ITALIC_NONE;
    1170             : 
    1171          58 :         mnLevelChars[0] = 0x2022;
    1172          58 :         mnLevelChars[1] = 0x25e6;
    1173          58 :         mnLevelChars[2] = 0x25aa;
    1174          58 :         mnLevelChars[3] = 0x2022;
    1175          58 :         mnLevelChars[4] = 0x25e6;
    1176          58 :         mnLevelChars[5] = 0x25aa;
    1177          58 :         mnLevelChars[6] = 0x2022;
    1178          58 :         mnLevelChars[7] = 0x25e6;
    1179          58 :         mnLevelChars[8] = 0x25aa;
    1180          58 :         mnLevelChars[9] = 0x2022;
    1181          58 :     }
    1182             : 
    1183         116 :     uno::Sequence<OUString> SwDefBulletConfig::GetPropNames()
    1184             :     {
    1185         116 :         uno::Sequence<OUString> aPropNames(13);
    1186         116 :         OUString* pNames = aPropNames.getArray();
    1187         116 :         pNames[0] = "BulletFont/FontFamilyname";
    1188         116 :         pNames[1] = "BulletFont/FontWeight";
    1189         116 :         pNames[2] = "BulletFont/FontItalic";
    1190         116 :         pNames[3] = "BulletCharLvl1";
    1191         116 :         pNames[4] = "BulletCharLvl2";
    1192         116 :         pNames[5] = "BulletCharLvl3";
    1193         116 :         pNames[6] = "BulletCharLvl4";
    1194         116 :         pNames[7] = "BulletCharLvl5";
    1195         116 :         pNames[8] = "BulletCharLvl6";
    1196         116 :         pNames[9] = "BulletCharLvl7";
    1197         116 :         pNames[10] = "BulletCharLvl8";
    1198         116 :         pNames[11] = "BulletCharLvl9";
    1199         116 :         pNames[12] = "BulletCharLvl10";
    1200             : 
    1201         116 :         return aPropNames;
    1202             :     }
    1203             : 
    1204          58 :     void SwDefBulletConfig::LoadConfig()
    1205             :     {
    1206          58 :         uno::Sequence<OUString> aPropNames = GetPropNames();
    1207             :         uno::Sequence<uno::Any> aValues =
    1208         116 :                                                     GetProperties( aPropNames );
    1209          58 :         const uno::Any* pValues = aValues.getConstArray();
    1210             :         OSL_ENSURE( aValues.getLength() == aPropNames.getLength(),
    1211             :                 "<SwDefBulletConfig::SwDefBulletConfig()> - GetProperties failed");
    1212          58 :         if ( aValues.getLength() == aPropNames.getLength() )
    1213             :         {
    1214         812 :             for ( int nProp = 0; nProp < aPropNames.getLength(); ++nProp )
    1215             :             {
    1216         754 :                 if ( pValues[nProp].hasValue() )
    1217             :                 {
    1218           0 :                     switch ( nProp )
    1219             :                     {
    1220             :                         case 0:
    1221             :                         {
    1222           0 :                             OUString aStr;
    1223           0 :                             pValues[nProp] >>= aStr;
    1224           0 :                             msFontname = aStr;
    1225           0 :                             mbUserDefinedFontname = true;
    1226             :                         }
    1227           0 :                         break;
    1228             :                         case 1:
    1229             :                         case 2:
    1230             :                         {
    1231           0 :                             sal_uInt8 nTmp = 0;
    1232           0 :                             pValues[nProp] >>= nTmp;
    1233           0 :                             if ( nProp == 1 )
    1234           0 :                                 meFontWeight = static_cast<FontWeight>(nTmp);
    1235           0 :                             else if ( nProp == 2 )
    1236           0 :                                 meFontItalic = static_cast<FontItalic>(nTmp);
    1237             :                         }
    1238           0 :                         break;
    1239             :                         case 3:
    1240             :                         case 4:
    1241             :                         case 5:
    1242             :                         case 6:
    1243             :                         case 7:
    1244             :                         case 8:
    1245             :                         case 9:
    1246             :                         case 10:
    1247             :                         case 11:
    1248             :                         case 12:
    1249             :                         {
    1250           0 :                             sal_Unicode cChar = sal_Unicode();
    1251           0 :                             pValues[nProp] >>= cChar;
    1252           0 :                             mnLevelChars[nProp-3] = cChar;
    1253             :                         }
    1254           0 :                         break;
    1255             :                     }
    1256             :                 }
    1257             :             }
    1258          58 :         }
    1259             : 
    1260          58 :     }
    1261             : 
    1262          58 :     void SwDefBulletConfig::InitFont()
    1263             :     {
    1264          58 :         delete mpFont;
    1265             : 
    1266          58 :         mpFont = new vcl::Font( msFontname, OUString(), Size( 0, 14 ) );
    1267          58 :         mpFont->SetWeight( meFontWeight );
    1268          58 :         mpFont->SetItalic( meFontItalic );
    1269          58 :         mpFont->SetCharSet( RTL_TEXTENCODING_SYMBOL );
    1270          58 :     }
    1271             : 
    1272           0 :     void SwDefBulletConfig::Notify( const uno::Sequence<OUString>& )
    1273             :     {
    1274           0 :         SetToDefault();
    1275           0 :         LoadConfig();
    1276           0 :         InitFont();
    1277           0 :     }
    1278             : 
    1279           0 :     void SwDefBulletConfig::ImplCommit()
    1280             :     {
    1281           0 :     }
    1282             : 
    1283           1 :     OUString GetDefBulletFontname()
    1284             :     {
    1285           1 :         return SwDefBulletConfig::getInstance().GetFontname();
    1286             :     }
    1287             : 
    1288           0 :     bool IsDefBulletFontUserDefined()
    1289             :     {
    1290           0 :         return SwDefBulletConfig::getInstance().IsFontnameUserDefined();
    1291             :     }
    1292             : 
    1293         153 :     const vcl::Font& GetDefBulletFont()
    1294             :     {
    1295         153 :         return SwDefBulletConfig::getInstance().GetFont();
    1296             :     }
    1297             : 
    1298      102400 :     sal_Unicode GetBulletChar( sal_uInt8 nLevel )
    1299             :     {
    1300      102400 :         return SwDefBulletConfig::getInstance().GetChar( nLevel );
    1301             :     }
    1302             : 
    1303             :     /** class containing configuration data about user interface behavior
    1304             :         regarding lists and list items.
    1305             :         configuration item about behavior of <TAB>/<SHIFT-TAB>-key at first
    1306             :         position of first list item
    1307             :     */
    1308           0 :     class SwNumberingUIBehaviorConfig : private utl::ConfigItem
    1309             :     {
    1310             :         public:
    1311             :             static SwNumberingUIBehaviorConfig& getInstance();
    1312             : 
    1313           0 :             inline bool ChangeIndentOnTabAtFirstPosOfFirstListItem() const
    1314             :             {
    1315           0 :                 return mbChangeIndentOnTabAtFirstPosOfFirstListItem;
    1316             :             }
    1317             : 
    1318             :             SwNumberingUIBehaviorConfig();
    1319             : 
    1320             :         private:
    1321             : 
    1322             :             /** sets internal configuration data to default values */
    1323             :             void SetToDefault();
    1324             : 
    1325             :             /** returns sequence of configuration property names */
    1326             :             static com::sun::star::uno::Sequence<OUString> GetPropNames();
    1327             : 
    1328             :             /** loads configuration properties and applies values to internal data */
    1329             :             void LoadConfig();
    1330             : 
    1331             :             /** catches notification about changed configuration data */
    1332             :             virtual void Notify( const com::sun::star::uno::Sequence<OUString>& aPropertyNames ) SAL_OVERRIDE;
    1333             :             virtual void ImplCommit() SAL_OVERRIDE;
    1334             : 
    1335             :             // configuration data
    1336             :             bool mbChangeIndentOnTabAtFirstPosOfFirstListItem;
    1337             :     };
    1338             : 
    1339             :     namespace
    1340             :     {
    1341             :         class theSwNumberingUIBehaviorConfig : public rtl::Static<SwNumberingUIBehaviorConfig, theSwNumberingUIBehaviorConfig>{};
    1342             :     }
    1343             : 
    1344           0 :     SwNumberingUIBehaviorConfig& SwNumberingUIBehaviorConfig::getInstance()
    1345             :     {
    1346           0 :         return theSwNumberingUIBehaviorConfig::get();
    1347             :     }
    1348             : 
    1349           0 :     SwNumberingUIBehaviorConfig::SwNumberingUIBehaviorConfig()
    1350             :         : ConfigItem( OUString("Office.Writer/Numbering/UserInterfaceBehavior") ),
    1351           0 :           mbChangeIndentOnTabAtFirstPosOfFirstListItem( true )
    1352             :     {
    1353           0 :         SetToDefault();
    1354           0 :         LoadConfig();
    1355             : 
    1356             :         // enable notification for changes on configuration change
    1357           0 :         EnableNotification( GetPropNames() );
    1358           0 :     }
    1359             : 
    1360           0 :     void SwNumberingUIBehaviorConfig::SetToDefault()
    1361             :     {
    1362           0 :         mbChangeIndentOnTabAtFirstPosOfFirstListItem = true;
    1363           0 :     }
    1364             : 
    1365           0 :     com::sun::star::uno::Sequence<OUString> SwNumberingUIBehaviorConfig::GetPropNames()
    1366             :     {
    1367           0 :         com::sun::star::uno::Sequence<OUString> aPropNames(1);
    1368           0 :         OUString* pNames = aPropNames.getArray();
    1369           0 :         pNames[0] = "ChangeIndentOnTabAtFirstPosOfFirstListItem";
    1370             : 
    1371           0 :         return aPropNames;
    1372             :     }
    1373             : 
    1374           0 :     void SwNumberingUIBehaviorConfig::ImplCommit() {}
    1375             : 
    1376           0 :     void SwNumberingUIBehaviorConfig::LoadConfig()
    1377             :     {
    1378           0 :         com::sun::star::uno::Sequence<OUString> aPropNames = GetPropNames();
    1379             :         com::sun::star::uno::Sequence<com::sun::star::uno::Any> aValues =
    1380           0 :                                                     GetProperties( aPropNames );
    1381           0 :         const com::sun::star::uno::Any* pValues = aValues.getConstArray();
    1382             :         OSL_ENSURE( aValues.getLength() == aPropNames.getLength(),
    1383             :                 "<SwNumberingUIBehaviorConfig::LoadConfig()> - GetProperties failed");
    1384           0 :         if ( aValues.getLength() == aPropNames.getLength() )
    1385             :         {
    1386           0 :             for ( int nProp = 0; nProp < aPropNames.getLength(); ++nProp )
    1387             :             {
    1388           0 :                 if ( pValues[nProp].hasValue() )
    1389             :                 {
    1390           0 :                     switch ( nProp )
    1391             :                     {
    1392             :                         case 0:
    1393             :                         {
    1394           0 :                             pValues[nProp] >>= mbChangeIndentOnTabAtFirstPosOfFirstListItem;
    1395             :                         }
    1396           0 :                         break;
    1397             :                         default:
    1398             :                         {
    1399             :                             OSL_FAIL( "<SwNumberingUIBehaviorConfig::LoadConfig()> - unknown configuration property");
    1400             :                         }
    1401             :                     }
    1402             :                 }
    1403             :             }
    1404           0 :         }
    1405           0 :     }
    1406             : 
    1407           0 :     void SwNumberingUIBehaviorConfig::Notify( const com::sun::star::uno::Sequence<OUString>& aPropertyNames )
    1408             :     {
    1409             :         (void) aPropertyNames;
    1410           0 :         SetToDefault();
    1411           0 :         LoadConfig();
    1412           0 :     }
    1413             : 
    1414           0 :     bool ChangeIndentOnTabAtFirstPosOfFirstListItem()
    1415             :     {
    1416           0 :         return SwNumberingUIBehaviorConfig::getInstance().ChangeIndentOnTabAtFirstPosOfFirstListItem();
    1417             :     }
    1418             : 
    1419       21949 :     SvxNumberFormat::SvxNumPositionAndSpaceMode GetDefaultPositionAndSpaceMode()
    1420             :     {
    1421             :         SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode;
    1422       21949 :         SvtSaveOptions aSaveOptions;
    1423       21949 :         switch ( aSaveOptions.GetODFDefaultVersion() )
    1424             :         {
    1425             :             case SvtSaveOptions::ODFVER_010:
    1426             :             case SvtSaveOptions::ODFVER_011:
    1427             :             {
    1428           0 :                 ePosAndSpaceMode = SvxNumberFormat::LABEL_WIDTH_AND_POSITION;
    1429             :             }
    1430           0 :             break;
    1431             :             default: // ODFVER_UNKNOWN or ODFVER_012
    1432             :             {
    1433       21949 :                 ePosAndSpaceMode = SvxNumberFormat::LABEL_ALIGNMENT;
    1434             :             }
    1435             :         }
    1436             : 
    1437       21949 :         return ePosAndSpaceMode;
    1438             :     }
    1439             : }
    1440             : 
    1441           0 : void SwNumRuleTable::dumpAsXml(xmlTextWriterPtr pWriter) const
    1442             : {
    1443           0 :     xmlTextWriterStartElement(pWriter, BAD_CAST("swNumRuleTable"));
    1444           0 :     for (SwNumRule* pNumRule : *this)
    1445           0 :         pNumRule->dumpAsXml(pWriter);
    1446           0 :     xmlTextWriterEndElement(pWriter);
    1447         177 : }
    1448             : 
    1449             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11