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 
20 #include <sal/config.h>
21 
22 #include <utility>
23 
24 #include <scitems.hxx>
25 
26 #include <comphelper/string.hxx>
27 #include <i18nutil/unicode.hxx>
28 #include <vcl/outdev.hxx>
29 #include <vcl/svapp.hxx>
30 #include <vcl/settings.hxx>
31 #include <svl/itemiter.hxx>
32 #include <svl/stritem.hxx>
33 #include <svx/algitem.hxx>
34 #include <editeng/boxitem.hxx>
35 #include <editeng/lineitem.hxx>
36 #include <editeng/brushitem.hxx>
37 #include <editeng/charreliefitem.hxx>
38 #include <editeng/contouritem.hxx>
39 #include <editeng/colritem.hxx>
40 #include <editeng/crossedoutitem.hxx>
41 #include <editeng/emphasismarkitem.hxx>
42 #include <editeng/fhgtitem.hxx>
43 #include <editeng/fontitem.hxx>
44 #include <editeng/forbiddenruleitem.hxx>
45 #include <editeng/frmdiritem.hxx>
46 #include <editeng/hngpnctitem.hxx>
47 #include <editeng/itemtype.hxx>
48 #include <editeng/editrids.hrc>
49 #include <editeng/eerdll.hxx>
50 #include <editeng/langitem.hxx>
51 #include <editeng/lrspitem.hxx>
52 #include <svx/pageitem.hxx>
53 #include <editeng/pbinitem.hxx>
54 #include <editeng/postitem.hxx>
55 #include <svx/rotmodit.hxx>
56 #include <editeng/scriptspaceitem.hxx>
57 #include <editeng/shaditem.hxx>
58 #include <editeng/shdditem.hxx>
59 #include <editeng/sizeitem.hxx>
60 #include <editeng/udlnitem.hxx>
61 #include <editeng/ulspitem.hxx>
62 #include <editeng/wghtitem.hxx>
63 #include <editeng/wrlmitem.hxx>
64 #include <editeng/xmlcnitm.hxx>
65 #include <editeng/justifyitem.hxx>
66 
67 #include <docpool.hxx>
68 #include <global.hxx>
69 #include <attrib.hxx>
70 #include <patattr.hxx>
71 #include <globstr.hrc>
72 #include <scresid.hxx>
73 #include <scmod.hxx>
74 #include <sc.hrc>
75 
76 // ATTR_FONT_TWOLINES (not used) was changed to ATTR_USERDEF (not saved in binary format) in 641c
77 
78 namespace {
79 
getDefaultFontItem(LanguageType eLang,DefaultFontType nFontType,sal_uInt16 nItemId)80 SvxFontItem* getDefaultFontItem(LanguageType eLang, DefaultFontType nFontType, sal_uInt16 nItemId)
81 {
82     vcl::Font aDefFont = OutputDevice::GetDefaultFont( nFontType, eLang, GetDefaultFontFlags::OnlyOne );
83     SvxFontItem* pNewItem = new SvxFontItem( aDefFont.GetFamilyType(), aDefFont.GetFamilyName(), aDefFont.GetStyleName(),
84             aDefFont.GetPitch(), aDefFont.GetCharSet(), nItemId );
85 
86     return pNewItem;
87 }
88 
89 }
90 
91 SfxItemInfo const  aItemInfos[] =
92 {
93     { SID_ATTR_CHAR_FONT,           true },    // ATTR_FONT
94     { SID_ATTR_CHAR_FONTHEIGHT,     true },    // ATTR_FONT_HEIGHT
95     { SID_ATTR_CHAR_WEIGHT,         true },    // ATTR_FONT_WEIGHT
96     { SID_ATTR_CHAR_POSTURE,        true },    // ATTR_FONT_POSTURE
97     { SID_ATTR_CHAR_UNDERLINE,      true },    // ATTR_FONT_UNDERLINE
98     { SID_ATTR_CHAR_OVERLINE,       true },    // ATTR_FONT_OVERLINE
99     { SID_ATTR_CHAR_STRIKEOUT,      true },    // ATTR_FONT_CROSSEDOUT
100     { SID_ATTR_CHAR_CONTOUR,        true },    // ATTR_FONT_CONTOUR
101     { SID_ATTR_CHAR_SHADOWED,       true },    // ATTR_FONT_SHADOWED
102     { SID_ATTR_CHAR_COLOR,          true },    // ATTR_FONT_COLOR
103     { SID_ATTR_CHAR_LANGUAGE,       true },    // ATTR_FONT_LANGUAGE
104     { SID_ATTR_CHAR_CJK_FONT,       true },    // ATTR_CJK_FONT            from 614
105     { SID_ATTR_CHAR_CJK_FONTHEIGHT, true },    // ATTR_CJK_FONT_HEIGHT     from 614
106     { SID_ATTR_CHAR_CJK_WEIGHT,     true },    // ATTR_CJK_FONT_WEIGHT     from 614
107     { SID_ATTR_CHAR_CJK_POSTURE,    true },    // ATTR_CJK_FONT_POSTURE    from 614
108     { SID_ATTR_CHAR_CJK_LANGUAGE,   true },    // ATTR_CJK_FONT_LANGUAGE   from 614
109     { SID_ATTR_CHAR_CTL_FONT,       true },    // ATTR_CTL_FONT            from 614
110     { SID_ATTR_CHAR_CTL_FONTHEIGHT, true },    // ATTR_CTL_FONT_HEIGHT     from 614
111     { SID_ATTR_CHAR_CTL_WEIGHT,     true },    // ATTR_CTL_FONT_WEIGHT     from 614
112     { SID_ATTR_CHAR_CTL_POSTURE,    true },    // ATTR_CTL_FONT_POSTURE    from 614
113     { SID_ATTR_CHAR_CTL_LANGUAGE,   true },    // ATTR_CTL_FONT_LANGUAGE   from 614
114     { SID_ATTR_CHAR_EMPHASISMARK,   true },    // ATTR_FONT_EMPHASISMARK   from 614
115     { 0,                            true },    // ATTR_USERDEF             from 614 / 641c
116     { SID_ATTR_CHAR_WORDLINEMODE,   true },    // ATTR_FONT_WORDLINE       from 632b
117     { SID_ATTR_CHAR_RELIEF,         true },    // ATTR_FONT_RELIEF         from 632b
118     { SID_ATTR_ALIGN_HYPHENATION,   true },    // ATTR_HYPHENATE           from 632b
119     { 0,                            true },    // ATTR_SCRIPTSPACE         from 614d
120     { 0,                            true },    // ATTR_HANGPUNCTUATION     from 614d
121     { SID_ATTR_PARA_FORBIDDEN_RULES,true },    // ATTR_FORBIDDEN_RULES     from 614d
122     { SID_ATTR_ALIGN_HOR_JUSTIFY,   true },    // ATTR_HOR_JUSTIFY
123     { SID_ATTR_ALIGN_HOR_JUSTIFY_METHOD, true }, // ATTR_HOR_JUSTIFY_METHOD
124     { SID_ATTR_ALIGN_INDENT,        true },    // ATTR_INDENT          from 350
125     { SID_ATTR_ALIGN_VER_JUSTIFY,   true },    // ATTR_VER_JUSTIFY
126     { SID_ATTR_ALIGN_VER_JUSTIFY_METHOD, true }, // ATTR_VER_JUSTIFY_METHOD
127     { SID_ATTR_ALIGN_STACKED,       true },    // ATTR_STACKED         from 680/dr14 (replaces ATTR_ORIENTATION)
128     { SID_ATTR_ALIGN_DEGREES,       true },    // ATTR_ROTATE_VALUE    from 367
129     { SID_ATTR_ALIGN_LOCKPOS,       true },    // ATTR_ROTATE_MODE     from 367
130     { SID_ATTR_ALIGN_ASIANVERTICAL, true },    // ATTR_VERTICAL_ASIAN  from 642
131     { SID_ATTR_FRAMEDIRECTION,      true },    // ATTR_WRITINGDIR      from 643
132     { SID_ATTR_ALIGN_LINEBREAK,     true },    // ATTR_LINEBREAK
133     { SID_ATTR_ALIGN_SHRINKTOFIT,   true },    // ATTR_SHRINKTOFIT     from 680/dr14
134     { SID_ATTR_BORDER_DIAG_TLBR,    true },    // ATTR_BORDER_TLBR     from 680/dr14
135     { SID_ATTR_BORDER_DIAG_BLTR,    true },    // ATTR_BORDER_BLTR     from 680/dr14
136     { SID_ATTR_ALIGN_MARGIN,        true },    // ATTR_MARGIN
137     { 0,                            true },    // ATTR_MERGE
138     { 0,                            true },    // ATTR_MERGE_FLAG
139     { SID_ATTR_NUMBERFORMAT_VALUE,  true },    // ATTR_VALUE_FORMAT
140     { ATTR_LANGUAGE_FORMAT,         true },    // ATTR_LANGUAGE_FORMAT from 329, is combined with SID_ATTR_NUMBERFORMAT_VALUE in the dialog
141     { SID_ATTR_BRUSH,               true },    // ATTR_BACKGROUND
142     { SID_SCATTR_PROTECTION,        true },    // ATTR_PROTECTION
143     { SID_ATTR_BORDER_OUTER,        true },    // ATTR_BORDER
144     { SID_ATTR_BORDER_INNER,        true },    // ATTR_BORDER_INNER
145     { SID_ATTR_BORDER_SHADOW,       true },    // ATTR_SHADOW
146     { 0,                            true },    // ATTR_VALIDDATA
147     { 0,                            true },    // ATTR_CONDITIONAL
148     { 0,                            true },    // ATTR_HYPERLINK
149     { 0,                            true },    // ATTR_PATTERN
150     { SID_ATTR_LRSPACE,             true },    // ATTR_LRSPACE
151     { SID_ATTR_ULSPACE,             true },    // ATTR_ULSPACE
152     { SID_ATTR_PAGE,                true },    // ATTR_PAGE
153     { SID_ATTR_PAGE_PAPERBIN,       true },    // ATTR_PAGE_PAPERBIN
154     { SID_ATTR_PAGE_SIZE,           true },    // ATTR_PAGE_SIZE
155     { SID_ATTR_PAGE_EXT1,           true },    // ATTR_PAGE_HORCENTER
156     { SID_ATTR_PAGE_EXT2,           true },    // ATTR_PAGE_VERCENTER
157     { SID_ATTR_PAGE_ON,             true },    // ATTR_PAGE_ON
158     { SID_ATTR_PAGE_DYNAMIC,        true },    // ATTR_PAGE_DYNAMIC
159     { SID_ATTR_PAGE_SHARED,         true },    // ATTR_PAGE_SHARED
160     { SID_ATTR_PAGE_SHARED_FIRST,   true },    // ATTR_PAGE_SHARED_FIRST
161     { SID_SCATTR_PAGE_NOTES,        true },    // ATTR_PAGE_NOTES
162     { SID_SCATTR_PAGE_GRID,         true },    // ATTR_PAGE_GRID
163     { SID_SCATTR_PAGE_HEADERS,      true },    // ATTR_PAGE_HEADERS
164     { SID_SCATTR_PAGE_CHARTS,       true },    // ATTR_PAGE_CHARTS
165     { SID_SCATTR_PAGE_OBJECTS,      true },    // ATTR_PAGE_OBJECTS
166     { SID_SCATTR_PAGE_DRAWINGS,     true },    // ATTR_PAGE_DRAWINGS
167     { SID_SCATTR_PAGE_TOPDOWN,      true },    // ATTR_PAGE_TOPDOWN
168     { SID_SCATTR_PAGE_SCALE,        true },    // ATTR_PAGE_SCALE
169     { SID_SCATTR_PAGE_SCALETOPAGES, true },    // ATTR_PAGE_SCALETOPAGES
170     { SID_SCATTR_PAGE_FIRSTPAGENO,  true },    // ATTR_PAGE_FIRSTPAGENO
171     { SID_SCATTR_PAGE_HEADERLEFT,   true },    // ATTR_PAGE_HEADERLEFT
172     { SID_SCATTR_PAGE_FOOTERLEFT,   true },    // ATTR_PAGE_FOOTERLEFT
173     { SID_SCATTR_PAGE_HEADERRIGHT,  true },    // ATTR_PAGE_HEADERRIGHT
174     { SID_SCATTR_PAGE_FOOTERRIGHT,  true },    // ATTR_PAGE_FOOTERRIGHT
175     { SID_SCATTR_PAGE_HEADERFIRST,  true },    // ATTR_PAGE_HEADERFIRST
176     { SID_SCATTR_PAGE_FOOTERFIRST,  true },    // ATTR_PAGE_FOOTERFIRST
177     { SID_ATTR_PAGE_HEADERSET,      true },    // ATTR_PAGE_HEADERSET
178     { SID_ATTR_PAGE_FOOTERSET,      true },    // ATTR_PAGE_FOOTERSET
179     { SID_SCATTR_PAGE_FORMULAS,     true },    // ATTR_PAGE_FORMULAS
180     { SID_SCATTR_PAGE_NULLVALS,     true },    // ATTR_PAGE_NULLVALS
181     { SID_SCATTR_PAGE_SCALETO,      true },    // ATTR_PAGE_SCALETO
182     { 0,                            true }     // ATTR_HIDDEN
183 };
184 static_assert(
185     SAL_N_ELEMENTS(aItemInfos) == ATTR_ENDINDEX - ATTR_STARTINDEX + 1, "these must match");
186 
ScDocumentPool()187 ScDocumentPool::ScDocumentPool()
188 
189     :   SfxItemPool ( "ScDocumentPool",
190                         ATTR_STARTINDEX, ATTR_ENDINDEX,
191                         aItemInfos, nullptr ),
192     mvPoolDefaults(ATTR_ENDINDEX-ATTR_STARTINDEX+1),
193     mnCurrentMaxKey(0)
194 {
195 
196     LanguageType nDefLang, nCjkLang, nCtlLang;
197     bool bAutoSpell;
198     ScModule::GetSpellSettings( nDefLang, nCjkLang, nCtlLang, bAutoSpell );
199 
200     //  latin font from GetDefaultFonts is not used, DEFAULTFONT_LATIN_SPREADSHEET instead
201     SvxFontItem* pStdFont = getDefaultFontItem(nDefLang, DefaultFontType::LATIN_SPREADSHEET, ATTR_FONT);
202     SvxFontItem* pCjkFont = getDefaultFontItem(nCjkLang, DefaultFontType::CJK_SPREADSHEET, ATTR_CJK_FONT);
203     SvxFontItem* pCtlFont = getDefaultFontItem(nCtlLang, DefaultFontType::CTL_SPREADSHEET, ATTR_CTL_FONT);
204 
205     SvxBoxInfoItem* pGlobalBorderInnerAttr = new SvxBoxInfoItem( ATTR_BORDER_INNER );
206     auto pSet = std::make_unique<SfxItemSet>( *this, svl::Items<ATTR_PATTERN_START, ATTR_PATTERN_END>{} );
207     SfxItemSet      aSetItemItemSet( *this,
208                                      svl::Items<ATTR_BACKGROUND, ATTR_BACKGROUND,
209                                      ATTR_BORDER,     ATTR_SHADOW,
210                                      ATTR_LRSPACE,    ATTR_ULSPACE,
211                                      ATTR_PAGE_SIZE,  ATTR_PAGE_SIZE,
212                                      ATTR_PAGE_ON,    ATTR_PAGE_SHARED_FIRST>{} );
213 
214     pGlobalBorderInnerAttr->SetLine(nullptr, SvxBoxInfoItemLine::HORI);
215     pGlobalBorderInnerAttr->SetLine(nullptr, SvxBoxInfoItemLine::VERT);
216     pGlobalBorderInnerAttr->SetTable(true);
217     pGlobalBorderInnerAttr->SetDist(true);
218     pGlobalBorderInnerAttr->SetMinDist(false);
219 
220     mvPoolDefaults[ ATTR_FONT            - ATTR_STARTINDEX ] = pStdFont;
221     mvPoolDefaults[ ATTR_FONT_HEIGHT     - ATTR_STARTINDEX ] = new SvxFontHeightItem( 200, 100, ATTR_FONT_HEIGHT );       // 10 pt;
222     mvPoolDefaults[ ATTR_FONT_WEIGHT     - ATTR_STARTINDEX ] = new SvxWeightItem( WEIGHT_NORMAL, ATTR_FONT_WEIGHT );
223     mvPoolDefaults[ ATTR_FONT_POSTURE    - ATTR_STARTINDEX ] = new SvxPostureItem( ITALIC_NONE, ATTR_FONT_POSTURE );
224     mvPoolDefaults[ ATTR_FONT_UNDERLINE  - ATTR_STARTINDEX ] = new SvxUnderlineItem( LINESTYLE_NONE, ATTR_FONT_UNDERLINE );
225     mvPoolDefaults[ ATTR_FONT_OVERLINE   - ATTR_STARTINDEX ] = new SvxOverlineItem( LINESTYLE_NONE, ATTR_FONT_OVERLINE );
226     mvPoolDefaults[ ATTR_FONT_CROSSEDOUT - ATTR_STARTINDEX ] = new SvxCrossedOutItem( STRIKEOUT_NONE, ATTR_FONT_CROSSEDOUT );
227     mvPoolDefaults[ ATTR_FONT_CONTOUR    - ATTR_STARTINDEX ] = new SvxContourItem( false, ATTR_FONT_CONTOUR );
228     mvPoolDefaults[ ATTR_FONT_SHADOWED   - ATTR_STARTINDEX ] = new SvxShadowedItem( false, ATTR_FONT_SHADOWED );
229     mvPoolDefaults[ ATTR_FONT_COLOR      - ATTR_STARTINDEX ] = new SvxColorItem( COL_AUTO, ATTR_FONT_COLOR );
230     mvPoolDefaults[ ATTR_FONT_LANGUAGE   - ATTR_STARTINDEX ] = new SvxLanguageItem( LANGUAGE_DONTKNOW, ATTR_FONT_LANGUAGE );
231     mvPoolDefaults[ ATTR_CJK_FONT        - ATTR_STARTINDEX ] = pCjkFont;
232     mvPoolDefaults[ ATTR_CJK_FONT_HEIGHT - ATTR_STARTINDEX ] = new SvxFontHeightItem( 200, 100, ATTR_CJK_FONT_HEIGHT );
233     mvPoolDefaults[ ATTR_CJK_FONT_WEIGHT - ATTR_STARTINDEX ] = new SvxWeightItem( WEIGHT_NORMAL, ATTR_CJK_FONT_WEIGHT );
234     mvPoolDefaults[ ATTR_CJK_FONT_POSTURE- ATTR_STARTINDEX ] = new SvxPostureItem( ITALIC_NONE, ATTR_CJK_FONT_POSTURE );
235     mvPoolDefaults[ ATTR_CJK_FONT_LANGUAGE-ATTR_STARTINDEX ] = new SvxLanguageItem( LANGUAGE_DONTKNOW, ATTR_CJK_FONT_LANGUAGE );
236     mvPoolDefaults[ ATTR_CTL_FONT        - ATTR_STARTINDEX ] = pCtlFont;
237     mvPoolDefaults[ ATTR_CTL_FONT_HEIGHT - ATTR_STARTINDEX ] = new SvxFontHeightItem( 200, 100, ATTR_CTL_FONT_HEIGHT );
238     mvPoolDefaults[ ATTR_CTL_FONT_WEIGHT - ATTR_STARTINDEX ] = new SvxWeightItem( WEIGHT_NORMAL, ATTR_CTL_FONT_WEIGHT );
239     mvPoolDefaults[ ATTR_CTL_FONT_POSTURE- ATTR_STARTINDEX ] = new SvxPostureItem( ITALIC_NONE, ATTR_CTL_FONT_POSTURE );
240     mvPoolDefaults[ ATTR_CTL_FONT_LANGUAGE-ATTR_STARTINDEX ] = new SvxLanguageItem( LANGUAGE_DONTKNOW, ATTR_CTL_FONT_LANGUAGE );
241     mvPoolDefaults[ ATTR_FONT_EMPHASISMARK-ATTR_STARTINDEX ] = new SvxEmphasisMarkItem( FontEmphasisMark::NONE, ATTR_FONT_EMPHASISMARK );
242     mvPoolDefaults[ ATTR_USERDEF         - ATTR_STARTINDEX ] = new SvXMLAttrContainerItem( ATTR_USERDEF );
243     mvPoolDefaults[ ATTR_FONT_WORDLINE   - ATTR_STARTINDEX ] = new SvxWordLineModeItem(false, ATTR_FONT_WORDLINE );
244     mvPoolDefaults[ ATTR_FONT_RELIEF     - ATTR_STARTINDEX ] = new SvxCharReliefItem( FontRelief::NONE, ATTR_FONT_RELIEF );
245     mvPoolDefaults[ ATTR_HYPHENATE       - ATTR_STARTINDEX ] = new ScHyphenateCell();
246     mvPoolDefaults[ ATTR_SCRIPTSPACE     - ATTR_STARTINDEX ] = new SvxScriptSpaceItem( false, ATTR_SCRIPTSPACE);
247     mvPoolDefaults[ ATTR_HANGPUNCTUATION - ATTR_STARTINDEX ] = new SvxHangingPunctuationItem( false, ATTR_HANGPUNCTUATION);
248     mvPoolDefaults[ ATTR_FORBIDDEN_RULES - ATTR_STARTINDEX ] = new SvxForbiddenRuleItem( false, ATTR_FORBIDDEN_RULES);
249     mvPoolDefaults[ ATTR_HOR_JUSTIFY     - ATTR_STARTINDEX ] = new SvxHorJustifyItem( SvxCellHorJustify::Standard, ATTR_HOR_JUSTIFY);
250     mvPoolDefaults[ ATTR_HOR_JUSTIFY_METHOD - ATTR_STARTINDEX ] = new SvxJustifyMethodItem( SvxCellJustifyMethod::Auto, ATTR_HOR_JUSTIFY_METHOD);
251     mvPoolDefaults[ ATTR_INDENT          - ATTR_STARTINDEX ] = new ScIndentItem( 0 );
252     mvPoolDefaults[ ATTR_VER_JUSTIFY     - ATTR_STARTINDEX ] = new SvxVerJustifyItem( SvxCellVerJustify::Standard, ATTR_VER_JUSTIFY);
253     mvPoolDefaults[ ATTR_VER_JUSTIFY_METHOD - ATTR_STARTINDEX ] = new SvxJustifyMethodItem( SvxCellJustifyMethod::Auto, ATTR_VER_JUSTIFY_METHOD);
254     mvPoolDefaults[ ATTR_STACKED         - ATTR_STARTINDEX ] = new ScVerticalStackCell(false);
255     mvPoolDefaults[ ATTR_ROTATE_VALUE    - ATTR_STARTINDEX ] = new ScRotateValueItem( 0_deg100 );
256     mvPoolDefaults[ ATTR_ROTATE_MODE     - ATTR_STARTINDEX ] = new SvxRotateModeItem( SVX_ROTATE_MODE_BOTTOM, ATTR_ROTATE_MODE );
257     mvPoolDefaults[ ATTR_VERTICAL_ASIAN  - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_VERTICAL_ASIAN );
258     //  The default for the ATTR_WRITINGDIR cell attribute must by SvxFrameDirection::Environment,
259     //  so that value is returned when asking for a default cell's attributes.
260     //  The value from the page style is set as DefaultHorizontalTextDirection for the EditEngine.
261     mvPoolDefaults[ ATTR_WRITINGDIR      - ATTR_STARTINDEX ] = new SvxFrameDirectionItem( SvxFrameDirection::Environment, ATTR_WRITINGDIR );
262     mvPoolDefaults[ ATTR_LINEBREAK       - ATTR_STARTINDEX ] = new ScLineBreakCell();
263     mvPoolDefaults[ ATTR_SHRINKTOFIT     - ATTR_STARTINDEX ] = new ScShrinkToFitCell();
264     mvPoolDefaults[ ATTR_BORDER_TLBR     - ATTR_STARTINDEX ] = new SvxLineItem( ATTR_BORDER_TLBR );
265     mvPoolDefaults[ ATTR_BORDER_BLTR     - ATTR_STARTINDEX ] = new SvxLineItem( ATTR_BORDER_BLTR );
266     mvPoolDefaults[ ATTR_MARGIN          - ATTR_STARTINDEX ] = new SvxMarginItem( ATTR_MARGIN );
267     mvPoolDefaults[ ATTR_MERGE           - ATTR_STARTINDEX ] = new ScMergeAttr;
268     mvPoolDefaults[ ATTR_MERGE_FLAG      - ATTR_STARTINDEX ] = new ScMergeFlagAttr;
269     mvPoolDefaults[ ATTR_VALUE_FORMAT    - ATTR_STARTINDEX ] = new SfxUInt32Item( ATTR_VALUE_FORMAT, 0 );
270     mvPoolDefaults[ ATTR_LANGUAGE_FORMAT - ATTR_STARTINDEX ] = new SvxLanguageItem( ScGlobal::eLnge, ATTR_LANGUAGE_FORMAT );
271     mvPoolDefaults[ ATTR_BACKGROUND      - ATTR_STARTINDEX ] = new SvxBrushItem( COL_TRANSPARENT, ATTR_BACKGROUND );
272     mvPoolDefaults[ ATTR_PROTECTION      - ATTR_STARTINDEX ] = new ScProtectionAttr;
273     mvPoolDefaults[ ATTR_BORDER          - ATTR_STARTINDEX ] = new SvxBoxItem( ATTR_BORDER );
274     mvPoolDefaults[ ATTR_BORDER_INNER    - ATTR_STARTINDEX ] = pGlobalBorderInnerAttr;
275     mvPoolDefaults[ ATTR_SHADOW          - ATTR_STARTINDEX ] = new SvxShadowItem( ATTR_SHADOW );
276     mvPoolDefaults[ ATTR_VALIDDATA       - ATTR_STARTINDEX ] = new SfxUInt32Item( ATTR_VALIDDATA, 0 );
277     mvPoolDefaults[ ATTR_CONDITIONAL     - ATTR_STARTINDEX ] = new ScCondFormatItem;
278     mvPoolDefaults[ ATTR_HYPERLINK       - ATTR_STARTINDEX ] = new SfxStringItem( ATTR_HYPERLINK, OUString() ) ;
279 
280     // GetRscString only works after ScGlobal::Init (indicated by the EmptyBrushItem)
281     // TODO: Write additional method ScGlobal::IsInit() or somesuch
282     //       or detect whether this is the Secondary Pool for a MessagePool
283     if ( ScGlobal::GetEmptyBrushItem() )
284         mvPoolDefaults[ ATTR_PATTERN     - ATTR_STARTINDEX ] = new ScPatternAttr( std::move(pSet), ScResId(STR_STYLENAME_STANDARD) );
285     else
286         mvPoolDefaults[ ATTR_PATTERN     - ATTR_STARTINDEX ] = new ScPatternAttr( std::move(pSet), STRING_STANDARD ); // FIXME: without name?
287 
288     mvPoolDefaults[ ATTR_LRSPACE         - ATTR_STARTINDEX ] = new SvxLRSpaceItem( ATTR_LRSPACE );
289     mvPoolDefaults[ ATTR_ULSPACE         - ATTR_STARTINDEX ] = new SvxULSpaceItem( ATTR_ULSPACE );
290     mvPoolDefaults[ ATTR_PAGE            - ATTR_STARTINDEX ] = new SvxPageItem( ATTR_PAGE );
291     mvPoolDefaults[ ATTR_PAGE_PAPERBIN   - ATTR_STARTINDEX ] = new SvxPaperBinItem( ATTR_PAGE_PAPERBIN );
292     mvPoolDefaults[ ATTR_PAGE_SIZE       - ATTR_STARTINDEX ] = new SvxSizeItem( ATTR_PAGE_SIZE );
293     mvPoolDefaults[ ATTR_PAGE_HORCENTER  - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_HORCENTER );
294     mvPoolDefaults[ ATTR_PAGE_VERCENTER  - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_VERCENTER );
295     mvPoolDefaults[ ATTR_PAGE_ON         - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_ON, true );
296     mvPoolDefaults[ ATTR_PAGE_DYNAMIC    - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_DYNAMIC, true );
297     mvPoolDefaults[ ATTR_PAGE_SHARED     - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_SHARED, true );
298     mvPoolDefaults[ ATTR_PAGE_SHARED_FIRST- ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_SHARED_FIRST, true );
299     mvPoolDefaults[ ATTR_PAGE_NOTES      - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_NOTES, false );
300     mvPoolDefaults[ ATTR_PAGE_GRID       - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_GRID, false );
301     mvPoolDefaults[ ATTR_PAGE_HEADERS    - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_HEADERS, false );
302     mvPoolDefaults[ ATTR_PAGE_CHARTS     - ATTR_STARTINDEX ] = new ScViewObjectModeItem( ATTR_PAGE_CHARTS );
303     mvPoolDefaults[ ATTR_PAGE_OBJECTS    - ATTR_STARTINDEX ] = new ScViewObjectModeItem( ATTR_PAGE_OBJECTS );
304     mvPoolDefaults[ ATTR_PAGE_DRAWINGS   - ATTR_STARTINDEX ] = new ScViewObjectModeItem( ATTR_PAGE_DRAWINGS );
305     mvPoolDefaults[ ATTR_PAGE_TOPDOWN    - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_TOPDOWN, true );
306     mvPoolDefaults[ ATTR_PAGE_SCALE      - ATTR_STARTINDEX ] = new SfxUInt16Item( ATTR_PAGE_SCALE, 100 );
307     mvPoolDefaults[ ATTR_PAGE_SCALETOPAGES-ATTR_STARTINDEX ] = new SfxUInt16Item( ATTR_PAGE_SCALETOPAGES, 1 );
308     mvPoolDefaults[ ATTR_PAGE_FIRSTPAGENO- ATTR_STARTINDEX ] = new SfxUInt16Item( ATTR_PAGE_FIRSTPAGENO, 1 );
309     mvPoolDefaults[ ATTR_PAGE_HEADERLEFT - ATTR_STARTINDEX ] = new ScPageHFItem( ATTR_PAGE_HEADERLEFT );
310     mvPoolDefaults[ ATTR_PAGE_FOOTERLEFT - ATTR_STARTINDEX ] = new ScPageHFItem( ATTR_PAGE_FOOTERLEFT );
311     mvPoolDefaults[ ATTR_PAGE_HEADERRIGHT- ATTR_STARTINDEX ] = new ScPageHFItem( ATTR_PAGE_HEADERRIGHT );
312     mvPoolDefaults[ ATTR_PAGE_FOOTERRIGHT- ATTR_STARTINDEX ] = new ScPageHFItem( ATTR_PAGE_FOOTERRIGHT );
313     mvPoolDefaults[ ATTR_PAGE_HEADERFIRST- ATTR_STARTINDEX ] = new ScPageHFItem( ATTR_PAGE_HEADERFIRST );
314     mvPoolDefaults[ ATTR_PAGE_FOOTERFIRST- ATTR_STARTINDEX ] = new ScPageHFItem( ATTR_PAGE_FOOTERFIRST );
315     mvPoolDefaults[ ATTR_PAGE_HEADERSET  - ATTR_STARTINDEX ] = new SvxSetItem( ATTR_PAGE_HEADERSET, aSetItemItemSet );
316     mvPoolDefaults[ ATTR_PAGE_FOOTERSET  - ATTR_STARTINDEX ] = new SvxSetItem( ATTR_PAGE_FOOTERSET, aSetItemItemSet );
317     mvPoolDefaults[ ATTR_PAGE_FORMULAS   - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_FORMULAS, false );
318     mvPoolDefaults[ ATTR_PAGE_NULLVALS   - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_NULLVALS, true );
319     mvPoolDefaults[ ATTR_PAGE_SCALETO    - ATTR_STARTINDEX ] = new ScPageScaleToItem( 1, 1 );
320     mvPoolDefaults[ ATTR_HIDDEN          - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_HIDDEN, false );
321 
322     SetDefaults( &mvPoolDefaults );
323 }
324 
~ScDocumentPool()325 ScDocumentPool::~ScDocumentPool()
326 {
327     Delete();
328 
329     for ( sal_uInt16 i=0; i < ATTR_ENDINDEX-ATTR_STARTINDEX+1; i++ )
330     {
331         ClearRefCount( *mvPoolDefaults[i] );
332         delete mvPoolDefaults[i];
333     }
334 }
335 
PutImpl(const SfxPoolItem & rItem,sal_uInt16 nWhich,bool bPassingOwnership)336 const SfxPoolItem& ScDocumentPool::PutImpl( const SfxPoolItem& rItem, sal_uInt16 nWhich, bool bPassingOwnership )
337 {
338     if ( rItem.Which() != ATTR_PATTERN ) // Only Pattern is special
339         return SfxItemPool::PutImpl( rItem, nWhich, bPassingOwnership );
340 
341     // Don't copy the default pattern of this Pool
342     if (&rItem == mvPoolDefaults[ ATTR_PATTERN - ATTR_STARTINDEX ])
343         return rItem;
344 
345     // Else Put must always happen, because it could be another Pool
346     const SfxPoolItem& rNew = SfxItemPool::PutImpl( rItem, nWhich, bPassingOwnership );
347     sal_uInt32 nRef = rNew.GetRefCount();
348     if (nRef == 1)
349     {
350         ++mnCurrentMaxKey;
351         const_cast<ScPatternAttr&>(static_cast<const ScPatternAttr&>(rNew)).SetKey(mnCurrentMaxKey);
352     }
353     return rNew;
354 }
355 
StyleDeleted(const ScStyleSheet * pStyle)356 void ScDocumentPool::StyleDeleted( const ScStyleSheet* pStyle )
357 {
358     for (const SfxPoolItem* pItem : GetItemSurrogates( ATTR_PATTERN ))
359     {
360         ScPatternAttr* pPattern = const_cast<ScPatternAttr*>(dynamic_cast<const ScPatternAttr*>(pItem));
361         if ( pPattern && pPattern->GetStyleSheet() == pStyle )
362             pPattern->StyleToName();
363     }
364 }
365 
CellStyleCreated(std::u16string_view rName,const ScDocument & rDoc)366 void ScDocumentPool::CellStyleCreated( std::u16string_view rName, const ScDocument& rDoc )
367 {
368     // If a style was created, don't keep any pattern with its name string in the pool,
369     // because it would compare equal to a pattern with a pointer to the new style.
370     // Calling StyleSheetChanged isn't enough because the pool may still contain items
371     // for undo or clipboard content.
372 
373     for (const SfxPoolItem* pItem : GetItemSurrogates( ATTR_PATTERN ))
374     {
375         auto pPattern = const_cast<ScPatternAttr*>(dynamic_cast<const ScPatternAttr*>(pItem));
376         if ( pPattern && pPattern->GetStyleSheet() == nullptr )
377         {
378             const OUString* pStyleName = pPattern->GetStyleName();
379             if ( pStyleName && *pStyleName == rName )
380                 pPattern->UpdateStyleSheet(rDoc); // find and store style pointer
381         }
382     }
383 }
384 
Clone() const385 rtl::Reference<SfxItemPool> ScDocumentPool::Clone() const
386 {
387     return new SfxItemPool (*this, true);
388 }
389 
lcl_HFPresentation(const SfxPoolItem & rItem,MapUnit eCoreMetric,MapUnit ePresentationMetric,OUString & rText,const IntlWrapper & rIntl)390 static bool lcl_HFPresentation
391 (
392     const SfxPoolItem&  rItem,
393     MapUnit             eCoreMetric,
394     MapUnit             ePresentationMetric,
395     OUString&           rText,
396     const IntlWrapper& rIntl
397 )
398 {
399     const SfxItemSet& rSet = static_cast<const SfxSetItem&>(rItem).GetItemSet();
400     const SfxPoolItem* pItem;
401 
402     if ( SfxItemState::SET == rSet.GetItemState(ATTR_PAGE_ON,false,&pItem) )
403     {
404         if( !static_cast<const SfxBoolItem*>(pItem)->GetValue() )
405             return false;
406     }
407 
408     SfxItemIter aIter( rSet );
409 
410     for (pItem = aIter.GetCurItem(); pItem; pItem = aIter.NextItem())
411     {
412         sal_uInt16 nWhich = pItem->Which();
413 
414         OUString aText;
415 
416         switch( nWhich )
417         {
418             case ATTR_PAGE_ON:
419             case ATTR_PAGE_DYNAMIC:
420             case ATTR_PAGE_SHARED:
421             case ATTR_PAGE_SHARED_FIRST:
422             break;
423 
424             case ATTR_LRSPACE:
425             {
426                 const SvxLRSpaceItem& rLRItem = static_cast<const SvxLRSpaceItem&>(*pItem);
427                 sal_uInt16 nPropLeftMargin  = rLRItem.GetPropLeft();
428                 sal_uInt16 nPropRightMargin = rLRItem.GetPropRight();
429                 sal_uInt16 nLeftMargin, nRightMargin;
430                 tools::Long nTmp;
431                 nTmp = rLRItem.GetLeft();
432                 nLeftMargin = nTmp < 0 ? 0 : sal_uInt16(nTmp);
433                 nTmp = rLRItem.GetRight();
434                 nRightMargin = nTmp < 0 ? 0 : sal_uInt16(nTmp);
435 
436                 aText = EditResId(RID_SVXITEMS_LRSPACE_LEFT);
437                 if ( 100 != nPropLeftMargin )
438                 {
439                     aText += unicode::formatPercent(nPropLeftMargin,
440                         Application::GetSettings().GetUILanguageTag());
441                 }
442                 else
443                 {
444                     aText += GetMetricText( static_cast<tools::Long>(nLeftMargin),
445                                            eCoreMetric, ePresentationMetric, &rIntl ) +
446                         " " + EditResId(GetMetricId(ePresentationMetric));
447                 }
448                 aText += cpDelim +
449                     // We don't have a nPropFirstLineOffset
450                     EditResId(RID_SVXITEMS_LRSPACE_RIGHT);
451                 if ( 100 != nPropRightMargin )
452                 {
453                     aText += unicode::formatPercent(nPropLeftMargin,
454                         Application::GetSettings().GetUILanguageTag());
455                 }
456                 else
457                 {
458                     aText += GetMetricText( static_cast<tools::Long>(nRightMargin),
459                                             eCoreMetric, ePresentationMetric, &rIntl ) +
460                         " " + EditResId(GetMetricId(ePresentationMetric));
461                 }
462             }
463             break;
464 
465             default:
466                 pItem->GetPresentation( SfxItemPresentation::Complete, eCoreMetric, ePresentationMetric, aText, rIntl );
467 
468         }
469 
470         if ( aText.getLength() )
471         {
472             rText += aText + " + ";
473         }
474     }
475 
476     rText = comphelper::string::stripEnd(rText, ' ');
477     rText = comphelper::string::stripEnd(rText, '+');
478     rText = comphelper::string::stripEnd(rText, ' ');
479     return true;
480 }
481 
GetPresentation(const SfxPoolItem & rItem,MapUnit ePresentationMetric,OUString & rText,const IntlWrapper & rIntl) const482 bool ScDocumentPool::GetPresentation(
483     const SfxPoolItem&  rItem,
484     MapUnit             ePresentationMetric,
485     OUString&           rText,
486     const IntlWrapper& rIntl ) const
487 {
488     sal_uInt16  nW = rItem.Which();
489     OUString aStrYes  ( ScResId(STR_YES) );
490     OUString aStrNo   ( ScResId(STR_NO) );
491     OUString aStrSep(": ");
492 
493     bool ePresentationRet = true;
494     switch( nW )
495     {
496         case ATTR_PAGE_TOPDOWN:
497             rText = ScResId(STR_SCATTR_PAGE_PRINTDIR) + aStrSep;
498             rText += static_cast<const SfxBoolItem&>(rItem).GetValue() ?
499                 ScResId(STR_SCATTR_PAGE_TOPDOWN) :
500                 ScResId(STR_SCATTR_PAGE_LEFTRIGHT) ;
501         break;
502 
503         case ATTR_PAGE_HEADERS:
504             rText = ScResId(STR_SCATTR_PAGE_HEADERS) + aStrSep;
505             rText += static_cast<const SfxBoolItem&>(rItem).GetValue() ? aStrYes : aStrNo ;
506         break;
507 
508         case ATTR_PAGE_NULLVALS:
509             rText = ScResId(STR_SCATTR_PAGE_NULLVALS) + aStrSep;
510             rText += static_cast<const SfxBoolItem&>(rItem).GetValue() ? aStrYes : aStrNo ;
511         break;
512 
513         case ATTR_PAGE_FORMULAS:
514             rText = ScResId(STR_SCATTR_PAGE_FORMULAS) + aStrSep;
515             rText += static_cast<const SfxBoolItem&>(rItem).GetValue() ? aStrYes : aStrNo ;
516         break;
517 
518         case ATTR_PAGE_NOTES:
519             rText = ScResId(STR_SCATTR_PAGE_NOTES) + aStrSep;
520             rText += static_cast<const SfxBoolItem&>(rItem).GetValue() ? aStrYes : aStrNo ;
521         break;
522 
523         case ATTR_PAGE_GRID:
524             rText = ScResId(STR_SCATTR_PAGE_GRID) + aStrSep;
525             rText += static_cast<const SfxBoolItem&>(rItem).GetValue() ? aStrYes : aStrNo ;
526         break;
527 
528         case ATTR_PAGE_SCALETOPAGES:
529         {
530             sal_uInt16  nPagNo = static_cast<const SfxUInt16Item&>(rItem).GetValue();
531 
532             if( nPagNo )
533             {
534                 rText = ScResId( STR_SCATTR_PAGE_SCALETOPAGES ) + aStrSep;
535                 OUString aPages(ScResId(STR_SCATTR_PAGE_SCALE_PAGES, nPagNo));
536                 aPages = aPages.replaceFirst( "%1", OUString::number( nPagNo ) );
537                 rText += aPages;
538             }
539             else
540             {
541                 ePresentationRet = false;
542             }
543         }
544         break;
545 
546         case ATTR_PAGE_FIRSTPAGENO:
547         {
548             sal_uInt16  nPagNo = static_cast<const SfxUInt16Item&>(rItem).GetValue();
549 
550             if( nPagNo )
551             {
552                 rText = ScResId(STR_SCATTR_PAGE_FIRSTPAGENO) + aStrSep;
553                 rText += OUString::number( nPagNo );
554             }
555             else
556             {
557                 ePresentationRet = false;
558             }
559         }
560         break;
561 
562         case ATTR_PAGE_SCALE:
563         {
564             sal_uInt16  nPercent = static_cast<const SfxUInt16Item &>(rItem).GetValue();
565 
566             if( nPercent )
567             {
568                 rText = ScResId(STR_SCATTR_PAGE_SCALE) + aStrSep;
569                 rText += unicode::formatPercent(nPercent,
570                     Application::GetSettings().GetUILanguageTag());
571             }
572             else
573             {
574                 ePresentationRet = false;
575             }
576         }
577         break;
578 
579         case ATTR_PAGE_HEADERSET:
580         {
581             OUString  aBuffer;
582 
583             if( lcl_HFPresentation( rItem, GetMetric( nW ), ePresentationMetric, aBuffer, rIntl ) )
584             {
585                 rText = ScResId(STR_HEADER) + " ( " + aBuffer + " ) ";
586             }
587         }
588         break;
589 
590         case ATTR_PAGE_FOOTERSET:
591         {
592             OUString  aBuffer;
593 
594             if( lcl_HFPresentation( rItem, GetMetric( nW ), ePresentationMetric, aBuffer, rIntl ) )
595             {
596                 rText = ScResId(STR_FOOTER) + " ( " + aBuffer + " ) ";
597             }
598         }
599         break;
600 
601         default:
602             ePresentationRet = rItem.GetPresentation( SfxItemPresentation::Complete, GetMetric( nW ), ePresentationMetric, rText, rIntl );
603         break;
604     }
605 
606     return ePresentationRet;
607 }
608 
GetMetric(sal_uInt16 nWhich) const609 MapUnit ScDocumentPool::GetMetric( sal_uInt16 nWhich ) const
610 {
611     // Own attributes in Twips, everything else in 1/100 mm
612     if ( nWhich >= ATTR_STARTINDEX && nWhich <= ATTR_ENDINDEX )
613         return MapUnit::MapTwip;
614     else
615         return MapUnit::Map100thMM;
616 }
617 
618 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
619