xref: /trunk/main/sw/source/core/doc/tblafmt.cxx (revision 19a30862)
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 
SaveVersionNo(SvStream & rStream) const493 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 
SwTableAutoFmt(const String & rName)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 
SwTableAutoFmt(const SwTableAutoFmt & rNew)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 
operator =(const SwTableAutoFmt & rNew)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 
~SwTableAutoFmt()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 
SetBoxFmt(const SwBoxAutoFmt & rNew,sal_uInt8 nPos)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 
GetBoxFmt(sal_uInt8 nPos) const594 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 
UpdateFromSet(sal_uInt8 nPos,const SfxItemSet & rSet,UpdateFlags eFlags,SvNumberFormatter * pNFmtr)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 
UpdateToSet(sal_uInt8 nPos,SfxItemSet & rSet,UpdateFlags eFlags,SvNumberFormatter * pNFmtr) const677 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 
Load(SvStream & rStream,const SwAfVersions & rVersions)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 
LoadOld(SvStream & rStream,sal_uInt16 aLoadVer[])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 
Save(SvStream & rStream) const853 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 
SwTableAutoFmtTbl()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 
Load()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 
Save() const960 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 
Load(SvStream & rStream)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 
Save(SvStream & rStream) const1065 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