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