LibreOffice Module sc (master) 1
stlsheet.cxx
Go to the documentation of this file.
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 <document.hxx>
21#include <stlsheet.hxx>
22#include <stlpool.hxx>
23
24#include <scitems.hxx>
25#include <editeng/boxitem.hxx>
27#include <editeng/lrspitem.hxx>
28#include <svx/pageitem.hxx>
29#include <editeng/paperinf.hxx>
30#include <editeng/shaditem.hxx>
31#include <editeng/sizeitem.hxx>
32#include <editeng/ulspitem.hxx>
33#include <editeng/xmlcnitm.hxx>
34#include <svl/itempool.hxx>
35#include <svl/itemset.hxx>
36#include <svl/numformat.hxx>
37#include <svl/hint.hxx>
39#include <attrib.hxx>
40
41#include <globstr.hrc>
42#include <scresid.hxx>
43#include <sc.hrc>
44
47
48ScStyleSheet::ScStyleSheet( const OUString& rName,
49 const ScStyleSheetPool& rPoolP,
50 SfxStyleFamily eFamily,
51 SfxStyleSearchBits nMaskP )
52
53 : SfxStyleSheet ( rName, rPoolP, eFamily, nMaskP )
54 , eUsage( Usage::UNKNOWN )
55{
56}
57
59 : SfxStyleSheet ( rStyle )
60 , eUsage( Usage::UNKNOWN )
61{
62}
63
65{
66}
67
69{
70 return false;
71}
72
74{
75 bool bHasParentSupport = false;
76
77 switch ( GetFamily() )
78 {
79 case SfxStyleFamily::Para: bHasParentSupport = true; break;
80 case SfxStyleFamily::Page: bHasParentSupport = false; break;
81 default:
82 {
83 // added to avoid warnings
84 }
85 }
86
87 return bHasParentSupport;
88}
89
90bool ScStyleSheet::SetParent( const OUString& rParentName )
91{
92 bool bResult = false;
93 OUString aEffName = rParentName;
94 SfxStyleSheetBase* pStyle = m_pPool->Find( aEffName, nFamily );
95 if (!pStyle)
96 {
97 std::unique_ptr<SfxStyleSheetIterator> pIter = m_pPool->CreateIterator(nFamily);
98 pStyle = pIter->First();
99 if (pStyle)
100 aEffName = pStyle->GetName();
101 }
102
103 if ( pStyle && aEffName != GetName() )
104 {
105 bResult = SfxStyleSheet::SetParent( aEffName );
106 if (bResult)
107 {
108 SfxItemSet& rParentSet = pStyle->GetItemSet();
109 GetItemSet().SetParent( &rParentSet );
110
111 // #i113491# Drag&Drop in the stylist's hierarchical view doesn't execute a slot,
112 // so the repaint has to come from here (after modifying the ItemSet).
113 // RepaintRange checks the document's IsVisible flag and locked repaints.
114 ScDocument* pDoc = static_cast<ScStyleSheetPool*>(GetPool())->GetDocument();
115 if (pDoc)
116 pDoc->RepaintRange( ScRange( 0,0,0, pDoc->MaxCol(),pDoc->MaxRow(),MAXTAB ) );
117 }
118 }
119
120 return bResult;
121}
122
124{
125 GetItemSet().SetParent(nullptr);
126}
127
129{
130 if ( !pSet )
131 {
132 switch ( GetFamily() )
133 {
134 case SfxStyleFamily::Page:
135 {
136 // Page templates should not be derivable,
137 // therefore suitable values are set at this point.
138 // (== Standard page template)
139
140 SfxItemPool& rItemPool = GetPool()->GetPool();
141 pSet = new SfxItemSetFixed<
146 ATTR_LRSPACE, ATTR_PAGE_SCALETO>(rItemPool);
147
148 // If being loaded also the set is then filled in from the file,
149 // so the defaults do not need to be set.
150 // GetPrinter would then also create a new printer,
151 // because the stored Printer is not loaded yet!
152
153 ScDocument* pDoc = static_cast<ScStyleSheetPool*>(GetPool())->GetDocument();
154 if ( pDoc )
155 {
156 // Setting reasonable default values:
157 SvxPageItem aPageItem( ATTR_PAGE );
159
160 SvxSetItem aHFSetItem(
162
163 SfxItemSet& rHFSet = aHFSetItem.GetItemSet();
164 SvxSizeItem aHFSizeItem( // 0,5 cm + distance
167
168 SvxULSpaceItem aHFDistItem ( HFDIST_CM,// nUp
169 HFDIST_CM,// nLow
170 ATTR_ULSPACE );
171
172 SvxLRSpaceItem aLRSpaceItem( TWO_CM, // nLeft
173 TWO_CM, // nRight
174 TWO_CM, // nTLeft
175 0, // nFirstLineOffset
176 ATTR_LRSPACE );
177 SvxULSpaceItem aULSpaceItem( TWO_CM, // nUp
178 TWO_CM, // nLow
179 ATTR_ULSPACE );
180 SvxBoxInfoItem aBoxInfoItem( ATTR_BORDER_INNER );
181
182 aBoxInfoItem.SetTable( false );
183 aBoxInfoItem.SetDist( true );
184 aBoxInfoItem.SetValid( SvxBoxInfoItemValidFlags::DISTANCE );
185
186 aPageItem.SetLandscape( false );
187
188 rHFSet.Put( aBoxInfoItem );
189 rHFSet.Put( aHFSizeItem );
190 rHFSet.Put( aHFDistItem );
191 rHFSet.Put( SvxLRSpaceItem( 0,0,0,0, ATTR_LRSPACE ) ); // Set border to Null
192
193 aHFSetItem.SetWhich(ATTR_PAGE_HEADERSET);
194 pSet->Put( aHFSetItem );
195 aHFSetItem.SetWhich(ATTR_PAGE_FOOTERSET);
196 pSet->Put( aHFSetItem );
197 pSet->Put( aBoxInfoItem ); // Do not overwrite PoolDefault
198 // due to format templates
199
200
201 // Writing direction: not as pool default because the default for cells
202 // must remain SvxFrameDirection::Environment, and each page style's setting is
203 // supposed to be saved in the file format.
204 // The page default depends on the system language.
206 SvxFrameDirection::Horizontal_RL_TB : SvxFrameDirection::Horizontal_LR_TB;
208
209 rItemPool.SetPoolDefaultItem( aPageItem );
210 rItemPool.SetPoolDefaultItem( aPaperSizeItem );
211 rItemPool.SetPoolDefaultItem( aLRSpaceItem );
212 rItemPool.SetPoolDefaultItem( aULSpaceItem );
214 ScPageScaleToItem aScaleToItem;
215 rItemPool.SetPoolDefaultItem( aScaleToItem );
217 }
218 }
219 break;
220
221 case SfxStyleFamily::Para:
222 default:
224 break;
225 }
226 bMySet = true;
227 }
228 if ( nHelpId == HID_SC_SHEET_CELL_ERG1 )
229 {
230 if ( !pSet->Count() )
231 {
232 // Hack to work around that when this code is called from
233 // ~ScStyleSheetPool -> ~SfxStyleSheetPool, GetPool() is no longer
234 // an ScStyleSheetPool:
235 ScStyleSheetPool * pool = dynamic_cast<ScStyleSheetPool *>(
236 GetPool());
237 if (pool != nullptr) {
238 ScDocument* pDoc = pool->GetDocument();
239 if ( pDoc )
240 {
241 sal_uInt32 nNumFmt = pDoc->GetFormatTable()->GetStandardFormat( SvNumFormatType::CURRENCY,ScGlobal::eLnge );
242 pSet->Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNumFmt ) );
243 }
244 }
245 }
246 }
247
248 return *pSet;
249}
250
252{
253 switch (GetFamily())
254 {
255 case SfxStyleFamily::Para:
256 {
257 // Always query the document to let it decide if a rescan is necessary,
258 // and store the state.
259 ScDocument* pDoc = static_cast<ScStyleSheetPool*>(m_pPool)->GetDocument();
260 if ( pDoc && pDoc->IsStyleSheetUsed( *this ) )
262 else
264 return eUsage == Usage::USED;
265 }
266 case SfxStyleFamily::Page:
267 {
268 // tdf#108188 - verify that the page style is actually used
269 ScDocument* pDoc = static_cast<ScStyleSheetPool*>(m_pPool)->GetDocument();
270 if (pDoc && pDoc->IsPageStyleInUse(GetName(), nullptr))
272 else
274 return eUsage == Usage::USED;
275 }
276 default:
277 return true;
278 }
279}
280
282{
283 if ( rHint.GetId() == SfxHintId::Dying )
284 GetItemSet().SetParent( nullptr );
285}
286
287// Avoid creating a Style "Standard" if this is not the Standard-Name;
288// otherwise two styles would have the same name when storing.
289// (on loading the style is created directly per Make with the name; making this query
290// not applicable)
291//TODO: If at any time during loading SetName is called, a flag has to be set/checked for loading
292//TODO: The whole check has to be removed if for a new file version the name transformation is dropped.
293
294bool ScStyleSheet::SetName(const OUString& rNew, bool bReindexNow)
295{
296 OUString aFileStdName = STRING_STANDARD;
297 if ( rNew == aFileStdName && aFileStdName != ScResId(STR_STYLENAME_STANDARD) )
298 return false;
299 else
300 return SfxStyleSheet::SetName(rNew, bReindexNow);
301}
302
303/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
const SCTAB MAXTAB
Definition: address.hxx:70
SC_DLLPUBLIC SCCOL MaxCol() const
Definition: document.hxx:891
SC_DLLPUBLIC SCROW MaxRow() const
Definition: document.hxx:892
bool IsPageStyleInUse(std::u16string_view rStrPageStyle, SCTAB *pInTab)
Definition: documen8.cxx:310
void RepaintRange(const ScRange &rRange)
Definition: documen8.cxx:689
bool IsStyleSheetUsed(const ScStyleSheet &rStyle) const
Definition: document.cxx:5051
SC_DLLPUBLIC SvNumberFormatter * GetFormatTable() const
Definition: documen2.cxx:467
static bool IsSystemRTL()
Definition: global.cxx:893
static SC_DLLPUBLIC LanguageType eLnge
Definition: global.hxx:559
Contains the "scale to width/height" attribute in page styles.
Definition: attrib.hxx:225
ScDocument * GetDocument() const
Definition: stlpool.hxx:35
virtual ~ScStyleSheet() override
Definition: stlsheet.cxx:64
virtual bool SetName(const OUString &rNewName, bool bReindexNow=true) override
Definition: stlsheet.cxx:294
virtual SC_DLLPUBLIC SfxItemSet & GetItemSet() override
Definition: stlsheet.cxx:128
virtual void Notify(SfxBroadcaster &rBC, const SfxHint &rHint) override
Definition: stlsheet.cxx:281
virtual bool SetParent(const OUString &rParentName) override
Definition: stlsheet.cxx:90
ScStyleSheet(const ScStyleSheet &rStyle)
Definition: stlsheet.cxx:58
virtual bool HasFollowSupport() const override
Definition: stlsheet.cxx:68
virtual bool HasParentSupport() const override
Definition: stlsheet.cxx:73
SC_DLLPUBLIC void ResetParent()
Definition: stlsheet.cxx:123
virtual bool IsUsed() const override
Definition: stlsheet.cxx:251
ScStyleSheet::Usage eUsage
Definition: stlsheet.hxx:67
SfxHintId GetId() const
const SfxPoolItem & GetDefaultItem(sal_uInt16 nWhich) const
void SetPoolDefaultItem(const SfxPoolItem &)
void SetParent(const SfxItemSet *pNew)
sal_uInt16 Count() const
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
virtual SfxStyleSheetBase * Find(const OUString &, SfxStyleFamily eFam, SfxStyleSearchBits n=SfxStyleSearchBits::All) const
virtual std::unique_ptr< SfxStyleSheetIterator > CreateIterator(SfxStyleFamily, SfxStyleSearchBits nMask=SfxStyleSearchBits::All)
SfxItemPool & GetPool()
virtual bool SetName(const OUString &rNewName, bool bReindexNow=true)
const OUString & GetName() const
SfxStyleFamily GetFamily() const
virtual SfxItemSet & GetItemSet()
SfxItemSet * pSet
SfxStyleSheetBasePool * GetPool()
SfxStyleSheetBasePool * m_pPool
SfxStyleFamily nFamily
virtual bool SetParent(const OUString &) override
sal_uInt32 GetStandardFormat(SvNumFormatType eType, LanguageType eLnge=LANGUAGE_DONTKNOW)
void SetTable(bool bNew)
void SetDist(bool bNew)
void SetValid(SvxBoxInfoItemValidFlags nValid, bool bValid=true)
void SetLandscape(bool bL)
static Size GetDefaultPaperSize(MapUnit eUnit=MapUnit::MapTwip)
UNKNOWN
SvxFrameDirection
constexpr OUStringLiteral STRING_STANDARD
Definition: global.hxx:60
constexpr Point convert(const Point &rPoint, o3tl::Length eFrom, o3tl::Length eTo)
OUString ScResId(TranslateId aId)
Definition: scdll.cxx:90
constexpr TypedWhichId< SfxUInt16Item > ATTR_PAGE_SCALE(175)
constexpr TypedWhichId< SvxSizeItem > ATTR_PAGE_SIZE(161)
constexpr TypedWhichId< SvxSetItem > ATTR_PAGE_HEADERSET(184)
constexpr TypedWhichId< SvxULSpaceItem > ATTR_ULSPACE(158)
constexpr TypedWhichId< SvxBrushItem > ATTR_BACKGROUND(148)
constexpr TypedWhichId< SvxShadowItem > ATTR_SHADOW(152)
constexpr TypedWhichId< SvxBoxInfoItem > ATTR_BORDER_INNER(151)
constexpr TypedWhichId< SvxPageItem > ATTR_PAGE(159)
constexpr TypedWhichId< SvxBoxItem > ATTR_BORDER(150)
constexpr TypedWhichId< ScPageScaleToItem > ATTR_PAGE_SCALETO(188)
constexpr TypedWhichId< SfxUInt32Item > ATTR_VALUE_FORMAT(146)
constexpr TypedWhichId< SvxFrameDirectionItem > ATTR_WRITINGDIR(138)
constexpr TypedWhichId< SfxUInt16Item > ATTR_PAGE_SCALETOPAGES(176)
constexpr TypedWhichId< SvxSetItem > ATTR_PAGE_FOOTERSET(185)
constexpr TypedWhichId< SvXMLAttrContainerItem > ATTR_USERDEF(122)
constexpr TypedWhichId< SvxLRSpaceItem > ATTR_LRSPACE(157)
constexpr auto TWO_CM
Definition: stlsheet.cxx:45
constexpr auto HFDIST_CM
Definition: stlsheet.cxx:46
SfxStyleFamily
SfxStyleSearchBits