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 #define READ_OLDVERS 30 31 #include "autoform.hxx" 32 33 #include <sfx2/app.hxx> 34 #include <sfx2/docfile.hxx> 35 #include <unotools/pathoptions.hxx> 36 #include <svl/itemset.hxx> 37 #include <tools/shl.hxx> 38 #include <vcl/svapp.hxx> 39 #include <vcl/outdev.hxx> 40 #include <svx/dialmgr.hxx> 41 #include <svx/dialogs.hrc> 42 #include <editeng/langitem.hxx> 43 #include <tools/urlobj.hxx> 44 #include <unotools/transliterationwrapper.hxx> 45 #include <tools/tenccvt.hxx> 46 47 #include "globstr.hrc" 48 #include "document.hxx" 49 50 //------------------------------------------------------------------------ 51 52 const sal_Char *linker_dummy = ""; 53 54 // Standard-Name ist jetzt STR_STYLENAME_STANDARD (wie Vorlagen) 55 //static const sal_Char __FAR_DATA cStandardName[] = "Standard"; 56 57 static const sal_Char __FAR_DATA sAutoTblFmtName[] = "autotbl.fmt"; 58 59 // bis SO5PF 60 const sal_uInt16 AUTOFORMAT_ID_X = 9501; 61 const sal_uInt16 AUTOFORMAT_ID_358 = 9601; 62 const sal_uInt16 AUTOFORMAT_DATA_ID_X = 9502; 63 64 // ab SO5 65 //! in nachfolgenden Versionen muss der Betrag dieser IDs groesser sein 66 const sal_uInt16 AUTOFORMAT_ID_504 = 9801; 67 const sal_uInt16 AUTOFORMAT_DATA_ID_504 = 9802; 68 69 const sal_uInt16 AUTOFORMAT_ID_552 = 9901; 70 const sal_uInt16 AUTOFORMAT_DATA_ID_552 = 9902; 71 72 // --- from 641 on: CJK and CTL font settings 73 const sal_uInt16 AUTOFORMAT_ID_641 = 10001; 74 const sal_uInt16 AUTOFORMAT_DATA_ID_641 = 10002; 75 76 // --- from 680/dr14 on: diagonal frame lines 77 const sal_uInt16 AUTOFORMAT_ID_680DR14 = 10011; 78 const sal_uInt16 AUTOFORMAT_DATA_ID_680DR14 = 10012; 79 80 // --- from 680/dr25 on: #21549# store strings as UTF-8 81 const sal_uInt16 AUTOFORMAT_ID_680DR25 = 10021; 82 const sal_uInt16 AUTOFORMAT_DATA_ID_680DR25 = 10022; 83 84 // --- from DEV300/overline2 on: #5991# overline support 85 const sal_uInt16 AUTOFORMAT_ID_300OVRLN = 10031; 86 const sal_uInt16 AUTOFORMAT_DATA_ID_300OVRLN = 10032; 87 88 // aktuelle Version 89 const sal_uInt16 AUTOFORMAT_ID = AUTOFORMAT_ID_300OVRLN; 90 const sal_uInt16 AUTOFORMAT_DATA_ID = AUTOFORMAT_DATA_ID_300OVRLN; 91 92 93 #ifdef READ_OLDVERS 94 const sal_uInt16 AUTOFORMAT_OLD_ID_OLD = 4201; 95 const sal_uInt16 AUTOFORMAT_OLD_DATA_ID = 4202; 96 const sal_uInt16 AUTOFORMAT_OLD_ID_NEW = 4203; 97 #endif 98 99 100 // Struct mit Versionsnummern der Items 101 102 struct ScAfVersions 103 { 104 public: 105 sal_uInt16 nFontVersion; 106 sal_uInt16 nFontHeightVersion; 107 sal_uInt16 nWeightVersion; 108 sal_uInt16 nPostureVersion; 109 sal_uInt16 nUnderlineVersion; 110 sal_uInt16 nOverlineVersion; 111 sal_uInt16 nCrossedOutVersion; 112 sal_uInt16 nContourVersion; 113 sal_uInt16 nShadowedVersion; 114 sal_uInt16 nColorVersion; 115 sal_uInt16 nBoxVersion; 116 sal_uInt16 nLineVersion; 117 sal_uInt16 nBrushVersion; 118 119 sal_uInt16 nAdjustVersion; 120 121 sal_uInt16 nHorJustifyVersion; 122 sal_uInt16 nVerJustifyVersion; 123 sal_uInt16 nOrientationVersion; 124 sal_uInt16 nMarginVersion; 125 sal_uInt16 nBoolVersion; 126 sal_uInt16 nInt32Version; 127 sal_uInt16 nRotateModeVersion; 128 129 sal_uInt16 nNumFmtVersion; 130 131 ScAfVersions(); 132 void Load( SvStream& rStream, sal_uInt16 nVer ); 133 static void Write(SvStream& rStream); 134 }; 135 136 ScAfVersions::ScAfVersions() : 137 nFontVersion(0), 138 nFontHeightVersion(0), 139 nWeightVersion(0), 140 nPostureVersion(0), 141 nUnderlineVersion(0), 142 nOverlineVersion(0), 143 nCrossedOutVersion(0), 144 nContourVersion(0), 145 nShadowedVersion(0), 146 nColorVersion(0), 147 nBoxVersion(0), 148 nLineVersion(0), 149 nBrushVersion(0), 150 nAdjustVersion(0), 151 nHorJustifyVersion(0), 152 nVerJustifyVersion(0), 153 nOrientationVersion(0), 154 nMarginVersion(0), 155 nBoolVersion(0), 156 nInt32Version(0), 157 nRotateModeVersion(0), 158 nNumFmtVersion(0) 159 { 160 } 161 162 void ScAfVersions::Load( SvStream& rStream, sal_uInt16 nVer ) 163 { 164 rStream >> nFontVersion; 165 rStream >> nFontHeightVersion; 166 rStream >> nWeightVersion; 167 rStream >> nPostureVersion; 168 rStream >> nUnderlineVersion; 169 if ( nVer >= AUTOFORMAT_ID_300OVRLN ) 170 rStream >> nOverlineVersion; 171 rStream >> nCrossedOutVersion; 172 rStream >> nContourVersion; 173 rStream >> nShadowedVersion; 174 rStream >> nColorVersion; 175 rStream >> nBoxVersion; 176 if ( nVer >= AUTOFORMAT_ID_680DR14 ) 177 rStream >> nLineVersion; 178 rStream >> nBrushVersion; 179 rStream >> nAdjustVersion; 180 rStream >> nHorJustifyVersion; 181 rStream >> nVerJustifyVersion; 182 rStream >> nOrientationVersion; 183 rStream >> nMarginVersion; 184 rStream >> nBoolVersion; 185 if ( nVer >= AUTOFORMAT_ID_504 ) 186 { 187 rStream >> nInt32Version; 188 rStream >> nRotateModeVersion; 189 } 190 rStream >> nNumFmtVersion; 191 } 192 193 void ScAfVersions::Write(SvStream& rStream) 194 { 195 rStream << SvxFontItem(ATTR_FONT).GetVersion(SOFFICE_FILEFORMAT_40); 196 rStream << SvxFontHeightItem(240, 100, ATTR_FONT_HEIGHT).GetVersion(SOFFICE_FILEFORMAT_40); 197 rStream << SvxWeightItem(WEIGHT_NORMAL, ATTR_FONT_WEIGHT).GetVersion(SOFFICE_FILEFORMAT_40); 198 rStream << SvxPostureItem(ITALIC_NONE, ATTR_FONT_POSTURE).GetVersion(SOFFICE_FILEFORMAT_40); 199 rStream << SvxUnderlineItem(UNDERLINE_NONE, ATTR_FONT_UNDERLINE).GetVersion(SOFFICE_FILEFORMAT_40); 200 rStream << SvxOverlineItem(UNDERLINE_NONE, ATTR_FONT_OVERLINE).GetVersion(SOFFICE_FILEFORMAT_40); 201 rStream << SvxCrossedOutItem(STRIKEOUT_NONE, ATTR_FONT_CROSSEDOUT).GetVersion(SOFFICE_FILEFORMAT_40); 202 rStream << SvxContourItem(sal_False, ATTR_FONT_CONTOUR).GetVersion(SOFFICE_FILEFORMAT_40); 203 rStream << SvxShadowedItem(sal_False, ATTR_FONT_SHADOWED).GetVersion(SOFFICE_FILEFORMAT_40); 204 rStream << SvxColorItem(ATTR_FONT_COLOR).GetVersion(SOFFICE_FILEFORMAT_40); 205 rStream << SvxBoxItem(ATTR_BORDER).GetVersion(SOFFICE_FILEFORMAT_40); 206 rStream << SvxLineItem(SID_FRAME_LINESTYLE).GetVersion(SOFFICE_FILEFORMAT_40); 207 rStream << SvxBrushItem(ATTR_BACKGROUND).GetVersion(SOFFICE_FILEFORMAT_40); 208 209 rStream << SvxAdjustItem(SVX_ADJUST_LEFT, 0).GetVersion(SOFFICE_FILEFORMAT_40); 210 211 rStream << SvxHorJustifyItem(SVX_HOR_JUSTIFY_STANDARD, ATTR_HOR_JUSTIFY).GetVersion(SOFFICE_FILEFORMAT_40); 212 rStream << SvxVerJustifyItem(SVX_VER_JUSTIFY_STANDARD, ATTR_VER_JUSTIFY).GetVersion(SOFFICE_FILEFORMAT_40); 213 rStream << SvxOrientationItem(SVX_ORIENTATION_STANDARD, 0).GetVersion(SOFFICE_FILEFORMAT_40); 214 rStream << SvxMarginItem(ATTR_MARGIN).GetVersion(SOFFICE_FILEFORMAT_40); 215 rStream << SfxBoolItem(ATTR_LINEBREAK).GetVersion(SOFFICE_FILEFORMAT_40); 216 rStream << SfxInt32Item(ATTR_ROTATE_VALUE).GetVersion(SOFFICE_FILEFORMAT_40); 217 rStream << SvxRotateModeItem(SVX_ROTATE_MODE_STANDARD,0).GetVersion(SOFFICE_FILEFORMAT_40); 218 219 rStream << (sal_uInt16)0; // Num-Format 220 } 221 222 // --------------------------------------------------------------------------- 223 224 ScAutoFormatDataField::ScAutoFormatDataField() : 225 aFont( ATTR_FONT ), 226 aHeight( 240, 100, ATTR_FONT_HEIGHT ), 227 aWeight( WEIGHT_NORMAL, ATTR_FONT_WEIGHT ), 228 aPosture( ITALIC_NONE, ATTR_FONT_POSTURE ), 229 230 aCJKFont( ATTR_CJK_FONT ), 231 aCJKHeight( 240, 100, ATTR_CJK_FONT_HEIGHT ), 232 aCJKWeight( WEIGHT_NORMAL, ATTR_CJK_FONT_WEIGHT ), 233 aCJKPosture( ITALIC_NONE, ATTR_CJK_FONT_POSTURE ), 234 235 aCTLFont( ATTR_CTL_FONT ), 236 aCTLHeight( 240, 100, ATTR_CTL_FONT_HEIGHT ), 237 aCTLWeight( WEIGHT_NORMAL, ATTR_CTL_FONT_WEIGHT ), 238 aCTLPosture( ITALIC_NONE, ATTR_CTL_FONT_POSTURE ), 239 240 aUnderline( UNDERLINE_NONE,ATTR_FONT_UNDERLINE ), 241 aOverline( UNDERLINE_NONE,ATTR_FONT_OVERLINE ), 242 aCrossedOut( STRIKEOUT_NONE, ATTR_FONT_CROSSEDOUT ), 243 aContour( sal_False, ATTR_FONT_CONTOUR ), 244 aShadowed( sal_False, ATTR_FONT_SHADOWED ), 245 aColor( ATTR_FONT_COLOR ), 246 aBox( ATTR_BORDER ), 247 aTLBR( ATTR_BORDER_TLBR ), 248 aBLTR( ATTR_BORDER_BLTR ), 249 aBackground( ATTR_BACKGROUND ), 250 aAdjust( SVX_ADJUST_LEFT, 0 ), 251 aHorJustify( SVX_HOR_JUSTIFY_STANDARD, ATTR_HOR_JUSTIFY ), 252 aVerJustify( SVX_VER_JUSTIFY_STANDARD, ATTR_VER_JUSTIFY ), 253 aMargin( ATTR_MARGIN ), 254 aLinebreak( ATTR_LINEBREAK ), 255 aRotateAngle( ATTR_ROTATE_VALUE ), 256 aRotateMode( SVX_ROTATE_MODE_STANDARD, ATTR_ROTATE_MODE ) 257 { 258 } 259 260 ScAutoFormatDataField::ScAutoFormatDataField( const ScAutoFormatDataField& rCopy ) : 261 aFont( rCopy.aFont ), 262 aHeight( rCopy.aHeight ), 263 aWeight( rCopy.aWeight ), 264 aPosture( rCopy.aPosture ), 265 aCJKFont( rCopy.aCJKFont ), 266 aCJKHeight( rCopy.aCJKHeight ), 267 aCJKWeight( rCopy.aCJKWeight ), 268 aCJKPosture( rCopy.aCJKPosture ), 269 aCTLFont( rCopy.aCTLFont ), 270 aCTLHeight( rCopy.aCTLHeight ), 271 aCTLWeight( rCopy.aCTLWeight ), 272 aCTLPosture( rCopy.aCTLPosture ), 273 aUnderline( rCopy.aUnderline ), 274 aOverline( rCopy.aOverline ), 275 aCrossedOut( rCopy.aCrossedOut ), 276 aContour( rCopy.aContour ), 277 aShadowed( rCopy.aShadowed ), 278 aColor( rCopy.aColor ), 279 aBox( rCopy.aBox ), 280 aTLBR( rCopy.aTLBR ), 281 aBLTR( rCopy.aBLTR ), 282 aBackground( rCopy.aBackground ), 283 aAdjust( rCopy.aAdjust ), 284 aHorJustify( rCopy.aHorJustify ), 285 aVerJustify( rCopy.aVerJustify ), 286 aStacked( rCopy.aStacked ), 287 aMargin( rCopy.aMargin ), 288 aLinebreak( rCopy.aLinebreak ), 289 aRotateAngle( rCopy.aRotateAngle ), 290 aRotateMode( rCopy.aRotateMode ), 291 aNumFormat( rCopy.aNumFormat ) 292 { 293 } 294 295 ScAutoFormatDataField::~ScAutoFormatDataField() 296 { 297 } 298 299 void ScAutoFormatDataField::SetAdjust( const SvxAdjustItem& rAdjust ) 300 { 301 aAdjust.SetAdjust( rAdjust.GetAdjust() ); 302 aAdjust.SetOneWord( rAdjust.GetOneWord() ); 303 aAdjust.SetLastBlock( rAdjust.GetLastBlock() ); 304 } 305 306 #define READ( aItem, ItemType, nVers ) \ 307 pNew = aItem.Create( rStream, nVers ); \ 308 aItem = *(ItemType*)pNew; \ 309 delete pNew; 310 311 sal_Bool ScAutoFormatDataField::Load( SvStream& rStream, const ScAfVersions& rVersions, sal_uInt16 nVer ) 312 { 313 SfxPoolItem* pNew; 314 SvxOrientationItem aOrientation( SVX_ORIENTATION_STANDARD, 0 ); 315 316 READ( aFont, SvxFontItem, rVersions.nFontVersion) 317 READ( aHeight, SvxFontHeightItem, rVersions.nFontHeightVersion) 318 READ( aWeight, SvxWeightItem, rVersions.nWeightVersion) 319 READ( aPosture, SvxPostureItem, rVersions.nPostureVersion) 320 // --- from 641 on: CJK and CTL font settings 321 if( AUTOFORMAT_DATA_ID_641 <= nVer ) 322 { 323 READ( aCJKFont, SvxFontItem, rVersions.nFontVersion) 324 READ( aCJKHeight, SvxFontHeightItem, rVersions.nFontHeightVersion) 325 READ( aCJKWeight, SvxWeightItem, rVersions.nWeightVersion) 326 READ( aCJKPosture, SvxPostureItem, rVersions.nPostureVersion) 327 READ( aCTLFont, SvxFontItem, rVersions.nFontVersion) 328 READ( aCTLHeight, SvxFontHeightItem, rVersions.nFontHeightVersion) 329 READ( aCTLWeight, SvxWeightItem, rVersions.nWeightVersion) 330 READ( aCTLPosture, SvxPostureItem, rVersions.nPostureVersion) 331 } 332 READ( aUnderline, SvxUnderlineItem, rVersions.nUnderlineVersion) 333 if ( nVer >= AUTOFORMAT_DATA_ID_300OVRLN ) 334 { 335 READ( aOverline, SvxOverlineItem, rVersions.nOverlineVersion) 336 } 337 READ( aCrossedOut, SvxCrossedOutItem, rVersions.nCrossedOutVersion) 338 READ( aContour, SvxContourItem, rVersions.nContourVersion) 339 READ( aShadowed, SvxShadowedItem, rVersions.nShadowedVersion) 340 READ( aColor, SvxColorItem, rVersions.nColorVersion) 341 READ( aBox, SvxBoxItem, rVersions.nBoxVersion) 342 343 // --- from 680/dr14 on: diagonal frame lines 344 if( AUTOFORMAT_DATA_ID_680DR14 <= nVer ) 345 { 346 READ( aTLBR, SvxLineItem, rVersions.nLineVersion) 347 READ( aBLTR, SvxLineItem, rVersions.nLineVersion) 348 } 349 350 READ( aBackground, SvxBrushItem, rVersions.nBrushVersion) 351 352 pNew = aAdjust.Create( rStream, rVersions.nAdjustVersion ); 353 SetAdjust( *(SvxAdjustItem*)pNew ); 354 delete pNew; 355 356 READ( aHorJustify, SvxHorJustifyItem, rVersions.nHorJustifyVersion) 357 READ( aVerJustify, SvxVerJustifyItem, rVersions.nVerJustifyVersion) 358 READ( aOrientation, SvxOrientationItem, rVersions.nOrientationVersion) 359 READ( aMargin, SvxMarginItem, rVersions.nMarginVersion) 360 361 pNew = aLinebreak.Create( rStream, rVersions.nBoolVersion ); 362 SetLinebreak( *(SfxBoolItem*)pNew ); 363 delete pNew; 364 365 if ( nVer >= AUTOFORMAT_DATA_ID_504 ) 366 { 367 pNew = aRotateAngle.Create( rStream, rVersions.nInt32Version ); 368 SetRotateAngle( *(SfxInt32Item*)pNew ); 369 delete pNew; 370 pNew = aRotateMode.Create( rStream, rVersions.nRotateModeVersion ); 371 SetRotateMode( *(SvxRotateModeItem*)pNew ); 372 delete pNew; 373 } 374 375 if( 0 == rVersions.nNumFmtVersion ) 376 { 377 // --- from 680/dr25 on: #21549# store strings as UTF-8 378 CharSet eCharSet = (nVer >= AUTOFORMAT_ID_680DR25) ? RTL_TEXTENCODING_UTF8 : rStream.GetStreamCharSet(); 379 aNumFormat.Load( rStream, eCharSet ); 380 } 381 382 // adjust charset in font 383 CharSet eSysSet = gsl_getSystemTextEncoding(); 384 CharSet eSrcSet = rStream.GetStreamCharSet(); 385 if( eSrcSet != eSysSet && aFont.GetCharSet() == eSrcSet ) 386 aFont.SetCharSet(eSysSet); 387 388 aStacked.SetValue( aOrientation.IsStacked() ); 389 aRotateAngle.SetValue( aOrientation.GetRotation( aRotateAngle.GetValue() ) ); 390 391 return (rStream.GetError() == 0); 392 } 393 394 #ifdef READ_OLDVERS 395 sal_Bool ScAutoFormatDataField::LoadOld( SvStream& rStream, const ScAfVersions& rVersions ) 396 { 397 SfxPoolItem* pNew; 398 SvxOrientationItem aOrientation( SVX_ORIENTATION_STANDARD, 0 ); 399 400 aNumFormat.Load(rStream, rStream.GetStreamCharSet()); 401 402 READ( aFont, SvxFontItem, rVersions.nFontVersion) 403 READ( aHeight, SvxFontHeightItem, rVersions.nFontHeightVersion) 404 READ( aWeight, SvxWeightItem, rVersions.nWeightVersion) 405 READ( aPosture, SvxPostureItem, rVersions.nPostureVersion) 406 READ( aUnderline, SvxUnderlineItem, rVersions.nUnderlineVersion) 407 READ( aCrossedOut, SvxCrossedOutItem, rVersions.nCrossedOutVersion) 408 READ( aContour, SvxContourItem, rVersions.nContourVersion) 409 READ( aShadowed, SvxShadowedItem, rVersions.nShadowedVersion) 410 READ( aColor, SvxColorItem, rVersions.nColorVersion) 411 READ( aHorJustify, SvxHorJustifyItem, rVersions.nHorJustifyVersion) 412 READ( aVerJustify, SvxVerJustifyItem, rVersions.nVerJustifyVersion) 413 READ( aOrientation, SvxOrientationItem, rVersions.nOrientationVersion) 414 pNew = aLinebreak.Create( rStream, rVersions.nBoolVersion ); 415 SetLinebreak( *(SfxBoolItem*)pNew ); 416 delete pNew; 417 READ( aMargin, SvxMarginItem, rVersions.nMarginVersion) 418 READ( aBox, SvxBoxItem, rVersions.nBoxVersion) 419 READ( aBackground, SvxBrushItem, rVersions.nBrushVersion) 420 421 aStacked.SetValue( aOrientation.IsStacked() ); 422 aRotateAngle.SetValue( aOrientation.GetRotation( aRotateAngle.GetValue() ) ); 423 424 return (rStream.GetError() == 0); 425 } 426 #endif 427 428 sal_Bool ScAutoFormatDataField::Save( SvStream& rStream ) 429 { 430 SvxOrientationItem aOrientation( aRotateAngle.GetValue(), aStacked.GetValue(), 0 ); 431 432 aFont.Store ( rStream, aFont.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 433 aHeight.Store ( rStream, aHeight.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 434 aWeight.Store ( rStream, aWeight.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 435 aPosture.Store ( rStream, aPosture.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 436 // --- from 641 on: CJK and CTL font settings 437 aCJKFont.Store ( rStream, aCJKFont.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 438 aCJKHeight.Store ( rStream, aCJKHeight.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 439 aCJKWeight.Store ( rStream, aCJKWeight.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 440 aCJKPosture.Store ( rStream, aCJKPosture.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 441 aCTLFont.Store ( rStream, aCTLFont.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 442 aCTLHeight.Store ( rStream, aCTLHeight.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 443 aCTLWeight.Store ( rStream, aCTLWeight.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 444 aCTLPosture.Store ( rStream, aCTLPosture.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 445 446 aUnderline.Store ( rStream, aUnderline.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 447 // --- from DEV300/overline2 on: overline support 448 aOverline.Store ( rStream, aOverline.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 449 aCrossedOut.Store ( rStream, aCrossedOut.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 450 aContour.Store ( rStream, aContour.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 451 aShadowed.Store ( rStream, aShadowed.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 452 aColor.Store ( rStream, aColor.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 453 aBox.Store ( rStream, aBox.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 454 455 // --- from 680/dr14 on: diagonal frame lines 456 aTLBR.Store ( rStream, aTLBR.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 457 aBLTR.Store ( rStream, aBLTR.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 458 459 aBackground.Store ( rStream, aBackground.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 460 461 aAdjust.Store ( rStream, aAdjust.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 462 463 aHorJustify.Store ( rStream, aHorJustify.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 464 aVerJustify.Store ( rStream, aVerJustify.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 465 aOrientation.Store ( rStream, aOrientation.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 466 aMargin.Store ( rStream, aMargin.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 467 aLinebreak.Store ( rStream, aLinebreak.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 468 // Rotation ab SO5 469 aRotateAngle.Store ( rStream, aRotateAngle.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 470 aRotateMode.Store ( rStream, aRotateMode.GetVersion( SOFFICE_FILEFORMAT_40 ) ); 471 472 // --- from 680/dr25 on: #21549# store strings as UTF-8 473 aNumFormat.Save( rStream, RTL_TEXTENCODING_UTF8 ); 474 475 return (rStream.GetError() == 0); 476 } 477 478 479 // --------------------------------------------------------------------------- 480 481 ScAutoFormatData::ScAutoFormatData() 482 { 483 nStrResId = USHRT_MAX; 484 485 bIncludeValueFormat = 486 bIncludeFont = 487 bIncludeJustify = 488 bIncludeFrame = 489 bIncludeBackground = 490 bIncludeWidthHeight = sal_True; 491 492 ppDataField = new ScAutoFormatDataField*[ 16 ]; 493 for( sal_uInt16 nIndex = 0; nIndex < 16; ++nIndex ) 494 ppDataField[ nIndex ] = new ScAutoFormatDataField; 495 } 496 497 ScAutoFormatData::ScAutoFormatData( const ScAutoFormatData& rData ) : 498 ScDataObject(), 499 aName( rData.aName ), 500 nStrResId( rData.nStrResId ), 501 bIncludeFont( rData.bIncludeFont ), 502 bIncludeJustify( rData.bIncludeJustify ), 503 bIncludeFrame( rData.bIncludeFrame ), 504 bIncludeBackground( rData.bIncludeBackground ), 505 bIncludeValueFormat( rData.bIncludeValueFormat ), 506 bIncludeWidthHeight( rData.bIncludeWidthHeight ) 507 { 508 ppDataField = new ScAutoFormatDataField*[ 16 ]; 509 for( sal_uInt16 nIndex = 0; nIndex < 16; ++nIndex ) 510 ppDataField[ nIndex ] = new ScAutoFormatDataField( rData.GetField( nIndex ) ); 511 } 512 513 ScAutoFormatData::~ScAutoFormatData() 514 { 515 for( sal_uInt16 nIndex = 0; nIndex < 16; ++nIndex ) 516 delete ppDataField[ nIndex ]; 517 delete[] ppDataField; 518 } 519 520 ScAutoFormatDataField& ScAutoFormatData::GetField( sal_uInt16 nIndex ) 521 { 522 DBG_ASSERT( nIndex < 16, "ScAutoFormatData::GetField - illegal index" ); 523 DBG_ASSERT( ppDataField && ppDataField[ nIndex ], "ScAutoFormatData::GetField - no data" ); 524 return *ppDataField[ nIndex ]; 525 } 526 527 const ScAutoFormatDataField& ScAutoFormatData::GetField( sal_uInt16 nIndex ) const 528 { 529 DBG_ASSERT( nIndex < 16, "ScAutoFormatData::GetField - illegal index" ); 530 DBG_ASSERT( ppDataField && ppDataField[ nIndex ], "ScAutoFormatData::GetField - no data" ); 531 return *ppDataField[ nIndex ]; 532 } 533 534 const SfxPoolItem* ScAutoFormatData::GetItem( sal_uInt16 nIndex, sal_uInt16 nWhich ) const 535 { 536 const ScAutoFormatDataField& rField = GetField( nIndex ); 537 switch( nWhich ) 538 { 539 case ATTR_FONT: return &rField.GetFont(); 540 case ATTR_FONT_HEIGHT: return &rField.GetHeight(); 541 case ATTR_FONT_WEIGHT: return &rField.GetWeight(); 542 case ATTR_FONT_POSTURE: return &rField.GetPosture(); 543 case ATTR_CJK_FONT: return &rField.GetCJKFont(); 544 case ATTR_CJK_FONT_HEIGHT: return &rField.GetCJKHeight(); 545 case ATTR_CJK_FONT_WEIGHT: return &rField.GetCJKWeight(); 546 case ATTR_CJK_FONT_POSTURE: return &rField.GetCJKPosture(); 547 case ATTR_CTL_FONT: return &rField.GetCTLFont(); 548 case ATTR_CTL_FONT_HEIGHT: return &rField.GetCTLHeight(); 549 case ATTR_CTL_FONT_WEIGHT: return &rField.GetCTLWeight(); 550 case ATTR_CTL_FONT_POSTURE: return &rField.GetCTLPosture(); 551 case ATTR_FONT_UNDERLINE: return &rField.GetUnderline(); 552 case ATTR_FONT_OVERLINE: return &rField.GetOverline(); 553 case ATTR_FONT_CROSSEDOUT: return &rField.GetCrossedOut(); 554 case ATTR_FONT_CONTOUR: return &rField.GetContour(); 555 case ATTR_FONT_SHADOWED: return &rField.GetShadowed(); 556 case ATTR_FONT_COLOR: return &rField.GetColor(); 557 case ATTR_BORDER: return &rField.GetBox(); 558 case ATTR_BORDER_TLBR: return &rField.GetTLBR(); 559 case ATTR_BORDER_BLTR: return &rField.GetBLTR(); 560 case ATTR_BACKGROUND: return &rField.GetBackground(); 561 case ATTR_HOR_JUSTIFY: return &rField.GetHorJustify(); 562 case ATTR_VER_JUSTIFY: return &rField.GetVerJustify(); 563 case ATTR_STACKED: return &rField.GetStacked(); 564 case ATTR_MARGIN: return &rField.GetMargin(); 565 case ATTR_LINEBREAK: return &rField.GetLinebreak(); 566 case ATTR_ROTATE_VALUE: return &rField.GetRotateAngle(); 567 case ATTR_ROTATE_MODE: return &rField.GetRotateMode(); 568 } 569 return NULL; 570 } 571 572 void ScAutoFormatData::PutItem( sal_uInt16 nIndex, const SfxPoolItem& rItem ) 573 { 574 ScAutoFormatDataField& rField = GetField( nIndex ); 575 switch( rItem.Which() ) 576 { 577 case ATTR_FONT: rField.SetFont( (const SvxFontItem&)rItem ); break; 578 case ATTR_FONT_HEIGHT: rField.SetHeight( (const SvxFontHeightItem&)rItem ); break; 579 case ATTR_FONT_WEIGHT: rField.SetWeight( (const SvxWeightItem&)rItem ); break; 580 case ATTR_FONT_POSTURE: rField.SetPosture( (const SvxPostureItem&)rItem ); break; 581 case ATTR_CJK_FONT: rField.SetCJKFont( (const SvxFontItem&)rItem ); break; 582 case ATTR_CJK_FONT_HEIGHT: rField.SetCJKHeight( (const SvxFontHeightItem&)rItem ); break; 583 case ATTR_CJK_FONT_WEIGHT: rField.SetCJKWeight( (const SvxWeightItem&)rItem ); break; 584 case ATTR_CJK_FONT_POSTURE: rField.SetCJKPosture( (const SvxPostureItem&)rItem ); break; 585 case ATTR_CTL_FONT: rField.SetCTLFont( (const SvxFontItem&)rItem ); break; 586 case ATTR_CTL_FONT_HEIGHT: rField.SetCTLHeight( (const SvxFontHeightItem&)rItem ); break; 587 case ATTR_CTL_FONT_WEIGHT: rField.SetCTLWeight( (const SvxWeightItem&)rItem ); break; 588 case ATTR_CTL_FONT_POSTURE: rField.SetCTLPosture( (const SvxPostureItem&)rItem ); break; 589 case ATTR_FONT_UNDERLINE: rField.SetUnderline( (const SvxUnderlineItem&)rItem ); break; 590 case ATTR_FONT_OVERLINE: rField.SetOverline( (const SvxOverlineItem&)rItem ); break; 591 case ATTR_FONT_CROSSEDOUT: rField.SetCrossedOut( (const SvxCrossedOutItem&)rItem ); break; 592 case ATTR_FONT_CONTOUR: rField.SetContour( (const SvxContourItem&)rItem ); break; 593 case ATTR_FONT_SHADOWED: rField.SetShadowed( (const SvxShadowedItem&)rItem ); break; 594 case ATTR_FONT_COLOR: rField.SetColor( (const SvxColorItem&)rItem ); break; 595 case ATTR_BORDER: rField.SetBox( (const SvxBoxItem&)rItem ); break; 596 case ATTR_BORDER_TLBR: rField.SetTLBR( (const SvxLineItem&)rItem ); break; 597 case ATTR_BORDER_BLTR: rField.SetBLTR( (const SvxLineItem&)rItem ); break; 598 case ATTR_BACKGROUND: rField.SetBackground( (const SvxBrushItem&)rItem ); break; 599 case ATTR_HOR_JUSTIFY: rField.SetHorJustify( (const SvxHorJustifyItem&)rItem ); break; 600 case ATTR_VER_JUSTIFY: rField.SetVerJustify( (const SvxVerJustifyItem&)rItem ); break; 601 case ATTR_STACKED: rField.SetStacked( (const SfxBoolItem&)rItem ); break; 602 case ATTR_MARGIN: rField.SetMargin( (const SvxMarginItem&)rItem ); break; 603 case ATTR_LINEBREAK: rField.SetLinebreak( (const SfxBoolItem&)rItem ); break; 604 case ATTR_ROTATE_VALUE: rField.SetRotateAngle( (const SfxInt32Item&)rItem ); break; 605 case ATTR_ROTATE_MODE: rField.SetRotateMode( (const SvxRotateModeItem&)rItem ); break; 606 } 607 } 608 609 void ScAutoFormatData::CopyItem( sal_uInt16 nToIndex, sal_uInt16 nFromIndex, sal_uInt16 nWhich ) 610 { 611 const SfxPoolItem* pItem = GetItem( nFromIndex, nWhich ); 612 if( pItem ) 613 PutItem( nToIndex, *pItem ); 614 } 615 616 const ScNumFormatAbbrev& ScAutoFormatData::GetNumFormat( sal_uInt16 nIndex ) const 617 { 618 return GetField( nIndex ).GetNumFormat(); 619 } 620 621 sal_Bool ScAutoFormatData::IsEqualData( sal_uInt16 nIndex1, sal_uInt16 nIndex2 ) const 622 { 623 sal_Bool bEqual = sal_True; 624 const ScAutoFormatDataField& rField1 = GetField( nIndex1 ); 625 const ScAutoFormatDataField& rField2 = GetField( nIndex2 ); 626 627 if( bIncludeValueFormat ) 628 { 629 bEqual = bEqual 630 && (rField1.GetNumFormat() == rField2.GetNumFormat()); 631 } 632 if( bIncludeFont ) 633 { 634 bEqual = bEqual 635 && (rField1.GetFont() == rField2.GetFont()) 636 && (rField1.GetHeight() == rField2.GetHeight()) 637 && (rField1.GetWeight() == rField2.GetWeight()) 638 && (rField1.GetPosture() == rField2.GetPosture()) 639 && (rField1.GetCJKFont() == rField2.GetCJKFont()) 640 && (rField1.GetCJKHeight() == rField2.GetCJKHeight()) 641 && (rField1.GetCJKWeight() == rField2.GetCJKWeight()) 642 && (rField1.GetCJKPosture() == rField2.GetCJKPosture()) 643 && (rField1.GetCTLFont() == rField2.GetCTLFont()) 644 && (rField1.GetCTLHeight() == rField2.GetCTLHeight()) 645 && (rField1.GetCTLWeight() == rField2.GetCTLWeight()) 646 && (rField1.GetCTLPosture() == rField2.GetCTLPosture()) 647 && (rField1.GetUnderline() == rField2.GetUnderline()) 648 && (rField1.GetOverline() == rField2.GetOverline()) 649 && (rField1.GetCrossedOut() == rField2.GetCrossedOut()) 650 && (rField1.GetContour() == rField2.GetContour()) 651 && (rField1.GetShadowed() == rField2.GetShadowed()) 652 && (rField1.GetColor() == rField2.GetColor()); 653 } 654 if( bIncludeJustify ) 655 { 656 bEqual = bEqual 657 && (rField1.GetHorJustify() == rField2.GetHorJustify()) 658 && (rField1.GetVerJustify() == rField2.GetVerJustify()) 659 && (rField1.GetStacked() == rField2.GetStacked()) 660 && (rField1.GetLinebreak() == rField2.GetLinebreak()) 661 && (rField1.GetMargin() == rField2.GetMargin()) 662 && (rField1.GetRotateAngle() == rField2.GetRotateAngle()) 663 && (rField1.GetRotateMode() == rField2.GetRotateMode()); 664 } 665 if( bIncludeFrame ) 666 { 667 bEqual = bEqual 668 && (rField1.GetBox() == rField2.GetBox()) 669 && (rField1.GetTLBR() == rField2.GetTLBR()) 670 && (rField1.GetBLTR() == rField2.GetBLTR()); 671 } 672 if( bIncludeBackground ) 673 { 674 bEqual = bEqual 675 && (rField1.GetBackground() == rField2.GetBackground()); 676 } 677 return bEqual; 678 } 679 680 void ScAutoFormatData::FillToItemSet( sal_uInt16 nIndex, SfxItemSet& rItemSet, ScDocument& rDoc ) const 681 { 682 const ScAutoFormatDataField& rField = GetField( nIndex ); 683 684 if( bIncludeValueFormat ) 685 { 686 ScNumFormatAbbrev& rNumFormat = (ScNumFormatAbbrev&)rField.GetNumFormat(); 687 SfxUInt32Item aValueFormat( ATTR_VALUE_FORMAT, 0 ); 688 aValueFormat.SetValue( rNumFormat.GetFormatIndex( *rDoc.GetFormatTable() ) ); 689 rItemSet.Put( aValueFormat ); 690 rItemSet.Put( SvxLanguageItem( rNumFormat.GetLanguage(), ATTR_LANGUAGE_FORMAT ) ); 691 } 692 if( bIncludeFont ) 693 { 694 rItemSet.Put( rField.GetFont() ); 695 rItemSet.Put( rField.GetHeight() ); 696 rItemSet.Put( rField.GetWeight() ); 697 rItemSet.Put( rField.GetPosture() ); 698 // #103065# do not insert empty CJK font 699 const SvxFontItem& rCJKFont = rField.GetCJKFont(); 700 if( rCJKFont.GetStyleName().Len() ) 701 { 702 rItemSet.Put( rCJKFont ); 703 rItemSet.Put( rField.GetCJKHeight() ); 704 rItemSet.Put( rField.GetCJKWeight() ); 705 rItemSet.Put( rField.GetCJKPosture() ); 706 } 707 else 708 { 709 rItemSet.Put( rField.GetHeight(), ATTR_CJK_FONT_HEIGHT ); 710 rItemSet.Put( rField.GetWeight(), ATTR_CJK_FONT_WEIGHT ); 711 rItemSet.Put( rField.GetPosture(), ATTR_CJK_FONT_POSTURE ); 712 } 713 // #103065# do not insert empty CTL font 714 const SvxFontItem& rCTLFont = rField.GetCTLFont(); 715 if( rCTLFont.GetStyleName().Len() ) 716 { 717 rItemSet.Put( rCTLFont ); 718 rItemSet.Put( rField.GetCTLHeight() ); 719 rItemSet.Put( rField.GetCTLWeight() ); 720 rItemSet.Put( rField.GetCTLPosture() ); 721 } 722 else 723 { 724 rItemSet.Put( rField.GetHeight(), ATTR_CTL_FONT_HEIGHT ); 725 rItemSet.Put( rField.GetWeight(), ATTR_CTL_FONT_WEIGHT ); 726 rItemSet.Put( rField.GetPosture(), ATTR_CTL_FONT_POSTURE ); 727 } 728 rItemSet.Put( rField.GetUnderline() ); 729 rItemSet.Put( rField.GetOverline() ); 730 rItemSet.Put( rField.GetCrossedOut() ); 731 rItemSet.Put( rField.GetContour() ); 732 rItemSet.Put( rField.GetShadowed() ); 733 rItemSet.Put( rField.GetColor() ); 734 } 735 if( bIncludeJustify ) 736 { 737 rItemSet.Put( rField.GetHorJustify() ); 738 rItemSet.Put( rField.GetVerJustify() ); 739 rItemSet.Put( rField.GetStacked() ); 740 rItemSet.Put( rField.GetLinebreak() ); 741 rItemSet.Put( rField.GetMargin() ); 742 rItemSet.Put( rField.GetRotateAngle() ); 743 rItemSet.Put( rField.GetRotateMode() ); 744 } 745 if( bIncludeFrame ) 746 { 747 rItemSet.Put( rField.GetBox() ); 748 rItemSet.Put( rField.GetTLBR() ); 749 rItemSet.Put( rField.GetBLTR() ); 750 } 751 if( bIncludeBackground ) 752 rItemSet.Put( rField.GetBackground() ); 753 } 754 755 void ScAutoFormatData::GetFromItemSet( sal_uInt16 nIndex, const SfxItemSet& rItemSet, const ScNumFormatAbbrev& rNumFormat ) 756 { 757 ScAutoFormatDataField& rField = GetField( nIndex ); 758 759 rField.SetNumFormat ( rNumFormat); 760 rField.SetFont ( (const SvxFontItem&) rItemSet.Get( ATTR_FONT ) ); 761 rField.SetHeight ( (const SvxFontHeightItem&) rItemSet.Get( ATTR_FONT_HEIGHT ) ); 762 rField.SetWeight ( (const SvxWeightItem&) rItemSet.Get( ATTR_FONT_WEIGHT ) ); 763 rField.SetPosture ( (const SvxPostureItem&) rItemSet.Get( ATTR_FONT_POSTURE ) ); 764 rField.SetCJKFont ( (const SvxFontItem&) rItemSet.Get( ATTR_CJK_FONT ) ); 765 rField.SetCJKHeight ( (const SvxFontHeightItem&) rItemSet.Get( ATTR_CJK_FONT_HEIGHT ) ); 766 rField.SetCJKWeight ( (const SvxWeightItem&) rItemSet.Get( ATTR_CJK_FONT_WEIGHT ) ); 767 rField.SetCJKPosture ( (const SvxPostureItem&) rItemSet.Get( ATTR_CJK_FONT_POSTURE ) ); 768 rField.SetCTLFont ( (const SvxFontItem&) rItemSet.Get( ATTR_CTL_FONT ) ); 769 rField.SetCTLHeight ( (const SvxFontHeightItem&) rItemSet.Get( ATTR_CTL_FONT_HEIGHT ) ); 770 rField.SetCTLWeight ( (const SvxWeightItem&) rItemSet.Get( ATTR_CTL_FONT_WEIGHT ) ); 771 rField.SetCTLPosture ( (const SvxPostureItem&) rItemSet.Get( ATTR_CTL_FONT_POSTURE ) ); 772 rField.SetUnderline ( (const SvxUnderlineItem&) rItemSet.Get( ATTR_FONT_UNDERLINE ) ); 773 rField.SetOverline ( (const SvxOverlineItem&) rItemSet.Get( ATTR_FONT_OVERLINE ) ); 774 rField.SetCrossedOut ( (const SvxCrossedOutItem&) rItemSet.Get( ATTR_FONT_CROSSEDOUT ) ); 775 rField.SetContour ( (const SvxContourItem&) rItemSet.Get( ATTR_FONT_CONTOUR ) ); 776 rField.SetShadowed ( (const SvxShadowedItem&) rItemSet.Get( ATTR_FONT_SHADOWED ) ); 777 rField.SetColor ( (const SvxColorItem&) rItemSet.Get( ATTR_FONT_COLOR ) ); 778 rField.SetTLBR ( (const SvxLineItem&) rItemSet.Get( ATTR_BORDER_TLBR ) ); 779 rField.SetBLTR ( (const SvxLineItem&) rItemSet.Get( ATTR_BORDER_BLTR ) ); 780 rField.SetHorJustify ( (const SvxHorJustifyItem&) rItemSet.Get( ATTR_HOR_JUSTIFY ) ); 781 rField.SetVerJustify ( (const SvxVerJustifyItem&) rItemSet.Get( ATTR_VER_JUSTIFY ) ); 782 rField.SetStacked ( (const SfxBoolItem&) rItemSet.Get( ATTR_STACKED ) ); 783 rField.SetLinebreak ( (const SfxBoolItem&) rItemSet.Get( ATTR_LINEBREAK ) ); 784 rField.SetMargin ( (const SvxMarginItem&) rItemSet.Get( ATTR_MARGIN ) ); 785 rField.SetBackground ( (const SvxBrushItem&) rItemSet.Get( ATTR_BACKGROUND ) ); 786 rField.SetRotateAngle ( (const SfxInt32Item&) rItemSet.Get( ATTR_ROTATE_VALUE ) ); 787 rField.SetRotateMode ( (const SvxRotateModeItem&) rItemSet.Get( ATTR_ROTATE_MODE ) ); 788 } 789 790 sal_Bool ScAutoFormatData::Load( SvStream& rStream, const ScAfVersions& rVersions ) 791 { 792 sal_Bool bRet = sal_True; 793 sal_uInt16 nVer = 0; 794 rStream >> nVer; 795 bRet = 0 == rStream.GetError(); 796 if( bRet && (nVer == AUTOFORMAT_DATA_ID_X || 797 (AUTOFORMAT_DATA_ID_504 <= nVer && nVer <= AUTOFORMAT_DATA_ID)) ) 798 { 799 // --- from 680/dr25 on: #21549# store strings as UTF-8 800 CharSet eCharSet = (nVer >= AUTOFORMAT_ID_680DR25) ? RTL_TEXTENCODING_UTF8 : rStream.GetStreamCharSet(); 801 rStream.ReadByteString( aName, eCharSet ); 802 if( AUTOFORMAT_DATA_ID_552 <= nVer ) 803 { 804 rStream >> nStrResId; 805 sal_uInt16 nId = RID_SVXSTR_TBLAFMT_BEGIN + nStrResId; 806 if( RID_SVXSTR_TBLAFMT_BEGIN <= nId && 807 nId < RID_SVXSTR_TBLAFMT_END ) 808 { 809 aName = SVX_RESSTR( nId ); 810 } 811 else 812 nStrResId = USHRT_MAX; 813 } 814 815 sal_Bool b; 816 rStream >> b; bIncludeFont = b; 817 rStream >> b; bIncludeJustify = b; 818 rStream >> b; bIncludeFrame = b; 819 rStream >> b; bIncludeBackground = b; 820 rStream >> b; bIncludeValueFormat = b; 821 rStream >> b; bIncludeWidthHeight = b; 822 823 bRet = 0 == rStream.GetError(); 824 for( sal_uInt16 i = 0; bRet && i < 16; ++i ) 825 bRet = GetField( i ).Load( rStream, rVersions, nVer ); 826 } 827 else 828 bRet = sal_False; 829 return bRet; 830 } 831 832 #ifdef READ_OLDVERS 833 sal_Bool ScAutoFormatData::LoadOld( SvStream& rStream, const ScAfVersions& rVersions ) 834 { 835 sal_Bool bRet = sal_True; 836 sal_uInt16 nVal = 0; 837 rStream >> nVal; 838 bRet = (rStream.GetError() == 0); 839 if (bRet && (nVal == AUTOFORMAT_OLD_DATA_ID)) 840 { 841 rStream.ReadByteString( aName, rStream.GetStreamCharSet() ); 842 sal_Bool b; 843 rStream >> b; bIncludeFont = b; 844 rStream >> b; bIncludeJustify = b; 845 rStream >> b; bIncludeFrame = b; 846 rStream >> b; bIncludeBackground = b; 847 rStream >> b; bIncludeValueFormat = b; 848 rStream >> b; bIncludeWidthHeight = b; 849 850 bRet = 0 == rStream.GetError(); 851 for (sal_uInt16 i=0; bRet && i < 16; i++) 852 bRet = GetField( i ).LoadOld( rStream, rVersions ); 853 } 854 else 855 bRet = sal_False; 856 return bRet; 857 } 858 #endif 859 860 sal_Bool ScAutoFormatData::Save(SvStream& rStream) 861 { 862 sal_uInt16 nVal = AUTOFORMAT_DATA_ID; 863 sal_Bool b; 864 rStream << nVal; 865 // --- from 680/dr25 on: #21549# store strings as UTF-8 866 rStream.WriteByteString( aName, RTL_TEXTENCODING_UTF8 ); 867 868 #if 0 869 // This was an internal flag to allow creating AutoFormats with localized names 870 871 if ( USHRT_MAX == nStrResId ) 872 { 873 String aIniVal( SFX_APP()->GetIniManager()->Get( 874 SFX_GROUP_WORKINGSET_IMPL, 875 String( RTL_CONSTASCII_USTRINGPARAM( "SaveTableAutoFmtNameId" )))); 876 if( 0 != aIniVal.ToInt32() ) 877 { 878 // check Name for ResId 879 for( sal_uInt16 nId = RID_SVXSTR_TBLAFMT_BEGIN; 880 RID_SVXSTR_TBLAFMT_END > nId; ++nId ) 881 { 882 String s( SVX_RES( nId ) ); 883 if( s == aName ) 884 { 885 nStrResId = nId - RID_SVXSTR_TBLAFMT_BEGIN; 886 break; 887 } 888 } 889 } 890 } 891 #endif 892 893 rStream << nStrResId; 894 rStream << ( b = bIncludeFont ); 895 rStream << ( b = bIncludeJustify ); 896 rStream << ( b = bIncludeFrame ); 897 rStream << ( b = bIncludeBackground ); 898 rStream << ( b = bIncludeValueFormat ); 899 rStream << ( b = bIncludeWidthHeight ); 900 901 sal_Bool bRet = 0 == rStream.GetError(); 902 for (sal_uInt16 i = 0; bRet && (i < 16); i++) 903 bRet = GetField( i ).Save( rStream ); 904 905 return bRet; 906 } 907 908 //--------------------------------------------------------------------------------------- 909 //--------------------------------------------------------------------------------------- 910 911 ScAutoFormat::ScAutoFormat(sal_uInt16 nLim, sal_uInt16 nDel, sal_Bool bDup): 912 ScSortedCollection (nLim, nDel, bDup), 913 bSaveLater (sal_False) 914 { 915 // create default autoformat 916 ScAutoFormatData* pData = new ScAutoFormatData; 917 String aName(ScGlobal::GetRscString(STR_STYLENAME_STANDARD)); 918 pData->SetName(aName); 919 920 // default font, default height 921 Font aStdFont = OutputDevice::GetDefaultFont( 922 DEFAULTFONT_LATIN_SPREADSHEET, LANGUAGE_ENGLISH_US, DEFAULTFONT_FLAGS_ONLYONE ); 923 SvxFontItem aFontItem( 924 aStdFont.GetFamily(), aStdFont.GetName(), aStdFont.GetStyleName(), 925 aStdFont.GetPitch(), aStdFont.GetCharSet(), ATTR_FONT ); 926 927 aStdFont = OutputDevice::GetDefaultFont( 928 DEFAULTFONT_CJK_SPREADSHEET, LANGUAGE_ENGLISH_US, DEFAULTFONT_FLAGS_ONLYONE ); 929 SvxFontItem aCJKFontItem( 930 aStdFont.GetFamily(), aStdFont.GetName(), aStdFont.GetStyleName(), 931 aStdFont.GetPitch(), aStdFont.GetCharSet(), ATTR_CJK_FONT ); 932 933 aStdFont = OutputDevice::GetDefaultFont( 934 DEFAULTFONT_CTL_SPREADSHEET, LANGUAGE_ENGLISH_US, DEFAULTFONT_FLAGS_ONLYONE ); 935 SvxFontItem aCTLFontItem( 936 aStdFont.GetFamily(), aStdFont.GetName(), aStdFont.GetStyleName(), 937 aStdFont.GetPitch(), aStdFont.GetCharSet(), ATTR_CTL_FONT ); 938 939 SvxFontHeightItem aHeight( 200, 100, ATTR_FONT_HEIGHT ); // 10 pt; 940 941 // black thin border 942 Color aBlack( COL_BLACK ); 943 SvxBorderLine aLine( &aBlack, DEF_LINE_WIDTH_0 ); 944 SvxBoxItem aBox( ATTR_BORDER ); 945 aBox.SetLine(&aLine, BOX_LINE_LEFT); 946 aBox.SetLine(&aLine, BOX_LINE_TOP); 947 aBox.SetLine(&aLine, BOX_LINE_RIGHT); 948 aBox.SetLine(&aLine, BOX_LINE_BOTTOM); 949 950 Color aWhite(COL_WHITE); 951 Color aBlue(COL_BLUE); 952 SvxColorItem aWhiteText( aWhite, ATTR_FONT_COLOR ); 953 SvxColorItem aBlackText( aBlack, ATTR_FONT_COLOR ); 954 SvxBrushItem aBlueBack( aBlue, ATTR_BACKGROUND ); 955 SvxBrushItem aWhiteBack( aWhite, ATTR_BACKGROUND ); 956 SvxBrushItem aGray70Back( Color(0x4d, 0x4d, 0x4d), ATTR_BACKGROUND ); 957 SvxBrushItem aGray20Back( Color(0xcc, 0xcc, 0xcc), ATTR_BACKGROUND ); 958 959 for (sal_uInt16 i=0; i<16; i++) 960 { 961 pData->PutItem( i, aBox ); 962 pData->PutItem( i, aFontItem ); 963 pData->PutItem( i, aCJKFontItem ); 964 pData->PutItem( i, aCTLFontItem ); 965 aHeight.SetWhich( ATTR_FONT_HEIGHT ); 966 pData->PutItem( i, aHeight ); 967 aHeight.SetWhich( ATTR_CJK_FONT_HEIGHT ); 968 pData->PutItem( i, aHeight ); 969 aHeight.SetWhich( ATTR_CTL_FONT_HEIGHT ); 970 pData->PutItem( i, aHeight ); 971 if (i<4) // top: white on blue 972 { 973 pData->PutItem( i, aWhiteText ); 974 pData->PutItem( i, aBlueBack ); 975 } 976 else if ( i%4 == 0 ) // left: white on gray70 977 { 978 pData->PutItem( i, aWhiteText ); 979 pData->PutItem( i, aGray70Back ); 980 } 981 else if ( i%4 == 3 || i >= 12 ) // right and bottom: black on gray20 982 { 983 pData->PutItem( i, aBlackText ); 984 pData->PutItem( i, aGray20Back ); 985 } 986 else // center: black on white 987 { 988 pData->PutItem( i, aBlackText ); 989 pData->PutItem( i, aWhiteBack ); 990 } 991 } 992 993 Insert(pData); 994 } 995 996 ScAutoFormat::ScAutoFormat(const ScAutoFormat& rAutoFormat) : 997 ScSortedCollection (rAutoFormat), 998 bSaveLater (sal_False) 999 {} 1000 1001 ScAutoFormat::~ScAutoFormat() 1002 { 1003 // Bei Aenderungen per StarOne wird nicht sofort gespeichert, sondern zuerst nur 1004 // das SaveLater Flag gesetzt. Wenn das Flag noch gesetzt ist, jetzt speichern. 1005 1006 if (bSaveLater) 1007 Save(); 1008 } 1009 1010 void ScAutoFormat::SetSaveLater( sal_Bool bSet ) 1011 { 1012 bSaveLater = bSet; 1013 } 1014 1015 short ScAutoFormat::Compare(ScDataObject* pKey1, ScDataObject* pKey2) const 1016 { 1017 String aStr1; 1018 String aStr2; 1019 ((ScAutoFormatData*)pKey1)->GetName(aStr1); 1020 ((ScAutoFormatData*)pKey2)->GetName(aStr2); 1021 String aStrStandard = ScGlobal::GetRscString(STR_STYLENAME_STANDARD); 1022 if ( ScGlobal::GetpTransliteration()->isEqual( aStr1, aStrStandard ) ) 1023 return -1; 1024 if ( ScGlobal::GetpTransliteration()->isEqual( aStr2, aStrStandard ) ) 1025 return 1; 1026 return (short) ScGlobal::GetpTransliteration()->compareString( aStr1, aStr2 ); 1027 } 1028 1029 sal_Bool ScAutoFormat::Load() 1030 { 1031 sal_Bool bRet = sal_True; 1032 1033 INetURLObject aURL; 1034 SvtPathOptions aPathOpt; 1035 aURL.SetSmartURL( aPathOpt.GetUserConfigPath() ); 1036 aURL.setFinalSlash(); 1037 aURL.Append( String( RTL_CONSTASCII_USTRINGPARAM( sAutoTblFmtName ) ) ); 1038 1039 SfxMedium aMedium( aURL.GetMainURL(INetURLObject::NO_DECODE), STREAM_READ, sal_True ); 1040 SvStream* pStream = aMedium.GetInStream(); 1041 bRet = (pStream && pStream->GetError() == 0); 1042 if (bRet) 1043 { 1044 SvStream& rStream = *pStream; 1045 // Achtung hier muss ein allgemeiner Header gelesen werden 1046 sal_uInt16 nVal = 0; 1047 rStream >> nVal; 1048 bRet = 0 == rStream.GetError(); 1049 1050 ScAfVersions aVersions; 1051 1052 if (bRet) 1053 { 1054 if( nVal == AUTOFORMAT_ID_358 || 1055 (AUTOFORMAT_ID_504 <= nVal && nVal <= AUTOFORMAT_ID) ) 1056 { 1057 sal_uInt16 nFileVers = SOFFICE_FILEFORMAT_40; 1058 sal_uInt8 nChrSet, nCnt; 1059 long nPos = rStream.Tell(); 1060 rStream >> nCnt >> nChrSet; 1061 // if( 4 <= nCnt ) 1062 // rStream >> nFileVers; 1063 if( rStream.Tell() != sal_uLong(nPos + nCnt) ) 1064 { 1065 DBG_ERRORFILE( "Der Header enthaelt mehr/neuere Daten" ); 1066 rStream.Seek( nPos + nCnt ); 1067 } 1068 rStream.SetStreamCharSet( GetSOLoadTextEncoding( nChrSet, nFileVers ) ); 1069 rStream.SetVersion( nFileVers ); 1070 } 1071 1072 if( nVal == AUTOFORMAT_ID_358 || nVal == AUTOFORMAT_ID_X || 1073 (AUTOFORMAT_ID_504 <= nVal && nVal <= AUTOFORMAT_ID) ) 1074 { 1075 aVersions.Load( rStream, nVal ); // Item-Versionen 1076 1077 ScAutoFormatData* pData; 1078 sal_uInt16 nAnz = 0; 1079 rStream >> nAnz; 1080 bRet = (rStream.GetError() == 0); 1081 for (sal_uInt16 i=0; bRet && (i < nAnz); i++) 1082 { 1083 pData = new ScAutoFormatData(); 1084 bRet = pData->Load(rStream, aVersions); 1085 Insert(pData); 1086 } 1087 } 1088 #ifdef READ_OLDVERS 1089 else 1090 { 1091 if( AUTOFORMAT_OLD_ID_NEW == nVal ) 1092 { 1093 // alte Version der Versions laden 1094 rStream >> aVersions.nFontVersion; 1095 rStream >> aVersions.nFontHeightVersion; 1096 rStream >> aVersions.nWeightVersion; 1097 rStream >> aVersions.nPostureVersion; 1098 rStream >> aVersions.nUnderlineVersion; 1099 rStream >> aVersions.nCrossedOutVersion; 1100 rStream >> aVersions.nContourVersion; 1101 rStream >> aVersions.nShadowedVersion; 1102 rStream >> aVersions.nColorVersion; 1103 rStream >> aVersions.nHorJustifyVersion; 1104 rStream >> aVersions.nVerJustifyVersion; 1105 rStream >> aVersions.nOrientationVersion; 1106 rStream >> aVersions.nBoolVersion; 1107 rStream >> aVersions.nMarginVersion; 1108 rStream >> aVersions.nBoxVersion; 1109 rStream >> aVersions.nBrushVersion; 1110 } 1111 if( AUTOFORMAT_OLD_ID_OLD == nVal || 1112 AUTOFORMAT_OLD_ID_NEW == nVal ) 1113 { 1114 ScAutoFormatData* pData; 1115 sal_uInt16 nAnz = 0; 1116 rStream >> nAnz; 1117 bRet = 0 == rStream.GetError(); 1118 for( sal_uInt16 i=0; bRet && (i < nAnz); ++i ) 1119 { 1120 pData = new ScAutoFormatData(); 1121 bRet = pData->LoadOld( rStream, aVersions ); 1122 Insert( pData ); 1123 } 1124 } 1125 else 1126 bRet = sal_False; 1127 } 1128 #endif 1129 } 1130 } 1131 bSaveLater = sal_False; 1132 return bRet; 1133 } 1134 1135 sal_Bool ScAutoFormat::Save() 1136 { 1137 sal_Bool bRet = sal_True; 1138 1139 INetURLObject aURL; 1140 SvtPathOptions aPathOpt; 1141 aURL.SetSmartURL( aPathOpt.GetUserConfigPath() ); 1142 aURL.setFinalSlash(); 1143 aURL.Append( String( RTL_CONSTASCII_USTRINGPARAM( sAutoTblFmtName ) ) ); 1144 1145 SfxMedium aMedium( aURL.GetMainURL(INetURLObject::NO_DECODE), STREAM_WRITE, sal_True ); 1146 SvStream* pStream = aMedium.GetOutStream(); 1147 bRet = (pStream && pStream->GetError() == 0); 1148 if (bRet) 1149 { 1150 SvStream& rStream = *pStream; 1151 rStream.SetVersion( SOFFICE_FILEFORMAT_40 ); 1152 1153 // Achtung hier muss ein allgemeiner Header gespeichert werden 1154 sal_uInt16 nVal = AUTOFORMAT_ID; 1155 rStream << nVal 1156 << (sal_uInt8)2 // Anzahl von Zeichen des Headers incl. diesem 1157 << (sal_uInt8)::GetSOStoreTextEncoding( 1158 gsl_getSystemTextEncoding(), sal::static_int_cast<sal_uInt16>(rStream.GetVersion()) ); 1159 // << (sal_uInt8)4 // Anzahl von Zeichen des Headers incl. diesem 1160 // << (sal_uInt8)::GetStoreCharSet(::GetSystemCharSet()) 1161 // << (UNIT16)SOFFICE_FILEFORMAT_NOW; 1162 ScAfVersions::Write(rStream); // Item-Versionen 1163 1164 bRet = (rStream.GetError() == 0); 1165 //----------------------------------------------------------- 1166 rStream << (sal_uInt16)(nCount - 1); 1167 bRet = (rStream.GetError() == 0); 1168 for (sal_uInt16 i=1; bRet && (i < nCount); i++) 1169 bRet = ((ScAutoFormatData*)pItems[i])->Save(rStream); 1170 rStream.Flush(); 1171 1172 aMedium.Commit(); 1173 } 1174 bSaveLater = sal_False; 1175 return bRet; 1176 } 1177 1178 sal_uInt16 ScAutoFormat::FindIndexPerName( const String& rName ) const 1179 { 1180 String aName; 1181 1182 for( sal_uInt16 i=0; i<nCount ; i++ ) 1183 { 1184 ScAutoFormatData* pItem = (ScAutoFormatData*)pItems[i]; 1185 pItem->GetName( aName ); 1186 1187 if( aName == rName ) 1188 return i; 1189 } 1190 1191 return 0; 1192 } 1193 1194 1195 1196 1197