summaryrefslogtreecommitdiff
path: root/editeng/source/items/numitem.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'editeng/source/items/numitem.cxx')
-rw-r--r--editeng/source/items/numitem.cxx1273
1 files changed, 1273 insertions, 0 deletions
diff --git a/editeng/source/items/numitem.cxx b/editeng/source/items/numitem.cxx
new file mode 100644
index 000000000000..29c3456b2af1
--- /dev/null
+++ b/editeng/source/items/numitem.cxx
@@ -0,0 +1,1273 @@
+/*************************************************************************
+ *
+ * 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 //Standardeinrueckung
+#define DEF_DRAW_LSPACE 800 //Standardeinrueckung
+
+#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::createFromAscii( "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& )
+ {
+ }
+ }
+}
+/* -----------------------------22.02.01 14:24--------------------------------
+
+ ---------------------------------------------------------------------------*/
+SvxNumberType::SvxNumberType(sal_Int16 nType) :
+ nNumType(nType),
+ bShowSymbol(sal_True)
+{
+ nRefCount++;
+}
+/* -----------------------------22.02.01 14:31--------------------------------
+
+ ---------------------------------------------------------------------------*/
+SvxNumberType::SvxNumberType(const SvxNumberType& rType) :
+ nNumType(rType.nNumType),
+ bShowSymbol(rType.bShowSymbol)
+{
+ nRefCount++;
+}
+/* -----------------------------22.02.01 14:24--------------------------------
+
+ ---------------------------------------------------------------------------*/
+SvxNumberType::~SvxNumberType()
+{
+ if(!--nRefCount)
+ xFormatter = 0;
+}
+/* -----------------------------22.02.01 11:09--------------------------------
+
+ ---------------------------------------------------------------------------*/
+String SvxNumberType::GetNumStr( ULONG nNo ) const
+{
+ LanguageType eLang = Application::GetSettings().GetLanguage();
+ Locale aLocale = SvxCreateLocale(eLang);
+ return GetNumStr( nNo, aLocale );
+}
+/* -----------------28.10.98 15:56-------------------
+ *
+ * --------------------------------------------------*/
+String SvxNumberType::GetNumStr( 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:
+ {
+ //#95525# '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;
+}
+/* -----------------27.10.98 10:33-------------------
+ *
+ * --------------------------------------------------*/
+// --> OD 2008-01-09 #newlistlevelattrs#
+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),
+ // --> OD 2008-01-09 #newlistlevelattrs#
+ mePositionAndSpaceMode( ePositionAndSpaceMode ),
+ // <--
+ nFirstLineOffset(0),
+ nAbsLSpace(0),
+ nLSpace(0),
+ nCharTextDistance(0),
+ // --> OD 2008-01-09 #newlistlevelattrs#
+ meLabelFollowedBy( LISTTAB ),
+ mnListtabPos( 0 ),
+ mnFirstLineIndent( 0 ),
+ mnIndentAt( 0 ),
+ // <--
+ pGraphicBrush(0),
+ eVertOrient(text::VertOrientation::NONE),
+ pBulletFont(0)
+{
+}
+/* -----------------27.10.98 10:56-------------------
+ *
+ * --------------------------------------------------*/
+SvxNumberFormat::SvxNumberFormat(const SvxNumberFormat& rFormat) :
+ SvxNumberType(rFormat),
+ // --> OD 2008-01-09 #newlistlevelattrs#
+ mePositionAndSpaceMode( rFormat.mePositionAndSpaceMode ),
+ // <--
+ pGraphicBrush(0),
+ pBulletFont(0)
+{
+ *this = rFormat;
+}
+/* -----------------27.10.98 10:56-------------------
+ *
+ * --------------------------------------------------*/
+SvxNumberFormat::~SvxNumberFormat()
+{
+ delete pGraphicBrush;
+ delete pBulletFont;
+}
+/* -----------------08.12.98 11:14-------------------
+ *
+ * --------------------------------------------------*/
+SvxNumberFormat::SvxNumberFormat(SvStream &rStream)
+: mePositionAndSpaceMode( LABEL_WIDTH_AND_POSITION ),
+ meLabelFollowedBy( LISTTAB ),
+ mnListtabPos( 0 ),
+ mnFirstLineIndent( 0 ),
+ mnIndentAt( 0 )
+{
+
+ USHORT nVersion;
+ rStream >> nVersion;
+
+ USHORT nUSHORT;
+ rStream >> nUSHORT;
+ SetNumberingType((sal_Int16)nUSHORT);
+ rStream >> nUSHORT;
+ eNumAdjust = (SvxAdjust)nUSHORT;
+ rStream >> nUSHORT;
+ nInclUpperLevels = (BYTE)nUSHORT;
+ rStream >> nUSHORT;
+ nStart = nUSHORT;
+ rStream >> nUSHORT;
+ cBullet = nUSHORT;
+
+ short nShort;
+ rStream >> nShort;
+ nFirstLineOffset = nShort;
+ rStream >> nShort;
+ nAbsLSpace = nShort;
+ rStream >> nShort;
+ nLSpace = nShort;
+
+ rStream >> nShort;
+ nCharTextDistance = nShort;
+ rtl_TextEncoding eEnc = gsl_getSystemTextEncoding();
+ rStream.ReadByteString(sPrefix, eEnc);
+ rStream.ReadByteString(sSuffix, eEnc);
+ rStream.ReadByteString(sCharStyleName, eEnc);
+ rStream >> nUSHORT;
+ if(nUSHORT)
+ {
+ SvxBrushItem aHelper(0);
+ pGraphicBrush = (SvxBrushItem*) aHelper.Create( rStream, BRUSH_GRAPHIC_VERSION );
+ }
+ else
+ pGraphicBrush = 0;
+
+ rStream >> nUSHORT;
+ eVertOrient = (sal_Int16)nUSHORT;
+
+ rStream >> nUSHORT;
+ if(nUSHORT)
+ {
+ pBulletFont = new Font;
+ rStream >> *pBulletFont;
+ if(!pBulletFont->GetCharSet())
+ pBulletFont->SetCharSet(rStream.GetStreamCharSet());
+ }
+ else
+ pBulletFont = 0;
+ rStream >> aGraphicSize;
+
+ rStream >> nBulletColor;
+ rStream >> nUSHORT;
+ nBulletRelSize = nUSHORT;
+ rStream >> nUSHORT;
+ SetShowSymbol((BOOL)nUSHORT);
+
+ if( nVersion < NUMITEM_VERSION_03 )
+ cBullet = ByteString::ConvertToUnicode( (sal_Char)cBullet,
+ (pBulletFont&&pBulletFont->GetCharSet()) ? pBulletFont->GetCharSet()
+ : RTL_TEXTENCODING_SYMBOL );
+ if(pBulletFont)
+ {
+ BOOL bConvertBulletFont = rStream.GetVersion() <= SOFFICE_FILEFORMAT_50;
+ if(bConvertBulletFont)
+ {
+
+ FontToSubsFontConverter pConverter =
+ CreateFontToSubsFontConverter(pBulletFont->GetName(),
+ FONTTOSUBSFONT_IMPORT|FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS);
+ if(pConverter)
+ {
+ cBullet = ConvertFontToSubsFontChar(pConverter, cBullet);
+ String sFontName = GetFontToSubsFontName(pConverter);
+ pBulletFont->SetName(sFontName);
+ DestroyFontToSubsFontConverter(pConverter);
+ }
+ }
+ }
+
+ if( NUMITEM_VERSION_04 <= nVersion )
+ {
+ rStream >> nUSHORT;
+ mePositionAndSpaceMode = (SvxNumPositionAndSpaceMode) nUSHORT;
+ rStream >> nUSHORT;
+ meLabelFollowedBy = ( SvxNumLabelFollowedBy ) nUSHORT;
+ long nLong;
+ rStream >> nLong;
+ mnListtabPos = nLong;
+ rStream >> nLong;
+ mnFirstLineIndent = nLong;
+ rStream >> nLong;
+ mnIndentAt = nLong;
+ }
+}
+/* -----------------08.12.98 11:14-------------------
+ *
+ * --------------------------------------------------*/
+SvStream& SvxNumberFormat::Store(SvStream &rStream, FontToSubsFontConverter pConverter)
+{
+ if(pConverter && pBulletFont)
+ {
+ cBullet = ConvertFontToSubsFontChar(pConverter, cBullet);
+ String sFontName = GetFontToSubsFontName(pConverter);
+ pBulletFont->SetName(sFontName);
+ }
+
+ rStream << (USHORT)NUMITEM_VERSION_04;
+
+ rStream << (USHORT)GetNumberingType();
+ rStream << (USHORT)eNumAdjust;
+ rStream << (USHORT)nInclUpperLevels;
+ rStream << nStart;
+ rStream << (USHORT)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 << (USHORT)1;
+
+ // #75113# 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 << (USHORT)0;
+
+ rStream << (USHORT)eVertOrient;
+ if(pBulletFont)
+ {
+ rStream << (USHORT)1;
+ rStream << *pBulletFont;
+ }
+ else
+ rStream << (USHORT)0;
+ rStream << aGraphicSize;
+
+ Color nTempColor = nBulletColor;
+ if(COL_AUTO == nBulletColor.GetColor())
+ nTempColor = COL_BLACK;
+ rStream << nTempColor;
+ rStream << nBulletRelSize;
+ rStream << (USHORT)IsShowSymbol();
+
+ rStream << ( USHORT ) mePositionAndSpaceMode;
+ rStream << ( USHORT ) meLabelFollowedBy;
+ rStream << ( long ) mnListtabPos;
+ rStream << ( long ) mnFirstLineIndent;
+ rStream << ( long ) mnIndentAt;
+
+ return rStream;
+}
+
+/* -----------------------------23.02.01 11:10--------------------------------
+
+ ---------------------------------------------------------------------------*/
+SvxNumberFormat& SvxNumberFormat::operator=( const SvxNumberFormat& rFormat )
+{
+ SetNumberingType(rFormat.GetNumberingType());
+ eNumAdjust = rFormat.eNumAdjust ;
+ nInclUpperLevels = rFormat.nInclUpperLevels ;
+ nStart = rFormat.nStart ;
+ cBullet = rFormat.cBullet ;
+ // --> OD 2008-01-09 #newlistlevelattrs#
+ mePositionAndSpaceMode = rFormat.mePositionAndSpaceMode;
+ // <--
+ nFirstLineOffset = rFormat.nFirstLineOffset;
+ nAbsLSpace = rFormat.nAbsLSpace ;
+ nLSpace = rFormat.nLSpace ;
+ nCharTextDistance = rFormat.nCharTextDistance ;
+ // --> OD 2008-01-09 #newlistlevelattrs#
+ 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;
+}
+/* -----------------27.10.98 10:56-------------------
+ *
+ * --------------------------------------------------*/
+BOOL SvxNumberFormat::operator==( const SvxNumberFormat& rFormat) const
+{
+ if( GetNumberingType() != rFormat.GetNumberingType() ||
+ eNumAdjust != rFormat.eNumAdjust ||
+ nInclUpperLevels != rFormat.nInclUpperLevels ||
+ nStart != rFormat.nStart ||
+ cBullet != rFormat.cBullet ||
+ // --> OD 2008-01-09 #newlistlevelattrs#
+ mePositionAndSpaceMode != rFormat.mePositionAndSpaceMode ||
+ // <--
+ nFirstLineOffset != rFormat.nFirstLineOffset ||
+ nAbsLSpace != rFormat.nAbsLSpace ||
+ nLSpace != rFormat.nLSpace ||
+ nCharTextDistance != rFormat.nCharTextDistance ||
+ // --> OD 2008-01-09 #newlistlevelattrs#
+ 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 FALSE;
+ if (
+ (pGraphicBrush && !rFormat.pGraphicBrush) ||
+ (!pGraphicBrush && rFormat.pGraphicBrush) ||
+ (pGraphicBrush && *pGraphicBrush != *rFormat.pGraphicBrush)
+ )
+ {
+ return FALSE;
+ }
+ if (
+ (pBulletFont && !rFormat.pBulletFont) ||
+ (!pBulletFont && rFormat.pBulletFont) ||
+ (pBulletFont && *pBulletFont != *rFormat.pBulletFont)
+ )
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+/* -----------------28.10.98 09:53-------------------
+ *
+ * --------------------------------------------------*/
+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;
+}
+/* -----------------28.10.98 09:59-------------------
+ *
+ * --------------------------------------------------*/
+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;
+}
+/* -----------------------------22.02.01 15:55--------------------------------
+
+ ---------------------------------------------------------------------------*/
+void SvxNumberFormat::SetVertOrient(sal_Int16 eSet)
+{
+ eVertOrient = eSet;
+}
+/* -----------------------------22.02.01 15:55--------------------------------
+
+ ---------------------------------------------------------------------------*/
+sal_Int16 SvxNumberFormat::GetVertOrient() const
+{
+ return eVertOrient;
+}
+/* -----------------28.10.98 09:59-------------------
+ *
+ * --------------------------------------------------*/
+void SvxNumberFormat::SetBulletFont(const Font* pFont)
+{
+ delete pBulletFont;
+ pBulletFont = pFont ? new Font(*pFont): 0;
+}
+
+// --> OD 2008-01-09 #newlistlevelattrs#
+SvxNumberFormat::SvxNumPositionAndSpaceMode SvxNumberFormat::GetPositionAndSpaceMode() const
+{
+ return mePositionAndSpaceMode;
+}
+void SvxNumberFormat::SetPositionAndSpaceMode( SvxNumPositionAndSpaceMode ePositionAndSpaceMode )
+{
+ mePositionAndSpaceMode = ePositionAndSpaceMode;
+}
+
+short SvxNumberFormat::GetLSpace() const
+{
+//#if OSL_DEBUG_LEVEL > 1
+// DBG_ASSERT( mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION,
+// "<SvxNumberFormat::GetLSpace()> - misusage: position-and-space-mode does not equal LABEL_WIDTH_AND_POSITION");
+//#endif
+ return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION ? nLSpace : 0;
+}
+short SvxNumberFormat::GetAbsLSpace() const
+{
+//#if OSL_DEBUG_LEVEL > 1
+// DBG_ASSERT( mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION,
+// "<SvxNumberFormat::GetAbsLSpace()> - misusage: position-and-space-mode does not equal LABEL_WIDTH_AND_POSITION");
+//#endif
+ return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION
+ ? nAbsLSpace
+ : static_cast<short>( GetFirstLineIndent() + GetIndentAt() );
+}
+short SvxNumberFormat::GetFirstLineOffset() const
+{
+//#if OSL_DEBUG_LEVEL > 1
+// DBG_ASSERT( mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION,
+// "<SvxNumberFormat::GetFirstLineOffset()> - misusage: position-and-space-mode does not equal LABEL_WIDTH_AND_POSITION");
+//#endif
+ return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION
+ ? nFirstLineOffset
+ : static_cast<short>( GetFirstLineIndent() );
+}
+short SvxNumberFormat::GetCharTextDistance() const
+{
+//#if OSL_DEBUG_LEVEL > 1
+// DBG_ASSERT( mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION,
+// "<SvxNumberFormat::GetCharTextDistance()> - misusage: position-and-space-mode does not equal LABEL_WIDTH_AND_POSITION");
+//#endif
+ 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;
+}
+// <--
+
+/* -----------------28.10.98 10:03-------------------
+ *
+ * --------------------------------------------------*/
+IMPL_STATIC_LINK( SvxNumberFormat, GraphicArrived, void *, EMPTYARG )
+{
+ // ggfs. die GrfSize setzen:
+ if( !pThis->aGraphicSize.Width() || !pThis->aGraphicSize.Height() )
+ {
+ const Graphic* pGrf = pThis->pGraphicBrush->GetGraphic();
+ if( pGrf )
+ pThis->aGraphicSize = SvxNumberFormat::GetGraphicSizeMM100( pGrf );
+ }
+ pThis->NotifyGraphicArrived();
+ return 0;
+}
+/* -----------------------------02.07.01 15:36--------------------------------
+
+ ---------------------------------------------------------------------------*/
+void SvxNumberFormat::NotifyGraphicArrived()
+{
+}
+
+/* -----------------28.10.98 10:38-------------------
+ *
+ * --------------------------------------------------*/
+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;
+}
+/* -----------------28.10.98 15:57-------------------
+ *
+ * --------------------------------------------------*/
+String SvxNumberFormat::CreateRomanString( ULONG nNo, BOOL bUpper )
+{
+ nNo %= 4000; // mehr kann nicht dargestellt werden
+// 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-Eintraege !!
+ : "mdclxvi--"; // +2 Dummy-Eintraege !!
+
+ String sRet;
+ USHORT nMask = 1000;
+ while( nMask )
+ {
+ BYTE nZahl = BYTE(nNo / nMask);
+ BYTE 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; // zur naechsten Dekade
+ cRomanArr += 2;
+ }
+ return sRet;
+}
+#ifdef OLD_NUMBER_FORMATTING
+void SvxNumberFormat::GetCharStr( ULONG nNo, String& rStr ) const
+{
+ DBG_ASSERT( nNo, "0 ist eine ungueltige Nummer !!" );
+
+ const ULONG coDiff = 'Z' - 'A' +1;
+ char cAdd = (SVX_NUM_CHARS_UPPER_LETTER == eNumType ? 'A' : 'a') - 1;
+ ULONG nCalc;
+
+ do {
+ nCalc = nNo % coDiff;
+ if( !nCalc )
+ nCalc = coDiff;
+ rStr.Insert( sal_Unicode(cAdd + nCalc ), 0 );
+ nNo -= nCalc;
+ if( nNo )
+ nNo /= coDiff;
+ } while( nNo );
+}
+
+void SvxNumberFormat::GetCharStrN( ULONG nNo, String& rStr ) const
+{
+ DBG_ASSERT( nNo, "0 ist eine ungueltige Nummer !!" );
+
+ const ULONG coDiff = 'Z' - 'A' +1;
+ char cChar = (char)(--nNo % coDiff);
+ if( SVX_NUM_CHARS_UPPER_LETTER_N == eNumType )
+ cChar += 'A';
+ else
+ cChar += 'a';
+
+ rStr.Fill( (USHORT)(nNo / coDiff) + 1, sal_Unicode(cChar) );
+}
+#endif //OLD_NUMBER_FORMATTING
+/* -----------------------------22.02.01 13:31--------------------------------
+
+ ---------------------------------------------------------------------------*/
+const String& SvxNumberFormat::GetCharFmtName()const
+{
+ return sCharStyleName;
+}
+/* -----------------27.10.98 10:38-------------------
+ *
+ * --------------------------------------------------*/
+sal_Int32 SvxNumRule::nRefCount = 0;
+static SvxNumberFormat* pStdNumFmt = 0;
+static SvxNumberFormat* pStdOutlineNumFmt = 0;
+// --> OD 2008-02-11 #newlistlevelattrs#
+SvxNumRule::SvxNumRule( ULONG nFeatures,
+ USHORT nLevels,
+ 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(USHORT i = 0; i < SVX_MAX_NUM; i++)
+ {
+ if(i < nLevels)
+ {
+ aFmts[i] = new SvxNumberFormat(SVX_NUM_CHARS_UPPER_LETTER);
+ //daran wird zwischen writer und draw unterschieden
+ if(nFeatures & NUM_CONTINUOUS)
+ {
+ // --> OD 2008-02-11 #newlistlevelattrs#
+ 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] = FALSE;
+ }
+}
+/* -----------------27.10.98 10:41-------------------
+ *
+ * --------------------------------------------------*/
+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(USHORT 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];
+ }
+}
+/* -----------------08.12.98 11:07-------------------
+ *
+ * --------------------------------------------------*/
+SvxNumRule::SvxNumRule(SvStream &rStream)
+{
+ ++nRefCount;
+ LanguageType eLang = Application::GetSettings().GetLanguage();
+ aLocale = SvxCreateLocale(eLang);
+ USHORT nVersion;
+ USHORT nTemp;
+ rStream >> nVersion;
+ rStream >> nLevelCount;
+ rStream >> nTemp;
+ nFeatureFlags = nTemp;
+ rStream >> nTemp;
+ bContinuousNumbering = (BOOL)nTemp;
+ rStream >> nTemp;
+ eNumberingType = (SvxNumRuleType)nTemp;
+ memset( aFmts, 0, sizeof( aFmts ));
+
+ for(USHORT i = 0; i < SVX_MAX_NUM; i++)
+ {
+ USHORT nSet;
+ rStream >> nSet;
+ if(nSet)
+ aFmts[i] = new SvxNumberFormat(rStream);
+ else
+ aFmts[i] = 0;
+ aFmtsSet[i] = aFmts[i] ? TRUE : FALSE;
+ }
+ if(NUMITEM_VERSION_02 <= nVersion)
+ {
+ USHORT nShort;
+ rStream >> nShort;
+ nFeatureFlags = nShort;
+ }
+}
+
+/* -----------------08.12.98 11:07-------------------
+ *
+ * --------------------------------------------------*/
+SvStream& SvxNumRule::Store(SvStream &rStream)
+{
+ rStream<<(USHORT)NUMITEM_VERSION_03;
+ rStream<<nLevelCount;
+ //first save of nFeatureFlags for old versions
+ rStream<<(USHORT)nFeatureFlags;
+ rStream<<(USHORT)bContinuousNumbering;
+ rStream<<(USHORT)eNumberingType;
+
+ FontToSubsFontConverter pConverter = 0;
+ BOOL bConvertBulletFont = rStream.GetVersion() <= SOFFICE_FILEFORMAT_50;
+ for(USHORT i = 0; i < SVX_MAX_NUM; i++)
+ {
+ if(aFmts[i])
+ {
+ rStream << USHORT(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 << USHORT(0);
+ }
+ //second save of nFeatureFlags for new versions
+ rStream<<(USHORT)nFeatureFlags;
+ if(pConverter)
+ DestroyFontToSubsFontConverter(pConverter);
+
+ return rStream;
+}
+
+/* -----------------27.10.98 10:41-------------------
+ *
+ * --------------------------------------------------*/
+SvxNumRule::~SvxNumRule()
+{
+ for(USHORT i = 0; i < SVX_MAX_NUM; i++)
+ delete aFmts[i];
+ if(!--nRefCount)
+ {
+ DELETEZ(pStdNumFmt);
+ DELETEZ(pStdOutlineNumFmt);
+ }
+}
+/* -----------------29.10.98 16:07-------------------
+ *
+ * --------------------------------------------------*/
+SvxNumRule& SvxNumRule::operator=( const SvxNumRule& rCopy )
+{
+ nLevelCount = rCopy.nLevelCount;
+ nFeatureFlags = rCopy.nFeatureFlags;
+ bContinuousNumbering = rCopy.bContinuousNumbering;
+ eNumberingType = rCopy.eNumberingType;
+ for(USHORT 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;
+}
+/* -----------------27.10.98 10:41-------------------
+ *
+ * --------------------------------------------------*/
+int SvxNumRule::operator==( const SvxNumRule& rCopy) const
+{
+ if(nLevelCount != rCopy.nLevelCount ||
+ nFeatureFlags != rCopy.nFeatureFlags ||
+ bContinuousNumbering != rCopy.bContinuousNumbering ||
+ eNumberingType != rCopy.eNumberingType)
+ return FALSE;
+ for(USHORT 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 FALSE;
+ }
+ }
+ return TRUE;
+}
+/* -----------------27.10.98 10:41-------------------
+ *
+ * --------------------------------------------------*/
+const SvxNumberFormat* SvxNumRule::Get(USHORT nLevel)const
+{
+ DBG_ASSERT(nLevel < SVX_MAX_NUM, "falsches Level" );
+ if( nLevel < SVX_MAX_NUM )
+ return aFmtsSet[nLevel] ? aFmts[nLevel] : 0;
+ else
+ return 0;
+}
+/* -----------------02.11.98 09:10-------------------
+ *
+ * --------------------------------------------------*/
+const SvxNumberFormat& SvxNumRule::GetLevel(USHORT nLevel)const
+{
+ if(!pStdNumFmt)
+ {
+ pStdNumFmt = new SvxNumberFormat(SVX_NUM_ARABIC);
+ pStdOutlineNumFmt = new SvxNumberFormat(SVX_NUM_NUMBER_NONE);
+ }
+
+ DBG_ASSERT(nLevel < SVX_MAX_NUM, "falsches Level" );
+
+ return ( ( nLevel < SVX_MAX_NUM ) && aFmts[nLevel] ) ?
+ *aFmts[nLevel] : eNumberingType == SVX_RULETYPE_NUMBERING ?
+ *pStdNumFmt : *pStdOutlineNumFmt;
+}
+
+/* -----------------29.10.98 09:08-------------------
+ *
+ * --------------------------------------------------*/
+void SvxNumRule::SetLevel( USHORT i, const SvxNumberFormat& rNumFmt, BOOL bIsValid )
+{
+ DBG_ASSERT(i < SVX_MAX_NUM, "falsches Level" );
+
+ if( (i < SVX_MAX_NUM) && (!aFmtsSet[i] || !(rNumFmt == *Get( i ))) )
+ {
+ delete aFmts[ i ];
+ aFmts[ i ] = new SvxNumberFormat( rNumFmt );
+ aFmtsSet[i] = bIsValid;
+// bInvalidRuleFlag = TRUE;
+ }
+}
+/* -----------------30.10.98 12:44-------------------
+ *
+ * --------------------------------------------------*/
+void SvxNumRule::SetLevel(USHORT nLevel, const SvxNumberFormat* pFmt)
+{
+ DBG_ASSERT(nLevel < SVX_MAX_NUM, "falsches Level" );
+
+ if( nLevel < SVX_MAX_NUM )
+ {
+ aFmtsSet[nLevel] = 0 != pFmt;
+ if(pFmt)
+ SetLevel(nLevel, *pFmt);
+ else
+ {
+ delete aFmts[nLevel];
+ aFmts[nLevel] = 0;
+ }
+ }
+}
+/* -----------------28.10.98 15:38-------------------
+ *
+ * --------------------------------------------------*/
+String SvxNumRule::MakeNumString( const SvxNodeNum& rNum, 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() )
+ {
+ BYTE i = rNum.GetLevel();
+
+ if( !IsContinuousNumbering() &&
+ 1 < rMyNFmt.GetIncludeUpperLevels() ) // nur der eigene Level ?
+ {
+ BYTE 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() )
+ {
+ // Soll aus 1.1.1 --> 2. NoNum --> 1..1 oder 1.1 ??
+ // if( i != rNum.nMyLevel )
+ // aStr += aDotStr;
+ 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'); // alle 0-Level sind eine 0
+ if( i != rNum.GetLevel() && bDot)
+ aStr += sal_Unicode('.');
+ }
+ }
+
+ if( bInclStrings )
+ {
+ aStr.Insert( rMyNFmt.GetPrefix(), 0 );
+ aStr += rMyNFmt.GetSuffix();
+ }
+ }
+ return aStr;
+}
+/* -----------------18.08.99 10:18-------------------
+ Description: changes linked to embedded bitmaps
+ --------------------------------------------------*/
+BOOL SvxNumRule::UnLinkGraphics()
+{
+ BOOL bRet = FALSE;
+ for(USHORT 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 = TRUE;
+ }
+ }
+ else if((SVX_NUM_BITMAP|LINK_TOKEN) == aFmt.GetNumberingType())
+ aFmt.SetNumberingType(SVX_NUM_BITMAP);
+ SetLevel(i, aFmt);
+ }
+ return bRet;
+}
+
+/* -----------------27.10.98 10:41-------------------
+ *
+ * --------------------------------------------------*/
+SvxNumBulletItem::SvxNumBulletItem(SvxNumRule& rRule) :
+ SfxPoolItem(SID_ATTR_NUMBERING_RULE),
+ pNumRule(new SvxNumRule(rRule))
+{
+}
+
+/*-----------------23.11.98 10:36-------------------
+ MT: Das sind ja sehr sinnige Kommentare...
+--------------------------------------------------*/
+SvxNumBulletItem::SvxNumBulletItem(SvxNumRule& rRule, USHORT _nWhich ) :
+ SfxPoolItem(_nWhich),
+ pNumRule(new SvxNumRule(rRule))
+{
+}
+
+SfxPoolItem* SvxNumBulletItem::Create(SvStream &s, USHORT n) const
+{
+ return SfxPoolItem::Create(s, n );
+}
+
+/* -----------------27.10.98 10:41-------------------
+ *
+ * --------------------------------------------------*/
+SvxNumBulletItem::SvxNumBulletItem(const SvxNumBulletItem& rCopy) :
+ SfxPoolItem(rCopy.Which())
+{
+ pNumRule = new SvxNumRule(*rCopy.pNumRule);
+}
+/* -----------------27.10.98 10:41-------------------
+ *
+ * --------------------------------------------------*/
+SvxNumBulletItem::~SvxNumBulletItem()
+{
+ delete pNumRule;
+}
+
+/* -----------------27.10.98 10:41-------------------
+ *
+ * --------------------------------------------------*/
+int SvxNumBulletItem::operator==( const SfxPoolItem& rCopy) const
+{
+ return *pNumRule == *((SvxNumBulletItem&)rCopy).pNumRule;
+}
+/* -----------------27.10.98 10:41-------------------
+ *
+ * --------------------------------------------------*/
+SfxPoolItem* SvxNumBulletItem::Clone( SfxItemPool * ) const
+{
+ return new SvxNumBulletItem(*this);
+}
+/* -----------------08.12.98 10:43-------------------
+ *
+ * --------------------------------------------------*/
+USHORT SvxNumBulletItem::GetVersion( USHORT /*nFileVersion*/ ) const
+{
+ return NUMITEM_VERSION_03;
+}
+/* -----------------08.12.98 10:43-------------------
+ *
+ * --------------------------------------------------*/
+SvStream& SvxNumBulletItem::Store(SvStream &rStream, USHORT /*nItemVersion*/ )const
+{
+ pNumRule->Store(rStream);
+ return rStream;
+}
+
+/* -----------------08.12.98 10:43-------------------
+ *
+ * --------------------------------------------------*/
+
+sal_Bool SvxNumBulletItem::QueryValue( com::sun::star::uno::Any& rVal, BYTE /*nMemberId*/ ) const
+{
+ rVal <<= SvxCreateNumRule( pNumRule );
+ return sal_True;
+}
+
+sal_Bool SvxNumBulletItem::PutValue( const com::sun::star::uno::Any& rVal, BYTE /*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 sal_True;
+ }
+ catch(lang::IllegalArgumentException&)
+ {
+ }
+ }
+ return sal_False;
+}
+
+/* -----------------08.12.98 10:43-------------------
+ *
+ * --------------------------------------------------*/
+SvxNumRule* SvxConvertNumRule( const SvxNumRule* pRule, USHORT nLevels, SvxNumRuleType eType )
+{
+ const USHORT nSrcLevels = pRule->GetLevelCount();
+ SvxNumRule* pNewRule = new SvxNumRule( pRule->GetFeatureFlags(), nLevels, pRule->IsContinuousNumbering(), eType );
+
+ for( USHORT nLevel = 0; (nLevel < nLevels) && (nLevel < nSrcLevels); nLevel++ )
+ pNewRule->SetLevel( nLevel, pRule->GetLevel( nLevel ) );
+
+ return pNewRule;
+}