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