xref: /trunk/main/sw/source/core/doc/SwStyleNameMapper.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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