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