xref: /trunk/main/sw/source/core/doc/tblafmt.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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_sw.hxx"
30 
31 
32 #include <tools/resid.hxx>
33 #include <tools/stream.hxx>
34 #include <tools/shl.hxx>
35 #include <vcl/svapp.hxx>
36 #include <sfx2/docfile.hxx>
37 #include <svl/urihelper.hxx>
38 #include <svl/zforlist.hxx>
39 #include <svl/zformat.hxx>
40 #include <unotools/pathoptions.hxx>
41 #include <sfx2/app.hxx>
42 #include <svx/dialmgr.hxx>
43 #ifndef _SVX_DIALOGS_HRC
44 #include <svx/dialogs.hrc>
45 #endif
46 
47 #define READ_OLDVERS        // erstmal noch alte Versionen lesen
48 #include <swtypes.hxx>
49 #include <doc.hxx>
50 #include <poolfmt.hxx>
51 #include <tblafmt.hxx>
52 #include <cellatr.hxx>
53 #include <SwStyleNameMapper.hxx>
54 
55 // bis SO5PF
56 const sal_uInt16 AUTOFORMAT_ID_X        = 9501;
57 const sal_uInt16 AUTOFORMAT_ID_358      = 9601;
58 const sal_uInt16 AUTOFORMAT_DATA_ID_X   = 9502;
59 
60 // ab SO5
61 //! in nachfolgenden Versionen muss der Betrag dieser IDs groesser sein
62 const sal_uInt16 AUTOFORMAT_ID_504      = 9801;
63 const sal_uInt16 AUTOFORMAT_DATA_ID_504 = 9802;
64 
65 const sal_uInt16 AUTOFORMAT_ID_552      = 9901;
66 const sal_uInt16 AUTOFORMAT_DATA_ID_552 = 9902;
67 
68 // --- from 641 on: CJK and CTL font settings
69 const sal_uInt16 AUTOFORMAT_ID_641      = 10001;
70 const sal_uInt16 AUTOFORMAT_DATA_ID_641 = 10002;
71 
72 // --- from 680/dr14 on: diagonal frame lines
73 const sal_uInt16 AUTOFORMAT_ID_680DR14      = 10011;
74 const sal_uInt16 AUTOFORMAT_DATA_ID_680DR14 = 10012;
75 
76 // --- from 680/dr25 on: #21549# store strings as UTF-8
77 const sal_uInt16 AUTOFORMAT_ID_680DR25      = 10021;
78 const sal_uInt16 AUTOFORMAT_DATA_ID_680DR25 = 10022;
79 
80 // --- from DEV300/overline2 on: #5991# overline
81 const sal_uInt16 AUTOFORMAT_ID_300OVRLN      = 10031;
82 const sal_uInt16 AUTOFORMAT_DATA_ID_300OVRLN = 10032;
83 
84 // current version
85 const sal_uInt16 AUTOFORMAT_ID          = AUTOFORMAT_ID_300OVRLN;
86 const sal_uInt16 AUTOFORMAT_DATA_ID     = AUTOFORMAT_DATA_ID_300OVRLN;
87 
88 
89 #ifdef READ_OLDVERS
90 const sal_uInt16 AUTOFORMAT_OLD_ID      = 8201;
91 const sal_uInt16 AUTOFORMAT_OLD_ID1     = 8301;
92 const sal_uInt16 AUTOFORMAT_OLD_DATA_ID = 8202;
93 #endif
94 
95 
96 SwBoxAutoFmt* SwTableAutoFmt::pDfltBoxAutoFmt = 0;
97 
98 #define sAutoTblFmtName "autotbl.fmt"
99 
100 // SwTable Auto-Format-Tabelle
101 SV_IMPL_PTRARR( _SwTableAutoFmtTbl, SwTableAutoFmt* )
102 
103 
104 //  Struct mit Versionsnummern der Items
105 
106 struct SwAfVersions
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     SwAfVersions();
136     void Load( SvStream& rStream, sal_uInt16 nVer );
137 };
138 
139 SwAfVersions::SwAfVersions() :
140     nFontVersion(0),
141     nFontHeightVersion(0),
142     nWeightVersion(0),
143     nPostureVersion(0),
144     nUnderlineVersion(0),
145     nOverlineVersion(0),
146     nCrossedOutVersion(0),
147     nContourVersion(0),
148     nShadowedVersion(0),
149     nColorVersion(0),
150     nBoxVersion(0),
151     nLineVersion(0),
152     nBrushVersion(0),
153     nAdjustVersion(0),
154     nHorJustifyVersion(0),
155     nVerJustifyVersion(0),
156     nOrientationVersion(0),
157     nMarginVersion(0),
158     nBoolVersion(0),
159     nInt32Version(0),
160     nRotateModeVersion(0),
161     nNumFmtVersion(0)
162 {
163 }
164 
165 void SwAfVersions::Load( SvStream& rStream, sal_uInt16 nVer )
166 {
167     rStream >> nFontVersion;
168     rStream >> nFontHeightVersion;
169     rStream >> nWeightVersion;
170     rStream >> nPostureVersion;
171     rStream >> nUnderlineVersion;
172     if ( nVer >= AUTOFORMAT_ID_300OVRLN )
173         rStream >> nOverlineVersion;
174     rStream >> nCrossedOutVersion;
175     rStream >> nContourVersion;
176     rStream >> nShadowedVersion;
177     rStream >> nColorVersion;
178     rStream >> nBoxVersion;
179     if ( nVer >= AUTOFORMAT_ID_680DR14 )
180         rStream >> nLineVersion;
181     rStream >> nBrushVersion;
182     rStream >> nAdjustVersion;
183     rStream >> nHorJustifyVersion;
184     rStream >> nVerJustifyVersion;
185     rStream >> nOrientationVersion;
186     rStream >> nMarginVersion;
187     rStream >> nBoolVersion;
188     if ( nVer >= AUTOFORMAT_ID_504 )
189     {
190         rStream >> nInt32Version;
191         rStream >> nRotateModeVersion;
192     }
193     rStream >> nNumFmtVersion;
194 }
195 
196 //  ---------------------------------------------------------------------------
197 
198 SwBoxAutoFmt::SwBoxAutoFmt()
199     : aFont( *(SvxFontItem*)GetDfltAttr( RES_CHRATR_FONT ) ),
200     aHeight( 240, 100, RES_CHRATR_FONTSIZE ),
201     aWeight( WEIGHT_NORMAL, RES_CHRATR_WEIGHT ),
202     aPosture( ITALIC_NONE, RES_CHRATR_POSTURE ),
203 
204     aCJKFont( *(SvxFontItem*)GetDfltAttr( RES_CHRATR_CJK_FONT ) ),
205     aCJKHeight( 240, 100, RES_CHRATR_CJK_FONTSIZE ),
206     aCJKWeight( WEIGHT_NORMAL, RES_CHRATR_CJK_WEIGHT ),
207     aCJKPosture( ITALIC_NONE, RES_CHRATR_CJK_POSTURE ),
208 
209     aCTLFont( *(SvxFontItem*)GetDfltAttr( RES_CHRATR_CTL_FONT ) ),
210     aCTLHeight( 240, 100, RES_CHRATR_CTL_FONTSIZE ),
211     aCTLWeight( WEIGHT_NORMAL, RES_CHRATR_CTL_WEIGHT ),
212     aCTLPosture( ITALIC_NONE, RES_CHRATR_CTL_POSTURE ),
213 
214     aUnderline( UNDERLINE_NONE, RES_CHRATR_UNDERLINE ),
215     aOverline( UNDERLINE_NONE, RES_CHRATR_OVERLINE ),
216     aCrossedOut( STRIKEOUT_NONE, RES_CHRATR_CROSSEDOUT ),
217     aContour( sal_False, RES_CHRATR_CONTOUR ),
218     aShadowed( sal_False, RES_CHRATR_SHADOWED ),
219     aColor( RES_CHRATR_COLOR ),
220     aBox( RES_BOX ),
221     aTLBR( 0 ),
222     aBLTR( 0 ),
223     aBackground( RES_BACKGROUND ),
224     aAdjust( SVX_ADJUST_LEFT, RES_PARATR_ADJUST ),
225     aHorJustify( SVX_HOR_JUSTIFY_STANDARD, 0),
226     aVerJustify( SVX_VER_JUSTIFY_STANDARD, 0),
227     aStacked( 0 ),
228     aMargin( 0 ),
229     aLinebreak( 0 ),
230     aRotateAngle( 0 ),
231 
232 // FIXME - add attribute IDs for the diagonal line items
233 //    aTLBR( RES_... ),
234 //    aBLTR( RES_... ),
235     aRotateMode( SVX_ROTATE_MODE_STANDARD, 0 )
236 {
237     eSysLanguage = eNumFmtLanguage = static_cast<LanguageType>(::GetAppLanguage());
238     aBox.SetDistance( 55 );
239 }
240 
241 
242 SwBoxAutoFmt::SwBoxAutoFmt( const SwBoxAutoFmt& rNew )
243     : aFont( rNew.aFont ),
244     aHeight( rNew.aHeight ),
245     aWeight( rNew.aWeight ),
246     aPosture( rNew.aPosture ),
247     aCJKFont( rNew.aCJKFont ),
248     aCJKHeight( rNew.aCJKHeight ),
249     aCJKWeight( rNew.aCJKWeight ),
250     aCJKPosture( rNew.aCJKPosture ),
251     aCTLFont( rNew.aCTLFont ),
252     aCTLHeight( rNew.aCTLHeight ),
253     aCTLWeight( rNew.aCTLWeight ),
254     aCTLPosture( rNew.aCTLPosture ),
255     aUnderline( rNew.aUnderline ),
256     aOverline( rNew.aOverline ),
257     aCrossedOut( rNew.aCrossedOut ),
258     aContour( rNew.aContour ),
259     aShadowed( rNew.aShadowed ),
260     aColor( rNew.aColor ),
261     aBox( rNew.aBox ),
262     aTLBR( rNew.aTLBR ),
263     aBLTR( rNew.aBLTR ),
264     aBackground( rNew.aBackground ),
265     aAdjust( rNew.aAdjust ),
266     aHorJustify( rNew.aHorJustify ),
267     aVerJustify( rNew.aVerJustify ),
268     aStacked( rNew.aStacked ),
269     aMargin( rNew.aMargin ),
270     aLinebreak( rNew.aLinebreak ),
271     aRotateAngle( rNew.aRotateAngle ),
272     aRotateMode( rNew.aRotateMode ),
273     sNumFmtString( rNew.sNumFmtString ),
274     eSysLanguage( rNew.eSysLanguage ),
275     eNumFmtLanguage( rNew.eNumFmtLanguage )
276 {
277 }
278 
279 
280 SwBoxAutoFmt::~SwBoxAutoFmt()
281 {
282 }
283 
284 SwBoxAutoFmt& SwBoxAutoFmt::operator=( const SwBoxAutoFmt& rNew )
285 {
286     aFont = rNew.aFont;
287     aHeight = rNew.aHeight;
288     aWeight = rNew.aWeight;
289     aPosture = rNew.aPosture;
290     aCJKFont = rNew.aCJKFont;
291     aCJKHeight = rNew.aCJKHeight;
292     aCJKWeight = rNew.aCJKWeight;
293     aCJKPosture = rNew.aCJKPosture;
294     aCTLFont = rNew.aCTLFont;
295     aCTLHeight = rNew.aCTLHeight;
296     aCTLWeight = rNew.aCTLWeight;
297     aCTLPosture = rNew.aCTLPosture;
298     aUnderline = rNew.aUnderline;
299     aOverline = rNew.aOverline;
300     aCrossedOut = rNew.aCrossedOut;
301     aContour = rNew.aContour;
302     aShadowed = rNew.aShadowed;
303     aColor = rNew.aColor;
304     SetAdjust( rNew.aAdjust );
305     aBox = rNew.aBox;
306     aTLBR = rNew.aTLBR;
307     aBLTR = rNew.aBLTR;
308     aBackground = rNew.aBackground;
309 
310     aHorJustify = rNew.aHorJustify;
311     aVerJustify = rNew.aVerJustify;
312     aStacked.SetValue( rNew.aStacked.GetValue() );
313     aMargin = rNew.aMargin;
314     aLinebreak.SetValue( rNew.aLinebreak.GetValue() );
315     aRotateAngle.SetValue( rNew.aRotateAngle.GetValue() );
316     aRotateMode.SetValue( rNew.aRotateMode.GetValue() );
317 
318     sNumFmtString = rNew.sNumFmtString;
319     eSysLanguage = rNew.eSysLanguage;
320     eNumFmtLanguage = rNew.eNumFmtLanguage;
321 
322     return *this;
323 }
324 
325 
326 #define READ( aItem, aItemType, nVers )\
327     pNew = aItem.Create(rStream, nVers ); \
328     aItem = *(aItemType*)pNew; \
329     delete pNew;
330 
331 sal_Bool SwBoxAutoFmt::Load( SvStream& rStream, const SwAfVersions& rVersions, sal_uInt16 nVer )
332 {
333     SfxPoolItem* pNew;
334     SvxOrientationItem aOrientation( SVX_ORIENTATION_STANDARD, 0);
335 
336     READ( aFont,        SvxFontItem            , rVersions.nFontVersion)
337 
338     if( rStream.GetStreamCharSet() == aFont.GetCharSet() )
339         aFont.SetCharSet(::gsl_getSystemTextEncoding());
340 
341     READ( aHeight,      SvxFontHeightItem  , rVersions.nFontHeightVersion)
342     READ( aWeight,      SvxWeightItem      , rVersions.nWeightVersion)
343     READ( aPosture,     SvxPostureItem     , rVersions.nPostureVersion)
344     // --- from 641 on: CJK and CTL font settings
345     if( AUTOFORMAT_DATA_ID_641 <= nVer )
346     {
347         READ( aCJKFont,                        SvxFontItem         , rVersions.nFontVersion)
348         READ( aCJKHeight,       SvxFontHeightItem   , rVersions.nFontHeightVersion)
349         READ( aCJKWeight,     SvxWeightItem       , rVersions.nWeightVersion)
350         READ( aCJKPosture,   SvxPostureItem      , rVersions.nPostureVersion)
351         READ( aCTLFont,                        SvxFontItem         , rVersions.nFontVersion)
352         READ( aCTLHeight,        SvxFontHeightItem   , rVersions.nFontHeightVersion)
353         READ( aCTLWeight,       SvxWeightItem       , rVersions.nWeightVersion)
354         READ( aCTLPosture,   SvxPostureItem      , rVersions.nPostureVersion)
355     }
356     READ( aUnderline,   SvxUnderlineItem   , rVersions.nUnderlineVersion)
357     if( nVer >= AUTOFORMAT_DATA_ID_300OVRLN )
358     {
359         READ( aOverline,       SvxOverlineItem     , rVersions.nOverlineVersion)
360     }
361     READ( aCrossedOut,  SvxCrossedOutItem  , rVersions.nCrossedOutVersion)
362     READ( aContour,     SvxContourItem     , rVersions.nContourVersion)
363     READ( aShadowed,    SvxShadowedItem       , rVersions.nShadowedVersion)
364     READ( aColor,       SvxColorItem       , rVersions.nColorVersion)
365 
366     READ( aBox,         SvxBoxItem         , rVersions.nBoxVersion)
367 
368     // --- from 680/dr14 on: diagonal frame lines
369     if( nVer >= AUTOFORMAT_DATA_ID_680DR14 )
370     {
371         READ( aTLBR, SvxLineItem, rVersions.nLineVersion)
372         READ( aBLTR, SvxLineItem, rVersions.nLineVersion)
373     }
374 
375     READ( aBackground,  SvxBrushItem        , rVersions.nBrushVersion)
376 
377     pNew = aAdjust.Create(rStream, rVersions.nAdjustVersion );
378     SetAdjust( *(SvxAdjustItem*)pNew );
379     delete pNew;
380 
381     READ( aHorJustify,  SvxHorJustifyItem , rVersions.nHorJustifyVersion)
382     READ( aVerJustify,  SvxVerJustifyItem   , rVersions.nVerJustifyVersion)
383     READ( aOrientation, SvxOrientationItem  , rVersions.nOrientationVersion)
384     READ( aMargin, SvxMarginItem       , rVersions.nMarginVersion)
385 
386     pNew = aLinebreak.Create(rStream, rVersions.nBoolVersion );
387     aLinebreak.SetValue( ((SfxBoolItem*)pNew)->GetValue() );
388     delete pNew;
389 
390     if ( nVer >= AUTOFORMAT_DATA_ID_504 )
391     {
392         pNew = aRotateAngle.Create( rStream, rVersions.nInt32Version );
393         aRotateAngle.SetValue( ((SfxInt32Item*)pNew)->GetValue() );
394         delete pNew;
395         pNew = aRotateMode.Create( rStream, rVersions.nRotateModeVersion );
396         aRotateMode.SetValue( ((SvxRotateModeItem*)pNew)->GetValue() );
397         delete pNew;
398     }
399 
400     if( 0 == rVersions.nNumFmtVersion )
401     {
402         sal_uInt16 eSys, eLge;
403         // --- from 680/dr25 on: #21549# store strings as UTF-8
404         CharSet eCharSet = (nVer >= AUTOFORMAT_ID_680DR25) ? RTL_TEXTENCODING_UTF8 : rStream.GetStreamCharSet();
405         rStream.ReadByteString( sNumFmtString, eCharSet )
406                 >> eSys >> eLge;
407         eSysLanguage = (LanguageType) eSys;
408         eNumFmtLanguage = (LanguageType) eLge;
409         if ( eSysLanguage == LANGUAGE_SYSTEM )      // von alten Versionen (Calc)
410             eSysLanguage = static_cast<LanguageType>(::GetAppLanguage());
411     }
412 
413     aStacked.SetValue( aOrientation.IsStacked() );
414     aRotateAngle.SetValue( aOrientation.GetRotation( aRotateAngle.GetValue() ) );
415 
416     return 0 == rStream.GetError();
417 }
418 
419 #ifdef READ_OLDVERS
420 
421 sal_Bool SwBoxAutoFmt::LoadOld( SvStream& rStream, sal_uInt16 aLoadVer[] )
422 {
423     SfxPoolItem* pNew;
424     READ( aFont,        SvxFontItem         , 0)
425 
426     if( rStream.GetStreamCharSet() == aFont.GetCharSet() )
427         aFont.SetCharSet(::gsl_getSystemTextEncoding());
428 
429     READ( aHeight,      SvxFontHeightItem   , 1)
430     READ( aWeight,      SvxWeightItem       , 2)
431     READ( aPosture,     SvxPostureItem      , 3)
432     READ( aUnderline,   SvxUnderlineItem    , 4)
433     READ( aCrossedOut,  SvxCrossedOutItem   , 5)
434     READ( aContour,     SvxContourItem      , 6)
435     READ( aShadowed,    SvxShadowedItem     , 7)
436     READ( aColor,       SvxColorItem        , 8)
437 
438     pNew = aAdjust.Create(rStream, aLoadVer[ 9 ] );
439     SetAdjust( *(SvxAdjustItem*)pNew );
440     delete pNew;
441 
442     READ( aBox,         SvxBoxItem          , 10)
443     READ( aBackground,  SvxBrushItem        , 11)
444 
445     return 0 == rStream.GetError();
446 }
447 
448 #endif
449 
450 
451 sal_Bool SwBoxAutoFmt::Save( SvStream& rStream ) const
452 {
453     SvxOrientationItem aOrientation( aRotateAngle.GetValue(), aStacked.GetValue(), 0 );
454 
455     aFont.Store( rStream, aFont.GetVersion(SOFFICE_FILEFORMAT_40)  );
456     aHeight.Store( rStream, aHeight.GetVersion(SOFFICE_FILEFORMAT_40) );
457     aWeight.Store( rStream, aWeight.GetVersion(SOFFICE_FILEFORMAT_40) );
458     aPosture.Store( rStream, aPosture.GetVersion(SOFFICE_FILEFORMAT_40) );
459     aCJKFont.Store( rStream, aCJKFont.GetVersion(SOFFICE_FILEFORMAT_40)  );
460     aCJKHeight.Store( rStream, aCJKHeight.GetVersion(SOFFICE_FILEFORMAT_40) );
461     aCJKWeight.Store( rStream, aCJKWeight.GetVersion(SOFFICE_FILEFORMAT_40) );
462     aCJKPosture.Store( rStream, aCJKPosture.GetVersion(SOFFICE_FILEFORMAT_40) );
463     aCTLFont.Store( rStream, aCTLFont.GetVersion(SOFFICE_FILEFORMAT_40)  );
464     aCTLHeight.Store( rStream, aCTLHeight.GetVersion(SOFFICE_FILEFORMAT_40) );
465     aCTLWeight.Store( rStream, aCTLWeight.GetVersion(SOFFICE_FILEFORMAT_40) );
466     aCTLPosture.Store( rStream, aCTLPosture.GetVersion(SOFFICE_FILEFORMAT_40) );
467     aUnderline.Store( rStream, aUnderline.GetVersion(SOFFICE_FILEFORMAT_40) );
468     aOverline.Store( rStream, aOverline.GetVersion(SOFFICE_FILEFORMAT_40) );
469     aCrossedOut.Store( rStream, aCrossedOut.GetVersion(SOFFICE_FILEFORMAT_40) );
470     aContour.Store( rStream, aContour.GetVersion(SOFFICE_FILEFORMAT_40) );
471     aShadowed.Store( rStream, aShadowed.GetVersion(SOFFICE_FILEFORMAT_40) );
472     aColor.Store( rStream, aColor.GetVersion(SOFFICE_FILEFORMAT_40) );
473     aBox.Store( rStream, aBox.GetVersion(SOFFICE_FILEFORMAT_40) );
474     aTLBR.Store( rStream, aTLBR.GetVersion(SOFFICE_FILEFORMAT_40) );
475     aBLTR.Store( rStream, aBLTR.GetVersion(SOFFICE_FILEFORMAT_40) );
476     aBackground.Store( rStream, aBackground.GetVersion(SOFFICE_FILEFORMAT_40) );
477 
478     aAdjust.Store( rStream, aAdjust.GetVersion(SOFFICE_FILEFORMAT_40) );
479 
480     aHorJustify.Store( rStream, aHorJustify.GetVersion(SOFFICE_FILEFORMAT_40) );
481     aVerJustify.Store( rStream, aVerJustify.GetVersion(SOFFICE_FILEFORMAT_40) );
482     aOrientation.Store( rStream, aOrientation.GetVersion(SOFFICE_FILEFORMAT_40) );
483     aMargin.Store( rStream, aMargin.GetVersion(SOFFICE_FILEFORMAT_40) );
484     aLinebreak.Store( rStream, aLinebreak.GetVersion(SOFFICE_FILEFORMAT_40) );
485     // Calc Rotation ab SO5
486     aRotateAngle.Store( rStream, aRotateAngle.GetVersion(SOFFICE_FILEFORMAT_40) );
487     aRotateMode.Store( rStream, aRotateMode.GetVersion(SOFFICE_FILEFORMAT_40) );
488 
489     // --- from 680/dr25 on: #21549# store strings as UTF-8
490     rStream.WriteByteString( sNumFmtString, RTL_TEXTENCODING_UTF8 )
491         << (sal_uInt16)eSysLanguage << (sal_uInt16)eNumFmtLanguage;
492 
493     return 0 == rStream.GetError();
494 }
495 
496 
497 sal_Bool SwBoxAutoFmt::SaveVerionNo( SvStream& rStream ) const
498 {
499     rStream << aFont.GetVersion( SOFFICE_FILEFORMAT_40 );
500     rStream << aHeight.GetVersion( SOFFICE_FILEFORMAT_40 );
501     rStream << aWeight.GetVersion( SOFFICE_FILEFORMAT_40 );
502     rStream << aPosture.GetVersion( SOFFICE_FILEFORMAT_40 );
503     rStream << aUnderline.GetVersion( SOFFICE_FILEFORMAT_40 );
504     rStream << aOverline.GetVersion( SOFFICE_FILEFORMAT_40 );
505     rStream << aCrossedOut.GetVersion( SOFFICE_FILEFORMAT_40 );
506     rStream << aContour.GetVersion( SOFFICE_FILEFORMAT_40 );
507     rStream << aShadowed.GetVersion( SOFFICE_FILEFORMAT_40 );
508     rStream << aColor.GetVersion( SOFFICE_FILEFORMAT_40 );
509     rStream << aBox.GetVersion( SOFFICE_FILEFORMAT_40 );
510     rStream << aTLBR.GetVersion( SOFFICE_FILEFORMAT_40 );
511     rStream << aBackground.GetVersion( SOFFICE_FILEFORMAT_40 );
512 
513     rStream << aAdjust.GetVersion( SOFFICE_FILEFORMAT_40 );
514 
515     rStream << aHorJustify.GetVersion( SOFFICE_FILEFORMAT_40 );
516     rStream << aVerJustify.GetVersion( SOFFICE_FILEFORMAT_40 );
517     rStream << SvxOrientationItem(SVX_ORIENTATION_STANDARD, 0).GetVersion( SOFFICE_FILEFORMAT_40 );
518     rStream << aMargin.GetVersion( SOFFICE_FILEFORMAT_40 );
519     rStream << aLinebreak.GetVersion( SOFFICE_FILEFORMAT_40 );
520     rStream << aRotateAngle.GetVersion( SOFFICE_FILEFORMAT_40 );
521     rStream << aRotateMode.GetVersion( SOFFICE_FILEFORMAT_40 );
522 
523     rStream << (sal_uInt16)0;       // NumberFormat
524 
525     return 0 == rStream.GetError();
526 }
527 
528 /*  */
529 
530 
531 SwTableAutoFmt::SwTableAutoFmt( const String& rName )
532     : aName( rName ), nStrResId( USHRT_MAX )
533 {
534     bInclFont = sal_True;
535     bInclJustify = sal_True;
536     bInclFrame = sal_True;
537     bInclBackground = sal_True;
538     bInclValueFormat = sal_True;
539     bInclWidthHeight = sal_True;
540 
541     memset( aBoxAutoFmt, 0, sizeof( aBoxAutoFmt ) );
542 }
543 
544 
545 SwTableAutoFmt::SwTableAutoFmt( const SwTableAutoFmt& rNew )
546 {
547     for( sal_uInt8 n = 0; n < 16; ++n )
548         aBoxAutoFmt[ n ] = 0;
549     *this = rNew;
550 }
551 
552 SwTableAutoFmt& SwTableAutoFmt::operator=( const SwTableAutoFmt& rNew )
553 {
554     for( sal_uInt8 n = 0; n < 16; ++n )
555     {
556         if( aBoxAutoFmt[ n ] )
557             delete aBoxAutoFmt[ n ];
558 
559         SwBoxAutoFmt* pFmt = rNew.aBoxAutoFmt[ n ];
560         if( pFmt )      // ist gesetzt -> kopieren
561             aBoxAutoFmt[ n ] = new SwBoxAutoFmt( *pFmt );
562         else            // sonst default
563             aBoxAutoFmt[ n ] = 0;
564     }
565 
566     aName = rNew.aName;
567     nStrResId = rNew.nStrResId;
568     bInclFont = rNew.bInclFont;
569     bInclJustify = rNew.bInclJustify;
570     bInclFrame = rNew.bInclFrame;
571     bInclBackground = rNew.bInclBackground;
572     bInclValueFormat = rNew.bInclValueFormat;
573     bInclWidthHeight = rNew.bInclWidthHeight;
574 
575     return *this;
576 }
577 
578 
579 SwTableAutoFmt::~SwTableAutoFmt()
580 {
581     SwBoxAutoFmt** ppFmt = aBoxAutoFmt;
582     for( sal_uInt8 n = 0; n < 16; ++n, ++ppFmt )
583         if( *ppFmt )
584             delete *ppFmt;
585 }
586 
587 
588 void SwTableAutoFmt::SetBoxFmt( const SwBoxAutoFmt& rNew, sal_uInt8 nPos )
589 {
590     ASSERT( nPos < 16, "falscher Bereich" );
591 
592     SwBoxAutoFmt* pFmt = aBoxAutoFmt[ nPos ];
593     if( pFmt )      // ist gesetzt -> kopieren
594         *aBoxAutoFmt[ nPos ] = rNew;
595     else            // sonst neu setzen
596         aBoxAutoFmt[ nPos ] = new SwBoxAutoFmt( rNew );
597 }
598 
599 
600 const SwBoxAutoFmt& SwTableAutoFmt::GetBoxFmt( sal_uInt8 nPos ) const
601 {
602     ASSERT( nPos < 16, "falscher Bereich" );
603 
604     SwBoxAutoFmt* pFmt = aBoxAutoFmt[ nPos ];
605     if( pFmt )      // ist gesetzt -> kopieren
606         return *pFmt;
607     else            // sonst den default returnen
608     {
609         // falls noch nicht vorhanden:
610         if( !pDfltBoxAutoFmt )
611             pDfltBoxAutoFmt = new SwBoxAutoFmt;
612         return *pDfltBoxAutoFmt;
613     }
614 }
615 
616 
617 
618 SwBoxAutoFmt& SwTableAutoFmt::UpdateFromSet( sal_uInt8 nPos,
619                                             const SfxItemSet& rSet,
620                                             UpdateFlags eFlags,
621                                             SvNumberFormatter* pNFmtr )
622 {
623     ASSERT( nPos < 16, "falscher Bereich" );
624 
625     SwBoxAutoFmt* pFmt = aBoxAutoFmt[ nPos ];
626     if( !pFmt )     // ist gesetzt -> kopieren
627     {
628         pFmt = new SwBoxAutoFmt;
629         aBoxAutoFmt[ nPos ] = pFmt;
630     }
631 
632     if( UPDATE_CHAR & eFlags )
633     {
634         pFmt->SetFont( (SvxFontItem&)rSet.Get( RES_CHRATR_FONT ) );
635         pFmt->SetHeight( (SvxFontHeightItem&)rSet.Get( RES_CHRATR_FONTSIZE ) );
636         pFmt->SetWeight( (SvxWeightItem&)rSet.Get( RES_CHRATR_WEIGHT ) );
637         pFmt->SetPosture( (SvxPostureItem&)rSet.Get( RES_CHRATR_POSTURE ) );
638         pFmt->SetCJKFont( (SvxFontItem&)rSet.Get( RES_CHRATR_CJK_FONT ) );
639         pFmt->SetCJKHeight( (SvxFontHeightItem&)rSet.Get( RES_CHRATR_CJK_FONTSIZE ) );
640         pFmt->SetCJKWeight( (SvxWeightItem&)rSet.Get( RES_CHRATR_CJK_WEIGHT ) );
641         pFmt->SetCJKPosture( (SvxPostureItem&)rSet.Get( RES_CHRATR_CJK_POSTURE ) );
642         pFmt->SetCTLFont( (SvxFontItem&)rSet.Get( RES_CHRATR_CTL_FONT ) );
643         pFmt->SetCTLHeight( (SvxFontHeightItem&)rSet.Get( RES_CHRATR_CTL_FONTSIZE ) );
644         pFmt->SetCTLWeight( (SvxWeightItem&)rSet.Get( RES_CHRATR_CTL_WEIGHT ) );
645         pFmt->SetCTLPosture( (SvxPostureItem&)rSet.Get( RES_CHRATR_CTL_POSTURE ) );
646         pFmt->SetUnderline( (SvxUnderlineItem&)rSet.Get( RES_CHRATR_UNDERLINE ) );
647         pFmt->SetOverline( (SvxOverlineItem&)rSet.Get( RES_CHRATR_OVERLINE ) );
648         pFmt->SetCrossedOut( (SvxCrossedOutItem&)rSet.Get( RES_CHRATR_CROSSEDOUT ) );
649         pFmt->SetContour( (SvxContourItem&)rSet.Get( RES_CHRATR_CONTOUR ) );
650         pFmt->SetShadowed( (SvxShadowedItem&)rSet.Get( RES_CHRATR_SHADOWED ) );
651         pFmt->SetColor( (SvxColorItem&)rSet.Get( RES_CHRATR_COLOR ) );
652         pFmt->SetAdjust( (SvxAdjustItem&)rSet.Get( RES_PARATR_ADJUST ) );
653     }
654     if( UPDATE_BOX & eFlags )
655     {
656         pFmt->SetBox( (SvxBoxItem&)rSet.Get( RES_BOX ) );
657 // FIXME - add attribute IDs for the diagonal line items
658 //        pFmt->SetTLBR( (SvxLineItem&)rSet.Get( RES_... ) );
659 //        pFmt->SetBLTR( (SvxLineItem&)rSet.Get( RES_... ) );
660         pFmt->SetBackground( (SvxBrushItem&)rSet.Get( RES_BACKGROUND ) );
661 
662         const SwTblBoxNumFormat* pNumFmtItem;
663         const SvNumberformat* pNumFormat = 0;
664         if( SFX_ITEM_SET == rSet.GetItemState( RES_BOXATR_FORMAT, sal_True,
665             (const SfxPoolItem**)&pNumFmtItem ) && pNFmtr &&
666             0 != (pNumFormat = pNFmtr->GetEntry( pNumFmtItem->GetValue() )) )
667             pFmt->SetValueFormat( ((SvNumberformat*)pNumFormat)->GetFormatstring(),
668                                     pNumFormat->GetLanguage(),
669                                     static_cast<LanguageType>(::GetAppLanguage()));
670         else
671         {
672             // defaulten
673             pFmt->SetValueFormat( aEmptyStr, LANGUAGE_SYSTEM,
674                                   static_cast<LanguageType>(::GetAppLanguage() ));
675         }
676     }
677     // den Rest koennen wir nicht, StarCalc spezifisch
678 
679     return *pFmt;
680 }
681 
682 
683 void SwTableAutoFmt::UpdateToSet( sal_uInt8 nPos, SfxItemSet& rSet,
684                 UpdateFlags eFlags, SvNumberFormatter* pNFmtr ) const
685 {
686     const SwBoxAutoFmt& rChg = GetBoxFmt( nPos );
687 
688     if( UPDATE_CHAR & eFlags )
689     {
690         if( IsFont() )
691         {
692             rSet.Put( rChg.GetFont() );
693             rSet.Put( rChg.GetHeight() );
694             rSet.Put( rChg.GetWeight() );
695             rSet.Put( rChg.GetPosture() );
696             // #103065# do not insert empty CJK font
697             const SvxFontItem& rCJKFont = rChg.GetCJKFont();
698             if( rCJKFont.GetStyleName().Len() )
699             {
700                 rSet.Put( rChg.GetCJKFont() );
701                 rSet.Put( rChg.GetCJKHeight() );
702                 rSet.Put( rChg.GetCJKWeight() );
703                 rSet.Put( rChg.GetCJKPosture() );
704             }
705             else
706             {
707                 rSet.Put( rChg.GetHeight(), RES_CHRATR_CJK_FONTSIZE );
708                 rSet.Put( rChg.GetWeight(), RES_CHRATR_CJK_WEIGHT );
709                 rSet.Put( rChg.GetPosture(), RES_CHRATR_CJK_POSTURE );
710             }
711             // #103065# do not insert empty CTL font
712             const SvxFontItem& rCTLFont = rChg.GetCTLFont();
713             if( rCTLFont.GetStyleName().Len() )
714             {
715                 rSet.Put( rChg.GetCTLFont() );
716                 rSet.Put( rChg.GetCTLHeight() );
717                 rSet.Put( rChg.GetCTLWeight() );
718                 rSet.Put( rChg.GetCTLPosture() );
719             }
720             else
721             {
722                 rSet.Put( rChg.GetHeight(), RES_CHRATR_CTL_FONTSIZE );
723                 rSet.Put( rChg.GetWeight(), RES_CHRATR_CTL_WEIGHT );
724                 rSet.Put( rChg.GetPosture(), RES_CHRATR_CTL_POSTURE );
725             }
726             rSet.Put( rChg.GetUnderline() );
727             rSet.Put( rChg.GetOverline() );
728             rSet.Put( rChg.GetCrossedOut() );
729             rSet.Put( rChg.GetContour() );
730             rSet.Put( rChg.GetShadowed() );
731             rSet.Put( rChg.GetColor() );
732         }
733         if( IsJustify() )
734             rSet.Put( rChg.GetAdjust() );
735     }
736 
737     if( UPDATE_BOX & eFlags )
738     {
739         if( IsFrame() )
740         {
741             rSet.Put( rChg.GetBox() );
742 // FIXME - uncomment the lines to put the diagonal line items
743 //            rSet.Put( rChg.GetTLBR() );
744 //            rSet.Put( rChg.GetBLTR() );
745         }
746         if( IsBackground() )
747             rSet.Put( rChg.GetBackground() );
748 
749         if( IsValueFormat() && pNFmtr )
750         {
751             String sFmt; LanguageType eLng, eSys;
752             rChg.GetValueFormat( sFmt, eLng, eSys );
753             if( sFmt.Len() )
754             {
755                 short nType;
756                 sal_Bool bNew;
757                 xub_StrLen nCheckPos;
758                 sal_uInt32 nKey = pNFmtr->GetIndexPuttingAndConverting( sFmt, eLng,
759                         eSys, nType, bNew, nCheckPos);
760                 rSet.Put( SwTblBoxNumFormat( nKey ));
761             }
762             else
763                 rSet.ClearItem( RES_BOXATR_FORMAT );
764         }
765     }
766 
767     // den Rest koennen wir nicht, StarCalc spezifisch
768 }
769 
770 
771 sal_Bool SwTableAutoFmt::Load( SvStream& rStream, const SwAfVersions& rVersions )
772 {
773     sal_Bool    bRet = sal_True;
774     sal_uInt16  nVal = 0;
775     rStream >> nVal;
776     bRet = 0 == rStream.GetError();
777 
778     if( bRet && (nVal == AUTOFORMAT_DATA_ID_X ||
779             (AUTOFORMAT_DATA_ID_504 <= nVal && nVal <= AUTOFORMAT_DATA_ID)) )
780     {
781         sal_Bool b;
782         // --- from 680/dr25 on: #21549# store strings as UTF-8
783         CharSet eCharSet = (nVal >= AUTOFORMAT_ID_680DR25) ? RTL_TEXTENCODING_UTF8 : rStream.GetStreamCharSet();
784         rStream.ReadByteString( aName, eCharSet );
785         if( AUTOFORMAT_DATA_ID_552 <= nVal )
786         {
787             rStream >> nStrResId;
788             sal_uInt16 nId = RID_SVXSTR_TBLAFMT_BEGIN + nStrResId;
789             if( RID_SVXSTR_TBLAFMT_BEGIN <= nId &&
790                 nId < RID_SVXSTR_TBLAFMT_END )
791             {
792                 aName = SVX_RESSTR( nId );
793             }
794             else
795                 nStrResId = USHRT_MAX;
796         }
797         rStream >> b; bInclFont = b;
798         rStream >> b; bInclJustify = b;
799         rStream >> b; bInclFrame = b;
800         rStream >> b; bInclBackground = b;
801         rStream >> b; bInclValueFormat = b;
802         rStream >> b; bInclWidthHeight = b;
803 
804         bRet = 0 == rStream.GetError();
805 
806         for( sal_uInt8 i = 0; i < 16; ++i )
807         {
808             SwBoxAutoFmt* pFmt = new SwBoxAutoFmt;
809             bRet = pFmt->Load( rStream, rVersions, nVal );
810             if( bRet )
811                 aBoxAutoFmt[ i ] = pFmt;
812             else
813             {
814                 delete pFmt;
815                 break;
816             }
817         }
818     }
819     return bRet;
820 }
821 
822 #ifdef READ_OLDVERS
823 
824 sal_Bool SwTableAutoFmt::LoadOld( SvStream& rStream, sal_uInt16 aLoadVer[] )
825 {
826     sal_Bool    bRet = sal_True;
827     sal_uInt16  nVal = 0;
828     rStream >> nVal;
829     bRet = 0 == rStream.GetError();
830 
831     if( bRet && ( AUTOFORMAT_OLD_DATA_ID == nVal ))
832     {
833         sal_Bool b;
834         rStream.ReadByteString( aName, rStream.GetStreamCharSet() );
835         rStream >> b; bInclFont = b;
836         rStream >> b; bInclJustify = b;
837         rStream >> b; bInclFrame = b;
838         rStream >> b; bInclBackground = b;
839         bRet = (rStream.GetError() == 0);
840 
841         for( int i = 0; i < 16; i++)
842         {
843             SwBoxAutoFmt* pFmt = new SwBoxAutoFmt;
844             bRet = pFmt->LoadOld( rStream, aLoadVer );
845             if( bRet )
846                 aBoxAutoFmt[ i ] = pFmt;
847             else
848             {
849                 delete pFmt;
850                 break;
851             }
852         }
853     }
854     return bRet;
855 }
856 #endif
857 
858 
859 sal_Bool SwTableAutoFmt::Save( SvStream& rStream ) const
860 {
861     sal_uInt16 nVal = AUTOFORMAT_DATA_ID;
862     sal_Bool b;
863     rStream << nVal;
864     // --- from 680/dr25 on: #21549# store strings as UTF-8
865     rStream.WriteByteString( aName, RTL_TEXTENCODING_UTF8 );
866     rStream << nStrResId;
867     rStream << ( b = bInclFont );
868     rStream << ( b = bInclJustify );
869     rStream << ( b = bInclFrame );
870     rStream << ( b = bInclBackground );
871     rStream << ( b = bInclValueFormat );
872     rStream << ( b = bInclWidthHeight );
873 
874     sal_Bool bRet = 0 == rStream.GetError();
875 
876     for( int i = 0; bRet && i < 16; ++i )
877     {
878         SwBoxAutoFmt* pFmt = aBoxAutoFmt[ i ];
879         if( !pFmt )     // nicht gesetzt -> default schreiben
880         {
881             // falls noch nicht vorhanden:
882             if( !pDfltBoxAutoFmt )
883                 pDfltBoxAutoFmt = new SwBoxAutoFmt;
884             pFmt = pDfltBoxAutoFmt;
885         }
886         bRet = pFmt->Save( rStream );
887     }
888     return bRet;
889 }
890 
891 
892 SwTableAutoFmtTbl::SwTableAutoFmtTbl()
893 {
894     String sNm;
895     SwTableAutoFmt* pNew = new SwTableAutoFmt(
896                             SwStyleNameMapper::GetUIName( RES_POOLCOLL_STANDARD, sNm ) );
897 
898     SwBoxAutoFmt aNew;
899 
900     sal_uInt8 i;
901 
902     Color aColor( COL_BLUE );
903     SvxBrushItem aBrushItem( aColor, RES_BACKGROUND );
904     aNew.SetBackground( aBrushItem );
905     aNew.SetColor( SvxColorItem(Color( COL_WHITE ), RES_CHRATR_COLOR) );
906 
907     for( i = 0; i < 4; ++i )
908         pNew->SetBoxFmt( aNew, i );
909 
910     // 70% Grau
911     aBrushItem.SetColor( RGB_COLORDATA( 0x4d, 0x4d, 0x4d ) );
912     aNew.SetBackground( aBrushItem );
913     for( i = 4; i <= 12; i += 4 )
914         pNew->SetBoxFmt( aNew, i );
915 
916     // 20% Grau
917     aBrushItem.SetColor( RGB_COLORDATA( 0xcc, 0xcc, 0xcc ) );
918     aNew.SetBackground( aBrushItem );
919     aColor.SetColor( COL_BLACK );
920     aNew.SetColor( SvxColorItem( aColor, RES_CHRATR_COLOR) );
921     for( i = 7; i <= 15; i += 4 )
922         pNew->SetBoxFmt( aNew, i );
923     for( i = 13; i <= 14; ++i )
924         pNew->SetBoxFmt( aNew, i );
925 
926     aBrushItem.SetColor( Color( COL_WHITE ) );
927     aNew.SetBackground( aBrushItem );
928     for( i = 5; i <= 6; ++i )
929         pNew->SetBoxFmt( aNew, i );
930     for( i = 9; i <= 10; ++i )
931         pNew->SetBoxFmt( aNew, i );
932 
933 
934     SvxBoxItem aBox( RES_BOX );
935     aBox.SetDistance( 55 );
936     SvxBorderLine aLn( &aColor, DEF_LINE_WIDTH_0 );
937     aBox.SetLine( &aLn, BOX_LINE_LEFT );
938     aBox.SetLine( &aLn, BOX_LINE_BOTTOM );
939 
940     for( i = 0; i <= 15; ++i )
941     {
942         aBox.SetLine( i <= 3 ? &aLn : 0, BOX_LINE_TOP );
943         aBox.SetLine( (3 == ( i & 3 )) ? &aLn : 0, BOX_LINE_RIGHT );
944         ((SwBoxAutoFmt&)pNew->GetBoxFmt( i )).SetBox( aBox );
945     }
946 
947     Insert( pNew, Count() );
948 }
949 
950 sal_Bool SwTableAutoFmtTbl::Load()
951 {
952     sal_Bool bRet = sal_False;
953     String sNm( String::CreateFromAscii(
954                 RTL_CONSTASCII_STRINGPARAM( sAutoTblFmtName )));
955     SvtPathOptions aOpt;
956     if( aOpt.SearchFile( sNm, SvtPathOptions::PATH_USERCONFIG ))
957     {
958         SfxMedium aStream( sNm, STREAM_STD_READ, sal_True );
959         bRet = Load( *aStream.GetInStream() );
960     }
961     else
962         bRet = sal_False;
963     return bRet;
964 }
965 
966 sal_Bool SwTableAutoFmtTbl::Save() const
967 {
968     SvtPathOptions aPathOpt;
969     String sNm( aPathOpt.GetUserConfigPath() );
970     sNm += INET_PATH_TOKEN;
971     sNm.AppendAscii( RTL_CONSTASCII_STRINGPARAM( sAutoTblFmtName ));
972     SfxMedium aStream(sNm, STREAM_STD_WRITE, sal_True );
973     return Save( *aStream.GetOutStream() ) && aStream.Commit();
974 }
975 
976 sal_Bool SwTableAutoFmtTbl::Load( SvStream& rStream )
977 {
978     sal_Bool bRet = 0 == rStream.GetError();
979     if (bRet)
980     {
981         // Achtung hier muss ein allgemeiner Header gelesen werden
982         sal_uInt16 nVal = 0;
983         rStream >> nVal;
984         bRet = 0 == rStream.GetError();
985 
986         if( bRet )
987         {
988             SwAfVersions aVersions;
989 
990             if( nVal == AUTOFORMAT_ID_358 ||
991                     (AUTOFORMAT_ID_504 <= nVal && nVal <= AUTOFORMAT_ID) )
992             {
993                 sal_uInt16 nFileVers = SOFFICE_FILEFORMAT_40;
994                 sal_uInt8 nChrSet, nCnt;
995                 long nPos = rStream.Tell();
996                 rStream >> nCnt >> nChrSet;
997 //              if( 4 <= nCnt )
998 //                  rStream >> nFileVers;
999                 if( rStream.Tell() != sal_uLong(nPos + nCnt) )
1000                 {
1001                     ASSERT( !this, "Der Header enthaelt mehr/neuere Daten" );
1002                     rStream.Seek( nPos + nCnt );
1003                 }
1004                 rStream.SetStreamCharSet( (CharSet)nChrSet );
1005                 rStream.SetVersion( nFileVers );
1006             }
1007 
1008             if( nVal == AUTOFORMAT_ID_358 || nVal == AUTOFORMAT_ID_X ||
1009                     (AUTOFORMAT_ID_504 <= nVal && nVal <= AUTOFORMAT_ID) )
1010             {
1011                 aVersions.Load( rStream, nVal );        // Item-Versionen
1012 
1013                 SwTableAutoFmt* pNew;
1014                 sal_uInt16 nAnz = 0;
1015                 rStream >> nAnz;
1016 
1017                 bRet = 0 == rStream.GetError();
1018 
1019                 for( sal_uInt16 i = 0; i < nAnz; ++i )
1020                 {
1021                     pNew = new SwTableAutoFmt( aEmptyStr );
1022                     bRet = pNew->Load( rStream, aVersions );
1023                     if( bRet )
1024                     {
1025                         Insert( pNew, Count() );
1026                     }
1027                     else
1028                     {
1029                         delete pNew;
1030                         break;
1031                     }
1032                 }
1033             }
1034 #ifdef READ_OLDVERS
1035             else if( AUTOFORMAT_OLD_ID == nVal || AUTOFORMAT_OLD_ID1 == nVal )
1036             {
1037                 SwTableAutoFmt* pNew;
1038                 sal_uInt16 nAnz = 0;
1039                 rStream >> nAnz;
1040 
1041                 sal_uInt16 aArr[ 12 ];
1042                 memset( aArr, 0, 12 * sizeof( sal_uInt16 ) );
1043                 if( AUTOFORMAT_OLD_ID1 == nVal )
1044                     for( sal_uInt16 n = 0; n < 12; ++n )
1045                         rStream >> aArr[ n ];
1046 
1047                 bRet = 0 == rStream.GetError();
1048 
1049                 for( sal_uInt16 i = 0; i < nAnz; ++i )
1050                 {
1051                     pNew = new SwTableAutoFmt( aEmptyStr );
1052                     bRet = pNew->LoadOld( rStream, aArr );
1053                     if( bRet )
1054                     {
1055                         Insert( pNew, Count() );
1056                     }
1057                     else
1058                     {
1059                         delete pNew;
1060                         break;
1061                     }
1062                 }
1063             }
1064 #endif
1065         }
1066     }
1067     return bRet;
1068 }
1069 
1070 
1071 sal_Bool SwTableAutoFmtTbl::Save( SvStream& rStream ) const
1072 {
1073     sal_Bool bRet = 0 == rStream.GetError();
1074     if (bRet)
1075     {
1076         rStream.SetVersion( SOFFICE_FILEFORMAT_40 );
1077 
1078         // Achtung hier muss ein allgemeiner Header gespeichert werden
1079         sal_uInt16 nVal = AUTOFORMAT_ID;
1080         rStream << nVal
1081                 << (sal_uInt8)2         // Anzahl von Zeichen des Headers incl. diesem
1082                 << (sal_uInt8)GetStoreCharSet( ::gsl_getSystemTextEncoding() );
1083 //              << (sal_uInt8)4         // Anzahl von Zeichen des Headers incl. diesem
1084 //              << (sal_uInt8)::GetSystemCharSet()
1085 //              << (UNIT16)SOFFICE_FILEFORMAT_NOW;
1086         bRet = 0 == rStream.GetError();
1087 
1088         //-----------------------------------------------------------
1089         // die VersionsNummer fuer alle Attribute schreiben
1090         (*this)[ 0 ]->GetBoxFmt( 0 ).SaveVerionNo( rStream );
1091 
1092         rStream << (sal_uInt16)(Count() - 1);
1093         bRet = 0 == rStream.GetError();
1094 
1095         for( sal_uInt16 i = 1; bRet && i < Count(); ++i )
1096         {
1097             SwTableAutoFmt* pFmt = (*this)[ i ];
1098             bRet = pFmt->Save( rStream );
1099         }
1100     }
1101     rStream.Flush();
1102     return bRet;
1103 }
1104 
1105 
1106 
1107