LCOV - code coverage report
Current view: top level - editeng/source/items - numitem.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 275 550 50.0 %
Date: 2014-11-03 Functions: 44 63 69.8 %
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             : 
      21             : #include <editeng/numitem.hxx>
      22             : 
      23             : #include <com/sun/star/text/HoriOrientation.hpp>
      24             : #include <com/sun/star/text/VertOrientation.hpp>
      25             : #include <com/sun/star/text/RelOrientation.hpp>
      26             : #include <editeng/brushitem.hxx>
      27             : #include <vcl/font.hxx>
      28             : #include <vcl/settings.hxx>
      29             : #include <editeng/editids.hrc>
      30             : #include <editeng/editrids.hrc>
      31             : #include <editeng/numdef.hxx>
      32             : #include <editeng/eeitem.hxx>
      33             : #include <vcl/graph.hxx>
      34             : #include <vcl/window.hxx>
      35             : #include <vcl/svapp.hxx>
      36             : #include <editeng/unolingu.hxx>
      37             : #include <com/sun/star/text/XNumberingFormatter.hpp>
      38             : #include <com/sun/star/text/DefaultNumberingProvider.hpp>
      39             : #include <com/sun/star/text/XDefaultNumberingProvider.hpp>
      40             : #include <com/sun/star/style/NumberingType.hpp>
      41             : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      42             : #include <com/sun/star/beans/PropertyValue.hpp>
      43             : #include <comphelper/processfactory.hxx>
      44             : #include <tools/mapunit.hxx>
      45             : 
      46             : #include <editeng/unonrule.hxx>
      47             : 
      48             : #define DEF_WRITER_LSPACE   500     //Standard Indentation
      49             : #define DEF_DRAW_LSPACE     800     //Standard Indentation
      50             : 
      51             : #define NUMITEM_VERSION_03        0x03
      52             : #define NUMITEM_VERSION_04        0x04
      53             : 
      54             : using namespace ::com::sun::star;
      55             : using namespace ::com::sun::star::lang;
      56             : using namespace ::com::sun::star::uno;
      57             : using namespace ::com::sun::star::text;
      58             : using namespace ::com::sun::star::beans;
      59             : using namespace ::com::sun::star::style;
      60             : 
      61             : sal_Int32 SvxNumberType::nRefCount = 0;
      62         223 : com::sun::star::uno::Reference<com::sun::star::text::XNumberingFormatter> SvxNumberType::xFormatter = 0;
      63       15694 : static void lcl_getFormatter(com::sun::star::uno::Reference<com::sun::star::text::XNumberingFormatter>& _xFormatter)
      64             : {
      65       15694 :     if(!_xFormatter.is())
      66             :        {
      67             :         try
      68             :         {
      69          78 :             Reference<XComponentContext>         xContext( ::comphelper::getProcessComponentContext() );
      70         156 :             Reference<XDefaultNumberingProvider> xRet = text::DefaultNumberingProvider::create(xContext);
      71         156 :             _xFormatter = Reference<XNumberingFormatter> (xRet, UNO_QUERY);
      72             :         }
      73           0 :         catch(const Exception&)
      74             :         {
      75             :             SAL_WARN("editeng", "service missing: \"com.sun.star.text.DefaultNumberingProvider\"");
      76             :         }
      77             :     }
      78       15694 : }
      79             : 
      80     3563734 : SvxNumberType::SvxNumberType(sal_Int16 nType) :
      81             :     nNumType(nType),
      82     3563734 :     bShowSymbol(true)
      83             : {
      84     3563734 :     nRefCount++;
      85     3563734 : }
      86             : 
      87    30102838 : SvxNumberType::SvxNumberType(const SvxNumberType& rType) :
      88             :     nNumType(rType.nNumType),
      89    30102838 :     bShowSymbol(rType.bShowSymbol)
      90             : {
      91    30102838 :     nRefCount++;
      92    30102838 : }
      93             : 
      94    33666084 : SvxNumberType::~SvxNumberType()
      95             : {
      96    33666084 :     if(!--nRefCount)
      97         163 :         xFormatter = 0;
      98    33666084 : }
      99             : 
     100       15694 : OUString SvxNumberType::GetNumStr( sal_uLong nNo ) const
     101             : {
     102       15694 :     const LanguageTag& rLang = Application::GetSettings().GetLanguageTag();
     103       15694 :     return GetNumStr( nNo, rLang.getLocale() );
     104             : }
     105             : 
     106       15694 : OUString SvxNumberType::GetNumStr( sal_uLong nNo, const Locale& rLocale ) const
     107             : {
     108       15694 :     lcl_getFormatter(xFormatter);
     109       15694 :     if(!xFormatter.is())
     110           0 :         return OUString();
     111             : 
     112       15694 :     if(bShowSymbol)
     113             :     {
     114       15694 :         switch(nNumType)
     115             :         {
     116             :             case NumberingType::CHAR_SPECIAL:
     117             :             case NumberingType::BITMAP:
     118           0 :             break;
     119             :             default:
     120             :                 {
     121             :                     // '0' allowed for ARABIC numberings
     122       15694 :                     if(NumberingType::ARABIC == nNumType && 0 == nNo )
     123        2156 :                         return OUString('0');
     124             :                     else
     125             :                     {
     126       13538 :                         Sequence< PropertyValue > aProperties(2);
     127       13538 :                         PropertyValue* pValues = aProperties.getArray();
     128       13538 :                         pValues[0].Name = "NumberingType";
     129       13538 :                         pValues[0].Value <<= nNumType;
     130       13538 :                         pValues[1].Name = "Value";
     131       13538 :                         pValues[1].Value <<= (sal_Int32)nNo;
     132             : 
     133             :                         try
     134             :                         {
     135       13538 :                             return xFormatter->makeNumberingString( aProperties, rLocale );
     136             :                         }
     137           0 :                         catch(const Exception&)
     138             :                         {
     139           0 :                         }
     140             :                     }
     141             :                 }
     142             :         }
     143             :     }
     144           0 :     return OUString();
     145             : }
     146             : 
     147     3525434 : SvxNumberFormat::SvxNumberFormat( sal_Int16 eType,
     148             :                                   SvxNumPositionAndSpaceMode ePositionAndSpaceMode )
     149             :     : SvxNumberType(eType),
     150             :       eNumAdjust(SVX_ADJUST_LEFT),
     151             :       nInclUpperLevels(0),
     152             :       nStart(1),
     153             :       cBullet(SVX_DEF_BULLET),
     154             :       nBulletRelSize(100),
     155             :       nBulletColor(COL_BLACK),
     156             :       mePositionAndSpaceMode( ePositionAndSpaceMode ),
     157             :       nFirstLineOffset(0),
     158             :       nAbsLSpace(0),
     159             :       nLSpace(0),
     160             :       nCharTextDistance(0),
     161             :       meLabelFollowedBy( LISTTAB ),
     162             :       mnListtabPos( 0 ),
     163             :       mnFirstLineIndent( 0 ),
     164             :       mnIndentAt( 0 ),
     165             :       pGraphicBrush(0),
     166             :       eVertOrient(text::VertOrientation::NONE),
     167     3525434 :       pBulletFont(0)
     168             : {
     169     3525434 : }
     170             : 
     171    30081956 : SvxNumberFormat::SvxNumberFormat(const SvxNumberFormat& rFormat) :
     172             :     SvxNumberType(rFormat),
     173             :     mePositionAndSpaceMode( rFormat.mePositionAndSpaceMode ),
     174             :     pGraphicBrush(0),
     175    30081956 :     pBulletFont(0)
     176             : {
     177    30081956 :     *this = rFormat;
     178    30081956 : }
     179             : 
     180           0 : SvxNumberFormat::SvxNumberFormat( SvStream &rStream )
     181             :     : nStart(0)
     182             :     , nBulletRelSize(100)
     183             :     , nFirstLineOffset(0)
     184             :     , nAbsLSpace(0)
     185             :     , nLSpace(0)
     186           0 :     , nCharTextDistance(0)
     187             : {
     188           0 :     sal_uInt16 nTmp16(0);
     189           0 :     sal_Int32  nTmp32(0);
     190           0 :     rStream.ReadUInt16( nTmp16 ); // Version number
     191             : 
     192           0 :     rStream.ReadUInt16( nTmp16 ); SetNumberingType( nTmp16 );
     193           0 :     rStream.ReadUInt16( nTmp16 ); eNumAdjust = ( SvxAdjust )nTmp16;
     194           0 :     rStream.ReadUInt16( nTmp16 ); nInclUpperLevels = nTmp16;
     195           0 :     rStream.ReadUInt16( nStart );
     196           0 :     rStream.ReadUInt16( nTmp16 ); cBullet = (sal_Unicode)nTmp16;
     197             : 
     198           0 :     rStream.ReadInt16( nFirstLineOffset );
     199           0 :     rStream.ReadInt16( nAbsLSpace );
     200           0 :     rStream.ReadInt16( nLSpace );
     201             : 
     202           0 :     rStream.ReadInt16( nCharTextDistance );
     203             : 
     204           0 :     sPrefix = rStream.ReadUniOrByteString( rStream.GetStreamCharSet() );
     205           0 :     sSuffix = rStream.ReadUniOrByteString( rStream.GetStreamCharSet() );
     206           0 :     sCharStyleName = rStream.ReadUniOrByteString( rStream.GetStreamCharSet() );
     207             : 
     208           0 :     sal_uInt16 hasGraphicBrush = 0;
     209           0 :     rStream.ReadUInt16( hasGraphicBrush );
     210           0 :     if ( hasGraphicBrush )
     211             :     {
     212           0 :         pGraphicBrush = new SvxBrushItem( SID_ATTR_BRUSH );
     213           0 :         pGraphicBrush = static_cast<SvxBrushItem*>(pGraphicBrush->Create( rStream, BRUSH_GRAPHIC_VERSION ));
     214             :     }
     215           0 :     else pGraphicBrush = 0;
     216           0 :     rStream.ReadUInt16( nTmp16 ); eVertOrient = nTmp16;
     217             : 
     218           0 :     sal_uInt16 hasBulletFont = 0;
     219           0 :     rStream.ReadUInt16( hasBulletFont );
     220           0 :     if ( hasBulletFont )
     221             :     {
     222           0 :         pBulletFont = new vcl::Font( );
     223           0 :         ReadFont( rStream, *pBulletFont );
     224             :     }
     225           0 :     else pBulletFont = NULL;
     226           0 :     ReadPair( rStream, aGraphicSize );
     227             : 
     228           0 :     ReadColor( rStream, nBulletColor );
     229           0 :     rStream.ReadUInt16( nBulletRelSize );
     230           0 :     rStream.ReadUInt16( nTmp16 ); SetShowSymbol( nTmp16 );
     231             : 
     232           0 :     rStream.ReadUInt16( nTmp16 ); mePositionAndSpaceMode = ( SvxNumPositionAndSpaceMode )nTmp16;
     233           0 :     rStream.ReadUInt16( nTmp16 ); meLabelFollowedBy = ( LabelFollowedBy )nTmp16;
     234           0 :     rStream.ReadInt32( nTmp32 ); mnListtabPos = nTmp32;
     235           0 :     rStream.ReadInt32( nTmp32 ); mnFirstLineIndent = nTmp32;
     236           0 :     rStream.ReadInt32( nTmp32 ); mnIndentAt = nTmp32;
     237           0 : }
     238             : 
     239    84718304 : SvxNumberFormat::~SvxNumberFormat()
     240             : {
     241    33606930 :     delete pGraphicBrush;
     242    33606930 :     delete pBulletFont;
     243    51111374 : }
     244             : 
     245           0 : SvStream&   SvxNumberFormat::Store(SvStream &rStream, FontToSubsFontConverter pConverter)
     246             : {
     247           0 :     if(pConverter && pBulletFont)
     248             :     {
     249           0 :         cBullet = ConvertFontToSubsFontChar(pConverter, cBullet);
     250           0 :         OUString sFontName = GetFontToSubsFontName(pConverter);
     251           0 :         pBulletFont->SetName(sFontName);
     252             :     }
     253             : 
     254           0 :     rStream.WriteUInt16( NUMITEM_VERSION_04 );
     255             : 
     256           0 :     rStream.WriteUInt16( GetNumberingType() );
     257           0 :     rStream.WriteUInt16( eNumAdjust );
     258           0 :     rStream.WriteUInt16( nInclUpperLevels );
     259           0 :     rStream.WriteUInt16( nStart );
     260           0 :     rStream.WriteUInt16( cBullet );
     261             : 
     262           0 :     rStream.WriteInt16( nFirstLineOffset );
     263           0 :     rStream.WriteInt16( nAbsLSpace );
     264           0 :     rStream.WriteInt16( nLSpace );
     265             : 
     266           0 :     rStream.WriteInt16( nCharTextDistance );
     267           0 :     rtl_TextEncoding eEnc = osl_getThreadTextEncoding();
     268           0 :     rStream.WriteUniOrByteString(sPrefix, eEnc);
     269           0 :     rStream.WriteUniOrByteString(sSuffix, eEnc);
     270           0 :     rStream.WriteUniOrByteString(sCharStyleName, eEnc);
     271           0 :     if(pGraphicBrush)
     272             :     {
     273           0 :         rStream.WriteUInt16( 1 );
     274             : 
     275             :         // in SD or SI force bullet itself to be stored,
     276             :         // for that purpose throw away link when link and graphic
     277             :         // are present, so Brush save is forced
     278           0 :         if(!pGraphicBrush->GetGraphicLink().isEmpty() && pGraphicBrush->GetGraphic())
     279             :         {
     280           0 :             pGraphicBrush->SetGraphicLink("");
     281             :         }
     282             : 
     283           0 :         pGraphicBrush->Store(rStream, BRUSH_GRAPHIC_VERSION);
     284             :     }
     285             :     else
     286           0 :         rStream.WriteUInt16( 0 );
     287             : 
     288           0 :     rStream.WriteUInt16( eVertOrient );
     289           0 :     if(pBulletFont)
     290             :     {
     291           0 :         rStream.WriteUInt16( 1 );
     292           0 :         WriteFont( rStream, *pBulletFont );
     293             :     }
     294             :     else
     295           0 :         rStream.WriteUInt16( 0 );
     296           0 :     WritePair( rStream, aGraphicSize );
     297             : 
     298           0 :     Color nTempColor = nBulletColor;
     299           0 :     if(COL_AUTO == nBulletColor.GetColor())
     300           0 :         nTempColor = COL_BLACK;
     301           0 :     WriteColor( rStream, nTempColor );
     302           0 :     rStream.WriteUInt16( nBulletRelSize );
     303           0 :     rStream.WriteUInt16( (sal_uInt16)IsShowSymbol() );
     304             : 
     305           0 :     rStream.WriteUInt16(  mePositionAndSpaceMode );
     306           0 :     rStream.WriteUInt16(  meLabelFollowedBy );
     307           0 :     rStream.WriteInt32( mnListtabPos );
     308           0 :     rStream.WriteInt32( mnFirstLineIndent );
     309           0 :     rStream.WriteInt32( mnIndentAt );
     310             : 
     311           0 :     return rStream;
     312             : }
     313             : 
     314    30102396 : SvxNumberFormat& SvxNumberFormat::operator=( const SvxNumberFormat& rFormat )
     315             : {
     316    30102396 :     if (& rFormat == this) { return *this; }
     317             : 
     318    30102396 :     SetNumberingType(rFormat.GetNumberingType());
     319    30102396 :         eNumAdjust          = rFormat.eNumAdjust ;
     320    30102396 :         nInclUpperLevels    = rFormat.nInclUpperLevels ;
     321    30102396 :         nStart              = rFormat.nStart ;
     322    30102396 :         cBullet             = rFormat.cBullet ;
     323    30102396 :         mePositionAndSpaceMode = rFormat.mePositionAndSpaceMode;
     324    30102396 :         nFirstLineOffset    = rFormat.nFirstLineOffset;
     325    30102396 :         nAbsLSpace          = rFormat.nAbsLSpace ;
     326    30102396 :         nLSpace             = rFormat.nLSpace ;
     327    30102396 :         nCharTextDistance   = rFormat.nCharTextDistance ;
     328    30102396 :         meLabelFollowedBy = rFormat.meLabelFollowedBy;
     329    30102396 :         mnListtabPos = rFormat.mnListtabPos;
     330    30102396 :         mnFirstLineIndent = rFormat.mnFirstLineIndent;
     331    30102396 :         mnIndentAt = rFormat.mnIndentAt;
     332    30102396 :         eVertOrient         = rFormat.eVertOrient ;
     333    30102396 :         sPrefix             = rFormat.sPrefix     ;
     334    30102396 :         sSuffix             = rFormat.sSuffix     ;
     335    30102396 :         aGraphicSize        = rFormat.aGraphicSize  ;
     336    30102396 :         nBulletColor        = rFormat.nBulletColor   ;
     337    30102396 :         nBulletRelSize      = rFormat.nBulletRelSize;
     338    30102396 :         SetShowSymbol(rFormat.IsShowSymbol());
     339    30102396 :         sCharStyleName      = rFormat.sCharStyleName;
     340    30102396 :     DELETEZ(pGraphicBrush);
     341    30102396 :     if(rFormat.pGraphicBrush)
     342             :     {
     343        1188 :         pGraphicBrush = new SvxBrushItem(*rFormat.pGraphicBrush);
     344        1188 :         pGraphicBrush->SetDoneLink( STATIC_LINK( this, SvxNumberFormat, GraphicArrived) );
     345             :     }
     346    30102396 :     DELETEZ(pBulletFont);
     347    30102396 :     if(rFormat.pBulletFont)
     348      701094 :             pBulletFont = new vcl::Font(*rFormat.pBulletFont);
     349    30102396 :     return *this;
     350             : }
     351             : 
     352     9648750 : bool  SvxNumberFormat::operator==( const SvxNumberFormat& rFormat) const
     353             : {
     354    28616108 :     if( GetNumberingType()  != rFormat.GetNumberingType() ||
     355    18637180 :         eNumAdjust          != rFormat.eNumAdjust ||
     356    18632842 :         nInclUpperLevels    != rFormat.nInclUpperLevels ||
     357    18628196 :         nStart              != rFormat.nStart ||
     358    18622374 :         cBullet             != rFormat.cBullet ||
     359    18616512 :         mePositionAndSpaceMode != rFormat.mePositionAndSpaceMode ||
     360    18615394 :         nFirstLineOffset    != rFormat.nFirstLineOffset ||
     361    18614458 :         nAbsLSpace          != rFormat.nAbsLSpace ||
     362    18614256 :         nLSpace             != rFormat.nLSpace ||
     363    18614256 :         nCharTextDistance   != rFormat.nCharTextDistance ||
     364    18614222 :         meLabelFollowedBy != rFormat.meLabelFollowedBy ||
     365    18603570 :         mnListtabPos != rFormat.mnListtabPos ||
     366    18592904 :         mnFirstLineIndent != rFormat.mnFirstLineIndent ||
     367    18592842 :         mnIndentAt != rFormat.mnIndentAt ||
     368    18592828 :         eVertOrient         != rFormat.eVertOrient ||
     369    18592812 :         sPrefix             != rFormat.sPrefix     ||
     370    18592768 :         sSuffix             != rFormat.sSuffix     ||
     371    18592740 :         aGraphicSize        != rFormat.aGraphicSize  ||
     372    18578066 :         nBulletColor        != rFormat.nBulletColor   ||
     373    18562514 :         nBulletRelSize      != rFormat.nBulletRelSize ||
     374    28210386 :         IsShowSymbol()      != rFormat.IsShowSymbol() ||
     375     9280818 :         sCharStyleName      != rFormat.sCharStyleName
     376             :         )
     377      408624 :         return false;
     378     9240126 :     if (
     379     9240436 :         (pGraphicBrush && !rFormat.pGraphicBrush) ||
     380    27720068 :         (!pGraphicBrush && rFormat.pGraphicBrush) ||
     381         310 :         (pGraphicBrush && *pGraphicBrush != *rFormat.pGraphicBrush)
     382             :        )
     383             :     {
     384           0 :         return false;
     385             :     }
     386     9240126 :     if (
     387     9411166 :         (pBulletFont && !rFormat.pBulletFont) ||
     388    27551410 :         (!pBulletFont && rFormat.pBulletFont) ||
     389      171040 :         (pBulletFont && *pBulletFont != *rFormat.pBulletFont)
     390             :        )
     391             :     {
     392        4544 :         return false;
     393             :     }
     394     9235582 :     return true;
     395             : }
     396             : 
     397    12848792 : void SvxNumberFormat::SetGraphicBrush( const SvxBrushItem* pBrushItem,
     398             :                     const Size* pSize, const sal_Int16* pOrient)
     399             : {
     400    12848792 :     if(!pBrushItem)
     401             :     {
     402    12847996 :         delete pGraphicBrush;
     403    12847996 :         pGraphicBrush = 0;
     404             :     }
     405         796 :     else if ( !pGraphicBrush || (pGraphicBrush && !(*pBrushItem == *pGraphicBrush)) )
     406             :     {
     407          78 :         delete pGraphicBrush;
     408          78 :         pGraphicBrush =  static_cast<SvxBrushItem*>(pBrushItem->Clone());
     409          78 :         pGraphicBrush->SetDoneLink( STATIC_LINK( this, SvxNumberFormat, GraphicArrived) );
     410             :    }
     411             : 
     412    12848792 :     if(pOrient)
     413    12848714 :         eVertOrient = *pOrient;
     414             :     else
     415          78 :         eVertOrient = text::VertOrientation::NONE;
     416    12848792 :     if(pSize)
     417    12848792 :         aGraphicSize = *pSize;
     418             :     else
     419           0 :         aGraphicSize.Width() = aGraphicSize.Height() = 0;
     420    12848792 : }
     421             : 
     422           0 : void SvxNumberFormat::SetGraphic( const OUString& rName )
     423             : {
     424           0 :     if( pGraphicBrush && pGraphicBrush->GetGraphicLink() == rName )
     425           0 :         return ;
     426             : 
     427           0 :     delete pGraphicBrush;
     428           0 :     pGraphicBrush = new SvxBrushItem( rName, "", GPOS_AREA, 0 );
     429           0 :     pGraphicBrush->SetDoneLink( STATIC_LINK( this, SvxNumberFormat, GraphicArrived) );
     430           0 :     if( eVertOrient == text::VertOrientation::NONE )
     431           0 :         eVertOrient = text::VertOrientation::TOP;
     432             : 
     433           0 :     aGraphicSize.Width() = aGraphicSize.Height() = 0;
     434             : }
     435             : 
     436           0 : void SvxNumberFormat::SetVertOrient(sal_Int16 eSet)
     437             : {
     438           0 :     eVertOrient = eSet;
     439           0 : }
     440             : 
     441    25698074 : sal_Int16    SvxNumberFormat::GetVertOrient() const
     442             : {
     443    25698074 :     return eVertOrient;
     444             : }
     445             : 
     446       56748 : void SvxNumberFormat::SetBulletFont(const vcl::Font* pFont)
     447             : {
     448       56748 :     delete pBulletFont;
     449       56748 :     pBulletFont = pFont ? new vcl::Font(*pFont): 0;
     450       56748 : }
     451             : 
     452      168756 : void SvxNumberFormat::SetPositionAndSpaceMode( SvxNumPositionAndSpaceMode ePositionAndSpaceMode )
     453             : {
     454      168756 :     mePositionAndSpaceMode = ePositionAndSpaceMode;
     455      168756 : }
     456             : 
     457           0 : short SvxNumberFormat::GetLSpace() const
     458             : {
     459           0 :     return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION ? nLSpace : 0;
     460             : }
     461       20736 : short SvxNumberFormat::GetAbsLSpace() const
     462             : {
     463       20736 :     return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION
     464             :            ? nAbsLSpace
     465       20736 :            : static_cast<short>( GetFirstLineIndent() + GetIndentAt() );
     466             : }
     467       32838 : short SvxNumberFormat::GetFirstLineOffset() const
     468             : {
     469       32838 :     return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION
     470             :            ? nFirstLineOffset
     471       32838 :            : static_cast<short>( GetFirstLineIndent() );
     472             : }
     473        6400 : short SvxNumberFormat::GetCharTextDistance() const
     474             : {
     475        6400 :     return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION ? nCharTextDistance : 0;
     476             : }
     477             : 
     478      174664 : void SvxNumberFormat::SetLabelFollowedBy( const LabelFollowedBy eLabelFollowedBy )
     479             : {
     480      174664 :     meLabelFollowedBy = eLabelFollowedBy;
     481      174664 : }
     482      174862 : void SvxNumberFormat::SetListtabPos( const long nListtabPos )
     483             : {
     484      174862 :     mnListtabPos = nListtabPos;
     485      174862 : }
     486      174466 : void SvxNumberFormat::SetFirstLineIndent( const long nFirstLineIndent )
     487             : {
     488      174466 :     mnFirstLineIndent = nFirstLineIndent;
     489      174466 : }
     490      173732 : void SvxNumberFormat::SetIndentAt( const long nIndentAt )
     491             : {
     492      173732 :     mnIndentAt = nIndentAt;
     493      173732 : }
     494             : 
     495           0 : IMPL_STATIC_LINK( SvxNumberFormat, GraphicArrived, void *, EMPTYARG )
     496             : {
     497             :     // if necessary, set the GrfSize:
     498           0 :     if( !pThis->aGraphicSize.Width() || !pThis->aGraphicSize.Height() )
     499             :     {
     500           0 :         const Graphic* pGrf = pThis->pGraphicBrush->GetGraphic();
     501           0 :         if( pGrf )
     502           0 :             pThis->aGraphicSize = SvxNumberFormat::GetGraphicSizeMM100( pGrf );
     503             :     }
     504           0 :     pThis->NotifyGraphicArrived();
     505           0 :     return 0;
     506             : }
     507             : 
     508           0 : void SvxNumberFormat::NotifyGraphicArrived()
     509             : {
     510           0 : }
     511             : 
     512           0 : Size SvxNumberFormat::GetGraphicSizeMM100(const Graphic* pGraphic)
     513             : {
     514           0 :     const MapMode aMapMM100( MAP_100TH_MM );
     515           0 :     const Size& rSize = pGraphic->GetPrefSize();
     516           0 :     Size aRetSize;
     517           0 :     if ( pGraphic->GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
     518             :     {
     519           0 :         OutputDevice* pOutDev = Application::GetDefaultDevice();
     520           0 :         MapMode aOldMap( pOutDev->GetMapMode() );
     521           0 :         pOutDev->SetMapMode( aMapMM100 );
     522           0 :         aRetSize = pOutDev->PixelToLogic( rSize );
     523           0 :         pOutDev->SetMapMode( aOldMap );
     524             :     }
     525             :     else
     526           0 :         aRetSize = OutputDevice::LogicToLogic( rSize, pGraphic->GetPrefMapMode(), aMapMM100 );
     527           0 :     return aRetSize;
     528             : }
     529             : 
     530           0 : OUString SvxNumberFormat::CreateRomanString( sal_uLong nNo, bool bUpper )
     531             : {
     532           0 :     nNo %= 4000;            // more can not be displayed
     533             : //      i, ii, iii, iv, v, vi, vii, vii, viii, ix
     534             : //                          (Dummy),1000,500,100,50,10,5,1
     535             :     const char *cRomanArr = bUpper
     536             :                         ? "MDCLXVI--"   // +2 Dummy entries!
     537           0 :                         : "mdclxvi--";  // +2 Dummy entries!
     538             : 
     539           0 :     OUString sRet;
     540           0 :     sal_uInt16 nMask = 1000;
     541           0 :     while( nMask )
     542             :     {
     543           0 :         sal_uInt8 nZahl = sal_uInt8(nNo / nMask);
     544           0 :         sal_uInt8 nDiff = 1;
     545           0 :         nNo %= nMask;
     546             : 
     547           0 :         if( 5 < nZahl )
     548             :         {
     549           0 :             if( nZahl < 9 )
     550           0 :                 sRet += OUString(*(cRomanArr-1));
     551           0 :             ++nDiff;
     552           0 :             nZahl -= 5;
     553             :         }
     554           0 :         switch( nZahl )
     555             :         {
     556           0 :         case 3:     { sRet += OUString(*cRomanArr); }
     557           0 :         case 2:     { sRet += OUString(*cRomanArr); }
     558           0 :         case 1:     { sRet += OUString(*cRomanArr); }
     559           0 :                     break;
     560             : 
     561             :         case 4:     {
     562           0 :                         sRet += OUString(*cRomanArr);
     563           0 :                         sRet += OUString(*(cRomanArr-nDiff));
     564             :                     }
     565           0 :                     break;
     566           0 :         case 5:     { sRet += OUString(*(cRomanArr-nDiff)); }
     567           0 :                     break;
     568             :         }
     569             : 
     570           0 :         nMask /= 10;            // for the next decade
     571           0 :         cRomanArr += 2;
     572             :     }
     573           0 :     return sRet;
     574             : }
     575             : 
     576     3038460 : OUString SvxNumberFormat::GetCharFmtName()const
     577             : {
     578     3038460 :     return sCharStyleName;
     579             : }
     580             : 
     581             : sal_Int32 SvxNumRule::nRefCount = 0;
     582             : static SvxNumberFormat* pStdNumFmt = 0;
     583             : static SvxNumberFormat* pStdOutlineNumFmt = 0;
     584      333496 : SvxNumRule::SvxNumRule( sal_uLong nFeatures,
     585             :                         sal_uInt16 nLevels,
     586             :                         bool bCont,
     587             :                         SvxNumRuleType eType,
     588             :                         SvxNumberFormat::SvxNumPositionAndSpaceMode
     589             :                                     eDefaultNumberFormatPositionAndSpaceMode )
     590             :     : nLevelCount(nLevels),
     591             :       nFeatureFlags(nFeatures),
     592             :       eNumberingType(eType),
     593      333496 :       bContinuousNumbering(bCont)
     594             : {
     595      333496 :     ++nRefCount;
     596     3668456 :     for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++)
     597             :     {
     598     3334960 :         if(i < nLevels)
     599             :         {
     600     3334248 :             aFmts[i] = new SvxNumberFormat(SVX_NUM_CHARS_UPPER_LETTER);
     601             :             // It is a distinction between writer and draw
     602     3334248 :             if(nFeatures & NUM_CONTINUOUS)
     603             :             {
     604     3309520 :                 if ( eDefaultNumberFormatPositionAndSpaceMode ==
     605             :                                     SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
     606             :                 {
     607     3309520 :                     aFmts[i]->SetLSpace( convertMm100ToTwip(DEF_WRITER_LSPACE) );
     608     3309520 :                     aFmts[i]->SetAbsLSpace( convertMm100ToTwip(DEF_WRITER_LSPACE * (i+1)) );
     609     3309520 :                     aFmts[i]->SetFirstLineOffset(convertMm100ToTwip(-DEF_WRITER_LSPACE));
     610             :                 }
     611           0 :                 else if ( eDefaultNumberFormatPositionAndSpaceMode ==
     612             :                                             SvxNumberFormat::LABEL_ALIGNMENT )
     613             :                 {
     614             :                     // first line indent of general numbering in inch: -0,25 inch
     615           0 :                     const long cFirstLineIndent = -1440/4;
     616             :                     // indent values of general numbering in inch:
     617             :                     //  0,5         0,75        1,0         1,25        1,5
     618             :                     //  1,75        2,0         2,25        2,5         2,75
     619           0 :                     const long cIndentAt = 1440/4;
     620           0 :                     aFmts[i]->SetPositionAndSpaceMode( SvxNumberFormat::LABEL_ALIGNMENT );
     621           0 :                     aFmts[i]->SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
     622           0 :                     aFmts[i]->SetListtabPos( cIndentAt * (i+2) );
     623           0 :                     aFmts[i]->SetFirstLineIndent( cFirstLineIndent );
     624           0 :                     aFmts[i]->SetIndentAt( cIndentAt * (i+2) );
     625             :                 }
     626             :             }
     627             :             else
     628             :             {
     629       24728 :                 aFmts[i]->SetLSpace( DEF_DRAW_LSPACE );
     630       24728 :                 aFmts[i]->SetAbsLSpace( DEF_DRAW_LSPACE * (i) );
     631             :             }
     632             :         }
     633             :         else
     634         712 :             aFmts[i] = 0;
     635     3334960 :         aFmtsSet[i] = false;
     636             :     }
     637      333496 : }
     638             : 
     639      959426 : SvxNumRule::SvxNumRule(const SvxNumRule& rCopy)
     640             : {
     641      959426 :     ++nRefCount;
     642      959426 :     aLocale             = rCopy.aLocale;
     643      959426 :     nLevelCount          = rCopy.nLevelCount         ;
     644      959426 :     nFeatureFlags        = rCopy.nFeatureFlags       ;
     645      959426 :     bContinuousNumbering = rCopy.bContinuousNumbering;
     646      959426 :     eNumberingType       = rCopy.eNumberingType;
     647      959426 :     memset( aFmts, 0, sizeof( aFmts ));
     648    10553686 :     for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++)
     649             :     {
     650     9594260 :         if(rCopy.aFmts[i])
     651     9593134 :             aFmts[i] = new SvxNumberFormat(*rCopy.aFmts[i]);
     652             :         else
     653        1126 :             aFmts[i] = 0;
     654     9594260 :         aFmtsSet[i] = rCopy.aFmtsSet[i];
     655             :     }
     656      959426 : }
     657             : 
     658           0 : SvxNumRule::SvxNumRule( SvStream &rStream )
     659           0 :     : nLevelCount(0)
     660             : {
     661           0 :     sal_uInt16 nTmp16(0);
     662           0 :     rStream.ReadUInt16( nTmp16 ); // NUM_ITEM_VERSION
     663           0 :     rStream.ReadUInt16( nLevelCount );
     664             : 
     665             :     // first nFeatureFlags of old Versions
     666           0 :     rStream.ReadUInt16( nTmp16 ); nFeatureFlags = nTmp16;
     667           0 :     rStream.ReadUInt16( nTmp16 ); bContinuousNumbering = nTmp16;
     668           0 :     rStream.ReadUInt16( nTmp16 ); eNumberingType = ( SvxNumRuleType )nTmp16;
     669             : 
     670           0 :     for (sal_uInt16 i = 0; i < SVX_MAX_NUM; i++)
     671             :     {
     672           0 :         rStream.ReadUInt16( nTmp16 );
     673           0 :         bool hasNumberingFormat = nTmp16 & 1;
     674           0 :         aFmtsSet[i] = nTmp16 & 2; // fdo#68648 reset flag
     675           0 :         if ( hasNumberingFormat ){
     676           0 :             aFmts[i] = new SvxNumberFormat( rStream );
     677             :         }
     678             :         else
     679             :         {
     680           0 :             aFmts[i] = 0;
     681           0 :             aFmtsSet[i] = false; // actually only false is valid
     682             :         }
     683             :     }
     684             :     //second nFeatureFlags for new versions
     685           0 :     rStream.ReadUInt16( nTmp16 ); nFeatureFlags = nTmp16;
     686           0 : }
     687             : 
     688           0 : SvStream& SvxNumRule::Store( SvStream &rStream )
     689             : {
     690           0 :     rStream.WriteUInt16( NUMITEM_VERSION_03 );
     691           0 :     rStream.WriteUInt16( nLevelCount );
     692             :     //first save of nFeatureFlags for old versions
     693           0 :     rStream.WriteUInt16( nFeatureFlags );
     694           0 :     rStream.WriteUInt16( (sal_uInt16)bContinuousNumbering );
     695           0 :     rStream.WriteUInt16( eNumberingType );
     696             : 
     697           0 :     FontToSubsFontConverter pConverter = 0;
     698           0 :     bool bConvertBulletFont = ( rStream.GetVersion() <= SOFFICE_FILEFORMAT_50 ) && ( rStream.GetVersion() );
     699           0 :     for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++)
     700             :     {
     701           0 :         sal_uInt16 nSetFlag(aFmtsSet[i] ? 2 : 0); // fdo#68648 store that too
     702           0 :         if(aFmts[i])
     703             :         {
     704           0 :             rStream.WriteUInt16( 1 | nSetFlag );
     705           0 :             if(bConvertBulletFont && aFmts[i]->GetBulletFont())
     706             :             {
     707           0 :                 if(!pConverter)
     708             :                     pConverter =
     709           0 :                         CreateFontToSubsFontConverter(aFmts[i]->GetBulletFont()->GetName(),
     710           0 :                                     FONTTOSUBSFONT_EXPORT|FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS);
     711             :             }
     712           0 :             aFmts[i]->Store(rStream, pConverter);
     713             :         }
     714             :         else
     715           0 :             rStream.WriteUInt16( 0 | nSetFlag );
     716             :     }
     717             :     //second save of nFeatureFlags for new versions
     718           0 :     rStream.WriteUInt16( nFeatureFlags );
     719           0 :     if(pConverter)
     720           0 :         DestroyFontToSubsFontConverter(pConverter);
     721             : 
     722           0 :     return rStream;
     723             : }
     724     3537994 : SvxNumRule::~SvxNumRule()
     725             : {
     726    14222142 :     for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++)
     727    12929220 :         delete aFmts[i];
     728     1292922 :     if(!--nRefCount)
     729             :     {
     730         172 :         DELETEZ(pStdNumFmt);
     731         172 :         DELETEZ(pStdOutlineNumFmt);
     732             :     }
     733     2245072 : }
     734             : 
     735           0 : SvxNumRule& SvxNumRule::operator=( const SvxNumRule& rCopy )
     736             : {
     737           0 :     nLevelCount          = rCopy.nLevelCount;
     738           0 :     nFeatureFlags        = rCopy.nFeatureFlags;
     739           0 :     bContinuousNumbering = rCopy.bContinuousNumbering;
     740           0 :     eNumberingType       = rCopy.eNumberingType;
     741           0 :     for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++)
     742             :     {
     743           0 :         delete aFmts[i];
     744           0 :         if(rCopy.aFmts[i])
     745           0 :             aFmts[i] = new SvxNumberFormat(*rCopy.aFmts[i]);
     746             :         else
     747           0 :             aFmts[i] = 0;
     748           0 :         aFmtsSet[i] = rCopy.aFmtsSet[i];
     749             :     }
     750           0 :     return *this;
     751             : }
     752             : 
     753       63190 : int   SvxNumRule::operator==( const SvxNumRule& rCopy) const
     754             : {
     755      123890 :     if(nLevelCount != rCopy.nLevelCount ||
     756      117384 :         nFeatureFlags != rCopy.nFeatureFlags ||
     757      113368 :             bContinuousNumbering != rCopy.bContinuousNumbering ||
     758       56684 :                 eNumberingType != rCopy.eNumberingType)
     759       10616 :             return sal_False;
     760      372440 :     for(sal_uInt16 i = 0; i < nLevelCount; i++)
     761             :     {
     762      340600 :         if (
     763      679408 :             (aFmtsSet[i] != rCopy.aFmtsSet[i]) ||
     764      677616 :             (!aFmts[i] && rCopy.aFmts[i]) ||
     765     1377758 :             (aFmts[i] && !rCopy.aFmts[i]) ||
     766      677616 :             (aFmts[i] && *aFmts[i] !=  *rCopy.aFmts[i])
     767             :            )
     768             :         {
     769       20734 :             return sal_False;
     770             :         }
     771             :     }
     772       31840 :     return sal_True;
     773             : }
     774             : 
     775     4935833 : const SvxNumberFormat*  SvxNumRule::Get(sal_uInt16 nLevel)const
     776             : {
     777             :     DBG_ASSERT(nLevel < SVX_MAX_NUM, "Wrong Level" );
     778     4935833 :     if( nLevel < SVX_MAX_NUM )
     779     4935833 :         return aFmtsSet[nLevel] ? aFmts[nLevel] : 0;
     780             :     else
     781           0 :         return 0;
     782             : }
     783             : 
     784     3066986 : const SvxNumberFormat&  SvxNumRule::GetLevel(sal_uInt16 nLevel)const
     785             : {
     786     3066986 :     if(!pStdNumFmt)
     787             :     {
     788          76 :         pStdNumFmt = new SvxNumberFormat(SVX_NUM_ARABIC);
     789          76 :          pStdOutlineNumFmt = new SvxNumberFormat(SVX_NUM_NUMBER_NONE);
     790             :     }
     791             : 
     792             :     DBG_ASSERT(nLevel < SVX_MAX_NUM, "Wrong Level" );
     793             : 
     794     3066986 :     return ( ( nLevel < SVX_MAX_NUM ) && aFmts[nLevel] ) ?
     795     3066986 :             *aFmts[nLevel] :  eNumberingType == SVX_RULETYPE_NUMBERING ?
     796     6133972 :                                                         *pStdNumFmt : *pStdOutlineNumFmt;
     797             : }
     798             : 
     799     6388580 : void SvxNumRule::SetLevel( sal_uInt16 i, const SvxNumberFormat& rNumFmt, bool bIsValid )
     800             : {
     801             :     DBG_ASSERT(i < SVX_MAX_NUM, "Wrong Level" );
     802             : 
     803     6388580 :     if( (i < SVX_MAX_NUM) )
     804             :     {
     805     6388580 :         bool bReplace = !aFmtsSet[i];
     806     6388580 :         if (!bReplace)
     807             :         {
     808     1825730 :             const SvxNumberFormat *pFmt = Get(i);
     809     1825730 :             bReplace = pFmt ? rNumFmt != *pFmt : true;
     810             :         }
     811             : 
     812     6388580 :         if (bReplace)
     813             :         {
     814     4576910 :             delete aFmts[i];
     815     4576910 :             aFmts[i] = new SvxNumberFormat(rNumFmt);
     816     4576910 :             aFmtsSet[i] = bIsValid;
     817             :         }
     818             :     }
     819     6388580 : }
     820             : 
     821           0 : void SvxNumRule::SetLevel(sal_uInt16 nLevel, const SvxNumberFormat* pFmt)
     822             : {
     823             :     DBG_ASSERT(nLevel < SVX_MAX_NUM, "Wrong Level" );
     824             : 
     825           0 :     if( nLevel < SVX_MAX_NUM )
     826             :     {
     827           0 :         aFmtsSet[nLevel] = 0 != pFmt;
     828           0 :         if(pFmt)
     829           0 :             SetLevel(nLevel, *pFmt);
     830             :         else
     831             :         {
     832           0 :             delete aFmts[nLevel];
     833           0 :             aFmts[nLevel] = 0;
     834             :         }
     835             :     }
     836           0 : }
     837             : 
     838           0 : OUString SvxNumRule::MakeNumString( const SvxNodeNum& rNum, bool bInclStrings ) const
     839             : {
     840           0 :     OUString aStr;
     841           0 :     if( SVX_NO_NUM > rNum.GetLevel() && !( SVX_NO_NUMLEVEL & rNum.GetLevel() ) )
     842             :     {
     843           0 :         const SvxNumberFormat& rMyNFmt = GetLevel( rNum.GetLevel() );
     844           0 :         if( SVX_NUM_NUMBER_NONE != rMyNFmt.GetNumberingType() )
     845             :         {
     846           0 :             sal_uInt8 i = rNum.GetLevel();
     847             : 
     848           0 :             if( !IsContinuousNumbering() &&
     849           0 :                 1 < rMyNFmt.GetIncludeUpperLevels() )       // only on own level?
     850             :             {
     851           0 :                 sal_uInt8 n = rMyNFmt.GetIncludeUpperLevels();
     852           0 :                 if( 1 < n )
     853             :                 {
     854           0 :                     if( i+1 >= n )
     855           0 :                         i -= n - 1;
     856             :                     else
     857           0 :                         i = 0;
     858             :                 }
     859             :             }
     860             : 
     861           0 :             for( ; i <= rNum.GetLevel(); ++i )
     862             :             {
     863           0 :                 const SvxNumberFormat& rNFmt = GetLevel( i );
     864           0 :                 if( SVX_NUM_NUMBER_NONE == rNFmt.GetNumberingType() )
     865             :                 {
     866           0 :                     continue;
     867             :                 }
     868             : 
     869           0 :                 bool bDot = true;
     870           0 :                 if( rNum.GetLevelVal()[ i ] )
     871             :                 {
     872           0 :                     if(SVX_NUM_BITMAP != rNFmt.GetNumberingType())
     873           0 :                         aStr += rNFmt.GetNumStr( rNum.GetLevelVal()[ i ], aLocale );
     874             :                     else
     875           0 :                         bDot = false;
     876             :                 }
     877             :                 else
     878           0 :                     aStr += "0";       // all 0-levels are a 0
     879           0 :                 if( i != rNum.GetLevel() && bDot)
     880           0 :                     aStr += ".";
     881             :             }
     882             :         }
     883             : 
     884           0 :         if( bInclStrings )
     885             :         {
     886           0 :             aStr = rMyNFmt.GetPrefix() + aStr + rMyNFmt.GetSuffix();
     887             :         }
     888             :     }
     889           0 :     return aStr;
     890             : }
     891             : 
     892             : // changes linked to embedded bitmaps
     893      303846 : bool SvxNumRule::UnLinkGraphics()
     894             : {
     895      303846 :     bool bRet = false;
     896     3342306 :     for(sal_uInt16 i = 0; i < GetLevelCount(); i++)
     897             :     {
     898     3038460 :         SvxNumberFormat aFmt(GetLevel(i));
     899     3038460 :         const SvxBrushItem* pBrush = aFmt.GetBrush();
     900     3038460 :         const Graphic* pGraphic = NULL;
     901     3038460 :         if(SVX_NUM_BITMAP == aFmt.GetNumberingType())
     902             :         {
     903         312 :             if(pBrush &&
     904         312 :                 !pBrush->GetGraphicLink().isEmpty() &&
     905          78 :                     0 != (pGraphic = pBrush->GetGraphic()))
     906             :             {
     907           0 :                 SvxBrushItem aTempItem(*pBrush);
     908           0 :                 aTempItem.SetGraphicLink("");
     909           0 :                 aTempItem.SetGraphic(*pGraphic);
     910           0 :                 sal_Int16    eOrient = aFmt.GetVertOrient();
     911           0 :                 aFmt.SetGraphicBrush( &aTempItem, &aFmt.GetGraphicSize(), &eOrient );
     912           0 :                 bRet = true;
     913             :             }
     914             :         }
     915     3038382 :         else if((SVX_NUM_BITMAP|LINK_TOKEN) == aFmt.GetNumberingType())
     916           0 :             aFmt.SetNumberingType(SVX_NUM_BITMAP);
     917     3038460 :         SetLevel(i, aFmt);
     918     3038460 :     }
     919      303846 :     return bRet;
     920             : }
     921             : 
     922      330952 : SvxNumBulletItem::SvxNumBulletItem(SvxNumRule& rRule) :
     923             :     SfxPoolItem(SID_ATTR_NUMBERING_RULE),
     924      330952 :     pNumRule(new SvxNumRule(rRule))
     925             : {
     926      330952 : }
     927             : 
     928        2514 : SvxNumBulletItem::SvxNumBulletItem(SvxNumRule& rRule, sal_uInt16 _nWhich ) :
     929             :     SfxPoolItem(_nWhich),
     930        2514 :     pNumRule(new SvxNumRule(rRule))
     931             : {
     932        2514 : }
     933             : 
     934           0 : SfxPoolItem* SvxNumBulletItem::Create(SvStream &rStream, sal_uInt16 /*nItemVersion*/ ) const
     935             : {
     936           0 :     SvxNumRule aNumRule( rStream );
     937           0 :     return new SvxNumBulletItem( aNumRule, EE_PARA_NUMBULLET );
     938             : }
     939             : 
     940      616166 : SvxNumBulletItem::SvxNumBulletItem(const SvxNumBulletItem& rCopy) :
     941      616166 :     SfxPoolItem(rCopy.Which())
     942             : {
     943      616166 :     pNumRule = new SvxNumRule(*rCopy.pNumRule);
     944      616166 : }
     945             : 
     946     2514456 : SvxNumBulletItem::~SvxNumBulletItem()
     947             : {
     948      949632 :     delete pNumRule;
     949     1564824 : }
     950             : 
     951       63190 : bool SvxNumBulletItem::operator==( const SfxPoolItem& rCopy) const
     952             : {
     953       63190 :     return *pNumRule == *static_cast<const SvxNumBulletItem&>(rCopy).pNumRule;
     954             : }
     955             : 
     956      614804 : SfxPoolItem*  SvxNumBulletItem::Clone( SfxItemPool * ) const
     957             : {
     958      614804 :     return new SvxNumBulletItem(*this);
     959             : }
     960             : 
     961       21408 : sal_uInt16  SvxNumBulletItem::GetVersion( sal_uInt16 /*nFileVersion*/ ) const
     962             : {
     963       21408 :     return NUMITEM_VERSION_03;
     964             : }
     965             : 
     966           0 : SvStream&   SvxNumBulletItem::Store(SvStream &rStream, sal_uInt16 /*nItemVersion*/ )const
     967             : {
     968           0 :     pNumRule->Store(rStream);
     969           0 :     return rStream;
     970             : }
     971             : 
     972           0 : bool SvxNumBulletItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const
     973             : {
     974           0 :     rVal <<= SvxCreateNumRule( pNumRule );
     975           0 :     return true;
     976             : }
     977             : 
     978        2528 : bool SvxNumBulletItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ )
     979             : {
     980        2528 :     uno::Reference< container::XIndexReplace > xRule;
     981        2528 :     if( rVal >>= xRule )
     982             :     {
     983             :         try
     984             :         {
     985        2528 :             SvxNumRule* pNewRule = new SvxNumRule( SvxGetNumRule( xRule ) );
     986        5036 :             if( pNewRule->GetLevelCount() != pNumRule->GetLevelCount() ||
     987        2518 :                 pNewRule->GetNumRuleType() != pNumRule->GetNumRuleType() )
     988             :             {
     989           0 :                 SvxNumRule* pConverted = SvxConvertNumRule( pNewRule, pNumRule->GetLevelCount(), pNumRule->GetNumRuleType() );
     990           0 :                 delete pNewRule;
     991           0 :                 pNewRule = pConverted;
     992             :             }
     993        2518 :             delete pNumRule;
     994        2518 :             pNumRule = pNewRule;
     995        2518 :             return true;
     996             :         }
     997          10 :         catch(const lang::IllegalArgumentException&)
     998             :         {
     999             :         }
    1000             :     }
    1001          10 :     return false;
    1002             : }
    1003             : 
    1004           0 : SvxNumRule* SvxConvertNumRule( const SvxNumRule* pRule, sal_uInt16 nLevels, SvxNumRuleType eType )
    1005             : {
    1006           0 :     const sal_uInt16 nSrcLevels = pRule->GetLevelCount();
    1007           0 :     SvxNumRule* pNewRule = new SvxNumRule( pRule->GetFeatureFlags(), nLevels, pRule->IsContinuousNumbering(), eType );
    1008             : 
    1009           0 :     for( sal_uInt16 nLevel = 0; (nLevel < nLevels) && (nLevel < nSrcLevels); nLevel++ )
    1010           0 :         pNewRule->SetLevel( nLevel, pRule->GetLevel( nLevel ) );
    1011             : 
    1012           0 :     return pNewRule;
    1013         669 : }
    1014             : 
    1015             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10