1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26
27
28
29 //------------------------------------------------------------------------
30 #include "document.hxx"
31 #include "stlsheet.hxx"
32 #include "stlpool.hxx"
33
34 #include "scitems.hxx"
35 #include <editeng/boxitem.hxx>
36 #include <editeng/frmdiritem.hxx>
37 #include <editeng/lrspitem.hxx>
38 #include <svx/pageitem.hxx>
39 #include <editeng/paperinf.hxx>
40 #include <editeng/pbinitem.hxx>
41 #include <editeng/sizeitem.hxx>
42 #include <editeng/ulspitem.hxx>
43 #include <sfx2/printer.hxx>
44 #include <svl/itempool.hxx>
45 #include <svl/itemset.hxx>
46 #include <svl/smplhint.hxx>
47 #include "attrib.hxx"
48
49
50 #include <vcl/svapp.hxx> // GetSettings()
51
52 #include "globstr.hrc"
53 #include "sc.hrc"
54 //------------------------------------------------------------------------
55
56 TYPEINIT1(ScStyleSheet, SfxStyleSheet);
57
58 #define TWO_CM 1134
59 #define HFDIST_CM 142
60
61 //========================================================================
62
ScStyleSheet(const String & rName,ScStyleSheetPool & rPoolP,SfxStyleFamily eFamily,sal_uInt16 nMaskP)63 ScStyleSheet::ScStyleSheet( const String& rName,
64 ScStyleSheetPool& rPoolP,
65 SfxStyleFamily eFamily,
66 sal_uInt16 nMaskP )
67
68 : SfxStyleSheet ( rName, rPoolP, eFamily, nMaskP )
69 , eUsage( UNKNOWN )
70 {
71 }
72
73 //------------------------------------------------------------------------
74
ScStyleSheet(const ScStyleSheet & rStyle)75 ScStyleSheet::ScStyleSheet( const ScStyleSheet& rStyle )
76 : SfxStyleSheet ( rStyle )
77 , eUsage( UNKNOWN )
78 {
79 }
80
81 //------------------------------------------------------------------------
82
~ScStyleSheet()83 __EXPORT ScStyleSheet::~ScStyleSheet()
84 {
85 }
86
87 //------------------------------------------------------------------------
88
HasFollowSupport() const89 sal_Bool __EXPORT ScStyleSheet::HasFollowSupport() const
90 {
91 return sal_False;
92 }
93
94 //------------------------------------------------------------------------
95
HasParentSupport() const96 sal_Bool __EXPORT ScStyleSheet::HasParentSupport () const
97 {
98 sal_Bool bHasParentSupport = sal_False;
99
100 switch ( GetFamily() )
101 {
102 case SFX_STYLE_FAMILY_PARA: bHasParentSupport = sal_True; break;
103 case SFX_STYLE_FAMILY_PAGE: bHasParentSupport = sal_False; break;
104 default:
105 {
106 // added to avoid warnings
107 }
108 }
109
110 return bHasParentSupport;
111 }
112
113 //------------------------------------------------------------------------
114
SetParent(const String & rParentName)115 sal_Bool __EXPORT ScStyleSheet::SetParent( const String& rParentName )
116 {
117 sal_Bool bResult = sal_False;
118 String aEffName = rParentName;
119 SfxStyleSheetBase* pStyle = rPool.Find( aEffName, nFamily );
120 if (!pStyle)
121 {
122 SfxStyleSheetIteratorPtr pIter = rPool.CreateIterator( nFamily, SFXSTYLEBIT_ALL );
123 pStyle = pIter->First();
124 if (pStyle)
125 aEffName = pStyle->GetName();
126 }
127
128 if ( pStyle && aEffName != GetName() )
129 {
130 bResult = SfxStyleSheet::SetParent( aEffName );
131 if (bResult)
132 {
133 SfxItemSet& rParentSet = pStyle->GetItemSet();
134 GetItemSet().SetParent( &rParentSet );
135
136 // #i113491# Drag&Drop in the stylist's hierarchical view doesn't execute a slot,
137 // so the repaint has to come from here (after modifying the ItemSet).
138 // RepaintRange checks the document's IsVisible flag and locked repaints.
139 ScDocument* pDoc = static_cast<ScStyleSheetPool&>(GetPool()).GetDocument();
140 if (pDoc)
141 pDoc->RepaintRange( ScRange( 0,0,0, MAXCOL,MAXROW,MAXTAB ) );
142 }
143 }
144
145 return bResult;
146 }
147
148 //------------------------------------------------------------------------
149
GetItemSet()150 SfxItemSet& __EXPORT ScStyleSheet::GetItemSet()
151 {
152 if ( !pSet )
153 {
154 switch ( GetFamily() )
155 {
156 case SFX_STYLE_FAMILY_PAGE:
157 {
158 // Seitenvorlagen sollen nicht ableitbar sein,
159 // deshalb werden an dieser Stelle geeignete
160 // Werte eingestellt. (==Standard-Seitenvorlage)
161
162 SfxItemPool& rItemPool = GetPool().GetPool();
163 pSet = new SfxItemSet( rItemPool,
164 ATTR_BACKGROUND, ATTR_BACKGROUND,
165 ATTR_BORDER, ATTR_SHADOW,
166 ATTR_LRSPACE, ATTR_PAGE_SCALETO,
167 ATTR_WRITINGDIR, ATTR_WRITINGDIR,
168 ATTR_USERDEF, ATTR_USERDEF,
169 0 );
170
171 // Wenn gerade geladen wird, wird auch der Set hinterher aus der Datei
172 // gefuellt, es brauchen also keine Defaults gesetzt zu werden.
173 // GetPrinter wuerde dann auch einen neuen Printer anlegen, weil der
174 // gespeicherte Printer noch nicht geladen ist!
175
176 ScDocument* pDoc = ((ScStyleSheetPool&)GetPool()).GetDocument();
177 if ( pDoc )
178 {
179 // Setzen von sinnvollen Default-Werten:
180 SvxPageItem aPageItem( ATTR_PAGE );
181 SvxSizeItem aPaperSizeItem( ATTR_PAGE_SIZE, SvxPaperInfo::GetDefaultPaperSize() );
182
183 SvxSetItem aHFSetItem(
184 (const SvxSetItem&)
185 rItemPool.GetDefaultItem(ATTR_PAGE_HEADERSET) );
186
187 SfxItemSet& rHFSet = aHFSetItem.GetItemSet();
188 SvxSizeItem aHFSizeItem( // 0,5 cm + Abstand
189 ATTR_PAGE_SIZE,
190 Size( 0, (long)( 500 / HMM_PER_TWIPS ) + HFDIST_CM ) );
191
192 SvxULSpaceItem aHFDistItem ( HFDIST_CM,// nUp
193 HFDIST_CM,// nLow
194 ATTR_ULSPACE );
195
196 SvxLRSpaceItem aLRSpaceItem( TWO_CM, // nLeft
197 TWO_CM, // nRight
198 TWO_CM, // nTLeft
199 0, // nFirstLineOffset
200 ATTR_LRSPACE );
201 SvxULSpaceItem aULSpaceItem( TWO_CM, // nUp
202 TWO_CM, // nLow
203 ATTR_ULSPACE );
204 SvxBoxInfoItem aBoxInfoItem( ATTR_BORDER_INNER );
205
206 aBoxInfoItem.SetTable( sal_False );
207 aBoxInfoItem.SetDist( sal_True );
208 aBoxInfoItem.SetValid( VALID_DISTANCE, sal_True );
209
210 // aPageItem.SetLandscape( ORIENTATION_LANDSCAPE == pPrinter->GetOrientation() );
211 aPageItem.SetLandscape( sal_False );
212
213 rHFSet.Put( aBoxInfoItem );
214 rHFSet.Put( aHFSizeItem );
215 rHFSet.Put( aHFDistItem );
216 rHFSet.Put( SvxLRSpaceItem( 0,0,0,0, ATTR_LRSPACE ) ); // Rand auf Null setzen
217
218 pSet->Put( aHFSetItem, ATTR_PAGE_HEADERSET );
219 pSet->Put( aHFSetItem, ATTR_PAGE_FOOTERSET );
220 pSet->Put( aBoxInfoItem ); // PoolDefault wg. Formatvorlagen
221 // nicht ueberschreiben!
222
223 // Writing direction: not as pool default because the default for cells
224 // must remain FRMDIR_ENVIRONMENT, and each page style's setting is
225 // supposed to be saved in the file format.
226 // The page default depends on the system language.
227 SvxFrameDirection eDirection = ScGlobal::IsSystemRTL() ?
228 FRMDIR_HORI_RIGHT_TOP : FRMDIR_HORI_LEFT_TOP;
229 pSet->Put( SvxFrameDirectionItem( eDirection, ATTR_WRITINGDIR ), ATTR_WRITINGDIR );
230
231 rItemPool.SetPoolDefaultItem( aPageItem );
232 rItemPool.SetPoolDefaultItem( aPaperSizeItem );
233 rItemPool.SetPoolDefaultItem( aLRSpaceItem );
234 rItemPool.SetPoolDefaultItem( aULSpaceItem );
235 rItemPool.SetPoolDefaultItem( SfxUInt16Item( ATTR_PAGE_SCALE, 100 ) );
236 ScPageScaleToItem aScaleToItem;
237 rItemPool.SetPoolDefaultItem( aScaleToItem );
238 rItemPool.SetPoolDefaultItem( SfxUInt16Item( ATTR_PAGE_SCALETOPAGES, 0 ) );
239 }
240 }
241 break;
242
243 case SFX_STYLE_FAMILY_PARA:
244 default:
245 pSet = new SfxItemSet( GetPool().GetPool(),
246 ATTR_PATTERN_START, ATTR_PATTERN_END,
247 0 );
248 break;
249 }
250 bMySet = sal_True;
251 } // if ( !pSet )
252 if ( nHelpId == HID_SC_SHEET_CELL_ERG1 )
253 {
254 if ( !pSet->Count() )
255 {
256 ScDocument* pDoc = ((ScStyleSheetPool&)GetPool()).GetDocument();
257 if ( pDoc )
258 {
259 sal_uLong nNumFmt = pDoc->GetFormatTable()->GetStandardFormat( NUMBERFORMAT_CURRENCY,ScGlobal::eLnge );
260 pSet->Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNumFmt ) );
261 } // if ( pDoc && pDoc->IsLoadingDone() )
262 }
263 }
264
265 return *pSet;
266 }
267
268 //------------------------------------------------------------------------
269
IsUsed() const270 sal_Bool __EXPORT ScStyleSheet::IsUsed() const
271 {
272 if ( GetFamily() == SFX_STYLE_FAMILY_PARA )
273 {
274 // Always query the document to let it decide if a rescan is necessary,
275 // and store the state.
276 ScDocument* pDoc = ((ScStyleSheetPool&)rPool).GetDocument();
277 if ( pDoc && pDoc->IsStyleSheetUsed( *this, sal_True ) )
278 eUsage = USED;
279 else
280 eUsage = NOTUSED;
281 return eUsage == USED;
282 }
283 else
284 return sal_True;
285 }
286
287 //------------------------------------------------------------------------
288
Notify(SfxBroadcaster &,const SfxHint & rHint)289 void __EXPORT ScStyleSheet::Notify( SfxBroadcaster&, const SfxHint& rHint )
290 {
291 if ( rHint.ISA(SfxSimpleHint) )
292 if ( ((SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
293 GetItemSet().SetParent( NULL );
294 }
295
296 //------------------------------------------------------------------------
297
298 // #66123# schmutzige Tricks, um die Standard-Vorlage immer als "Standard" zu speichern,
299 // obwohl der fuer den Benutzer sichtbare Name uebersetzt ist:
300
GetName() const301 const String& ScStyleSheet::GetName() const
302 {
303 const String& rBase = SfxStyleSheet::GetName();
304 const String* pForceStdName = ((ScStyleSheetPool&)rPool).GetForceStdName();
305 if ( pForceStdName && rBase == ScGlobal::GetRscString(STR_STYLENAME_STANDARD) )
306 return *pForceStdName;
307 else
308 return rBase;
309 }
310
GetParent() const311 const String& ScStyleSheet::GetParent() const
312 {
313 const String& rBase = SfxStyleSheet::GetParent();
314 const String* pForceStdName = ((ScStyleSheetPool&)rPool).GetForceStdName();
315 if ( pForceStdName && rBase == ScGlobal::GetRscString(STR_STYLENAME_STANDARD) )
316 return *pForceStdName;
317 else
318 return rBase;
319 }
320
GetFollow() const321 const String& ScStyleSheet::GetFollow() const
322 {
323 const String& rBase = SfxStyleSheet::GetFollow();
324 const String* pForceStdName = ((ScStyleSheetPool&)rPool).GetForceStdName();
325 if ( pForceStdName && rBase == ScGlobal::GetRscString(STR_STYLENAME_STANDARD) )
326 return *pForceStdName;
327 else
328 return rBase;
329 }
330
331 // Verhindern, dass ein Style "Standard" angelegt wird, wenn das nicht der
332 // Standard-Name ist, weil sonst beim Speichern zwei Styles denselben Namen haetten
333 // (Beim Laden wird der Style direkt per Make mit dem Namen erzeugt, so dass diese
334 // Abfrage dann nicht gilt)
335 //! Wenn irgendwann aus dem Laden SetName aufgerufen wird, muss fuer das Laden ein
336 //! Flag gesetzt und abgefragt werden.
337 //! Die ganze Abfrage muss raus, wenn fuer eine neue Datei-Version die Namens-Umsetzung wegfaellt.
338
SetName(const String & rNew)339 sal_Bool ScStyleSheet::SetName( const String& rNew )
340 {
341 String aFileStdName = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(STRING_STANDARD));
342 if ( rNew == aFileStdName && aFileStdName != ScGlobal::GetRscString(STR_STYLENAME_STANDARD) )
343 return sal_False;
344 else
345 return SfxStyleSheet::SetName( rNew );
346 }
347
348
349
350