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