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