xref: /trunk/main/svx/source/sidebar/nbdtmg.cxx (revision 13c26b20)
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