xref: /aoo41x/main/svx/source/sidebar/nbdtmg.cxx (revision 1ff378ef)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 #include "precompiled_svx.hxx"
22 #ifndef _NBDTMG_HXX
23 #include <svx/nbdtmg.hxx>
24 #endif
25 #ifndef _SVX_SVXIDS_HRC
26 #include <svx/svxids.hrc>
27 #endif
28 #ifndef _SV_SVAPP_HXX
29 #include <vcl/svapp.hxx>
30 #endif
31 #ifndef _SFXITEMSET_HXX
32 #include <svl/itemset.hxx>
33 #endif
34 #ifndef _SFXREQUEST_HXX
35 #include <sfx2/request.hxx>
36 #endif
37 #ifndef _SFXSTRITEM_HXX
38 #include <svl/stritem.hxx>
39 #endif
40 #ifndef _UNO_LINGU_HXX
41 #include <editeng/unolingu.hxx>
42 #endif
43 #ifndef _CTRLTOOL_HXX
44 #include <svtools/ctrltool.hxx>
45 #endif
46 #ifndef _SFX_OBJSH_HXX
47 #include <sfx2/objsh.hxx>
48 #endif
49 #ifndef _SVX_FLSTITEM_HXX
50 #include <editeng/flstitem.hxx>
51 #endif
52 #ifndef _SFXITEMPOOL_HXX
53 #include <svl/itempool.hxx>
54 #endif
55 #ifndef _SV_OUTDEV_HXX
56 #include <vcl/outdev.hxx>
57 #endif
58 #ifndef _GALLERY_HXX_
59 #include <svx/gallery.hxx>
60 #endif
61 #ifndef _SVX_BRSHITEM_HXX
62 #include <editeng/brshitem.hxx>
63 #endif
64 #include <svx/dialmgr.hxx>
65 #ifndef _SVX_DIALOGS_HRC
66 #include <svx/dialogs.hrc>
67 #endif
68 #ifndef _SV_GRAPH_HXX
69 #include <vcl/graph.hxx>
70 #endif
71 
72 #include <unotools/streamwrap.hxx>
73 #include <unotools/ucbstreamhelper.hxx>
74 #include <unotools/pathoptions.hxx>
75 #include <editeng/eeitem.hxx>
76 
77 #include <com/sun/star/text/HoriOrientation.hpp>
78 #include <com/sun/star/text/VertOrientation.hpp>
79 #include <com/sun/star/text/RelOrientation.hpp>
80 #include <com/sun/star/style/NumberingType.hpp>
81 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
82 #include <com/sun/star/container/XIndexAccess.hpp>
83 #include <com/sun/star/text/XDefaultNumberingProvider.hpp>
84 #include <com/sun/star/text/XNumberingFormatter.hpp>
85 #include <com/sun/star/beans/PropertyValue.hpp>
86 #include <comphelper/processfactory.hxx>
87 #include <com/sun/star/text/XNumberingTypeInfo.hpp>
88 
89 using namespace com::sun::star;
90 using namespace com::sun::star::uno;
91 using namespace com::sun::star::beans;
92 using namespace com::sun::star::lang;
93 using namespace com::sun::star::text;
94 using namespace com::sun::star::container;
95 using namespace com::sun::star::style;
96 using rtl::OUString;
97 
98 namespace svx { namespace sidebar {
99 #define NUM_TYPE_MEMBER	4
100 #define NUM_VALUSET_COUNT		16
101 #define MAX_VALUESET_GRAPHIC	30
102 
103 typedef NumSettings_Impl* NumSettings_ImplPtr;
104 SV_DECL_PTRARR_DEL(NumSettingsArr_Impl,NumSettings_ImplPtr,8,4)
105 SV_IMPL_PTRARR( NumSettingsArr_Impl, NumSettings_ImplPtr )
106 
107 typedef NumberSettings_Impl* NumberSettings_ImplPtr;
108 SV_DECL_PTRARR_DEL(NumberSettingsArr_Impl,NumberSettings_ImplPtr,8,4)
109 SV_IMPL_PTRARR( NumberSettingsArr_Impl, NumberSettings_ImplPtr )
110 
111 Font& lcl_GetDefaultBulletFont()
112 {
113 	static sal_Bool bInit = 0;
114 	static Font aDefBulletFont( UniString::CreateFromAscii(
115 		                        RTL_CONSTASCII_STRINGPARAM( "StarSymbol" ) ),
116 								String(), Size( 0, 14 ) );
117 	if(!bInit)
118 	{
119         aDefBulletFont.SetCharSet( RTL_TEXTENCODING_SYMBOL );
120 		aDefBulletFont.SetFamily( FAMILY_DONTKNOW );
121 		aDefBulletFont.SetPitch( PITCH_DONTKNOW );
122 		aDefBulletFont.SetWeight( WEIGHT_DONTKNOW );
123 		aDefBulletFont.SetTransparent( sal_True );
124 		bInit = sal_True;
125 	}
126 	return aDefBulletFont;
127 }
128 
129 static const sal_Unicode aDefaultBulletTypes[] =
130 {
131 	0x2022,
132 	0x25cf,
133 	0xe00c,
134 	0xe00a,
135 	0x2794,
136 	0x27a2,
137 	0x2717,
138 	0x2714
139 };
140 
141 static const sal_Unicode aDefaultRTLBulletTypes[] =
142 {
143 	0x2022,
144 	0x25cf,
145 	0xe00c,
146 	0xe00a,
147 	0x25c4,
148 	0x272b,
149 	0x2717,
150 	0x2714
151 };
152 
153 static const sal_Char sNumberingType[] = "NumberingType";
154 static const sal_Char sValue[] = "Value";
155 static const sal_Char sParentNumbering[] = "ParentNumbering";
156 static const sal_Char sPrefix[] = "Prefix";
157 static const sal_Char sSuffix[] = "Suffix";
158 static const sal_Char sBulletChar[] = "BulletChar";
159 static const sal_Char sBulletFontName[] = "BulletFontName";
160 
161 NumSettings_ImplPtr lcl_CreateNumberingSettingsPtr(const Sequence<PropertyValue>& rLevelProps)
162 {
163 	const PropertyValue* pValues = rLevelProps.getConstArray();
164 	NumSettings_ImplPtr pNew = new NumSettings_Impl;
165 	for(sal_Int32 j = 0; j < rLevelProps.getLength(); j++)
166 	{
167 		if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(sNumberingType)))
168 			pValues[j].Value >>= pNew->nNumberType;
169 		else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(sPrefix)))
170 			pValues[j].Value >>= pNew->sPrefix;
171 		else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(sSuffix)))
172 			pValues[j].Value >>= pNew->sSuffix;
173 		else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(sParentNumbering)))
174 			pValues[j].Value >>= pNew->nParentNumbering;
175 		else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(sBulletChar)))
176 			pValues[j].Value >>= pNew->sBulletChar;
177 		else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(sBulletFontName)))
178 			pValues[j].Value >>= pNew->sBulletFont;
179 	}
180     const sal_Unicode cLocalPrefix = pNew->sPrefix.getLength() ? pNew->sPrefix.getStr()[0] : 0;
181     const sal_Unicode cLocalSuffix = pNew->sSuffix.getLength() ? pNew->sSuffix.getStr()[0] : 0;
182 	String aEmptyStr;
183 	if( cLocalPrefix == ' ') pNew->sPrefix=aEmptyStr;
184 	if( cLocalSuffix == ' ') pNew->sSuffix=aEmptyStr;
185 	return pNew;
186 }
187 
188 sal_uInt16 NBOTypeMgrBase:: IsSingleLevel(sal_uInt16 nCurLevel)
189 {
190 	sal_uInt16 nLv = (sal_uInt16)0xFFFF;
191 	sal_uInt16 nCount = 0;
192 	sal_uInt16 nMask = 1;
193 	for( sal_uInt16 i = 0; i < SVX_MAX_NUM; i++ )
194 	{
195 		if(nCurLevel & nMask)
196 		{
197 			nCount++;
198 			nLv=i;
199 		}
200 		nMask <<= 1 ;
201 	}
202 
203 	if ( nCount == 1)
204 		return nLv;
205 	else
206 		return (sal_uInt16)0xFFFF;
207 }
208 
209 void NBOTypeMgrBase::StoreBulCharFmtName_impl() {
210 		if ( pSet )
211 		{
212 			SfxAllItemSet aSet(*pSet);
213 			SFX_ITEMSET_ARG(&aSet,pBulletCharFmt,SfxStringItem,SID_BULLET_CHAR_FMT,sal_False);
214 
215 			if ( pBulletCharFmt )
216 			{
217 				aNumCharFmtName =  String(pBulletCharFmt->GetValue());
218 			}
219 		}
220 }
221 String NBOTypeMgrBase::GetBulCharFmtName()
222 {
223 	return aNumCharFmtName;
224 }
225 void NBOTypeMgrBase::ImplLoad(String filename)
226 {
227 	bIsLoading = true;
228 	SfxMapUnit		eOldCoreUnit=eCoreUnit;
229 	eCoreUnit = SFX_MAPUNIT_100TH_MM;
230 	INetURLObject aFile( SvtPathOptions().GetPalettePath() );
231 	aFile.Append( filename);
232 	SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aFile.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
233 	if( pIStm ) {
234 		sal_uInt32                      nVersion;
235 		sal_Int32                   nNumIndex;
236 		*pIStm >> nVersion;
237 		if (nVersion==DEFAULT_NUMBERING_CACHE_FORMAT_VERSION) //first version
238 		{
239 			*pIStm >> nNumIndex;
240 			sal_uInt16 mLevel = 0x1;
241 			while (nNumIndex>=0 && nNumIndex<DEFAULT_NUM_VALUSET_COUNT) {
242 				SvxNumRule aNum(*pIStm);
243 				//bullet color in font properties is not stored correctly. Need set tranparency bits manually
244 				for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++)
245 				{
246 					SvxNumberFormat aFmt(aNum.GetLevel(i));
247 					if (aFmt.GetBulletFont()) {
248 						Font aFont(*aFmt.GetBulletFont());
249 						Color c=aFont.GetColor();
250 						c.SetTransparency(0xFF);
251 						aFont.SetColor(c);
252 						aFmt.SetBulletFont(&aFont);
253 						aNum.SetLevel(i, aFmt);
254 					}
255 				}
256 				RelplaceNumRule(aNum,nNumIndex,mLevel);
257 				*pIStm >> nNumIndex;
258 			}
259 			delete pIStm;
260 		}
261 	}
262 	eCoreUnit = eOldCoreUnit;
263 	bIsLoading = false;
264 }
265 void NBOTypeMgrBase::ImplStore(String filename)
266 {
267 	if (bIsLoading) return;
268 	SfxMapUnit		eOldCoreUnit=eCoreUnit;
269 	eCoreUnit = SFX_MAPUNIT_100TH_MM;
270 	INetURLObject aFile( SvtPathOptions().GetPalettePath() );
271 	aFile.Append( filename);
272     SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aFile.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE );
273 	if( pOStm ) {
274 		sal_uInt32                      nVersion;
275 		sal_Int32                       nNumIndex;
276 		nVersion = DEFAULT_NUMBERING_CACHE_FORMAT_VERSION;
277 		*pOStm << nVersion;
278 		for(sal_Int32 nItem = 0; nItem < DEFAULT_NUM_VALUSET_COUNT;	nItem++ ) {
279 			if (IsCustomized(nItem)) {
280 				SvxNumRule aDefNumRule( NUM_BULLET_REL_SIZE|NUM_CONTINUOUS|NUM_BULLET_COLOR|NUM_CHAR_TEXT_DISTANCE|NUM_SYMBOL_ALIGNMENT,10, sal_False ,
281 					SVX_RULETYPE_NUMBERING,SvxNumberFormat::LABEL_ALIGNMENT);
282 				sal_uInt16 mLevel = 0x1;
283 				*pOStm << nItem;
284 				ApplyNumRule(aDefNumRule,nItem,mLevel,false,true);
285 				aDefNumRule.Store(*pOStm);
286 			}
287 		}
288 		nNumIndex = -1;
289 		*pOStm << nNumIndex;  //write end flag
290 		delete pOStm;
291 	}
292 	eCoreUnit = eOldCoreUnit;
293 }
294 
295 void NBOTypeMgrBase::StoreMapUnit_impl() {
296 	if ( pSet )
297 	{
298 		const SfxPoolItem* pItem;
299 		SfxItemState eState = pSet->GetItemState(SID_ATTR_NUMBERING_RULE, sal_False, &pItem);
300 		if(eState == SFX_ITEM_SET)
301 		{
302 			eCoreUnit = pSet->GetPool()->GetMetric(pSet->GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE));
303 		} else {
304 			//Sym3_2508 sd use different sid for numbering rule
305 			eState = pSet->GetItemState(EE_PARA_NUMBULLET, sal_False, &pItem);
306 			if(eState == SFX_ITEM_SET)
307 			{
308 				eCoreUnit = pSet->GetPool()->GetMetric(pSet->GetPool()->GetWhich(EE_PARA_NUMBULLET));
309 			}
310 		}
311 	}
312 }
313 SfxMapUnit NBOTypeMgrBase::GetMapUnit()
314 {
315 	return eCoreUnit;
316 }
317 /***************************************************************************************************
318 **********************Character Bullet Type lib**********************************************************
319 ****************************************************************************************************/
320 BulletsTypeMgr* BulletsTypeMgr::_instance = 0;
321 BulletsSettings_Impl* BulletsTypeMgr::pActualBullets[] ={0,0,0,0,0,0,0,0};
322 sal_Unicode BulletsTypeMgr::aDynamicBulletTypes[]={' ',' ',' ',' ',' ',' ',' ',' '};
323 sal_Unicode BulletsTypeMgr::aDynamicRTLBulletTypes[]={' ',' ',' ',' ',' ',' ',' ',' '};
324 
325 BulletsTypeMgr::BulletsTypeMgr(const NBOType aType):
326 	NBOTypeMgrBase(aType)
327 {
328 	Init();
329 }
330 
331 BulletsTypeMgr::BulletsTypeMgr(const NBOType aType,const SfxItemSet* pArg):
332 	NBOTypeMgrBase(aType,pArg)
333 {
334 	Init();
335 }
336 
337 BulletsTypeMgr::BulletsTypeMgr(const BulletsTypeMgr& aTypeMgr):
338 	NBOTypeMgrBase(aTypeMgr)
339 {
340 	for (sal_uInt16 i=0;i<DEFAULT_BULLET_TYPES;i++)
341 	{
342 		pActualBullets[i]->bIsCustomized = aTypeMgr.pActualBullets[i]->bIsCustomized;
343 		pActualBullets[i]->cBulletChar = aTypeMgr.pActualBullets[i]->cBulletChar;
344 		pActualBullets[i]->aFont = aTypeMgr.pActualBullets[i]->aFont;
345 		pActualBullets[i]->sDescription = aTypeMgr. pActualBullets[i]->sDescription;
346 		pActualBullets[i]->eType = aTypeMgr. pActualBullets[i]->eType;
347 	}
348 }
349 void BulletsTypeMgr::Init()
350 {
351 	Font& rActBulletFont = lcl_GetDefaultBulletFont();
352 	String sName = rActBulletFont.GetName();
353 	if( Application::GetSettings().GetLayoutRTL() )
354 	{
355 		for (sal_uInt16 i=0;i<DEFAULT_BULLET_TYPES;i++)
356 		{
357 			pActualBullets[i] = new BulletsSettings_Impl(eNBType::BULLETS);
358 			pActualBullets[i]->cBulletChar = aDefaultRTLBulletTypes[i];
359 			pActualBullets[i]->aFont = rActBulletFont;
360 			if (i==4 || i==5)
361 				pActualBullets[i]->sDescription = SVX_RESSTR( RID_SVXSTR_BULLET_RTL_DESCRIPTION_4 - 4 + i );
362 			else
363 				pActualBullets[i]->sDescription = SVX_RESSTR( RID_SVXSTR_BULLET_DESCRIPTION_0 + i );
364 		}
365 	}else
366 	{
367 		for (sal_uInt16 i=0;i<DEFAULT_BULLET_TYPES;i++)
368 		{
369 			pActualBullets[i] = new BulletsSettings_Impl(eNBType::BULLETS);
370 			pActualBullets[i]->cBulletChar = aDefaultBulletTypes[i];
371 			pActualBullets[i]->aFont =rActBulletFont;
372 			pActualBullets[i]->sDescription = SVX_RESSTR( RID_SVXSTR_BULLET_DESCRIPTION_0 + i );
373 		}
374 	}
375 }
376 sal_uInt16 BulletsTypeMgr::GetNBOIndexForNumRule(SvxNumRule& aNum,sal_uInt16 mLevel,sal_uInt16 nFromIndex)
377 {
378 	if ( mLevel == (sal_uInt16)0xFFFF || mLevel == 0)
379 		return (sal_uInt16)0xFFFF;
380 	//if ( !lcl_IsNumFmtSet(pNR, mLevel) ) return (sal_uInt16)0xFFFF;
381 
382 	sal_uInt16 nActLv = IsSingleLevel(mLevel);
383 
384 	if ( nActLv == (sal_uInt16)0xFFFF )
385 		return (sal_uInt16)0xFFFF;
386 
387 	SvxNumberFormat aFmt(aNum.GetLevel(nActLv));
388 	sal_Unicode cChar = aFmt.GetBulletChar();
389 	const Font* pFont = aFmt.GetBulletFont();
390 	//sal_uInt16 nLength = 0;
391 	/*if( Application::GetSettings().GetLayoutRTL() )
392 	{
393 		nLength = sizeof(aDynamicRTLBulletTypes)/sizeof(sal_Unicode);
394 		for(sal_uInt16 i = 0; i < nLength; i++)
395 		{
396 			if ( cChar == aDynamicRTLBulletTypes[i] ||
397 				(cChar == 9830 && 57356 == aDynamicRTLBulletTypes[i]) ||
398 				(cChar == 9632 && 57354 == aDynamicRTLBulletTypes[i]) )
399 			{
400 				return i+1;
401 			}
402 		}
403 	} else
404 	{
405 		nLength = sizeof(aDynamicBulletTypes)/sizeof(sal_Unicode);
406 		for(sal_uInt16 i = 0; i < nLength; i++)
407 		{
408 			if ( cChar == aDynamicBulletTypes[i] ||
409 				(cChar == 9830 && 57356 == aDynamicBulletTypes[i]) ||
410 				(cChar == 9632 && 57354 == aDynamicBulletTypes[i]) )
411 			{
412 				return i+1;
413 			}
414 		}
415 	}*/
416 	//nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl);
417 	for(sal_uInt16 i = nFromIndex; i < DEFAULT_BULLET_TYPES; i++)
418 	{
419 		if ( (cChar == pActualBullets[i]->cBulletChar||
420 			(cChar == 9830 && 57356 == pActualBullets[i]->cBulletChar) ||
421 			(cChar == 9632 && 57354 == pActualBullets[i]->cBulletChar)))// && pFont && (pFont->GetName().CompareTo(pActualBullets[i]->aFont.GetName())==COMPARE_EQUAL))
422 		{
423 			return i+1;
424 		}
425 	}
426 
427 	return (sal_uInt16)0xFFFF;
428 }
429 
430 sal_Bool BulletsTypeMgr::RelplaceNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel)
431 {
432 	if ( mLevel == (sal_uInt16)0xFFFF || mLevel == 0)
433 		return sal_False;
434 
435 	if ( GetNBOIndexForNumRule(aNum,mLevel) != (sal_uInt16)0xFFFF )
436 		return sal_False;
437 
438 	sal_uInt16 nActLv = IsSingleLevel(mLevel);
439 
440 	if ( nActLv == (sal_uInt16)0xFFFF )
441 		return sal_False;
442 
443 	SvxNumberFormat aFmt(aNum.GetLevel(nActLv));
444 	sal_Unicode cChar = aFmt.GetBulletChar();
445 	const Font* pFont = aFmt.GetBulletFont();
446 	//sal_uInt16 nLength = 0;
447 	/*if( Application::GetSettings().GetLayoutRTL() )
448 	{
449 		nLength = sizeof(aDynamicRTLBulletTypes)/sizeof(sal_Unicode);
450 
451 		if ( nIndex >= nLength )
452 			return sal_False;
453 
454 		aDynamicRTLBulletTypes[nIndex] = cChar;
455 	} else
456 	{
457 		nLength = sizeof(aDynamicBulletTypes)/sizeof(sal_Unicode);
458 
459 		if ( nIndex >= nLength )
460 			return sal_False;
461 
462 		aDynamicBulletTypes[nIndex] = cChar;
463 	}*/
464 	//nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl);
465 	if ( nIndex >= DEFAULT_BULLET_TYPES )
466 		return sal_False;
467 
468 	pActualBullets[nIndex]->cBulletChar = cChar;
469 	if ( pFont )
470 		pActualBullets[nIndex]->aFont = *pFont;
471 	pActualBullets[nIndex]->bIsCustomized = sal_True;
472 
473 	String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_BULLET_DESCRIPTION));
474 	String aReplace = String::CreateFromAscii("%LIST_NUM");
475 	String sNUM = String::CreateFromInt32( nIndex + 1 );
476 	aStrFromRES.SearchAndReplace(aReplace,sNUM);
477 	pActualBullets[nIndex]->sDescription = aStrFromRES;
478 
479 	return sal_True;
480 }
481 
482 sal_Bool BulletsTypeMgr::ApplyNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel,sal_Bool isDefault,sal_Bool isResetSize)
483 {
484 	//if ( mLevel == (sal_uInt16)0xFFFF )
485 	//	return sal_False;
486 
487 	sal_Unicode cChar;
488 	//sal_uInt16 nLength = 0;
489 	/*if( Application::GetSettings().GetLayoutRTL() )
490 	{
491 		nLength = sizeof(aDynamicRTLBulletTypes)/sizeof(sal_Unicode);
492 
493 		if ( nIndex >= nLength )
494 			return sal_False;
495 
496 		cChar = aDynamicRTLBulletTypes[nIndex];
497 	}else
498 	{
499 		nLength = sizeof(aDynamicBulletTypes)/sizeof(sal_Unicode);
500 
501 		if ( nIndex >= nLength )
502 			return sal_False;
503 
504 		cChar = aDynamicBulletTypes[nIndex];
505 	}*/
506 	//nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl);
507 	if ( nIndex >= DEFAULT_BULLET_TYPES )
508 		return sal_False;
509 	cChar = pActualBullets[nIndex]->cBulletChar;
510 	//Font& rActBulletFont = lcl_GetDefaultBulletFont();
511 	Font rActBulletFont = pActualBullets[nIndex]->aFont;
512 
513 	sal_uInt16 nMask = 1;
514 	String sBulletCharFmtName = GetBulCharFmtName();
515 	for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++)
516 	{
517 		if(mLevel & nMask)
518 		{
519 			SvxNumberFormat aFmt(aNum.GetLevel(i));
520 			aFmt.SetNumberingType( SVX_NUM_CHAR_SPECIAL );
521 			aFmt.SetBulletFont(&rActBulletFont);
522 			aFmt.SetBulletChar(cChar );
523 			aFmt.SetCharFmtName(sBulletCharFmtName);
524             if (isResetSize) aFmt.SetBulletRelSize(45);
525 			aNum.SetLevel(i, aFmt);
526 		}
527 		nMask <<= 1;
528 	}
529 
530 	return sal_True;
531 }
532 
533 String BulletsTypeMgr::GetDescription(sal_uInt16 nIndex,sal_Bool isDefault)
534 {
535 	String sRet;
536 	//sal_uInt16 nLength = 0;
537 	//nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl);
538 
539 	if ( nIndex >= DEFAULT_BULLET_TYPES )
540 		return sRet;
541 	else
542 		sRet = pActualBullets[nIndex]->sDescription;
543 
544 	return sRet;
545 }
546 sal_Bool BulletsTypeMgr::IsCustomized(sal_uInt16 nIndex)
547 {
548 	sal_Bool bRet = sal_False;
549 	//sal_uInt16 nLength = 0;
550 	//nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl);
551 
552 	if ( nIndex >= DEFAULT_BULLET_TYPES )
553 		bRet = sal_False;
554 	else
555 		bRet = pActualBullets[nIndex]->bIsCustomized;
556 
557 	return bRet;
558 }
559 
560 sal_Unicode BulletsTypeMgr::GetBulChar(sal_uInt16 nIndex)
561 {
562 	sal_Unicode cChar;
563 	//sal_uInt16 nLength = 0;
564 	//nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl);
565 
566 	if ( nIndex >= DEFAULT_BULLET_TYPES )
567 		cChar = ' ';
568 	else
569 		cChar = pActualBullets[nIndex]->cBulletChar;
570 
571 	/*if( Application::GetSettings().GetLayoutRTL() )
572 	{
573 		nLength = sizeof(aDynamicRTLBulletTypes)/sizeof(sal_Unicode);
574 
575 		if ( nIndex >= nLength )
576 			cChar = ' ';
577 		else
578 			cChar = aDynamicRTLBulletTypes[nIndex];
579 	}else
580 	{
581 		nLength = sizeof(aDynamicBulletTypes)/sizeof(sal_Unicode);
582 
583 		if ( nIndex >= nLength )
584 			cChar = ' ';
585 		else
586 			cChar = aDynamicBulletTypes[nIndex];
587 	}*/
588 
589 	return cChar;
590 }
591 Font BulletsTypeMgr::GetBulCharFont(sal_uInt16 nIndex)
592 {
593 	Font aRet;
594 	if ( nIndex >= DEFAULT_BULLET_TYPES )
595 		aRet = lcl_GetDefaultBulletFont();
596 	else
597 		aRet = pActualBullets[nIndex]->aFont;
598 
599 	return aRet;
600 }
601 /***************************************************************************************************
602 **********************Graphic Bullet Type lib***********************************************************
603 ****************************************************************************************************/
604 GraphyicBulletsTypeMgr* GraphyicBulletsTypeMgr::_instance = 0;
605 GraphyicBulletsTypeMgr::GraphyicBulletsTypeMgr(const NBOType aType):
606 	NBOTypeMgrBase(aType)
607 {
608 	Init();
609 }
610 
611 GraphyicBulletsTypeMgr::GraphyicBulletsTypeMgr(const NBOType aType,const SfxItemSet* pArg):
612 	NBOTypeMgrBase(aType,pArg)
613 {
614 	Init();
615 }
616 GraphyicBulletsTypeMgr::GraphyicBulletsTypeMgr(const GraphyicBulletsTypeMgr& aTypeMgr):
617 	NBOTypeMgrBase(aTypeMgr)
618 {
619 	for (sal_uInt16 i=0;i< aTypeMgr.aGrfDataLst.Count();i++)
620 	{
621 		GrfBulDataRelation* pEntry = new GrfBulDataRelation(eNBType::GRAPHICBULLETS);
622 		GrfBulDataRelation* pSrcEntry = (GrfBulDataRelation*)(aTypeMgr.aGrfDataLst.GetObject(i));
623 		if ( pEntry && pSrcEntry)
624 		{
625 			pEntry->bIsCustomized = pSrcEntry->bIsCustomized;
626 			pEntry->nTabIndex = pSrcEntry->nTabIndex;
627 			pEntry->nGallaryIndex = pSrcEntry->nGallaryIndex;
628 			pEntry->sGrfName = pSrcEntry->sGrfName;
629 			pEntry->sDescription = pSrcEntry->sDescription;
630 			aGrfDataLst.Insert( pEntry, LIST_APPEND );
631 		}
632 	}
633 }
634 void GraphyicBulletsTypeMgr::Init()
635 {
636 	List aGrfNames;
637 	GalleryExplorer::FillObjList(GALLERY_THEME_BULLETS, aGrfNames);
638 	for(sal_uInt16 i = 0; i < aGrfNames.Count(); i++)
639 	{
640 		String* pGrfNm = (String*) aGrfNames.GetObject(i);
641         	INetURLObject aObj(*pGrfNm);
642         	if(aObj.GetProtocol() == INET_PROT_FILE)
643             		*pGrfNm = aObj.PathToFileName();
644 
645 		GrfBulDataRelation* pEntry = new GrfBulDataRelation(eNBType::GRAPHICBULLETS);
646 		pEntry->nTabIndex = i+1;
647 		pEntry->nGallaryIndex = i;
648 		pEntry->sGrfName = *pGrfNm;
649 
650 		if( i < MAX_VALUESET_GRAPHIC )
651 		{
652 			pEntry->sDescription = SVX_RESSTR( RID_SVXSTR_GRAPHICS_DESCRIPTIONS + i );
653 		}else
654 		{
655 			pEntry->sDescription = *pGrfNm;
656 		}
657 
658 		aGrfDataLst.Insert( pEntry, LIST_APPEND );
659 	}
660 }
661 sal_uInt16 GraphyicBulletsTypeMgr::GetNBOIndexForNumRule(SvxNumRule& aNum,sal_uInt16 mLevel,sal_uInt16 nFromIndex)
662 {
663 	if ( mLevel == (sal_uInt16)0xFFFF || mLevel == 0)
664 		return (sal_uInt16)0xFFFF;
665 
666 	sal_uInt16 nActLv = IsSingleLevel(mLevel);
667 
668 	if ( nActLv == (sal_uInt16)0xFFFF )
669 		return (sal_uInt16)0xFFFF;
670 
671 	SvxNumberFormat aFmt(aNum.GetLevel(nActLv));
672 	const SvxBrushItem* pBrsh = aFmt.GetBrush();
673 	const Graphic* pGrf = 0;
674 	if ( pBrsh )
675 		pGrf = pBrsh->GetGraphic();
676 
677 	if ( pGrf )
678 	{
679 		const String* pGrfName = pBrsh->GetGraphicLink();
680 		Graphic aGraphic;
681 		for(sal_uInt16 i=0;i<aGrfDataLst.Count();i++)
682 		{
683 			GrfBulDataRelation* pEntry = (GrfBulDataRelation*) aGrfDataLst.GetObject(i);
684 			sal_Bool bExist = sal_False;
685 			if ( pEntry) // && pEntry->sGrfName.CompareTo(*pGrfName)==COMPARE_EQUAL )
686 				bExist = GalleryExplorer::GetGraphicObj(GALLERY_THEME_BULLETS, pEntry->nGallaryIndex,&aGraphic);
687 			if (bExist) {
688 				Bitmap aSum=pGrf->GetBitmap();
689 				Bitmap aSum1=aGraphic.GetBitmap();
690 				if (aSum.IsEqual(aSum1))
691 				return pEntry->nTabIndex;
692 			}
693 		}
694 	}
695 
696 	return (sal_uInt16)0xFFFF;
697 }
698 
699 sal_Bool GraphyicBulletsTypeMgr::RelplaceNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel)
700 {
701 	if ( mLevel == (sal_uInt16)0xFFFF || mLevel > aNum.GetLevelCount() || mLevel == 0)
702 		return sal_False;
703 
704 	if ( GetNBOIndexForNumRule(aNum,mLevel) != (sal_uInt16)0xFFFF )
705 		return sal_False;
706 
707 	if ( nIndex >= aGrfDataLst.Count() )
708 		return sal_False;
709 
710 	sal_uInt16 nActLv = IsSingleLevel(mLevel);
711 	if ( nActLv == (sal_uInt16)0xFFFF )
712 		return sal_False;
713 
714 	SvxNumberFormat aFmt(aNum.GetLevel(nActLv));
715 	const SvxBrushItem* pBrsh = aFmt.GetBrush();
716 	const Graphic* pGrf = 0;
717 	if ( pBrsh )
718 		pGrf = pBrsh->GetGraphic();
719 	else
720 		return sal_False;
721 
722 	String sEmpty;
723 	if ( pGrf )
724 	{
725 		const String* pGrfName = pBrsh->GetGraphicLink();
726 		//String* pGrfName = (String*)(pBrsh->GetGraphicLink());
727 		GrfBulDataRelation* pEntry = (GrfBulDataRelation*) aGrfDataLst.GetObject(nIndex);
728 		if ( pGrfName )
729 			pEntry->sGrfName = *pGrfName;
730 		//pEntry->sDescription = sEmpty;
731 		pEntry->nGallaryIndex = (sal_uInt16)0xFFFF;
732 		pEntry->bIsCustomized = sal_True;
733 		String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_BULLET_DESCRIPTION));
734 		String aReplace = String::CreateFromAscii("%LIST_NUM");
735 		String sNUM = String::CreateFromInt32( nIndex + 1 );
736 		aStrFromRES.SearchAndReplace(aReplace,sNUM);
737 		pEntry->sDescription = aStrFromRES;
738 	}else
739 	{
740 		return sal_False;
741 	}
742 
743 	return sal_True;
744 }
745 
746 sal_Bool GraphyicBulletsTypeMgr::ApplyNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel,sal_Bool isDefault,sal_Bool isResetSize)
747 {
748 	//if ( mLevel == (sal_uInt16)0xFFFF )
749 	//	return sal_False;
750 
751 	if ( nIndex >= aGrfDataLst.Count() )
752 		return sal_False;
753 
754 	String sGrfName;
755 	GrfBulDataRelation* pEntry = (GrfBulDataRelation*) aGrfDataLst.GetObject(nIndex);
756 	sGrfName= pEntry->sGrfName;
757 
758 	sal_uInt16 nMask = 1;
759 	String aEmptyStr;
760 	sal_uInt16 nSetNumberingType = SVX_NUM_BITMAP;
761 	String sNumCharFmtName = GetBulCharFmtName();
762 	for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++)
763 	{
764 		if(mLevel & nMask)
765 		{
766 			SvxNumberFormat aFmt(aNum.GetLevel(i));
767 			aFmt.SetNumberingType(nSetNumberingType);
768 			aFmt.SetPrefix( aEmptyStr );
769 			aFmt.SetSuffix( aEmptyStr );
770 			aFmt.SetCharFmtName( sNumCharFmtName );
771 
772                 	Graphic aGraphic;
773                 	if(GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS, pEntry->nGallaryIndex, &aGraphic))
774 			{
775 	                    Size aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic);
776 	                    sal_Int16 eOrient = text::VertOrientation::LINE_CENTER;
777 				aSize = OutputDevice::LogicToLogic(aSize, MAP_100TH_MM, (MapUnit)GetMapUnit());
778 	                    SvxBrushItem aBrush(aGraphic, GPOS_AREA, SID_ATTR_BRUSH );
779 	                    aFmt.SetGraphicBrush( &aBrush, &aSize, &eOrient );
780 			}
781 			else// if(pGrfName)
782 				aFmt.SetGraphic( sGrfName );
783 
784 			aNum.SetLevel(i, aFmt);
785 		}
786 		nMask <<= 1 ;
787 	}
788 
789 	return sal_True;
790 }
791 String GraphyicBulletsTypeMgr::GetDescription(sal_uInt16 nIndex,sal_Bool isDefault)
792 {
793 	String sRet;
794 	sal_uInt16 nLength = 0;
795 	nLength = aGrfDataLst.Count() ;
796 
797 	if ( nIndex >= nLength )
798 		return sRet;
799 	else
800 	{
801 		GrfBulDataRelation* pEntry  = (GrfBulDataRelation*) aGrfDataLst.GetObject(nIndex);
802 		if ( pEntry )
803 		{
804 			sRet = pEntry->sDescription;
805 		};
806 	}
807 	return sRet;
808 }
809 sal_Bool GraphyicBulletsTypeMgr::IsCustomized(sal_uInt16 nIndex)
810 {
811 	sal_Bool bRet = sal_False;
812 
813 	sal_uInt16 nLength = 0;
814 	nLength = aGrfDataLst.Count() ;
815 
816 	if ( nIndex >= nLength )
817 		return bRet;
818 	else
819 	{
820 		GrfBulDataRelation* pEntry  = (GrfBulDataRelation*) aGrfDataLst.GetObject(nIndex);
821 		if ( pEntry )
822 		{
823 			bRet = pEntry->bIsCustomized;
824 		};
825 	}
826 
827 	return bRet;
828 }
829 String GraphyicBulletsTypeMgr::GetGrfName(sal_uInt16 nIndex)
830 {
831 	String sRet;
832 	if ( nIndex < aGrfDataLst.Count() )
833 	{
834 		GrfBulDataRelation* pEntry = (GrfBulDataRelation*) aGrfDataLst.GetObject(nIndex);
835 		if ( pEntry )
836 		{
837 			sRet = pEntry->sGrfName;
838 		}
839 	}
840 
841 	return sRet;
842 }
843 /***************************************************************************************************
844 **********************Mix Bullets Type lib**************************************************************
845 ****************************************************************************************************/
846 MixBulletsTypeMgr* MixBulletsTypeMgr::_instance = 0;
847 MixBulletsSettings_Impl* MixBulletsTypeMgr::pActualBullets[] ={0,0,0,0,0,0,0,0};
848 MixBulletsSettings_Impl* MixBulletsTypeMgr::pDefaultActualBullets[] ={0,0,0,0,0,0,0,0};
849 
850 MixBulletsTypeMgr::MixBulletsTypeMgr(const NBOType aType):
851 	NBOTypeMgrBase(aType)
852 {
853 	Init();
854 	for(sal_Int32 nItem = 0; nItem < DEFAULT_BULLET_TYPES; nItem++ )
855 	{
856 		pDefaultActualBullets[nItem] = pActualBullets[nItem];
857 	}
858 	//Initial the first time to store the default value. Then do it again for customized value
859 	Init();
860 	ImplLoad(String::CreateFromAscii("standard.sya"));
861 }
862 
863 MixBulletsTypeMgr::MixBulletsTypeMgr(const NBOType aType,const SfxItemSet* pArg):
864 	NBOTypeMgrBase(aType,pArg)
865 {
866 	Init();
867 	for(sal_Int32 nItem = 0; nItem < DEFAULT_BULLET_TYPES; nItem++ )
868 	{
869 		pDefaultActualBullets[nItem] = pActualBullets[nItem];
870 	}
871 	//Initial the first time to store the default value. Then do it again for customized value
872 	Init();
873 	ImplLoad(String::CreateFromAscii("standard.sya"));
874 }
875 
876 MixBulletsTypeMgr::MixBulletsTypeMgr(const MixBulletsTypeMgr& aTypeMgr):
877 	NBOTypeMgrBase(aTypeMgr)
878 {
879 	for (sal_uInt16 i=0;i<DEFAULT_BULLET_TYPES;i++)
880 	{
881 		if ( aTypeMgr.pActualBullets[i]->eType == eNBType::BULLETS )
882 		{
883 			pActualBullets[i]->eType = aTypeMgr.pActualBullets[i]->eType;
884 			pActualBullets[i]->nIndex = aTypeMgr.pActualBullets[i]->nIndex; //index in the tab page display
885 			pActualBullets[i]->nIndexDefault = aTypeMgr.pActualBullets[i]->nIndexDefault;
886 			pActualBullets[i]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ;
887 			((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->cBulletChar = ((BulletsSettings_Impl*)(aTypeMgr.pActualBullets[i]->pBullets))->cBulletChar;
888 			((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->aFont = ((BulletsSettings_Impl*)(aTypeMgr.pActualBullets[i]->pBullets))->aFont;
889 			((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->sDescription = ((BulletsSettings_Impl*)(aTypeMgr.pActualBullets[i]->pBullets))->sDescription;
890 			((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->bIsCustomized = ((BulletsSettings_Impl*)(aTypeMgr.pActualBullets[i]->pBullets))->bIsCustomized;
891 			((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->eType = ((BulletsSettings_Impl*)(aTypeMgr.pActualBullets[i]->pBullets))->eType;
892 		}else if ( aTypeMgr.pActualBullets[i]->eType == eNBType::GRAPHICBULLETS )
893 		{
894 			pActualBullets[i]->eType = aTypeMgr.pActualBullets[i]->eType;
895 			pActualBullets[i]->nIndex = aTypeMgr.pActualBullets[i]->nIndex; //index in the tab page display
896 			pActualBullets[i]->nIndexDefault = aTypeMgr.pActualBullets[i]->nIndexDefault;
897 			pActualBullets[i]->pBullets = new GrfBulDataRelation(eNBType::GRAPHICBULLETS) ;
898 			((GrfBulDataRelation*)(pActualBullets[i]->pBullets))->sGrfName = ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->sGrfName;
899 			((GrfBulDataRelation*)(pActualBullets[i]->pBullets))->sDescription = ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->sDescription;
900 			((GrfBulDataRelation*)(pActualBullets[i]->pBullets))->bIsCustomized = ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->bIsCustomized;
901 			((GrfBulDataRelation*)(pActualBullets[i]->pBullets))->eType = ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->eType;
902 			if ( ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->bIsCustomized && ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->pGrfObj != NULL)
903 			{
904 				((GrfBulDataRelation*)(pActualBullets[i]->pBullets))->pGrfObj = ((GrfBulDataRelation*)(aTypeMgr.pActualBullets[i]->pBullets))->pGrfObj;
905 			}
906 		}
907 	}
908 	ImplLoad(String::CreateFromAscii("standard.sya"));
909 }
910 void MixBulletsTypeMgr::Init()
911 {
912 	BulletsTypeMgr* pBTMgr = BulletsTypeMgr::GetInstance();
913 	if ( pBTMgr )
914 	{
915 		//Index 1
916 		pActualBullets[0] = new MixBulletsSettings_Impl(eNBType::BULLETS);
917 		pActualBullets[0]->eType = eNBType::BULLETS;
918 		pActualBullets[0]->nIndex = 0+1; //index in the tab page display,decrease 1 to the index within arr
919 		pActualBullets[0]->nIndexDefault = 2;	 //index in the tab page display,decrease 1 to the index within arr
920 		pActualBullets[0]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ;
921 		((BulletsSettings_Impl*)(pActualBullets[0]->pBullets))->cBulletChar = pBTMgr->GetBulChar(pActualBullets[0]->nIndexDefault-1);
922 		((BulletsSettings_Impl*)(pActualBullets[0]->pBullets))->aFont = pBTMgr->GetBulCharFont(pActualBullets[0]->nIndexDefault-1);
923 		((BulletsSettings_Impl*)(pActualBullets[0]->pBullets))->sDescription = pBTMgr->GetDescription(pActualBullets[0]->nIndexDefault-1);
924 		((BulletsSettings_Impl*)(pActualBullets[0]->pBullets))->bIsCustomized = pBTMgr->IsCustomized(pActualBullets[0]->nIndexDefault-1);
925 		((BulletsSettings_Impl*)(pActualBullets[0]->pBullets))->eType = eNBType::BULLETS;
926 
927 		//Index 2
928 		pActualBullets[1] = new MixBulletsSettings_Impl(eNBType::BULLETS);
929 		pActualBullets[1]->eType = eNBType::BULLETS;
930 		pActualBullets[1]->nIndex = 1+1; //index in the tab page display,decrease 1 to the index within arr
931 		pActualBullets[1]->nIndexDefault = 3;	 //index in the tab page display,decrease 1 to the index within arr
932 		pActualBullets[1]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ;
933 		((BulletsSettings_Impl*)(pActualBullets[1]->pBullets))->cBulletChar = pBTMgr->GetBulChar(pActualBullets[1]->nIndexDefault-1);
934 		((BulletsSettings_Impl*)(pActualBullets[1]->pBullets))->aFont = pBTMgr->GetBulCharFont(pActualBullets[1]->nIndexDefault-1);
935 		((BulletsSettings_Impl*)(pActualBullets[1]->pBullets))->sDescription = pBTMgr->GetDescription(pActualBullets[1]->nIndexDefault-1);
936 		((BulletsSettings_Impl*)(pActualBullets[1]->pBullets))->bIsCustomized = pBTMgr->IsCustomized(pActualBullets[1]->nIndexDefault-1);
937 		((BulletsSettings_Impl*)(pActualBullets[1]->pBullets))->eType = eNBType::BULLETS;
938 
939 		//Index 3
940 		pActualBullets[2] = new MixBulletsSettings_Impl(eNBType::BULLETS);
941 		pActualBullets[2]->eType = eNBType::BULLETS;
942 		pActualBullets[2]->nIndex = 2+1; //index in the tab page display,decrease 1 to the index within arr
943 		pActualBullets[2]->nIndexDefault = 4;	 //index in the tab page display,decrease 1 to the index within arr
944 		pActualBullets[2]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ;
945 		((BulletsSettings_Impl*)(pActualBullets[2]->pBullets))->cBulletChar = pBTMgr->GetBulChar(pActualBullets[2]->nIndexDefault-1);
946 		((BulletsSettings_Impl*)(pActualBullets[2]->pBullets))->aFont = pBTMgr->GetBulCharFont(pActualBullets[2]->nIndexDefault-1);
947 		((BulletsSettings_Impl*)(pActualBullets[2]->pBullets))->sDescription = pBTMgr->GetDescription(pActualBullets[2]->nIndexDefault-1);
948 		((BulletsSettings_Impl*)(pActualBullets[2]->pBullets))->bIsCustomized = pBTMgr->IsCustomized(pActualBullets[2]->nIndexDefault-1);
949 		((BulletsSettings_Impl*)(pActualBullets[2]->pBullets))->eType = eNBType::BULLETS;
950 
951 		//Index 4
952 		pActualBullets[3] = new MixBulletsSettings_Impl(eNBType::BULLETS);
953 		pActualBullets[3]->eType = eNBType::BULLETS;
954 		pActualBullets[3]->nIndex = 3+1; //index in the tab page display,decrease 1 to the index within arr
955 		pActualBullets[3]->nIndexDefault = 5;	 //index in the tab page display,decrease 1 to the index within arr
956 		pActualBullets[3]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ;
957 		((BulletsSettings_Impl*)(pActualBullets[3]->pBullets))->cBulletChar = pBTMgr->GetBulChar(pActualBullets[3]->nIndexDefault-1);
958 		((BulletsSettings_Impl*)(pActualBullets[3]->pBullets))->aFont = pBTMgr->GetBulCharFont(pActualBullets[3]->nIndexDefault-1);
959 		((BulletsSettings_Impl*)(pActualBullets[3]->pBullets))->sDescription = pBTMgr->GetDescription(pActualBullets[3]->nIndexDefault-1);
960 		((BulletsSettings_Impl*)(pActualBullets[3]->pBullets))->bIsCustomized = pBTMgr->IsCustomized(pActualBullets[3]->nIndexDefault-1);
961 		((BulletsSettings_Impl*)(pActualBullets[3]->pBullets))->eType = eNBType::BULLETS;
962 
963 		//Index 5
964 		pActualBullets[4] = new MixBulletsSettings_Impl(eNBType::BULLETS);
965 		pActualBullets[4]->eType = eNBType::BULLETS;
966 		pActualBullets[4]->nIndex = 4+1; //index in the tab page display,decrease 1 to the index within arr
967 		pActualBullets[4]->nIndexDefault = 6;	 //index in the tab page display,decrease 1 to the index within arr
968 		pActualBullets[4]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ;
969 		((BulletsSettings_Impl*)(pActualBullets[4]->pBullets))->cBulletChar = pBTMgr->GetBulChar(pActualBullets[4]->nIndexDefault-1);
970 		((BulletsSettings_Impl*)(pActualBullets[4]->pBullets))->aFont = pBTMgr->GetBulCharFont(pActualBullets[4]->nIndexDefault-1);
971 		((BulletsSettings_Impl*)(pActualBullets[4]->pBullets))->sDescription = pBTMgr->GetDescription(pActualBullets[4]->nIndexDefault-1);
972 		((BulletsSettings_Impl*)(pActualBullets[4]->pBullets))->bIsCustomized = pBTMgr->IsCustomized(pActualBullets[4]->nIndexDefault-1);
973 		((BulletsSettings_Impl*)(pActualBullets[4]->pBullets))->eType = eNBType::BULLETS;
974 
975 		//Index 6
976 		pActualBullets[5] = new MixBulletsSettings_Impl(eNBType::BULLETS);
977 		pActualBullets[5]->eType = eNBType::BULLETS;
978 		pActualBullets[5]->nIndex = 5+1; //index in the tab page display,decrease 1 to the index within arr
979 		pActualBullets[5]->nIndexDefault = 8;	 //index in the tab page display,decrease 1 to the index within arr
980 		pActualBullets[5]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ;
981 		((BulletsSettings_Impl*)(pActualBullets[5]->pBullets))->cBulletChar = pBTMgr->GetBulChar(pActualBullets[5]->nIndexDefault-1);
982 		((BulletsSettings_Impl*)(pActualBullets[5]->pBullets))->aFont = pBTMgr->GetBulCharFont(pActualBullets[5]->nIndexDefault-1);
983 		((BulletsSettings_Impl*)(pActualBullets[5]->pBullets))->sDescription = pBTMgr->GetDescription(pActualBullets[5]->nIndexDefault-1);
984 		((BulletsSettings_Impl*)(pActualBullets[5]->pBullets))->bIsCustomized = pBTMgr->IsCustomized(pActualBullets[5]->nIndexDefault-1);
985 		((BulletsSettings_Impl*)(pActualBullets[5]->pBullets))->eType = eNBType::BULLETS;
986 	}
987 
988 	GraphyicBulletsTypeMgr* mGrfTMgr = GraphyicBulletsTypeMgr::GetInstance();
989 	if ( mGrfTMgr )
990 	{
991 		//Index 7
992 		pActualBullets[6] = new MixBulletsSettings_Impl(eNBType::GRAPHICBULLETS);
993 		pActualBullets[6]->eType = eNBType::GRAPHICBULLETS;
994 		pActualBullets[6]->nIndex = 6+1; //index in the tab page display,decrease 1 to the index within arr
995 		pActualBullets[6]->nIndexDefault = 9;	 //index in the tab page display,decrease 1 to the index within arr
996 		pActualBullets[6]->pBullets = new GrfBulDataRelation(eNBType::GRAPHICBULLETS) ;
997 		((GrfBulDataRelation*)(pActualBullets[6]->pBullets))->sGrfName = mGrfTMgr->GetGrfName(pActualBullets[6]->nIndexDefault);
998 		((GrfBulDataRelation*)(pActualBullets[6]->pBullets))->sDescription = mGrfTMgr->GetDescription(pActualBullets[6]->nIndexDefault);
999 		((GrfBulDataRelation*)(pActualBullets[6]->pBullets))->bIsCustomized = mGrfTMgr->IsCustomized(pActualBullets[6]->nIndexDefault);
1000 		((GrfBulDataRelation*)(pActualBullets[6]->pBullets))->eType = eNBType::GRAPHICBULLETS;
1001 
1002 		//Index 8
1003 		pActualBullets[7] = new MixBulletsSettings_Impl(eNBType::GRAPHICBULLETS);
1004 		pActualBullets[7]->eType = eNBType::GRAPHICBULLETS;
1005 		pActualBullets[7]->nIndex = 7+1; //index in the tab page display,decrease 1 to the index within arr
1006 		pActualBullets[7]->nIndexDefault = 23;	 //index in the tab page display,decrease 1 to the index within arr
1007 		pActualBullets[7]->pBullets = new GrfBulDataRelation(eNBType::GRAPHICBULLETS) ;
1008 		((GrfBulDataRelation*)(pActualBullets[7]->pBullets))->sGrfName = mGrfTMgr->GetGrfName(pActualBullets[7]->nIndexDefault);
1009 		((GrfBulDataRelation*)(pActualBullets[7]->pBullets))->sDescription = mGrfTMgr->GetDescription(pActualBullets[7]->nIndexDefault);
1010 		((GrfBulDataRelation*)(pActualBullets[7]->pBullets))->bIsCustomized = mGrfTMgr->IsCustomized(pActualBullets[7]->nIndexDefault);
1011 		((GrfBulDataRelation*)(pActualBullets[7]->pBullets))->eType = eNBType::GRAPHICBULLETS;
1012 	}
1013 
1014 }
1015 sal_uInt16 MixBulletsTypeMgr::GetNBOIndexForNumRule(SvxNumRule& aNum,sal_uInt16 mLevel,sal_uInt16 nFromIndex)
1016 {
1017 	if ( mLevel == (sal_uInt16)0xFFFF || mLevel == 0)
1018 		return (sal_uInt16)0xFFFF;
1019 	//if ( !lcl_IsNumFmtSet(pNR, mLevel) ) return (sal_uInt16)0xFFFF;
1020 
1021 	sal_uInt16 nActLv = IsSingleLevel(mLevel);
1022 
1023 	if ( nActLv == (sal_uInt16)0xFFFF )
1024 		return (sal_uInt16)0xFFFF;
1025 
1026 	SvxNumberFormat aFmt(aNum.GetLevel(nActLv));
1027 	sal_Int16 eNumType = aFmt.GetNumberingType();
1028 	if( eNumType == SVX_NUM_CHAR_SPECIAL)
1029 	{
1030 		sal_Unicode cChar = aFmt.GetBulletChar();
1031 		const Font* pFont = aFmt.GetBulletFont();
1032 		String sName = pFont?pFont->GetName():String();
1033 
1034 		for(sal_uInt16 i = nFromIndex; i < DEFAULT_BULLET_TYPES; i++)
1035 		{
1036 			if ( pActualBullets[i]->eType == eNBType::BULLETS )
1037 			{
1038 				String ssName = ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->aFont.GetName();
1039 				if ( (cChar == ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->cBulletChar||
1040 					(cChar == 9830 && 57356 == ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->cBulletChar) ||
1041 					(cChar == 9632 && 57354 == ((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->cBulletChar)))//&&
1042 					//(pFont && pFont->GetName().CompareTo(((BulletsSettings_Impl*)(pActualBullets[i]->pBullets))->aFont.GetName())==COMPARE_EQUAL) )
1043 				{
1044 					return pActualBullets[i]->nIndex;
1045 				}
1046 			}
1047 		}
1048 	}else if ( (eNumType&(~LINK_TOKEN)) == SVX_NUM_BITMAP )
1049 	{
1050 		const SvxBrushItem* pBrsh = aFmt.GetBrush();
1051 		const Graphic* pGrf = 0;
1052 		if ( pBrsh )
1053 			pGrf = pBrsh->GetGraphic();
1054 
1055 		if ( pGrf )
1056 		{
1057 			const String* pGrfName = pBrsh->GetGraphicLink();
1058 			//String* pGrfName = (String*)(pBrsh->GetGraphicLink());
1059 			for(sal_uInt16 i = nFromIndex; i < DEFAULT_BULLET_TYPES; i++)
1060 			{
1061 				if ( pActualBullets[i]->eType == eNBType::GRAPHICBULLETS )
1062 				{
1063 					GrfBulDataRelation* pEntry = (GrfBulDataRelation*) (pActualBullets[i]->pBullets);
1064 					//sal_Bool bExist = sal_False;
1065 					if ( pEntry && pActualBullets[i]->nIndexDefault == (sal_uInt16)0xFFFF  && pEntry->pGrfObj)
1066 					{
1067 						if ( pEntry->pGrfObj->GetBitmap().IsEqual(pGrf->GetBitmap()))
1068 						{
1069 							return pActualBullets[i]->nIndex;
1070 						}
1071 					}else { //if ( pEntry && pGrfName && pEntry->sGrfName.CompareTo(*pGrfName)==COMPARE_EQUAL )
1072 						//bExist = GalleryExplorer::GetGraphicObj(GALLERY_THEME_BULLETS, pActualBullets[i]->nIndexDefault-1,pSrGrf);
1073 						Graphic aSrGrf;
1074 						if (pEntry)
1075 							GalleryExplorer::GetGraphicObj(GALLERY_THEME_BULLETS, pActualBullets[i]->nIndexDefault,&aSrGrf);
1076 						Bitmap aSum=pGrf->GetBitmap();
1077 						Bitmap aSum1=aSrGrf.GetBitmap();
1078 						if (aSum.IsEqual(aSum1))
1079 							return pActualBullets[i]->nIndex;
1080 					}
1081 				}
1082 			}
1083 		}
1084 	}
1085 
1086 	return (sal_uInt16)0xFFFF;
1087 }
1088 
1089 sal_Bool MixBulletsTypeMgr::RelplaceNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel)
1090 {
1091 	if ( mLevel == (sal_uInt16)0xFFFF || mLevel == 0 || nIndex>=DEFAULT_BULLET_TYPES)
1092 		return sal_False;
1093 
1094 	//if ( GetNBOIndexForNumRule(aNum,mLevel) != (sal_uInt16)0xFFFF )
1095 	//	return sal_False;
1096 
1097 	sal_uInt16 nActLv = IsSingleLevel(mLevel);
1098 
1099 	if ( nActLv == (sal_uInt16)0xFFFF )
1100 		return sal_False;
1101 
1102 	SvxNumberFormat aFmt(aNum.GetLevel(nActLv));
1103 	sal_Int16 eNumType = aFmt.GetNumberingType();
1104 	if( eNumType == SVX_NUM_CHAR_SPECIAL && pActualBullets[nIndex]->eType == eNBType::BULLETS )
1105 	{
1106 		sal_Unicode cChar = aFmt.GetBulletChar();
1107 		const Font* pFont = aFmt.GetBulletFont();
1108 		BulletsSettings_Impl* pEntry = (BulletsSettings_Impl*) (pActualBullets[nIndex]->pBullets);
1109 		pEntry->cBulletChar = cChar;
1110 		pEntry->aFont = pFont?*pFont:lcl_GetDefaultBulletFont();
1111 		pEntry->bIsCustomized = sal_True;
1112 		String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_BULLET_DESCRIPTION));
1113 		String aReplace = String::CreateFromAscii("%LIST_NUM");
1114 		String sNUM = String::CreateFromInt32( nIndex + 1 );
1115 		aStrFromRES.SearchAndReplace(aReplace,sNUM);
1116 		pEntry->sDescription = aStrFromRES;
1117 
1118 	}else if ( (eNumType&(~LINK_TOKEN)) == SVX_NUM_BITMAP && pActualBullets[nIndex]->eType == eNBType::GRAPHICBULLETS )
1119 	{
1120 		const SvxBrushItem* pBrsh = aFmt.GetBrush();
1121 		const Graphic* pGrf = 0;
1122 		if ( pBrsh )
1123 			pGrf = pBrsh->GetGraphic();
1124 		else
1125 			return sal_False;
1126 
1127 		String sEmpty;
1128 		if ( pGrf )
1129 		{
1130 			const String* pGrfName = pBrsh->GetGraphicLink();
1131 			//String* pGrfName = (String*)(pBrsh->GetGraphicLink());
1132 			GrfBulDataRelation* pEntry = (GrfBulDataRelation*) (pActualBullets[nIndex]->pBullets);
1133 			if ( pGrfName )
1134 				pEntry->sGrfName = *pGrfName;
1135 			GraphyicBulletsTypeMgr* mGrfTMgr = GraphyicBulletsTypeMgr::GetInstance();
1136 			if ( mGrfTMgr )
1137 			{
1138 				//sal_uInt16 nDIndex = mGrfTMgr->GetNBOIndexForNumRule(aNum,mLevel);
1139 				//if ( nDIndex != (sal_uInt16)0xFFFF)
1140 				//{
1141 				//	pActualBullets[nIndex]->nIndexDefault = nDIndex -1;
1142 				//	sEmpty = mGrfTMgr->GetDescription( nDIndex -1);
1143 				//}else
1144 				{
1145 					pActualBullets[nIndex]->nIndexDefault  = (sal_uInt16)0xFFFF;
1146 					sEmpty = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_BULLET_DESCRIPTION));
1147 					String aReplace = String::CreateFromAscii("%LIST_NUM");
1148 					String sNUM = String::CreateFromInt32( nIndex + 1 );
1149 					sEmpty.SearchAndReplace(aReplace,sNUM);
1150 					//pEntry->pGrfObj = pGrf;
1151 					pEntry->pGrfObj = new Graphic(*pGrf);
1152 					pEntry->aSize = aFmt.GetGraphicSize();
1153 					pEntry->aSize = OutputDevice::LogicToLogic(pEntry->aSize,(MapUnit)GetMapUnit(),MAP_100TH_MM);
1154 					sal_uInt16 nDIndex = mGrfTMgr->GetNBOIndexForNumRule(aNum,mLevel);
1155 					if (nDIndex!=(sal_uInt16)0xFFFF) pEntry->aSize=Size(0,0);
1156 				}
1157 			}
1158 			pEntry->sDescription = sEmpty;
1159 			pEntry->bIsCustomized = sal_True;
1160 		}else
1161 		{
1162 			return sal_False;
1163 		}
1164 	}else
1165 	{
1166 		delete pActualBullets[nIndex]->pBullets;
1167 		pActualBullets[nIndex]->pBullets = 0;
1168 		if ( eNumType == SVX_NUM_CHAR_SPECIAL )
1169 		{
1170 			sal_Unicode cChar = aFmt.GetBulletChar();
1171 			const Font* pFont = aFmt.GetBulletFont();
1172 			pActualBullets[nIndex]->eType = eNBType::BULLETS;
1173 			pActualBullets[nIndex]->nIndex = nIndex+1; //index in the tab page display,decrease 1 to the index within arr
1174 			pActualBullets[nIndex]->pBullets = new BulletsSettings_Impl(eNBType::BULLETS) ;
1175 			((BulletsSettings_Impl*)(pActualBullets[nIndex]->pBullets))->cBulletChar = cChar;
1176 			((BulletsSettings_Impl*)(pActualBullets[nIndex]->pBullets))->aFont = pFont?*pFont:lcl_GetDefaultBulletFont();
1177 			((BulletsSettings_Impl*)(pActualBullets[nIndex]->pBullets))->bIsCustomized = sal_True;
1178 			((BulletsSettings_Impl*)(pActualBullets[nIndex]->pBullets))->eType = eNBType::BULLETS;
1179 			BulletsTypeMgr* pBTMgr = BulletsTypeMgr::GetInstance();
1180 			if ( pBTMgr )
1181 			{
1182 				//sal_uInt16 nDIndex = pBTMgr->GetNBOIndexForNumRule(aNum,mLevel);
1183 				//if ( nDIndex != (sal_uInt16)0xFFFF)
1184 				//{
1185 				//	pActualBullets[nIndex]->nIndexDefault = nDIndex -1;
1186 				//	((BulletsSettings_Impl*)(pActualBullets[nIndex]->pBullets))->sDescription = pBTMgr->GetDescription(nDIndex - 1);
1187 				//}else
1188 				{
1189 					pActualBullets[nIndex]->nIndexDefault  = (sal_uInt16)0xFFFF;
1190 					String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_BULLET_DESCRIPTION));
1191 					String aReplace = String::CreateFromAscii("%LIST_NUM");
1192 					String sNUM = String::CreateFromInt32( nIndex + 1 );
1193 					aStrFromRES.SearchAndReplace(aReplace,sNUM);
1194 					((BulletsSettings_Impl*)(pActualBullets[nIndex]->pBullets))->sDescription = aStrFromRES;
1195 				}
1196 			}
1197 		}else if ( (eNumType&(~LINK_TOKEN)) == SVX_NUM_BITMAP )
1198 		{
1199 			const SvxBrushItem* pBrsh = aFmt.GetBrush();
1200 			const Graphic* pGrf = 0;
1201 			if ( pBrsh )
1202 				pGrf = pBrsh->GetGraphic();
1203 			else
1204 				return sal_False;
1205 
1206 			String sEmpty;
1207 			const String* pGrfName = 0;
1208 			if ( pGrf )
1209 			{
1210 				pGrfName = pBrsh->GetGraphicLink();
1211 
1212 				pActualBullets[nIndex]->eType = eNBType::GRAPHICBULLETS;
1213 				pActualBullets[nIndex]->nIndex = nIndex+1; //index in the tab page display,decrease 1 to the index within arr
1214 				pActualBullets[nIndex]->pBullets = new GrfBulDataRelation(eNBType::GRAPHICBULLETS) ;
1215 				if (pGrfName)
1216 					((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->sGrfName = *pGrfName;
1217 				((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->bIsCustomized = sal_True;
1218 				((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->eType = eNBType::GRAPHICBULLETS;
1219 				GraphyicBulletsTypeMgr* mGrfTMgr = GraphyicBulletsTypeMgr::GetInstance();
1220 				if ( mGrfTMgr )
1221 				{
1222 					//sal_uInt16 nDIndex = mGrfTMgr->GetNBOIndexForNumRule(aNum,mLevel);
1223 					//if ( nDIndex != (sal_uInt16)0xFFFF)
1224 					//{
1225 					//	pActualBullets[nIndex]->nIndexDefault = nDIndex - 1;
1226 					//	((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->sDescription = mGrfTMgr->GetDescription(nDIndex - 1);
1227 					//}else
1228 					{
1229 						pActualBullets[nIndex]->nIndexDefault  = (sal_uInt16)0xFFFF;
1230 						String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_BULLET_DESCRIPTION));
1231 						String aReplace = String::CreateFromAscii("%LIST_NUM");
1232 						String sNUM = String::CreateFromInt32( nIndex + 1 );
1233 						aStrFromRES.SearchAndReplace(aReplace,sNUM);
1234 						((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->sDescription = aStrFromRES;
1235 						//((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->pGrfObj = pGrf;
1236 						((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->pGrfObj = new Graphic(*pGrf);
1237 						((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->pGrfObj = new Graphic(*pGrf);
1238 						Size aTmpSize = aFmt.GetGraphicSize();
1239 						aTmpSize = OutputDevice::LogicToLogic(aTmpSize,(MapUnit)GetMapUnit(),MAP_100TH_MM);
1240 						sal_uInt16 nDIndex = mGrfTMgr->GetNBOIndexForNumRule(aNum,mLevel);
1241 						if (nDIndex!=(sal_uInt16)0xFFFF) aTmpSize=Size(0,0);
1242 						((GrfBulDataRelation*)(pActualBullets[nIndex]->pBullets))->aSize = aTmpSize;
1243 
1244 				}
1245 				}
1246 			}
1247 		}
1248 	}
1249 	SvxNumRule aTmpRule1(aNum);
1250 	ApplyNumRule(aTmpRule1,nIndex,mLevel,true);
1251 	if (GetNBOIndexForNumRule(aTmpRule1,mLevel,nIndex)==nIndex+1) {
1252 		if (pActualBullets[nIndex]->eType == eNBType::BULLETS) {
1253 			BulletsSettings_Impl* pEntry = (BulletsSettings_Impl*) (pActualBullets[nIndex]->pBullets);
1254 			pEntry->bIsCustomized = false;
1255 			pEntry->sDescription = GetDescription(nIndex,true);
1256 		}
1257 		if (pActualBullets[nIndex]->eType == eNBType::GRAPHICBULLETS) {
1258 			GrfBulDataRelation* pEntry = (GrfBulDataRelation*) (pActualBullets[nIndex]->pBullets);
1259 			pEntry->bIsCustomized = false;
1260 			pEntry->sDescription = GetDescription(nIndex,true);
1261 		}
1262 	}
1263 	ImplStore(String::CreateFromAscii("standard.sya"));
1264 	return sal_True;
1265 }
1266 
1267 sal_Bool MixBulletsTypeMgr::ApplyNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel,sal_Bool isDefault,sal_Bool isResetSize)
1268 {
1269 	//if ( mLevel == (sal_uInt16)0xFFFF || nIndex>=DEFAULT_BULLET_TYPES )
1270 	if ( nIndex>=DEFAULT_BULLET_TYPES )
1271 		return sal_False;
1272 	MixBulletsSettings_Impl* pCurrentBullets = pActualBullets[nIndex];
1273 	if (isDefault) pCurrentBullets=pDefaultActualBullets[nIndex];
1274 
1275 	if ( pCurrentBullets->eType == eNBType::BULLETS )
1276 	{
1277 		sal_Unicode cChar;
1278 		cChar = ((BulletsSettings_Impl*)(pCurrentBullets->pBullets))->cBulletChar;
1279 
1280 		//Font& rActBulletFont = lcl_GetDefaultBulletFont();
1281 		Font rActBulletFont = ((BulletsSettings_Impl*)(pCurrentBullets->pBullets))->aFont;
1282 		sal_uInt16 nMask = 1;
1283 		String sBulletCharFmtName = GetBulCharFmtName();
1284 		for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++)
1285 		{
1286 			if(mLevel & nMask)
1287 			{
1288 				SvxNumberFormat aFmt(aNum.GetLevel(i));
1289 				if (SVX_NUM_CHAR_SPECIAL !=aFmt.GetNumberingType()) isResetSize=true;
1290 				aFmt.SetNumberingType( SVX_NUM_CHAR_SPECIAL );
1291 				aFmt.SetBulletFont(&rActBulletFont);
1292 				aFmt.SetBulletChar(cChar );
1293 				aFmt.SetCharFmtName(sBulletCharFmtName);
1294 				String aEmptyStr;
1295 				aFmt.SetPrefix( aEmptyStr );
1296 				aFmt.SetSuffix( aEmptyStr );
1297 	            if (isResetSize) aFmt.SetBulletRelSize(45);
1298 				aNum.SetLevel(i, aFmt);
1299 			}
1300 			nMask <<= 1;
1301 		}
1302 	}else if (  pCurrentBullets->eType == eNBType::GRAPHICBULLETS )
1303 	{
1304 		String sGrfName;
1305 		GrfBulDataRelation* pEntry = (GrfBulDataRelation*) (pCurrentBullets->pBullets);
1306 		sGrfName= pEntry->sGrfName;
1307 
1308 		sal_uInt16 nMask = 1;
1309 		String aEmptyStr;
1310 		sal_uInt16 nSetNumberingType = SVX_NUM_BITMAP;
1311 		String sNumCharFmtName = GetBulCharFmtName();
1312 		for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++)
1313 		{
1314 			if(mLevel & nMask)
1315 			{
1316 				SvxNumberFormat aFmt(aNum.GetLevel(i));
1317 				if (SVX_NUM_BITMAP !=aFmt.GetNumberingType()) isResetSize=true;
1318 				aFmt.SetNumberingType(nSetNumberingType);
1319 				aFmt.SetPrefix( aEmptyStr );
1320 				aFmt.SetSuffix( aEmptyStr );
1321 				aFmt.SetCharFmtName( sNumCharFmtName );
1322 				if ( pCurrentBullets->nIndexDefault == (sal_uInt16)0xFFFF && pEntry->pGrfObj )
1323 				{
1324 					Size aSize = pEntry->aSize;
1325 			        sal_Int16 eOrient = text::VertOrientation::LINE_CENTER;
1326   					if (!isResetSize && aFmt.GetGraphicSize()!=Size(0,0)) aSize=aFmt.GetGraphicSize();
1327 					else {
1328 						if (aSize.Width()==0 && aSize.Height()==0) {
1329 							aSize = SvxNumberFormat::GetGraphicSizeMM100( pEntry->pGrfObj );
1330 						}
1331 						aSize = OutputDevice::LogicToLogic(aSize, MAP_100TH_MM, (MapUnit)GetMapUnit());
1332 					}
1333 			        SvxBrushItem aBrush(*(pEntry->pGrfObj), GPOS_AREA, SID_ATTR_BRUSH );
1334 			        aFmt.SetGraphicBrush( &aBrush, &aSize, &eOrient );
1335 				}else
1336 				{
1337 		                	Graphic aGraphic;
1338 		                	if(GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS, pCurrentBullets->nIndexDefault, &aGraphic))
1339 					{
1340 								Size aSize = pEntry->aSize;
1341 								sal_Int16 eOrient = text::VertOrientation::LINE_CENTER;
1342 								if (!isResetSize  && aFmt.GetGraphicSize()!=Size(0,0)) aSize=aFmt.GetGraphicSize();
1343 								else {
1344 									if (aSize.Width()==0 && aSize.Height()==0) {
1345 							            aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic);
1346 									}
1347 									aSize = OutputDevice::LogicToLogic(aSize, MAP_100TH_MM, (MapUnit)GetMapUnit());
1348 								}
1349 			                    SvxBrushItem aBrush(aGraphic, GPOS_AREA, SID_ATTR_BRUSH );
1350 			                    aFmt.SetGraphicBrush( &aBrush, &aSize, &eOrient );
1351 					}else
1352 						aFmt.SetGraphic( sGrfName );
1353 				}
1354 
1355 				aNum.SetLevel(i, aFmt);
1356 			}
1357 			nMask <<= 1 ;
1358 		}
1359 	}
1360 
1361 	return sal_True;
1362 }
1363 
1364 String MixBulletsTypeMgr::GetDescription(sal_uInt16 nIndex,sal_Bool isDefault)
1365 {
1366 	String sRet;
1367 	//sal_uInt16 nLength = 0;
1368 	//nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl);
1369 
1370 	if ( nIndex >= DEFAULT_BULLET_TYPES )
1371 		return sRet;
1372 	else
1373 		sRet = pActualBullets[nIndex]->pBullets->sDescription;
1374 	if (isDefault) sRet = pDefaultActualBullets[nIndex]->pBullets->sDescription;
1375 	return sRet;
1376 }
1377 sal_Bool MixBulletsTypeMgr::IsCustomized(sal_uInt16 nIndex)
1378 {
1379 	sal_Bool bRet = sal_False;
1380 	//sal_uInt16 nLength = 0;
1381 	//nLength = sizeof(pActualBullets)/sizeof(BulletsSettings_Impl);
1382 
1383 	if ( nIndex >= DEFAULT_BULLET_TYPES )
1384 		bRet = sal_False;
1385 	else
1386 		bRet = pActualBullets[nIndex]->pBullets->bIsCustomized;
1387 
1388 	return bRet;
1389 }
1390 /***************************************************************************************************
1391 **********************Numbering Type lib**************************************************************
1392 ****************************************************************************************************/
1393 NumberingTypeMgr* NumberingTypeMgr::_instance = 0;
1394 
1395 NumberingTypeMgr::NumberingTypeMgr(const NBOType aType):
1396 	NBOTypeMgrBase(aType),
1397 	//pNumSettingsArr( new NumSettingsArr_Impl ),
1398 	pNumberSettingsArr (new NumberSettingsArr_Impl)
1399 {
1400 	Init();
1401 	pDefaultNumberSettingsArr = pNumberSettingsArr;
1402 	pNumberSettingsArr = new NumberSettingsArr_Impl;
1403 	//Initial the first time to store the default value. Then do it again for customized value
1404 	Init();
1405 	ImplLoad(String::CreateFromAscii("standard.syb"));
1406 }
1407 
1408 NumberingTypeMgr::NumberingTypeMgr(const NBOType aType,const SfxItemSet* pArg):
1409 	NBOTypeMgrBase(aType,pArg),
1410 	//pNumSettingsArr( new NumSettingsArr_Impl ),
1411 	pNumberSettingsArr (new NumberSettingsArr_Impl)
1412 {
1413 	Init();
1414 	pDefaultNumberSettingsArr = pNumberSettingsArr;
1415 	pNumberSettingsArr = new NumberSettingsArr_Impl;
1416 	//Initial the first time to store the default value. Then do it again for customized value
1417 	Init();
1418 	ImplLoad(String::CreateFromAscii("standard.syb"));
1419 }
1420 
1421 NumberingTypeMgr::NumberingTypeMgr(const NumberingTypeMgr& aTypeMgr):
1422 	NBOTypeMgrBase(aTypeMgr),
1423 	//pNumSettingsArr( new NumSettingsArr_Impl ),
1424 	pNumberSettingsArr (new NumberSettingsArr_Impl)
1425 {
1426 	/*
1427 	for(sal_uInt16 i=0;i<aTypeMgr.GetNumCount();i++)
1428 	{
1429 		NumberSettings_Impl* _pSet = aTypeMgr.GetNumSettingByIndex(i);
1430 		if ( _pSet )
1431 		{
1432 			pNumberSettingsArr->GetObject(i)->nIndex = _pSet->nIndex;
1433 			pNumberSettingsArr->GetObject(i)->nIndexDefault = _pSet->nIndexDefault;
1434 			pNumberSettingsArr->GetObject(i)->sDescription = _pSet->sDescription;
1435 			pNumberSettingsArr->GetObject(i)->bIsCustomized	= _pSet->bIsCustomized;
1436 			if ( _pSet->pNumSetting )
1437 			{
1438 				pNumberSettingsArr->GetObject(i)->pNumSetting->nNumberType = _pSet->pNumSetting->nNumberType;
1439 				pNumberSettingsArr->GetObject(i)->pNumSetting->nParentNumbering = _pSet->pNumSetting->nParentNumbering;
1440 				pNumberSettingsArr->GetObject(i)->pNumSetting->sPrefix = _pSet->pNumSetting->sPrefix;
1441 				pNumberSettingsArr->GetObject(i)->pNumSetting->sSuffix = _pSet->pNumSetting->sSuffix;
1442 				pNumberSettingsArr->GetObject(i)->pNumSetting->sBulletChar = _pSet->pNumSetting->sBulletChar;
1443 				pNumberSettingsArr->GetObject(i)->pNumSetting->sBulletFont = _pSet->pNumSetting->sBulletFont;
1444 
1445 				pNumberSettingsArr->GetObject(i)->pNumSetting->eLabelFollowedBy = _pSet->pNumSetting->eLabelFollowedBy;
1446 				pNumberSettingsArr->GetObject(i)->pNumSetting->nTabValue = _pSet->pNumSetting->nTabValue;
1447 				pNumberSettingsArr->GetObject(i)->pNumSetting->eNumAlign = _pSet->pNumSetting->eNumAlign;
1448 				pNumberSettingsArr->GetObject(i)->pNumSetting->nNumAlignAt = _pSet->pNumSetting->nNumAlignAt;
1449 				pNumberSettingsArr->GetObject(i)->pNumSetting->nNumIndentAt = _pSet->pNumSetting->nNumIndentAt;
1450 			}
1451 		}
1452 	}
1453 	*/
1454 	ImplLoad(String::CreateFromAscii("standard.syb"));
1455 }
1456 
1457 void NumberingTypeMgr::Init()
1458 {
1459 	Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
1460 	Reference < XInterface > xI = xMSF->createInstance(
1461 		::rtl::OUString::createFromAscii( "com.sun.star.text.DefaultNumberingProvider" ) );
1462 	Reference<XDefaultNumberingProvider> xDefNum(xI, UNO_QUERY);
1463 
1464 	if(xDefNum.is())
1465 	{
1466 		Sequence< Sequence< PropertyValue > > aNumberings;
1467         	LanguageType eLang = Application::GetSettings().GetLanguage();
1468 		Locale aLocale = SvxCreateLocale(eLang);
1469 		try
1470 		{
1471 			aNumberings = xDefNum->getDefaultContinuousNumberingLevels( aLocale );
1472 
1473             		sal_Int32 nLength = aNumberings.getLength() > DEFAULT_NUM_VALUSET_COUNT ? DEFAULT_NUM_VALUSET_COUNT :aNumberings.getLength();
1474 
1475 			const Sequence<PropertyValue>* pValuesArr = aNumberings.getConstArray();
1476 			for(sal_Int32 i = 0; i < nLength; i++)
1477 			{
1478 				NumSettings_ImplPtr pNew = lcl_CreateNumberingSettingsPtr(pValuesArr[i]);
1479 				NumberSettings_Impl* pNumEntry = new NumberSettings_Impl;
1480 				pNumEntry->nIndex = i + 1;
1481 				pNumEntry->nIndexDefault = i;
1482 				pNumEntry->pNumSetting = pNew;
1483                 //SetItemText( i + 1, SVX_RESSTR( RID_SVXSTR_SINGLENUM_DESCRIPTIONS + i ));
1484 				{
1485 					String sText;
1486 					//const OUString sValue(C2U("Value"));
1487 					Reference<XNumberingFormatter> xFormatter(xDefNum, UNO_QUERY);
1488 					if(xFormatter.is() && aNumberings.getLength() > i)
1489 					{
1490 
1491 						for (sal_uInt16 j=0;j<3;j++)
1492 						{
1493 							Sequence<PropertyValue> aLevel = aNumberings.getConstArray()[i];
1494 							try
1495 							{
1496 								aLevel.realloc(aLevel.getLength() + 1);
1497 								PropertyValue& rValue = aLevel.getArray()[aLevel.getLength() - 1];
1498 								rValue.Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Value"));
1499 								rValue.Value <<= (sal_Int32)(j + 1);
1500 
1501 								if (j!=0)
1502 									sText += String::CreateFromAscii(" ");
1503 
1504 								sText+=String(xFormatter->makeNumberingString( aLevel, aLocale ));
1505 							}
1506 							catch(Exception&)
1507 							{
1508 								DBG_ERROR("Exception in DefaultNumberingProvider::makeNumberingString");
1509 							}
1510 						}
1511 					}
1512 					String aStrFromRES(SVX_RESSTR( RID_SVXSTR_SINGLENUM_DESCRIPTIONS));
1513 					String aReplace = String::CreateFromAscii("%NUMBERINGSAMPLE");
1514 					aStrFromRES.SearchAndReplace(aReplace,sText);
1515 					pNumEntry->sDescription = aStrFromRES;
1516             	}
1517 	    //End modification
1518 
1519 				//pNumEntry->sDescription = SVX_RESSTR( RID_SVXSTR_SINGLENUM_DESCRIPTION_0 + i );
1520 				pNumberSettingsArr->Insert(pNumEntry, pNumberSettingsArr->Count());
1521 			}
1522 		}
1523 		catch(Exception&)
1524 		{
1525 		}
1526 	}
1527 }
1528 
1529 sal_uInt16 NumberingTypeMgr::GetNBOIndexForNumRule(SvxNumRule& aNum,sal_uInt16 mLevel,sal_uInt16 nFromIndex)
1530 {
1531 	if ( mLevel == (sal_uInt16)0xFFFF || mLevel > aNum.GetLevelCount() || mLevel == 0)
1532 		return (sal_uInt16)0xFFFF;
1533 
1534 	sal_uInt16 nActLv = IsSingleLevel(mLevel);
1535 
1536 	if ( nActLv == (sal_uInt16)0xFFFF )
1537 		return (sal_uInt16)0xFFFF;
1538 
1539 	SvxNumberFormat aFmt(aNum.GetLevel(nActLv));
1540 	sal_Unicode cPrefix = rtl::OUString(aFmt.GetPrefix()).getStr()[0];
1541 	sal_Unicode cSuffix = rtl::OUString(aFmt.GetSuffix()).getStr()[0];
1542 	String sPreFix = aFmt.GetPrefix();
1543 	String sSuffix = aFmt.GetSuffix();
1544 	String sEmpty;
1545     	sal_Int16 eNumType = aFmt.GetNumberingType();
1546 
1547 	sal_uInt16 nCount = pNumberSettingsArr->Count();
1548 	for(sal_uInt16 i = nFromIndex; i < nCount; i++)
1549 	{
1550 		NumberSettings_ImplPtr _pSet = pNumberSettingsArr->GetObject(i);
1551 		sal_Int16 eNType = _pSet->pNumSetting->nNumberType;
1552 		String sLocalPreFix = _pSet->pNumSetting->sPrefix.getStr();
1553 		String sLocalSuffix = _pSet->pNumSetting->sSuffix.getStr();
1554 		if (sPreFix.CompareTo(sLocalPreFix)==COMPARE_EQUAL &&
1555 			sSuffix.CompareTo(sLocalSuffix)==COMPARE_EQUAL &&
1556 			eNumType == eNType )
1557 		{
1558 			return i+1;
1559 		}
1560 	}
1561 
1562 
1563 	return (sal_uInt16)0xFFFF;
1564 }
1565 
1566 sal_Bool NumberingTypeMgr::RelplaceNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel)
1567 {
1568 	//if ( mLevel == (sal_uInt16)0xFFFF || mLevel == 0)
1569 	//	return sal_False;
1570 
1571 	//if ( GetNBOIndexForNumRule(aNum,mLevel) != (sal_uInt16)0xFFFF )
1572 	//	return sal_False;
1573 
1574 	sal_uInt16 nActLv = IsSingleLevel(mLevel);
1575 
1576 	if ( nActLv == (sal_uInt16)0xFFFF )
1577 		return sal_False;
1578 
1579 	SvxNumberFormat aFmt(aNum.GetLevel(nActLv));
1580 	//sal_Unicode cPrefix = rtl::OUString(aFmt.GetPrefix()).getStr()[0];
1581 	//sal_Unicode cSuffix = rtl::OUString(aFmt.GetSuffix()).getStr()[0];
1582 	sal_Int16 eNumType = aFmt.GetNumberingType();
1583 
1584 	sal_uInt16 nCount = pNumberSettingsArr->Count();
1585 	if ( nIndex >= nCount )
1586 		return sal_False;
1587 
1588 	NumberSettings_ImplPtr _pSet = pNumberSettingsArr->GetObject(nIndex);
1589 
1590 	_pSet->pNumSetting->sPrefix = aFmt.GetPrefix();
1591 	_pSet->pNumSetting->sSuffix = aFmt.GetSuffix();
1592 	 _pSet->pNumSetting->nNumberType = eNumType;
1593 	_pSet->bIsCustomized = sal_True;
1594 
1595 	SvxNumRule aTmpRule1(aNum);
1596 	SvxNumRule aTmpRule2(aNum);
1597 	ApplyNumRule(aTmpRule1,nIndex,mLevel,true);
1598 	ApplyNumRule(aTmpRule2,nIndex,mLevel,false);
1599 	if (aTmpRule1==aTmpRule2) _pSet->bIsCustomized=false;
1600 	if (_pSet->bIsCustomized) {
1601 		String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_NUMBERING_DESCRIPTION));
1602 		String aReplace = String::CreateFromAscii("%LIST_NUM");
1603 		String sNUM = String::CreateFromInt32( nIndex + 1 );
1604 		aStrFromRES.SearchAndReplace(aReplace,sNUM);
1605 		_pSet->sDescription = aStrFromRES;
1606 	} else {
1607 		_pSet->sDescription = GetDescription(nIndex,true);
1608 	}
1609 	ImplStore(String::CreateFromAscii("standard.syb"));
1610 	return sal_True;
1611 }
1612 
1613 sal_Bool NumberingTypeMgr::ApplyNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel,sal_Bool isDefault,sal_Bool isResetSize)
1614 {
1615 	//if ( mLevel == (sal_uInt16)0xFFFF )
1616 	//	return sal_False;
1617 
1618 	//DBG_ASSERT(pNumSettingsArr->Count() > nIndex, "wrong index");
1619 	if(pNumberSettingsArr->Count() <= nIndex)
1620 		return sal_False;
1621 	NumberSettingsArr_Impl*		pCurrentNumberSettingsArr=pNumberSettingsArr;
1622 	if (isDefault) pCurrentNumberSettingsArr=pDefaultNumberSettingsArr;
1623 	NumberSettings_ImplPtr _pSet = pCurrentNumberSettingsArr->GetObject(nIndex);
1624 	sal_Int16 eNewType = _pSet->pNumSetting->nNumberType;
1625 
1626 	sal_uInt16 nMask = 1;
1627 	String sNumCharFmtName = GetBulCharFmtName();
1628 	for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++)
1629 	{
1630 		if(mLevel & nMask)
1631 		{
1632 			SvxNumberFormat aFmt(aNum.GetLevel(i));
1633 			if (eNewType!=aFmt.GetNumberingType()) isResetSize=true;
1634 			aFmt.SetNumberingType(eNewType);
1635 			aFmt.SetPrefix(_pSet->pNumSetting->sPrefix);
1636 			aFmt.SetSuffix(_pSet->pNumSetting->sSuffix);
1637 
1638 			aFmt.SetCharFmtName(sNumCharFmtName);
1639 			if (isResetSize) aFmt.SetBulletRelSize(100);
1640 			aNum.SetLevel(i, aFmt);
1641 		}
1642 		nMask <<= 1 ;
1643 	}
1644 
1645 	return sal_True;
1646 }
1647 String NumberingTypeMgr::GetDescription(sal_uInt16 nIndex,sal_Bool isDefault)
1648 {
1649 	String sRet;
1650 	sal_uInt16 nLength = 0;
1651 	nLength = pNumberSettingsArr->Count();
1652 
1653 	if ( nIndex >= nLength )
1654 		return sRet;
1655 	else
1656 		sRet = pNumberSettingsArr->GetObject(nIndex)->sDescription;
1657 	if (isDefault) sRet = pDefaultNumberSettingsArr->GetObject(nIndex)->sDescription;
1658 
1659 	return sRet;
1660 }
1661 sal_Bool NumberingTypeMgr::IsCustomized(sal_uInt16 nIndex)
1662 {
1663 	sal_Bool bRet = sal_False;
1664 	sal_uInt16 nLength = 0;
1665 	nLength = pNumberSettingsArr->Count();
1666 
1667 	if ( nIndex >= nLength )
1668 		bRet = sal_False;
1669 	else
1670 		bRet = pNumberSettingsArr->GetObject(nIndex)->bIsCustomized;
1671 
1672 	return bRet;
1673 }
1674 sal_uInt16 NumberingTypeMgr::GetNumCount() const
1675 {
1676 	sal_uInt16 nRet = 0;
1677 	if ( pNumberSettingsArr )
1678 		nRet = pNumberSettingsArr->Count();
1679 
1680 	return nRet;
1681 }
1682 NumberSettings_Impl* NumberingTypeMgr::GetNumSettingByIndex(sal_uInt16 nIndex) const
1683 {
1684 	NumberSettings_Impl* pRet = 0;
1685 	if ( pNumberSettingsArr && nIndex< pNumberSettingsArr->Count() )
1686 	{
1687 		pRet = pNumberSettingsArr->GetObject(nIndex);
1688 	}
1689 
1690 	return pRet;
1691 }
1692 /***************************************************************************************************
1693 **********************Multi-level /Outline Type lib*******************************************************
1694 ****************************************************************************************************/
1695 OutlineTypeMgr* OutlineTypeMgr::_instance = 0;
1696 
1697 OutlineTypeMgr::OutlineTypeMgr(const NBOType aType):
1698 	NBOTypeMgrBase(aType)//,
1699 	//pNumSettingsArrs( new NumSettingsArr_Impl[DEFAULT_NUM_VALUSET_COUNT] )
1700 {
1701 	Init();
1702 	for(sal_Int32 nItem = 0; nItem < DEFAULT_NUM_VALUSET_COUNT; nItem++ )
1703 	{
1704 		pDefaultOutlineSettingsArrs[nItem] = pOutlineSettingsArrs[nItem];
1705 	}
1706 	//Initial the first time to store the default value. Then do it again for customized value
1707 	Init();
1708 	ImplLoad(String::CreateFromAscii("standard.syc"));
1709 }
1710 
1711 OutlineTypeMgr::OutlineTypeMgr(const NBOType aType,const SfxItemSet* pArg):
1712 	NBOTypeMgrBase(aType,pArg)//,
1713 	//pNumSettingsArrs( new NumSettingsArr_Impl[DEFAULT_NUM_VALUSET_COUNT])
1714 {
1715 	Init();
1716 	for(sal_Int32 nItem = 0; nItem < DEFAULT_NUM_VALUSET_COUNT; nItem++ )
1717 	{
1718 		pDefaultOutlineSettingsArrs[nItem] = pOutlineSettingsArrs[nItem];
1719 	}
1720 	//Initial the first time to store the default value. Then do it again for customized value
1721 	Init();
1722 	ImplLoad(String::CreateFromAscii("standard.syc"));
1723 }
1724 
1725 OutlineTypeMgr::OutlineTypeMgr(const OutlineTypeMgr& aTypeMgr):
1726 	NBOTypeMgrBase(aTypeMgr)//,
1727 	//pNumSettingsArrs( new NumSettingsArr_Impl[DEFAULT_NUM_VALUSET_COUNT])
1728 {
1729 	Init();
1730 	for(sal_Int32 nItem = 0; nItem < DEFAULT_NUM_VALUSET_COUNT; nItem++ )
1731 	{
1732 		pDefaultOutlineSettingsArrs[nItem] = pOutlineSettingsArrs[nItem];
1733 	}
1734 	//Initial the first time to store the default value. Then do it again for customized value
1735 	Init();
1736 	ImplLoad(String::CreateFromAscii("standard.syc"));
1737 }
1738 
1739 void OutlineTypeMgr::Init()
1740 {
1741 	Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
1742 	Reference < XInterface > xI = xMSF->createInstance(
1743 		::rtl::OUString::createFromAscii( "com.sun.star.text.DefaultNumberingProvider" ) );
1744 	Reference<XDefaultNumberingProvider> xDefNum(xI, UNO_QUERY);
1745 
1746 	if(xDefNum.is())
1747 	{
1748 		Sequence<Reference<XIndexAccess> > aOutlineAccess;
1749         	LanguageType eLang = Application::GetSettings().GetLanguage();
1750 		Locale aLocale = SvxCreateLocale(eLang);
1751 		try
1752 		{
1753 			aOutlineAccess = xDefNum->getDefaultOutlineNumberings( aLocale );
1754 
1755 			SvxNumRule aDefNumRule( NUM_BULLET_REL_SIZE|NUM_CONTINUOUS|NUM_BULLET_COLOR|NUM_CHAR_TEXT_DISTANCE|NUM_SYMBOL_ALIGNMENT,10, sal_False ,
1756 				SVX_RULETYPE_NUMBERING,SvxNumberFormat::LABEL_ALIGNMENT);
1757 
1758 			for(sal_Int32 nItem = 0;
1759 				nItem < aOutlineAccess.getLength() && nItem < DEFAULT_NUM_VALUSET_COUNT;
1760 				nItem++ )
1761 			{
1762 				pOutlineSettingsArrs[ nItem ] = new OutlineSettings_Impl;
1763 				OutlineSettings_Impl* pItemArr = pOutlineSettingsArrs[ nItem ];
1764 				pItemArr->sDescription = SVX_RESSTR( RID_SVXSTR_OUTLINENUM_DESCRIPTION_0 + nItem );
1765 				pItemArr->pNumSettingsArr = new NumSettingsArr_Impl;
1766 				Reference<XIndexAccess> xLevel = aOutlineAccess.getConstArray()[nItem];
1767 				for(sal_Int32 nLevel = 0; nLevel < xLevel->getCount() && nLevel < 5; nLevel++)
1768 				{
1769 					Any aValueAny = xLevel->getByIndex(nLevel);
1770 					Sequence<PropertyValue> aLevelProps;
1771 					aValueAny >>= aLevelProps;
1772 					NumSettings_ImplPtr pNew = lcl_CreateNumberingSettingsPtr(aLevelProps);
1773 					SvxNumberFormat aNumFmt( aDefNumRule.GetLevel( nLevel) );
1774 					pNew->eLabelFollowedBy = aNumFmt.GetLabelFollowedBy();
1775 					pNew->nTabValue = aNumFmt.GetListtabPos();
1776 					pNew->eNumAlign = aNumFmt.GetNumAdjust();
1777 					pNew->nNumAlignAt = aNumFmt.GetFirstLineIndent();
1778 					pNew->nNumIndentAt = aNumFmt.GetIndentAt();
1779 					pItemArr->pNumSettingsArr->Insert( pNew, pItemArr->pNumSettingsArr->Count() );
1780 				}
1781 			}
1782 		}
1783 		catch(Exception&)
1784 		{
1785 		}
1786 	}
1787 }
1788 
1789 sal_uInt16 OutlineTypeMgr::GetNBOIndexForNumRule(SvxNumRule& aNum,sal_uInt16 mLevel,sal_uInt16 nFromIndex)
1790 {
1791 	sal_uInt16 nLength = sizeof(pOutlineSettingsArrs)/sizeof(OutlineSettings_Impl*);
1792 	for(sal_uInt16 iDex = nFromIndex; iDex < nLength; iDex++)
1793 	{
1794 		sal_Bool bNotMatch = sal_False;
1795 		OutlineSettings_Impl* pItemArr = pOutlineSettingsArrs[iDex];
1796 		sal_uInt16 nCount = pItemArr->pNumSettingsArr->Count();
1797 		for (sal_uInt16 iLevel=0;iLevel < nCount;iLevel++)
1798 		{
1799 			NumSettings_ImplPtr _pSet = pItemArr->pNumSettingsArr->GetObject(iLevel);
1800 			sal_Int16 eNType = _pSet->nNumberType;
1801 		    	const sal_Unicode cLocalPrefix = _pSet->sPrefix.getLength() ? _pSet->sPrefix.getStr()[0] : 0;
1802 	       	const sal_Unicode cLocalSuffix = _pSet->sSuffix.getLength() ? _pSet->sSuffix.getStr()[0] : 0;
1803 
1804 		    	SvxNumberFormat aFmt(aNum.GetLevel(iLevel));
1805 			sal_Unicode cPrefix = rtl::OUString(aFmt.GetPrefix()).getStr()[0];
1806 			sal_Unicode cSuffix = rtl::OUString(aFmt.GetSuffix()).getStr()[0];
1807 			String sPreFix = aFmt.GetPrefix();
1808 			String sSuffix = aFmt.GetSuffix();
1809 			String sEmpty;
1810 		     	sal_Int16 eNumType = aFmt.GetNumberingType();
1811 		     	if( eNumType == SVX_NUM_CHAR_SPECIAL)
1812 			{
1813 				sal_Unicode cChar = aFmt.GetBulletChar();
1814 				const Font* pFont = aFmt.GetBulletFont();
1815 				sal_Unicode ccChar = _pSet->sBulletChar.getStr()[0];
1816 				rtl::OUString sFont = _pSet->sBulletFont;
1817 				if ( !((cChar == ccChar) && //pFont && sFont.compareTo(pFont->GetName()) &&
1818 					_pSet->eLabelFollowedBy == aFmt.GetLabelFollowedBy() &&
1819 					_pSet->nTabValue == aFmt.GetListtabPos() &&
1820 					_pSet->eNumAlign == aFmt.GetNumAdjust() &&
1821 					_pSet->nNumAlignAt == aFmt.GetFirstLineIndent() &&
1822 					_pSet->nNumIndentAt == aFmt.GetIndentAt()))
1823 				{
1824 					bNotMatch = sal_True;
1825 					break;
1826 				}
1827 				}else if ((eNumType&(~LINK_TOKEN)) == SVX_NUM_BITMAP ) {
1828 				    	const SvxBrushItem* pBrsh1 = aFmt.GetBrush();
1829 						const SvxBrushItem* pBrsh2 = _pSet->pBrushItem;
1830 						sal_Bool bIsMatch = false;
1831 						if (pBrsh1==pBrsh2) bIsMatch = true;
1832 						if (pBrsh1 && pBrsh2) {
1833 							const Graphic* pGrf1 = pBrsh1->GetGraphic();;
1834 							const Graphic* pGrf2 = pBrsh2->GetGraphic();;
1835 							if (pGrf1==pGrf2) bIsMatch = true;
1836 							if (pGrf1 && pGrf2) {
1837 								if ( pGrf1->GetBitmap().IsEqual(pGrf2->GetBitmap()) &&
1838 									 _pSet->aSize==aFmt.GetGraphicSize())
1839 									bIsMatch = true;
1840 							}
1841 						}
1842 						if (!bIsMatch) {
1843 							bNotMatch = sal_True;
1844 							break;
1845 						}
1846 				} else
1847 		     	{
1848 				if (!((sPreFix.CompareTo(_pSet->sPrefix.getStr())==COMPARE_EQUAL) &&
1849 					( sSuffix.CompareTo(_pSet->sSuffix.getStr())==COMPARE_EQUAL ) &&
1850 					eNumType == eNType &&
1851 					_pSet->eLabelFollowedBy == aFmt.GetLabelFollowedBy() &&
1852 					_pSet->nTabValue == aFmt.GetListtabPos() &&
1853 					_pSet->eNumAlign == aFmt.GetNumAdjust() &&
1854 					_pSet->nNumAlignAt == aFmt.GetFirstLineIndent() &&
1855 					_pSet->nNumIndentAt == aFmt.GetIndentAt()))
1856 				{
1857 					bNotMatch = sal_True;
1858 					break;
1859 				}
1860 		     	}
1861 		}
1862 		if ( !bNotMatch )
1863 			return iDex+1;
1864 	}
1865 
1866 
1867 	return (sal_uInt16)0xFFFF;
1868 }
1869 
1870 sal_Bool OutlineTypeMgr::RelplaceNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel)
1871 {
1872 	//if ( mLevel == 0 || mLevel == (sal_uInt16)0xFFFF )
1873 	//	return sal_False;
1874 
1875 	sal_uInt16 nLength = sizeof(pOutlineSettingsArrs)/sizeof(OutlineSettings_Impl*);
1876 	if ( nIndex >= nLength )
1877 		return sal_False;
1878 
1879 	OutlineSettings_Impl* pItemArr = pOutlineSettingsArrs[nIndex];
1880 	sal_uInt16 nCount = pItemArr->pNumSettingsArr->Count();
1881 	for (sal_uInt16 iLevel=0;iLevel < nCount;iLevel++)
1882 	{
1883 		SvxNumberFormat aFmt(aNum.GetLevel(iLevel));
1884 		sal_Unicode cPrefix = rtl::OUString(aFmt.GetPrefix()).getStr()[0];
1885 		sal_Unicode cSuffix = rtl::OUString(aFmt.GetSuffix()).getStr()[0];
1886 		sal_Int16 eNumType = aFmt.GetNumberingType();
1887 
1888 		NumSettings_ImplPtr _pSet = pItemArr->pNumSettingsArr->GetObject(iLevel);
1889 
1890 		_pSet->eLabelFollowedBy = aFmt.GetLabelFollowedBy();
1891 		_pSet->nTabValue = aFmt.GetListtabPos();
1892 		_pSet->eNumAlign = aFmt.GetNumAdjust();
1893 		_pSet->nNumAlignAt = aFmt.GetFirstLineIndent();
1894 		_pSet->nNumIndentAt = aFmt.GetIndentAt();
1895 
1896 		if( eNumType == SVX_NUM_CHAR_SPECIAL)
1897 		{
1898 			sal_Unicode cChar = aFmt.GetBulletChar();
1899 			OUString sChar(cChar);
1900 			_pSet->sBulletChar = sChar;//OUString(cChar);
1901 			if ( aFmt.GetBulletFont() )
1902 				_pSet->sBulletFont = rtl::OUString(aFmt.GetBulletFont()->GetName());
1903 			_pSet->nNumberType = eNumType;
1904 			pItemArr->bIsCustomized = sal_True;
1905 		}else if ((eNumType&(~LINK_TOKEN)) == SVX_NUM_BITMAP ) {
1906 			if (_pSet->pBrushItem) {
1907 				delete (_pSet->pBrushItem);
1908 				_pSet->pBrushItem=NULL;
1909 			}
1910 			if (aFmt.GetBrush())
1911 				_pSet->pBrushItem = new SvxBrushItem(*aFmt.GetBrush());
1912 			_pSet->aSize = aFmt.GetGraphicSize();
1913 			_pSet->nNumberType = eNumType;
1914 		} else
1915 	   	{
1916 			_pSet->sPrefix = aFmt.GetPrefix();
1917 			_pSet->sSuffix = aFmt.GetSuffix();
1918 			_pSet->nNumberType = eNumType;
1919 			if ( aFmt.GetBulletFont() )
1920 				_pSet->sBulletFont = rtl::OUString(aFmt.GetBulletFont()->GetName());
1921 			pItemArr->bIsCustomized = sal_True;
1922 	     }
1923 	}
1924 	SvxNumRule aTmpRule1(aNum);
1925 	SvxNumRule aTmpRule2(aNum);
1926 	ApplyNumRule(aTmpRule1,nIndex,mLevel,true);
1927 	ApplyNumRule(aTmpRule2,nIndex,mLevel,false);
1928 	if (aTmpRule1==aTmpRule2) pItemArr->bIsCustomized=false;
1929 	if (pItemArr->bIsCustomized) {
1930 		String aStrFromRES = String(SVX_RESSTR( RID_SVXSTR_NUMBULLET_CUSTOM_MULTILEVEL_DESCRIPTION));
1931 		String aReplace = String::CreateFromAscii("%LIST_NUM");
1932 		String sNUM = String::CreateFromInt32( nIndex + 1 );
1933 		aStrFromRES.SearchAndReplace(aReplace,sNUM);
1934 		pItemArr->sDescription = aStrFromRES;
1935 	} else {
1936 		pItemArr->sDescription = GetDescription(nIndex,true);
1937 	}
1938 	ImplStore(String::CreateFromAscii("standard.syc"));
1939 	return sal_True;
1940 }
1941 
1942 sal_Bool OutlineTypeMgr::ApplyNumRule(SvxNumRule& aNum,sal_uInt16 nIndex,sal_uInt16 mLevel,sal_Bool isDefault,sal_Bool isResetSize)
1943 {
1944 	//if ( mLevel == (sal_uInt16)0xFFFF )
1945 	//	return sal_False;
1946 
1947 	DBG_ASSERT(DEFAULT_NUM_VALUSET_COUNT > nIndex, "wrong index");
1948 	if(DEFAULT_NUM_VALUSET_COUNT <= nIndex)
1949 		return sal_False;
1950 
1951 	const FontList* pList = 0;
1952 
1953     OutlineSettings_Impl* pItemArr = pOutlineSettingsArrs[nIndex];
1954 	if (isDefault) pItemArr=pDefaultOutlineSettingsArrs[nIndex];
1955 
1956 	//Font& rActBulletFont = lcl_GetDefaultBulletFont();
1957 	NumSettingsArr_Impl	*pNumSettingsArr=pItemArr->pNumSettingsArr;
1958 
1959 	NumSettings_ImplPtr pLevelSettings = 0;
1960 	String sBulletCharFmtName = GetBulCharFmtName();
1961 	sal_uInt16 nMask = 1;
1962 	for(sal_uInt16 i = 0; i < aNum.GetLevelCount(); i++)
1963 	{
1964 		if(pNumSettingsArr->Count() > i)
1965 			pLevelSettings = pNumSettingsArr->GetObject(i);
1966 
1967 		if(!pLevelSettings)
1968 			break;
1969 
1970 		SvxNumberFormat aFmt(aNum.GetLevel(i));
1971 		//aFmt.SetBulletFont(&pLevelSettings->aFont);
1972 		Font& rActBulletFont = lcl_GetDefaultBulletFont();
1973 		if (pLevelSettings->nNumberType !=aFmt.GetNumberingType()) isResetSize=true;
1974 		aFmt.SetNumberingType( pLevelSettings->nNumberType );
1975 		sal_uInt16 nUpperLevelOrChar = (sal_uInt16)pLevelSettings->nParentNumbering;
1976 		if(aFmt.GetNumberingType() == SVX_NUM_CHAR_SPECIAL)
1977 		{
1978 			if( pLevelSettings->sBulletFont.getLength() &&
1979 				pLevelSettings->sBulletFont.compareTo(rActBulletFont.GetName()))
1980 			{
1981 	                    //search for the font
1982 	                    if(!pList)
1983 	                    {
1984 	                        	SfxObjectShell* pCurDocShell = SfxObjectShell::Current();
1985 	                        	const SvxFontListItem* pFontListItem = (const SvxFontListItem* )pCurDocShell->GetItem( SID_ATTR_CHAR_FONTLIST );
1986 	                        	pList = pFontListItem ? pFontListItem->GetFontList() : 0;
1987 	                    }
1988 	                    if(pList && pList->IsAvailable( pLevelSettings->sBulletFont ) )
1989 	                    {
1990 					FontInfo aInfo = pList->Get(pLevelSettings->sBulletFont,WEIGHT_NORMAL, ITALIC_NONE);
1991 					Font aFont(aInfo);
1992 					aFmt.SetBulletFont(&aFont);
1993 	                    }
1994 	                    else
1995 	                    {
1996 			             //if it cannot be found then create a new one
1997 			             Font aCreateFont( pLevelSettings->sBulletFont,String(), Size( 0, 14 ) );
1998 			             aCreateFont.SetCharSet( RTL_TEXTENCODING_DONTKNOW );
1999 			             aCreateFont.SetFamily( FAMILY_DONTKNOW );
2000 			             aCreateFont.SetPitch( PITCH_DONTKNOW );
2001 			             aCreateFont.SetWeight( WEIGHT_DONTKNOW );
2002 			             aCreateFont.SetTransparent( sal_True );
2003 			             aFmt.SetBulletFont( &aCreateFont );
2004 	                    }
2005 			}else
2006 			aFmt.SetBulletFont( &rActBulletFont );
2007 
2008 			sal_Unicode cChar = 0;
2009 			if( pLevelSettings->sBulletChar.getLength() )
2010 				cChar = pLevelSettings->sBulletChar.getStr()[0];
2011 			if( Application::GetSettings().GetLayoutRTL() )
2012 			{
2013                     		if( 0 == i && cChar == BulletsTypeMgr::aDynamicBulletTypes[5] )
2014 					cChar = BulletsTypeMgr::aDynamicRTLBulletTypes[5];
2015 				else if( 1 == i )
2016 				{
2017 					const SvxNumberFormat& numberFmt = aNum.GetLevel(0);
2018 					if( numberFmt.GetBulletChar() == BulletsTypeMgr::aDynamicRTLBulletTypes[5] )
2019 						cChar = BulletsTypeMgr::aDynamicRTLBulletTypes[4];
2020 				}
2021 			}
2022 
2023 			aFmt.SetBulletChar(cChar);
2024 			aFmt.SetCharFmtName( sBulletCharFmtName );
2025             if (isResetSize) aFmt.SetBulletRelSize(45);
2026 		}else if ((aFmt.GetNumberingType()&(~LINK_TOKEN)) == SVX_NUM_BITMAP ) {
2027 			if (pLevelSettings->pBrushItem) {
2028 					const Graphic* pGrf = pLevelSettings->pBrushItem->GetGraphic();;
2029 					Size aSize = pLevelSettings->aSize;
2030 					sal_Int16 eOrient = text::VertOrientation::LINE_CENTER;
2031 					if (!isResetSize  && aFmt.GetGraphicSize()!=Size(0,0)) aSize=aFmt.GetGraphicSize();
2032 					else {
2033 						if (aSize.Width()==0 && aSize.Height()==0 && pGrf) {
2034 							aSize = SvxNumberFormat::GetGraphicSizeMM100( pGrf );
2035 						}
2036 					}
2037 					aSize = OutputDevice::LogicToLogic(aSize, MAP_100TH_MM, (MapUnit)GetMapUnit());
2038 					aFmt.SetGraphicBrush( pLevelSettings->pBrushItem, &aSize, &eOrient );
2039 			}
2040 		} else
2041 		{
2042 			aFmt.SetIncludeUpperLevels(sal::static_int_cast< sal_uInt8 >(0 != nUpperLevelOrChar ? aNum.GetLevelCount() : 0));
2043 			aFmt.SetCharFmtName(sBulletCharFmtName);
2044               	if (isResetSize) aFmt.SetBulletRelSize(100);
2045        	}
2046 		if(pNumSettingsArr->Count() > i) {
2047 			aFmt.SetLabelFollowedBy(pLevelSettings->eLabelFollowedBy);
2048 			aFmt.SetListtabPos(pLevelSettings->nTabValue);
2049 			aFmt.SetNumAdjust(pLevelSettings->eNumAlign);
2050 			aFmt.SetFirstLineIndent(pLevelSettings->nNumAlignAt);
2051 			aFmt.SetIndentAt(pLevelSettings->nNumIndentAt);
2052 		}
2053 		aFmt.SetPrefix(pLevelSettings->sPrefix);
2054 		aFmt.SetSuffix(pLevelSettings->sSuffix);
2055 		aNum.SetLevel(i, aFmt);
2056 	}
2057 
2058 	return sal_True;
2059 }
2060 String OutlineTypeMgr::GetDescription(sal_uInt16 nIndex,sal_Bool isDefault)
2061 {
2062 	String sRet;
2063 	sal_uInt16 nLength = 0;
2064 	nLength = sizeof(pOutlineSettingsArrs)/sizeof(OutlineSettings_Impl*);
2065 
2066 	if ( nIndex >= nLength )
2067 		return sRet;
2068 	else
2069 	{
2070 		OutlineSettings_Impl* pItemArr = pOutlineSettingsArrs[nIndex];
2071 		if (isDefault) pItemArr = pDefaultOutlineSettingsArrs[nIndex];
2072 		if ( pItemArr )
2073 		{
2074 			sRet = pItemArr->sDescription;
2075 		};
2076 	}
2077 	return sRet;
2078 }
2079 sal_Bool OutlineTypeMgr::IsCustomized(sal_uInt16 nIndex)
2080 {
2081 	sal_Bool bRet = sal_False;
2082 
2083 	sal_uInt16 nLength = 0;
2084 	nLength = sizeof(pOutlineSettingsArrs)/sizeof(OutlineSettings_Impl*);
2085 
2086 	if ( nIndex >= nLength )
2087 		return bRet;
2088 	else
2089 	{
2090 		OutlineSettings_Impl* pItemArr = pOutlineSettingsArrs[nIndex];
2091 		if ( pItemArr )
2092 		{
2093 			bRet = pItemArr->bIsCustomized;
2094 		};
2095 	}
2096 
2097 	return bRet;
2098 }
2099 
2100 
2101 }}
2102