xref: /AOO41X/main/sw/source/core/doc/tblafmt.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d)
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 
SwAfVersions()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 
Load(SvStream & rStream,sal_uInt16 nVer)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 
SwBoxAutoFmt()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 
SwBoxAutoFmt(const SwBoxAutoFmt & rNew)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 
~SwBoxAutoFmt()276 SwBoxAutoFmt::~SwBoxAutoFmt()
277 {
278 }
279 
operator =(const SwBoxAutoFmt & rNew)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 
Load(SvStream & rStream,const SwAfVersions & rVersions,sal_uInt16 nVer)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 
LoadOld(SvStream & rStream,sal_uInt16 aLoadVer[])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 
Save(SvStream & rStream) const447 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 
SaveVerionNo(SvStream & rStream) const493 sal_Bool SwBoxAutoFmt::SaveVerionNo( 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 
526 
SwTableAutoFmt(const String & rName)527 SwTableAutoFmt::SwTableAutoFmt( const String& rName )
528     : aName( rName ), nStrResId( USHRT_MAX )
529 {
530     bInclFont = sal_True;
531     bInclJustify = sal_True;
532     bInclFrame = sal_True;
533     bInclBackground = sal_True;
534     bInclValueFormat = sal_True;
535     bInclWidthHeight = sal_True;
536 
537     memset( aBoxAutoFmt, 0, sizeof( aBoxAutoFmt ) );
538 }
539 
540 
SwTableAutoFmt(const SwTableAutoFmt & rNew)541 SwTableAutoFmt::SwTableAutoFmt( const SwTableAutoFmt& rNew )
542 {
543     for( sal_uInt8 n = 0; n < 16; ++n )
544         aBoxAutoFmt[ n ] = 0;
545     *this = rNew;
546 }
547 
operator =(const SwTableAutoFmt & rNew)548 SwTableAutoFmt& SwTableAutoFmt::operator=( const SwTableAutoFmt& rNew )
549 {
550     for( sal_uInt8 n = 0; n < 16; ++n )
551     {
552         if( aBoxAutoFmt[ n ] )
553             delete aBoxAutoFmt[ n ];
554 
555         SwBoxAutoFmt* pFmt = rNew.aBoxAutoFmt[ n ];
556         if( pFmt )      // ist gesetzt -> kopieren
557             aBoxAutoFmt[ n ] = new SwBoxAutoFmt( *pFmt );
558         else            // sonst default
559             aBoxAutoFmt[ n ] = 0;
560     }
561 
562     aName = rNew.aName;
563     nStrResId = rNew.nStrResId;
564     bInclFont = rNew.bInclFont;
565     bInclJustify = rNew.bInclJustify;
566     bInclFrame = rNew.bInclFrame;
567     bInclBackground = rNew.bInclBackground;
568     bInclValueFormat = rNew.bInclValueFormat;
569     bInclWidthHeight = rNew.bInclWidthHeight;
570 
571     return *this;
572 }
573 
574 
~SwTableAutoFmt()575 SwTableAutoFmt::~SwTableAutoFmt()
576 {
577     SwBoxAutoFmt** ppFmt = aBoxAutoFmt;
578     for( sal_uInt8 n = 0; n < 16; ++n, ++ppFmt )
579         if( *ppFmt )
580             delete *ppFmt;
581 }
582 
583 
SetBoxFmt(const SwBoxAutoFmt & rNew,sal_uInt8 nPos)584 void SwTableAutoFmt::SetBoxFmt( const SwBoxAutoFmt& rNew, sal_uInt8 nPos )
585 {
586     ASSERT( nPos < 16, "falscher Bereich" );
587 
588     SwBoxAutoFmt* pFmt = aBoxAutoFmt[ nPos ];
589     if( pFmt )      // ist gesetzt -> kopieren
590         *aBoxAutoFmt[ nPos ] = rNew;
591     else            // sonst neu setzen
592         aBoxAutoFmt[ nPos ] = new SwBoxAutoFmt( rNew );
593 }
594 
595 
GetBoxFmt(sal_uInt8 nPos) const596 const SwBoxAutoFmt& SwTableAutoFmt::GetBoxFmt( sal_uInt8 nPos ) const
597 {
598     ASSERT( nPos < 16, "falscher Bereich" );
599 
600     SwBoxAutoFmt* pFmt = aBoxAutoFmt[ nPos ];
601     if( pFmt )      // ist gesetzt -> kopieren
602         return *pFmt;
603     else            // sonst den default returnen
604     {
605         // falls noch nicht vorhanden:
606         if( !pDfltBoxAutoFmt )
607             pDfltBoxAutoFmt = new SwBoxAutoFmt;
608         return *pDfltBoxAutoFmt;
609     }
610 }
611 
612 
613 
UpdateFromSet(sal_uInt8 nPos,const SfxItemSet & rSet,UpdateFlags eFlags,SvNumberFormatter * pNFmtr)614 SwBoxAutoFmt& SwTableAutoFmt::UpdateFromSet( sal_uInt8 nPos,
615                                             const SfxItemSet& rSet,
616                                             UpdateFlags eFlags,
617                                             SvNumberFormatter* pNFmtr )
618 {
619     ASSERT( nPos < 16, "falscher Bereich" );
620 
621     SwBoxAutoFmt* pFmt = aBoxAutoFmt[ nPos ];
622     if( !pFmt )     // ist gesetzt -> kopieren
623     {
624         pFmt = new SwBoxAutoFmt;
625         aBoxAutoFmt[ nPos ] = pFmt;
626     }
627 
628     if( UPDATE_CHAR & eFlags )
629     {
630         pFmt->SetFont( (SvxFontItem&)rSet.Get( RES_CHRATR_FONT ) );
631         pFmt->SetHeight( (SvxFontHeightItem&)rSet.Get( RES_CHRATR_FONTSIZE ) );
632         pFmt->SetWeight( (SvxWeightItem&)rSet.Get( RES_CHRATR_WEIGHT ) );
633         pFmt->SetPosture( (SvxPostureItem&)rSet.Get( RES_CHRATR_POSTURE ) );
634         pFmt->SetCJKFont( (SvxFontItem&)rSet.Get( RES_CHRATR_CJK_FONT ) );
635         pFmt->SetCJKHeight( (SvxFontHeightItem&)rSet.Get( RES_CHRATR_CJK_FONTSIZE ) );
636         pFmt->SetCJKWeight( (SvxWeightItem&)rSet.Get( RES_CHRATR_CJK_WEIGHT ) );
637         pFmt->SetCJKPosture( (SvxPostureItem&)rSet.Get( RES_CHRATR_CJK_POSTURE ) );
638         pFmt->SetCTLFont( (SvxFontItem&)rSet.Get( RES_CHRATR_CTL_FONT ) );
639         pFmt->SetCTLHeight( (SvxFontHeightItem&)rSet.Get( RES_CHRATR_CTL_FONTSIZE ) );
640         pFmt->SetCTLWeight( (SvxWeightItem&)rSet.Get( RES_CHRATR_CTL_WEIGHT ) );
641         pFmt->SetCTLPosture( (SvxPostureItem&)rSet.Get( RES_CHRATR_CTL_POSTURE ) );
642         pFmt->SetUnderline( (SvxUnderlineItem&)rSet.Get( RES_CHRATR_UNDERLINE ) );
643         pFmt->SetOverline( (SvxOverlineItem&)rSet.Get( RES_CHRATR_OVERLINE ) );
644         pFmt->SetCrossedOut( (SvxCrossedOutItem&)rSet.Get( RES_CHRATR_CROSSEDOUT ) );
645         pFmt->SetContour( (SvxContourItem&)rSet.Get( RES_CHRATR_CONTOUR ) );
646         pFmt->SetShadowed( (SvxShadowedItem&)rSet.Get( RES_CHRATR_SHADOWED ) );
647         pFmt->SetColor( (SvxColorItem&)rSet.Get( RES_CHRATR_COLOR ) );
648         pFmt->SetAdjust( (SvxAdjustItem&)rSet.Get( RES_PARATR_ADJUST ) );
649     }
650     if( UPDATE_BOX & eFlags )
651     {
652         pFmt->SetBox( (SvxBoxItem&)rSet.Get( RES_BOX ) );
653 // FIXME - add attribute IDs for the diagonal line items
654 //        pFmt->SetTLBR( (SvxLineItem&)rSet.Get( RES_... ) );
655 //        pFmt->SetBLTR( (SvxLineItem&)rSet.Get( RES_... ) );
656         pFmt->SetBackground( (SvxBrushItem&)rSet.Get( RES_BACKGROUND ) );
657 
658         const SwTblBoxNumFormat* pNumFmtItem;
659         const SvNumberformat* pNumFormat = 0;
660         if( SFX_ITEM_SET == rSet.GetItemState( RES_BOXATR_FORMAT, sal_True,
661             (const SfxPoolItem**)&pNumFmtItem ) && pNFmtr &&
662             0 != (pNumFormat = pNFmtr->GetEntry( pNumFmtItem->GetValue() )) )
663             pFmt->SetValueFormat( ((SvNumberformat*)pNumFormat)->GetFormatstring(),
664                                     pNumFormat->GetLanguage(),
665                                     static_cast<LanguageType>(::GetAppLanguage()));
666         else
667         {
668             // defaulten
669             pFmt->SetValueFormat( aEmptyStr, LANGUAGE_SYSTEM,
670                                   static_cast<LanguageType>(::GetAppLanguage() ));
671         }
672     }
673     // den Rest koennen wir nicht, StarCalc spezifisch
674 
675     return *pFmt;
676 }
677 
678 
UpdateToSet(sal_uInt8 nPos,SfxItemSet & rSet,UpdateFlags eFlags,SvNumberFormatter * pNFmtr) const679 void SwTableAutoFmt::UpdateToSet( sal_uInt8 nPos, SfxItemSet& rSet,
680                 UpdateFlags eFlags, SvNumberFormatter* pNFmtr ) const
681 {
682     const SwBoxAutoFmt& rChg = GetBoxFmt( nPos );
683 
684     if( UPDATE_CHAR & eFlags )
685     {
686         if( IsFont() )
687         {
688             rSet.Put( rChg.GetFont() );
689             rSet.Put( rChg.GetHeight() );
690             rSet.Put( rChg.GetWeight() );
691             rSet.Put( rChg.GetPosture() );
692             // #103065# do not insert empty CJK font
693             const SvxFontItem& rCJKFont = rChg.GetCJKFont();
694             if( rCJKFont.GetStyleName().Len() )
695             {
696                 rSet.Put( rChg.GetCJKFont() );
697                 rSet.Put( rChg.GetCJKHeight() );
698                 rSet.Put( rChg.GetCJKWeight() );
699                 rSet.Put( rChg.GetCJKPosture() );
700             }
701             else
702             {
703                 rSet.Put( rChg.GetHeight(), RES_CHRATR_CJK_FONTSIZE );
704                 rSet.Put( rChg.GetWeight(), RES_CHRATR_CJK_WEIGHT );
705                 rSet.Put( rChg.GetPosture(), RES_CHRATR_CJK_POSTURE );
706             }
707             // #103065# do not insert empty CTL font
708             const SvxFontItem& rCTLFont = rChg.GetCTLFont();
709             if( rCTLFont.GetStyleName().Len() )
710             {
711                 rSet.Put( rChg.GetCTLFont() );
712                 rSet.Put( rChg.GetCTLHeight() );
713                 rSet.Put( rChg.GetCTLWeight() );
714                 rSet.Put( rChg.GetCTLPosture() );
715             }
716             else
717             {
718                 rSet.Put( rChg.GetHeight(), RES_CHRATR_CTL_FONTSIZE );
719                 rSet.Put( rChg.GetWeight(), RES_CHRATR_CTL_WEIGHT );
720                 rSet.Put( rChg.GetPosture(), RES_CHRATR_CTL_POSTURE );
721             }
722             rSet.Put( rChg.GetUnderline() );
723             rSet.Put( rChg.GetOverline() );
724             rSet.Put( rChg.GetCrossedOut() );
725             rSet.Put( rChg.GetContour() );
726             rSet.Put( rChg.GetShadowed() );
727             rSet.Put( rChg.GetColor() );
728         }
729         if( IsJustify() )
730             rSet.Put( rChg.GetAdjust() );
731     }
732 
733     if( UPDATE_BOX & eFlags )
734     {
735         if( IsFrame() )
736         {
737             rSet.Put( rChg.GetBox() );
738 // FIXME - uncomment the lines to put the diagonal line items
739 //            rSet.Put( rChg.GetTLBR() );
740 //            rSet.Put( rChg.GetBLTR() );
741         }
742         if( IsBackground() )
743             rSet.Put( rChg.GetBackground() );
744 
745         if( IsValueFormat() && pNFmtr )
746         {
747             String sFmt; LanguageType eLng, eSys;
748             rChg.GetValueFormat( sFmt, eLng, eSys );
749             if( sFmt.Len() )
750             {
751                 short nType;
752                 sal_Bool bNew;
753                 xub_StrLen nCheckPos;
754                 sal_uInt32 nKey = pNFmtr->GetIndexPuttingAndConverting( sFmt, eLng,
755                         eSys, nType, bNew, nCheckPos);
756                 rSet.Put( SwTblBoxNumFormat( nKey ));
757             }
758             else
759                 rSet.ClearItem( RES_BOXATR_FORMAT );
760         }
761     }
762 
763     // den Rest koennen wir nicht, StarCalc spezifisch
764 }
765 
766 
Load(SvStream & rStream,const SwAfVersions & rVersions)767 sal_Bool SwTableAutoFmt::Load( SvStream& rStream, const SwAfVersions& rVersions )
768 {
769     sal_Bool    bRet = sal_True;
770     sal_uInt16  nVal = 0;
771     rStream >> nVal;
772     bRet = 0 == rStream.GetError();
773 
774     if( bRet && (nVal == AUTOFORMAT_DATA_ID_X ||
775             (AUTOFORMAT_DATA_ID_504 <= nVal && nVal <= AUTOFORMAT_DATA_ID)) )
776     {
777         sal_Bool b;
778         // --- from 680/dr25 on: #21549# store strings as UTF-8
779         CharSet eCharSet = (nVal >= AUTOFORMAT_ID_680DR25) ? RTL_TEXTENCODING_UTF8 : rStream.GetStreamCharSet();
780         rStream.ReadByteString( aName, eCharSet );
781         if( AUTOFORMAT_DATA_ID_552 <= nVal )
782         {
783             rStream >> nStrResId;
784             sal_uInt16 nId = RID_SVXSTR_TBLAFMT_BEGIN + nStrResId;
785             if( RID_SVXSTR_TBLAFMT_BEGIN <= nId &&
786                 nId < RID_SVXSTR_TBLAFMT_END )
787             {
788                 aName = SVX_RESSTR( nId );
789             }
790             else
791                 nStrResId = USHRT_MAX;
792         }
793         rStream >> b; bInclFont = b;
794         rStream >> b; bInclJustify = b;
795         rStream >> b; bInclFrame = b;
796         rStream >> b; bInclBackground = b;
797         rStream >> b; bInclValueFormat = b;
798         rStream >> b; bInclWidthHeight = b;
799 
800         bRet = 0 == rStream.GetError();
801 
802         for( sal_uInt8 i = 0; i < 16; ++i )
803         {
804             SwBoxAutoFmt* pFmt = new SwBoxAutoFmt;
805             bRet = pFmt->Load( rStream, rVersions, nVal );
806             if( bRet )
807                 aBoxAutoFmt[ i ] = pFmt;
808             else
809             {
810                 delete pFmt;
811                 break;
812             }
813         }
814     }
815     return bRet;
816 }
817 
818 #ifdef READ_OLDVERS
819 
LoadOld(SvStream & rStream,sal_uInt16 aLoadVer[])820 sal_Bool SwTableAutoFmt::LoadOld( SvStream& rStream, sal_uInt16 aLoadVer[] )
821 {
822     sal_Bool    bRet = sal_True;
823     sal_uInt16  nVal = 0;
824     rStream >> nVal;
825     bRet = 0 == rStream.GetError();
826 
827     if( bRet && ( AUTOFORMAT_OLD_DATA_ID == nVal ))
828     {
829         sal_Bool b;
830         rStream.ReadByteString( aName, rStream.GetStreamCharSet() );
831         rStream >> b; bInclFont = b;
832         rStream >> b; bInclJustify = b;
833         rStream >> b; bInclFrame = b;
834         rStream >> b; bInclBackground = b;
835         bRet = (rStream.GetError() == 0);
836 
837         for( int i = 0; i < 16; i++)
838         {
839             SwBoxAutoFmt* pFmt = new SwBoxAutoFmt;
840             bRet = pFmt->LoadOld( rStream, aLoadVer );
841             if( bRet )
842                 aBoxAutoFmt[ i ] = pFmt;
843             else
844             {
845                 delete pFmt;
846                 break;
847             }
848         }
849     }
850     return bRet;
851 }
852 #endif
853 
854 
Save(SvStream & rStream) const855 sal_Bool SwTableAutoFmt::Save( SvStream& rStream ) const
856 {
857     sal_uInt16 nVal = AUTOFORMAT_DATA_ID;
858     sal_Bool b;
859     rStream << nVal;
860     // --- from 680/dr25 on: #21549# store strings as UTF-8
861     rStream.WriteByteString( aName, RTL_TEXTENCODING_UTF8 );
862     rStream << nStrResId;
863     rStream << ( b = bInclFont );
864     rStream << ( b = bInclJustify );
865     rStream << ( b = bInclFrame );
866     rStream << ( b = bInclBackground );
867     rStream << ( b = bInclValueFormat );
868     rStream << ( b = bInclWidthHeight );
869 
870     sal_Bool bRet = 0 == rStream.GetError();
871 
872     for( int i = 0; bRet && i < 16; ++i )
873     {
874         SwBoxAutoFmt* pFmt = aBoxAutoFmt[ i ];
875         if( !pFmt )     // nicht gesetzt -> default schreiben
876         {
877             // falls noch nicht vorhanden:
878             if( !pDfltBoxAutoFmt )
879                 pDfltBoxAutoFmt = new SwBoxAutoFmt;
880             pFmt = pDfltBoxAutoFmt;
881         }
882         bRet = pFmt->Save( rStream );
883     }
884     return bRet;
885 }
886 
887 
SwTableAutoFmtTbl()888 SwTableAutoFmtTbl::SwTableAutoFmtTbl()
889 {
890     String sNm;
891     SwTableAutoFmt* pNew = new SwTableAutoFmt(
892                             SwStyleNameMapper::GetUIName( RES_POOLCOLL_STANDARD, sNm ) );
893 
894     SwBoxAutoFmt aNew;
895 
896     sal_uInt8 i;
897 
898     Color aColor( COL_BLUE );
899     SvxBrushItem aBrushItem( aColor, RES_BACKGROUND );
900     aNew.SetBackground( aBrushItem );
901     aNew.SetColor( SvxColorItem(Color( COL_WHITE ), RES_CHRATR_COLOR) );
902 
903     for( i = 0; i < 4; ++i )
904         pNew->SetBoxFmt( aNew, i );
905 
906     // 70% Grau
907     aBrushItem.SetColor( RGB_COLORDATA( 0x4d, 0x4d, 0x4d ) );
908     aNew.SetBackground( aBrushItem );
909     for( i = 4; i <= 12; i += 4 )
910         pNew->SetBoxFmt( aNew, i );
911 
912     // 20% Grau
913     aBrushItem.SetColor( RGB_COLORDATA( 0xcc, 0xcc, 0xcc ) );
914     aNew.SetBackground( aBrushItem );
915     aColor.SetColor( COL_BLACK );
916     aNew.SetColor( SvxColorItem( aColor, RES_CHRATR_COLOR) );
917     for( i = 7; i <= 15; i += 4 )
918         pNew->SetBoxFmt( aNew, i );
919     for( i = 13; i <= 14; ++i )
920         pNew->SetBoxFmt( aNew, i );
921 
922     aBrushItem.SetColor( Color( COL_WHITE ) );
923     aNew.SetBackground( aBrushItem );
924     for( i = 5; i <= 6; ++i )
925         pNew->SetBoxFmt( aNew, i );
926     for( i = 9; i <= 10; ++i )
927         pNew->SetBoxFmt( aNew, i );
928 
929 
930     SvxBoxItem aBox( RES_BOX );
931     aBox.SetDistance( 55 );
932     SvxBorderLine aLn( &aColor, DEF_LINE_WIDTH_0 );
933     aBox.SetLine( &aLn, BOX_LINE_LEFT );
934     aBox.SetLine( &aLn, BOX_LINE_BOTTOM );
935 
936     for( i = 0; i <= 15; ++i )
937     {
938         aBox.SetLine( i <= 3 ? &aLn : 0, BOX_LINE_TOP );
939         aBox.SetLine( (3 == ( i & 3 )) ? &aLn : 0, BOX_LINE_RIGHT );
940         ((SwBoxAutoFmt&)pNew->GetBoxFmt( i )).SetBox( aBox );
941     }
942 
943     Insert( pNew, Count() );
944 }
945 
Load()946 sal_Bool SwTableAutoFmtTbl::Load()
947 {
948     sal_Bool bRet = sal_False;
949     String sNm( String::CreateFromAscii(
950                 RTL_CONSTASCII_STRINGPARAM( sAutoTblFmtName )));
951     SvtPathOptions aOpt;
952     if( aOpt.SearchFile( sNm, SvtPathOptions::PATH_USERCONFIG ))
953     {
954         SfxMedium aStream( sNm, STREAM_STD_READ, sal_True );
955         bRet = Load( *aStream.GetInStream() );
956     }
957     else
958         bRet = sal_False;
959     return bRet;
960 }
961 
Save() const962 sal_Bool SwTableAutoFmtTbl::Save() const
963 {
964     SvtPathOptions aPathOpt;
965     String sNm( aPathOpt.GetUserConfigPath() );
966     sNm += INET_PATH_TOKEN;
967     sNm.AppendAscii( RTL_CONSTASCII_STRINGPARAM( sAutoTblFmtName ));
968     SfxMedium aStream(sNm, STREAM_STD_WRITE, sal_True );
969     return Save( *aStream.GetOutStream() ) && aStream.Commit();
970 }
971 
Load(SvStream & rStream)972 sal_Bool SwTableAutoFmtTbl::Load( SvStream& rStream )
973 {
974     sal_Bool bRet = 0 == rStream.GetError();
975     if (bRet)
976     {
977         // Achtung hier muss ein allgemeiner Header gelesen werden
978         sal_uInt16 nVal = 0;
979         rStream >> nVal;
980         bRet = 0 == rStream.GetError();
981 
982         if( bRet )
983         {
984             SwAfVersions aVersions;
985 
986             if( nVal == AUTOFORMAT_ID_358 ||
987                     (AUTOFORMAT_ID_504 <= nVal && nVal <= AUTOFORMAT_ID) )
988             {
989                 sal_uInt16 nFileVers = SOFFICE_FILEFORMAT_40;
990                 sal_uInt8 nChrSet, nCnt;
991                 long nPos = rStream.Tell();
992                 rStream >> nCnt >> nChrSet;
993 //              if( 4 <= nCnt )
994 //                  rStream >> nFileVers;
995                 if( rStream.Tell() != sal_uLong(nPos + nCnt) )
996                 {
997                     ASSERT( !this, "Der Header enthaelt mehr/neuere Daten" );
998                     rStream.Seek( nPos + nCnt );
999                 }
1000                 rStream.SetStreamCharSet( (CharSet)nChrSet );
1001                 rStream.SetVersion( nFileVers );
1002             }
1003 
1004             if( nVal == AUTOFORMAT_ID_358 || nVal == AUTOFORMAT_ID_X ||
1005                     (AUTOFORMAT_ID_504 <= nVal && nVal <= AUTOFORMAT_ID) )
1006             {
1007                 aVersions.Load( rStream, nVal );        // Item-Versionen
1008 
1009                 SwTableAutoFmt* pNew;
1010                 sal_uInt16 nAnz = 0;
1011                 rStream >> nAnz;
1012 
1013                 bRet = 0 == rStream.GetError();
1014 
1015                 for( sal_uInt16 i = 0; i < nAnz; ++i )
1016                 {
1017                     pNew = new SwTableAutoFmt( aEmptyStr );
1018                     bRet = pNew->Load( rStream, aVersions );
1019                     if( bRet )
1020                     {
1021                         Insert( pNew, Count() );
1022                     }
1023                     else
1024                     {
1025                         delete pNew;
1026                         break;
1027                     }
1028                 }
1029             }
1030 #ifdef READ_OLDVERS
1031             else if( AUTOFORMAT_OLD_ID == nVal || AUTOFORMAT_OLD_ID1 == nVal )
1032             {
1033                 SwTableAutoFmt* pNew;
1034                 sal_uInt16 nAnz = 0;
1035                 rStream >> nAnz;
1036 
1037                 sal_uInt16 aArr[ 12 ];
1038                 memset( aArr, 0, 12 * sizeof( sal_uInt16 ) );
1039                 if( AUTOFORMAT_OLD_ID1 == nVal )
1040                     for( sal_uInt16 n = 0; n < 12; ++n )
1041                         rStream >> aArr[ n ];
1042 
1043                 bRet = 0 == rStream.GetError();
1044 
1045                 for( sal_uInt16 i = 0; i < nAnz; ++i )
1046                 {
1047                     pNew = new SwTableAutoFmt( aEmptyStr );
1048                     bRet = pNew->LoadOld( rStream, aArr );
1049                     if( bRet )
1050                     {
1051                         Insert( pNew, Count() );
1052                     }
1053                     else
1054                     {
1055                         delete pNew;
1056                         break;
1057                     }
1058                 }
1059             }
1060 #endif
1061         }
1062     }
1063     return bRet;
1064 }
1065 
1066 
Save(SvStream & rStream) const1067 sal_Bool SwTableAutoFmtTbl::Save( SvStream& rStream ) const
1068 {
1069     sal_Bool bRet = 0 == rStream.GetError();
1070     if (bRet)
1071     {
1072         rStream.SetVersion( SOFFICE_FILEFORMAT_40 );
1073 
1074         // Achtung hier muss ein allgemeiner Header gespeichert werden
1075         sal_uInt16 nVal = AUTOFORMAT_ID;
1076         rStream << nVal
1077                 << (sal_uInt8)2         // Anzahl von Zeichen des Headers incl. diesem
1078                 << (sal_uInt8)GetStoreCharSet( ::gsl_getSystemTextEncoding() );
1079 //              << (sal_uInt8)4         // Anzahl von Zeichen des Headers incl. diesem
1080 //              << (sal_uInt8)::GetSystemCharSet()
1081 //              << (UNIT16)SOFFICE_FILEFORMAT_NOW;
1082         bRet = 0 == rStream.GetError();
1083 
1084         //-----------------------------------------------------------
1085         // die VersionsNummer fuer alle Attribute schreiben
1086         (*this)[ 0 ]->GetBoxFmt( 0 ).SaveVerionNo( rStream );
1087 
1088         rStream << (sal_uInt16)(Count() - 1);
1089         bRet = 0 == rStream.GetError();
1090 
1091         for( sal_uInt16 i = 1; bRet && i < Count(); ++i )
1092         {
1093             SwTableAutoFmt* pFmt = (*this)[ i ];
1094             bRet = pFmt->Save( rStream );
1095         }
1096     }
1097     rStream.Flush();
1098     return bRet;
1099 }
1100 
1101 
1102 
1103