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