Line data Source code
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>
26 : #include <editeng/frmdiritem.hxx>
27 : #include <editeng/lrspitem.hxx>
28 : #include <svx/pageitem.hxx>
29 : #include <editeng/paperinf.hxx>
30 : #include <editeng/pbinitem.hxx>
31 : #include <editeng/sizeitem.hxx>
32 : #include <editeng/ulspitem.hxx>
33 : #include <sfx2/printer.hxx>
34 : #include <svl/itempool.hxx>
35 : #include <svl/itemset.hxx>
36 : #include <svl/smplhint.hxx>
37 : #include "attrib.hxx"
38 :
39 : #include <vcl/svapp.hxx>
40 :
41 : #include "globstr.hrc"
42 : #include "sc.hrc"
43 :
44 0 : TYPEINIT1(ScStyleSheet, SfxStyleSheet);
45 :
46 : #define TWO_CM 1134
47 : #define HFDIST_CM 142
48 :
49 9054 : ScStyleSheet::ScStyleSheet( const OUString& rName,
50 : ScStyleSheetPool& rPoolP,
51 : SfxStyleFamily eFamily,
52 : sal_uInt16 nMaskP )
53 :
54 : : SfxStyleSheet ( rName, rPoolP, eFamily, nMaskP )
55 9054 : , eUsage( UNKNOWN )
56 : {
57 9054 : }
58 :
59 0 : ScStyleSheet::ScStyleSheet( const ScStyleSheet& rStyle )
60 : : SfxStyleSheet ( rStyle )
61 0 : , eUsage( UNKNOWN )
62 : {
63 0 : }
64 :
65 18080 : ScStyleSheet::~ScStyleSheet()
66 : {
67 18080 : }
68 :
69 0 : bool ScStyleSheet::HasFollowSupport() const
70 : {
71 0 : return false;
72 : }
73 :
74 32 : bool ScStyleSheet::HasParentSupport () const
75 : {
76 32 : bool bHasParentSupport = false;
77 :
78 32 : switch ( GetFamily() )
79 : {
80 24 : case SFX_STYLE_FAMILY_PARA: bHasParentSupport = true; break;
81 8 : case SFX_STYLE_FAMILY_PAGE: bHasParentSupport = false; break;
82 : default:
83 : {
84 : // added to avoid warnings
85 : }
86 : }
87 :
88 32 : return bHasParentSupport;
89 : }
90 :
91 11580 : bool ScStyleSheet::SetParent( const OUString& rParentName )
92 : {
93 11580 : bool bResult = false;
94 11580 : OUString aEffName = rParentName;
95 11580 : SfxStyleSheetBase* pStyle = pPool->Find( aEffName, nFamily );
96 11580 : if (!pStyle)
97 : {
98 1910 : SfxStyleSheetIteratorPtr pIter = pPool->CreateIterator( nFamily, SFXSTYLEBIT_ALL );
99 1910 : pStyle = pIter->First();
100 1910 : if (pStyle)
101 1876 : aEffName = pStyle->GetName();
102 : }
103 :
104 11580 : if ( pStyle && aEffName != GetName() )
105 : {
106 11242 : bResult = SfxStyleSheet::SetParent( aEffName );
107 11242 : if (bResult)
108 : {
109 11242 : SfxItemSet& rParentSet = pStyle->GetItemSet();
110 11242 : GetItemSet().SetParent( &rParentSet );
111 :
112 : // #i113491# Drag&Drop in the stylist's hierarchical view doesn't execute a slot,
113 : // so the repaint has to come from here (after modifying the ItemSet).
114 : // RepaintRange checks the document's IsVisible flag and locked repaints.
115 11242 : ScDocument* pDoc = static_cast<ScStyleSheetPool&>(GetPool()).GetDocument();
116 11242 : if (pDoc)
117 11242 : pDoc->RepaintRange( ScRange( 0,0,0, MAXCOL,MAXROW,MAXTAB ) );
118 : }
119 : }
120 :
121 11580 : return bResult;
122 : }
123 :
124 1480774 : SfxItemSet& ScStyleSheet::GetItemSet()
125 : {
126 1480774 : if ( !pSet )
127 : {
128 9054 : switch ( GetFamily() )
129 : {
130 : case SFX_STYLE_FAMILY_PAGE:
131 : {
132 : // Seitenvorlagen sollen nicht ableitbar sein,
133 : // deshalb werden an dieser Stelle geeignete
134 : // Werte eingestellt. (==Standard-Seitenvorlage)
135 :
136 2782 : SfxItemPool& rItemPool = GetPool().GetPool();
137 : pSet = new SfxItemSet( rItemPool,
138 : ATTR_BACKGROUND, ATTR_BACKGROUND,
139 : ATTR_BORDER, ATTR_SHADOW,
140 : ATTR_LRSPACE, ATTR_PAGE_SCALETO,
141 : ATTR_WRITINGDIR, ATTR_WRITINGDIR,
142 : ATTR_USERDEF, ATTR_USERDEF,
143 2782 : 0 );
144 :
145 : // Wenn gerade geladen wird, wird auch der Set hinterher aus der Datei
146 : // gefuellt, es brauchen also keine Defaults gesetzt zu werden.
147 : // GetPrinter wuerde dann auch einen neuen Printer anlegen, weil der
148 : // gespeicherte Printer noch nicht geladen ist!
149 :
150 2782 : ScDocument* pDoc = static_cast<ScStyleSheetPool&>(GetPool()).GetDocument();
151 2782 : if ( pDoc )
152 : {
153 : // Setzen von sinnvollen Default-Werten:
154 2782 : SvxPageItem aPageItem( ATTR_PAGE );
155 5564 : SvxSizeItem aPaperSizeItem( ATTR_PAGE_SIZE, SvxPaperInfo::GetDefaultPaperSize() );
156 :
157 : SvxSetItem aHFSetItem(
158 : static_cast<const SvxSetItem&>(
159 5564 : rItemPool.GetDefaultItem(ATTR_PAGE_HEADERSET) ));
160 :
161 2782 : SfxItemSet& rHFSet = aHFSetItem.GetItemSet();
162 : SvxSizeItem aHFSizeItem( // 0,5 cm + Abstand
163 : ATTR_PAGE_SIZE,
164 5564 : Size( 0, (long)( 500 / HMM_PER_TWIPS ) + HFDIST_CM ) );
165 :
166 : SvxULSpaceItem aHFDistItem ( HFDIST_CM,// nUp
167 : HFDIST_CM,// nLow
168 5564 : ATTR_ULSPACE );
169 :
170 : SvxLRSpaceItem aLRSpaceItem( TWO_CM, // nLeft
171 : TWO_CM, // nRight
172 : TWO_CM, // nTLeft
173 : 0, // nFirstLineOffset
174 5564 : ATTR_LRSPACE );
175 : SvxULSpaceItem aULSpaceItem( TWO_CM, // nUp
176 : TWO_CM, // nLow
177 5564 : ATTR_ULSPACE );
178 5564 : SvxBoxInfoItem aBoxInfoItem( ATTR_BORDER_INNER );
179 :
180 2782 : aBoxInfoItem.SetTable( false );
181 2782 : aBoxInfoItem.SetDist( true );
182 2782 : aBoxInfoItem.SetValid( VALID_DISTANCE, true );
183 :
184 2782 : aPageItem.SetLandscape( false );
185 :
186 2782 : rHFSet.Put( aBoxInfoItem );
187 2782 : rHFSet.Put( aHFSizeItem );
188 2782 : rHFSet.Put( aHFDistItem );
189 2782 : rHFSet.Put( SvxLRSpaceItem( 0,0,0,0, ATTR_LRSPACE ) ); // Rand auf Null setzen
190 :
191 2782 : pSet->Put( aHFSetItem, ATTR_PAGE_HEADERSET );
192 2782 : pSet->Put( aHFSetItem, ATTR_PAGE_FOOTERSET );
193 2782 : pSet->Put( aBoxInfoItem ); // PoolDefault wg. Formatvorlagen
194 : // nicht ueberschreiben!
195 :
196 : // Writing direction: not as pool default because the default for cells
197 : // must remain FRMDIR_ENVIRONMENT, and each page style's setting is
198 : // supposed to be saved in the file format.
199 : // The page default depends on the system language.
200 2782 : SvxFrameDirection eDirection = ScGlobal::IsSystemRTL() ?
201 2782 : FRMDIR_HORI_RIGHT_TOP : FRMDIR_HORI_LEFT_TOP;
202 2782 : pSet->Put( SvxFrameDirectionItem( eDirection, ATTR_WRITINGDIR ), ATTR_WRITINGDIR );
203 :
204 2782 : rItemPool.SetPoolDefaultItem( aPageItem );
205 2782 : rItemPool.SetPoolDefaultItem( aPaperSizeItem );
206 2782 : rItemPool.SetPoolDefaultItem( aLRSpaceItem );
207 2782 : rItemPool.SetPoolDefaultItem( aULSpaceItem );
208 2782 : rItemPool.SetPoolDefaultItem( SfxUInt16Item( ATTR_PAGE_SCALE, 100 ) );
209 5564 : ScPageScaleToItem aScaleToItem;
210 2782 : rItemPool.SetPoolDefaultItem( aScaleToItem );
211 5564 : rItemPool.SetPoolDefaultItem( SfxUInt16Item( ATTR_PAGE_SCALETOPAGES, 0 ) );
212 : }
213 : }
214 2782 : break;
215 :
216 : case SFX_STYLE_FAMILY_PARA:
217 : default:
218 6272 : pSet = new SfxItemSet( GetPool().GetPool(), ATTR_PATTERN_START, ATTR_PATTERN_END );
219 6272 : break;
220 : }
221 9054 : bMySet = true;
222 : }
223 1480774 : if ( nHelpId == HID_SC_SHEET_CELL_ERG1 )
224 : {
225 14330 : if ( !pSet->Count() )
226 : {
227 1216 : ScDocument* pDoc = static_cast<ScStyleSheetPool&>(GetPool()).GetDocument();
228 1216 : if ( pDoc )
229 : {
230 548 : sal_uLong nNumFmt = pDoc->GetFormatTable()->GetStandardFormat( NUMBERFORMAT_CURRENCY,ScGlobal::eLnge );
231 548 : pSet->Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNumFmt ) );
232 : }
233 : }
234 : }
235 :
236 1480774 : return *pSet;
237 : }
238 :
239 204 : bool ScStyleSheet::IsUsed() const
240 : {
241 204 : if ( GetFamily() == SFX_STYLE_FAMILY_PARA )
242 : {
243 : // Always query the document to let it decide if a rescan is necessary,
244 : // and store the state.
245 0 : ScDocument* pDoc = static_cast<ScStyleSheetPool*>(pPool)->GetDocument();
246 0 : if ( pDoc && pDoc->IsStyleSheetUsed( *this, true ) )
247 0 : eUsage = USED;
248 : else
249 0 : eUsage = NOTUSED;
250 0 : return eUsage == USED;
251 : }
252 : else
253 204 : return true;
254 : }
255 :
256 10552 : void ScStyleSheet::Notify( SfxBroadcaster&, const SfxHint& rHint )
257 : {
258 10552 : const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint);
259 10552 : if ( pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING )
260 5276 : GetItemSet().SetParent( NULL );
261 10552 : }
262 :
263 : // schmutzige Tricks, um die Standard-Vorlage immer als "Standard" zu speichern,
264 : // obwohl der fuer den Benutzer sichtbare Name uebersetzt ist:
265 :
266 1993170 : const OUString& ScStyleSheet::GetName() const
267 : {
268 1993170 : const OUString& rBase = SfxStyleSheet::GetName();
269 1993170 : const OUString* pForceStdName = static_cast<ScStyleSheetPool*>(pPool)->GetForceStdName();
270 1993170 : if ( pForceStdName && rBase == ScGlobal::GetRscString(STR_STYLENAME_STANDARD) )
271 0 : return *pForceStdName;
272 : else
273 1993170 : return rBase;
274 : }
275 :
276 12510 : const OUString& ScStyleSheet::GetParent() const
277 : {
278 12510 : const OUString& rBase = SfxStyleSheet::GetParent();
279 12510 : const OUString* pForceStdName = static_cast<ScStyleSheetPool*>(pPool)->GetForceStdName();
280 12510 : if ( pForceStdName && rBase == ScGlobal::GetRscString(STR_STYLENAME_STANDARD) )
281 0 : return *pForceStdName;
282 : else
283 12510 : return rBase;
284 : }
285 :
286 0 : const OUString& ScStyleSheet::GetFollow() const
287 : {
288 0 : const OUString& rBase = SfxStyleSheet::GetFollow();
289 0 : const OUString* pForceStdName = static_cast<ScStyleSheetPool*>(pPool)->GetForceStdName();
290 0 : if ( pForceStdName && rBase == ScGlobal::GetRscString(STR_STYLENAME_STANDARD) )
291 0 : return *pForceStdName;
292 : else
293 0 : return rBase;
294 : }
295 :
296 : // Verhindern, dass ein Style "Standard" angelegt wird, wenn das nicht der
297 : // Standard-Name ist, weil sonst beim Speichern zwei Styles denselben Namen haetten
298 : // (Beim Laden wird der Style direkt per Make mit dem Namen erzeugt, so dass diese
299 : // Abfrage dann nicht gilt)
300 : //! Wenn irgendwann aus dem Laden SetName aufgerufen wird, muss fuer das Laden ein
301 : //! Flag gesetzt und abgefragt werden.
302 : //! Die ganze Abfrage muss raus, wenn fuer eine neue Datei-Version die Namens-Umsetzung wegfaellt.
303 :
304 0 : bool ScStyleSheet::SetName(const OUString& rNew, bool bReindexNow)
305 : {
306 0 : OUString aFileStdName = OUString(STRING_STANDARD);
307 0 : if ( rNew == aFileStdName && aFileStdName != ScGlobal::GetRscString(STR_STYLENAME_STANDARD) )
308 0 : return false;
309 : else
310 0 : return SfxStyleSheet::SetName(rNew, bReindexNow);
311 228 : }
312 :
313 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|