1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 
32 #include <SwStyleNameMapper.hxx>
33 #define _SVSTDARR_STRINGSDTOR
34 #include <svl/svstdarr.hxx>
35 #include <tools/resmgr.hxx>
36 #include <poolfmt.hxx>
37 #ifndef _RDIC_HRC
38 #include <rcid.hrc>
39 #endif
40 #include <tools/debug.hxx>
41 extern ResMgr* pSwResMgr;
42 // Initialise UI names to 0
43 SvStringsDtor	*SwStyleNameMapper::pTextUINameArray = 0,
44 				*SwStyleNameMapper::pListsUINameArray = 0,
45 				*SwStyleNameMapper::pExtraUINameArray = 0,
46 				*SwStyleNameMapper::pRegisterUINameArray = 0,
47 				*SwStyleNameMapper::pDocUINameArray = 0,
48 				*SwStyleNameMapper::pHTMLUINameArray = 0,
49 				*SwStyleNameMapper::pFrmFmtUINameArray = 0,
50 				*SwStyleNameMapper::pChrFmtUINameArray = 0,
51 				*SwStyleNameMapper::pHTMLChrFmtUINameArray = 0,
52 				*SwStyleNameMapper::pPageDescUINameArray = 0,
53 				*SwStyleNameMapper::pNumRuleUINameArray = 0,
54 
55 // Initialise programmatic names to 0
56 				*SwStyleNameMapper::pTextProgNameArray = 0,
57 				*SwStyleNameMapper::pListsProgNameArray = 0,
58 				*SwStyleNameMapper::pExtraProgNameArray = 0,
59 				*SwStyleNameMapper::pRegisterProgNameArray = 0,
60 				*SwStyleNameMapper::pDocProgNameArray = 0,
61 				*SwStyleNameMapper::pHTMLProgNameArray = 0,
62 				*SwStyleNameMapper::pFrmFmtProgNameArray = 0,
63 				*SwStyleNameMapper::pChrFmtProgNameArray = 0,
64 				*SwStyleNameMapper::pHTMLChrFmtProgNameArray = 0,
65 				*SwStyleNameMapper::pPageDescProgNameArray = 0,
66 				*SwStyleNameMapper::pNumRuleProgNameArray = 0;
67 
68 NameToIdHash	*SwStyleNameMapper::pParaUIMap = 0,
69 				*SwStyleNameMapper::pCharUIMap = 0,
70 				*SwStyleNameMapper::pPageUIMap = 0,
71 				*SwStyleNameMapper::pFrameUIMap = 0,
72 				*SwStyleNameMapper::pNumRuleUIMap = 0,
73 
74 				*SwStyleNameMapper::pParaProgMap = 0,
75 				*SwStyleNameMapper::pCharProgMap = 0,
76 				*SwStyleNameMapper::pPageProgMap = 0,
77 				*SwStyleNameMapper::pFrameProgMap = 0,
78 				*SwStyleNameMapper::pNumRuleProgMap = 0;
79 
80 // SwTableEntry so we can pass the length to the String CTOR
81 struct SwTableEntry
82 {
83 	sal_uInt8 nLength;
84 	const sal_Char *pChar;
85 };
86 
87 #define ENTRY( s ) { sizeof (s)-1, s }
88 
89 // Hard coded Programmatic Name tables
90 const struct SwTableEntry TextProgNameTable [] =
91 {
92 	ENTRY( "Standard" ), // RES_POOLCOLL_STANDARD
93 	ENTRY( "Text body" ),
94 	ENTRY( "First line indent" ),
95 	ENTRY( "Hanging indent" ),
96 	ENTRY( "Text body indent" ),
97 	ENTRY( "Salutation" ),
98 	ENTRY( "Signature" ),
99 	ENTRY( "List Indent" ), // RES_POOLCOLL_CONFRONTATION
100 	ENTRY( "Marginalia" ),
101 	ENTRY( "Heading" ),
102 	ENTRY( "Heading 1" ),
103 	ENTRY( "Heading 2" ),
104 	ENTRY( "Heading 3" ),
105 	ENTRY( "Heading 4" ),
106 	ENTRY( "Heading 5" ),
107 	ENTRY( "Heading 6" ),
108 	ENTRY( "Heading 7" ),
109 	ENTRY( "Heading 8" ),
110 	ENTRY( "Heading 9" ),
111 	ENTRY( "Heading 10" ), // RES_POOLCOLL_TEXT_END
112 	{ 0, NULL }
113 };
114 
115 const struct SwTableEntry ListsProgNameTable [] =
116 {
117 	ENTRY( "List" ), // STR_POCO_PRGM_NUMBUL_BASE
118 	ENTRY( "Numbering 1 Start" ), // STR_POCO_PRGM_NUM_LEVEL1S
119 	ENTRY( "Numbering 1" ),
120 	ENTRY( "Numbering 1 End" ),
121 	ENTRY( "Numbering 1 Cont." ),
122 	ENTRY( "Numbering 2 Start" ),
123 	ENTRY( "Numbering 2" ),
124 	ENTRY( "Numbering 2 End" ),
125 	ENTRY( "Numbering 2 Cont." ),
126 	ENTRY( "Numbering 3 Start" ),
127 	ENTRY( "Numbering 3" ),
128 	ENTRY( "Numbering 3 End" ),
129 	ENTRY( "Numbering 3 Cont." ),
130 	ENTRY( "Numbering 4 Start" ),
131 	ENTRY( "Numbering 4" ),
132 	ENTRY( "Numbering 4 End" ),
133 	ENTRY( "Numbering 4 Cont." ),
134 	ENTRY( "Numbering 5 Start" ),
135 	ENTRY( "Numbering 5" ),
136 	ENTRY( "Numbering 5 End" ),
137 	ENTRY( "Numbering 5 Cont." ),
138 	ENTRY( "List 1 Start" ),
139 	ENTRY( "List 1" ),
140 	ENTRY( "List 1 End" ),
141 	ENTRY( "List 1 Cont." ),
142 	ENTRY( "List 2 Start" ),
143 	ENTRY( "List 2" ),
144 	ENTRY( "List 2 End" ),
145 	ENTRY( "List 2 Cont." ),
146 	ENTRY( "List 3 Start" ),
147 	ENTRY( "List 3" ),
148 	ENTRY( "List 3 End" ),
149 	ENTRY( "List 3 Cont." ),
150 	ENTRY( "List 4 Start" ),
151 	ENTRY( "List 4" ),
152 	ENTRY( "List 4 End" ),
153 	ENTRY( "List 4 Cont." ),
154 	ENTRY( "List 5 Start" ),
155 	ENTRY( "List 5" ),
156 	ENTRY( "List 5 End" ),
157 	ENTRY( "List 5 Cont." ), // STR_POCO_PRGM_BUL_NONUM5
158 	{ 0, NULL }
159 };
160 
161 const struct SwTableEntry ExtraProgNameTable [] =
162 {
163 	ENTRY( "Header" ), // RES_POOLCOLL_EXTRA_BEGIN
164 	ENTRY( "Header left" ),
165 	ENTRY( "Header right" ),
166 	ENTRY( "Footer" ),
167 	ENTRY( "Footer left" ),
168 	ENTRY( "Footer right" ),
169 	ENTRY( "Table Contents" ),
170 	ENTRY( "Table Heading" ),
171 	ENTRY( "Caption" ),
172 	ENTRY( "Illustration" ),
173 	ENTRY( "Table" ),
174 	ENTRY( "Text" ),
175 	ENTRY( "Frame contents" ),
176 	ENTRY( "Footnote" ),
177 	ENTRY( "Addressee" ),
178 	ENTRY( "Sender" ),
179 	ENTRY( "Endnote" ),
180 	ENTRY( "Drawing" ), // RES_POOLCOLL_LABEL_DRAWING
181 	{ 0, NULL }
182 };
183 
184 const struct SwTableEntry RegisterProgNameTable [] =
185 {
186 	ENTRY( "Index" ), // STR_POCO_PRGM_REGISTER_BASE
187 	ENTRY( "Index Heading" ), // STR_POCO_PRGM_TOX_IDXH
188 	ENTRY( "Index 1" ),
189 	ENTRY( "Index 2" ),
190 	ENTRY( "Index 3" ),
191 	ENTRY( "Index Separator" ),
192 	ENTRY( "Contents Heading" ),
193 	ENTRY( "Contents 1" ),
194 	ENTRY( "Contents 2" ),
195 	ENTRY( "Contents 3" ),
196 	ENTRY( "Contents 4" ),
197 	ENTRY( "Contents 5" ),
198 	ENTRY( "User Index Heading" ),
199 	ENTRY( "User Index 1" ),
200 	ENTRY( "User Index 2" ),
201 	ENTRY( "User Index 3" ),
202 	ENTRY( "User Index 4" ),
203 	ENTRY( "User Index 5" ),
204 	ENTRY( "Contents 6" ),
205 	ENTRY( "Contents 7" ),
206 	ENTRY( "Contents 8" ),
207 	ENTRY( "Contents 9" ),
208 	ENTRY( "Contents 10" ),
209 	ENTRY( "Illustration Index Heading" ),
210 	ENTRY( "Illustration Index 1" ),
211 	ENTRY( "Object index heading" ),
212 	ENTRY( "Object index 1" ),
213 	ENTRY( "Table index heading" ),
214 	ENTRY( "Table index 1" ),
215 	ENTRY( "Bibliography Heading" ),
216 	ENTRY( "Bibliography 1" ),
217 	ENTRY( "User Index 6" ),
218 	ENTRY( "User Index 7" ),
219 	ENTRY( "User Index 8" ),
220 	ENTRY( "User Index 9" ),
221 	ENTRY( "User Index 10" ), // STR_POCO_PRGM_TOX_USER10
222 	{ 0, NULL }
223 };
224 
225 const struct SwTableEntry DocProgNameTable [] =
226 {
227 	ENTRY( "Title" ), // STR_POCO_PRGM_DOC_TITEL
228 	ENTRY( "Subtitle" ),
229 	{ 0, NULL }
230 };
231 
232 const struct SwTableEntry HTMLProgNameTable [] =
233 {
234 	ENTRY( "Quotations" ),
235 	ENTRY( "Preformatted Text" ),
236 	ENTRY( "Horizontal Line" ),
237 	ENTRY( "List Contents" ),
238 	ENTRY( "List Heading" ), // STR_POCO_PRGM_HTML_DT
239 	{ 0, NULL }
240 };
241 
242 const struct SwTableEntry FrmFmtProgNameTable [] =
243 {
244 	ENTRY( "Frame" ), // RES_POOLFRM_FRAME
245 	ENTRY( "Graphics" ),
246 	ENTRY( "OLE" ),
247 	ENTRY( "Formula" ),
248 	ENTRY( "Marginalia" ),
249 	ENTRY( "Watermark" ),
250 	ENTRY( "Labels" ), // RES_POOLFRM_LABEL
251 	{ 0, NULL }
252 };
253 
254 const struct SwTableEntry ChrFmtProgNameTable [] =
255 {
256 	ENTRY( "Footnote Symbol" ), // RES_POOLCHR_FOOTNOTE
257 	ENTRY( "Page Number" ),
258 	ENTRY( "Caption characters" ),
259 	ENTRY( "Drop Caps" ),
260 	ENTRY( "Numbering Symbols" ),
261 	ENTRY( "Bullet Symbols" ),
262 	ENTRY( "Internet link" ),
263 	ENTRY( "Visited Internet Link" ),
264 	ENTRY( "Placeholder" ),
265 	ENTRY( "Index Link" ),
266 	ENTRY( "Endnote Symbol" ),
267 	ENTRY( "Line numbering" ),
268 	ENTRY( "Main index entry" ),
269 	ENTRY( "Footnote anchor" ),
270 	ENTRY( "Endnote anchor" ),
271 	ENTRY( "Rubies" ), // RES_POOLCHR_RUBYTEXT
272     ENTRY( "Vertical Numbering Symbols" ), // RES_POOLCHR_VERT_NUMBER
273     { 0, NULL }
274 };
275 
276 const struct SwTableEntry HTMLChrFmtProgNameTable [] =
277 {
278 	ENTRY( "Emphasis" ), // RES_POOLCHR_HTML_EMPHASIS
279 	ENTRY( "Citation" ),
280 	ENTRY( "Strong Emphasis" ),
281 	ENTRY( "Source Text" ),
282 	ENTRY( "Example" ),
283 	ENTRY( "User Entry" ),
284 	ENTRY( "Variable" ),
285 	ENTRY( "Definition" ),
286 	ENTRY( "Teletype" ), // RES_POOLCHR_HTML_TELETYPE
287 	{ 0, NULL }
288 };
289 
290 const struct SwTableEntry PageDescProgNameTable [] =
291 {
292 	ENTRY( "Standard" ), // STR_POOLPAGE_PRGM_STANDARD
293 	ENTRY( "First Page" ),
294 	ENTRY( "Left Page" ),
295 	ENTRY( "Right Page" ),
296 	ENTRY( "Envelope" ),
297 	ENTRY( "Index" ),
298 	ENTRY( "HTML" ),
299 	ENTRY( "Footnote" ),
300 	ENTRY( "Endnote" ), // STR_POOLPAGE_PRGM_ENDNOTE
301     ENTRY( "Landscape" ),
302     { 0, NULL }
303 };
304 
305 const struct SwTableEntry NumRuleProgNameTable [] =
306 {
307 	ENTRY( "Numbering 1" ), // STR_POOLNUMRULE_PRGM_NUM1
308 	ENTRY( "Numbering 2" ),
309 	ENTRY( "Numbering 3" ),
310 	ENTRY( "Numbering 4" ),
311 	ENTRY( "Numbering 5" ),
312 	ENTRY( "List 1" ),
313 	ENTRY( "List 2" ),
314 	ENTRY( "List 3" ),
315 	ENTRY( "List 4" ),
316 	ENTRY( "List 5" ), // STR_POOLNUMRULE_PRGM_BUL5
317 	{ 0, NULL }
318 };
319 #undef ENTRY
320 
321 sal_Bool SwStyleNameMapper::SuffixIsUser ( const String & rString )
322 {
323 	const sal_Unicode *pChar = rString.GetBuffer();
324 	sal_Int32 nLen = rString.Len();
325     sal_Bool bRet = sal_False;
326 	if( nLen > 8 &&
327         pChar[nLen-7] == ' ' &&
328         pChar[nLen-6] == '(' &&
329         pChar[nLen-5] == 'u' &&
330         pChar[nLen-4] == 's' &&
331         pChar[nLen-3] == 'e' &&
332         pChar[nLen-2] == 'r' &&
333         pChar[nLen-1] == ')' )
334         bRet = sal_True;
335     return bRet;
336 }
337 void SwStyleNameMapper::CheckSuffixAndDelete ( String & rString )
338 {
339 	const sal_Unicode *pChar = rString.GetBuffer();
340 	xub_StrLen nLen = rString.Len();
341 	if (nLen > 8 &&
342 		pChar[nLen-7] == ' ' &&
343 		pChar[nLen-6] == '(' &&
344 		pChar[nLen-5] == 'u' &&
345 		pChar[nLen-4] == 's' &&
346 		pChar[nLen-3] == 'e' &&
347 		pChar[nLen-2] == 'r' &&
348 		pChar[nLen-1] == ')')
349 	{
350 		rString.Erase ( nLen - 7, 7 );
351 	}
352 }
353 const NameToIdHash & SwStyleNameMapper::getHashTable ( SwGetPoolIdFromName eFlags, sal_Bool bProgName )
354 {
355     NameToIdHash *pHash = 0;
356 	const SvStringsDtor *pStrings;
357 
358 	switch ( eFlags )
359 	{
360 		case nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL:
361 		{
362 			sal_uInt16 nIndex;
363 			sal_uInt16 nId;
364 
365 			pHash = bProgName ? pParaProgMap : pParaUIMap;
366 			if ( !pHash )
367 			{
368 				pHash = new NameToIdHash ( RES_POOLCOLL_TEXT_END - RES_POOLCOLL_TEXT_BEGIN +
369 										   RES_POOLCOLL_LISTS_END - RES_POOLCOLL_LISTS_BEGIN +
370 										   RES_POOLCOLL_EXTRA_END - RES_POOLCOLL_EXTRA_BEGIN +
371 										   RES_POOLCOLL_REGISTER_END - RES_POOLCOLL_REGISTER_BEGIN +
372 										   RES_POOLCOLL_DOC_END - RES_POOLCOLL_DOC_BEGIN +
373 										   RES_POOLCOLL_HTML_END - RES_POOLCOLL_HTML_BEGIN );
374 				pStrings = bProgName ? &GetTextProgNameArray() : &GetTextUINameArray();
375 				for ( nIndex = 0, nId = RES_POOLCOLL_TEXT_BEGIN ; nId < RES_POOLCOLL_TEXT_END ; nId++,nIndex++ )
376 					(*pHash)[(*pStrings)[nIndex]] = nId;
377 				pStrings = bProgName ? &GetListsProgNameArray() : &GetListsUINameArray();
378 				for ( nIndex = 0, nId = RES_POOLCOLL_LISTS_BEGIN ; nId < RES_POOLCOLL_LISTS_END ; nId++,nIndex++ )
379 					(*pHash)[(*pStrings)[nIndex]] = nId;
380 				pStrings = bProgName ? &GetExtraProgNameArray() : &GetExtraUINameArray();
381 				for ( nIndex = 0, nId = RES_POOLCOLL_EXTRA_BEGIN ; nId < RES_POOLCOLL_EXTRA_END ; nId++,nIndex++ )
382 					(*pHash)[(*pStrings)[nIndex]] = nId;
383 				pStrings = bProgName ? &GetRegisterProgNameArray() : &GetRegisterUINameArray();
384 				for ( nIndex = 0, nId = RES_POOLCOLL_REGISTER_BEGIN ; nId < RES_POOLCOLL_REGISTER_END ; nId++,nIndex++ )
385 					(*pHash)[(*pStrings)[nIndex]] = nId;
386 				pStrings = bProgName ? &GetDocProgNameArray() : &GetDocUINameArray();
387 				for ( nIndex = 0, nId = RES_POOLCOLL_DOC_BEGIN ; nId < RES_POOLCOLL_DOC_END ; nId++,nIndex++ )
388 					(*pHash)[(*pStrings)[nIndex]] = nId;
389 				pStrings = bProgName ? &GetHTMLProgNameArray() : &GetHTMLUINameArray();
390 				for ( nIndex = 0, nId = RES_POOLCOLL_HTML_BEGIN ; nId < RES_POOLCOLL_HTML_END ; nId++,nIndex++ )
391 					(*pHash)[(*pStrings)[nIndex]] = nId;
392 
393 				if ( bProgName )
394 					pParaProgMap = pHash;
395 				else
396 					pParaUIMap = pHash;
397 			}
398 		}
399 		break;
400 		case nsSwGetPoolIdFromName::GET_POOLID_CHRFMT:
401 		{
402 			pHash = bProgName ? pCharProgMap : pCharUIMap;
403 			if ( !pHash )
404 			{
405 				sal_uInt16 nIndex;
406 				sal_uInt16 nId;
407 
408 				pHash = new NameToIdHash ( RES_POOLCHR_NORMAL_END - RES_POOLCHR_NORMAL_BEGIN +
409 										   RES_POOLCHR_HTML_END - RES_POOLCHR_HTML_BEGIN );
410 				pStrings = bProgName ? &GetChrFmtProgNameArray() : &GetChrFmtUINameArray();
411 				for ( nIndex = 0, nId = RES_POOLCHR_NORMAL_BEGIN ; nId < RES_POOLCHR_NORMAL_END ; nId++,nIndex++ )
412 					(*pHash)[(*pStrings)[nIndex]] = nId;
413 				pStrings = bProgName ? &GetHTMLChrFmtProgNameArray() : &GetHTMLChrFmtUINameArray();
414 				for ( nIndex = 0, nId = RES_POOLCHR_HTML_BEGIN ; nId < RES_POOLCHR_HTML_END ; nId++,nIndex++ )
415 					(*pHash)[(*pStrings)[nIndex]] = nId;
416 				if (bProgName )
417 					pCharProgMap = pHash;
418 				else
419 					pCharUIMap = pHash;
420 			}
421 		}
422 		break;
423 		case nsSwGetPoolIdFromName::GET_POOLID_FRMFMT:
424 		{
425 			pHash = bProgName ? pFrameProgMap : pFrameUIMap;
426 			if ( !pHash )
427 			{
428 				pHash = new NameToIdHash ( RES_POOLFRM_END - RES_POOLFRM_BEGIN );
429 				pStrings = bProgName ? &GetFrmFmtProgNameArray() : &GetFrmFmtUINameArray();
430 				for ( sal_uInt16 nIndex=0,nId = RES_POOLFRM_BEGIN ; nId < RES_POOLFRM_END ; nId++,nIndex++ )
431 					(*pHash)[(*pStrings)[nIndex]] = nId;
432 				if ( bProgName )
433 					pFrameProgMap = pHash;
434 				else
435 					pFrameUIMap = pHash;
436 			}
437 		}
438 		break;
439 		case nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC:
440 		{
441 			pHash = bProgName ? pPageProgMap : pPageUIMap;
442 			if ( !pHash )
443 			{
444 				pHash = new NameToIdHash ( RES_POOLPAGE_END - RES_POOLPAGE_BEGIN );
445 				pStrings = bProgName ? &GetPageDescProgNameArray() : &GetPageDescUINameArray();
446 				for ( sal_uInt16 nIndex=0,nId = RES_POOLPAGE_BEGIN ; nId < RES_POOLPAGE_END ; nId++,nIndex++ )
447 					(*pHash)[(*pStrings)[nIndex]] = nId;
448 				if ( bProgName )
449 					pPageProgMap = pHash;
450 				else
451 					pPageUIMap = pHash;
452 			}
453 		}
454 		break;
455 		case nsSwGetPoolIdFromName::GET_POOLID_NUMRULE:
456 		{
457 			pHash = bProgName ? pNumRuleProgMap : pNumRuleUIMap;
458 			if ( !pHash )
459 			{
460 				pHash = new NameToIdHash ( RES_POOLNUMRULE_END - RES_POOLNUMRULE_BEGIN );
461 				pStrings = bProgName ? &GetNumRuleProgNameArray() : &GetNumRuleUINameArray();
462 				for ( sal_uInt16 nIndex=0,nId = RES_POOLNUMRULE_BEGIN ; nId < RES_POOLNUMRULE_END ; nId++,nIndex++ )
463 					(*pHash)[(*pStrings)[nIndex]] = nId;
464 				if ( bProgName )
465 					pNumRuleProgMap = pHash;
466 				else
467 					pNumRuleUIMap = pHash;
468 			}
469 		}
470 		break;
471 	}
472 #ifdef _NEED_TO_DEBUG_MAPPING
473 	static sal_Bool bTested = sal_False;
474 	if ( !bTested )
475 	{
476 		bTested = sal_True;
477 		{
478 			for ( sal_uInt16 nIndex = 0, nId = RES_POOLCOLL_TEXT_BEGIN ; nId < RES_POOLCOLL_TEXT_END ; nId++,nIndex++ )
479 			{
480 				String aString, bString;
481 				FillUIName ( nId, aString );
482 				bString = GetProgName ( nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, aString );
483 				sal_uInt16 nNewId = GetPoolIdFromProgName ( bString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
484 				FillProgName ( nNewId, aString );
485 				bString = GetUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
486 				nNewId = GetPoolIdFromUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
487 				if ( nNewId != nId )
488 					*((sal_Int32*)0) = 42;
489 			}
490 			for ( nIndex = 0, nId = RES_POOLCOLL_LISTS_BEGIN ; nId < RES_POOLCOLL_LISTS_END ; nId++,nIndex++ )
491 			{
492 				String aString, bString;
493 				FillUIName ( nId, aString );
494 				bString = GetProgName ( nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, aString );
495 				sal_uInt16 nNewId = GetPoolIdFromProgName ( bString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
496 				FillProgName ( nNewId, aString );
497 				bString = GetUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
498 				nNewId = GetPoolIdFromUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
499 				if ( nNewId != nId )
500 					*((sal_Int32*)0) = 42;
501 			}
502 			for ( nIndex = 0, nId = RES_POOLCOLL_EXTRA_BEGIN ; nId < RES_POOLCOLL_EXTRA_END ; nId++,nIndex++ )
503 			{
504 				String aString, bString;
505 				FillUIName ( nId, aString );
506 				bString = GetProgName ( nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, aString );
507 				sal_uInt16 nNewId = GetPoolIdFromProgName ( bString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
508 				FillProgName ( nNewId, aString );
509 				bString = GetUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
510 				nNewId = GetPoolIdFromUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
511 				if ( nNewId != nId )
512 					*((sal_Int32*)0) = 42;
513 			}
514 			for ( nIndex = 0, nId = RES_POOLCOLL_REGISTER_BEGIN ; nId < RES_POOLCOLL_REGISTER_END ; nId++,nIndex++ )
515 			{
516 				String aString, bString;
517 				FillUIName ( nId, aString );
518 				bString = GetProgName ( nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, aString );
519 				sal_uInt16 nNewId = GetPoolIdFromProgName ( bString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
520 				FillProgName ( nNewId, aString );
521 				bString = GetUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
522 				nNewId = GetPoolIdFromUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
523 				if ( nNewId != nId )
524 					*((sal_Int32*)0) = 42;
525 			}
526 			for ( nIndex = 0, nId = RES_POOLCOLL_DOC_BEGIN ; nId < RES_POOLCOLL_DOC_END ; nId++,nIndex++ )
527 			{
528 				String aString, bString;
529 				FillUIName ( nId, aString );
530 				bString = GetProgName ( nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, aString );
531 				sal_uInt16 nNewId = GetPoolIdFromProgName ( bString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
532 				FillProgName ( nNewId, aString );
533 				bString = GetUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
534 				nNewId = GetPoolIdFromUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
535 				if ( nNewId != nId )
536 					*((sal_Int32*)0) = 42;
537 			}
538 			for ( nIndex = 0, nId = RES_POOLCOLL_HTML_BEGIN ; nId < RES_POOLCOLL_HTML_END ; nId++,nIndex++ )
539 			{
540 				String aString, bString;
541 				FillUIName ( nId, aString );
542 				bString = GetProgName ( nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, aString );
543 				sal_uInt16 nNewId = GetPoolIdFromProgName ( bString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
544 				FillProgName ( nNewId, aString );
545 				bString = GetUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
546 				nNewId = GetPoolIdFromUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
547 				if ( nNewId != nId )
548 					*((sal_Int32*)0) = 42;
549 			}
550 		}
551 		{
552 			for ( sal_uInt16 nIndex = 0, nId = RES_POOLCHR_NORMAL_BEGIN ; nId < RES_POOLCHR_NORMAL_END ; nId++,nIndex++ )
553 			{
554 				String aString, bString;
555 				FillUIName ( nId, aString );
556 				bString = GetProgName ( nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, aString );
557 				sal_uInt16 nNewId = GetPoolIdFromProgName ( bString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
558 				FillProgName ( nNewId, aString );
559 				bString = GetUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
560 				nNewId = GetPoolIdFromUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
561 				if ( nNewId != nId )
562 					*((sal_Int32*)0) = 42;
563 			}
564 			for ( nIndex = 0, nId = RES_POOLCHR_HTML_BEGIN ; nId < RES_POOLCHR_HTML_END ; nId++,nIndex++ )
565 			{
566 				String aString, bString;
567 				FillUIName ( nId, aString );
568 				bString = GetProgName ( nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, aString );
569 				sal_uInt16 nNewId = GetPoolIdFromProgName ( bString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
570 				FillProgName ( nNewId, aString );
571 				bString = GetUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
572 				nNewId = GetPoolIdFromUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
573 				if ( nNewId != nId )
574 					*((sal_Int32*)0) = 42;
575 			}
576 		}
577 		{
578 			for ( sal_uInt16 nIndex=0,nId = RES_POOLFRM_BEGIN ; nId < RES_POOLFRM_END ; nId++,nIndex++ )
579 			{
580 				String aString, bString;
581 				FillUIName ( nId, aString );
582 				bString = GetProgName ( nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, aString );
583 				sal_uInt16 nNewId = GetPoolIdFromProgName ( bString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
584 				FillProgName ( nNewId, aString );
585 				bString = GetUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
586 				nNewId = GetPoolIdFromUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
587 				if ( nNewId != nId )
588 					*((sal_Int32*)0) = 42;
589 			}
590 		}
591 		{
592 			for ( sal_uInt16 nIndex=0,nId = RES_POOLPAGE_BEGIN ; nId < RES_POOLPAGE_END ; nId++,nIndex++ )
593 			{
594 				String aString, bString;
595 				FillUIName ( nId, aString );
596 				bString = GetProgName ( nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, aString );
597 				sal_uInt16 nNewId = GetPoolIdFromProgName ( bString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
598 				FillProgName ( nNewId, aString );
599 				bString = GetUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
600 				nNewId = GetPoolIdFromUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
601 				if ( nNewId != nId )
602 					*((sal_Int32*)0) = 42;
603 			}
604 		}
605 		{
606 			for ( sal_uInt16 nIndex=0,nId = RES_POOLNUMRULE_BEGIN ; nId < RES_POOLNUMRULE_END ; nId++,nIndex++ )
607 			{
608 				String aString, bString;
609 				FillUIName ( nId, aString );
610 				bString = GetProgName ( nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, aString );
611 				sal_uInt16 nNewId = GetPoolIdFromProgName ( bString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
612 				FillProgName ( nNewId, aString );
613 				bString = GetUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
614 				nNewId = GetPoolIdFromUIName ( aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL );
615 				if ( nNewId != nId )
616 					*((sal_Int32*)0) = 42;
617 			}
618 		}
619 	}
620 #endif
621 	return *pHash;
622 }
623 // This gets the UI Name from the programmatic name
624 const String& SwStyleNameMapper::GetUIName ( const String& rName, SwGetPoolIdFromName eFlags )
625 {
626 	sal_uInt16 nId = GetPoolIdFromProgName ( rName, eFlags );
627 	return nId != USHRT_MAX ? GetUIName( nId, rName ) : rName;
628 }
629 
630 
631 // Get the programmatic Name from the UI name
632 const String& SwStyleNameMapper::GetProgName( const String& rName, SwGetPoolIdFromName eFlags )
633 {
634 	sal_uInt16 nId = GetPoolIdFromUIName ( rName, eFlags );
635 	return nId != USHRT_MAX ? GetProgName( nId, rName ) : rName;
636 }
637 
638 // Get the programmatic name from the UI name in rName and put it into rFillName
639 void SwStyleNameMapper::FillProgName ( const String& rName, String& rFillName, SwGetPoolIdFromName eFlags, sal_Bool bDisambiguate )
640 {
641 	sal_uInt16 nId = GetPoolIdFromUIName ( rName, eFlags );
642 	if ( bDisambiguate && nId == USHRT_MAX )
643 	{
644 		// rName isn't in our UI name table...check if it's in the programmatic one
645 		nId = GetPoolIdFromProgName ( rName, eFlags );
646 
647 		rFillName = rName;
648 		if (nId == USHRT_MAX )
649 		{
650 			// It isn't ...make sure the suffix isn't already " (user)"...if it is,
651 			// we need to add another one
652 			if ( SuffixIsUser ( rFillName ) )
653 				rFillName.AppendAscii ( RTL_CONSTASCII_STRINGPARAM ( " (user)" ) );
654 		}
655 		else
656 		{
657 			// It's in the programmatic name table...append suffix
658 			rFillName.AppendAscii ( RTL_CONSTASCII_STRINGPARAM ( " (user)" ) );
659 		}
660 	}
661 	else
662 	{
663 		// If we aren't trying to disambiguate, then just do a normal fill
664 		fillNameFromId ( nId, rFillName, sal_True);
665 	}
666 }
667 // Get the UI name from the programmatic name in rName and put it into rFillName
668 void SwStyleNameMapper::FillUIName ( const String& rName, String& rFillName, SwGetPoolIdFromName eFlags, sal_Bool bDisambiguate )
669 {
670 	sal_uInt16 nId = GetPoolIdFromProgName ( rName, eFlags );
671 	if ( bDisambiguate && nId == USHRT_MAX )
672 	{
673 		rFillName = rName;
674 		// rName isn't in our Prog name table...check if it has a " (user)" suffix, if so remove it
675 		CheckSuffixAndDelete ( rFillName );
676 	}
677 	else
678 	{
679 		// If we aren't trying to disambiguate, then just do a normal fill
680 		fillNameFromId ( nId, rFillName, sal_False);
681 	}
682 }
683 
684 const String& SwStyleNameMapper::getNameFromId( sal_uInt16 nId, const String& rFillName, sal_Bool bProgName )
685 {
686 	sal_uInt16 nStt = 0;
687 	const SvStringsDtor* pStrArr = 0;
688 
689 	switch( (USER_FMT | COLL_GET_RANGE_BITS | POOLGRP_NOCOLLID) & nId )
690 	{
691 	case COLL_TEXT_BITS:
692 		if( RES_POOLCOLL_TEXT_BEGIN <= nId && nId < RES_POOLCOLL_TEXT_END )
693 		{
694 			pStrArr = bProgName ? &GetTextProgNameArray() : &GetTextUINameArray();
695 			nStt = RES_POOLCOLL_TEXT_BEGIN;
696 		}
697 		break;
698 	case COLL_LISTS_BITS:
699 		if( RES_POOLCOLL_LISTS_BEGIN <= nId && nId < RES_POOLCOLL_LISTS_END )
700 		{
701 			pStrArr = bProgName ? &GetListsProgNameArray() : &GetListsUINameArray();
702 			nStt = RES_POOLCOLL_LISTS_BEGIN;
703 		}
704 		break;
705 	case COLL_EXTRA_BITS:
706 		if( RES_POOLCOLL_EXTRA_BEGIN <= nId && nId < RES_POOLCOLL_EXTRA_END )
707 		{
708 			pStrArr = bProgName ? &GetExtraProgNameArray() : &GetExtraUINameArray();
709 			nStt = RES_POOLCOLL_EXTRA_BEGIN;
710 		}
711 		break;
712 	case COLL_REGISTER_BITS:
713 		if( RES_POOLCOLL_REGISTER_BEGIN <= nId && nId < RES_POOLCOLL_REGISTER_END )
714 		{
715 			pStrArr = bProgName ? &GetRegisterProgNameArray() : &GetRegisterUINameArray();
716 			nStt = RES_POOLCOLL_REGISTER_BEGIN;
717 		}
718 		break;
719 	case COLL_DOC_BITS:
720 		if( RES_POOLCOLL_DOC_BEGIN <= nId && nId < RES_POOLCOLL_DOC_END )
721 		{
722 			pStrArr = bProgName ? &GetDocProgNameArray() : &GetDocUINameArray();
723 			nStt = RES_POOLCOLL_DOC_BEGIN;
724 		}
725 		break;
726 	case COLL_HTML_BITS:
727 		if( RES_POOLCOLL_HTML_BEGIN <= nId && nId < RES_POOLCOLL_HTML_END )
728 		{
729 			pStrArr = bProgName ? &GetHTMLProgNameArray() : &GetHTMLUINameArray();
730 			nStt = RES_POOLCOLL_HTML_BEGIN;
731 		}
732 		break;
733 	case POOLGRP_CHARFMT:
734 		if( RES_POOLCHR_NORMAL_BEGIN <= nId && nId < RES_POOLCHR_NORMAL_END )
735 		{
736 			pStrArr = bProgName ? &GetChrFmtProgNameArray() : &GetChrFmtUINameArray();
737 			nStt = RES_POOLCHR_NORMAL_BEGIN;
738 		}
739 		else if( RES_POOLCHR_HTML_BEGIN <= nId && nId < RES_POOLCHR_HTML_END )
740 		{
741 			pStrArr = bProgName ? &GetHTMLChrFmtProgNameArray() : &GetHTMLChrFmtUINameArray();
742 			nStt = RES_POOLCHR_HTML_BEGIN;
743 		}
744 		break;
745 	case POOLGRP_FRAMEFMT:
746 		if( RES_POOLFRM_BEGIN <= nId && nId < RES_POOLFRM_END )
747 		{
748 			pStrArr = bProgName ? &GetFrmFmtProgNameArray() : &GetFrmFmtUINameArray();
749 			nStt = RES_POOLFRM_BEGIN;
750 		}
751 		break;
752 	case POOLGRP_PAGEDESC:
753 		if( RES_POOLPAGE_BEGIN <= nId && nId < RES_POOLPAGE_END )
754 		{
755 			pStrArr = bProgName ? &GetPageDescProgNameArray() : &GetPageDescUINameArray();
756 			nStt = RES_POOLPAGE_BEGIN;
757 		}
758 		break;
759 	case POOLGRP_NUMRULE:
760 		if( RES_POOLNUMRULE_BEGIN <= nId && nId < RES_POOLNUMRULE_END )
761 		{
762 			pStrArr = bProgName ? &GetNumRuleProgNameArray() : &GetNumRuleUINameArray();
763 			nStt = RES_POOLNUMRULE_BEGIN;
764 		}
765 		break;
766 	}
767 	return pStrArr ? *(pStrArr->operator[] ( nId - nStt ) ) : rFillName;
768 }
769 void SwStyleNameMapper::fillNameFromId( sal_uInt16 nId, String& rFillName, sal_Bool bProgName )
770 {
771 	sal_uInt16 nStt = 0;
772 	const SvStringsDtor* pStrArr = 0;
773 
774 	switch( (USER_FMT | COLL_GET_RANGE_BITS | POOLGRP_NOCOLLID) & nId )
775 	{
776 	case COLL_TEXT_BITS:
777 		if( RES_POOLCOLL_TEXT_BEGIN <= nId && nId < RES_POOLCOLL_TEXT_END )
778 		{
779 			pStrArr = bProgName ? &GetTextProgNameArray() : &GetTextUINameArray();
780 			nStt = RES_POOLCOLL_TEXT_BEGIN;
781 		}
782 		break;
783 	case COLL_LISTS_BITS:
784 		if( RES_POOLCOLL_LISTS_BEGIN <= nId && nId < RES_POOLCOLL_LISTS_END )
785 		{
786 			pStrArr = bProgName ? &GetListsProgNameArray() : &GetListsUINameArray();
787 			nStt = RES_POOLCOLL_LISTS_BEGIN;
788 		}
789 		break;
790 	case COLL_EXTRA_BITS:
791 		if( RES_POOLCOLL_EXTRA_BEGIN <= nId && nId < RES_POOLCOLL_EXTRA_END )
792 		{
793 			pStrArr = bProgName ? &GetExtraProgNameArray() : &GetExtraUINameArray();
794 			nStt = RES_POOLCOLL_EXTRA_BEGIN;
795 		}
796 		break;
797 	case COLL_REGISTER_BITS:
798 		if( RES_POOLCOLL_REGISTER_BEGIN <= nId && nId < RES_POOLCOLL_REGISTER_END )
799 		{
800 			pStrArr = bProgName ? &GetRegisterProgNameArray() : &GetRegisterUINameArray();
801 			nStt = RES_POOLCOLL_REGISTER_BEGIN;
802 		}
803 		break;
804 	case COLL_DOC_BITS:
805 		if( RES_POOLCOLL_DOC_BEGIN <= nId && nId < RES_POOLCOLL_DOC_END )
806 		{
807 			pStrArr = bProgName ? &GetDocProgNameArray() : &GetDocUINameArray();
808 			nStt = RES_POOLCOLL_DOC_BEGIN;
809 		}
810 		break;
811 	case COLL_HTML_BITS:
812 		if( RES_POOLCOLL_HTML_BEGIN <= nId && nId < RES_POOLCOLL_HTML_END )
813 		{
814 			pStrArr = bProgName ? &GetHTMLProgNameArray() : &GetHTMLUINameArray();
815 			nStt = RES_POOLCOLL_HTML_BEGIN;
816 		}
817 		break;
818 	case POOLGRP_CHARFMT:
819 		if( RES_POOLCHR_NORMAL_BEGIN <= nId && nId < RES_POOLCHR_NORMAL_END )
820 		{
821 			pStrArr = bProgName ? &GetChrFmtProgNameArray() : &GetChrFmtUINameArray();
822 			nStt = RES_POOLCHR_NORMAL_BEGIN;
823 		}
824 		else if( RES_POOLCHR_HTML_BEGIN <= nId && nId < RES_POOLCHR_HTML_END )
825 		{
826 			pStrArr = bProgName ? &GetHTMLChrFmtProgNameArray() : &GetHTMLChrFmtUINameArray();
827 			nStt = RES_POOLCHR_HTML_BEGIN;
828 		}
829 		break;
830 	case POOLGRP_FRAMEFMT:
831 		if( RES_POOLFRM_BEGIN <= nId && nId < RES_POOLFRM_END )
832 		{
833 			pStrArr = bProgName ? &GetFrmFmtProgNameArray() : &GetFrmFmtUINameArray();
834 			nStt = RES_POOLFRM_BEGIN;
835 		}
836 		break;
837 	case POOLGRP_PAGEDESC:
838 		if( RES_POOLPAGE_BEGIN <= nId && nId < RES_POOLPAGE_END )
839 		{
840 			pStrArr = bProgName ? &GetPageDescProgNameArray() : &GetPageDescUINameArray();
841 			nStt = RES_POOLPAGE_BEGIN;
842 		}
843 		break;
844 	case POOLGRP_NUMRULE:
845 		if( RES_POOLNUMRULE_BEGIN <= nId && nId < RES_POOLNUMRULE_END )
846 		{
847 			pStrArr = bProgName ? &GetNumRuleProgNameArray() : &GetNumRuleUINameArray();
848 			nStt = RES_POOLNUMRULE_BEGIN;
849 		}
850 		break;
851 	}
852 	if (pStrArr)
853 		rFillName = *(pStrArr->operator[] ( nId - nStt ) );
854 }
855 // Get the UI Name from the pool ID
856 void SwStyleNameMapper::FillUIName ( sal_uInt16 nId, String& rFillName )
857 {
858 	fillNameFromId ( nId, rFillName, sal_False );
859 }
860 // Get the UI Name from the pool ID
861 const String& SwStyleNameMapper::GetUIName ( sal_uInt16 nId, const String& rName )
862 {
863 	return getNameFromId ( nId, rName, sal_False );
864 }
865 
866 // Get the programmatic Name from the pool ID
867 void SwStyleNameMapper::FillProgName ( sal_uInt16 nId, String& rFillName )
868 {
869 	fillNameFromId ( nId, rFillName, sal_True );
870 }
871 // Get the programmatic Name from the pool ID
872 const String& SwStyleNameMapper::GetProgName ( sal_uInt16 nId, const String& rName )
873 {
874 	return getNameFromId ( nId, rName, sal_True );
875 }
876 // This gets the PoolId from the UI Name
877 sal_uInt16 SwStyleNameMapper::GetPoolIdFromUIName( const String& rName, SwGetPoolIdFromName eFlags )
878 {
879 	const NameToIdHash & rHashMap = getHashTable ( eFlags, sal_False );
880 	NameToIdHash::const_iterator aIter = rHashMap.find ( &rName );
881 	return aIter != rHashMap.end() ? (*aIter).second : USHRT_MAX;
882 }
883 // Get the Pool ID from the programmatic name
884 sal_uInt16 SwStyleNameMapper::GetPoolIdFromProgName( const String& rName, SwGetPoolIdFromName eFlags )
885 {
886 	const NameToIdHash & rHashMap = getHashTable ( eFlags, sal_True );
887 	NameToIdHash::const_iterator aIter = rHashMap.find ( &rName );
888 	return aIter != rHashMap.end() ? (*aIter).second : USHRT_MAX;
889 }
890 
891 SvStringsDtor* SwStyleNameMapper::NewUINameArray( SvStringsDtor*& pNameArray, sal_uInt16 nStt, sal_uInt16 nEnd )
892 {
893 	if( !pNameArray )
894 	{
895 		pNameArray = new SvStringsDtor( static_cast < sal_Int8 > (nEnd - nStt), 1 );
896 		while( nStt < nEnd )
897 		{
898 			const ResId rRId( nStt, *pSwResMgr );
899 			String* pStr = new String( rRId );
900 			pNameArray->Insert( pStr, pNameArray->Count() );
901 			++nStt;
902 		}
903 	}
904 	return pNameArray;
905 }
906 
907 const SvStringsDtor& SwStyleNameMapper::GetTextUINameArray()
908 {
909 	return pTextUINameArray ? *pTextUINameArray :
910 		   *NewUINameArray( pTextUINameArray, RC_POOLCOLL_TEXT_BEGIN,
911 			( RC_POOLCOLL_TEXT_BEGIN +
912 					(RES_POOLCOLL_TEXT_END - RES_POOLCOLL_TEXT_BEGIN )) );
913 }
914 
915 const SvStringsDtor& SwStyleNameMapper::GetListsUINameArray()
916 {
917 	return pListsUINameArray ? *pListsUINameArray :
918 		   *NewUINameArray( pListsUINameArray, RC_POOLCOLL_LISTS_BEGIN,
919 			( RC_POOLCOLL_LISTS_BEGIN +
920 					(RES_POOLCOLL_LISTS_END - RES_POOLCOLL_LISTS_BEGIN )) );
921 }
922 
923 const SvStringsDtor& SwStyleNameMapper::GetExtraUINameArray()
924 {
925 	return pExtraUINameArray ? *pExtraUINameArray :
926 		   *NewUINameArray( pExtraUINameArray, RC_POOLCOLL_EXTRA_BEGIN,
927 				( RC_POOLCOLL_EXTRA_BEGIN +
928 					(RES_POOLCOLL_EXTRA_END - RES_POOLCOLL_EXTRA_BEGIN )) );
929 }
930 
931 const SvStringsDtor& SwStyleNameMapper::GetRegisterUINameArray()
932 {
933 	return pRegisterUINameArray ? *pRegisterUINameArray :
934 		   *NewUINameArray( pRegisterUINameArray, RC_POOLCOLL_REGISTER_BEGIN,
935 			( RC_POOLCOLL_REGISTER_BEGIN +
936 				(RES_POOLCOLL_REGISTER_END - RES_POOLCOLL_REGISTER_BEGIN )) );
937 }
938 
939 const SvStringsDtor& SwStyleNameMapper::GetDocUINameArray()
940 {
941 	return pDocUINameArray ? *pDocUINameArray :
942 		   *NewUINameArray( pDocUINameArray, RC_POOLCOLL_DOC_BEGIN,
943 					( RC_POOLCOLL_DOC_BEGIN +
944 						(RES_POOLCOLL_DOC_END - RES_POOLCOLL_DOC_BEGIN )) );
945 }
946 
947 const SvStringsDtor& SwStyleNameMapper::GetHTMLUINameArray()
948 {
949 	return pHTMLUINameArray ? *pHTMLUINameArray :
950 		   *NewUINameArray( pHTMLUINameArray, RC_POOLCOLL_HTML_BEGIN,
951 					( RC_POOLCOLL_HTML_BEGIN +
952 						(RES_POOLCOLL_HTML_END - RES_POOLCOLL_HTML_BEGIN )) );
953 }
954 
955 const SvStringsDtor& SwStyleNameMapper::GetFrmFmtUINameArray()
956 {
957 	return pFrmFmtUINameArray ? *pFrmFmtUINameArray :
958 		   *NewUINameArray( pFrmFmtUINameArray, RC_POOLFRMFMT_BEGIN,
959 					( RC_POOLFRMFMT_BEGIN +
960 						(RES_POOLFRM_END - RES_POOLFRM_BEGIN )) );
961 }
962 
963 const SvStringsDtor& SwStyleNameMapper::GetChrFmtUINameArray()
964 {
965 	return pChrFmtUINameArray ? *pChrFmtUINameArray :
966 		   *NewUINameArray( pChrFmtUINameArray, RC_POOLCHRFMT_BEGIN,
967 			( RC_POOLCHRFMT_BEGIN +
968 					(RES_POOLCHR_NORMAL_END - RES_POOLCHR_NORMAL_BEGIN )) );
969 }
970 
971 const SvStringsDtor& SwStyleNameMapper::GetHTMLChrFmtUINameArray()
972 {
973 	return pHTMLChrFmtUINameArray ? *pHTMLChrFmtUINameArray :
974 		   *NewUINameArray( pHTMLChrFmtUINameArray, RC_POOLCHRFMT_HTML_BEGIN,
975 			( RC_POOLCHRFMT_HTML_BEGIN +
976 					(RES_POOLCHR_HTML_END - RES_POOLCHR_HTML_BEGIN )) );
977 }
978 
979 const SvStringsDtor& SwStyleNameMapper::GetPageDescUINameArray()
980 {
981 	return pPageDescUINameArray ? *pPageDescUINameArray :
982 		   *NewUINameArray( pPageDescUINameArray, RC_POOLPAGEDESC_BEGIN,
983 			( RC_POOLPAGEDESC_BEGIN +
984 					(RES_POOLPAGE_END - RES_POOLPAGE_BEGIN )) );
985 }
986 
987 const SvStringsDtor& SwStyleNameMapper::GetNumRuleUINameArray()
988 {
989 	return pNumRuleUINameArray ? *pNumRuleUINameArray :
990 	       *NewUINameArray( pNumRuleUINameArray, RC_POOLNUMRULE_BEGIN,
991 			( RC_POOLNUMRULE_BEGIN +
992 					(RES_POOLNUMRULE_END - RES_POOLNUMRULE_BEGIN )) );
993 }
994 
995 SvStringsDtor* SwStyleNameMapper::NewProgNameArray( SvStringsDtor*& pProgNameArray, const SwTableEntry *pTable, sal_uInt8 nCount )
996 {
997 	if( !pProgNameArray )
998 	{
999 		pProgNameArray = new SvStringsDtor( nCount, 1 );
1000 		while (pTable->nLength)
1001 		{
1002 			String* pStr = new String( pTable->pChar, pTable->nLength, RTL_TEXTENCODING_ASCII_US );
1003 			pProgNameArray->Insert( pStr, pProgNameArray->Count() );
1004 			pTable++;
1005 		}
1006 	}
1007 	return pProgNameArray;
1008 }
1009 
1010 const SvStringsDtor& SwStyleNameMapper::GetTextProgNameArray()
1011 {
1012 	return pTextProgNameArray ? *pTextProgNameArray :
1013 		   *NewProgNameArray( pTextProgNameArray, TextProgNameTable,
1014 			sizeof ( TextProgNameTable ) / sizeof ( SwTableEntry ) );
1015 }
1016 
1017 const SvStringsDtor& SwStyleNameMapper::GetListsProgNameArray()
1018 {
1019 	return pListsProgNameArray ? *pListsProgNameArray :
1020 		   *NewProgNameArray( pListsProgNameArray, ListsProgNameTable,
1021 			sizeof ( ListsProgNameTable ) / sizeof ( SwTableEntry ) );
1022 }
1023 
1024 const SvStringsDtor& SwStyleNameMapper::GetExtraProgNameArray()
1025 {
1026 	return pExtraProgNameArray ? *pExtraProgNameArray :
1027 		   *NewProgNameArray( pExtraProgNameArray, ExtraProgNameTable,
1028 			sizeof ( ExtraProgNameTable ) / sizeof ( SwTableEntry ) );
1029 }
1030 
1031 const SvStringsDtor& SwStyleNameMapper::GetRegisterProgNameArray()
1032 {
1033 	return pRegisterProgNameArray ? *pRegisterProgNameArray :
1034 		   *NewProgNameArray( pRegisterProgNameArray, RegisterProgNameTable,
1035 			sizeof ( RegisterProgNameTable ) / sizeof ( SwTableEntry ) );
1036 }
1037 
1038 const SvStringsDtor& SwStyleNameMapper::GetDocProgNameArray()
1039 {
1040 	return pDocProgNameArray ? *pDocProgNameArray :
1041 		   *NewProgNameArray( pDocProgNameArray, DocProgNameTable,
1042 			sizeof ( DocProgNameTable ) / sizeof ( SwTableEntry ) );
1043 }
1044 
1045 const SvStringsDtor& SwStyleNameMapper::GetHTMLProgNameArray()
1046 {
1047 	return pHTMLProgNameArray ? *pHTMLProgNameArray :
1048 		   *NewProgNameArray( pHTMLProgNameArray, HTMLProgNameTable,
1049 			sizeof ( HTMLProgNameTable ) / sizeof ( SwTableEntry ) );
1050 }
1051 
1052 const SvStringsDtor& SwStyleNameMapper::GetFrmFmtProgNameArray()
1053 {
1054 	return pFrmFmtProgNameArray ? *pFrmFmtProgNameArray :
1055 		   *NewProgNameArray( pFrmFmtProgNameArray, FrmFmtProgNameTable,
1056 			sizeof ( FrmFmtProgNameTable ) / sizeof ( SwTableEntry ) );
1057 }
1058 
1059 const SvStringsDtor& SwStyleNameMapper::GetChrFmtProgNameArray()
1060 {
1061 	return pChrFmtProgNameArray ? *pChrFmtProgNameArray :
1062 		   *NewProgNameArray( pChrFmtProgNameArray, ChrFmtProgNameTable,
1063 			sizeof ( ChrFmtProgNameTable ) / sizeof ( SwTableEntry ) );
1064 }
1065 
1066 const SvStringsDtor& SwStyleNameMapper::GetHTMLChrFmtProgNameArray()
1067 {
1068 	return pHTMLChrFmtProgNameArray ? *pHTMLChrFmtProgNameArray :
1069 		   *NewProgNameArray( pHTMLChrFmtProgNameArray, HTMLChrFmtProgNameTable,
1070 			sizeof ( HTMLChrFmtProgNameTable ) / sizeof ( SwTableEntry ) );
1071 }
1072 
1073 const SvStringsDtor& SwStyleNameMapper::GetPageDescProgNameArray()
1074 {
1075 	return pPageDescProgNameArray ? *pPageDescProgNameArray :
1076 		   *NewProgNameArray( pPageDescProgNameArray, PageDescProgNameTable,
1077 			sizeof ( PageDescProgNameTable ) / sizeof ( SwTableEntry ) );
1078 }
1079 
1080 const SvStringsDtor& SwStyleNameMapper::GetNumRuleProgNameArray()
1081 {
1082 	return pNumRuleProgNameArray ? *pNumRuleProgNameArray :
1083 		   *NewProgNameArray( pNumRuleProgNameArray, NumRuleProgNameTable,
1084 			sizeof ( NumRuleProgNameTable ) / sizeof ( SwTableEntry ) );
1085 }
1086 
1087 
1088 const String SwStyleNameMapper::GetSpecialExtraProgName( const String& rExtraUIName )
1089 {
1090     String aRes = rExtraUIName;
1091     sal_Bool bChgName = sal_False;
1092     const SvStringsDtor& rExtraArr = GetExtraUINameArray();
1093     static sal_uInt16 nIds[] =
1094     {
1095         RES_POOLCOLL_LABEL_DRAWING - RES_POOLCOLL_EXTRA_BEGIN,
1096         RES_POOLCOLL_LABEL_ABB - RES_POOLCOLL_EXTRA_BEGIN,
1097         RES_POOLCOLL_LABEL_TABLE - RES_POOLCOLL_EXTRA_BEGIN,
1098         RES_POOLCOLL_LABEL_FRAME- RES_POOLCOLL_EXTRA_BEGIN,
1099         0
1100     };
1101     const sal_uInt16 * pIds;
1102     for ( pIds = nIds; *pIds; ++pIds)
1103     {
1104         if (aRes == *rExtraArr[ *pIds ])
1105         {
1106             bChgName = sal_True;
1107             break;
1108         }
1109     }
1110     if (bChgName)
1111         aRes = *GetExtraProgNameArray()[*pIds];
1112     return aRes;
1113 }
1114 
1115 const String SwStyleNameMapper::GetSpecialExtraUIName( const String& rExtraProgName )
1116 {
1117     String aRes = rExtraProgName;
1118     sal_Bool bChgName = sal_False;
1119     const SvStringsDtor& rExtraArr = GetExtraProgNameArray();
1120     static sal_uInt16 nIds[] =
1121     {
1122         RES_POOLCOLL_LABEL_DRAWING - RES_POOLCOLL_EXTRA_BEGIN,
1123         RES_POOLCOLL_LABEL_ABB - RES_POOLCOLL_EXTRA_BEGIN,
1124         RES_POOLCOLL_LABEL_TABLE - RES_POOLCOLL_EXTRA_BEGIN,
1125         RES_POOLCOLL_LABEL_FRAME- RES_POOLCOLL_EXTRA_BEGIN,
1126         0
1127     };
1128     const sal_uInt16 * pIds;
1129 
1130     for ( pIds = nIds; *pIds; ++pIds)
1131     {
1132         if (aRes == *rExtraArr[ *pIds ])
1133         {
1134             bChgName = sal_True;
1135             break;
1136         }
1137     }
1138     if (bChgName)
1139         aRes = *GetExtraUINameArray()[*pIds];
1140     return aRes;
1141 }
1142 
1143