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 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 75 ScStyleSheet::ScStyleSheet( const ScStyleSheet& rStyle ) 76 : SfxStyleSheet ( rStyle ) 77 , eUsage( UNKNOWN ) 78 { 79 } 80 81 //------------------------------------------------------------------------ 82 83 __EXPORT ScStyleSheet::~ScStyleSheet() 84 { 85 } 86 87 //------------------------------------------------------------------------ 88 89 sal_Bool __EXPORT ScStyleSheet::HasFollowSupport() const 90 { 91 return sal_False; 92 } 93 94 //------------------------------------------------------------------------ 95 96 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 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 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 270 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 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 301 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 311 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 321 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 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