1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 #include <DocumentStylePoolManager.hxx>
20 #include <SwStyleNameMapper.hxx>
21 #include <doc.hxx>
22 #include <DocumentSettingManager.hxx>
23 #include <IDocumentState.hxx>
24 #include <IDocumentUndoRedo.hxx>
25 #include <fmtanchr.hxx>
26 #include <fmtfsize.hxx>
27 #include <paratr.hxx>
28 #include <poolfmt.hxx>
29 #include <fmtornt.hxx>
30 #include <charfmt.hxx>
31 #include <fmtsrnd.hxx>
32 #include <docary.hxx>
33 #include <pagedesc.hxx>
34 #include <frmfmt.hxx>
35 #include <fmtline.hxx>
36 #include <numrule.hxx>
37 #include <hints.hxx>
38 #include <editeng/paperinf.hxx>
39 #include <editeng/wghtitem.hxx>
40 #include <editeng/fontitem.hxx>
41 #include <editeng/fhgtitem.hxx>
42 #include <editeng/tstpitem.hxx>
43 #include <editeng/lrspitem.hxx>
44 #include <editeng/ulspitem.hxx>
45 #include <editeng/lspcitem.hxx>
46 #include <editeng/adjustitem.hxx>
47 #include <editeng/postitem.hxx>
48 #include <editeng/keepitem.hxx>
49 #include <editeng/opaqitem.hxx>
50 #include <editeng/boxitem.hxx>
51 #include <editeng/cmapitem.hxx>
52 #include <editeng/udlnitem.hxx>
53 #include <editeng/colritem.hxx>
54 #include <editeng/protitem.hxx>
55 #include <editeng/escapementitem.hxx>
56 #include <editeng/langitem.hxx>
57 #include <editeng/charrotateitem.hxx>
58 #include <editeng/emphasismarkitem.hxx>
59 #include <editeng/scriptspaceitem.hxx>
60 #include <o3tl/unit_conversion.hxx>
61 #include <svx/strings.hrc>
62 #include <svx/dialmgr.hxx>
63 #include <sal/log.hxx>
64 #include <osl/diagnose.h>
65 #include <strings.hrc>
66 #include <frmatr.hxx>
67 #include <frameformats.hxx>
68 #include <com/sun/star/text/VertOrientation.hpp>
69 #include <com/sun/star/text/RelOrientation.hpp>
70 #include <com/sun/star/text/HoriOrientation.hpp>
71 #include <unotools/syslocale.hxx>
72 #include <i18nlangtag/languagetag.hxx>
73 #include <comphelper/lok.hxx>
74 
75 using namespace ::editeng;
76 using namespace ::com::sun::star;
77 
IsConditionalByPoolId(sal_uInt16 nId)78 bool IsConditionalByPoolId(sal_uInt16 nId)
79 {
80     // TODO: why is this style conditional?
81     // If it is changed to no longer be conditional, then a style "Text Body"
82     // will be imported without its conditions from ODF.
83     return RES_POOLCOLL_TEXT == nId;
84 }
85 
86 namespace
87 {
88     const sal_uInt16 PT_3   =  3 * 20;      //  3 pt
89     const sal_uInt16 PT_6   =  6 * 20;      //  6 pt
90     const sal_uInt16 PT_7   =  7 * 20;      //  7 pt
91     const sal_uInt16 PT_9   =  9 * 20;      //  9 pt
92     const sal_uInt16 PT_10  = 10 * 20;      // 10 pt
93     const sal_uInt16 PT_12  = 12 * 20;      // 12 pt
94     const sal_uInt16 PT_13  = 13 * 20;      // 13 pt
95     const sal_uInt16 PT_14  = 14 * 20;      // 14 pt
96     const sal_uInt16 PT_16  = 16 * 20;      // 16 pt
97     const sal_uInt16 PT_18  = 18 * 20;      // 18 pt
98     const sal_uInt16 PT_24  = 24 * 20;      // 24 pt
99     const sal_uInt16 PT_28  = 28 * 20;      // 28 pt
100 
101     const sal_uInt16 HTML_PARSPACE = o3tl::convert(5, o3tl::Length::mm, o3tl::Length::twip);
102 
103     const sal_uInt16 aHeadlineSizes[ 2 * MAXLEVEL ] = {
104         // we do everything percentual now:
105         PT_18, PT_16, PT_14, PT_13, PT_12,
106         PT_12, PT_10, PT_10, PT_9, PT_9,  // normal
107 
108         PT_24, PT_18, PT_14, PT_12, PT_10,
109         PT_7, PT_7, PT_7, PT_7, PT_7            // HTML mode
110     };
111 
lcl_GetRightMargin(SwDoc & rDoc)112     tools::Long lcl_GetRightMargin( SwDoc& rDoc )
113     {
114         // Make sure that the printer settings are taken over to the standard
115         // page style
116         const SwFrameFormat& rPgDscFormat = rDoc.GetPageDesc( 0 ).GetMaster();
117         const SvxLRSpaceItem& rLR = rPgDscFormat.GetLRSpace();
118         const tools::Long nLeft = rLR.GetLeft();
119         const tools::Long nRight = rLR.GetRight();
120         const tools::Long nWidth = rPgDscFormat.GetFrameSize().GetWidth();
121         return nWidth - nLeft - nRight;
122     }
123 
lcl_SetDfltFont(DefaultFontType nFntType,SfxItemSet & rSet)124     void lcl_SetDfltFont( DefaultFontType nFntType, SfxItemSet& rSet )
125     {
126         static struct {
127             sal_uInt16 nResLngId;
128             sal_uInt16 nResFntId;
129         } aArr[ 3 ] = {
130             { RES_CHRATR_LANGUAGE, RES_CHRATR_FONT },
131             { RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CJK_FONT },
132             { RES_CHRATR_CTL_LANGUAGE, RES_CHRATR_CTL_FONT }
133         };
134         for(const auto & n : aArr)
135         {
136             LanguageType nLng = static_cast<const SvxLanguageItem&>(rSet.GetPool()->GetUserOrPoolDefaultItem(
137                                 n.nResLngId )).GetLanguage();
138             vcl::Font aFnt( OutputDevice::GetDefaultFont( nFntType,
139                                     nLng, GetDefaultFontFlags::OnlyOne ) );
140 
141             rSet.Put( SvxFontItem( aFnt.GetFamilyType(), aFnt.GetFamilyName(),
142                                 OUString(), aFnt.GetPitch(),
143                                 aFnt.GetCharSet(), n.nResFntId ));
144         }
145     }
146 
lcl_SetDfltFont(DefaultFontType nLatinFntType,DefaultFontType nCJKFntType,DefaultFontType nCTLFntType,SfxItemSet & rSet)147     void lcl_SetDfltFont( DefaultFontType nLatinFntType, DefaultFontType nCJKFntType,
148                             DefaultFontType nCTLFntType, SfxItemSet& rSet )
149     {
150         static struct {
151             sal_uInt16 nResLngId;
152             sal_uInt16 nResFntId;
153             DefaultFontType nFntType;
154         } aArr[ 3 ] = {
155             { RES_CHRATR_LANGUAGE, RES_CHRATR_FONT, static_cast<DefaultFontType>(0) },
156             { RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CJK_FONT, static_cast<DefaultFontType>(0) },
157             { RES_CHRATR_CTL_LANGUAGE, RES_CHRATR_CTL_FONT, static_cast<DefaultFontType>(0) }
158         };
159         aArr[0].nFntType = nLatinFntType;
160         aArr[1].nFntType = nCJKFntType;
161         aArr[2].nFntType = nCTLFntType;
162 
163         for(const auto & n : aArr)
164         {
165             LanguageType nLng = static_cast<const SvxLanguageItem&>(rSet.GetPool()->GetUserOrPoolDefaultItem(
166                                 n.nResLngId )).GetLanguage();
167             vcl::Font aFnt( OutputDevice::GetDefaultFont( n.nFntType,
168                                     nLng, GetDefaultFontFlags::OnlyOne ) );
169 
170             rSet.Put( SvxFontItem( aFnt.GetFamilyType(), aFnt.GetFamilyName(),
171                                 OUString(), aFnt.GetPitch(),
172                                 aFnt.GetCharSet(), n.nResFntId ));
173         }
174     }
175 
lcl_SetHeadline(SwDoc & rDoc,SwTextFormatColl * pColl,SfxItemSet & rSet,sal_uInt16 nOutLvlBits,sal_uInt8 nLevel,bool bItalic)176     void lcl_SetHeadline( SwDoc& rDoc, SwTextFormatColl* pColl,
177                             SfxItemSet& rSet,
178                             sal_uInt16 nOutLvlBits, sal_uInt8 nLevel, bool bItalic )
179     {
180         SetAllScriptItem( rSet, SvxWeightItem( WEIGHT_BOLD, RES_CHRATR_WEIGHT ) );
181         SvxFontHeightItem aHItem(240, 100, RES_CHRATR_FONTSIZE);
182         const bool bHTMLMode = rDoc.GetDocumentSettingManager().get(DocumentSettingId::HTML_MODE);
183         if( bHTMLMode )
184             aHItem.SetHeight( aHeadlineSizes[ MAXLEVEL + nLevel ] );
185         else
186             aHItem.SetHeight( aHeadlineSizes[ nLevel ] );
187         SetAllScriptItem( rSet, aHItem );
188 
189         if( bItalic && !bHTMLMode )
190             SetAllScriptItem( rSet, SvxPostureItem( ITALIC_NORMAL, RES_CHRATR_POSTURE ) );
191 
192         if( bHTMLMode )
193         {
194             lcl_SetDfltFont( DefaultFontType::LATIN_TEXT, DefaultFontType::CJK_TEXT,
195                                 DefaultFontType::CTL_TEXT, rSet );
196         }
197 
198         if( !pColl )
199             return;
200 
201         if( !( nOutLvlBits & ( 1 << nLevel )) )
202         {
203             pColl->AssignToListLevelOfOutlineStyle(nLevel);
204             if( !bHTMLMode )
205             {
206                 SwNumRule * pOutlineRule = rDoc.GetOutlineNumRule();
207                 const SwNumFormat& rNFormat = pOutlineRule->Get( nLevel );
208 
209                 if ( rNFormat.GetPositionAndSpaceMode() ==
210                                     SvxNumberFormat::LABEL_WIDTH_AND_POSITION &&
211                         ( rNFormat.GetAbsLSpace() || rNFormat.GetFirstLineOffset() ) )
212                 {
213                     SvxFirstLineIndentItem firstLine(pColl->GetFormatAttr(RES_MARGIN_FIRSTLINE));
214                     SvxTextLeftMarginItem leftMargin(pColl->GetFormatAttr(RES_MARGIN_TEXTLEFT));
215                     firstLine.SetTextFirstLineOffsetValue(rNFormat.GetFirstLineOffset());
216                         //TODO: overflow
217                     leftMargin.SetTextLeft(rNFormat.GetAbsLSpace());
218                     pColl->SetFormatAttr(firstLine);
219                     pColl->SetFormatAttr(leftMargin);
220                 }
221 
222                 // All paragraph styles, which are assigned to a level of the
223                 // outline style has to have the outline style set as its list style.
224                 SwNumRuleItem aItem(pOutlineRule->GetName());
225                 pColl->SetFormatAttr(aItem);
226             }
227         }
228         pColl->SetNextTextFormatColl( *rDoc.getIDocumentStylePoolAccess().GetTextCollFromPool( RES_POOLCOLL_TEXT ));
229     }
230 
lcl_SetRegister(SwDoc & rDoc,SfxItemSet & rSet,sal_uInt16 nFact,bool bHeader,bool bTab)231     void lcl_SetRegister( SwDoc& rDoc, SfxItemSet& rSet, sal_uInt16 nFact,
232                             bool bHeader, bool bTab )
233     {
234         sal_uInt16 nLeft = o3tl::convert(5 * nFact, o3tl::Length::mm, o3tl::Length::twip);
235         SvxFirstLineIndentItem const firstLine(0, RES_MARGIN_FIRSTLINE);
236         SvxTextLeftMarginItem const leftMargin(nLeft, RES_MARGIN_TEXTLEFT);
237         rSet.Put(firstLine);
238         rSet.Put(leftMargin);
239         if( bHeader )
240         {
241             SetAllScriptItem( rSet, SvxWeightItem( WEIGHT_BOLD, RES_CHRATR_WEIGHT ) );
242             SetAllScriptItem( rSet, SvxFontHeightItem( PT_16, 100, RES_CHRATR_FONTSIZE ) );
243         }
244         if( bTab )
245         {
246             tools::Long nRightMargin = lcl_GetRightMargin( rDoc );
247             SvxTabStopItem aTStops( 0, 0, SvxTabAdjust::Default, RES_PARATR_TABSTOP );
248             aTStops.Insert( SvxTabStop( nRightMargin - nLeft,
249                                         SvxTabAdjust::Right,
250                                         cDfltDecimalChar, '.' ));
251             rSet.Put( aTStops );
252         }
253     }
254 
lcl_SetNumBul(SwDoc & rDoc,SwTextFormatColl * pColl,SfxItemSet & rSet,sal_uInt16 nNxt,SwTwips nEZ,SwTwips nLeft,SwTwips nUpper,SwTwips nLower)255     void lcl_SetNumBul( SwDoc& rDoc, SwTextFormatColl* pColl,
256                             SfxItemSet& rSet,
257                             sal_uInt16 nNxt, SwTwips nEZ, SwTwips nLeft,
258                             SwTwips nUpper, SwTwips nLower )
259     {
260         SvxFirstLineIndentItem const firstLine(sal_uInt16(nEZ), RES_MARGIN_FIRSTLINE);
261         SvxTextLeftMarginItem const leftMargin(sal_uInt16(nLeft), RES_MARGIN_TEXTLEFT);
262         rSet.Put(firstLine);
263         rSet.Put(leftMargin);
264         SvxULSpaceItem aUL( RES_UL_SPACE );
265         aUL.SetUpper( sal_uInt16(nUpper) );
266         aUL.SetLower( sal_uInt16(nLower) );
267         rSet.Put( aUL );
268 
269         if( pColl )
270             pColl->SetNextTextFormatColl( *rDoc.getIDocumentStylePoolAccess().GetTextCollFromPool( nNxt ));
271     }
272 
lcl_PutStdPageSizeIntoItemSet(SwDoc & rDoc,SfxItemSet & rSet)273     void lcl_PutStdPageSizeIntoItemSet( SwDoc& rDoc, SfxItemSet& rSet )
274     {
275         SwPageDesc* pStdPgDsc = rDoc.getIDocumentStylePoolAccess().GetPageDescFromPool( RES_POOLPAGE_STANDARD );
276         SwFormatFrameSize aFrameSz( pStdPgDsc->GetMaster().GetFrameSize() );
277         if( pStdPgDsc->GetLandscape() )
278         {
279             SwTwips nTmp = aFrameSz.GetHeight();
280             aFrameSz.SetHeight( aFrameSz.GetWidth() );
281             aFrameSz.SetWidth( nTmp );
282         }
283         rSet.Put( aFrameSz );
284     }
285 }
286 
287 const TranslateId STR_POOLCOLL_TEXT_ARY[] =
288 {
289     // Category Text
290     STR_POOLCOLL_STANDARD,
291     STR_POOLCOLL_TEXT,
292     STR_POOLCOLL_TEXT_IDENT,
293     STR_POOLCOLL_TEXT_NEGIDENT,
294     STR_POOLCOLL_TEXT_MOVE,
295     STR_POOLCOLL_GREETING,
296     STR_POOLCOLL_SIGNATURE,
297     STR_POOLCOLL_CONFRONTATION,
298     STR_POOLCOLL_MARGINAL,
299     // Subcategory Headlines
300     STR_POOLCOLL_HEADLINE_BASE,
301     STR_POOLCOLL_HEADLINE1,
302     STR_POOLCOLL_HEADLINE2,
303     STR_POOLCOLL_HEADLINE3,
304     STR_POOLCOLL_HEADLINE4,
305     STR_POOLCOLL_HEADLINE5,
306     STR_POOLCOLL_HEADLINE6,
307     STR_POOLCOLL_HEADLINE7,
308     STR_POOLCOLL_HEADLINE8,
309     STR_POOLCOLL_HEADLINE9,
310     STR_POOLCOLL_HEADLINE10
311 };
312 
313 const TranslateId STR_POOLCOLL_LISTS_ARY[]
314 {
315     // Category Lists
316     STR_POOLCOLL_NUMBER_BULLET_BASE,
317     // Subcategory Numbering
318     STR_POOLCOLL_NUM_LEVEL1S,
319     STR_POOLCOLL_NUM_LEVEL1,
320     STR_POOLCOLL_NUM_LEVEL1E,
321     STR_POOLCOLL_NUM_NONUM1,
322     STR_POOLCOLL_NUM_LEVEL2S,
323     STR_POOLCOLL_NUM_LEVEL2,
324     STR_POOLCOLL_NUM_LEVEL2E,
325     STR_POOLCOLL_NUM_NONUM2,
326     STR_POOLCOLL_NUM_LEVEL3S,
327     STR_POOLCOLL_NUM_LEVEL3,
328     STR_POOLCOLL_NUM_LEVEL3E,
329     STR_POOLCOLL_NUM_NONUM3,
330     STR_POOLCOLL_NUM_LEVEL4S,
331     STR_POOLCOLL_NUM_LEVEL4,
332     STR_POOLCOLL_NUM_LEVEL4E,
333     STR_POOLCOLL_NUM_NONUM4,
334     STR_POOLCOLL_NUM_LEVEL5S,
335     STR_POOLCOLL_NUM_LEVEL5,
336     STR_POOLCOLL_NUM_LEVEL5E,
337     STR_POOLCOLL_NUM_NONUM5,
338 
339     // Subcategory Enumeration
340     STR_POOLCOLL_BULLET_LEVEL1S,
341     STR_POOLCOLL_BULLET_LEVEL1,
342     STR_POOLCOLL_BULLET_LEVEL1E,
343     STR_POOLCOLL_BULLET_NONUM1,
344     STR_POOLCOLL_BULLET_LEVEL2S,
345     STR_POOLCOLL_BULLET_LEVEL2,
346     STR_POOLCOLL_BULLET_LEVEL2E,
347     STR_POOLCOLL_BULLET_NONUM2,
348     STR_POOLCOLL_BULLET_LEVEL3S,
349     STR_POOLCOLL_BULLET_LEVEL3,
350     STR_POOLCOLL_BULLET_LEVEL3E,
351     STR_POOLCOLL_BULLET_NONUM3,
352     STR_POOLCOLL_BULLET_LEVEL4S,
353     STR_POOLCOLL_BULLET_LEVEL4,
354     STR_POOLCOLL_BULLET_LEVEL4E,
355     STR_POOLCOLL_BULLET_NONUM4,
356     STR_POOLCOLL_BULLET_LEVEL5S,
357     STR_POOLCOLL_BULLET_LEVEL5,
358     STR_POOLCOLL_BULLET_LEVEL5E,
359     STR_POOLCOLL_BULLET_NONUM5
360 };
361 
362 // Special Areas
363 const TranslateId STR_POOLCOLL_EXTRA_ARY[]
364 {
365     // Subcategory Header
366     STR_POOLCOLL_HEADERFOOTER,
367     STR_POOLCOLL_HEADER,
368     STR_POOLCOLL_HEADERL,
369     STR_POOLCOLL_HEADERR,
370     // Subcategory Footer
371     STR_POOLCOLL_FOOTER,
372     STR_POOLCOLL_FOOTERL,
373     STR_POOLCOLL_FOOTERR,
374     // Subcategory Table
375     STR_POOLCOLL_TABLE,
376     STR_POOLCOLL_TABLE_HDLN,
377     // Subcategory Labels
378     STR_POOLCOLL_LABEL,
379     STR_POOLCOLL_LABEL_ABB,
380     STR_POOLCOLL_LABEL_TABLE,
381     STR_POOLCOLL_LABEL_FRAME,
382     STR_POOLCOLL_LABEL_FIGURE,
383     // Miscellaneous
384     STR_POOLCOLL_FRAME,
385     STR_POOLCOLL_FOOTNOTE,
386     STR_POOLCOLL_ENVELOPE_ADDRESS,
387     STR_POOLCOLL_SEND_ADDRESS,
388     STR_POOLCOLL_ENDNOTE,
389     STR_POOLCOLL_LABEL_DRAWING,
390     STR_POOLCOLL_COMMENT
391 };
392 
393 const TranslateId STR_POOLCOLL_REGISTER_ARY[] =
394 {
395     // Category Directories
396     STR_POOLCOLL_REGISTER_BASE,
397     // Subcategory Index-Directories
398     STR_POOLCOLL_TOX_IDXH,
399     STR_POOLCOLL_TOX_IDX1,
400     STR_POOLCOLL_TOX_IDX2,
401     STR_POOLCOLL_TOX_IDX3,
402     STR_POOLCOLL_TOX_IDXBREAK,
403     // Subcategory Tables of Contents
404     STR_POOLCOLL_TOX_CNTNTH,
405     STR_POOLCOLL_TOX_CNTNT1,
406     STR_POOLCOLL_TOX_CNTNT2,
407     STR_POOLCOLL_TOX_CNTNT3,
408     STR_POOLCOLL_TOX_CNTNT4,
409     STR_POOLCOLL_TOX_CNTNT5,
410     // Subcategory User-Directories:
411     STR_POOLCOLL_TOX_USERH,
412     STR_POOLCOLL_TOX_USER1,
413     STR_POOLCOLL_TOX_USER2,
414     STR_POOLCOLL_TOX_USER3,
415     STR_POOLCOLL_TOX_USER4,
416     STR_POOLCOLL_TOX_USER5,
417     // Subcategory Table of Contents more Levels 5 - 10
418     STR_POOLCOLL_TOX_CNTNT6,
419     STR_POOLCOLL_TOX_CNTNT7,
420     STR_POOLCOLL_TOX_CNTNT8,
421     STR_POOLCOLL_TOX_CNTNT9,
422     STR_POOLCOLL_TOX_CNTNT10,
423     // Illustrations Index
424     STR_POOLCOLL_TOX_ILLUSH,
425     STR_POOLCOLL_TOX_ILLUS1,
426     //  Object Index
427     STR_POOLCOLL_TOX_OBJECTH,
428     STR_POOLCOLL_TOX_OBJECT1,
429     //  Tables Index
430     STR_POOLCOLL_TOX_TABLESH,
431     STR_POOLCOLL_TOX_TABLES1,
432     //  Index of Authorities
433     STR_POOLCOLL_TOX_AUTHORITIESH,
434     STR_POOLCOLL_TOX_AUTHORITIES1,
435     // Subcategory User-Directories more Levels 5 - 10
436     STR_POOLCOLL_TOX_USER6,
437     STR_POOLCOLL_TOX_USER7,
438     STR_POOLCOLL_TOX_USER8,
439     STR_POOLCOLL_TOX_USER9,
440     STR_POOLCOLL_TOX_USER10
441 };
442 
443 const TranslateId STR_POOLCOLL_DOC_ARY[] =
444 {
445     // Category Chapter/Document
446     STR_POOLCOLL_DOC_TITLE,
447     STR_POOLCOLL_DOC_SUBTITLE,
448     STR_POOLCOLL_DOC_APPENDIX
449 };
450 
451 const TranslateId STR_POOLCOLL_HTML_ARY[] =
452 {
453     // Category HTML-Templates
454     STR_POOLCOLL_HTML_BLOCKQUOTE,
455     STR_POOLCOLL_HTML_PRE,
456     STR_POOLCOLL_HTML_HR,
457     STR_POOLCOLL_HTML_DD,
458     STR_POOLCOLL_HTML_DT
459 };
460 
461 const TranslateId STR_POOLCHR_ARY[] =
462 {
463     STR_POOLCHR_FOOTNOTE,
464     STR_POOLCHR_PAGENO,
465     STR_POOLCHR_LABEL,
466     STR_POOLCHR_DROPCAPS,
467     STR_POOLCHR_NUM_LEVEL,
468     STR_POOLCHR_BULLET_LEVEL,
469     STR_POOLCHR_INET_NORMAL,
470     STR_POOLCHR_INET_VISIT,
471     STR_POOLCHR_JUMPEDIT,
472     STR_POOLCHR_TOXJUMP,
473     STR_POOLCHR_ENDNOTE,
474     STR_POOLCHR_LINENUM,
475     STR_POOLCHR_IDX_MAIN_ENTRY,
476     STR_POOLCHR_FOOTNOTE_ANCHOR,
477     STR_POOLCHR_ENDNOTE_ANCHOR,
478     STR_POOLCHR_RUBYTEXT,
479     STR_POOLCHR_VERT_NUM
480 };
481 
482 const TranslateId STR_POOLCHR_HTML_ARY[] =
483 {
484     STR_POOLCHR_HTML_EMPHASIS,
485     STR_POOLCHR_HTML_CITATION,
486     STR_POOLCHR_HTML_STRONG,
487     STR_POOLCHR_HTML_CODE,
488     STR_POOLCHR_HTML_SAMPLE,
489     STR_POOLCHR_HTML_KEYBOARD,
490     STR_POOLCHR_HTML_VARIABLE,
491     STR_POOLCHR_HTML_DEFINSTANCE,
492     STR_POOLCHR_HTML_TELETYPE
493 };
494 
495 const TranslateId STR_POOLFRM_ARY[] =
496 {
497     STR_POOLFRM_FRAME,
498     STR_POOLFRM_GRAPHIC,
499     STR_POOLFRM_OLE,
500     STR_POOLFRM_FORMEL,
501     STR_POOLFRM_MARGINAL,
502     STR_POOLFRM_WATERSIGN,
503     STR_POOLFRM_LABEL
504 };
505 
506 const TranslateId STR_POOLPAGE_ARY[] =
507 {
508     // Page styles
509     STR_POOLPAGE_STANDARD,
510     STR_POOLPAGE_FIRST,
511     STR_POOLPAGE_LEFT,
512     STR_POOLPAGE_RIGHT,
513     STR_POOLPAGE_ENVELOPE,
514     STR_POOLPAGE_REGISTER,
515     STR_POOLPAGE_HTML,
516     STR_POOLPAGE_FOOTNOTE,
517     STR_POOLPAGE_ENDNOTE,
518     STR_POOLPAGE_LANDSCAPE
519 };
520 
521 const TranslateId STR_POOLNUMRULE_NUM_ARY[] =
522 {
523     // Numbering styles
524     STR_POOLNUMRULE_NOLIST,
525     STR_POOLNUMRULE_NUM1,
526     STR_POOLNUMRULE_NUM2,
527     STR_POOLNUMRULE_NUM3,
528     STR_POOLNUMRULE_NUM4,
529     STR_POOLNUMRULE_NUM5,
530     STR_POOLNUMRULE_BUL1,
531     STR_POOLNUMRULE_BUL2,
532     STR_POOLNUMRULE_BUL3,
533     STR_POOLNUMRULE_BUL4,
534     STR_POOLNUMRULE_BUL5
535 };
536 
537 // XXX MUST match the entries of TableStyleProgNameTable in
538 // sw/source/core/doc/SwStyleNameMapper.cxx and MUST match the order of
539 // RES_POOL_TABLESTYLE_TYPE in sw/inc/poolfmt.hxx
540 const TranslateId STR_TABSTYLE_ARY[] =
541 {
542     // XXX MUST be in order, Writer first, then Svx old, then Svx new
543     // 1 Writer resource string
544     STR_TABSTYLE_DEFAULT,
545     // 16 old styles Svx resource strings
546     RID_SVXSTR_TBLAFMT_3D,
547     RID_SVXSTR_TBLAFMT_BLACK1,
548     RID_SVXSTR_TBLAFMT_BLACK2,
549     RID_SVXSTR_TBLAFMT_BLUE,
550     RID_SVXSTR_TBLAFMT_BROWN,
551     RID_SVXSTR_TBLAFMT_CURRENCY,
552     RID_SVXSTR_TBLAFMT_CURRENCY_3D,
553     RID_SVXSTR_TBLAFMT_CURRENCY_GRAY,
554     RID_SVXSTR_TBLAFMT_CURRENCY_LAVENDER,
555     RID_SVXSTR_TBLAFMT_CURRENCY_TURQUOISE,
556     RID_SVXSTR_TBLAFMT_GRAY,
557     RID_SVXSTR_TBLAFMT_GREEN,
558     RID_SVXSTR_TBLAFMT_LAVENDER,
559     RID_SVXSTR_TBLAFMT_RED,
560     RID_SVXSTR_TBLAFMT_TURQUOISE,
561     RID_SVXSTR_TBLAFMT_YELLOW,
562     // 10 new styles since LibreOffice 6.0 Svx resource strings
563     RID_SVXSTR_TBLAFMT_LO6_ACADEMIC,
564     RID_SVXSTR_TBLAFMT_LO6_BOX_LIST_BLUE,
565     RID_SVXSTR_TBLAFMT_LO6_BOX_LIST_GREEN,
566     RID_SVXSTR_TBLAFMT_LO6_BOX_LIST_RED,
567     RID_SVXSTR_TBLAFMT_LO6_BOX_LIST_YELLOW,
568     RID_SVXSTR_TBLAFMT_LO6_ELEGANT,
569     RID_SVXSTR_TBLAFMT_LO6_FINANCIAL,
570     RID_SVXSTR_TBLAFMT_LO6_SIMPLE_GRID_COLUMNS,
571     RID_SVXSTR_TBLAFMT_LO6_SIMPLE_GRID_ROWS,
572     RID_SVXSTR_TBLAFMT_LO6_SIMPLE_LIST_SHADED
573 };
574 
575 namespace sw
576 {
577 
DocumentStylePoolManager(SwDoc & i_rSwdoc)578 DocumentStylePoolManager::DocumentStylePoolManager( SwDoc& i_rSwdoc ) : m_rDoc( i_rSwdoc )
579 {
580 }
581 
GetTextCollFromPool(sal_uInt16 nId,bool bRegardLanguage)582 SwTextFormatColl* DocumentStylePoolManager::GetTextCollFromPool( sal_uInt16 nId, bool bRegardLanguage )
583 {
584     OSL_ENSURE(
585         (RES_POOLCOLL_TEXT_BEGIN <= nId && nId < RES_POOLCOLL_TEXT_END) ||
586         (RES_POOLCOLL_LISTS_BEGIN <= nId && nId < RES_POOLCOLL_LISTS_END) ||
587         (RES_POOLCOLL_EXTRA_BEGIN <= nId && nId < RES_POOLCOLL_EXTRA_END) ||
588         (RES_POOLCOLL_REGISTER_BEGIN <= nId && nId < RES_POOLCOLL_REGISTER_END) ||
589         (RES_POOLCOLL_DOC_BEGIN <= nId && nId < RES_POOLCOLL_DOC_END) ||
590         (RES_POOLCOLL_HTML_BEGIN <= nId && nId < RES_POOLCOLL_HTML_END),
591             "Wrong  AutoFormat Id" );
592 
593     SwTextFormatColl* pNewColl;
594     sal_uInt16 nOutLvlBits = 0;
595 
596     for (size_t n = 0, nSize = m_rDoc.GetTextFormatColls()->size(); n < nSize; ++n)
597     {
598         pNewColl = (*m_rDoc.GetTextFormatColls())[ n ];
599         if( nId == pNewColl->GetPoolFormatId() )
600         {
601             // in online we can have multiple languages, use translated name
602             if (comphelper::LibreOfficeKit::isActive())
603             {
604                 OUString aName;
605                 SwStyleNameMapper::GetUIName(nId, aName);
606                 if (!aName.isEmpty())
607                     pNewColl->SetFormatName(aName);
608             }
609 
610             return pNewColl;
611         }
612 
613         if( pNewColl->IsAssignedToListLevelOfOutlineStyle())
614             nOutLvlBits |= ( 1 << pNewColl->GetAssignedOutlineStyleLevel() );
615     }
616 
617     // Didn't find it until here -> create anew
618     TranslateId pResId;
619     if (RES_POOLCOLL_TEXT_BEGIN <= nId && nId < RES_POOLCOLL_TEXT_END)
620     {
621         static_assert(SAL_N_ELEMENTS(STR_POOLCOLL_TEXT_ARY) == RES_POOLCOLL_TEXT_END - RES_POOLCOLL_TEXT_BEGIN, "### unexpected size!");
622         pResId = STR_POOLCOLL_TEXT_ARY[nId - RES_POOLCOLL_TEXT_BEGIN];
623     }
624     else if (RES_POOLCOLL_LISTS_BEGIN <= nId && nId < RES_POOLCOLL_LISTS_END)
625     {
626         static_assert(SAL_N_ELEMENTS(STR_POOLCOLL_LISTS_ARY) == RES_POOLCOLL_LISTS_END - RES_POOLCOLL_LISTS_BEGIN, "### unexpected size!");
627         pResId = STR_POOLCOLL_LISTS_ARY[nId - RES_POOLCOLL_LISTS_BEGIN];
628     }
629     else if (RES_POOLCOLL_EXTRA_BEGIN <= nId && nId < RES_POOLCOLL_EXTRA_END)
630     {
631         static_assert(SAL_N_ELEMENTS(STR_POOLCOLL_EXTRA_ARY) == RES_POOLCOLL_EXTRA_END - RES_POOLCOLL_EXTRA_BEGIN, "### unexpected size!");
632         pResId = STR_POOLCOLL_EXTRA_ARY[nId - RES_POOLCOLL_EXTRA_BEGIN];
633     }
634     else if (RES_POOLCOLL_REGISTER_BEGIN <= nId && nId < RES_POOLCOLL_REGISTER_END)
635     {
636         static_assert(SAL_N_ELEMENTS(STR_POOLCOLL_REGISTER_ARY) == RES_POOLCOLL_REGISTER_END - RES_POOLCOLL_REGISTER_BEGIN, "### unexpected size!");
637         pResId = STR_POOLCOLL_REGISTER_ARY[nId - RES_POOLCOLL_REGISTER_BEGIN];
638     }
639     else if (RES_POOLCOLL_DOC_BEGIN <= nId && nId < RES_POOLCOLL_DOC_END)
640     {
641         static_assert(SAL_N_ELEMENTS(STR_POOLCOLL_DOC_ARY) == RES_POOLCOLL_DOC_END - RES_POOLCOLL_DOC_BEGIN, "### unexpected size!");
642         pResId = STR_POOLCOLL_DOC_ARY[nId - RES_POOLCOLL_DOC_BEGIN];
643     }
644     else if (RES_POOLCOLL_HTML_BEGIN <= nId && nId < RES_POOLCOLL_HTML_END)
645     {
646         static_assert(SAL_N_ELEMENTS(STR_POOLCOLL_HTML_ARY) == RES_POOLCOLL_HTML_END - RES_POOLCOLL_HTML_BEGIN, "### unexpected size!");
647         pResId = STR_POOLCOLL_HTML_ARY[nId - RES_POOLCOLL_HTML_BEGIN];
648     }
649 
650     OSL_ENSURE(pResId, "Invalid Pool ID");
651     if (!pResId)
652         return GetTextCollFromPool(RES_POOLCOLL_STANDARD);
653 
654     OUString aNm(SwResId(pResId));
655 
656     // A Set for all to-be-set Attributes
657     SwAttrSet aSet( m_rDoc.GetAttrPool(), aTextFormatCollSetRange );
658     sal_uInt16 nParent = GetPoolParent( nId );
659 
660     {
661 
662         if(::IsConditionalByPoolId( nId ))
663             pNewColl = new SwConditionTextFormatColl( m_rDoc.GetAttrPool(), aNm, !nParent
664                                                 ? m_rDoc.GetDfltTextFormatColl()
665                                                 : GetTextCollFromPool( nParent ));
666         else
667             pNewColl = new SwTextFormatColl( m_rDoc.GetAttrPool(), aNm, !nParent
668                                             ? m_rDoc.GetDfltTextFormatColl()
669                                             : GetTextCollFromPool( nParent ));
670         pNewColl->SetPoolFormatId( nId );
671         m_rDoc.GetTextFormatColls()->push_back( pNewColl );
672     }
673 
674     bool bNoDefault = m_rDoc.GetDocumentSettingManager().get( DocumentSettingId::STYLES_NODEFAULT );
675     if ( !bNoDefault )
676     {
677         switch( nId )
678         {
679         // General content forms
680         case RES_POOLCOLL_STANDARD:
681             /* koreans do not like SvxScriptItem(TRUE) */
682             if (bRegardLanguage)
683             {
684                 LanguageType nAppLanguage = GetAppLanguage();
685                 if (GetDefaultFrameDirection(nAppLanguage) ==
686                     SvxFrameDirection::Horizontal_RL_TB)
687                 {
688                     SvxAdjustItem aAdjust(SvxAdjust::Right, RES_PARATR_ADJUST );
689                     aSet.Put(aAdjust);
690                 }
691                 if (nAppLanguage == LANGUAGE_KOREAN)
692                 {
693                     SvxScriptSpaceItem aScriptSpace(false, RES_PARATR_SCRIPTSPACE);
694                     aSet.Put(aScriptSpace);
695                 }
696             }
697             break;
698 
699         case RES_POOLCOLL_TEXT:                 // Text body
700             {
701                 SvxLineSpacingItem aLSpc( LINE_SPACE_DEFAULT_HEIGHT, RES_PARATR_LINESPACING );
702                 SvxULSpaceItem aUL( 0, PT_7, RES_UL_SPACE );
703                 aLSpc.SetPropLineSpace( 115 );
704                 if( m_rDoc.GetDocumentSettingManager().get(DocumentSettingId::HTML_MODE) ) aUL.SetLower( HTML_PARSPACE );
705                 aSet.Put( aUL );
706                 aSet.Put( aLSpc );
707             }
708             break;
709         case RES_POOLCOLL_TEXT_IDENT:           // Text body indentation
710             {
711                 auto const first(o3tl::convert(5, o3tl::Length::mm, o3tl::Length::twip));
712                 SvxFirstLineIndentItem const firstLine(first, RES_MARGIN_FIRSTLINE);
713                 SvxTextLeftMarginItem const leftMargin(0, RES_MARGIN_TEXTLEFT);
714                 aSet.Put(firstLine);
715                 aSet.Put(leftMargin);
716             }
717             break;
718         case RES_POOLCOLL_TEXT_NEGIDENT:        // Text body neg. indentation
719             {
720                 auto const first(-o3tl::convert(5, o3tl::Length::mm, o3tl::Length::twip));
721                 auto const left(o3tl::convert(1, o3tl::Length::cm, o3tl::Length::twip));
722                 SvxFirstLineIndentItem const firstLine(first, RES_MARGIN_FIRSTLINE);
723                 SvxTextLeftMarginItem const leftMargin(left, RES_MARGIN_TEXTLEFT);
724                 aSet.Put(firstLine);
725                 aSet.Put(leftMargin);
726 
727                 SvxTabStopItem aTStops(RES_PARATR_TABSTOP);
728                 aTStops.Insert( SvxTabStop( 0 ));
729                 aSet.Put( aTStops );
730             }
731             break;
732         case RES_POOLCOLL_TEXT_MOVE:            // Text body move
733             {
734                 auto const left(o3tl::convert(5, o3tl::Length::mm, o3tl::Length::twip));
735                 SvxFirstLineIndentItem const firstLine(0, RES_MARGIN_FIRSTLINE);
736                 SvxTextLeftMarginItem const leftMargin(left, RES_MARGIN_TEXTLEFT);
737                 aSet.Put(firstLine);
738                 aSet.Put(leftMargin);
739             }
740             break;
741 
742         case RES_POOLCOLL_CONFRONTATION:    // Text body confrontation
743             {
744                 auto const first(-o3tl::convert(45, o3tl::Length::mm, o3tl::Length::twip));
745                 auto const left(o3tl::convert(5, o3tl::Length::cm, o3tl::Length::twip));
746                 SvxFirstLineIndentItem const firstLine(first, RES_MARGIN_FIRSTLINE);
747                 SvxTextLeftMarginItem const leftMargin(left, RES_MARGIN_TEXTLEFT);
748                 aSet.Put(firstLine);
749                 aSet.Put(leftMargin);
750 
751                 SvxTabStopItem aTStops( RES_PARATR_TABSTOP );
752                 aTStops.Insert( SvxTabStop( 0 ));
753                 aSet.Put( aTStops );
754             }
755             break;
756         case RES_POOLCOLL_MARGINAL:         // Text body marginal
757             {
758                 auto const left(o3tl::convert(4, o3tl::Length::cm, o3tl::Length::twip));
759                 SvxFirstLineIndentItem const firstLine(0, RES_MARGIN_FIRSTLINE);
760                 SvxTextLeftMarginItem const leftMargin(left, RES_MARGIN_TEXTLEFT);
761                 aSet.Put(firstLine);
762                 aSet.Put(leftMargin);
763             }
764             break;
765 
766         case RES_POOLCOLL_HEADLINE_BASE:            // Base headline
767             {
768                 static const sal_uInt16 aFontWhich[] =
769                 {   RES_CHRATR_FONT,
770                     RES_CHRATR_CJK_FONT,
771                     RES_CHRATR_CTL_FONT
772                 };
773                 static const sal_uInt16 aLangTypes[] =
774                 {
775                     RES_CHRATR_LANGUAGE,
776                     RES_CHRATR_CJK_LANGUAGE,
777                     RES_CHRATR_CTL_LANGUAGE
778                 };
779                 static const LanguageType aLangs[] =
780                 {
781                     LANGUAGE_ENGLISH_US,
782                     LANGUAGE_ENGLISH_US,
783                     LANGUAGE_ARABIC_SAUDI_ARABIA
784                 };
785                 static const DefaultFontType nFontTypes[] =
786                 {
787                     DefaultFontType::LATIN_HEADING,
788                     DefaultFontType::CJK_HEADING,
789                     DefaultFontType::CTL_HEADING
790                 };
791 
792                 for( int i = 0; i < 3; ++i )
793                 {
794                     LanguageType nLng = static_cast<const SvxLanguageItem&>(m_rDoc.GetDefault( aLangTypes[i] )).GetLanguage();
795                     if( LANGUAGE_DONTKNOW == nLng )
796                         nLng = aLangs[i];
797 
798                     vcl::Font aFnt( OutputDevice::GetDefaultFont( nFontTypes[i],
799                                             nLng, GetDefaultFontFlags::OnlyOne ) );
800 
801                     aSet.Put( SvxFontItem( aFnt.GetFamilyType(), aFnt.GetFamilyName(),
802                                             OUString(), aFnt.GetPitch(),
803                                             aFnt.GetCharSet(), aFontWhich[i] ));
804                 }
805 
806                 SvxFontHeightItem aFntSize( PT_14, 100, RES_CHRATR_FONTSIZE );
807                 SvxULSpaceItem aUL( PT_12, PT_6, RES_UL_SPACE );
808                 if( m_rDoc.GetDocumentSettingManager().get(DocumentSettingId::HTML_MODE) )
809                     aUL.SetLower( HTML_PARSPACE );
810                 aSet.Put( SvxFormatKeepItem( true, RES_KEEP ));
811 
812                 pNewColl->SetNextTextFormatColl( *GetTextCollFromPool( RES_POOLCOLL_TEXT ));
813 
814                 aSet.Put( aUL );
815                 SetAllScriptItem( aSet, aFntSize );
816             }
817             break;
818 
819         case RES_POOLCOLL_NUMBER_BULLET_BASE:          // Base Numbering
820             break;
821 
822         case RES_POOLCOLL_GREETING:             // Greeting
823         case RES_POOLCOLL_REGISTER_BASE:        // Base indexes
824         case RES_POOLCOLL_SIGNATURE:            // Signatures
825         case RES_POOLCOLL_TABLE:                // Table content
826             {
827                 SwFormatLineNumber aLN;
828                 aLN.SetCountLines( false );
829                 aSet.Put( aLN );
830                 if (nId == RES_POOLCOLL_TABLE)
831                 {
832                     aSet.Put( SvxWidowsItem( 0, RES_PARATR_WIDOWS ) );
833                     aSet.Put( SvxOrphansItem( 0, RES_PARATR_ORPHANS ) );
834                 }
835             }
836             break;
837 
838         case RES_POOLCOLL_HEADLINE1:        // Heading 1
839             {
840                 SvxULSpaceItem aUL( PT_12, PT_6, RES_UL_SPACE );
841                 aSet.Put( aUL );
842                 lcl_SetHeadline( m_rDoc, pNewColl, aSet, nOutLvlBits, 0, false );
843             }
844             break;
845         case RES_POOLCOLL_HEADLINE2:        // Heading 2
846             {
847                 SvxULSpaceItem aUL( PT_10, PT_6, RES_UL_SPACE );
848                 aSet.Put( aUL );
849                 lcl_SetHeadline( m_rDoc, pNewColl, aSet, nOutLvlBits, 1, false );
850             }
851             break;
852         case RES_POOLCOLL_HEADLINE3:        // Heading 3
853             {
854                 SvxULSpaceItem aUL( PT_7, PT_6, RES_UL_SPACE );
855                 aSet.Put( aUL );
856                 lcl_SetHeadline( m_rDoc, pNewColl, aSet, nOutLvlBits, 2, false );
857             }
858             break;
859         case RES_POOLCOLL_HEADLINE4:        // Heading 4
860             {
861                 SvxULSpaceItem aUL( PT_6, PT_6, RES_UL_SPACE );
862                 aSet.Put( aUL );
863                 lcl_SetHeadline( m_rDoc, pNewColl, aSet, nOutLvlBits, 3, true );
864             }
865             break;
866         case RES_POOLCOLL_HEADLINE5:        // Heading 5
867             {
868                 SvxULSpaceItem aUL( PT_6, PT_3, RES_UL_SPACE );
869                 aSet.Put( aUL );
870                 lcl_SetHeadline( m_rDoc, pNewColl, aSet, nOutLvlBits, 4, false );
871             }
872             break;
873         case RES_POOLCOLL_HEADLINE6:        // Heading 6
874             {
875                 SvxULSpaceItem aUL( PT_3, PT_3, RES_UL_SPACE );
876                 aSet.Put( aUL );
877                 lcl_SetHeadline( m_rDoc, pNewColl, aSet, nOutLvlBits, 5, true );
878             }
879             break;
880         case RES_POOLCOLL_HEADLINE7:        // Heading 7
881             {
882                 SvxULSpaceItem aUL( PT_3, PT_3, RES_UL_SPACE );
883                 aSet.Put( aUL );
884                 lcl_SetHeadline( m_rDoc, pNewColl, aSet, nOutLvlBits, 6, false );
885             }
886             break;
887         case RES_POOLCOLL_HEADLINE8:        // Heading 8
888             {
889                 SvxULSpaceItem aUL( PT_3, PT_3, RES_UL_SPACE );
890                 aSet.Put( aUL );
891                 lcl_SetHeadline( m_rDoc, pNewColl, aSet, nOutLvlBits, 7, true );
892             }
893             break;
894         case RES_POOLCOLL_HEADLINE9:        // Heading 9
895             {
896                 SvxULSpaceItem aUL( PT_3, PT_3, RES_UL_SPACE );
897                 aSet.Put( aUL );
898                 lcl_SetHeadline( m_rDoc, pNewColl, aSet, nOutLvlBits, 8, false );
899             }
900             break;
901         case RES_POOLCOLL_HEADLINE10:       // Heading 10
902             {
903                 SvxULSpaceItem aUL( PT_3, PT_3, RES_UL_SPACE );
904                 aSet.Put( aUL );
905                 lcl_SetHeadline( m_rDoc, pNewColl, aSet, nOutLvlBits, 9, false );
906             }
907             break;
908 
909         // Special sections:
910         // Header
911         case RES_POOLCOLL_HEADERFOOTER:
912         case RES_POOLCOLL_HEADER:
913         case RES_POOLCOLL_HEADERL:
914         case RES_POOLCOLL_HEADERR:
915         // Footer
916         case RES_POOLCOLL_FOOTER:
917         case RES_POOLCOLL_FOOTERL:
918         case RES_POOLCOLL_FOOTERR:
919             {
920                 SwFormatLineNumber aLN;
921                 aLN.SetCountLines( false );
922                 aSet.Put( aLN );
923 
924                 tools::Long nRightMargin = lcl_GetRightMargin( m_rDoc );
925 
926                 SvxTabStopItem aTStops( 0, 0, SvxTabAdjust::Default, RES_PARATR_TABSTOP );
927                 aTStops.Insert( SvxTabStop( nRightMargin / 2, SvxTabAdjust::Center ) );
928                 aTStops.Insert( SvxTabStop( nRightMargin, SvxTabAdjust::Right ) );
929 
930                 aSet.Put( aTStops );
931 
932                 if ( (nId==RES_POOLCOLL_HEADERR) || (nId==RES_POOLCOLL_FOOTERR) ) {
933                     SvxAdjustItem aAdjust(SvxAdjust::Right, RES_PARATR_ADJUST );
934                     aSet.Put(aAdjust);
935                 }
936             }
937             break;
938 
939         case RES_POOLCOLL_TABLE_HDLN:
940             {
941                 SetAllScriptItem( aSet, SvxWeightItem( WEIGHT_BOLD, RES_CHRATR_WEIGHT ) );
942                 aSet.Put( SvxAdjustItem( SvxAdjust::Center, RES_PARATR_ADJUST ) );
943                 SwFormatLineNumber aLN;
944                 aLN.SetCountLines( false );
945                 aSet.Put( aLN );
946             }
947             break;
948 
949         case RES_POOLCOLL_FOOTNOTE:             // paragraph style Footnote
950         case RES_POOLCOLL_ENDNOTE:              // paragraph style Endnote
951             {
952                 auto const first(-o3tl::convert(6, o3tl::Length::mm, o3tl::Length::twip));
953                 auto const left(o3tl::convert(6, o3tl::Length::mm, o3tl::Length::twip));
954                 SvxFirstLineIndentItem const firstLine(first, RES_MARGIN_FIRSTLINE);
955                 SvxTextLeftMarginItem const leftMargin(left, RES_MARGIN_TEXTLEFT);
956                 aSet.Put(firstLine);
957                 aSet.Put(leftMargin);
958 
959                 SetAllScriptItem( aSet, SvxFontHeightItem( PT_10, 100, RES_CHRATR_FONTSIZE ) );
960                 SwFormatLineNumber aLN;
961                 aLN.SetCountLines( false );
962                 aSet.Put( aLN );
963             }
964             break;
965 
966         case RES_POOLCOLL_LABEL:                // basic caption
967             {
968                 SvxULSpaceItem aUL( RES_UL_SPACE );
969                 aUL.SetUpper( PT_6 );
970                 aUL.SetLower( PT_6 );
971                 aSet.Put( aUL );
972                 SetAllScriptItem( aSet, SvxPostureItem( ITALIC_NORMAL, RES_CHRATR_POSTURE ) );
973                 SetAllScriptItem( aSet, SvxFontHeightItem( PT_10, 100, RES_CHRATR_FONTSIZE ) );
974                 SwFormatLineNumber aLN;
975                 aLN.SetCountLines( false );
976                 aSet.Put( aLN );
977             }
978             break;
979 
980         case RES_POOLCOLL_FRAME:                // Frame content
981         case RES_POOLCOLL_LABEL_ABB:            // caption image
982         case RES_POOLCOLL_LABEL_TABLE:          // caption table
983         case RES_POOLCOLL_LABEL_FRAME:          // caption frame
984         case RES_POOLCOLL_LABEL_DRAWING:        // caption drawing
985         case RES_POOLCOLL_LABEL_FIGURE:
986             break;
987 
988         case RES_POOLCOLL_ENVELOPE_ADDRESS:          // envelope address
989             {
990                 SvxULSpaceItem aUL( RES_UL_SPACE );
991                 aUL.SetLower( PT_3 );
992                 aSet.Put( aUL );
993                 SwFormatLineNumber aLN;
994                 aLN.SetCountLines( false );
995                 aSet.Put( aLN );
996             }
997             break;
998 
999         case RES_POOLCOLL_SEND_ADDRESS:           // Sender address
1000             {
1001                 if( m_rDoc.GetDocumentSettingManager().get(DocumentSettingId::HTML_MODE) )
1002                     SetAllScriptItem( aSet, SvxPostureItem(ITALIC_NORMAL, RES_CHRATR_POSTURE) );
1003                 else
1004                 {
1005                     SvxULSpaceItem aUL( RES_UL_SPACE ); aUL.SetLower( PT_3 );
1006                     aSet.Put( aUL );
1007                 }
1008                 SwFormatLineNumber aLN;
1009                 aLN.SetCountLines( false );
1010                 aSet.Put( aLN );
1011             }
1012             break;
1013 
1014         case RES_POOLCOLL_COMMENT:       // Comment
1015             {
1016                 SetAllScriptItem(aSet, SvxFontHeightItem(PT_10, 100, RES_CHRATR_FONTSIZE));
1017 
1018                 auto const aIndent(o3tl::convert(0.1, o3tl::Length::cm, o3tl::Length::twip));
1019                 SvxTextLeftMarginItem const leftMargin(aIndent, RES_MARGIN_TEXTLEFT);
1020                 SvxRightMarginItem const rightMargin(aIndent, RES_MARGIN_RIGHT);
1021                 aSet.Put(leftMargin);
1022                 aSet.Put(rightMargin);
1023 
1024                 auto const aSpacing(o3tl::convert(0.1, o3tl::Length::cm, o3tl::Length::twip));
1025                 SvxULSpaceItem topSpacing( aSpacing, 0, RES_UL_SPACE );
1026                 aSet.Put(topSpacing);
1027             }
1028             break;
1029 
1030         // User defined indexes:
1031         case RES_POOLCOLL_TOX_USERH:            // Header
1032             lcl_SetRegister( m_rDoc, aSet, 0, true, false );
1033             {
1034                 SwFormatLineNumber aLN;
1035                 aLN.SetCountLines( false );
1036                 aSet.Put( aLN );
1037             }
1038             break;
1039         case RES_POOLCOLL_TOX_USER1:            // 1st level
1040             lcl_SetRegister( m_rDoc, aSet, 0, false, true );
1041             break;
1042         case RES_POOLCOLL_TOX_USER2:            // 2nd level
1043             lcl_SetRegister( m_rDoc, aSet, 1, false, true );
1044             break;
1045         case RES_POOLCOLL_TOX_USER3:            // 3rd level
1046             lcl_SetRegister( m_rDoc, aSet, 2, false, true );
1047             break;
1048         case RES_POOLCOLL_TOX_USER4:            // 4th level
1049             lcl_SetRegister( m_rDoc, aSet, 3, false, true );
1050             break;
1051         case RES_POOLCOLL_TOX_USER5:            // 5th level
1052             lcl_SetRegister( m_rDoc, aSet, 4, false, true );
1053             break;
1054         case RES_POOLCOLL_TOX_USER6:            // 6th level
1055             lcl_SetRegister( m_rDoc, aSet, 5, false, true );
1056             break;
1057         case RES_POOLCOLL_TOX_USER7:            // 7th level
1058             lcl_SetRegister( m_rDoc, aSet, 6, false, true );
1059             break;
1060         case RES_POOLCOLL_TOX_USER8:            // 8th level
1061             lcl_SetRegister( m_rDoc, aSet, 7, false, true );
1062             break;
1063         case RES_POOLCOLL_TOX_USER9:            // 9th level
1064             lcl_SetRegister( m_rDoc, aSet, 8, false, true );
1065             break;
1066         case RES_POOLCOLL_TOX_USER10:           // 10th level
1067             lcl_SetRegister( m_rDoc, aSet, 9, false, true );
1068             break;
1069 
1070         // Index
1071         case RES_POOLCOLL_TOX_IDXH:         // Header
1072             lcl_SetRegister( m_rDoc, aSet, 0, true, false );
1073             {
1074                 SwFormatLineNumber aLN;
1075                 aLN.SetCountLines( false );
1076                 aSet.Put( aLN );
1077             }
1078             break;
1079         case RES_POOLCOLL_TOX_IDX1:         // 1st level
1080             lcl_SetRegister( m_rDoc, aSet, 0, false, false );
1081             break;
1082         case RES_POOLCOLL_TOX_IDX2:         // 2nd level
1083             lcl_SetRegister( m_rDoc, aSet, 1, false, false );
1084             break;
1085         case RES_POOLCOLL_TOX_IDX3:         // 3rd level
1086             lcl_SetRegister( m_rDoc, aSet, 2, false, false );
1087             break;
1088         case RES_POOLCOLL_TOX_IDXBREAK:     // Separator
1089             lcl_SetRegister( m_rDoc, aSet, 0, false, false );
1090             break;
1091 
1092         // Table of Content
1093         case RES_POOLCOLL_TOX_CNTNTH:       // Header
1094             lcl_SetRegister( m_rDoc, aSet, 0, true, false );
1095             {
1096                 SwFormatLineNumber aLN;
1097                 aLN.SetCountLines( false );
1098                 aSet.Put( aLN );
1099             }
1100             break;
1101         case RES_POOLCOLL_TOX_CNTNT1:       // 1st level
1102             lcl_SetRegister( m_rDoc, aSet, 0, false, true );
1103             break;
1104         case RES_POOLCOLL_TOX_CNTNT2:       // 2nd level
1105             lcl_SetRegister( m_rDoc, aSet, 1, false, true );
1106             break;
1107         case RES_POOLCOLL_TOX_CNTNT3:       // 3rd level
1108             lcl_SetRegister( m_rDoc, aSet, 2, false, true );
1109             break;
1110         case RES_POOLCOLL_TOX_CNTNT4:       // 4th level
1111             lcl_SetRegister( m_rDoc, aSet, 3, false, true );
1112             break;
1113         case RES_POOLCOLL_TOX_CNTNT5:       // 5th level
1114             lcl_SetRegister( m_rDoc, aSet, 4, false, true );
1115             break;
1116         case RES_POOLCOLL_TOX_CNTNT6:       // 6th level
1117             lcl_SetRegister( m_rDoc, aSet, 5, false, true );
1118             break;
1119         case RES_POOLCOLL_TOX_CNTNT7:       // 7th level
1120             lcl_SetRegister( m_rDoc, aSet, 6, false, true );
1121             break;
1122         case RES_POOLCOLL_TOX_CNTNT8:       // 8th level
1123             lcl_SetRegister( m_rDoc, aSet, 7, false, true );
1124             break;
1125         case RES_POOLCOLL_TOX_CNTNT9:       // 9th level
1126             lcl_SetRegister( m_rDoc, aSet, 8, false, true );
1127             break;
1128         case RES_POOLCOLL_TOX_CNTNT10:      // 10th level
1129             lcl_SetRegister( m_rDoc, aSet, 9, false, true );
1130             break;
1131 
1132         case RES_POOLCOLL_TOX_ILLUSH:
1133         case RES_POOLCOLL_TOX_OBJECTH:
1134         case RES_POOLCOLL_TOX_TABLESH:
1135         case RES_POOLCOLL_TOX_AUTHORITIESH:
1136             lcl_SetRegister( m_rDoc, aSet, 0, true, false );
1137             {
1138                 SwFormatLineNumber aLN;
1139                 aLN.SetCountLines( false );
1140                 aSet.Put( aLN );
1141             }
1142             break;
1143         case RES_POOLCOLL_TOX_ILLUS1:
1144         case RES_POOLCOLL_TOX_OBJECT1:
1145         case RES_POOLCOLL_TOX_TABLES1:
1146         case RES_POOLCOLL_TOX_AUTHORITIES1:
1147             lcl_SetRegister( m_rDoc, aSet, 0, false, true );
1148         break;
1149 
1150         case RES_POOLCOLL_NUM_LEVEL1S:
1151             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL1,
1152                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 0 ),
1153                             PT_12, PT_6 );
1154             break;
1155         case RES_POOLCOLL_NUM_LEVEL1:
1156             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL1,
1157                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 0 ),
1158                             0, PT_6 );
1159             break;
1160         case RES_POOLCOLL_NUM_LEVEL1E:
1161             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL1,
1162                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 0 ),
1163                             0, PT_12 );
1164             break;
1165         case RES_POOLCOLL_NUM_NONUM1:
1166             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_NONUM1,
1167                             0, SwNumRule::GetNumIndent( 0 ), 0, PT_6 );
1168             break;
1169         case RES_POOLCOLL_NUM_LEVEL2S:
1170             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL2,
1171                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 1 ),
1172                             PT_12, PT_6 );
1173             break;
1174         case RES_POOLCOLL_NUM_LEVEL2:
1175             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL2,
1176                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 1 ),
1177                             0, PT_6 );
1178             break;
1179         case RES_POOLCOLL_NUM_LEVEL2E:
1180             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL2,
1181                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 1 ),
1182                             0, PT_12 );
1183             break;
1184         case RES_POOLCOLL_NUM_NONUM2:
1185             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_NONUM2,
1186                             0, SwNumRule::GetNumIndent( 1 ), 0, PT_6 );
1187             break;
1188         case RES_POOLCOLL_NUM_LEVEL3S:
1189             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL3,
1190                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 2 ),
1191                             PT_12, PT_6 );
1192             break;
1193         case RES_POOLCOLL_NUM_LEVEL3:
1194             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL3,
1195                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 2 ),
1196                             0, PT_6 );
1197             break;
1198         case RES_POOLCOLL_NUM_LEVEL3E:
1199             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL3,
1200                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 2 ),
1201                             0, PT_12 );
1202             break;
1203         case RES_POOLCOLL_NUM_NONUM3:
1204             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_NONUM3,
1205                             0, SwNumRule::GetNumIndent( 2 ), 0, PT_6 );
1206             break;
1207         case RES_POOLCOLL_NUM_LEVEL4S:
1208             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL4,
1209                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 3 ),
1210                             PT_12, PT_6 );
1211             break;
1212         case RES_POOLCOLL_NUM_LEVEL4:
1213             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL4,
1214                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 3 ),
1215                             0, PT_6 );
1216             break;
1217         case RES_POOLCOLL_NUM_LEVEL4E:
1218             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL4,
1219                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 3 ),
1220                             0, PT_12 );
1221             break;
1222         case RES_POOLCOLL_NUM_NONUM4:
1223             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_NONUM4,
1224                             0, SwNumRule::GetNumIndent( 3 ), 0, PT_6 );
1225             break;
1226         case RES_POOLCOLL_NUM_LEVEL5S:
1227             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL5,
1228                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 4 ),
1229                             PT_12, PT_6 );
1230             break;
1231         case RES_POOLCOLL_NUM_LEVEL5:
1232             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL5,
1233                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 4 ),
1234                             0, PT_6 );
1235             break;
1236         case RES_POOLCOLL_NUM_LEVEL5E:
1237             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_LEVEL5,
1238                             lNumberFirstLineOffset, SwNumRule::GetNumIndent( 4 ),
1239                             0, PT_12 );
1240             break;
1241         case RES_POOLCOLL_NUM_NONUM5:
1242             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_NUM_NONUM5,
1243                             0, SwNumRule::GetNumIndent( 4 ), 0, PT_6 );
1244             break;
1245 
1246         case RES_POOLCOLL_BULLET_LEVEL1S:
1247             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL1,
1248                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 0 ),
1249                             PT_12, PT_6 );
1250             break;
1251         case RES_POOLCOLL_BULLET_LEVEL1:
1252             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL1,
1253                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 0 ),
1254                             0, PT_6 );
1255             break;
1256         case RES_POOLCOLL_BULLET_LEVEL1E:
1257             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL1,
1258                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 0 ),
1259                             0, PT_12 );
1260             break;
1261         case RES_POOLCOLL_BULLET_NONUM1:
1262             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_NONUM1,
1263                             0, SwNumRule::GetBullIndent( 0 ), 0, PT_6 );
1264             break;
1265         case RES_POOLCOLL_BULLET_LEVEL2S:
1266             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL2,
1267                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 1 ),
1268                             PT_12, PT_6 );
1269             break;
1270         case RES_POOLCOLL_BULLET_LEVEL2:
1271             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL2,
1272                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 1 ),
1273                             0, PT_6 );
1274             break;
1275         case RES_POOLCOLL_BULLET_LEVEL2E:
1276             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL2,
1277                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 1 ),
1278                             0, PT_12 );
1279             break;
1280         case RES_POOLCOLL_BULLET_NONUM2:
1281             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_NONUM2,
1282                             0, SwNumRule::GetBullIndent( 1 ), 0, PT_6 );
1283             break;
1284         case RES_POOLCOLL_BULLET_LEVEL3S:
1285             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL3,
1286                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 2 ),
1287                             PT_12, PT_6 );
1288             break;
1289         case RES_POOLCOLL_BULLET_LEVEL3:
1290             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL3,
1291                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 2 ),
1292                             0, PT_6 );
1293             break;
1294         case RES_POOLCOLL_BULLET_LEVEL3E:
1295             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL3,
1296                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 2 ),
1297                             0, PT_12 );
1298             break;
1299         case RES_POOLCOLL_BULLET_NONUM3:
1300             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_NONUM3,
1301                             0, SwNumRule::GetBullIndent( 2 ), 0, PT_6 );
1302             break;
1303         case RES_POOLCOLL_BULLET_LEVEL4S:
1304             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL4,
1305                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 3 ),
1306                             PT_12, PT_6 );
1307             break;
1308         case RES_POOLCOLL_BULLET_LEVEL4:
1309             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL4,
1310                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 3 ),
1311                             0, PT_6 );
1312             break;
1313         case RES_POOLCOLL_BULLET_LEVEL4E:
1314             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL4,
1315                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 3 ),
1316                             0, PT_12 );
1317             break;
1318         case RES_POOLCOLL_BULLET_NONUM4:
1319             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_NONUM4,
1320                             0, SwNumRule::GetBullIndent( 3 ), 0, PT_6 );
1321             break;
1322         case RES_POOLCOLL_BULLET_LEVEL5S:
1323             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL5,
1324                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 4 ),
1325                             PT_12, PT_6 );
1326             break;
1327         case RES_POOLCOLL_BULLET_LEVEL5:
1328             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL5,
1329                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 4 ),
1330                             0, PT_6 );
1331             break;
1332         case RES_POOLCOLL_BULLET_LEVEL5E:
1333             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_LEVEL5,
1334                             lBulletFirstLineOffset, SwNumRule::GetBullIndent( 4 ),
1335                             0, PT_12 );
1336             break;
1337         case RES_POOLCOLL_BULLET_NONUM5:
1338             lcl_SetNumBul( m_rDoc, pNewColl, aSet, RES_POOLCOLL_BULLET_NONUM5,
1339                             0, SwNumRule::GetBullIndent( 4 ), 0, PT_6 );
1340             break;
1341 
1342         case RES_POOLCOLL_DOC_TITLE:            // Document Title
1343             {
1344                 SetAllScriptItem( aSet, SvxWeightItem( WEIGHT_BOLD, RES_CHRATR_WEIGHT ) );
1345                 SetAllScriptItem( aSet, SvxFontHeightItem( PT_28, 100, RES_CHRATR_FONTSIZE ) );
1346 
1347                 aSet.Put( SvxAdjustItem( SvxAdjust::Center, RES_PARATR_ADJUST ) );
1348 
1349                 pNewColl->SetNextTextFormatColl( *GetTextCollFromPool( RES_POOLCOLL_TEXT ));
1350             }
1351             break;
1352 
1353         case RES_POOLCOLL_DOC_SUBTITLE:         // Document subtitle
1354             {
1355                 SvxULSpaceItem aUL( PT_3, PT_6, RES_UL_SPACE );
1356                 aSet.Put( aUL );
1357                 SetAllScriptItem( aSet, SvxFontHeightItem( PT_18, 100, RES_CHRATR_FONTSIZE ));
1358 
1359                 aSet.Put( SvxAdjustItem( SvxAdjust::Center, RES_PARATR_ADJUST ));
1360 
1361                 pNewColl->SetNextTextFormatColl( *GetTextCollFromPool( RES_POOLCOLL_TEXT ));
1362             }
1363             break;
1364 
1365         case RES_POOLCOLL_DOC_APPENDIX:         // Document Appendix tdf#114090
1366             {
1367                 SetAllScriptItem( aSet, SvxWeightItem( WEIGHT_BOLD, RES_CHRATR_WEIGHT ) );
1368                 SetAllScriptItem( aSet, SvxFontHeightItem( PT_16, 100, RES_CHRATR_FONTSIZE ) );
1369 
1370                 aSet.Put( SvxAdjustItem( SvxAdjust::Center, RES_PARATR_ADJUST ) );
1371 
1372                 pNewColl->SetNextTextFormatColl( *GetTextCollFromPool( RES_POOLCOLL_TEXT ));
1373             }
1374             break;
1375 
1376         case RES_POOLCOLL_HTML_BLOCKQUOTE:
1377             {
1378                 auto const left(o3tl::convert(1, o3tl::Length::cm, o3tl::Length::twip));
1379                 auto const right(o3tl::convert(1, o3tl::Length::cm, o3tl::Length::twip));
1380                 SvxFirstLineIndentItem const firstLine(0, RES_MARGIN_FIRSTLINE);
1381                 SvxTextLeftMarginItem const leftMargin(left, RES_MARGIN_TEXTLEFT);
1382                 SvxRightMarginItem const rightMargin(right, RES_MARGIN_RIGHT);
1383                 aSet.Put(firstLine);
1384                 aSet.Put(leftMargin);
1385                 aSet.Put(rightMargin);
1386 
1387                 std::unique_ptr<SvxULSpaceItem> aUL(pNewColl->GetULSpace().Clone());
1388                 aUL->SetLower( HTML_PARSPACE );
1389                 aSet.Put(std::move(aUL));
1390             }
1391             break;
1392 
1393         case RES_POOLCOLL_HTML_PRE:
1394             {
1395                 ::lcl_SetDfltFont( DefaultFontType::FIXED, aSet );
1396 
1397                 // WORKAROUND: Set PRE to 10pt
1398                 SetAllScriptItem( aSet, SvxFontHeightItem(PT_10, 100, RES_CHRATR_FONTSIZE) );
1399 
1400                 // The lower paragraph distance is set explicitly (makes
1401                 // assigning hard attributes easier)
1402                 std::unique_ptr<SvxULSpaceItem> aULSpaceItem(pNewColl->GetULSpace().Clone());
1403                 aULSpaceItem->SetLower( 0 );
1404                 aSet.Put(std::move(aULSpaceItem));
1405             }
1406             break;
1407 
1408         case RES_POOLCOLL_HTML_HR:
1409             {
1410                 SvxBoxItem aBox( RES_BOX );
1411                 Color aColor( COL_GRAY );
1412                 SvxBorderLine aNew(&aColor, 3, SvxBorderLineStyle::DOUBLE);
1413                 aBox.SetLine( &aNew, SvxBoxItemLine::BOTTOM );
1414 
1415                 aSet.Put( aBox );
1416                 aSet.Put( SwParaConnectBorderItem( false ) );
1417                 SetAllScriptItem( aSet, SvxFontHeightItem(120, 100, RES_CHRATR_FONTSIZE) );
1418 
1419                 std::unique_ptr<SvxULSpaceItem> aUL;
1420                 {
1421                     pNewColl->SetNextTextFormatColl( *GetTextCollFromPool( RES_POOLCOLL_TEXT ));
1422                     aUL.reset(pNewColl->GetULSpace().Clone());
1423                 }
1424                 aUL->SetLower( HTML_PARSPACE );
1425                 aSet.Put(std::move(aUL));
1426                 SwFormatLineNumber aLN;
1427                 aLN.SetCountLines( false );
1428                 aSet.Put( aLN );
1429             }
1430             break;
1431 
1432         case RES_POOLCOLL_HTML_DD:
1433             {
1434                 // We indent by 1 cm. The IDs are always 2 away from each other!
1435                 auto const left(o3tl::convert(1, o3tl::Length::cm, o3tl::Length::twip));
1436                 SvxTextLeftMarginItem const leftMargin(left, RES_MARGIN_TEXTLEFT);
1437                 aSet.Put(leftMargin);
1438             }
1439             break;
1440         case RES_POOLCOLL_HTML_DT:
1441             {
1442                 {
1443                     pNewColl->SetNextTextFormatColl( *GetTextCollFromPool( RES_POOLCOLL_HTML_DD ));
1444                 }
1445                 // We indent by 0 cm. The IDs are always 2 away from each other!
1446                 SvxTextLeftMarginItem const leftMargin(0, RES_MARGIN_TEXTLEFT);
1447                 aSet.Put(leftMargin);
1448             }
1449             break;
1450         }
1451     }
1452 
1453     if( aSet.Count() )
1454         pNewColl->SetFormatAttr( aSet );
1455     return pNewColl;
1456 }
1457 
1458 /// Return the AutomaticFormat with the supplied Id. If it doesn't
1459 /// exist, create it.
GetFormatFromPool(sal_uInt16 nId)1460 SwFormat* DocumentStylePoolManager::GetFormatFromPool( sal_uInt16 nId )
1461 {
1462     SwFormat *pNewFormat = nullptr;
1463     SwFormat *pDeriveFormat = nullptr;
1464 
1465     SwFormatsBase* pArray[ 2 ];
1466     sal_uInt16 nArrCnt = 1;
1467     TranslateId pRCId;
1468     WhichRangesContainer const* pWhichRange;
1469 
1470     switch( nId & (COLL_GET_RANGE_BITS + POOLGRP_NOCOLLID) )
1471     {
1472     case POOLGRP_CHARFMT:
1473         {
1474             pArray[0] = m_rDoc.GetCharFormats();
1475             pDeriveFormat = m_rDoc.GetDfltCharFormat();
1476             pWhichRange = &aCharFormatSetRange;
1477 
1478             if (nId >= RES_POOLCHR_HTML_BEGIN && nId < RES_POOLCHR_HTML_END)
1479                 pRCId = STR_POOLCHR_HTML_ARY[nId - RES_POOLCHR_HTML_BEGIN];
1480             else if (nId >= RES_POOLCHR_NORMAL_BEGIN && nId < RES_POOLCHR_NORMAL_END)
1481                 pRCId = STR_POOLCHR_ARY[nId - RES_POOLCHR_BEGIN];
1482             else
1483             {
1484                 // Fault: unknown Format, but a CharFormat -> return the first one
1485                 OSL_ENSURE( false, "invalid Id" );
1486                 pRCId = STR_POOLCHR_ARY[0];
1487             }
1488         }
1489         break;
1490     case POOLGRP_FRAMEFMT:
1491         {
1492             pArray[0] = m_rDoc.GetFrameFormats();
1493             pArray[1] = m_rDoc.GetSpzFrameFormats();
1494             pDeriveFormat = m_rDoc.GetDfltFrameFormat();
1495             nArrCnt = 2;
1496             pWhichRange = &aFrameFormatSetRange;
1497 
1498             // Fault: unknown Format, but a FrameFormat
1499             //             -> return the first one
1500             if( RES_POOLFRM_BEGIN > nId || nId >= RES_POOLFRM_END )
1501             {
1502                 OSL_ENSURE( false, "invalid Id" );
1503                 nId = RES_POOLFRM_BEGIN;
1504             }
1505 
1506             pRCId = STR_POOLFRM_ARY[nId - RES_POOLFRM_BEGIN];
1507         }
1508         break;
1509 
1510     default:
1511         // Fault, unknown Format
1512         OSL_ENSURE( nId, "invalid Id" );
1513         return nullptr;
1514     }
1515     OSL_ENSURE(pRCId, "invalid Id");
1516 
1517     while( nArrCnt-- )
1518         for( size_t n = 0; n < (*pArray[nArrCnt]).GetFormatCount(); ++n )
1519         {
1520             pNewFormat = (*pArray[ nArrCnt ] ).GetFormat( n );
1521             if( nId == pNewFormat->GetPoolFormatId() )
1522             {
1523                 return pNewFormat;
1524             }
1525         }
1526 
1527     OUString aNm(SwResId(pRCId));
1528     SwAttrSet aSet(m_rDoc.GetAttrPool(), *pWhichRange);
1529 
1530     {
1531         bool bIsModified = m_rDoc.getIDocumentState().IsModified();
1532 
1533         {
1534             ::sw::UndoGuard const undoGuard(m_rDoc.GetIDocumentUndoRedo());
1535             switch (nId & (COLL_GET_RANGE_BITS + POOLGRP_NOCOLLID) )
1536             {
1537                 case POOLGRP_CHARFMT:
1538                     pNewFormat = m_rDoc.MakeCharFormat_(aNm, pDeriveFormat, false, true);
1539                     break;
1540                 case POOLGRP_FRAMEFMT:
1541                     pNewFormat = m_rDoc.MakeFrameFormat_(aNm, pDeriveFormat, false, true);
1542                     break;
1543                 default:
1544                     break;
1545             }
1546         }
1547 
1548         if( !bIsModified )
1549             m_rDoc.getIDocumentState().ResetModified();
1550         pNewFormat->SetPoolFormatId( nId );
1551         pNewFormat->SetAuto(false);      // no AutoFormat
1552     }
1553 
1554     switch( nId )
1555     {
1556     case RES_POOLCHR_FOOTNOTE:              // Footnote
1557     case RES_POOLCHR_PAGENO:                // Page/Field
1558     case RES_POOLCHR_LABEL:                 // Label
1559     case RES_POOLCHR_DROPCAPS:              // Dropcaps
1560     case RES_POOLCHR_NUM_LEVEL:             // Numbering level
1561     case RES_POOLCHR_TOXJUMP:               // Table of contents jump
1562     case RES_POOLCHR_ENDNOTE:               // Endnote
1563     case RES_POOLCHR_LINENUM:               // Line numbering
1564         break;
1565 
1566     case RES_POOLCHR_ENDNOTE_ANCHOR:        // Endnote anchor
1567     case RES_POOLCHR_FOOTNOTE_ANCHOR:       // Footnote anchor
1568         {
1569             aSet.Put( SvxEscapementItem( DFLT_ESC_AUTO_SUPER, DFLT_ESC_PROP, RES_CHRATR_ESCAPEMENT ) );
1570         }
1571         break;
1572 
1573     case RES_POOLCHR_BULLET_LEVEL:             // Bullet character
1574         {
1575             const vcl::Font& rBulletFont = numfunc::GetDefBulletFont();
1576             SetAllScriptItem( aSet, SvxFontItem( rBulletFont.GetFamilyType(),
1577                         rBulletFont.GetFamilyName(), rBulletFont.GetStyleName(),
1578                         rBulletFont.GetPitch(), rBulletFont.GetCharSet(), RES_CHRATR_FONT ));
1579         }
1580         break;
1581 
1582     case RES_POOLCHR_INET_NORMAL:
1583         {
1584             aSet.Put( SvxColorItem( COL_BLUE, RES_CHRATR_COLOR ) );
1585             aSet.Put( SvxUnderlineItem( LINESTYLE_SINGLE, RES_CHRATR_UNDERLINE ) );
1586         }
1587         break;
1588     case RES_POOLCHR_INET_VISIT:
1589         {
1590             aSet.Put( SvxColorItem( COL_RED, RES_CHRATR_COLOR ) );
1591             aSet.Put( SvxUnderlineItem( LINESTYLE_SINGLE, RES_CHRATR_UNDERLINE ) );
1592         }
1593         break;
1594     case RES_POOLCHR_JUMPEDIT:
1595         {
1596             aSet.Put( SvxColorItem( COL_CYAN, RES_CHRATR_COLOR ) );
1597             aSet.Put( SvxUnderlineItem( LINESTYLE_DOTTED, RES_CHRATR_UNDERLINE ) );
1598             aSet.Put( SvxCaseMapItem( SvxCaseMap::SmallCaps, RES_CHRATR_CASEMAP ) );
1599         }
1600         break;
1601 
1602     case RES_POOLCHR_RUBYTEXT:
1603         {
1604             tools::Long nH = GetDfltAttr( RES_CHRATR_CJK_FONTSIZE )->GetHeight() / 2;
1605             SetAllScriptItem( aSet, SvxFontHeightItem( nH, 100, RES_CHRATR_FONTSIZE));
1606             aSet.Put(SvxUnderlineItem( LINESTYLE_NONE, RES_CHRATR_UNDERLINE ));
1607             aSet.Put(SvxEmphasisMarkItem( FontEmphasisMark::NONE, RES_CHRATR_EMPHASIS_MARK) );
1608         }
1609         break;
1610 
1611     case RES_POOLCHR_HTML_EMPHASIS:
1612     case RES_POOLCHR_HTML_CITATION:
1613     case RES_POOLCHR_HTML_VARIABLE:
1614         {
1615             SetAllScriptItem( aSet, SvxPostureItem( ITALIC_NORMAL, RES_CHRATR_POSTURE) );
1616         }
1617         break;
1618 
1619     case RES_POOLCHR_IDX_MAIN_ENTRY:
1620     case RES_POOLCHR_HTML_STRONG:
1621         {
1622             SetAllScriptItem( aSet, SvxWeightItem( WEIGHT_BOLD, RES_CHRATR_WEIGHT ));
1623         }
1624         break;
1625 
1626     case RES_POOLCHR_HTML_CODE:
1627     case RES_POOLCHR_HTML_SAMPLE:
1628     case RES_POOLCHR_HTML_KEYBOARD:
1629     case RES_POOLCHR_HTML_TELETYPE:
1630         {
1631             ::lcl_SetDfltFont( DefaultFontType::FIXED, aSet );
1632         }
1633         break;
1634     case RES_POOLCHR_VERT_NUM:
1635             aSet.Put( SvxCharRotateItem( 900_deg10, false, RES_CHRATR_ROTATE ) );
1636     break;
1637 
1638     case RES_POOLFRM_FRAME:
1639         {
1640             if ( m_rDoc.GetDocumentSettingManager().get(DocumentSettingId::HTML_MODE) )
1641             {
1642                 aSet.Put( SwFormatAnchor( RndStdIds::FLY_AS_CHAR ));
1643                 aSet.Put( SwFormatVertOrient( 0, text::VertOrientation::LINE_CENTER, text::RelOrientation::PRINT_AREA ) );
1644                 aSet.Put( SwFormatSurround( css::text::WrapTextMode_NONE ) );
1645             }
1646             else
1647             {
1648                 aSet.Put( SwFormatAnchor( RndStdIds::FLY_AT_PARA ));
1649                 aSet.Put( SwFormatSurround( css::text::WrapTextMode_PARALLEL ) );
1650                 aSet.Put( SwFormatHoriOrient( 0, text::HoriOrientation::CENTER, text::RelOrientation::PRINT_AREA ) );
1651                 aSet.Put( SwFormatVertOrient( 0, text::VertOrientation::TOP, text::RelOrientation::PRINT_AREA ) );
1652                 Color aCol( COL_BLACK );
1653                 SvxBorderLine aLine( &aCol, SvxBorderLineWidth::Hairline );
1654                 SvxBoxItem aBox( RES_BOX );
1655                 aBox.SetLine( &aLine, SvxBoxItemLine::TOP );
1656                 aBox.SetLine( &aLine, SvxBoxItemLine::BOTTOM );
1657                 aBox.SetLine( &aLine, SvxBoxItemLine::LEFT );
1658                 aBox.SetLine( &aLine, SvxBoxItemLine::RIGHT );
1659                 aBox.SetAllDistances( 85 );
1660                 aSet.Put( aBox );
1661                 aSet.Put( SvxLRSpaceItem( 114, 114, 0, RES_LR_SPACE ) );
1662                 aSet.Put( SvxULSpaceItem( 114, 114, RES_UL_SPACE ) );
1663             }
1664 
1665             // for styles of FlyFrames do not set the FillStyle to make it a derived attribute
1666             aSet.ClearItem(XATTR_FILLSTYLE);
1667         }
1668         break;
1669     case RES_POOLFRM_GRAPHIC:
1670     case RES_POOLFRM_OLE:
1671         {
1672             aSet.Put( SwFormatAnchor( RndStdIds::FLY_AT_PARA ));
1673             aSet.Put( SwFormatHoriOrient( 0, text::HoriOrientation::CENTER, text::RelOrientation::FRAME ));
1674             aSet.Put( SwFormatVertOrient( 0, text::VertOrientation::TOP, text::RelOrientation::FRAME ));
1675             aSet.Put( SwFormatSurround( css::text::WrapTextMode_DYNAMIC ));
1676         }
1677         break;
1678     case RES_POOLFRM_FORMEL:
1679         {
1680             aSet.Put( SwFormatAnchor( RndStdIds::FLY_AS_CHAR ) );
1681             aSet.Put( SwFormatVertOrient( 0, text::VertOrientation::CHAR_CENTER, text::RelOrientation::FRAME ) );
1682             aSet.Put( SvxLRSpaceItem( 0, 0, 0, RES_LR_SPACE ) );
1683         }
1684         break;
1685     case RES_POOLFRM_MARGINAL:
1686         {
1687             aSet.Put( SwFormatAnchor( RndStdIds::FLY_AT_PARA ));
1688             aSet.Put( SwFormatHoriOrient( 0, text::HoriOrientation::LEFT, text::RelOrientation::FRAME ));
1689             aSet.Put( SwFormatVertOrient( 0, text::VertOrientation::TOP, text::RelOrientation::FRAME ));
1690             aSet.Put( SwFormatSurround( css::text::WrapTextMode_PARALLEL ));
1691             // Set the default width to 3.5 cm, use the minimum value for the height
1692             aSet.Put(SwFormatFrameSize(SwFrameSize::Minimum,
1693                                        o3tl::toTwips(35, o3tl::Length::mm),
1694                                        o3tl::toTwips(5, o3tl::Length::mm)));
1695         }
1696         break;
1697     case RES_POOLFRM_WATERSIGN:
1698         {
1699             aSet.Put( SwFormatAnchor( RndStdIds::FLY_AT_PAGE ));
1700             aSet.Put( SwFormatHoriOrient( 0, text::HoriOrientation::CENTER, text::RelOrientation::FRAME ));
1701             aSet.Put( SwFormatVertOrient( 0, text::VertOrientation::CENTER, text::RelOrientation::FRAME ));
1702             aSet.Put( SvxOpaqueItem( RES_OPAQUE, false ));
1703             aSet.Put( SwFormatSurround( css::text::WrapTextMode_THROUGH ));
1704         }
1705         break;
1706     case RES_POOLFRM_LABEL:
1707         {
1708             aSet.Put( SwFormatAnchor( RndStdIds::FLY_AS_CHAR ) );
1709             aSet.Put( SwFormatVertOrient( 0, text::VertOrientation::TOP, text::RelOrientation::FRAME ) );
1710             aSet.Put( SvxLRSpaceItem( 114, 114, 0, RES_LR_SPACE ) );
1711 
1712             SvxProtectItem aProtect( RES_PROTECT );
1713             aProtect.SetSizeProtect( true );
1714             aProtect.SetPosProtect( true );
1715             aSet.Put( aProtect );
1716 
1717             pNewFormat->SetAutoUpdateOnDirectFormat();
1718         }
1719         break;
1720     }
1721     if( aSet.Count() )
1722     {
1723         pNewFormat->SetFormatAttr( aSet );
1724     }
1725     return pNewFormat;
1726 }
1727 
GetFrameFormatFromPool(sal_uInt16 nId)1728 SwFrameFormat* DocumentStylePoolManager::GetFrameFormatFromPool( sal_uInt16 nId )
1729 {
1730     return static_cast<SwFrameFormat*>(GetFormatFromPool( nId ));
1731 }
1732 
GetCharFormatFromPool(sal_uInt16 nId)1733 SwCharFormat* DocumentStylePoolManager::GetCharFormatFromPool( sal_uInt16 nId )
1734 {
1735     return static_cast<SwCharFormat*>(GetFormatFromPool( nId ));
1736 }
1737 
GetPageDescFromPool(sal_uInt16 nId,bool bRegardLanguage)1738 SwPageDesc* DocumentStylePoolManager::GetPageDescFromPool( sal_uInt16 nId, bool bRegardLanguage )
1739 {
1740     OSL_ENSURE( RES_POOLPAGE_BEGIN <= nId && nId < RES_POOLPAGE_END,
1741             "Wrong AutoFormat Id" );
1742 
1743     for( size_t n = 0; n < m_rDoc.GetPageDescCnt(); ++n )
1744     {
1745         if ( nId == m_rDoc.GetPageDesc(n).GetPoolFormatId() )
1746         {
1747             return &m_rDoc.GetPageDesc(n);
1748         }
1749     }
1750 
1751     if( RES_POOLPAGE_BEGIN > nId ||  nId >= RES_POOLPAGE_END )
1752     {
1753         // unknown page pool ID
1754         OSL_ENSURE( false, "<SwDoc::GetPageDescFromPool(..)> - unknown page pool ID" );
1755         nId = RES_POOLPAGE_BEGIN;
1756     }
1757 
1758     SwPageDesc* pNewPgDsc = nullptr;
1759     {
1760         static_assert(SAL_N_ELEMENTS(STR_POOLPAGE_ARY) == RES_POOLPAGE_END - RES_POOLPAGE_BEGIN, "### unexpected size!");
1761         const OUString aNm(SwResId(STR_POOLPAGE_ARY[nId - RES_POOLPAGE_BEGIN]));
1762         const bool bIsModified = m_rDoc.getIDocumentState().IsModified();
1763 
1764         {
1765             ::sw::UndoGuard const undoGuard(m_rDoc.GetIDocumentUndoRedo());
1766             pNewPgDsc = m_rDoc.MakePageDesc(aNm, nullptr, bRegardLanguage);
1767         }
1768 
1769         pNewPgDsc->SetPoolFormatId( nId );
1770         if ( !bIsModified )
1771         {
1772             m_rDoc.getIDocumentState().ResetModified();
1773         }
1774     }
1775 
1776     SvxLRSpaceItem aLR( RES_LR_SPACE );
1777     {
1778         aLR.SetLeft(o3tl::convert(2, o3tl::Length::cm, o3tl::Length::twip));
1779         aLR.SetRight( aLR.GetLeft() );
1780     }
1781     SvxULSpaceItem aUL( RES_UL_SPACE );
1782     {
1783         aUL.SetUpper( o3tl::narrowing<sal_uInt16>(aLR.GetLeft()) );
1784         aUL.SetLower( o3tl::narrowing<sal_uInt16>(aLR.GetLeft()) );
1785     }
1786 
1787     SwAttrSet aSet( m_rDoc.GetAttrPool(), aPgFrameFormatSetRange );
1788     bool bSetLeft = true;
1789 
1790     switch( nId )
1791     {
1792     case RES_POOLPAGE_STANDARD:     // "Default"
1793         {
1794             aSet.Put( aLR );
1795             aSet.Put( aUL );
1796             pNewPgDsc->SetUseOn( UseOnPage::All | UseOnPage::FirstShare );
1797         }
1798         break;
1799 
1800     case RES_POOLPAGE_FIRST:        // "First Page"
1801     case RES_POOLPAGE_REGISTER:     // "Index"
1802         {
1803             lcl_PutStdPageSizeIntoItemSet( m_rDoc, aSet );
1804             aSet.Put( aLR );
1805             aSet.Put( aUL );
1806             pNewPgDsc->SetUseOn( UseOnPage::All );
1807             if( RES_POOLPAGE_FIRST == nId )
1808                 pNewPgDsc->SetFollow( GetPageDescFromPool( RES_POOLPAGE_STANDARD ));
1809         }
1810         break;
1811 
1812     case RES_POOLPAGE_LEFT:         // "Left Page"
1813         {
1814             lcl_PutStdPageSizeIntoItemSet( m_rDoc, aSet );
1815             aSet.Put( aLR );
1816             aSet.Put( aUL );
1817             bSetLeft = false;
1818             pNewPgDsc->SetUseOn( UseOnPage::Left );
1819             // this relies on GetPageDescFromPool() not going into infinite recursion
1820             // (by this point RES_POOLPAGE_LEFT will not reach this place again)
1821             pNewPgDsc->SetFollow( GetPageDescFromPool( RES_POOLPAGE_RIGHT ));
1822         }
1823         break;
1824     case RES_POOLPAGE_RIGHT:        // "Right Page"
1825         {
1826             lcl_PutStdPageSizeIntoItemSet( m_rDoc, aSet );
1827             aSet.Put( aLR );
1828             aSet.Put( aUL );
1829             bSetLeft = false;
1830             pNewPgDsc->SetUseOn( UseOnPage::Right );
1831             pNewPgDsc->SetFollow( GetPageDescFromPool( RES_POOLPAGE_LEFT ));
1832         }
1833         break;
1834 
1835     case RES_POOLPAGE_ENVELOPE:        // "Envelope"
1836         {
1837             Size aPSize( SvxPaperInfo::GetPaperSize( PAPER_ENV_C65 ) );
1838             LandscapeSwap( aPSize );
1839             aSet.Put( SwFormatFrameSize( SwFrameSize::Fixed, aPSize.Width(), aPSize.Height() ));
1840             aLR.SetLeft( 0 ); aLR.SetRight( 0 );
1841             aUL.SetUpper( 0 ); aUL.SetLower( 0 );
1842             aSet.Put( aLR );
1843             aSet.Put( aUL );
1844 
1845             pNewPgDsc->SetUseOn( UseOnPage::All );
1846             pNewPgDsc->SetLandscape( true );
1847         }
1848         break;
1849 
1850     case RES_POOLPAGE_HTML:         // "HTML"
1851         {
1852             lcl_PutStdPageSizeIntoItemSet( m_rDoc, aSet );
1853             aLR.SetRight(o3tl::convert(1, o3tl::Length::cm, o3tl::Length::twip));
1854             aUL.SetUpper( o3tl::narrowing<sal_uInt16>(aLR.GetRight()) );
1855             aUL.SetLower( o3tl::narrowing<sal_uInt16>(aLR.GetRight()) );
1856             aSet.Put( aLR );
1857             aSet.Put( aUL );
1858 
1859             pNewPgDsc->SetUseOn( UseOnPage::All );
1860         }
1861         break;
1862 
1863     case RES_POOLPAGE_FOOTNOTE:     // "Footnote"
1864     case RES_POOLPAGE_ENDNOTE:      // "Endnote"
1865         {
1866             lcl_PutStdPageSizeIntoItemSet( m_rDoc, aSet );
1867             aSet.Put( aLR );
1868             aSet.Put( aUL );
1869             pNewPgDsc->SetUseOn( UseOnPage::All );
1870             SwPageFootnoteInfo aInf( pNewPgDsc->GetFootnoteInfo() );
1871             aInf.SetLineWidth( 0 );
1872             aInf.SetTopDist( 0 );
1873             aInf.SetBottomDist( 0 );
1874             pNewPgDsc->SetFootnoteInfo( aInf );
1875         }
1876         break;
1877 
1878     case RES_POOLPAGE_LANDSCAPE:    // "Landscape"
1879         {
1880             SwPageDesc* pStdPgDsc = GetPageDescFromPool( RES_POOLPAGE_STANDARD );
1881             SwFormatFrameSize aFrameSz( pStdPgDsc->GetMaster().GetFrameSize() );
1882             if ( !pStdPgDsc->GetLandscape() )
1883             {
1884                 const SwTwips nTmp = aFrameSz.GetHeight();
1885                 aFrameSz.SetHeight( aFrameSz.GetWidth() );
1886                 aFrameSz.SetWidth( nTmp );
1887             }
1888             aSet.Put( aFrameSz );
1889             aSet.Put( aLR );
1890             aSet.Put( aUL );
1891             pNewPgDsc->SetUseOn( UseOnPage::All );
1892             pNewPgDsc->SetLandscape( true );
1893         }
1894         break;
1895 
1896     }
1897 
1898     if( aSet.Count() )
1899     {
1900         if( bSetLeft )
1901         {
1902             pNewPgDsc->GetLeft().SetFormatAttr( aSet );
1903             pNewPgDsc->GetFirstLeft().SetFormatAttr( aSet );
1904         }
1905         pNewPgDsc->GetMaster().SetFormatAttr( aSet );
1906         pNewPgDsc->GetFirstMaster().SetFormatAttr( aSet );
1907     }
1908     return pNewPgDsc;
1909 }
1910 
GetNumRuleFromPool(sal_uInt16 nId)1911 SwNumRule* DocumentStylePoolManager::GetNumRuleFromPool( sal_uInt16 nId )
1912 {
1913     OSL_ENSURE( RES_POOLNUMRULE_BEGIN <= nId && nId < RES_POOLNUMRULE_END,
1914             "Wrong AutoFormat Id" );
1915 
1916     SwNumRule* pNewRule;
1917 
1918     for (size_t n = 0; n < m_rDoc.GetNumRuleTable().size(); ++n )
1919     {
1920         pNewRule = m_rDoc.GetNumRuleTable()[ n ];
1921         if (nId == pNewRule->GetPoolFormatId())
1922         {
1923             return pNewRule;
1924         }
1925     }
1926 
1927     // error: unknown Pool style
1928     if( RES_POOLNUMRULE_BEGIN > nId ||  nId >= RES_POOLNUMRULE_END )
1929     {
1930         OSL_ENSURE( false, "invalid Id" );
1931         nId = RES_POOLNUMRULE_BEGIN;
1932     }
1933 
1934     static_assert(SAL_N_ELEMENTS(STR_POOLNUMRULE_NUM_ARY) == RES_POOLNUMRULE_END - RES_POOLNUMRULE_BEGIN, "### unexpected size!");
1935     OUString aNm(SwResId(STR_POOLNUMRULE_NUM_ARY[nId - RES_POOLNUMRULE_BEGIN]));
1936 
1937     SwCharFormat *pNumCFormat = nullptr, *pBullCFormat = nullptr;
1938 
1939     const SvxNumberFormat::SvxNumPositionAndSpaceMode eNumberFormatPositionAndSpaceMode
1940                                   = numfunc::GetDefaultPositionAndSpaceMode(); //#i89178#
1941     {
1942         bool bIsModified = m_rDoc.getIDocumentState().IsModified();
1943 
1944         sal_uInt16 n = m_rDoc.MakeNumRule( aNm, nullptr, false, eNumberFormatPositionAndSpaceMode );
1945 
1946         pNewRule = m_rDoc.GetNumRuleTable()[ n ];
1947         pNewRule->SetPoolFormatId( nId );
1948         pNewRule->SetAutoRule( false );
1949 
1950         if( RES_POOLNUMRULE_NUM1 <= nId && nId <= RES_POOLNUMRULE_NUM5 )
1951             pNumCFormat = GetCharFormatFromPool( RES_POOLCHR_NUM_LEVEL );
1952 
1953         if( ( RES_POOLNUMRULE_BUL1 <= nId && nId <= RES_POOLNUMRULE_BUL5 ) ||
1954             RES_POOLNUMRULE_NUM5 == nId )
1955             pBullCFormat = GetCharFormatFromPool( RES_POOLCHR_NUM_LEVEL );
1956 
1957         if( !bIsModified )
1958             m_rDoc.getIDocumentState().ResetModified();
1959     }
1960 
1961     switch( nId )
1962     {
1963     case RES_POOLNUMRULE_NUM1:
1964         {
1965             SwNumFormat aFormat;
1966             aFormat.SetPositionAndSpaceMode( eNumberFormatPositionAndSpaceMode );
1967             aFormat.SetNumberingType(SVX_NUM_ARABIC);
1968             aFormat.SetCharFormat( pNumCFormat );
1969             aFormat.SetStart( 1 );
1970             aFormat.SetIncludeUpperLevels( 1 );
1971 
1972             static const sal_uInt16 aAbsSpace[ MAXLEVEL ] =
1973                 {
1974 //              cm: 0.7 cm intervals, with 1 cm = 567
1975                     397, 794, 1191, 1588, 1985, 2381, 2778, 3175, 3572, 3969
1976                 };
1977             const sal_uInt16* pArr = aAbsSpace;
1978 
1979             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
1980             {
1981                 aFormat.SetFirstLineOffset( - (*pArr) );
1982             }
1983             else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
1984             {
1985                 aFormat.SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
1986                 aFormat.SetFirstLineIndent( - (*pArr) );
1987             }
1988 
1989             for (sal_uInt16 n = 0; n < MAXLEVEL; ++n, ++pArr)
1990             {
1991                 aFormat.SetListFormat(u""_ustr, u"."_ustr, n);
1992                 if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
1993                 {
1994                     aFormat.SetAbsLSpace( *pArr + 357 ); // 357 is indent of 0.63 cm
1995                 }
1996                 else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
1997                 {
1998                     aFormat.SetListtabPos( *pArr );
1999                     aFormat.SetIndentAt( *pArr + 357 );
2000                 }
2001 
2002                 pNewRule->Set( n, aFormat );
2003             }
2004         }
2005         break;
2006 
2007     case RES_POOLNUMRULE_NUM2:
2008         {
2009             static const sal_uInt16 aAbsSpace[ MAXLEVEL ] =
2010                 {
2011                     397,  397,  397,  397,      // 0.70 cm intervals
2012                     397, 397, 397, 397,
2013                    397, 397
2014                 };
2015 
2016             const sal_uInt16* pArr = aAbsSpace;
2017             SwNumFormat aFormat;
2018 
2019             aFormat.SetPositionAndSpaceMode( eNumberFormatPositionAndSpaceMode );
2020             aFormat.SetNumberingType(SVX_NUM_CHARS_UPPER_LETTER);
2021             aFormat.SetCharFormat( pNumCFormat );
2022             aFormat.SetStart( 1 );
2023             aFormat.SetIncludeUpperLevels( 1 );
2024 
2025             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2026             {
2027                 aFormat.SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
2028             }
2029 
2030             sal_uInt16 nSpace = 357; // indent of 0.63 cm
2031             for (sal_uInt16 n = 0; n < MAXLEVEL; ++n)
2032             {
2033                 aFormat.SetListFormat(u""_ustr, u"."_ustr, n);
2034                 if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2035                 {
2036                     nSpace += pArr[ n ];
2037                     aFormat.SetAbsLSpace( nSpace );
2038                     aFormat.SetFirstLineOffset( - pArr[ n ] );
2039                 }
2040                 else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2041                 {
2042                     nSpace += pArr[ n ];
2043                     aFormat.SetListtabPos( nSpace );
2044                     aFormat.SetIndentAt( nSpace );
2045                     aFormat.SetFirstLineIndent( - pArr[ n ] );
2046                 }
2047 
2048                 pNewRule->Set( n, aFormat );
2049             }
2050         }
2051         break;
2052     case RES_POOLNUMRULE_NUM3:
2053         {
2054             SwNumFormat aFormat;
2055 
2056             aFormat.SetPositionAndSpaceMode( eNumberFormatPositionAndSpaceMode );
2057             aFormat.SetNumberingType(SVX_NUM_CHARS_LOWER_LETTER);
2058             aFormat.SetCharFormat( pNumCFormat );
2059             aFormat.SetStart( 1 );
2060             aFormat.SetIncludeUpperLevels( 1 );
2061 
2062             tools::Long const nOffs = 397; // 0.70 cm
2063 
2064             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2065             {
2066                 aFormat.SetFirstLineOffset( - nOffs );
2067             }
2068             else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2069             {
2070                 aFormat.SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
2071                 aFormat.SetFirstLineIndent( - nOffs );
2072             }
2073 
2074             for (sal_uInt16 n = 0; n < MAXLEVEL; ++n)
2075             {
2076                 aFormat.SetListFormat(u""_ustr, u"."_ustr, n);
2077                 if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2078                 {
2079                     aFormat.SetAbsLSpace( (n+1) * nOffs + 357 ); // 357 is indent of 0.63 cm
2080                 }
2081                 else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2082                 {
2083                     tools::Long nPos = (n+1) * nOffs;
2084                     aFormat.SetListtabPos(nPos + 357);
2085                     aFormat.SetIndentAt(nPos + 357);
2086                 }
2087 
2088                 pNewRule->Set( n, aFormat );
2089             }
2090         }
2091         break;
2092     case RES_POOLNUMRULE_NUM4:
2093         {
2094             SwNumFormat aFormat;
2095 
2096             aFormat.SetPositionAndSpaceMode( eNumberFormatPositionAndSpaceMode );
2097             aFormat.SetNumberingType(SVX_NUM_ROMAN_UPPER);
2098             aFormat.SetCharFormat( pNumCFormat );
2099             aFormat.SetStart( 1 );
2100             aFormat.SetIncludeUpperLevels( 1 );
2101             aFormat.SetNumAdjust( SvxAdjust::Right );
2102 
2103             static const sal_uInt16 aAbsSpace[ MAXLEVEL ] =
2104                 {
2105 //              cm: 1.33 cm intervals
2106                     754, 1508, 2262, 3016, 3771, 4525, 5279, 6033, 6787, 7541
2107                 };
2108             const sal_uInt16* pArr = aAbsSpace;
2109 
2110             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2111             {
2112                 aFormat.SetFirstLineOffset( 580 - (*pArr) ); // 1 cm space
2113             }
2114             else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2115             {
2116                 aFormat.SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
2117                 aFormat.SetFirstLineIndent( 580 - (*pArr) );
2118             }
2119 
2120             for (sal_uInt16 n = 0; n < MAXLEVEL; ++n, ++pArr)
2121             {
2122                 aFormat.SetListFormat(u""_ustr, u"."_ustr, n);
2123                 if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2124                 {
2125                     aFormat.SetAbsLSpace( *pArr );
2126                 }
2127                 else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2128                 {
2129                     aFormat.SetListtabPos( *pArr );
2130                     aFormat.SetIndentAt( *pArr );
2131                 }
2132 
2133                 pNewRule->Set( n, aFormat );
2134             }
2135         }
2136         break;
2137     case RES_POOLNUMRULE_NUM5:
2138         {
2139             // [ First, LSpace ]
2140             static const sal_uInt16 aAbsSpace0to2[] =
2141                 {
2142                     174,  754,  // 0.33, 1.33cm
2143                     174,  1508, // 0.33, 2.66cm
2144                     397,  2262  // 0.70, 4.00cm
2145                 };
2146 
2147             const sal_uInt16* pArr0to2 = aAbsSpace0to2;
2148             SwNumFormat aFormat;
2149 
2150             aFormat.SetPositionAndSpaceMode( eNumberFormatPositionAndSpaceMode );
2151             aFormat.SetNumberingType(SVX_NUM_ROMAN_LOWER);
2152             aFormat.SetStart( 1 );
2153             aFormat.SetIncludeUpperLevels( 1 );
2154             aFormat.SetNumAdjust( SvxAdjust::Right );
2155             aFormat.SetListFormat(u""_ustr, u"."_ustr, 0);
2156 
2157             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2158             {
2159                 aFormat.SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
2160             }
2161 
2162             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2163             {
2164                 aFormat.SetFirstLineOffset(- pArr0to2[0]); // num ends at 1.00 cm
2165                 aFormat.SetAbsLSpace(pArr0to2[1]);         // text starts at 1.33 cm
2166             }
2167             else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2168             {
2169                 aFormat.SetFirstLineIndent( -pArr0to2[0] );
2170                 aFormat.SetListtabPos( pArr0to2[1] );
2171                 aFormat.SetIndentAt( pArr0to2[1] );
2172             }
2173 
2174             aFormat.SetCharFormat( pNumCFormat );
2175             pNewRule->Set( 0, aFormat );
2176 
2177             aFormat.SetNumberingType(SVX_NUM_ROMAN_UPPER);
2178             aFormat.SetIncludeUpperLevels( 1 );
2179             aFormat.SetListFormat(u""_ustr, u"."_ustr, 1);
2180 
2181             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2182             {
2183                 aFormat.SetFirstLineOffset(- pArr0to2[2]); // num ends at 2.33 cm
2184                 aFormat.SetAbsLSpace(pArr0to2[3]);         // text starts at 2.66 cm
2185             }
2186             else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2187             {
2188                 aFormat.SetFirstLineIndent( -pArr0to2[2] );
2189                 aFormat.SetListtabPos( pArr0to2[3] );
2190                 aFormat.SetIndentAt( pArr0to2[3] );
2191             }
2192 
2193             pNewRule->Set( 1, aFormat );
2194 
2195             aFormat.SetNumberingType(SVX_NUM_CHARS_LOWER_LETTER);
2196             aFormat.SetIncludeUpperLevels( 1 );
2197             aFormat.SetListFormat(u""_ustr, u")"_ustr, 2);
2198             aFormat.SetNumAdjust( SvxAdjust::Left );
2199 
2200             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2201             {
2202                 aFormat.SetFirstLineOffset(- pArr0to2[4]); // num starts at 3.30 cm
2203                 aFormat.SetAbsLSpace(pArr0to2[5]);         // text starts at 4.00 cm
2204             }
2205             else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2206             {
2207                 aFormat.SetFirstLineIndent( -pArr0to2[4] );
2208                 aFormat.SetListtabPos( pArr0to2[5] );
2209                 aFormat.SetIndentAt( pArr0to2[5] );
2210             }
2211 
2212             pNewRule->Set( 2, aFormat );
2213 
2214             aFormat.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
2215             aFormat.SetCharFormat( pBullCFormat );
2216             aFormat.SetBulletFont(  &numfunc::GetDefBulletFont() );
2217             aFormat.SetBulletChar( cBulletChar );
2218             sal_Int16 nOffs = o3tl::convert(660, o3tl::Length::mm100, o3tl::Length::twip),
2219                       nOffs2 = o3tl::convert(4000, o3tl::Length::mm100, o3tl::Length::twip);
2220 
2221             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2222             {
2223                 aFormat.SetFirstLineOffset( - nOffs );
2224             }
2225             else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2226             {
2227                 aFormat.SetFirstLineIndent( - nOffs );
2228             }
2229 
2230             for (sal_uInt16 n = 3; n < MAXLEVEL; ++n)
2231             {
2232                 aFormat.SetStart( n+1 );
2233                 aFormat.SetListFormat(u""_ustr, u""_ustr, n);
2234 
2235                 if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2236                 {
2237                     aFormat.SetAbsLSpace(nOffs2 + ((n - 2) * static_cast<tools::Long>(nOffs)));
2238                 }
2239                 else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2240                 {
2241                     tools::Long nPos = nOffs2 + ((n - 2) * static_cast<tools::Long>(nOffs));
2242                     aFormat.SetListtabPos(nPos);
2243                     aFormat.SetIndentAt(nPos);
2244                 }
2245 
2246                 pNewRule->Set( n, aFormat );
2247             }
2248         }
2249         break;
2250 
2251     case RES_POOLNUMRULE_BUL1:
2252         {
2253             SwNumFormat aFormat;
2254 
2255             aFormat.SetPositionAndSpaceMode( eNumberFormatPositionAndSpaceMode );
2256             aFormat.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
2257             aFormat.SetCharFormat( pBullCFormat );
2258             aFormat.SetStart( 1 );
2259             aFormat.SetIncludeUpperLevels( 1 );
2260             aFormat.SetBulletFont( &numfunc::GetDefBulletFont() );
2261             aFormat.SetBulletChar( cBulletChar );
2262 
2263             static const sal_uInt16 aAbsSpace[ MAXLEVEL ] =
2264                 {
2265 //              cm: 0,4  0,8  1,2  1,6  2,0   2,4   2,8   3,2   3,6   4,0
2266                     227, 454, 680, 907, 1134, 1361, 1587, 1814, 2041, 2268
2267                 };
2268             const sal_uInt16* pArr = aAbsSpace;
2269 
2270             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2271             {
2272                 aFormat.SetFirstLineOffset( - (*pArr) );
2273             }
2274             else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2275             {
2276                 aFormat.SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
2277                 aFormat.SetFirstLineIndent( - (*pArr) );
2278             }
2279 
2280             for (sal_uInt16 n = 0; n < MAXLEVEL; ++n, ++pArr)
2281             {
2282                 if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2283                 {
2284                     aFormat.SetAbsLSpace( *pArr );
2285                 }
2286                 else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2287                 {
2288                     aFormat.SetListtabPos( *pArr );
2289                     aFormat.SetIndentAt( *pArr );
2290                 }
2291 
2292                 pNewRule->Set( n, aFormat );
2293             }
2294         }
2295         break;
2296     case RES_POOLNUMRULE_BUL2:
2297         {
2298             SwNumFormat aFormat;
2299 
2300             aFormat.SetPositionAndSpaceMode( eNumberFormatPositionAndSpaceMode );
2301             aFormat.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
2302             aFormat.SetCharFormat( pBullCFormat );
2303             aFormat.SetStart( 1 );
2304             aFormat.SetIncludeUpperLevels( 1 );
2305             aFormat.SetBulletFont(  &numfunc::GetDefBulletFont() );
2306             aFormat.SetBulletChar( 0x2013 );
2307 
2308             static const sal_uInt16 aAbsSpace[ MAXLEVEL ] =
2309                 {
2310 //              cm: 0,3  0,6  0,9  1,2  1,5  1,8   2,1   2,4   2,7   3,0
2311                     170, 340, 510, 680, 850, 1020, 1191, 1361, 1531, 1701
2312                 };
2313             const sal_uInt16* pArr = aAbsSpace;
2314 
2315             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2316             {
2317                 aFormat.SetFirstLineOffset( - (*pArr) );
2318             }
2319             else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2320             {
2321                 aFormat.SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
2322                 aFormat.SetFirstLineIndent( - (*pArr) );
2323             }
2324 
2325             for (sal_uInt16 n = 0; n < MAXLEVEL; ++n, ++pArr)
2326             {
2327                 if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2328                 {
2329                     aFormat.SetAbsLSpace( *pArr );
2330                 }
2331                 else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2332                 {
2333                     aFormat.SetListtabPos( *pArr );
2334                     aFormat.SetIndentAt( *pArr );
2335                 }
2336 
2337                 pNewRule->Set( n, aFormat );
2338             }
2339         }
2340         break;
2341     case RES_POOLNUMRULE_BUL3:
2342         {
2343             SwNumFormat aFormat;
2344 
2345             aFormat.SetPositionAndSpaceMode( eNumberFormatPositionAndSpaceMode );
2346 
2347             aFormat.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
2348             aFormat.SetCharFormat( pBullCFormat );
2349             aFormat.SetStart( 1 );
2350             aFormat.SetIncludeUpperLevels( 1 );
2351             aFormat.SetBulletFont(  &numfunc::GetDefBulletFont() );
2352 
2353             sal_uInt16 nOffs = o3tl::convert(4, o3tl::Length::mm, o3tl::Length::twip);
2354 
2355             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2356             {
2357                 aFormat.SetFirstLineOffset( - nOffs );
2358             }
2359             else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2360             {
2361                 aFormat.SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
2362                 aFormat.SetFirstLineIndent( - nOffs );
2363             }
2364 
2365             for (sal_uInt16 n = 0; n < MAXLEVEL; ++n)
2366             {
2367                 aFormat.SetBulletChar( (n & 1) ? 0x25a1 : 0x2611 );
2368 
2369                 if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2370                 {
2371                     aFormat.SetAbsLSpace( ((n & 1) +1) * nOffs );
2372                 }
2373                 else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2374                 {
2375                     tools::Long nPos = ((n & 1) +1) * static_cast<tools::Long>(nOffs);
2376                     aFormat.SetListtabPos(nPos);
2377                     aFormat.SetIndentAt(nPos);
2378                 }
2379 
2380                 pNewRule->Set( n, aFormat );
2381             }
2382         }
2383         break;
2384     case RES_POOLNUMRULE_BUL4:
2385         {
2386             SwNumFormat aFormat;
2387 
2388             aFormat.SetPositionAndSpaceMode( eNumberFormatPositionAndSpaceMode );
2389             aFormat.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
2390             aFormat.SetCharFormat( pBullCFormat );
2391             aFormat.SetStart( 1 );
2392             aFormat.SetIncludeUpperLevels( 1 );
2393             aFormat.SetBulletFont(  &numfunc::GetDefBulletFont() );
2394 
2395             static const sal_uInt16 aAbsSpace[ MAXLEVEL ] =
2396                 {
2397 //              cm: 0,4  0,8  1,2  1,6  2,0   2,4   2,8   3,2   3,6   4,0
2398                     227, 454, 680, 907, 1134, 1361, 1587, 1814, 2041, 2268
2399                 };
2400 
2401             const sal_uInt16* pArr = aAbsSpace;
2402 
2403             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2404             {
2405                 aFormat.SetFirstLineOffset( - (*pArr) );
2406             }
2407             else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2408             {
2409                 aFormat.SetLabelFollowedBy( SvxNumberFormat::SPACE );
2410                 aFormat.SetFirstLineIndent( - (*pArr) );
2411             }
2412 
2413             for (sal_uInt16 n = 0; n < MAXLEVEL; ++n, ++pArr)
2414             {
2415                 switch( n )
2416                 {
2417                 case 0:     aFormat.SetBulletChar( 0x27a2 );   break;
2418                 case 1:     aFormat.SetBulletChar( 0xE006 );   break;
2419                 default:    aFormat.SetBulletChar( 0xE004 );   break;
2420                 }
2421 
2422                 if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2423                 {
2424                     aFormat.SetAbsLSpace( *pArr );
2425                 }
2426                 else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2427                 {
2428                     aFormat.SetListtabPos( *pArr );
2429                     aFormat.SetIndentAt( *pArr );
2430                 }
2431 
2432                 pNewRule->Set( n, aFormat );
2433             }
2434         }
2435         break;
2436     case RES_POOLNUMRULE_BUL5:
2437         {
2438             SwNumFormat aFormat;
2439 
2440             aFormat.SetPositionAndSpaceMode( eNumberFormatPositionAndSpaceMode );
2441             aFormat.SetNumberingType(SVX_NUM_CHAR_SPECIAL);
2442             aFormat.SetCharFormat( pBullCFormat );
2443             aFormat.SetStart( 1 );
2444             aFormat.SetIncludeUpperLevels( 1 );
2445             aFormat.SetBulletChar( 0x2717 );
2446             aFormat.SetBulletFont( &numfunc::GetDefBulletFont() );
2447 
2448             static const sal_uInt16 aAbsSpace[ MAXLEVEL ] =
2449                 {
2450 //              cm: 0,4  0,8  1,2  1,6  2,0   2,4   2,8   3,2   3,6   4,0
2451                     227, 454, 680, 907, 1134, 1361, 1587, 1814, 2041, 2268
2452                 };
2453             const sal_uInt16* pArr = aAbsSpace;
2454 
2455             if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2456             {
2457                 aFormat.SetFirstLineOffset( - (*pArr) );
2458             }
2459             else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2460             {
2461                 aFormat.SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
2462                 aFormat.SetFirstLineIndent( - (*pArr) );
2463             }
2464 
2465             for (sal_uInt16 n = 0; n < MAXLEVEL; ++n, ++pArr)
2466             {
2467                 if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2468                 {
2469                     aFormat.SetAbsLSpace( *pArr );
2470                 }
2471                 else if ( eNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
2472                 {
2473                     aFormat.SetListtabPos( *pArr );
2474                     aFormat.SetIndentAt( *pArr );
2475                 }
2476 
2477                 pNewRule->Set( n, aFormat );
2478             }
2479         }
2480         break;
2481     }
2482 
2483     return pNewRule;
2484 }
2485 
2486 /// Check if this AutoCollection is already/still in use in this Document
IsPoolTextCollUsed(sal_uInt16 nId) const2487 bool DocumentStylePoolManager::IsPoolTextCollUsed( sal_uInt16 nId ) const
2488 {
2489     OSL_ENSURE(
2490         (RES_POOLCOLL_TEXT_BEGIN <= nId && nId < RES_POOLCOLL_TEXT_END) ||
2491         (RES_POOLCOLL_LISTS_BEGIN <= nId && nId < RES_POOLCOLL_LISTS_END) ||
2492         (RES_POOLCOLL_EXTRA_BEGIN <= nId && nId < RES_POOLCOLL_EXTRA_END) ||
2493         (RES_POOLCOLL_REGISTER_BEGIN <= nId && nId < RES_POOLCOLL_REGISTER_END) ||
2494         (RES_POOLCOLL_DOC_BEGIN <= nId && nId < RES_POOLCOLL_DOC_END) ||
2495         (RES_POOLCOLL_HTML_BEGIN <= nId && nId < RES_POOLCOLL_HTML_END),
2496             "Wrong AutoFormat Id" );
2497 
2498     SwTextFormatColl* pNewColl = nullptr;
2499     bool bFnd = false;
2500     for( SwTextFormatColls::size_type n = 0; !bFnd && n < m_rDoc.GetTextFormatColls()->size(); ++n )
2501     {
2502         pNewColl = (*m_rDoc.GetTextFormatColls())[ n ];
2503         if( nId == pNewColl->GetPoolFormatId() )
2504             bFnd = true;
2505     }
2506 
2507     if( !bFnd || !pNewColl->HasWriterListeners() )
2508         return false;
2509 
2510     bool isUsed = false;
2511     sw::AutoFormatUsedHint aHint(isUsed, m_rDoc.GetNodes());
2512     pNewColl->CallSwClientNotify(aHint);
2513     return isUsed;
2514 }
2515 
2516 /// Check if this AutoCollection is already/still in use
IsPoolFormatUsed(sal_uInt16 nId) const2517 bool DocumentStylePoolManager::IsPoolFormatUsed( sal_uInt16 nId ) const
2518 {
2519     const SwFormat *pNewFormat = nullptr;
2520     const SwFormatsBase* pArray[ 2 ];
2521     sal_uInt16 nArrCnt = 1;
2522     bool bFnd = true;
2523 
2524     if (RES_POOLCHR_BEGIN <= nId && nId < RES_POOLCHR_END)
2525     {
2526         pArray[0] = m_rDoc.GetCharFormats();
2527     }
2528     else if (RES_POOLFRM_BEGIN <= nId && nId < RES_POOLFRM_END)
2529     {
2530         pArray[0] = m_rDoc.GetFrameFormats();
2531         pArray[1] = m_rDoc.GetSpzFrameFormats();
2532         nArrCnt = 2;
2533     }
2534     else
2535     {
2536         SAL_WARN("sw.core", "Invalid Pool Id: " << nId << " should be within "
2537             "[" << int(RES_POOLCHR_BEGIN) << "," << int(RES_POOLCHR_END) << ") or "
2538             "[" << int(RES_POOLFRM_BEGIN) << "," << int(RES_POOLFRM_END) << ")");
2539         bFnd = false;
2540     }
2541 
2542     if( bFnd )
2543     {
2544         bFnd = false;
2545         while( nArrCnt-- && !bFnd )
2546             for( size_t n = 0; !bFnd && n < (*pArray[nArrCnt]).GetFormatCount(); ++n )
2547             {
2548                 pNewFormat = (*pArray[ nArrCnt ] ).GetFormat( n );
2549                 if( nId == pNewFormat->GetPoolFormatId() )
2550                     bFnd = true;
2551             }
2552     }
2553 
2554     // Not found or no dependencies?
2555     if(!bFnd || !pNewFormat->HasWriterListeners() )
2556         return false;
2557     // Check if we have dependent ContentNodes in the Nodes array
2558     // (also indirect ones for derived Formats)
2559     return pNewFormat->IsUsed();
2560 }
2561 
2562 /// Check if this AutoCollection is already/still in use in this Document
IsPoolPageDescUsed(sal_uInt16 nId) const2563 bool DocumentStylePoolManager::IsPoolPageDescUsed( sal_uInt16 nId ) const
2564 {
2565     OSL_ENSURE( RES_POOLPAGE_BEGIN <= nId && nId < RES_POOLPAGE_END,
2566             "Wrong AutoFormat Id" );
2567     SwPageDesc *pNewPgDsc = nullptr;
2568     bool bFnd = false;
2569     for( size_t n = 0; !bFnd && n < m_rDoc.GetPageDescCnt(); ++n )
2570     {
2571         pNewPgDsc = &m_rDoc.GetPageDesc(n);
2572         if( nId == pNewPgDsc->GetPoolFormatId() )
2573             bFnd = true;
2574     }
2575 
2576     // Not found or no dependencies?
2577     if( !bFnd || !pNewPgDsc->HasWriterListeners() )     // ??????
2578         return false;
2579 
2580     // Check if we have dependent ContentNodes in the Nodes array
2581     // (also indirect ones for derived Formats)
2582     bool isUsed = false;
2583     sw::AutoFormatUsedHint aHint(isUsed, m_rDoc.GetNodes());
2584     pNewPgDsc->CallSwClientNotify(aHint);
2585     return isUsed;
2586 }
2587 
~DocumentStylePoolManager()2588 DocumentStylePoolManager::~DocumentStylePoolManager()
2589 {
2590 }
2591 
2592 }
2593 
2594 static std::vector<OUString>
lcl_NewUINameArray(const TranslateId * pIds,const size_t nLen,const size_t nSvxIds=0)2595 lcl_NewUINameArray(const TranslateId* pIds, const size_t nLen, const size_t nSvxIds = 0)
2596 {
2597     assert(nSvxIds <= nLen);
2598     const size_t nWriterIds = nLen - nSvxIds;
2599     std::vector<OUString> aNameArray;
2600     aNameArray.reserve(nLen);
2601     for (size_t i = 0; i < nWriterIds; ++i)
2602         aNameArray.push_back(SwResId(pIds[i]));
2603     for (size_t i = nWriterIds; i < nLen; ++i)
2604         aNameArray.push_back(SvxResId(pIds[i]));
2605     return aNameArray;
2606 }
2607 
GetTextUINameArray()2608 const std::vector<OUString>& SwStyleNameMapper::GetTextUINameArray()
2609 {
2610     SvtSysLocale aSysLocale;
2611     const LanguageTag& rCurrentLanguage = aSysLocale.GetUILanguageTag();
2612     static std::map<LanguageTag, std::vector<OUString>> s_aTextUINameArray;
2613 
2614     auto it = s_aTextUINameArray.find(rCurrentLanguage);
2615     if (it == s_aTextUINameArray.end())
2616         it = s_aTextUINameArray.emplace(rCurrentLanguage,
2617                 lcl_NewUINameArray(STR_POOLCOLL_TEXT_ARY, SAL_N_ELEMENTS(STR_POOLCOLL_TEXT_ARY))).first;
2618 
2619     return it->second;
2620 }
2621 
GetListsUINameArray()2622 const std::vector<OUString>& SwStyleNameMapper::GetListsUINameArray()
2623 {
2624     SvtSysLocale aSysLocale;
2625     const LanguageTag& rCurrentLanguage = aSysLocale.GetUILanguageTag();
2626     static std::map<LanguageTag, std::vector<OUString>> s_aListsUINameArray;
2627 
2628     auto it = s_aListsUINameArray.find(rCurrentLanguage);
2629     if (it == s_aListsUINameArray.end())
2630         it = s_aListsUINameArray.emplace(rCurrentLanguage,
2631             lcl_NewUINameArray(STR_POOLCOLL_LISTS_ARY, SAL_N_ELEMENTS(STR_POOLCOLL_LISTS_ARY))).first;
2632 
2633     return it->second;
2634 }
2635 
GetExtraUINameArray()2636 const std::vector<OUString>& SwStyleNameMapper::GetExtraUINameArray()
2637 {
2638     SvtSysLocale aSysLocale;
2639     const LanguageTag& rCurrentLanguage = aSysLocale.GetUILanguageTag();
2640     static std::map<LanguageTag, std::vector<OUString>> s_aExtraUINameArray;
2641 
2642     auto it = s_aExtraUINameArray.find(rCurrentLanguage);
2643     if (it == s_aExtraUINameArray.end())
2644         it = s_aExtraUINameArray.emplace(rCurrentLanguage,
2645             lcl_NewUINameArray(STR_POOLCOLL_EXTRA_ARY, SAL_N_ELEMENTS(STR_POOLCOLL_EXTRA_ARY))).first;
2646 
2647     return it->second;
2648 }
2649 
GetRegisterUINameArray()2650 const std::vector<OUString>& SwStyleNameMapper::GetRegisterUINameArray()
2651 {
2652     SvtSysLocale aSysLocale;
2653     const LanguageTag& rCurrentLanguage = aSysLocale.GetUILanguageTag();
2654     static std::map<LanguageTag, std::vector<OUString>> s_aRegisterUINameArray;
2655 
2656     auto it = s_aRegisterUINameArray.find(rCurrentLanguage);
2657     if (it == s_aRegisterUINameArray.end())
2658         it = s_aRegisterUINameArray.emplace(rCurrentLanguage,
2659             lcl_NewUINameArray(STR_POOLCOLL_REGISTER_ARY, SAL_N_ELEMENTS(STR_POOLCOLL_REGISTER_ARY))).first;
2660 
2661     return it->second;
2662 }
2663 
GetDocUINameArray()2664 const std::vector<OUString>& SwStyleNameMapper::GetDocUINameArray()
2665 {
2666     SvtSysLocale aSysLocale;
2667     const LanguageTag& rCurrentLanguage = aSysLocale.GetUILanguageTag();
2668     static std::map<LanguageTag, std::vector<OUString>> s_aDocUINameArray;
2669 
2670     auto it = s_aDocUINameArray.find(rCurrentLanguage);
2671     if (it == s_aDocUINameArray.end())
2672         it = s_aDocUINameArray.emplace(rCurrentLanguage,
2673             lcl_NewUINameArray(STR_POOLCOLL_DOC_ARY, SAL_N_ELEMENTS(STR_POOLCOLL_DOC_ARY))).first;
2674 
2675     return it->second;
2676 }
2677 
GetHTMLUINameArray()2678 const std::vector<OUString>& SwStyleNameMapper::GetHTMLUINameArray()
2679 {
2680     SvtSysLocale aSysLocale;
2681     const LanguageTag& rCurrentLanguage = aSysLocale.GetUILanguageTag();
2682     static std::map<LanguageTag, std::vector<OUString>> s_aHTMLUINameArray;
2683 
2684     auto it = s_aHTMLUINameArray.find(rCurrentLanguage);
2685     if (it == s_aHTMLUINameArray.end())
2686         it = s_aHTMLUINameArray.emplace(rCurrentLanguage,
2687             lcl_NewUINameArray(STR_POOLCOLL_HTML_ARY, SAL_N_ELEMENTS(STR_POOLCOLL_HTML_ARY))).first;
2688 
2689     return it->second;
2690 }
2691 
GetFrameFormatUINameArray()2692 const std::vector<OUString>& SwStyleNameMapper::GetFrameFormatUINameArray()
2693 {
2694     SvtSysLocale aSysLocale;
2695     const LanguageTag& rCurrentLanguage = aSysLocale.GetUILanguageTag();
2696     static std::map<LanguageTag, std::vector<OUString>> s_aFrameFormatUINameArray;
2697 
2698     auto it = s_aFrameFormatUINameArray.find(rCurrentLanguage);
2699     if (it == s_aFrameFormatUINameArray.end())
2700         it = s_aFrameFormatUINameArray.emplace(rCurrentLanguage,
2701             lcl_NewUINameArray(STR_POOLFRM_ARY, SAL_N_ELEMENTS(STR_POOLFRM_ARY))).first;
2702 
2703     return it->second;
2704 }
2705 
GetChrFormatUINameArray()2706 const std::vector<OUString>& SwStyleNameMapper::GetChrFormatUINameArray()
2707 {
2708     SvtSysLocale aSysLocale;
2709     const LanguageTag& rCurrentLanguage = aSysLocale.GetUILanguageTag();
2710     static std::map<LanguageTag, std::vector<OUString>> s_aChrFormatUINameArray;
2711 
2712     auto it = s_aChrFormatUINameArray.find(rCurrentLanguage);
2713     if (it == s_aChrFormatUINameArray.end())
2714         it = s_aChrFormatUINameArray.emplace(rCurrentLanguage,
2715             lcl_NewUINameArray(STR_POOLCHR_ARY, SAL_N_ELEMENTS(STR_POOLCHR_ARY))).first;
2716 
2717     return it->second;
2718 }
2719 
GetHTMLChrFormatUINameArray()2720 const std::vector<OUString>& SwStyleNameMapper::GetHTMLChrFormatUINameArray()
2721 {
2722     SvtSysLocale aSysLocale;
2723     const LanguageTag& rCurrentLanguage = aSysLocale.GetUILanguageTag();
2724     static std::map<LanguageTag, std::vector<OUString>> s_aHTMLChrFormatUINameArray;
2725 
2726     auto it = s_aHTMLChrFormatUINameArray.find(rCurrentLanguage);
2727     if (it == s_aHTMLChrFormatUINameArray.end())
2728         it = s_aHTMLChrFormatUINameArray.emplace(rCurrentLanguage,
2729             lcl_NewUINameArray(STR_POOLCHR_HTML_ARY, SAL_N_ELEMENTS(STR_POOLCHR_HTML_ARY))).first;
2730 
2731     return it->second;
2732 }
2733 
GetPageDescUINameArray()2734 const std::vector<OUString>& SwStyleNameMapper::GetPageDescUINameArray()
2735 {
2736     SvtSysLocale aSysLocale;
2737     const LanguageTag& rCurrentLanguage = aSysLocale.GetUILanguageTag();
2738     static std::map<LanguageTag, std::vector<OUString>> s_aPageDescUINameArray;
2739 
2740     auto it = s_aPageDescUINameArray.find(rCurrentLanguage);
2741     if (it == s_aPageDescUINameArray.end())
2742         it = s_aPageDescUINameArray.emplace(rCurrentLanguage,
2743             lcl_NewUINameArray(STR_POOLPAGE_ARY, SAL_N_ELEMENTS(STR_POOLPAGE_ARY))).first;
2744 
2745     return it->second;
2746 }
2747 
GetNumRuleUINameArray()2748 const std::vector<OUString>& SwStyleNameMapper::GetNumRuleUINameArray()
2749 {
2750     SvtSysLocale aSysLocale;
2751     const LanguageTag& rCurrentLanguage = aSysLocale.GetUILanguageTag();
2752     static std::map<LanguageTag, std::vector<OUString>> s_aNumRuleUINameArray;
2753 
2754     auto it = s_aNumRuleUINameArray.find(rCurrentLanguage);
2755     if (it == s_aNumRuleUINameArray.end())
2756         it = s_aNumRuleUINameArray.emplace(rCurrentLanguage,
2757             lcl_NewUINameArray(STR_POOLNUMRULE_NUM_ARY, SAL_N_ELEMENTS(STR_POOLNUMRULE_NUM_ARY))).first;
2758 
2759     return it->second;
2760 }
2761 
GetTableStyleUINameArray()2762 const std::vector<OUString>& SwStyleNameMapper::GetTableStyleUINameArray()
2763 {
2764     SvtSysLocale aSysLocale;
2765     const LanguageTag& rCurrentLanguage = aSysLocale.GetUILanguageTag();
2766     static std::map<LanguageTag, std::vector<OUString>> s_aTableStyleUINameArray;
2767 
2768     auto it = s_aTableStyleUINameArray.find(rCurrentLanguage);
2769     if (it == s_aTableStyleUINameArray.end())
2770         it = s_aTableStyleUINameArray.emplace(rCurrentLanguage,
2771             // 1 Writer resource string (XXX if this ever changes rather use offset math)
2772             lcl_NewUINameArray(STR_TABSTYLE_ARY, SAL_N_ELEMENTS(STR_TABSTYLE_ARY),
2773                     static_cast<size_t>(SAL_N_ELEMENTS(STR_TABSTYLE_ARY) - 1))).first;
2774 
2775     return it->second;
2776 }
2777 
2778 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
2779