xref: /trunk/main/editeng/source/items/numitem.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*190118d0SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*190118d0SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*190118d0SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*190118d0SAndrew Rist  * distributed with this work for additional information
6*190118d0SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*190118d0SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*190118d0SAndrew Rist  * "License"); you may not use this file except in compliance
9*190118d0SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*190118d0SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*190118d0SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*190118d0SAndrew Rist  * software distributed under the License is distributed on an
15*190118d0SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*190118d0SAndrew Rist  * KIND, either express or implied.  See the License for the
17*190118d0SAndrew Rist  * specific language governing permissions and limitations
18*190118d0SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*190118d0SAndrew Rist  *************************************************************/
21*190118d0SAndrew Rist 
22*190118d0SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_editeng.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <editeng/numitem.hxx>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <com/sun/star/text/HoriOrientation.hpp>
30cdf0e10cSrcweir #include <com/sun/star/text/VertOrientation.hpp>
31cdf0e10cSrcweir #include <com/sun/star/text/RelOrientation.hpp>
32cdf0e10cSrcweir #include <editeng/brshitem.hxx>
33cdf0e10cSrcweir #include <vcl/font.hxx>
34cdf0e10cSrcweir #include <editeng/editids.hrc>
35cdf0e10cSrcweir #include <editeng/editrids.hrc>
36cdf0e10cSrcweir #include <editeng/numdef.hxx>
37cdf0e10cSrcweir #include <vcl/graph.hxx>
38cdf0e10cSrcweir #include <vcl/window.hxx>
39cdf0e10cSrcweir #include <vcl/svapp.hxx>
40cdf0e10cSrcweir #include <editeng/unolingu.hxx>
41cdf0e10cSrcweir #include <com/sun/star/text/XNumberingFormatter.hpp>
42cdf0e10cSrcweir #include <com/sun/star/text/XDefaultNumberingProvider.hpp>
43cdf0e10cSrcweir #include <com/sun/star/style/NumberingType.hpp>
44cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
45cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
46cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #include <editeng/unonrule.hxx>
49cdf0e10cSrcweir 
50cdf0e10cSrcweir #define MM100_TO_TWIP(MM100)    ((MM100*72L+63L)/127L)
51cdf0e10cSrcweir 
52cdf0e10cSrcweir #define DEF_WRITER_LSPACE   500     //Standardeinrueckung
53cdf0e10cSrcweir #define DEF_DRAW_LSPACE     800     //Standardeinrueckung
54cdf0e10cSrcweir 
55cdf0e10cSrcweir #define NUMITEM_VERSION_01        0x01
56cdf0e10cSrcweir #define NUMITEM_VERSION_02        0x02
57cdf0e10cSrcweir #define NUMITEM_VERSION_03        0x03
58cdf0e10cSrcweir #define NUMITEM_VERSION_04        0x04
59cdf0e10cSrcweir 
60cdf0e10cSrcweir using namespace ::com::sun::star;
61cdf0e10cSrcweir using namespace ::com::sun::star::lang;
62cdf0e10cSrcweir using namespace ::com::sun::star::uno;
63cdf0e10cSrcweir using namespace ::com::sun::star::text;
64cdf0e10cSrcweir using namespace ::com::sun::star::beans;
65cdf0e10cSrcweir using namespace ::com::sun::star::style;
66cdf0e10cSrcweir 
67cdf0e10cSrcweir sal_Int32 SvxNumberType::nRefCount = 0;
68cdf0e10cSrcweir com::sun::star::uno::Reference<com::sun::star::text::XNumberingFormatter> SvxNumberType::xFormatter = 0;
lcl_getFormatter(com::sun::star::uno::Reference<com::sun::star::text::XNumberingFormatter> & _xFormatter)69cdf0e10cSrcweir void lcl_getFormatter(com::sun::star::uno::Reference<com::sun::star::text::XNumberingFormatter>& _xFormatter)
70cdf0e10cSrcweir {
71cdf0e10cSrcweir     if(!_xFormatter.is())
72cdf0e10cSrcweir     {
73cdf0e10cSrcweir         try
74cdf0e10cSrcweir         {
75cdf0e10cSrcweir             Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
76cdf0e10cSrcweir             Reference < XInterface > xI = xMSF->createInstance(
77cdf0e10cSrcweir                 ::rtl::OUString::createFromAscii( "com.sun.star.text.DefaultNumberingProvider" ) );
78cdf0e10cSrcweir             Reference<XDefaultNumberingProvider> xRet(xI, UNO_QUERY);
79cdf0e10cSrcweir             DBG_ASSERT(xRet.is(), "service missing: \"com.sun.star.text.DefaultNumberingProvider\"");
80cdf0e10cSrcweir             _xFormatter = Reference<XNumberingFormatter> (xRet, UNO_QUERY);
81cdf0e10cSrcweir         }
82cdf0e10cSrcweir         catch(Exception& )
83cdf0e10cSrcweir         {
84cdf0e10cSrcweir         }
85cdf0e10cSrcweir     }
86cdf0e10cSrcweir }
87cdf0e10cSrcweir /* -----------------------------22.02.01 14:24--------------------------------
88cdf0e10cSrcweir 
89cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
SvxNumberType(sal_Int16 nType)90cdf0e10cSrcweir SvxNumberType::SvxNumberType(sal_Int16 nType) :
91cdf0e10cSrcweir     nNumType(nType),
92cdf0e10cSrcweir     bShowSymbol(sal_True)
93cdf0e10cSrcweir {
94cdf0e10cSrcweir     nRefCount++;
95cdf0e10cSrcweir }
96cdf0e10cSrcweir /* -----------------------------22.02.01 14:31--------------------------------
97cdf0e10cSrcweir 
98cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
SvxNumberType(const SvxNumberType & rType)99cdf0e10cSrcweir SvxNumberType::SvxNumberType(const SvxNumberType& rType) :
100cdf0e10cSrcweir     nNumType(rType.nNumType),
101cdf0e10cSrcweir     bShowSymbol(rType.bShowSymbol)
102cdf0e10cSrcweir {
103cdf0e10cSrcweir     nRefCount++;
104cdf0e10cSrcweir }
105cdf0e10cSrcweir /* -----------------------------22.02.01 14:24--------------------------------
106cdf0e10cSrcweir 
107cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
~SvxNumberType()108cdf0e10cSrcweir SvxNumberType::~SvxNumberType()
109cdf0e10cSrcweir {
110cdf0e10cSrcweir     if(!--nRefCount)
111cdf0e10cSrcweir         xFormatter = 0;
112cdf0e10cSrcweir }
113cdf0e10cSrcweir /* -----------------------------22.02.01 11:09--------------------------------
114cdf0e10cSrcweir 
115cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
GetNumStr(sal_uLong nNo) const116cdf0e10cSrcweir String SvxNumberType::GetNumStr( sal_uLong nNo ) const
117cdf0e10cSrcweir {
118cdf0e10cSrcweir     LanguageType eLang = Application::GetSettings().GetLanguage();
119cdf0e10cSrcweir     Locale aLocale = SvxCreateLocale(eLang);
120cdf0e10cSrcweir     return GetNumStr( nNo, aLocale );
121cdf0e10cSrcweir }
122cdf0e10cSrcweir /* -----------------28.10.98 15:56-------------------
123cdf0e10cSrcweir  *
124cdf0e10cSrcweir  * --------------------------------------------------*/
GetNumStr(sal_uLong nNo,const Locale & rLocale) const125cdf0e10cSrcweir String  SvxNumberType::GetNumStr( sal_uLong nNo, const Locale& rLocale ) const
126cdf0e10cSrcweir {
127cdf0e10cSrcweir     lcl_getFormatter(xFormatter);
128cdf0e10cSrcweir     String aTmpStr;
129cdf0e10cSrcweir     if(!xFormatter.is())
130cdf0e10cSrcweir         return aTmpStr;
131cdf0e10cSrcweir 
132cdf0e10cSrcweir     if(bShowSymbol)
133cdf0e10cSrcweir     {
134cdf0e10cSrcweir         switch(nNumType)
135cdf0e10cSrcweir         {
136cdf0e10cSrcweir             case NumberingType::CHAR_SPECIAL:
137cdf0e10cSrcweir             case NumberingType::BITMAP:
138cdf0e10cSrcweir             break;
139cdf0e10cSrcweir             default:
140cdf0e10cSrcweir                 {
141cdf0e10cSrcweir                     //#95525# '0' allowed for ARABIC numberings
142cdf0e10cSrcweir                     if(NumberingType::ARABIC == nNumType && 0 == nNo )
143cdf0e10cSrcweir                         aTmpStr = '0';
144cdf0e10cSrcweir                     else
145cdf0e10cSrcweir                     {
146cdf0e10cSrcweir                         Sequence< PropertyValue > aProperties(2);
147cdf0e10cSrcweir                         PropertyValue* pValues = aProperties.getArray();
148cdf0e10cSrcweir                         pValues[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NumberingType"));
149cdf0e10cSrcweir                         pValues[0].Value <<= nNumType;
150cdf0e10cSrcweir                         pValues[1].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Value"));
151cdf0e10cSrcweir                         pValues[1].Value <<= (sal_Int32)nNo;
152cdf0e10cSrcweir 
153cdf0e10cSrcweir                         try
154cdf0e10cSrcweir                         {
155cdf0e10cSrcweir                             aTmpStr = xFormatter->makeNumberingString( aProperties, rLocale );
156cdf0e10cSrcweir                         }
157cdf0e10cSrcweir                         catch(Exception&)
158cdf0e10cSrcweir                         {
159cdf0e10cSrcweir                         }
160cdf0e10cSrcweir                     }
161cdf0e10cSrcweir                 }
162cdf0e10cSrcweir         }
163cdf0e10cSrcweir     }
164cdf0e10cSrcweir     return aTmpStr;
165cdf0e10cSrcweir }
166cdf0e10cSrcweir /* -----------------27.10.98 10:33-------------------
167cdf0e10cSrcweir  *
168cdf0e10cSrcweir  * --------------------------------------------------*/
169cdf0e10cSrcweir // --> OD 2008-01-09 #newlistlevelattrs#
SvxNumberFormat(sal_Int16 eType,SvxNumPositionAndSpaceMode ePositionAndSpaceMode)170cdf0e10cSrcweir SvxNumberFormat::SvxNumberFormat( sal_Int16 eType,
171cdf0e10cSrcweir                                   SvxNumPositionAndSpaceMode ePositionAndSpaceMode )
172cdf0e10cSrcweir // <--
173cdf0e10cSrcweir     : SvxNumberType(eType),
174cdf0e10cSrcweir       eNumAdjust(SVX_ADJUST_LEFT),
175cdf0e10cSrcweir       nInclUpperLevels(0),
176cdf0e10cSrcweir       nStart(1),
177cdf0e10cSrcweir       cBullet(SVX_DEF_BULLET),
178cdf0e10cSrcweir       nBulletRelSize(100),
179cdf0e10cSrcweir       nBulletColor(COL_BLACK),
180cdf0e10cSrcweir       // --> OD 2008-01-09 #newlistlevelattrs#
181cdf0e10cSrcweir       mePositionAndSpaceMode( ePositionAndSpaceMode ),
182cdf0e10cSrcweir       // <--
183cdf0e10cSrcweir       nFirstLineOffset(0),
184cdf0e10cSrcweir       nAbsLSpace(0),
185cdf0e10cSrcweir       nLSpace(0),
186cdf0e10cSrcweir       nCharTextDistance(0),
187cdf0e10cSrcweir       // --> OD 2008-01-09 #newlistlevelattrs#
188cdf0e10cSrcweir       meLabelFollowedBy( LISTTAB ),
189cdf0e10cSrcweir       mnListtabPos( 0 ),
190cdf0e10cSrcweir       mnFirstLineIndent( 0 ),
191cdf0e10cSrcweir       mnIndentAt( 0 ),
192cdf0e10cSrcweir       // <--
193cdf0e10cSrcweir       pGraphicBrush(0),
194cdf0e10cSrcweir       eVertOrient(text::VertOrientation::NONE),
195cdf0e10cSrcweir       pBulletFont(0)
196cdf0e10cSrcweir {
197cdf0e10cSrcweir }
198cdf0e10cSrcweir /* -----------------27.10.98 10:56-------------------
199cdf0e10cSrcweir  *
200cdf0e10cSrcweir  * --------------------------------------------------*/
SvxNumberFormat(const SvxNumberFormat & rFormat)201cdf0e10cSrcweir SvxNumberFormat::SvxNumberFormat(const SvxNumberFormat& rFormat) :
202cdf0e10cSrcweir     SvxNumberType(rFormat),
203cdf0e10cSrcweir     // --> OD 2008-01-09 #newlistlevelattrs#
204cdf0e10cSrcweir     mePositionAndSpaceMode( rFormat.mePositionAndSpaceMode ),
205cdf0e10cSrcweir     // <--
206cdf0e10cSrcweir     pGraphicBrush(0),
207cdf0e10cSrcweir     pBulletFont(0)
208cdf0e10cSrcweir {
209cdf0e10cSrcweir     *this = rFormat;
210cdf0e10cSrcweir }
211cdf0e10cSrcweir /* -----------------27.10.98 10:56-------------------
212cdf0e10cSrcweir  *
213cdf0e10cSrcweir  * --------------------------------------------------*/
~SvxNumberFormat()214cdf0e10cSrcweir SvxNumberFormat::~SvxNumberFormat()
215cdf0e10cSrcweir {
216cdf0e10cSrcweir     delete pGraphicBrush;
217cdf0e10cSrcweir     delete pBulletFont;
218cdf0e10cSrcweir }
219cdf0e10cSrcweir /* -----------------08.12.98 11:14-------------------
220cdf0e10cSrcweir  *
221cdf0e10cSrcweir  * --------------------------------------------------*/
SvxNumberFormat(SvStream & rStream)222cdf0e10cSrcweir SvxNumberFormat::SvxNumberFormat(SvStream &rStream)
223cdf0e10cSrcweir : mePositionAndSpaceMode( LABEL_WIDTH_AND_POSITION ),
224cdf0e10cSrcweir   meLabelFollowedBy( LISTTAB ),
225cdf0e10cSrcweir   mnListtabPos( 0 ),
226cdf0e10cSrcweir   mnFirstLineIndent( 0 ),
227cdf0e10cSrcweir   mnIndentAt( 0 )
228cdf0e10cSrcweir {
229cdf0e10cSrcweir 
230cdf0e10cSrcweir     sal_uInt16 nVersion;
231cdf0e10cSrcweir   rStream >> nVersion;
232cdf0e10cSrcweir 
233cdf0e10cSrcweir   sal_uInt16 nUSHORT;
234cdf0e10cSrcweir   rStream >> nUSHORT;
235cdf0e10cSrcweir   SetNumberingType((sal_Int16)nUSHORT);
236cdf0e10cSrcweir   rStream >> nUSHORT;
237cdf0e10cSrcweir   eNumAdjust      = (SvxAdjust)nUSHORT;
238cdf0e10cSrcweir   rStream >> nUSHORT;
239cdf0e10cSrcweir   nInclUpperLevels = (sal_uInt8)nUSHORT;
240cdf0e10cSrcweir   rStream >> nUSHORT;
241cdf0e10cSrcweir   nStart          = nUSHORT;
242cdf0e10cSrcweir   rStream >> nUSHORT;
243cdf0e10cSrcweir   cBullet = nUSHORT;
244cdf0e10cSrcweir 
245cdf0e10cSrcweir   short nShort;
246cdf0e10cSrcweir   rStream >> nShort;
247cdf0e10cSrcweir   nFirstLineOffset        = nShort;
248cdf0e10cSrcweir   rStream >> nShort;
249cdf0e10cSrcweir   nAbsLSpace              = nShort;
250cdf0e10cSrcweir   rStream >> nShort;
251cdf0e10cSrcweir   nLSpace                 = nShort;
252cdf0e10cSrcweir 
253cdf0e10cSrcweir   rStream >> nShort;
254cdf0e10cSrcweir   nCharTextDistance       = nShort;
255cdf0e10cSrcweir   rtl_TextEncoding eEnc = gsl_getSystemTextEncoding();
256cdf0e10cSrcweir   rStream.ReadByteString(sPrefix, eEnc);
257cdf0e10cSrcweir   rStream.ReadByteString(sSuffix, eEnc);
258cdf0e10cSrcweir   rStream.ReadByteString(sCharStyleName, eEnc);
259cdf0e10cSrcweir   rStream >> nUSHORT;
260cdf0e10cSrcweir   if(nUSHORT)
261cdf0e10cSrcweir   {
262cdf0e10cSrcweir         SvxBrushItem aHelper(0);
263cdf0e10cSrcweir       pGraphicBrush = (SvxBrushItem*) aHelper.Create( rStream, BRUSH_GRAPHIC_VERSION );
264cdf0e10cSrcweir   }
265cdf0e10cSrcweir   else
266cdf0e10cSrcweir       pGraphicBrush = 0;
267cdf0e10cSrcweir 
268cdf0e10cSrcweir   rStream >> nUSHORT;
269cdf0e10cSrcweir     eVertOrient          = (sal_Int16)nUSHORT;
270cdf0e10cSrcweir 
271cdf0e10cSrcweir   rStream >> nUSHORT;
272cdf0e10cSrcweir   if(nUSHORT)
273cdf0e10cSrcweir   {
274cdf0e10cSrcweir       pBulletFont = new Font;
275cdf0e10cSrcweir       rStream >> *pBulletFont;
276cdf0e10cSrcweir         if(!pBulletFont->GetCharSet())
277cdf0e10cSrcweir             pBulletFont->SetCharSet(rStream.GetStreamCharSet());
278cdf0e10cSrcweir     }
279cdf0e10cSrcweir   else
280cdf0e10cSrcweir       pBulletFont = 0;
281cdf0e10cSrcweir   rStream >> aGraphicSize;
282cdf0e10cSrcweir 
283cdf0e10cSrcweir   rStream >> nBulletColor;
284cdf0e10cSrcweir   rStream >> nUSHORT;
285cdf0e10cSrcweir   nBulletRelSize = nUSHORT;
286cdf0e10cSrcweir   rStream >> nUSHORT;
287cdf0e10cSrcweir   SetShowSymbol((sal_Bool)nUSHORT);
288cdf0e10cSrcweir 
289cdf0e10cSrcweir   if( nVersion < NUMITEM_VERSION_03 )
290cdf0e10cSrcweir       cBullet = ByteString::ConvertToUnicode( (sal_Char)cBullet,
291cdf0e10cSrcweir                           (pBulletFont&&pBulletFont->GetCharSet()) ?  pBulletFont->GetCharSet()
292cdf0e10cSrcweir                                       : RTL_TEXTENCODING_SYMBOL );
293cdf0e10cSrcweir     if(pBulletFont)
294cdf0e10cSrcweir     {
295cdf0e10cSrcweir         sal_Bool bConvertBulletFont = rStream.GetVersion() <= SOFFICE_FILEFORMAT_50;
296cdf0e10cSrcweir         if(bConvertBulletFont)
297cdf0e10cSrcweir         {
298cdf0e10cSrcweir 
299cdf0e10cSrcweir             FontToSubsFontConverter pConverter =
300cdf0e10cSrcweir                         CreateFontToSubsFontConverter(pBulletFont->GetName(),
301cdf0e10cSrcweir                             FONTTOSUBSFONT_IMPORT|FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS);
302cdf0e10cSrcweir             if(pConverter)
303cdf0e10cSrcweir             {
304cdf0e10cSrcweir                 cBullet = ConvertFontToSubsFontChar(pConverter, cBullet);
305cdf0e10cSrcweir                 String sFontName = GetFontToSubsFontName(pConverter);
306cdf0e10cSrcweir                 pBulletFont->SetName(sFontName);
307cdf0e10cSrcweir                 DestroyFontToSubsFontConverter(pConverter);
308cdf0e10cSrcweir             }
309cdf0e10cSrcweir         }
310cdf0e10cSrcweir     }
311cdf0e10cSrcweir 
312cdf0e10cSrcweir     if( NUMITEM_VERSION_04 <= nVersion )
313cdf0e10cSrcweir     {
314cdf0e10cSrcweir         rStream >> nUSHORT;
315cdf0e10cSrcweir         mePositionAndSpaceMode = (SvxNumPositionAndSpaceMode) nUSHORT;
316cdf0e10cSrcweir         rStream >> nUSHORT;
317cdf0e10cSrcweir         meLabelFollowedBy = ( SvxNumLabelFollowedBy ) nUSHORT;
318cdf0e10cSrcweir         long nLong;
319cdf0e10cSrcweir         rStream >> nLong;
320cdf0e10cSrcweir         mnListtabPos = nLong;
321cdf0e10cSrcweir         rStream >> nLong;
322cdf0e10cSrcweir         mnFirstLineIndent = nLong;
323cdf0e10cSrcweir         rStream >> nLong;
324cdf0e10cSrcweir         mnIndentAt = nLong;
325cdf0e10cSrcweir     }
326cdf0e10cSrcweir }
327cdf0e10cSrcweir /* -----------------08.12.98 11:14-------------------
328cdf0e10cSrcweir  *
329cdf0e10cSrcweir  * --------------------------------------------------*/
Store(SvStream & rStream,FontToSubsFontConverter pConverter)330cdf0e10cSrcweir SvStream&   SvxNumberFormat::Store(SvStream &rStream, FontToSubsFontConverter pConverter)
331cdf0e10cSrcweir {
332cdf0e10cSrcweir     if(pConverter && pBulletFont)
333cdf0e10cSrcweir     {
334cdf0e10cSrcweir         cBullet = ConvertFontToSubsFontChar(pConverter, cBullet);
335cdf0e10cSrcweir         String sFontName = GetFontToSubsFontName(pConverter);
336cdf0e10cSrcweir         pBulletFont->SetName(sFontName);
337cdf0e10cSrcweir     }
338cdf0e10cSrcweir 
339cdf0e10cSrcweir     rStream << (sal_uInt16)NUMITEM_VERSION_04;
340cdf0e10cSrcweir 
341cdf0e10cSrcweir     rStream << (sal_uInt16)GetNumberingType();
342cdf0e10cSrcweir     rStream << (sal_uInt16)eNumAdjust;
343cdf0e10cSrcweir     rStream << (sal_uInt16)nInclUpperLevels;
344cdf0e10cSrcweir     rStream << nStart;
345cdf0e10cSrcweir     rStream << (sal_uInt16)cBullet;
346cdf0e10cSrcweir 
347cdf0e10cSrcweir     rStream << nFirstLineOffset;
348cdf0e10cSrcweir     rStream << nAbsLSpace;
349cdf0e10cSrcweir     rStream << nLSpace;
350cdf0e10cSrcweir 
351cdf0e10cSrcweir     rStream << nCharTextDistance;
352cdf0e10cSrcweir     rtl_TextEncoding eEnc = gsl_getSystemTextEncoding();
353cdf0e10cSrcweir     rStream.WriteByteString(sPrefix, eEnc);
354cdf0e10cSrcweir     rStream.WriteByteString(sSuffix, eEnc);
355cdf0e10cSrcweir     rStream.WriteByteString(sCharStyleName, eEnc);
356cdf0e10cSrcweir     if(pGraphicBrush)
357cdf0e10cSrcweir     {
358cdf0e10cSrcweir         rStream << (sal_uInt16)1;
359cdf0e10cSrcweir 
360cdf0e10cSrcweir         // #75113# in SD or SI force bullet itself to be stored,
361cdf0e10cSrcweir         // for that purpose throw away link when link and graphic
362cdf0e10cSrcweir         // are present, so Brush save is forced
363cdf0e10cSrcweir         if(pGraphicBrush->GetGraphicLink() && pGraphicBrush->GetGraphic())
364cdf0e10cSrcweir         {
365cdf0e10cSrcweir             String aEmpty;
366cdf0e10cSrcweir             pGraphicBrush->SetGraphicLink(aEmpty);
367cdf0e10cSrcweir         }
368cdf0e10cSrcweir 
369cdf0e10cSrcweir         pGraphicBrush->Store(rStream, BRUSH_GRAPHIC_VERSION);
370cdf0e10cSrcweir     }
371cdf0e10cSrcweir     else
372cdf0e10cSrcweir         rStream << (sal_uInt16)0;
373cdf0e10cSrcweir 
374cdf0e10cSrcweir     rStream << (sal_uInt16)eVertOrient;
375cdf0e10cSrcweir     if(pBulletFont)
376cdf0e10cSrcweir     {
377cdf0e10cSrcweir         rStream << (sal_uInt16)1;
378cdf0e10cSrcweir         rStream << *pBulletFont;
379cdf0e10cSrcweir     }
380cdf0e10cSrcweir     else
381cdf0e10cSrcweir         rStream << (sal_uInt16)0;
382cdf0e10cSrcweir     rStream << aGraphicSize;
383cdf0e10cSrcweir 
384cdf0e10cSrcweir     Color nTempColor = nBulletColor;
385cdf0e10cSrcweir     if(COL_AUTO == nBulletColor.GetColor())
386cdf0e10cSrcweir         nTempColor = COL_BLACK;
387cdf0e10cSrcweir     rStream << nTempColor;
388cdf0e10cSrcweir     rStream << nBulletRelSize;
389cdf0e10cSrcweir     rStream << (sal_uInt16)IsShowSymbol();
390cdf0e10cSrcweir 
391cdf0e10cSrcweir     rStream << ( sal_uInt16 ) mePositionAndSpaceMode;
392cdf0e10cSrcweir     rStream << ( sal_uInt16 ) meLabelFollowedBy;
393cdf0e10cSrcweir     rStream << ( long ) mnListtabPos;
394cdf0e10cSrcweir     rStream << ( long ) mnFirstLineIndent;
395cdf0e10cSrcweir     rStream << ( long ) mnIndentAt;
396cdf0e10cSrcweir 
397cdf0e10cSrcweir     return rStream;
398cdf0e10cSrcweir }
399cdf0e10cSrcweir 
400cdf0e10cSrcweir /* -----------------------------23.02.01 11:10--------------------------------
401cdf0e10cSrcweir 
402cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
operator =(const SvxNumberFormat & rFormat)403cdf0e10cSrcweir SvxNumberFormat& SvxNumberFormat::operator=( const SvxNumberFormat& rFormat )
404cdf0e10cSrcweir {
405cdf0e10cSrcweir     if (& rFormat == this) { return *this; }
406cdf0e10cSrcweir 
407cdf0e10cSrcweir     SetNumberingType(rFormat.GetNumberingType());
408cdf0e10cSrcweir         eNumAdjust          = rFormat.eNumAdjust ;
409cdf0e10cSrcweir         nInclUpperLevels    = rFormat.nInclUpperLevels ;
410cdf0e10cSrcweir         nStart              = rFormat.nStart ;
411cdf0e10cSrcweir         cBullet             = rFormat.cBullet ;
412cdf0e10cSrcweir         // --> OD 2008-01-09 #newlistlevelattrs#
413cdf0e10cSrcweir         mePositionAndSpaceMode = rFormat.mePositionAndSpaceMode;
414cdf0e10cSrcweir         // <--
415cdf0e10cSrcweir         nFirstLineOffset    = rFormat.nFirstLineOffset;
416cdf0e10cSrcweir         nAbsLSpace          = rFormat.nAbsLSpace ;
417cdf0e10cSrcweir         nLSpace             = rFormat.nLSpace ;
418cdf0e10cSrcweir         nCharTextDistance   = rFormat.nCharTextDistance ;
419cdf0e10cSrcweir         // --> OD 2008-01-09 #newlistlevelattrs#
420cdf0e10cSrcweir         meLabelFollowedBy = rFormat.meLabelFollowedBy;
421cdf0e10cSrcweir         mnListtabPos = rFormat.mnListtabPos;
422cdf0e10cSrcweir         mnFirstLineIndent = rFormat.mnFirstLineIndent;
423cdf0e10cSrcweir         mnIndentAt = rFormat.mnIndentAt;
424cdf0e10cSrcweir         // <--
425cdf0e10cSrcweir         eVertOrient         = rFormat.eVertOrient ;
426cdf0e10cSrcweir         sPrefix             = rFormat.sPrefix     ;
427cdf0e10cSrcweir         sSuffix             = rFormat.sSuffix     ;
428cdf0e10cSrcweir         aGraphicSize        = rFormat.aGraphicSize  ;
429cdf0e10cSrcweir         nBulletColor        = rFormat.nBulletColor   ;
430cdf0e10cSrcweir         nBulletRelSize      = rFormat.nBulletRelSize;
431cdf0e10cSrcweir         SetShowSymbol(rFormat.IsShowSymbol());
432cdf0e10cSrcweir         sCharStyleName      = rFormat.sCharStyleName;
433cdf0e10cSrcweir     DELETEZ(pGraphicBrush);
434cdf0e10cSrcweir     if(rFormat.pGraphicBrush)
435cdf0e10cSrcweir     {
436cdf0e10cSrcweir         pGraphicBrush = new SvxBrushItem(*rFormat.pGraphicBrush);
437cdf0e10cSrcweir         pGraphicBrush->SetDoneLink( STATIC_LINK( this, SvxNumberFormat, GraphicArrived) );
438cdf0e10cSrcweir     }
439cdf0e10cSrcweir     DELETEZ(pBulletFont);
440cdf0e10cSrcweir     if(rFormat.pBulletFont)
441cdf0e10cSrcweir             pBulletFont = new Font(*rFormat.pBulletFont);
442cdf0e10cSrcweir     return *this;
443cdf0e10cSrcweir }
444cdf0e10cSrcweir /* -----------------27.10.98 10:56-------------------
445cdf0e10cSrcweir  *
446cdf0e10cSrcweir  * --------------------------------------------------*/
operator ==(const SvxNumberFormat & rFormat) const447cdf0e10cSrcweir sal_Bool  SvxNumberFormat::operator==( const SvxNumberFormat& rFormat) const
448cdf0e10cSrcweir {
449cdf0e10cSrcweir     if( GetNumberingType()  != rFormat.GetNumberingType() ||
450cdf0e10cSrcweir         eNumAdjust          != rFormat.eNumAdjust ||
451cdf0e10cSrcweir         nInclUpperLevels    != rFormat.nInclUpperLevels ||
452cdf0e10cSrcweir         nStart              != rFormat.nStart ||
453cdf0e10cSrcweir         cBullet             != rFormat.cBullet ||
454cdf0e10cSrcweir         // --> OD 2008-01-09 #newlistlevelattrs#
455cdf0e10cSrcweir         mePositionAndSpaceMode != rFormat.mePositionAndSpaceMode ||
456cdf0e10cSrcweir         // <--
457cdf0e10cSrcweir         nFirstLineOffset    != rFormat.nFirstLineOffset ||
458cdf0e10cSrcweir         nAbsLSpace          != rFormat.nAbsLSpace ||
459cdf0e10cSrcweir         nLSpace             != rFormat.nLSpace ||
460cdf0e10cSrcweir         nCharTextDistance   != rFormat.nCharTextDistance ||
461cdf0e10cSrcweir         // --> OD 2008-01-09 #newlistlevelattrs#
462cdf0e10cSrcweir         meLabelFollowedBy != rFormat.meLabelFollowedBy ||
463cdf0e10cSrcweir         mnListtabPos != rFormat.mnListtabPos ||
464cdf0e10cSrcweir         mnFirstLineIndent != rFormat.mnFirstLineIndent ||
465cdf0e10cSrcweir         mnIndentAt != rFormat.mnIndentAt ||
466cdf0e10cSrcweir         // <--
467cdf0e10cSrcweir         eVertOrient         != rFormat.eVertOrient ||
468cdf0e10cSrcweir         sPrefix             != rFormat.sPrefix     ||
469cdf0e10cSrcweir         sSuffix             != rFormat.sSuffix     ||
470cdf0e10cSrcweir         aGraphicSize        != rFormat.aGraphicSize  ||
471cdf0e10cSrcweir         nBulletColor        != rFormat.nBulletColor   ||
472cdf0e10cSrcweir         nBulletRelSize      != rFormat.nBulletRelSize ||
473cdf0e10cSrcweir         IsShowSymbol()      != rFormat.IsShowSymbol() ||
474cdf0e10cSrcweir         sCharStyleName      != rFormat.sCharStyleName
475cdf0e10cSrcweir         )
476cdf0e10cSrcweir         return sal_False;
477cdf0e10cSrcweir     if (
478cdf0e10cSrcweir         (pGraphicBrush && !rFormat.pGraphicBrush) ||
479cdf0e10cSrcweir         (!pGraphicBrush && rFormat.pGraphicBrush) ||
480cdf0e10cSrcweir         (pGraphicBrush && *pGraphicBrush != *rFormat.pGraphicBrush)
481cdf0e10cSrcweir        )
482cdf0e10cSrcweir     {
483cdf0e10cSrcweir         return sal_False;
484cdf0e10cSrcweir     }
485cdf0e10cSrcweir     if (
486cdf0e10cSrcweir         (pBulletFont && !rFormat.pBulletFont) ||
487cdf0e10cSrcweir         (!pBulletFont && rFormat.pBulletFont) ||
488cdf0e10cSrcweir         (pBulletFont && *pBulletFont != *rFormat.pBulletFont)
489cdf0e10cSrcweir        )
490cdf0e10cSrcweir     {
491cdf0e10cSrcweir         return sal_False;
492cdf0e10cSrcweir     }
493cdf0e10cSrcweir     return sal_True;
494cdf0e10cSrcweir }
495cdf0e10cSrcweir /* -----------------28.10.98 09:53-------------------
496cdf0e10cSrcweir  *
497cdf0e10cSrcweir  * --------------------------------------------------*/
SetGraphicBrush(const SvxBrushItem * pBrushItem,const Size * pSize,const sal_Int16 * pOrient)498cdf0e10cSrcweir void SvxNumberFormat::SetGraphicBrush( const SvxBrushItem* pBrushItem,
499cdf0e10cSrcweir                     const Size* pSize, const sal_Int16* pOrient)
500cdf0e10cSrcweir {
501cdf0e10cSrcweir     if(!pBrushItem)
502cdf0e10cSrcweir     {
503cdf0e10cSrcweir         delete pGraphicBrush;
504cdf0e10cSrcweir         pGraphicBrush = 0;
505cdf0e10cSrcweir     }
506cdf0e10cSrcweir     else if ( !pGraphicBrush || (pGraphicBrush && !(*pBrushItem == *pGraphicBrush)) )
507cdf0e10cSrcweir     {
508cdf0e10cSrcweir         delete pGraphicBrush;
509cdf0e10cSrcweir         pGraphicBrush =  (SvxBrushItem*)pBrushItem->Clone();
510cdf0e10cSrcweir         pGraphicBrush->SetDoneLink( STATIC_LINK( this, SvxNumberFormat, GraphicArrived) );
511cdf0e10cSrcweir    }
512cdf0e10cSrcweir 
513cdf0e10cSrcweir     if(pOrient)
514cdf0e10cSrcweir         eVertOrient = *pOrient;
515cdf0e10cSrcweir     else
516cdf0e10cSrcweir         eVertOrient = text::VertOrientation::NONE;
517cdf0e10cSrcweir     if(pSize)
518cdf0e10cSrcweir         aGraphicSize = *pSize;
519cdf0e10cSrcweir     else
520cdf0e10cSrcweir         aGraphicSize.Width() = aGraphicSize.Height() = 0;
521cdf0e10cSrcweir }
522cdf0e10cSrcweir /* -----------------28.10.98 09:59-------------------
523cdf0e10cSrcweir  *
524cdf0e10cSrcweir  * --------------------------------------------------*/
SetGraphic(const String & rName)525cdf0e10cSrcweir void SvxNumberFormat::SetGraphic( const String& rName )
526cdf0e10cSrcweir {
527cdf0e10cSrcweir     const String* pName;
528cdf0e10cSrcweir     if( pGraphicBrush &&
529cdf0e10cSrcweir             0 != (pName = pGraphicBrush->GetGraphicLink())
530cdf0e10cSrcweir                 && *pName == rName )
531cdf0e10cSrcweir         return ;
532cdf0e10cSrcweir 
533cdf0e10cSrcweir     delete pGraphicBrush;
534cdf0e10cSrcweir     String sTmp;
535cdf0e10cSrcweir     pGraphicBrush = new SvxBrushItem( rName, sTmp, GPOS_AREA, 0 );
536cdf0e10cSrcweir     pGraphicBrush->SetDoneLink( STATIC_LINK( this, SvxNumberFormat, GraphicArrived) );
537cdf0e10cSrcweir     if( eVertOrient == text::VertOrientation::NONE )
538cdf0e10cSrcweir         eVertOrient = text::VertOrientation::TOP;
539cdf0e10cSrcweir 
540cdf0e10cSrcweir     aGraphicSize.Width() = aGraphicSize.Height() = 0;
541cdf0e10cSrcweir }
542cdf0e10cSrcweir /* -----------------------------22.02.01 15:55--------------------------------
543cdf0e10cSrcweir 
544cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
SetVertOrient(sal_Int16 eSet)545cdf0e10cSrcweir void SvxNumberFormat::SetVertOrient(sal_Int16 eSet)
546cdf0e10cSrcweir {
547cdf0e10cSrcweir     eVertOrient = eSet;
548cdf0e10cSrcweir }
549cdf0e10cSrcweir /* -----------------------------22.02.01 15:55--------------------------------
550cdf0e10cSrcweir 
551cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
GetVertOrient() const552cdf0e10cSrcweir sal_Int16    SvxNumberFormat::GetVertOrient() const
553cdf0e10cSrcweir {
554cdf0e10cSrcweir     return eVertOrient;
555cdf0e10cSrcweir }
556cdf0e10cSrcweir /* -----------------28.10.98 09:59-------------------
557cdf0e10cSrcweir  *
558cdf0e10cSrcweir  * --------------------------------------------------*/
SetBulletFont(const Font * pFont)559cdf0e10cSrcweir void SvxNumberFormat::SetBulletFont(const Font* pFont)
560cdf0e10cSrcweir {
561cdf0e10cSrcweir     delete pBulletFont;
562cdf0e10cSrcweir     pBulletFont = pFont ? new Font(*pFont): 0;
563cdf0e10cSrcweir }
564cdf0e10cSrcweir 
565cdf0e10cSrcweir // --> OD 2008-01-09 #newlistlevelattrs#
GetPositionAndSpaceMode() const566cdf0e10cSrcweir SvxNumberFormat::SvxNumPositionAndSpaceMode SvxNumberFormat::GetPositionAndSpaceMode() const
567cdf0e10cSrcweir {
568cdf0e10cSrcweir     return mePositionAndSpaceMode;
569cdf0e10cSrcweir }
SetPositionAndSpaceMode(SvxNumPositionAndSpaceMode ePositionAndSpaceMode)570cdf0e10cSrcweir void SvxNumberFormat::SetPositionAndSpaceMode( SvxNumPositionAndSpaceMode ePositionAndSpaceMode )
571cdf0e10cSrcweir {
572cdf0e10cSrcweir     mePositionAndSpaceMode = ePositionAndSpaceMode;
573cdf0e10cSrcweir }
574cdf0e10cSrcweir 
GetLSpace() const575cdf0e10cSrcweir short SvxNumberFormat::GetLSpace() const
576cdf0e10cSrcweir {
577cdf0e10cSrcweir //#if OSL_DEBUG_LEVEL > 1
578cdf0e10cSrcweir //    DBG_ASSERT( mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION,
579cdf0e10cSrcweir //                "<SvxNumberFormat::GetLSpace()> - misusage: position-and-space-mode does not equal LABEL_WIDTH_AND_POSITION");
580cdf0e10cSrcweir //#endif
581cdf0e10cSrcweir     return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION ? nLSpace : 0;
582cdf0e10cSrcweir }
GetAbsLSpace() const583cdf0e10cSrcweir short SvxNumberFormat::GetAbsLSpace() const
584cdf0e10cSrcweir {
585cdf0e10cSrcweir //#if OSL_DEBUG_LEVEL > 1
586cdf0e10cSrcweir //    DBG_ASSERT( mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION,
587cdf0e10cSrcweir //                "<SvxNumberFormat::GetAbsLSpace()> - misusage: position-and-space-mode does not equal LABEL_WIDTH_AND_POSITION");
588cdf0e10cSrcweir //#endif
589cdf0e10cSrcweir     return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION
590cdf0e10cSrcweir            ? nAbsLSpace
591cdf0e10cSrcweir            : static_cast<short>( GetFirstLineIndent() + GetIndentAt() );
592cdf0e10cSrcweir }
GetFirstLineOffset() const593cdf0e10cSrcweir short SvxNumberFormat::GetFirstLineOffset() const
594cdf0e10cSrcweir {
595cdf0e10cSrcweir //#if OSL_DEBUG_LEVEL > 1
596cdf0e10cSrcweir //    DBG_ASSERT( mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION,
597cdf0e10cSrcweir //                "<SvxNumberFormat::GetFirstLineOffset()> - misusage: position-and-space-mode does not equal LABEL_WIDTH_AND_POSITION");
598cdf0e10cSrcweir //#endif
599cdf0e10cSrcweir     return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION
600cdf0e10cSrcweir            ? nFirstLineOffset
601cdf0e10cSrcweir            : static_cast<short>( GetFirstLineIndent() );
602cdf0e10cSrcweir }
GetCharTextDistance() const603cdf0e10cSrcweir short SvxNumberFormat::GetCharTextDistance() const
604cdf0e10cSrcweir {
605cdf0e10cSrcweir //#if OSL_DEBUG_LEVEL > 1
606cdf0e10cSrcweir //    DBG_ASSERT( mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION,
607cdf0e10cSrcweir //                "<SvxNumberFormat::GetCharTextDistance()> - misusage: position-and-space-mode does not equal LABEL_WIDTH_AND_POSITION");
608cdf0e10cSrcweir //#endif
609cdf0e10cSrcweir     return mePositionAndSpaceMode == LABEL_WIDTH_AND_POSITION ? nCharTextDistance : 0;
610cdf0e10cSrcweir }
611cdf0e10cSrcweir 
SetLabelFollowedBy(const SvxNumLabelFollowedBy eLabelFollowedBy)612cdf0e10cSrcweir void SvxNumberFormat::SetLabelFollowedBy( const SvxNumLabelFollowedBy eLabelFollowedBy )
613cdf0e10cSrcweir {
614cdf0e10cSrcweir     meLabelFollowedBy = eLabelFollowedBy;
615cdf0e10cSrcweir }
GetLabelFollowedBy() const616cdf0e10cSrcweir SvxNumberFormat::SvxNumLabelFollowedBy SvxNumberFormat::GetLabelFollowedBy() const
617cdf0e10cSrcweir {
618cdf0e10cSrcweir     return meLabelFollowedBy;
619cdf0e10cSrcweir }
SetListtabPos(const long nListtabPos)620cdf0e10cSrcweir void SvxNumberFormat::SetListtabPos( const long nListtabPos )
621cdf0e10cSrcweir {
622cdf0e10cSrcweir     mnListtabPos = nListtabPos;
623cdf0e10cSrcweir }
GetListtabPos() const624cdf0e10cSrcweir long SvxNumberFormat::GetListtabPos() const
625cdf0e10cSrcweir {
626cdf0e10cSrcweir     return mnListtabPos;
627cdf0e10cSrcweir }
SetFirstLineIndent(const long nFirstLineIndent)628cdf0e10cSrcweir void SvxNumberFormat::SetFirstLineIndent( const long nFirstLineIndent )
629cdf0e10cSrcweir {
630cdf0e10cSrcweir     mnFirstLineIndent = nFirstLineIndent;
631cdf0e10cSrcweir }
GetFirstLineIndent() const632cdf0e10cSrcweir long SvxNumberFormat::GetFirstLineIndent() const
633cdf0e10cSrcweir {
634cdf0e10cSrcweir     return mnFirstLineIndent;
635cdf0e10cSrcweir }
SetIndentAt(const long nIndentAt)636cdf0e10cSrcweir void SvxNumberFormat::SetIndentAt( const long nIndentAt )
637cdf0e10cSrcweir {
638cdf0e10cSrcweir     mnIndentAt = nIndentAt;
639cdf0e10cSrcweir }
GetIndentAt() const640cdf0e10cSrcweir long SvxNumberFormat::GetIndentAt() const
641cdf0e10cSrcweir {
642cdf0e10cSrcweir     return mnIndentAt;
643cdf0e10cSrcweir }
644cdf0e10cSrcweir // <--
645cdf0e10cSrcweir 
646cdf0e10cSrcweir /* -----------------28.10.98 10:03-------------------
647cdf0e10cSrcweir  *
648cdf0e10cSrcweir  * --------------------------------------------------*/
IMPL_STATIC_LINK(SvxNumberFormat,GraphicArrived,void *,EMPTYARG)649cdf0e10cSrcweir IMPL_STATIC_LINK( SvxNumberFormat, GraphicArrived, void *, EMPTYARG )
650cdf0e10cSrcweir {
651cdf0e10cSrcweir     // ggfs. die GrfSize setzen:
652cdf0e10cSrcweir     if( !pThis->aGraphicSize.Width() || !pThis->aGraphicSize.Height() )
653cdf0e10cSrcweir     {
654cdf0e10cSrcweir         const Graphic* pGrf = pThis->pGraphicBrush->GetGraphic();
655cdf0e10cSrcweir         if( pGrf )
656cdf0e10cSrcweir             pThis->aGraphicSize = SvxNumberFormat::GetGraphicSizeMM100( pGrf );
657cdf0e10cSrcweir     }
658cdf0e10cSrcweir     pThis->NotifyGraphicArrived();
659cdf0e10cSrcweir     return 0;
660cdf0e10cSrcweir }
661cdf0e10cSrcweir /* -----------------------------02.07.01 15:36--------------------------------
662cdf0e10cSrcweir 
663cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
NotifyGraphicArrived()664cdf0e10cSrcweir void SvxNumberFormat::NotifyGraphicArrived()
665cdf0e10cSrcweir {
666cdf0e10cSrcweir }
667cdf0e10cSrcweir 
668cdf0e10cSrcweir /* -----------------28.10.98 10:38-------------------
669cdf0e10cSrcweir  *
670cdf0e10cSrcweir  * --------------------------------------------------*/
GetGraphicSizeMM100(const Graphic * pGraphic)671cdf0e10cSrcweir Size SvxNumberFormat::GetGraphicSizeMM100(const Graphic* pGraphic)
672cdf0e10cSrcweir {
673cdf0e10cSrcweir     const MapMode aMapMM100( MAP_100TH_MM );
674cdf0e10cSrcweir     const Size& rSize = pGraphic->GetPrefSize();
675cdf0e10cSrcweir     Size aRetSize;
676cdf0e10cSrcweir     if ( pGraphic->GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
677cdf0e10cSrcweir     {
678cdf0e10cSrcweir         OutputDevice* pOutDev = Application::GetDefaultDevice();
679cdf0e10cSrcweir         MapMode aOldMap( pOutDev->GetMapMode() );
680cdf0e10cSrcweir         pOutDev->SetMapMode( aMapMM100 );
681cdf0e10cSrcweir         aRetSize = pOutDev->PixelToLogic( rSize );
682cdf0e10cSrcweir         pOutDev->SetMapMode( aOldMap );
683cdf0e10cSrcweir     }
684cdf0e10cSrcweir     else
685cdf0e10cSrcweir         aRetSize = OutputDevice::LogicToLogic( rSize, pGraphic->GetPrefMapMode(), aMapMM100 );
686cdf0e10cSrcweir     return aRetSize;
687cdf0e10cSrcweir }
688cdf0e10cSrcweir /* -----------------28.10.98 15:57-------------------
689cdf0e10cSrcweir  *
690cdf0e10cSrcweir  * --------------------------------------------------*/
CreateRomanString(sal_uLong nNo,sal_Bool bUpper)691cdf0e10cSrcweir String SvxNumberFormat::CreateRomanString( sal_uLong nNo, sal_Bool bUpper )
692cdf0e10cSrcweir {
693cdf0e10cSrcweir     nNo %= 4000;            // mehr kann nicht dargestellt werden
694cdf0e10cSrcweir //      i, ii, iii, iv, v, vi, vii, vii, viii, ix
695cdf0e10cSrcweir //                          (Dummy),1000,500,100,50,10,5,1
696cdf0e10cSrcweir     const char *cRomanArr = bUpper
697cdf0e10cSrcweir                         ? "MDCLXVI--"   // +2 Dummy-Eintraege !!
698cdf0e10cSrcweir                         : "mdclxvi--";  // +2 Dummy-Eintraege !!
699cdf0e10cSrcweir 
700cdf0e10cSrcweir     String sRet;
701cdf0e10cSrcweir     sal_uInt16 nMask = 1000;
702cdf0e10cSrcweir     while( nMask )
703cdf0e10cSrcweir     {
704cdf0e10cSrcweir         sal_uInt8 nZahl = sal_uInt8(nNo / nMask);
705cdf0e10cSrcweir         sal_uInt8 nDiff = 1;
706cdf0e10cSrcweir         nNo %= nMask;
707cdf0e10cSrcweir 
708cdf0e10cSrcweir         if( 5 < nZahl )
709cdf0e10cSrcweir         {
710cdf0e10cSrcweir             if( nZahl < 9 )
711cdf0e10cSrcweir                 sRet += sal_Unicode(*(cRomanArr-1));
712cdf0e10cSrcweir             ++nDiff;
713cdf0e10cSrcweir             nZahl -= 5;
714cdf0e10cSrcweir         }
715cdf0e10cSrcweir         switch( nZahl )
716cdf0e10cSrcweir         {
717cdf0e10cSrcweir         case 3:     { sRet += sal_Unicode(*cRomanArr); }
718cdf0e10cSrcweir         case 2:     { sRet += sal_Unicode(*cRomanArr); }
719cdf0e10cSrcweir         case 1:     { sRet += sal_Unicode(*cRomanArr); }
720cdf0e10cSrcweir                     break;
721cdf0e10cSrcweir 
722cdf0e10cSrcweir         case 4:     {
723cdf0e10cSrcweir                         sRet += sal_Unicode(*cRomanArr);
724cdf0e10cSrcweir                         sRet += sal_Unicode(*(cRomanArr-nDiff));
725cdf0e10cSrcweir                     }
726cdf0e10cSrcweir                     break;
727cdf0e10cSrcweir         case 5:     { sRet += sal_Unicode(*(cRomanArr-nDiff)); }
728cdf0e10cSrcweir                     break;
729cdf0e10cSrcweir         }
730cdf0e10cSrcweir 
731cdf0e10cSrcweir         nMask /= 10;            // zur naechsten Dekade
732cdf0e10cSrcweir         cRomanArr += 2;
733cdf0e10cSrcweir     }
734cdf0e10cSrcweir     return sRet;
735cdf0e10cSrcweir }
736cdf0e10cSrcweir #ifdef OLD_NUMBER_FORMATTING
GetCharStr(sal_uLong nNo,String & rStr) const737cdf0e10cSrcweir void SvxNumberFormat::GetCharStr( sal_uLong nNo, String& rStr ) const
738cdf0e10cSrcweir {
739cdf0e10cSrcweir     DBG_ASSERT( nNo, "0 ist eine ungueltige Nummer !!" );
740cdf0e10cSrcweir 
741cdf0e10cSrcweir     const sal_uLong coDiff = 'Z' - 'A' +1;
742cdf0e10cSrcweir     char cAdd = (SVX_NUM_CHARS_UPPER_LETTER == eNumType ? 'A' : 'a') - 1;
743cdf0e10cSrcweir     sal_uLong nCalc;
744cdf0e10cSrcweir 
745cdf0e10cSrcweir     do {
746cdf0e10cSrcweir         nCalc = nNo % coDiff;
747cdf0e10cSrcweir         if( !nCalc )
748cdf0e10cSrcweir             nCalc = coDiff;
749cdf0e10cSrcweir         rStr.Insert( sal_Unicode(cAdd + nCalc ), 0 );
750cdf0e10cSrcweir         nNo -= nCalc;
751cdf0e10cSrcweir         if( nNo )
752cdf0e10cSrcweir             nNo /= coDiff;
753cdf0e10cSrcweir     } while( nNo );
754cdf0e10cSrcweir }
755cdf0e10cSrcweir 
GetCharStrN(sal_uLong nNo,String & rStr) const756cdf0e10cSrcweir void SvxNumberFormat::GetCharStrN( sal_uLong nNo, String& rStr ) const
757cdf0e10cSrcweir {
758cdf0e10cSrcweir     DBG_ASSERT( nNo, "0 ist eine ungueltige Nummer !!" );
759cdf0e10cSrcweir 
760cdf0e10cSrcweir     const sal_uLong coDiff = 'Z' - 'A' +1;
761cdf0e10cSrcweir     char cChar = (char)(--nNo % coDiff);
762cdf0e10cSrcweir     if( SVX_NUM_CHARS_UPPER_LETTER_N == eNumType )
763cdf0e10cSrcweir         cChar += 'A';
764cdf0e10cSrcweir     else
765cdf0e10cSrcweir         cChar += 'a';
766cdf0e10cSrcweir 
767cdf0e10cSrcweir     rStr.Fill( (sal_uInt16)(nNo / coDiff) + 1, sal_Unicode(cChar) );
768cdf0e10cSrcweir }
769cdf0e10cSrcweir #endif //OLD_NUMBER_FORMATTING
770cdf0e10cSrcweir /* -----------------------------22.02.01 13:31--------------------------------
771cdf0e10cSrcweir 
772cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
GetCharFmtName() const773cdf0e10cSrcweir const String&   SvxNumberFormat::GetCharFmtName()const
774cdf0e10cSrcweir {
775cdf0e10cSrcweir     return sCharStyleName;
776cdf0e10cSrcweir }
777cdf0e10cSrcweir /* -----------------27.10.98 10:38-------------------
778cdf0e10cSrcweir  *
779cdf0e10cSrcweir  * --------------------------------------------------*/
780cdf0e10cSrcweir sal_Int32 SvxNumRule::nRefCount = 0;
781cdf0e10cSrcweir static SvxNumberFormat* pStdNumFmt = 0;
782cdf0e10cSrcweir static SvxNumberFormat* pStdOutlineNumFmt = 0;
783cdf0e10cSrcweir // --> OD 2008-02-11 #newlistlevelattrs#
SvxNumRule(sal_uLong nFeatures,sal_uInt16 nLevels,sal_Bool bCont,SvxNumRuleType eType,SvxNumberFormat::SvxNumPositionAndSpaceMode eDefaultNumberFormatPositionAndSpaceMode)784cdf0e10cSrcweir SvxNumRule::SvxNumRule( sal_uLong nFeatures,
785cdf0e10cSrcweir                         sal_uInt16 nLevels,
786cdf0e10cSrcweir                         sal_Bool bCont,
787cdf0e10cSrcweir                         SvxNumRuleType eType,
788cdf0e10cSrcweir                         SvxNumberFormat::SvxNumPositionAndSpaceMode
789cdf0e10cSrcweir                                     eDefaultNumberFormatPositionAndSpaceMode )
790cdf0e10cSrcweir     : nLevelCount(nLevels),
791cdf0e10cSrcweir       nFeatureFlags(nFeatures),
792cdf0e10cSrcweir       eNumberingType(eType),
793cdf0e10cSrcweir       bContinuousNumbering(bCont)
794cdf0e10cSrcweir {
795cdf0e10cSrcweir     ++nRefCount;
796cdf0e10cSrcweir     LanguageType eLang = Application::GetSettings().GetLanguage();
797cdf0e10cSrcweir     aLocale = SvxCreateLocale(eLang);
798cdf0e10cSrcweir     for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++)
799cdf0e10cSrcweir     {
800cdf0e10cSrcweir         if(i < nLevels)
801cdf0e10cSrcweir         {
802cdf0e10cSrcweir             aFmts[i] = new SvxNumberFormat(SVX_NUM_CHARS_UPPER_LETTER);
803cdf0e10cSrcweir             //daran wird zwischen writer und draw unterschieden
804cdf0e10cSrcweir             if(nFeatures & NUM_CONTINUOUS)
805cdf0e10cSrcweir             {
806cdf0e10cSrcweir                 // --> OD 2008-02-11 #newlistlevelattrs#
807cdf0e10cSrcweir                 if ( eDefaultNumberFormatPositionAndSpaceMode ==
808cdf0e10cSrcweir                                     SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
809cdf0e10cSrcweir                 {
810cdf0e10cSrcweir                     aFmts[i]->SetLSpace( MM100_TO_TWIP(DEF_WRITER_LSPACE) );
811cdf0e10cSrcweir                     aFmts[i]->SetAbsLSpace( MM100_TO_TWIP(DEF_WRITER_LSPACE * (i+1)) );
812cdf0e10cSrcweir                     aFmts[i]->SetFirstLineOffset(MM100_TO_TWIP(-DEF_WRITER_LSPACE));
813cdf0e10cSrcweir                 }
814cdf0e10cSrcweir                 else if ( eDefaultNumberFormatPositionAndSpaceMode ==
815cdf0e10cSrcweir                                             SvxNumberFormat::LABEL_ALIGNMENT )
816cdf0e10cSrcweir                 {
817cdf0e10cSrcweir                     // first line indent of general numbering in inch: -0,25 inch
818cdf0e10cSrcweir                     const long cFirstLineIndent = -1440/4;
819cdf0e10cSrcweir                     // indent values of general numbering in inch:
820cdf0e10cSrcweir                     //  0,5         0,75        1,0         1,25        1,5
821cdf0e10cSrcweir                     //  1,75        2,0         2,25        2,5         2,75
822cdf0e10cSrcweir                     const long cIndentAt = 1440/4;
823cdf0e10cSrcweir                     aFmts[i]->SetPositionAndSpaceMode( SvxNumberFormat::LABEL_ALIGNMENT );
824cdf0e10cSrcweir                     aFmts[i]->SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
825cdf0e10cSrcweir                     aFmts[i]->SetListtabPos( cIndentAt * (i+2) );
826cdf0e10cSrcweir                     aFmts[i]->SetFirstLineIndent( cFirstLineIndent );
827cdf0e10cSrcweir                     aFmts[i]->SetIndentAt( cIndentAt * (i+2) );
828cdf0e10cSrcweir                 }
829cdf0e10cSrcweir                 // <--
830cdf0e10cSrcweir             }
831cdf0e10cSrcweir             else
832cdf0e10cSrcweir             {
833cdf0e10cSrcweir                 aFmts[i]->SetLSpace( DEF_DRAW_LSPACE );
834cdf0e10cSrcweir                 aFmts[i]->SetAbsLSpace( DEF_DRAW_LSPACE * (i) );
835cdf0e10cSrcweir             }
836cdf0e10cSrcweir         }
837cdf0e10cSrcweir         else
838cdf0e10cSrcweir             aFmts[i] = 0;
839cdf0e10cSrcweir         aFmtsSet[i] = sal_False;
840cdf0e10cSrcweir     }
841cdf0e10cSrcweir }
842cdf0e10cSrcweir /* -----------------27.10.98 10:41-------------------
843cdf0e10cSrcweir  *
844cdf0e10cSrcweir  * --------------------------------------------------*/
SvxNumRule(const SvxNumRule & rCopy)845cdf0e10cSrcweir SvxNumRule::SvxNumRule(const SvxNumRule& rCopy)
846cdf0e10cSrcweir {
847cdf0e10cSrcweir     ++nRefCount;
848cdf0e10cSrcweir     aLocale             = rCopy.aLocale;
849cdf0e10cSrcweir     nLevelCount          = rCopy.nLevelCount         ;
850cdf0e10cSrcweir     nFeatureFlags        = rCopy.nFeatureFlags       ;
851cdf0e10cSrcweir     bContinuousNumbering = rCopy.bContinuousNumbering;
852cdf0e10cSrcweir     eNumberingType       = rCopy.eNumberingType;
853cdf0e10cSrcweir     memset( aFmts, 0, sizeof( aFmts ));
854cdf0e10cSrcweir     for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++)
855cdf0e10cSrcweir     {
856cdf0e10cSrcweir         if(rCopy.aFmts[i])
857cdf0e10cSrcweir             aFmts[i] = new SvxNumberFormat(*rCopy.aFmts[i]);
858cdf0e10cSrcweir         else
859cdf0e10cSrcweir             aFmts[i] = 0;
860cdf0e10cSrcweir         aFmtsSet[i] = rCopy.aFmtsSet[i];
861cdf0e10cSrcweir     }
862cdf0e10cSrcweir }
863cdf0e10cSrcweir /* -----------------08.12.98 11:07-------------------
864cdf0e10cSrcweir  *
865cdf0e10cSrcweir  * --------------------------------------------------*/
SvxNumRule(SvStream & rStream)866cdf0e10cSrcweir SvxNumRule::SvxNumRule(SvStream &rStream)
867cdf0e10cSrcweir {
868cdf0e10cSrcweir     ++nRefCount;
869cdf0e10cSrcweir     LanguageType eLang = Application::GetSettings().GetLanguage();
870cdf0e10cSrcweir     aLocale = SvxCreateLocale(eLang);
871cdf0e10cSrcweir     sal_uInt16 nVersion;
872cdf0e10cSrcweir     sal_uInt16 nTemp;
873cdf0e10cSrcweir     rStream >> nVersion;
874cdf0e10cSrcweir     rStream >> nLevelCount;
875cdf0e10cSrcweir     rStream >> nTemp;
876cdf0e10cSrcweir     nFeatureFlags = nTemp;
877cdf0e10cSrcweir     rStream >> nTemp;
878cdf0e10cSrcweir     bContinuousNumbering = (sal_Bool)nTemp;
879cdf0e10cSrcweir     rStream >> nTemp;
880cdf0e10cSrcweir     eNumberingType       = (SvxNumRuleType)nTemp;
881cdf0e10cSrcweir     memset( aFmts, 0, sizeof( aFmts ));
882cdf0e10cSrcweir 
883cdf0e10cSrcweir     for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++)
884cdf0e10cSrcweir     {
885cdf0e10cSrcweir         sal_uInt16 nSet;
886cdf0e10cSrcweir         rStream >> nSet;
887cdf0e10cSrcweir         if(nSet)
888cdf0e10cSrcweir             aFmts[i] = new SvxNumberFormat(rStream);
889cdf0e10cSrcweir         else
890cdf0e10cSrcweir             aFmts[i] = 0;
891cdf0e10cSrcweir         aFmtsSet[i] = aFmts[i] ? sal_True : sal_False;
892cdf0e10cSrcweir     }
893cdf0e10cSrcweir     if(NUMITEM_VERSION_02 <= nVersion)
894cdf0e10cSrcweir     {
895cdf0e10cSrcweir         sal_uInt16 nShort;
896cdf0e10cSrcweir         rStream >> nShort;
897cdf0e10cSrcweir         nFeatureFlags = nShort;
898cdf0e10cSrcweir     }
899cdf0e10cSrcweir }
900cdf0e10cSrcweir 
901cdf0e10cSrcweir /* -----------------08.12.98 11:07-------------------
902cdf0e10cSrcweir  *
903cdf0e10cSrcweir  * --------------------------------------------------*/
Store(SvStream & rStream)904cdf0e10cSrcweir SvStream&   SvxNumRule::Store(SvStream &rStream)
905cdf0e10cSrcweir {
906cdf0e10cSrcweir     rStream<<(sal_uInt16)NUMITEM_VERSION_03;
907cdf0e10cSrcweir     rStream<<nLevelCount;
908cdf0e10cSrcweir     //first save of nFeatureFlags for old versions
909cdf0e10cSrcweir     rStream<<(sal_uInt16)nFeatureFlags;
910cdf0e10cSrcweir     rStream<<(sal_uInt16)bContinuousNumbering;
911cdf0e10cSrcweir     rStream<<(sal_uInt16)eNumberingType;
912cdf0e10cSrcweir 
913cdf0e10cSrcweir     FontToSubsFontConverter pConverter = 0;
914cdf0e10cSrcweir     sal_Bool bConvertBulletFont = rStream.GetVersion() <= SOFFICE_FILEFORMAT_50;
915cdf0e10cSrcweir     for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++)
916cdf0e10cSrcweir     {
917cdf0e10cSrcweir         if(aFmts[i])
918cdf0e10cSrcweir         {
919cdf0e10cSrcweir             rStream << sal_uInt16(1);
920cdf0e10cSrcweir             if(bConvertBulletFont && aFmts[i]->GetBulletFont())
921cdf0e10cSrcweir             {
922cdf0e10cSrcweir                 if(!pConverter)
923cdf0e10cSrcweir                     pConverter =
924cdf0e10cSrcweir                         CreateFontToSubsFontConverter(aFmts[i]->GetBulletFont()->GetName(),
925cdf0e10cSrcweir                                     FONTTOSUBSFONT_EXPORT|FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS);
926cdf0e10cSrcweir             }
927cdf0e10cSrcweir             aFmts[i]->Store(rStream, pConverter);
928cdf0e10cSrcweir         }
929cdf0e10cSrcweir         else
930cdf0e10cSrcweir             rStream << sal_uInt16(0);
931cdf0e10cSrcweir     }
932cdf0e10cSrcweir     //second save of nFeatureFlags for new versions
933cdf0e10cSrcweir     rStream<<(sal_uInt16)nFeatureFlags;
934cdf0e10cSrcweir     if(pConverter)
935cdf0e10cSrcweir         DestroyFontToSubsFontConverter(pConverter);
936cdf0e10cSrcweir 
937cdf0e10cSrcweir     return rStream;
938cdf0e10cSrcweir }
939cdf0e10cSrcweir 
940cdf0e10cSrcweir /* -----------------27.10.98 10:41-------------------
941cdf0e10cSrcweir  *
942cdf0e10cSrcweir  * --------------------------------------------------*/
~SvxNumRule()943cdf0e10cSrcweir SvxNumRule::~SvxNumRule()
944cdf0e10cSrcweir {
945cdf0e10cSrcweir     for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++)
946cdf0e10cSrcweir         delete aFmts[i];
947cdf0e10cSrcweir     if(!--nRefCount)
948cdf0e10cSrcweir     {
949cdf0e10cSrcweir         DELETEZ(pStdNumFmt);
950cdf0e10cSrcweir         DELETEZ(pStdOutlineNumFmt);
951cdf0e10cSrcweir     }
952cdf0e10cSrcweir }
953cdf0e10cSrcweir /* -----------------29.10.98 16:07-------------------
954cdf0e10cSrcweir  *
955cdf0e10cSrcweir  * --------------------------------------------------*/
operator =(const SvxNumRule & rCopy)956cdf0e10cSrcweir SvxNumRule& SvxNumRule::operator=( const SvxNumRule& rCopy )
957cdf0e10cSrcweir {
958cdf0e10cSrcweir     nLevelCount          = rCopy.nLevelCount;
959cdf0e10cSrcweir     nFeatureFlags        = rCopy.nFeatureFlags;
960cdf0e10cSrcweir     bContinuousNumbering = rCopy.bContinuousNumbering;
961cdf0e10cSrcweir     eNumberingType       = rCopy.eNumberingType;
962cdf0e10cSrcweir     for(sal_uInt16 i = 0; i < SVX_MAX_NUM; i++)
963cdf0e10cSrcweir     {
964cdf0e10cSrcweir         delete aFmts[i];
965cdf0e10cSrcweir         if(rCopy.aFmts[i])
966cdf0e10cSrcweir             aFmts[i] = new SvxNumberFormat(*rCopy.aFmts[i]);
967cdf0e10cSrcweir         else
968cdf0e10cSrcweir             aFmts[i] = 0;
969cdf0e10cSrcweir         aFmtsSet[i] = rCopy.aFmtsSet[i];
970cdf0e10cSrcweir     }
971cdf0e10cSrcweir     return *this;
972cdf0e10cSrcweir }
973cdf0e10cSrcweir /* -----------------27.10.98 10:41-------------------
974cdf0e10cSrcweir  *
975cdf0e10cSrcweir  * --------------------------------------------------*/
operator ==(const SvxNumRule & rCopy) const976cdf0e10cSrcweir int   SvxNumRule::operator==( const SvxNumRule& rCopy) const
977cdf0e10cSrcweir {
978cdf0e10cSrcweir     if(nLevelCount != rCopy.nLevelCount ||
979cdf0e10cSrcweir         nFeatureFlags != rCopy.nFeatureFlags ||
980cdf0e10cSrcweir             bContinuousNumbering != rCopy.bContinuousNumbering ||
981cdf0e10cSrcweir                 eNumberingType != rCopy.eNumberingType)
982cdf0e10cSrcweir             return sal_False;
983cdf0e10cSrcweir     for(sal_uInt16 i = 0; i < nLevelCount; i++)
984cdf0e10cSrcweir     {
985cdf0e10cSrcweir         if (
986cdf0e10cSrcweir             (aFmtsSet[i] != rCopy.aFmtsSet[i]) ||
987cdf0e10cSrcweir             (!aFmts[i] && rCopy.aFmts[i]) ||
988cdf0e10cSrcweir             (aFmts[i] && !rCopy.aFmts[i]) ||
989cdf0e10cSrcweir             (aFmts[i] && *aFmts[i] !=  *rCopy.aFmts[i])
990cdf0e10cSrcweir            )
991cdf0e10cSrcweir         {
992cdf0e10cSrcweir             return sal_False;
993cdf0e10cSrcweir         }
994cdf0e10cSrcweir     }
995cdf0e10cSrcweir     return sal_True;
996cdf0e10cSrcweir }
997cdf0e10cSrcweir /* -----------------27.10.98 10:41-------------------
998cdf0e10cSrcweir  *
999cdf0e10cSrcweir  * --------------------------------------------------*/
Get(sal_uInt16 nLevel) const1000cdf0e10cSrcweir const SvxNumberFormat*  SvxNumRule::Get(sal_uInt16 nLevel)const
1001cdf0e10cSrcweir {
1002cdf0e10cSrcweir     DBG_ASSERT(nLevel < SVX_MAX_NUM, "falsches Level" );
1003cdf0e10cSrcweir     if( nLevel < SVX_MAX_NUM )
1004cdf0e10cSrcweir         return aFmtsSet[nLevel] ? aFmts[nLevel] : 0;
1005cdf0e10cSrcweir     else
1006cdf0e10cSrcweir         return 0;
1007cdf0e10cSrcweir }
1008cdf0e10cSrcweir /* -----------------02.11.98 09:10-------------------
1009cdf0e10cSrcweir  *
1010cdf0e10cSrcweir  * --------------------------------------------------*/
GetLevel(sal_uInt16 nLevel) const1011cdf0e10cSrcweir const SvxNumberFormat&  SvxNumRule::GetLevel(sal_uInt16 nLevel)const
1012cdf0e10cSrcweir {
1013cdf0e10cSrcweir     if(!pStdNumFmt)
1014cdf0e10cSrcweir     {
1015cdf0e10cSrcweir         pStdNumFmt = new SvxNumberFormat(SVX_NUM_ARABIC);
1016cdf0e10cSrcweir         pStdOutlineNumFmt = new SvxNumberFormat(SVX_NUM_NUMBER_NONE);
1017cdf0e10cSrcweir     }
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir     DBG_ASSERT(nLevel < SVX_MAX_NUM, "falsches Level" );
1020cdf0e10cSrcweir 
1021cdf0e10cSrcweir     return ( ( nLevel < SVX_MAX_NUM ) && aFmts[nLevel] ) ?
1022cdf0e10cSrcweir             *aFmts[nLevel] :  eNumberingType == SVX_RULETYPE_NUMBERING ?
1023cdf0e10cSrcweir                                                         *pStdNumFmt : *pStdOutlineNumFmt;
1024cdf0e10cSrcweir }
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir /* -----------------29.10.98 09:08-------------------
1027cdf0e10cSrcweir  *
1028cdf0e10cSrcweir  * --------------------------------------------------*/
SetLevel(sal_uInt16 i,const SvxNumberFormat & rNumFmt,sal_Bool bIsValid)1029cdf0e10cSrcweir void SvxNumRule::SetLevel( sal_uInt16 i, const SvxNumberFormat& rNumFmt, sal_Bool bIsValid )
1030cdf0e10cSrcweir {
1031cdf0e10cSrcweir     DBG_ASSERT(i < SVX_MAX_NUM, "falsches Level" );
1032cdf0e10cSrcweir 
1033cdf0e10cSrcweir     if( (i < SVX_MAX_NUM) && (!aFmtsSet[i] || !(rNumFmt == *Get( i ))) )
1034cdf0e10cSrcweir     {
1035cdf0e10cSrcweir         delete aFmts[ i ];
1036cdf0e10cSrcweir         aFmts[ i ] = new SvxNumberFormat( rNumFmt );
1037cdf0e10cSrcweir         aFmtsSet[i] = bIsValid;
1038cdf0e10cSrcweir //      bInvalidRuleFlag = sal_True;
1039cdf0e10cSrcweir     }
1040cdf0e10cSrcweir }
1041cdf0e10cSrcweir /* -----------------30.10.98 12:44-------------------
1042cdf0e10cSrcweir  *
1043cdf0e10cSrcweir  * --------------------------------------------------*/
SetLevel(sal_uInt16 nLevel,const SvxNumberFormat * pFmt)1044cdf0e10cSrcweir void SvxNumRule::SetLevel(sal_uInt16 nLevel, const SvxNumberFormat* pFmt)
1045cdf0e10cSrcweir {
1046cdf0e10cSrcweir     DBG_ASSERT(nLevel < SVX_MAX_NUM, "falsches Level" );
1047cdf0e10cSrcweir 
1048cdf0e10cSrcweir     if( nLevel < SVX_MAX_NUM )
1049cdf0e10cSrcweir     {
1050cdf0e10cSrcweir         aFmtsSet[nLevel] = 0 != pFmt;
1051cdf0e10cSrcweir         if(pFmt)
1052cdf0e10cSrcweir             SetLevel(nLevel, *pFmt);
1053cdf0e10cSrcweir         else
1054cdf0e10cSrcweir         {
1055cdf0e10cSrcweir             delete aFmts[nLevel];
1056cdf0e10cSrcweir             aFmts[nLevel] = 0;
1057cdf0e10cSrcweir         }
1058cdf0e10cSrcweir     }
1059cdf0e10cSrcweir }
1060cdf0e10cSrcweir /* -----------------28.10.98 15:38-------------------
1061cdf0e10cSrcweir  *
1062cdf0e10cSrcweir  * --------------------------------------------------*/
MakeNumString(const SvxNodeNum & rNum,sal_Bool bInclStrings) const1063cdf0e10cSrcweir String  SvxNumRule::MakeNumString( const SvxNodeNum& rNum, sal_Bool bInclStrings ) const
1064cdf0e10cSrcweir {
1065cdf0e10cSrcweir     String aStr;
1066cdf0e10cSrcweir     if( SVX_NO_NUM > rNum.GetLevel() && !( SVX_NO_NUMLEVEL & rNum.GetLevel() ) )
1067cdf0e10cSrcweir     {
1068cdf0e10cSrcweir         const SvxNumberFormat& rMyNFmt = GetLevel( rNum.GetLevel() );
1069cdf0e10cSrcweir         if( SVX_NUM_NUMBER_NONE != rMyNFmt.GetNumberingType() )
1070cdf0e10cSrcweir         {
1071cdf0e10cSrcweir             sal_uInt8 i = rNum.GetLevel();
1072cdf0e10cSrcweir 
1073cdf0e10cSrcweir             if( !IsContinuousNumbering() &&
1074cdf0e10cSrcweir                 1 < rMyNFmt.GetIncludeUpperLevels() )       // nur der eigene Level ?
1075cdf0e10cSrcweir             {
1076cdf0e10cSrcweir                 sal_uInt8 n = rMyNFmt.GetIncludeUpperLevels();
1077cdf0e10cSrcweir                 if( 1 < n )
1078cdf0e10cSrcweir                 {
1079cdf0e10cSrcweir                     if( i+1 >= n )
1080cdf0e10cSrcweir                         i -= n - 1;
1081cdf0e10cSrcweir                     else
1082cdf0e10cSrcweir                         i = 0;
1083cdf0e10cSrcweir                 }
1084cdf0e10cSrcweir             }
1085cdf0e10cSrcweir 
1086cdf0e10cSrcweir             for( ; i <= rNum.GetLevel(); ++i )
1087cdf0e10cSrcweir             {
1088cdf0e10cSrcweir                 const SvxNumberFormat& rNFmt = GetLevel( i );
1089cdf0e10cSrcweir                 if( SVX_NUM_NUMBER_NONE == rNFmt.GetNumberingType() )
1090cdf0e10cSrcweir                 {
1091cdf0e10cSrcweir     // Soll aus 1.1.1 --> 2. NoNum --> 1..1 oder 1.1 ??
1092cdf0e10cSrcweir     //                 if( i != rNum.nMyLevel )
1093cdf0e10cSrcweir     //                    aStr += aDotStr;
1094cdf0e10cSrcweir                     continue;
1095cdf0e10cSrcweir                 }
1096cdf0e10cSrcweir 
1097cdf0e10cSrcweir                 sal_Bool bDot = sal_True;
1098cdf0e10cSrcweir                 if( rNum.GetLevelVal()[ i ] )
1099cdf0e10cSrcweir                 {
1100cdf0e10cSrcweir                     if(SVX_NUM_BITMAP != rNFmt.GetNumberingType())
1101cdf0e10cSrcweir                         aStr += rNFmt.GetNumStr( rNum.GetLevelVal()[ i ], aLocale );
1102cdf0e10cSrcweir                     else
1103cdf0e10cSrcweir                         bDot = sal_False;
1104cdf0e10cSrcweir                 }
1105cdf0e10cSrcweir                 else
1106cdf0e10cSrcweir                     aStr += sal_Unicode('0');       // alle 0-Level sind eine 0
1107cdf0e10cSrcweir                 if( i != rNum.GetLevel() && bDot)
1108cdf0e10cSrcweir                     aStr += sal_Unicode('.');
1109cdf0e10cSrcweir             }
1110cdf0e10cSrcweir         }
1111cdf0e10cSrcweir 
1112cdf0e10cSrcweir         if( bInclStrings )
1113cdf0e10cSrcweir         {
1114cdf0e10cSrcweir             aStr.Insert( rMyNFmt.GetPrefix(), 0 );
1115cdf0e10cSrcweir             aStr += rMyNFmt.GetSuffix();
1116cdf0e10cSrcweir         }
1117cdf0e10cSrcweir     }
1118cdf0e10cSrcweir     return aStr;
1119cdf0e10cSrcweir }
1120cdf0e10cSrcweir /* -----------------18.08.99 10:18-------------------
1121cdf0e10cSrcweir     Description: changes linked to embedded bitmaps
1122cdf0e10cSrcweir  --------------------------------------------------*/
UnLinkGraphics()1123cdf0e10cSrcweir sal_Bool SvxNumRule::UnLinkGraphics()
1124cdf0e10cSrcweir {
1125cdf0e10cSrcweir     sal_Bool bRet = sal_False;
1126cdf0e10cSrcweir     for(sal_uInt16 i = 0; i < GetLevelCount(); i++)
1127cdf0e10cSrcweir     {
1128cdf0e10cSrcweir         SvxNumberFormat aFmt(GetLevel(i));
1129cdf0e10cSrcweir         const SvxBrushItem* pBrush = aFmt.GetBrush();
1130cdf0e10cSrcweir         const String* pLinkStr;
1131cdf0e10cSrcweir         const Graphic* pGraphic;
1132cdf0e10cSrcweir         if(SVX_NUM_BITMAP == aFmt.GetNumberingType())
1133cdf0e10cSrcweir         {
1134cdf0e10cSrcweir             if(pBrush &&
1135cdf0e10cSrcweir                 0 != (pLinkStr = pBrush->GetGraphicLink()) &&
1136cdf0e10cSrcweir                     pLinkStr->Len() &&
1137cdf0e10cSrcweir                     0 !=(pGraphic = pBrush->GetGraphic()))
1138cdf0e10cSrcweir             {
1139cdf0e10cSrcweir                 SvxBrushItem aTempItem(*pBrush);
1140cdf0e10cSrcweir                 aTempItem.SetGraphicLink( String());
1141cdf0e10cSrcweir                 aTempItem.SetGraphic(*pGraphic);
1142cdf0e10cSrcweir                 sal_Int16    eOrient = aFmt.GetVertOrient();
1143cdf0e10cSrcweir                 aFmt.SetGraphicBrush( &aTempItem, &aFmt.GetGraphicSize(), &eOrient );
1144cdf0e10cSrcweir                 bRet = sal_True;
1145cdf0e10cSrcweir             }
1146cdf0e10cSrcweir         }
1147cdf0e10cSrcweir         else if((SVX_NUM_BITMAP|LINK_TOKEN) == aFmt.GetNumberingType())
1148cdf0e10cSrcweir             aFmt.SetNumberingType(SVX_NUM_BITMAP);
1149cdf0e10cSrcweir         SetLevel(i, aFmt);
1150cdf0e10cSrcweir     }
1151cdf0e10cSrcweir     return bRet;
1152cdf0e10cSrcweir }
1153cdf0e10cSrcweir 
1154cdf0e10cSrcweir /* -----------------27.10.98 10:41-------------------
1155cdf0e10cSrcweir  *
1156cdf0e10cSrcweir  * --------------------------------------------------*/
SvxNumBulletItem(SvxNumRule & rRule)1157cdf0e10cSrcweir SvxNumBulletItem::SvxNumBulletItem(SvxNumRule& rRule) :
1158cdf0e10cSrcweir     SfxPoolItem(SID_ATTR_NUMBERING_RULE),
1159cdf0e10cSrcweir     pNumRule(new SvxNumRule(rRule))
1160cdf0e10cSrcweir {
1161cdf0e10cSrcweir }
1162cdf0e10cSrcweir 
1163cdf0e10cSrcweir /*-----------------23.11.98 10:36-------------------
1164cdf0e10cSrcweir  MT: Das sind ja sehr sinnige Kommentare...
1165cdf0e10cSrcweir --------------------------------------------------*/
SvxNumBulletItem(SvxNumRule & rRule,sal_uInt16 _nWhich)1166cdf0e10cSrcweir SvxNumBulletItem::SvxNumBulletItem(SvxNumRule& rRule, sal_uInt16 _nWhich ) :
1167cdf0e10cSrcweir     SfxPoolItem(_nWhich),
1168cdf0e10cSrcweir     pNumRule(new SvxNumRule(rRule))
1169cdf0e10cSrcweir {
1170cdf0e10cSrcweir }
1171cdf0e10cSrcweir 
Create(SvStream & s,sal_uInt16 n) const1172cdf0e10cSrcweir SfxPoolItem* SvxNumBulletItem::Create(SvStream &s, sal_uInt16 n) const
1173cdf0e10cSrcweir {
1174cdf0e10cSrcweir     return SfxPoolItem::Create(s, n );
1175cdf0e10cSrcweir }
1176cdf0e10cSrcweir 
1177cdf0e10cSrcweir /* -----------------27.10.98 10:41-------------------
1178cdf0e10cSrcweir  *
1179cdf0e10cSrcweir  * --------------------------------------------------*/
SvxNumBulletItem(const SvxNumBulletItem & rCopy)1180cdf0e10cSrcweir SvxNumBulletItem::SvxNumBulletItem(const SvxNumBulletItem& rCopy) :
1181cdf0e10cSrcweir     SfxPoolItem(rCopy.Which())
1182cdf0e10cSrcweir {
1183cdf0e10cSrcweir     pNumRule = new SvxNumRule(*rCopy.pNumRule);
1184cdf0e10cSrcweir }
1185cdf0e10cSrcweir /* -----------------27.10.98 10:41-------------------
1186cdf0e10cSrcweir  *
1187cdf0e10cSrcweir  * --------------------------------------------------*/
~SvxNumBulletItem()1188cdf0e10cSrcweir SvxNumBulletItem::~SvxNumBulletItem()
1189cdf0e10cSrcweir {
1190cdf0e10cSrcweir     delete pNumRule;
1191cdf0e10cSrcweir }
1192cdf0e10cSrcweir 
1193cdf0e10cSrcweir /* -----------------27.10.98 10:41-------------------
1194cdf0e10cSrcweir  *
1195cdf0e10cSrcweir  * --------------------------------------------------*/
operator ==(const SfxPoolItem & rCopy) const1196cdf0e10cSrcweir int  SvxNumBulletItem::operator==( const SfxPoolItem& rCopy) const
1197cdf0e10cSrcweir {
1198cdf0e10cSrcweir     return *pNumRule == *((SvxNumBulletItem&)rCopy).pNumRule;
1199cdf0e10cSrcweir }
1200cdf0e10cSrcweir /* -----------------27.10.98 10:41-------------------
1201cdf0e10cSrcweir  *
1202cdf0e10cSrcweir  * --------------------------------------------------*/
Clone(SfxItemPool *) const1203cdf0e10cSrcweir SfxPoolItem*  SvxNumBulletItem::Clone( SfxItemPool * ) const
1204cdf0e10cSrcweir {
1205cdf0e10cSrcweir     return new SvxNumBulletItem(*this);
1206cdf0e10cSrcweir }
1207cdf0e10cSrcweir /* -----------------08.12.98 10:43-------------------
1208cdf0e10cSrcweir  *
1209cdf0e10cSrcweir  * --------------------------------------------------*/
GetVersion(sal_uInt16) const1210cdf0e10cSrcweir sal_uInt16  SvxNumBulletItem::GetVersion( sal_uInt16 /*nFileVersion*/ ) const
1211cdf0e10cSrcweir {
1212cdf0e10cSrcweir     return NUMITEM_VERSION_03;
1213cdf0e10cSrcweir }
1214cdf0e10cSrcweir /* -----------------08.12.98 10:43-------------------
1215cdf0e10cSrcweir  *
1216cdf0e10cSrcweir  * --------------------------------------------------*/
Store(SvStream & rStream,sal_uInt16) const1217cdf0e10cSrcweir SvStream&   SvxNumBulletItem::Store(SvStream &rStream, sal_uInt16 /*nItemVersion*/ )const
1218cdf0e10cSrcweir {
1219cdf0e10cSrcweir     pNumRule->Store(rStream);
1220cdf0e10cSrcweir     return rStream;
1221cdf0e10cSrcweir }
1222cdf0e10cSrcweir 
1223cdf0e10cSrcweir /* -----------------08.12.98 10:43-------------------
1224cdf0e10cSrcweir  *
1225cdf0e10cSrcweir  * --------------------------------------------------*/
1226cdf0e10cSrcweir 
QueryValue(com::sun::star::uno::Any & rVal,sal_uInt8) const1227cdf0e10cSrcweir sal_Bool SvxNumBulletItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const
1228cdf0e10cSrcweir {
1229cdf0e10cSrcweir     rVal <<= SvxCreateNumRule( pNumRule );
1230cdf0e10cSrcweir     return sal_True;
1231cdf0e10cSrcweir }
1232cdf0e10cSrcweir 
PutValue(const com::sun::star::uno::Any & rVal,sal_uInt8)1233cdf0e10cSrcweir sal_Bool SvxNumBulletItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ )
1234cdf0e10cSrcweir {
1235cdf0e10cSrcweir     uno::Reference< container::XIndexReplace > xRule;
1236cdf0e10cSrcweir     if( rVal >>= xRule )
1237cdf0e10cSrcweir     {
1238cdf0e10cSrcweir         try
1239cdf0e10cSrcweir         {
1240cdf0e10cSrcweir             SvxNumRule* pNewRule = new SvxNumRule( SvxGetNumRule( xRule ) );
1241cdf0e10cSrcweir             if( pNewRule->GetLevelCount() != pNumRule->GetLevelCount() ||
1242cdf0e10cSrcweir                 pNewRule->GetNumRuleType() != pNumRule->GetNumRuleType() )
1243cdf0e10cSrcweir             {
1244cdf0e10cSrcweir                 SvxNumRule* pConverted = SvxConvertNumRule( pNewRule, pNumRule->GetLevelCount(), pNumRule->GetNumRuleType() );
1245cdf0e10cSrcweir                 delete pNewRule;
1246cdf0e10cSrcweir                 pNewRule = pConverted;
1247cdf0e10cSrcweir             }
1248cdf0e10cSrcweir             delete pNumRule;
1249cdf0e10cSrcweir             pNumRule = pNewRule;
1250cdf0e10cSrcweir             return sal_True;
1251cdf0e10cSrcweir         }
1252cdf0e10cSrcweir         catch(lang::IllegalArgumentException&)
1253cdf0e10cSrcweir         {
1254cdf0e10cSrcweir         }
1255cdf0e10cSrcweir     }
1256cdf0e10cSrcweir     return sal_False;
1257cdf0e10cSrcweir }
1258cdf0e10cSrcweir 
1259cdf0e10cSrcweir /* -----------------08.12.98 10:43-------------------
1260cdf0e10cSrcweir  *
1261cdf0e10cSrcweir  * --------------------------------------------------*/
SvxConvertNumRule(const SvxNumRule * pRule,sal_uInt16 nLevels,SvxNumRuleType eType)1262cdf0e10cSrcweir SvxNumRule* SvxConvertNumRule( const SvxNumRule* pRule, sal_uInt16 nLevels, SvxNumRuleType eType )
1263cdf0e10cSrcweir {
1264cdf0e10cSrcweir     const sal_uInt16 nSrcLevels = pRule->GetLevelCount();
1265cdf0e10cSrcweir     SvxNumRule* pNewRule = new SvxNumRule( pRule->GetFeatureFlags(), nLevels, pRule->IsContinuousNumbering(), eType );
1266cdf0e10cSrcweir 
1267cdf0e10cSrcweir     for( sal_uInt16 nLevel = 0; (nLevel < nLevels) && (nLevel < nSrcLevels); nLevel++ )
1268cdf0e10cSrcweir         pNewRule->SetLevel( nLevel, pRule->GetLevel( nLevel ) );
1269cdf0e10cSrcweir 
1270cdf0e10cSrcweir     return pNewRule;
1271cdf0e10cSrcweir }
1272