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