diff options
Diffstat (limited to 'editeng/source/items/numitem.cxx')
-rw-r--r-- | editeng/source/items/numitem.cxx | 960 |
1 files changed, 0 insertions, 960 deletions
diff --git a/editeng/source/items/numitem.cxx b/editeng/source/items/numitem.cxx deleted file mode 100644 index 9f4d838ac1..0000000000 --- a/editeng/source/items/numitem.cxx +++ /dev/null @@ -1,960 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_editeng.hxx" - -#include <editeng/numitem.hxx> - -#include <com/sun/star/text/HoriOrientation.hpp> -#include <com/sun/star/text/VertOrientation.hpp> -#include <com/sun/star/text/RelOrientation.hpp> -#include <editeng/brshitem.hxx> -#include <vcl/font.hxx> -#include <editeng/editids.hrc> -#include <editeng/editrids.hrc> -#include <editeng/numdef.hxx> -#include <vcl/graph.hxx> -#include <vcl/window.hxx> -#include <vcl/svapp.hxx> -#include <editeng/unolingu.hxx> -#include <com/sun/star/text/XNumberingFormatter.hpp> -#include <com/sun/star/text/XDefaultNumberingProvider.hpp> -#include <com/sun/star/style/NumberingType.hpp> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/beans/PropertyValue.hpp> -#include <comphelper/processfactory.hxx> - -#include <editeng/unonrule.hxx> - -#define MM100_TO_TWIP(MM100) ((MM100*72L+63L)/127L) - -#define DEF_WRITER_LSPACE 500 //Standard Indentation -#define DEF_DRAW_LSPACE 800 //Standard Indentation - -#define NUMITEM_VERSION_01 0x01 -#define NUMITEM_VERSION_02 0x02 -#define NUMITEM_VERSION_03 0x03 -#define NUMITEM_VERSION_04 0x04 - -using namespace ::com::sun::star; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::text; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::style; - -sal_Int32 SvxNumberType::nRefCount = 0; -com::sun::star::uno::Reference<com::sun::star::text::XNumberingFormatter> SvxNumberType::xFormatter = 0; -void lcl_getFormatter(com::sun::star::uno::Reference<com::sun::star::text::XNumberingFormatter>& _xFormatter) -{ - if(!_xFormatter.is()) - { - try - { - Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory(); - Reference < XInterface > xI = xMSF->createInstance( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.DefaultNumberingProvider" )) ); - Reference<XDefaultNumberingProvider> xRet(xI, UNO_QUERY); - DBG_ASSERT(xRet.is(), "service missing: \"com.sun.star.text.DefaultNumberingProvider\""); - _xFormatter = Reference<XNumberingFormatter> (xRet, UNO_QUERY); - } - catch(Exception& ) - { - } - } -} - -SvxNumberType::SvxNumberType(sal_Int16 nType) : - nNumType(nType), - bShowSymbol(sal_True) -{ - nRefCount++; -} - -SvxNumberType::SvxNumberType(const SvxNumberType& rType) : - nNumType(rType.nNumType), - bShowSymbol(rType.bShowSymbol) -{ - nRefCount++; -} - -SvxNumberType::~SvxNumberType() -{ - if(!--nRefCount) - xFormatter = 0; -} - -String SvxNumberType::GetNumStr( sal_uLong nNo ) const -{ - LanguageType eLang = Application::GetSettings().GetLanguage(); - Locale aLocale = SvxCreateLocale(eLang); - return GetNumStr( nNo, aLocale ); -} - -String SvxNumberType::GetNumStr( sal_uLong nNo, const Locale& rLocale ) const -{ - lcl_getFormatter(xFormatter); - String aTmpStr; - if(!xFormatter.is()) - return aTmpStr; - - if(bShowSymbol) - { - switch(nNumType) - { - case NumberingType::CHAR_SPECIAL: - case NumberingType::BITMAP: - break; - default: - { - // '0' allowed for ARABIC numberings - if(NumberingType::ARABIC == nNumType && 0 == nNo ) - aTmpStr = '0'; - else - { - Sequence< PropertyValue > aProperties(2); - PropertyValue* pValues = aProperties.getArray(); - pValues[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NumberingType")); - pValues[0].Value <<= nNumType; - pValues[1].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Value")); - pValues[1].Value <<= (sal_Int32)nNo; - - try - { - aTmpStr = xFormatter->makeNumberingString( aProperties, rLocale ); - } - catch(Exception&) - { - } - } - } - } - } - return aTmpStr; -} - -SvxNumberFormat::SvxNumberFormat( sal_Int16 eType, - SvxNumPositionAndSpaceMode ePositionAndSpaceMode ) - : SvxNumberType(eType), - eNumAdjust(SVX_ADJUST_LEFT), - nInclUpperLevels(0), - nStart(1), - cBullet(SVX_DEF_BULLET), - nBulletRelSize(100), - nBulletColor(COL_BLACK), - mePositionAndSpaceMode( ePositionAndSpaceMode ), - nFirstLineOffset(0), - nAbsLSpace(0), - nLSpace(0), - nCharTextDistance(0), - meLabelFollowedBy( LISTTAB ), - mnListtabPos( 0 ), - mnFirstLineIndent( 0 ), - mnIndentAt( 0 ), - pGraphicBrush(0), - eVertOrient(text::VertOrientation::NONE), - pBulletFont(0) -{ -} - -SvxNumberFormat::SvxNumberFormat(const SvxNumberFormat& rFormat) : - SvxNumberType(rFormat), - mePositionAndSpaceMode( rFormat.mePositionAndSpaceMode ), - pGraphicBrush(0), - pBulletFont(0) -{ - *this = rFormat; -} - -SvxNumberFormat::~SvxNumberFormat() -{ - delete pGraphicBrush; - delete pBulletFont; -} - -SvStream& SvxNumberFormat::Store(SvStream &rStream, FontToSubsFontConverter pConverter) -{ - if(pConverter && pBulletFont) - { - cBullet = ConvertFontToSubsFontChar(pConverter, cBullet); - String sFontName = GetFontToSubsFontName(pConverter); - pBulletFont->SetName(sFontName); - } - - rStream << (sal_uInt16)NUMITEM_VERSION_04; - - rStream << (sal_uInt16)GetNumberingType(); - rStream << (sal_uInt16)eNumAdjust; - rStream << (sal_uInt16)nInclUpperLevels; - rStream << nStart; - rStream << (sal_uInt16)cBullet; - - rStream << nFirstLineOffset; - rStream << nAbsLSpace; - rStream << nLSpace; - - rStream << nCharTextDistance; - rtl_TextEncoding eEnc = gsl_getSystemTextEncoding(); - rStream.WriteByteString(sPrefix, eEnc); - rStream.WriteByteString(sSuffix, eEnc); - rStream.WriteByteString(sCharStyleName, eEnc); - if(pGraphicBrush) - { - rStream << (sal_uInt16)1; - - // in SD or SI force bullet itself to be stored, - // for that purpose throw away link when link and graphic - // are present, so Brush save is forced - if(pGraphicBrush->GetGraphicLink() && pGraphicBrush->GetGraphic()) - { - String aEmpty; - pGraphicBrush->SetGraphicLink(aEmpty); - } - - pGraphicBrush->Store(rStream, BRUSH_GRAPHIC_VERSION); - } - else - rStream << (sal_uInt16)0; - - rStream << (sal_uInt16)eVertOrient; - if(pBulletFont) - { - rStream << (sal_uInt16)1; - rStream << *pBulletFont; - } - else - rStream << (sal_uInt16)0; - rStream << aGraphicSize; - - Color nTempColor = nBulletColor; - if(COL_AUTO == nBulletColor.GetColor()) - nTempColor = COL_BLACK; - rStream << nTempColor; - rStream << nBulletRelSize; - rStream << (sal_uInt16)IsShowSymbol(); - - rStream << ( sal_uInt16 ) mePositionAndSpaceMode; - rStream << ( sal_uInt16 ) meLabelFollowedBy; - rStream << ( long ) mnListtabPos; - rStream << ( long ) mnFirstLineIndent; - rStream << ( long ) mnIndentAt; - - return rStream; -} - -SvxNumberFormat& SvxNumberFormat::operator=( const SvxNumberFormat& rFormat ) -{ - if (& rFormat == this) { return *this; } - - SetNumberingType(rFormat.GetNumberingType()); - eNumAdjust = rFormat.eNumAdjust ; - nInclUpperLevels = rFormat.nInclUpperLevels ; - nStart = rFormat.nStart ; - cBullet = rFormat.cBullet ; - mePositionAndSpaceMode = rFormat.mePositionAndSpaceMode; - nFirstLineOffset = rFormat.nFirstLineOffset; - nAbsLSpace = rFormat.nAbsLSpace ; - nLSpace = rFormat.nLSpace ; - nCharTextDistance = rFormat.nCharTextDistance ; - meLabelFollowedBy = rFormat.meLabelFollowedBy; - mnListtabPos = rFormat.mnListtabPos; - mnFirstLineIndent = rFormat.mnFirstLineIndent; - mnIndentAt = rFormat.mnIndentAt; - eVertOrient = rFormat.eVertOrient ; - sPrefix = rFormat.sPrefix ; - sSuffix = rFormat.sSuffix ; - aGraphicSize = rFormat.aGraphicSize ; - nBulletColor = rFormat.nBulletColor ; - nBulletRelSize = rFormat.nBulletRelSize; - SetShowSymbol(rFormat.IsShowSymbol()); - sCharStyleName = rFormat.sCharStyleName; - DELETEZ(pGraphicBrush); - if(rFormat.pGraphicBrush) - { - pGraphicBrush = new SvxBrushItem(*rFormat.pGraphicBrush); - pGraphicBrush->SetDoneLink( STATIC_LINK( this, SvxNumberFormat, GraphicArrived) ); - } - DELETEZ(pBulletFont); - if(rFormat.pBulletFont) - pBulletFont = new Font(*rFormat.pBulletFont); - return *this; -} - -sal_Bool SvxNumberFormat::operator==( const SvxNumberFormat& rFormat) const -{ - if( GetNumberingType() != rFormat.GetNumberingType() || - eNumAdjust != rFormat.eNumAdjust || - nInclUpperLevels != rFormat.nInclUpperLevels || - nStart != rFormat.nStart || - cBullet != rFormat.cBullet || - mePositionAndSpaceMode != rFormat.mePositionAndSpaceMode || - nFirstLineOffset != rFormat.nFirstLineOffset || - nAbsLSpace != rFormat.nAbsLSpace || - nLSpace != rFormat.nLSpace || - nCharTextDistance != rFormat.nCharTextDistance || - meLabelFollowedBy != rFormat.meLabelFollowedBy || - mnListtabPos != rFormat.mnListtabPos || - mnFirstLineIndent != rFormat.mnFirstLineIndent || - mnIndentAt != rFormat.mnIndentAt || - eVertOrient != rFormat.eVertOrient || - sPrefix != rFormat.sPrefix || - sSuffix != rFormat.sSuffix || - aGraphicSize != rFormat.aGraphicSize || - nBulletColor != rFormat.nBulletColor || - nBulletRelSize != rFormat.nBulletRelSize || - IsShowSymbol() != rFormat.IsShowSymbol() || - sCharStyleName != rFormat.sCharStyleName - ) - return sal_False; - if ( - (pGraphicBrush && !rFormat.pGraphicBrush) || - (!pGraphicBrush && rFormat.pGraphicBrush) || - (pGraphicBrush && *pGraphicBrush != *rFormat.pGraphicBrush) - ) - { - return sal_False; - } - if ( - (pBulletFont && !rFormat.pBulletFont) || - (!pBulletFont && rFormat.pBulletFont) || - (pBulletFont && *pBulletFont != *rFormat.pBulletFont) - ) - { - return sal_False; - } - return sal_True; -} - -void SvxNumberFormat::SetGraphicBrush( const SvxBrushItem* pBrushItem, - const Size* pSize, const sal_Int16* pOrient) -{ - if(!pBrushItem) - { - delete pGraphicBrush; - pGraphicBrush = 0; - } - else if ( !pGraphicBrush || (pGraphicBrush && !(*pBrushItem == *pGraphicBrush)) ) - { - delete pGraphicBrush; - pGraphicBrush = (SvxBrushItem*)pBrushItem->Clone(); - pGraphicBrush->SetDoneLink( STATIC_LINK( this, SvxNumberFormat, GraphicArrived) ); - } - - if(pOrient) - eVertOrient = *pOrient; - else - eVertOrient = text::VertOrientation::NONE; - if(pSize) - aGraphicSize = *pSize; - else - aGraphicSize.Width() = aGraphicSize.Height() = 0; -} - -void SvxNumberFormat::SetGraphic( const String& rName ) -{ - const String* pName; - if( pGraphicBrush && - 0 != (pName = pGraphicBrush->GetGraphicLink()) - && *pName == rName ) - return ; - - delete pGraphicBrush; - String sTmp; - pGraphicBrush = new SvxBrushItem( rName, sTmp, GPOS_AREA, 0 ); - pGraphicBrush->SetDoneLink( STATIC_LINK( this, SvxNumberFormat, GraphicArrived) ); - if( eVertOrient == text::VertOrientation::NONE ) - eVertOrient = text::VertOrientation::TOP; - - aGraphicSize.Width() = aGraphicSize.Height() = 0; -} - -void SvxNumberFormat::SetVertOrient(sal_Int16 eSet) -{ - eVertOrient = eSet; -} - -sal_Int16 SvxNumberFormat::GetVertOrient() const -{ - return eVertOrient; -} - -void SvxNumberFormat::SetBulletFont(const Font* pFont) -{ - delete pBulletFont; - pBulletFont = pFont ? new Font(*pFont): 0; -} - -SvxNumberFormat::SvxNumPositionAndSpaceMode SvxNumberFormat::GetPositionAndSpaceMode() const -{ - return mePositionAndSpaceMode; -} -void SvxNumberFormat::SetPositionAndSpaceMode( SvxNumPositionAndSpaceMode ePositionAndSpaceMode ) -{ - mePositionAndSpaceMode = ePositionAndSpaceMode; -} - -short SvxNumberFormat::GetLSpace() const -{ - return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION ? nLSpace : 0; -} -short SvxNumberFormat::GetAbsLSpace() const -{ - return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION - ? nAbsLSpace - : static_cast<short>( GetFirstLineIndent() + GetIndentAt() ); -} -short SvxNumberFormat::GetFirstLineOffset() const -{ - return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION - ? nFirstLineOffset - : static_cast<short>( GetFirstLineIndent() ); -} -short SvxNumberFormat::GetCharTextDistance() const -{ - return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION ? nCharTextDistance : 0; -} - -void SvxNumberFormat::SetLabelFollowedBy( const SvxNumLabelFollowedBy eLabelFollowedBy ) -{ - meLabelFollowedBy = eLabelFollowedBy; -} -SvxNumberFormat::SvxNumLabelFollowedBy SvxNumberFormat::GetLabelFollowedBy() const -{ - return meLabelFollowedBy; -} -void SvxNumberFormat::SetListtabPos( const long nListtabPos ) -{ - mnListtabPos = nListtabPos; -} -long SvxNumberFormat::GetListtabPos() const -{ - return mnListtabPos; -} -void SvxNumberFormat::SetFirstLineIndent( const long nFirstLineIndent ) -{ - mnFirstLineIndent = nFirstLineIndent; -} -long SvxNumberFormat::GetFirstLineIndent() const -{ - return mnFirstLineIndent; -} -void SvxNumberFormat::SetIndentAt( const long nIndentAt ) -{ - mnIndentAt = nIndentAt; -} -long SvxNumberFormat::GetIndentAt() const -{ - return mnIndentAt; -} - -IMPL_STATIC_LINK( SvxNumberFormat, GraphicArrived, void *, EMPTYARG ) -{ - // if necessary, set the GrfSize: - if( !pThis->aGraphicSize.Width() || !pThis->aGraphicSize.Height() ) - { - const Graphic* pGrf = pThis->pGraphicBrush->GetGraphic(); - if( pGrf ) - pThis->aGraphicSize = SvxNumberFormat::GetGraphicSizeMM100( pGrf ); - } - pThis->NotifyGraphicArrived(); - return 0; -} - -void SvxNumberFormat::NotifyGraphicArrived() -{ -} - -Size SvxNumberFormat::GetGraphicSizeMM100(const Graphic* pGraphic) -{ - const MapMode aMapMM100( MAP_100TH_MM ); - const Size& rSize = pGraphic->GetPrefSize(); - Size aRetSize; - if ( pGraphic->GetPrefMapMode().GetMapUnit() == MAP_PIXEL ) - { - OutputDevice* pOutDev = Application::GetDefaultDevice(); - MapMode aOldMap( pOutDev->GetMapMode() ); - pOutDev->SetMapMode( aMapMM100 ); - aRetSize = pOutDev->PixelToLogic( rSize ); - pOutDev->SetMapMode( aOldMap ); - } - else - aRetSize = OutputDevice::LogicToLogic( rSize, pGraphic->GetPrefMapMode(), aMapMM100 ); - return aRetSize; -} - -String SvxNumberFormat::CreateRomanString( sal_uLong nNo, sal_Bool bUpper ) -{ - nNo %= 4000; // more can not be displayed -// i, ii, iii, iv, v, vi, vii, vii, viii, ix -// (Dummy),1000,500,100,50,10,5,1 - const char *cRomanArr = bUpper - ? "MDCLXVI--" // +2 Dummy entries! - : "mdclxvi--"; // +2 Dummy entries! - - String sRet; - sal_uInt16 nMask = 1000; - while( nMask ) - { - sal_uInt8 nZahl = sal_uInt8(nNo / nMask); - sal_uInt8 nDiff = 1; - nNo %= nMask; - - if( 5 < nZahl ) - { - if( nZahl < 9 ) - sRet += sal_Unicode(*(cRomanArr-1)); - ++nDiff; - nZahl -= 5; - } - switch( nZahl ) - { - case 3: { sRet += sal_Unicode(*cRomanArr); } - case 2: { sRet += sal_Unicode(*cRomanArr); } - case 1: { sRet += sal_Unicode(*cRomanArr); } - break; - - case 4: { - sRet += sal_Unicode(*cRomanArr); - sRet += sal_Unicode(*(cRomanArr-nDiff)); - } - break; - case 5: { sRet += sal_Unicode(*(cRomanArr-nDiff)); } - break; - } - - nMask /= 10; // for the next decade - cRomanArr += 2; - } - return sRet; -} - -const String& SvxNumberFormat::GetCharFmtName()const -{ - return sCharStyleName; -} - -sal_Int32 SvxNumRule::nRefCount = 0; -static SvxNumberFormat* pStdNumFmt = 0; -static SvxNumberFormat* pStdOutlineNumFmt = 0; -SvxNumRule::SvxNumRule( sal_uLong nFeatures, - sal_uInt16 nLevels, - sal_Bool bCont, - SvxNumRuleType eType, - SvxNumberFormat::SvxNumPositionAndSpaceMode - eDefaultNumberFormatPositionAndSpaceMode ) - : nLevelCount(nLevels), - nFeatureFlags(nFeatures), - eNumberingType(eType), - bContinuousNumbering(bCont) -{ - ++nRefCount; - LanguageType eLang = Application::GetSettings().GetLanguage(); - aLocale = SvxCreateLocale(eLang); - for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++) - { - if(i < nLevels) - { - aFmts[i] = new SvxNumberFormat(SVX_NUM_CHARS_UPPER_LETTER); - // It is a distinction between writer and draw - if(nFeatures & NUM_CONTINUOUS) - { - if ( eDefaultNumberFormatPositionAndSpaceMode == - SvxNumberFormat::LABEL_WIDTH_AND_POSITION ) - { - aFmts[i]->SetLSpace( MM100_TO_TWIP(DEF_WRITER_LSPACE) ); - aFmts[i]->SetAbsLSpace( MM100_TO_TWIP(DEF_WRITER_LSPACE * (i+1)) ); - aFmts[i]->SetFirstLineOffset(MM100_TO_TWIP(-DEF_WRITER_LSPACE)); - } - else if ( eDefaultNumberFormatPositionAndSpaceMode == - SvxNumberFormat::LABEL_ALIGNMENT ) - { - // first line indent of general numbering in inch: -0,25 inch - const long cFirstLineIndent = -1440/4; - // indent values of general numbering in inch: - // 0,5 0,75 1,0 1,25 1,5 - // 1,75 2,0 2,25 2,5 2,75 - const long cIndentAt = 1440/4; - aFmts[i]->SetPositionAndSpaceMode( SvxNumberFormat::LABEL_ALIGNMENT ); - aFmts[i]->SetLabelFollowedBy( SvxNumberFormat::LISTTAB ); - aFmts[i]->SetListtabPos( cIndentAt * (i+2) ); - aFmts[i]->SetFirstLineIndent( cFirstLineIndent ); - aFmts[i]->SetIndentAt( cIndentAt * (i+2) ); - } - } - else - { - aFmts[i]->SetLSpace( DEF_DRAW_LSPACE ); - aFmts[i]->SetAbsLSpace( DEF_DRAW_LSPACE * (i) ); - } - } - else - aFmts[i] = 0; - aFmtsSet[i] = sal_False; - } -} - -SvxNumRule::SvxNumRule(const SvxNumRule& rCopy) -{ - ++nRefCount; - aLocale = rCopy.aLocale; - nLevelCount = rCopy.nLevelCount ; - nFeatureFlags = rCopy.nFeatureFlags ; - bContinuousNumbering = rCopy.bContinuousNumbering; - eNumberingType = rCopy.eNumberingType; - memset( aFmts, 0, sizeof( aFmts )); - for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++) - { - if(rCopy.aFmts[i]) - aFmts[i] = new SvxNumberFormat(*rCopy.aFmts[i]); - else - aFmts[i] = 0; - aFmtsSet[i] = rCopy.aFmtsSet[i]; - } -} - -SvStream& SvxNumRule::Store(SvStream &rStream) -{ - rStream<<(sal_uInt16)NUMITEM_VERSION_03; - rStream<<nLevelCount; - //first save of nFeatureFlags for old versions - rStream<<(sal_uInt16)nFeatureFlags; - rStream<<(sal_uInt16)bContinuousNumbering; - rStream<<(sal_uInt16)eNumberingType; - - FontToSubsFontConverter pConverter = 0; - sal_Bool bConvertBulletFont = rStream.GetVersion() <= SOFFICE_FILEFORMAT_50; - for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++) - { - if(aFmts[i]) - { - rStream << sal_uInt16(1); - if(bConvertBulletFont && aFmts[i]->GetBulletFont()) - { - if(!pConverter) - pConverter = - CreateFontToSubsFontConverter(aFmts[i]->GetBulletFont()->GetName(), - FONTTOSUBSFONT_EXPORT|FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS); - } - aFmts[i]->Store(rStream, pConverter); - } - else - rStream << sal_uInt16(0); - } - //second save of nFeatureFlags for new versions - rStream<<(sal_uInt16)nFeatureFlags; - if(pConverter) - DestroyFontToSubsFontConverter(pConverter); - - return rStream; -} - -SvxNumRule::~SvxNumRule() -{ - for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++) - delete aFmts[i]; - if(!--nRefCount) - { - DELETEZ(pStdNumFmt); - DELETEZ(pStdOutlineNumFmt); - } -} - -SvxNumRule& SvxNumRule::operator=( const SvxNumRule& rCopy ) -{ - nLevelCount = rCopy.nLevelCount; - nFeatureFlags = rCopy.nFeatureFlags; - bContinuousNumbering = rCopy.bContinuousNumbering; - eNumberingType = rCopy.eNumberingType; - for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++) - { - delete aFmts[i]; - if(rCopy.aFmts[i]) - aFmts[i] = new SvxNumberFormat(*rCopy.aFmts[i]); - else - aFmts[i] = 0; - aFmtsSet[i] = rCopy.aFmtsSet[i]; - } - return *this; -} - -int SvxNumRule::operator==( const SvxNumRule& rCopy) const -{ - if(nLevelCount != rCopy.nLevelCount || - nFeatureFlags != rCopy.nFeatureFlags || - bContinuousNumbering != rCopy.bContinuousNumbering || - eNumberingType != rCopy.eNumberingType) - return sal_False; - for(sal_uInt16 i = 0; i < nLevelCount; i++) - { - if ( - (aFmtsSet[i] != rCopy.aFmtsSet[i]) || - (!aFmts[i] && rCopy.aFmts[i]) || - (aFmts[i] && !rCopy.aFmts[i]) || - (aFmts[i] && *aFmts[i] != *rCopy.aFmts[i]) - ) - { - return sal_False; - } - } - return sal_True; -} - -const SvxNumberFormat* SvxNumRule::Get(sal_uInt16 nLevel)const -{ - DBG_ASSERT(nLevel < SVX_MAX_NUM, "Wrong Level" ); - if( nLevel < SVX_MAX_NUM ) - return aFmtsSet[nLevel] ? aFmts[nLevel] : 0; - else - return 0; -} - -const SvxNumberFormat& SvxNumRule::GetLevel(sal_uInt16 nLevel)const -{ - if(!pStdNumFmt) - { - pStdNumFmt = new SvxNumberFormat(SVX_NUM_ARABIC); - pStdOutlineNumFmt = new SvxNumberFormat(SVX_NUM_NUMBER_NONE); - } - - DBG_ASSERT(nLevel < SVX_MAX_NUM, "Wrong Level" ); - - return ( ( nLevel < SVX_MAX_NUM ) && aFmts[nLevel] ) ? - *aFmts[nLevel] : eNumberingType == SVX_RULETYPE_NUMBERING ? - *pStdNumFmt : *pStdOutlineNumFmt; -} - -void SvxNumRule::SetLevel( sal_uInt16 i, const SvxNumberFormat& rNumFmt, sal_Bool bIsValid ) -{ - DBG_ASSERT(i < SVX_MAX_NUM, "Wrong Level" ); - - if( (i < SVX_MAX_NUM) && (!aFmtsSet[i] || !(rNumFmt == *Get( i ))) ) - { - delete aFmts[ i ]; - aFmts[ i ] = new SvxNumberFormat( rNumFmt ); - aFmtsSet[i] = bIsValid; - } -} - -void SvxNumRule::SetLevel(sal_uInt16 nLevel, const SvxNumberFormat* pFmt) -{ - DBG_ASSERT(nLevel < SVX_MAX_NUM, "Wrong Level" ); - - if( nLevel < SVX_MAX_NUM ) - { - aFmtsSet[nLevel] = 0 != pFmt; - if(pFmt) - SetLevel(nLevel, *pFmt); - else - { - delete aFmts[nLevel]; - aFmts[nLevel] = 0; - } - } -} - -String SvxNumRule::MakeNumString( const SvxNodeNum& rNum, sal_Bool bInclStrings ) const -{ - String aStr; - if( SVX_NO_NUM > rNum.GetLevel() && !( SVX_NO_NUMLEVEL & rNum.GetLevel() ) ) - { - const SvxNumberFormat& rMyNFmt = GetLevel( rNum.GetLevel() ); - if( SVX_NUM_NUMBER_NONE != rMyNFmt.GetNumberingType() ) - { - sal_uInt8 i = rNum.GetLevel(); - - if( !IsContinuousNumbering() && - 1 < rMyNFmt.GetIncludeUpperLevels() ) // only on own level? - { - sal_uInt8 n = rMyNFmt.GetIncludeUpperLevels(); - if( 1 < n ) - { - if( i+1 >= n ) - i -= n - 1; - else - i = 0; - } - } - - for( ; i <= rNum.GetLevel(); ++i ) - { - const SvxNumberFormat& rNFmt = GetLevel( i ); - if( SVX_NUM_NUMBER_NONE == rNFmt.GetNumberingType() ) - { - continue; - } - - sal_Bool bDot = sal_True; - if( rNum.GetLevelVal()[ i ] ) - { - if(SVX_NUM_BITMAP != rNFmt.GetNumberingType()) - aStr += rNFmt.GetNumStr( rNum.GetLevelVal()[ i ], aLocale ); - else - bDot = sal_False; - } - else - aStr += sal_Unicode('0'); // all 0-levels are a 0 - if( i != rNum.GetLevel() && bDot) - aStr += sal_Unicode('.'); - } - } - - if( bInclStrings ) - { - aStr.Insert( rMyNFmt.GetPrefix(), 0 ); - aStr += rMyNFmt.GetSuffix(); - } - } - return aStr; -} - -// changes linked to embedded bitmaps -sal_Bool SvxNumRule::UnLinkGraphics() -{ - sal_Bool bRet = sal_False; - for(sal_uInt16 i = 0; i < GetLevelCount(); i++) - { - SvxNumberFormat aFmt(GetLevel(i)); - const SvxBrushItem* pBrush = aFmt.GetBrush(); - const String* pLinkStr; - const Graphic* pGraphic; - if(SVX_NUM_BITMAP == aFmt.GetNumberingType()) - { - if(pBrush && - 0 != (pLinkStr = pBrush->GetGraphicLink()) && - pLinkStr->Len() && - 0 !=(pGraphic = pBrush->GetGraphic())) - { - SvxBrushItem aTempItem(*pBrush); - aTempItem.SetGraphicLink( String()); - aTempItem.SetGraphic(*pGraphic); - sal_Int16 eOrient = aFmt.GetVertOrient(); - aFmt.SetGraphicBrush( &aTempItem, &aFmt.GetGraphicSize(), &eOrient ); - bRet = sal_True; - } - } - else if((SVX_NUM_BITMAP|LINK_TOKEN) == aFmt.GetNumberingType()) - aFmt.SetNumberingType(SVX_NUM_BITMAP); - SetLevel(i, aFmt); - } - return bRet; -} - -SvxNumBulletItem::SvxNumBulletItem(SvxNumRule& rRule) : - SfxPoolItem(SID_ATTR_NUMBERING_RULE), - pNumRule(new SvxNumRule(rRule)) -{ -} - -SvxNumBulletItem::SvxNumBulletItem(SvxNumRule& rRule, sal_uInt16 _nWhich ) : - SfxPoolItem(_nWhich), - pNumRule(new SvxNumRule(rRule)) -{ -} - -SfxPoolItem* SvxNumBulletItem::Create(SvStream &s, sal_uInt16 n) const -{ - return SfxPoolItem::Create(s, n ); -} - -SvxNumBulletItem::SvxNumBulletItem(const SvxNumBulletItem& rCopy) : - SfxPoolItem(rCopy.Which()) -{ - pNumRule = new SvxNumRule(*rCopy.pNumRule); -} - -SvxNumBulletItem::~SvxNumBulletItem() -{ - delete pNumRule; -} - -int SvxNumBulletItem::operator==( const SfxPoolItem& rCopy) const -{ - return *pNumRule == *((SvxNumBulletItem&)rCopy).pNumRule; -} - -SfxPoolItem* SvxNumBulletItem::Clone( SfxItemPool * ) const -{ - return new SvxNumBulletItem(*this); -} - -sal_uInt16 SvxNumBulletItem::GetVersion( sal_uInt16 /*nFileVersion*/ ) const -{ - return NUMITEM_VERSION_03; -} - -SvStream& SvxNumBulletItem::Store(SvStream &rStream, sal_uInt16 /*nItemVersion*/ )const -{ - pNumRule->Store(rStream); - return rStream; -} - -bool SvxNumBulletItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const -{ - rVal <<= SvxCreateNumRule( pNumRule ); - return true; -} - -bool SvxNumBulletItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) -{ - uno::Reference< container::XIndexReplace > xRule; - if( rVal >>= xRule ) - { - try - { - SvxNumRule* pNewRule = new SvxNumRule( SvxGetNumRule( xRule ) ); - if( pNewRule->GetLevelCount() != pNumRule->GetLevelCount() || - pNewRule->GetNumRuleType() != pNumRule->GetNumRuleType() ) - { - SvxNumRule* pConverted = SvxConvertNumRule( pNewRule, pNumRule->GetLevelCount(), pNumRule->GetNumRuleType() ); - delete pNewRule; - pNewRule = pConverted; - } - delete pNumRule; - pNumRule = pNewRule; - return true; - } - catch(lang::IllegalArgumentException&) - { - } - } - return false; -} - -SvxNumRule* SvxConvertNumRule( const SvxNumRule* pRule, sal_uInt16 nLevels, SvxNumRuleType eType ) -{ - const sal_uInt16 nSrcLevels = pRule->GetLevelCount(); - SvxNumRule* pNewRule = new SvxNumRule( pRule->GetFeatureFlags(), nLevels, pRule->IsContinuousNumbering(), eType ); - - for( sal_uInt16 nLevel = 0; (nLevel < nLevels) && (nLevel < nSrcLevels); nLevel++ ) - pNewRule->SetLevel( nLevel, pRule->GetLevel( nLevel ) ); - - return pNewRule; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |