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