Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "hintids.hxx"
21 : #include <comphelper/string.hxx>
22 : #include <vcl/svapp.hxx>
23 : #include <vcl/wrkwin.hxx>
24 : #include <svl/whiter.hxx>
25 : #include <editeng/boxitem.hxx>
26 : #include <editeng/ulspitem.hxx>
27 : #include <editeng/udlnitem.hxx>
28 : #include <editeng/crsditem.hxx>
29 : #include <editeng/blnkitem.hxx>
30 : #include <editeng/cmapitem.hxx>
31 : #include <editeng/colritem.hxx>
32 : #include <editeng/fontitem.hxx>
33 : #include <editeng/fhgtitem.hxx>
34 : #include <editeng/postitem.hxx>
35 : #include <editeng/kernitem.hxx>
36 : #include <editeng/wghtitem.hxx>
37 : #include <editeng/lspcitem.hxx>
38 : #include <editeng/adjitem.hxx>
39 : #include <editeng/lrspitem.hxx>
40 : #include <editeng/brshitem.hxx>
41 : #include <editeng/brkitem.hxx>
42 : #include <editeng/keepitem.hxx>
43 : #include <editeng/widwitem.hxx>
44 : #include <editeng/spltitem.hxx>
45 : #include <editeng/orphitem.hxx>
46 : #include <editeng/charhiddenitem.hxx>
47 : #include <svx/xoutbmp.hxx>
48 : #include <svx/svdobj.hxx>
49 : #include <editeng/langitem.hxx>
50 : #include <editeng/frmdiritem.hxx>
51 : #include <svtools/htmlout.hxx>
52 : #include <svtools/htmlkywd.hxx>
53 : #include <svx/htmlmode.hxx>
54 : #include <svl/urihelper.hxx>
55 : #include <tools/urlobj.hxx>
56 : #include <tools/bigint.hxx>
57 : #include <unotools/charclass.hxx>
58 : #include <i18npool/languagetag.hxx>
59 : #include <charfmt.hxx>
60 : #include <fmtcol.hxx>
61 : #include <fmtfsize.hxx>
62 : #include <fmtornt.hxx>
63 : #include <fmtpdsc.hxx>
64 : #include <fmtlsplt.hxx>
65 : #include <pagedesc.hxx>
66 : #include <fmtanchr.hxx>
67 : #include <docary.hxx>
68 : #include <pam.hxx>
69 : #include <viewsh.hxx>
70 : #include <viewopt.hxx>
71 : #include <swtable.hxx>
72 : // OTES
73 : #include <ftninfo.hxx>
74 : #include <ftnidx.hxx>
75 : #include <txtftn.hxx>
76 : #include <fmtftn.hxx>
77 : // FOOTNOTES
78 : #include "doc.hxx"
79 : #include "swerror.h"
80 : #include "charatr.hxx"
81 : #include "paratr.hxx"
82 : #include "frmatr.hxx"
83 : #include "poolfmt.hxx"
84 : #include "fltini.hxx"
85 : #include "css1kywd.hxx"
86 : #include "wrthtml.hxx"
87 : #include "htmlnum.hxx"
88 :
89 : #include <IDocumentStylePoolAccess.hxx>
90 : #include <numrule.hxx>
91 :
92 : #include <rtl/strbuf.hxx>
93 :
94 : using namespace ::com::sun::star;
95 : using ::editeng::SvxBorderLine;
96 :
97 : /*
98 : * um nicht immer wieder nach einem Update festzustellen, das irgendwelche
99 : * Hint-Ids dazugekommen sind, wird hier definiert, die Groesse der Tabelle
100 : * definiert und mit der akt. verglichen. Bei unterschieden wird der
101 : * Compiler schon meckern.
102 : *
103 : * diese Section und die dazugeherigen Tabellen muessen in folgenden Files
104 : * gepflegt werden: rtf\rtfatr.cxx, sw6\sw6atr.cxx, w4w\w4watr.cxx
105 : */
106 : #if !defined(UNX) && !defined(MSC) && !defined(PPC) && !defined(__MINGW32__)
107 :
108 : #define ATTRFNTAB_SIZE 130
109 : #if ATTRFNTAB_SIZE != POOLATTR_END - POOLATTR_BEGIN
110 : #error Attribut-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
111 : #endif
112 :
113 : #endif
114 :
115 : #define HTML_HEADSPACE (12*20)
116 :
117 : #define CSS1_BACKGROUND_ATTR 1
118 : #define CSS1_BACKGROUND_PAGE 2
119 : #define CSS1_BACKGROUND_TABLE 3
120 : #define CSS1_BACKGROUND_FLY 4
121 : #define CSS1_BACKGROUND_SECTION 5
122 :
123 : #define CSS1_FRMSIZE_WIDTH 0x01
124 : #define CSS1_FRMSIZE_VARHEIGHT 0x02
125 : #define CSS1_FRMSIZE_MINHEIGHT 0x04
126 : #define CSS1_FRMSIZE_FIXHEIGHT 0x08
127 : #define CSS1_FRMSIZE_ANYHEIGHT 0x0e
128 : #define CSS1_FRMSIZE_PIXEL 0x10
129 :
130 : using namespace ::com::sun::star;
131 :
132 : //-----------------------------------------------------------------------
133 :
134 : sal_Char CSS1_CONSTASCII_DEF( sCSS1_rule_end, " }" );
135 : sal_Char CSS1_CONSTASCII_DEF( sCSS1_span_tag_end, "\">" );
136 : const sal_Char cCSS1_style_opt_end = '\"';
137 :
138 : sal_Char CSS1_CONSTASCII_DEF( sHTML_FTN_fontheight, "57%" );
139 :
140 : extern SwAttrFnTab aCSS1AttrFnTab;
141 :
142 : static Writer& OutCSS1_SwFmt( Writer& rWrt, const SwFmt& rFmt,
143 : IDocumentStylePoolAccess /*SwDoc*/ *pDoc, SwDoc *pTemplate );
144 : static Writer& OutCSS1_SwPageDesc( Writer& rWrt, const SwPageDesc& rFmt,
145 : IDocumentStylePoolAccess /*SwDoc*/ *pDoc, SwDoc *pTemplate,
146 : sal_uInt16 nRefPoolId, bool bExtRef,
147 : bool bPseudo=true );
148 : static Writer& OutCSS1_SwFtnInfo( Writer& rWrt, const SwEndNoteInfo& rInfo,
149 : SwDoc *pDoc, sal_uInt16 nNotes, bool bEndNote );
150 : static void OutCSS1_SwFmtDropAttrs( SwHTMLWriter& rHWrt,
151 : const SwFmtDrop& rDrop,
152 : const SfxItemSet *pCharFmtItemSet=0 );
153 : static Writer& OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( Writer& rWrt,
154 : const SvxUnderlineItem *pUItem,
155 : const SvxOverlineItem *pOItem,
156 : const SvxCrossedOutItem *pCOItem,
157 : const SvxBlinkItem *pBItem );
158 : static Writer& OutCSS1_SvxFontWeight( Writer& rWrt, const SfxPoolItem& rHt );
159 : static Writer& OutCSS1_SvxPosture( Writer& rWrt, const SfxPoolItem& rHt );
160 : static Writer& OutCSS1_SvxULSpace( Writer& rWrt, const SfxPoolItem& rHt );
161 : static Writer& OutCSS1_SvxLRSpace( Writer& rWrt, const SfxPoolItem& rHt );
162 : static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
163 : const SvxULSpaceItem *pULSpace,
164 : const SvxLRSpaceItem *pLRSpace );
165 : static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
166 : const SfxItemSet& rItemSet,
167 : sal_Bool bDeep );
168 : static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt,
169 : sal_uInt16 nMode, const String *pGrfName );
170 : static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt );
171 : static Writer& OutCSS1_SwFmtFrmSize( Writer& rWrt, const SfxPoolItem& rHt,
172 : sal_uInt16 nMode );
173 : static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt,
174 : const SfxItemSet& rItemSet,
175 : sal_Bool bDeep );
176 : static Writer& OutCSS1_SwFmtLayoutSplit( Writer& rWrt, const SfxPoolItem& rHt );
177 :
178 0 : static rtl::OString ConvToHex(sal_uInt16 nHex)
179 : {
180 0 : sal_Char aNToABuf[] = "00";
181 :
182 : // Pointer an das Bufferende setzen
183 0 : sal_Char *pStr = aNToABuf + (sizeof(aNToABuf)-1);
184 0 : for( sal_uInt8 n = 0; n < 2; ++n )
185 : {
186 0 : *(--pStr) = (sal_Char)(nHex & 0xf ) + 48;
187 0 : if( *pStr > '9' )
188 0 : *pStr += 39;
189 0 : nHex >>= 4;
190 : }
191 :
192 0 : return rtl::OString(aNToABuf, 2);
193 : }
194 :
195 0 : static rtl::OString GetCSS1Color(const Color& rColor)
196 : {
197 0 : rtl::OStringBuffer aStr;
198 0 : aStr.append('#');
199 :
200 0 : aStr.append(ConvToHex(rColor.GetRed()));
201 0 : aStr.append(ConvToHex(rColor.GetGreen()));
202 0 : aStr.append(ConvToHex(rColor.GetBlue()));
203 :
204 0 : return aStr.makeStringAndClear();
205 : }
206 :
207 : class SwCSS1OutMode
208 : {
209 : SwHTMLWriter& rWrt;
210 : sal_uInt16 nOldMode;
211 :
212 : public:
213 :
214 0 : SwCSS1OutMode( SwHTMLWriter& rHWrt, sal_uInt16 nMode, bool bStartFirst=true,
215 : const String *pSelector=0 ) :
216 : rWrt( rHWrt ),
217 0 : nOldMode( rHWrt.nCSS1OutMode )
218 : {
219 0 : rWrt.nCSS1OutMode = nMode;
220 0 : if( bStartFirst )
221 0 : rWrt.bFirstCSS1Property = sal_True;
222 0 : if( pSelector )
223 0 : rWrt.aCSS1Selector = *pSelector;
224 0 : }
225 :
226 0 : ~SwCSS1OutMode()
227 : {
228 0 : rWrt.nCSS1OutMode = nOldMode;
229 0 : }
230 : };
231 :
232 :
233 :
234 0 : void SwHTMLWriter::OutCSS1_Property( const sal_Char *pProp,
235 : const sal_Char *pVal,
236 : const String *pSVal )
237 : {
238 0 : rtl::OStringBuffer sOut;
239 :
240 0 : if( bFirstCSS1Rule && (nCSS1OutMode & CSS1_OUTMODE_RULE_ON)!=0 )
241 : {
242 0 : bFirstCSS1Rule = sal_False;
243 0 : OutNewLine();
244 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_style).append(' ')
245 0 : .append(OOO_STRING_SVTOOLS_HTML_O_type).append("=\"text/css\">");
246 0 : Strm() << sOut.makeStringAndClear().getStr();
247 0 : OutNewLine();
248 0 : Strm() << '<' << OOO_STRING_SVTOOLS_HTML_comment;
249 :
250 0 : IncIndentLevel();
251 : }
252 :
253 0 : if( bFirstCSS1Property )
254 : {
255 0 : switch( nCSS1OutMode & CSS1_OUTMODE_ANY_ON )
256 : {
257 : case CSS1_OUTMODE_SPAN_TAG_ON:
258 : case CSS1_OUTMODE_SPAN_TAG1_ON:
259 0 : if( bTagOn )
260 : {
261 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_span)
262 0 : .append(' ').append(OOO_STRING_SVTOOLS_HTML_O_style)
263 0 : .append("=\"");
264 : }
265 : else
266 : {
267 0 : HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_span, sal_False );
268 0 : return;
269 : }
270 0 : break;
271 :
272 : case CSS1_OUTMODE_RULE_ON:
273 : {
274 0 : OutNewLine();
275 0 : sOut.append(rtl::OUStringToOString(aCSS1Selector, eDestEnc)).append(" { ");
276 : }
277 0 : break;
278 :
279 : case CSS1_OUTMODE_STYLE_OPT_ON:
280 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_style)
281 0 : .append("=\"");
282 0 : break;
283 : }
284 0 : bFirstCSS1Property = sal_False;
285 : }
286 : else
287 : {
288 0 : sOut.append("; ");
289 : }
290 :
291 :
292 0 : sOut.append(pProp).append(": ");
293 0 : if( nCSS1OutMode & CSS1_OUTMODE_ENCODE )
294 : {
295 : // In STYLE-Optionen den String codieren
296 0 : Strm() << sOut.makeStringAndClear().getStr();
297 0 : if( pVal )
298 0 : HTMLOutFuncs::Out_String( Strm(), rtl::OUString::createFromAscii(pVal),
299 0 : eDestEnc, &aNonConvertableCharacters );
300 0 : else if( pSVal )
301 0 : HTMLOutFuncs::Out_String( Strm(), *pSVal, eDestEnc, &aNonConvertableCharacters );
302 : }
303 : else
304 : {
305 : // Im STYLE-Tag des String direct ausgeben
306 0 : if( pVal )
307 0 : sOut.append(pVal);
308 0 : else if( pSVal )
309 0 : sOut.append(rtl::OUStringToOString(*pSVal, eDestEnc));
310 : }
311 :
312 0 : if (sOut.getLength())
313 0 : Strm() << sOut.makeStringAndClear().getStr();
314 : }
315 :
316 0 : static void AddUnitPropertyValue(rtl::OStringBuffer &rOut, long nVal,
317 : FieldUnit eUnit)
318 : {
319 0 : if( nVal < 0 )
320 : {
321 : // Vorzeichen extra behandeln
322 0 : nVal = -nVal;
323 0 : rOut.append('-');
324 : }
325 :
326 : // Die umgerechnete Einheit ergibt sich aus (x * nMul)/(nDiv*nFac*10)
327 0 : long nMul = 1000;
328 0 : long nDiv = 1;
329 0 : long nFac = 100;
330 : const sal_Char *pUnit;
331 0 : switch( eUnit )
332 : {
333 : case FUNIT_100TH_MM:
334 : OSL_ENSURE( FUNIT_MM == eUnit, "Masseinheit wird nicht unterstuetzt" );
335 : case FUNIT_MM:
336 : // 0.01mm = 0.57twip
337 0 : nMul = 25400; // 25.4 * 1000
338 0 : nDiv = 1440; // 72 * 20;
339 0 : nFac = 100;
340 0 : pUnit = sCSS1_UNIT_mm;
341 0 : break;
342 :
343 : case FUNIT_M:
344 : case FUNIT_KM:
345 : OSL_ENSURE( FUNIT_CM == eUnit, "Masseinheit wird nicht unterstuetzt" );
346 : case FUNIT_CM:
347 : // 0.01cm = 5.7twip (ist zwar ungenau, aber die UI ist auch ungenau)
348 0 : nMul = 2540; // 2.54 * 1000
349 0 : nDiv = 1440; // 72 * 20;
350 0 : nFac = 100;
351 0 : pUnit = sCSS1_UNIT_cm;
352 0 : break;
353 :
354 : case FUNIT_TWIP:
355 : OSL_ENSURE( FUNIT_POINT == eUnit, "Masseinheit wird nicht unterstuetzt" );
356 : case FUNIT_POINT:
357 : // 0.1pt = 2.0twip (ist zwar ungenau, aber die UI ist auch ungenau)
358 0 : nMul = 100;
359 0 : nDiv = 20;
360 0 : nFac = 10;
361 0 : pUnit = sCSS1_UNIT_pt;
362 0 : break;
363 :
364 : case FUNIT_PICA:
365 : // 0.01pc = 2.40twip (ist zwar ungenau, aber die UI ist auch ungenau)
366 0 : nMul = 1000;
367 0 : nDiv = 240; // 12 * 20;
368 0 : nFac = 100;
369 0 : pUnit = sCSS1_UNIT_pc;
370 0 : break;
371 :
372 : case FUNIT_NONE:
373 : case FUNIT_FOOT:
374 : case FUNIT_MILE:
375 : case FUNIT_CUSTOM:
376 : case FUNIT_PERCENT:
377 : case FUNIT_INCH:
378 : default:
379 : OSL_ENSURE( FUNIT_INCH == eUnit, "Masseinheit wird nicht unterstuetzt" );
380 : // 0.01in = 14.4twip (ist zwar ungenau, aber die UI ist auch ungenau)
381 0 : nMul = 1000;
382 0 : nDiv = 1440; // 72 * 20;
383 0 : nFac = 100;
384 0 : pUnit = sCSS1_UNIT_inch;
385 0 : break;
386 : }
387 :
388 0 : long nLongVal = 0;
389 0 : bool bOutLongVal = true;
390 0 : if( nVal > LONG_MAX / nMul )
391 : {
392 : // Zum Unrechnen der Einheit wird ein BigInt benoetigt
393 : #ifdef SAL_INT64_IS_STRUCT
394 : BigInt nBigVal( nVal );
395 : nBigVal *= nMul;
396 : nBigVal /= nDiv;
397 : nBigVal += 5;
398 : nBigVal /= 10;
399 :
400 : if( nBigVal.IsLong() )
401 : {
402 : // Zum Ausgeben des Wertes reicht ein long.
403 : nLongVal = (long)nBigVal;
404 : }
405 : else
406 : {
407 : BigInt nBigFac( nFac );
408 : BigInt nBig10( 10 );
409 : rOut += (long)(nBigVal / nBigFac);
410 : if( !(nBigVal % nBigFac).IsZero() )
411 : {
412 : rOut.append('.');
413 : while( nFac > 1 && !(nBigVal % nBigFac).IsZero() )
414 : {
415 : nFac /= 10;
416 : nBigFac = nFac;
417 : rOut.append(static_cast<sal_Int32>((nBigVal / nBigFac) % nBig10));
418 : }
419 : }
420 : bOutLongVal = false;
421 : }
422 : #else
423 0 : sal_Int64 nBigVal( nVal );
424 0 : nBigVal *= nMul;
425 0 : nBigVal /= nDiv;
426 0 : nBigVal += 5;
427 0 : nBigVal /= 10;
428 :
429 0 : if( nBigVal <= LONG_MAX )
430 : {
431 : // Zum Ausgeben des Wertes reicht ein long.
432 0 : nLongVal = (long)nBigVal;
433 : }
434 : else
435 : {
436 0 : rOut.append(nBigVal / (sal_Int64)nFac);
437 0 : if( (nBigVal % (sal_Int64)nFac) != 0 )
438 : {
439 0 : rOut.append('.');
440 0 : while( nFac > 1 && (nBigVal % (sal_Int64)nFac) != 0 )
441 : {
442 0 : nFac /= 10;
443 0 : rOut.append((nBigVal / (sal_Int64)nFac) % (sal_Int64)10);
444 : }
445 : }
446 0 : bOutLongVal = false;
447 : }
448 : #endif
449 : }
450 : else
451 : {
452 0 : nLongVal = nVal * nMul;
453 0 : nLongVal /= nDiv;
454 0 : nLongVal += 5;
455 0 : nLongVal /= 10;
456 : }
457 :
458 0 : if( bOutLongVal )
459 : {
460 0 : rOut.append(static_cast<sal_Int32>(nLongVal/nFac));
461 0 : if( (nLongVal % nFac) != 0 )
462 : {
463 0 : rOut.append('.');
464 0 : while( nFac > 1 && (nLongVal % nFac) != 0 )
465 : {
466 0 : nFac /= 10;
467 0 : rOut.append(static_cast<sal_Int32>((nLongVal / nFac) % 10));
468 : }
469 : }
470 : }
471 :
472 0 : rOut.append(pUnit);
473 0 : }
474 :
475 0 : void SwHTMLWriter::OutCSS1_UnitProperty( const sal_Char *pProp, long nVal )
476 : {
477 0 : rtl::OStringBuffer sOut;
478 0 : AddUnitPropertyValue(sOut, nVal, eCSS1Unit);
479 0 : OutCSS1_PropertyAscii(pProp, sOut.makeStringAndClear());
480 0 : }
481 :
482 0 : void SwHTMLWriter::OutCSS1_PixelProperty( const sal_Char *pProp, long nVal,
483 : sal_Bool bVert )
484 : {
485 0 : if( nVal && Application::GetDefaultDevice() )
486 : {
487 0 : Size aSz( bVert ? 0 : nVal, bVert ? nVal : 0 );
488 0 : aSz = Application::GetDefaultDevice()->LogicToPixel( aSz, MapMode( MAP_TWIP) );
489 0 : nVal = bVert ? aSz.Height() : aSz.Width();
490 0 : if( !nVal )
491 0 : nVal = 1;
492 : }
493 :
494 0 : rtl::OStringBuffer sOut;
495 0 : sOut.append(static_cast<sal_Int32>(nVal));
496 0 : sOut.append(sCSS1_UNIT_px);
497 0 : OutCSS1_PropertyAscii(pProp, sOut.makeStringAndClear());
498 0 : }
499 :
500 0 : void SwHTMLWriter::OutCSS1_SfxItemSet( const SfxItemSet& rItemSet,
501 : sal_Bool bDeep )
502 : {
503 : // den ItemSet ausgeben, und zwar inklusive aller Attribute
504 0 : Out_SfxItemSet( aCSS1AttrFnTab, *this, rItemSet, bDeep );
505 :
506 : // ein par Attribute benoetigen eine Spezial-Behandlung
507 0 : const SfxPoolItem *pItem = 0;
508 :
509 : // Underline, Overline, CrossedOut und Blink bilden zusammen eine CSS1-Property
510 : // (geht natuerlich nicht bei Hints)
511 0 : if( !IsCSS1Source(CSS1_OUTMODE_HINT) )
512 : {
513 0 : const SvxUnderlineItem *pUnderlineItem = 0;
514 0 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_UNDERLINE, bDeep, &pItem ))
515 0 : pUnderlineItem = (const SvxUnderlineItem *)pItem;
516 :
517 0 : const SvxOverlineItem *pOverlineItem = 0;
518 0 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_OVERLINE, bDeep, &pItem ))
519 0 : pOverlineItem = (const SvxOverlineItem *)pItem;
520 :
521 0 : const SvxCrossedOutItem *pCrossedOutItem = 0;
522 0 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_CROSSEDOUT, bDeep, &pItem ))
523 0 : pCrossedOutItem = (const SvxCrossedOutItem *)pItem;
524 :
525 0 : const SvxBlinkItem *pBlinkItem = 0;
526 0 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_BLINK, bDeep, &pItem ))
527 0 : pBlinkItem = (const SvxBlinkItem *)pItem;
528 :
529 0 : if( pUnderlineItem || pOverlineItem || pCrossedOutItem || pBlinkItem )
530 : OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( *this, pUnderlineItem,
531 : pOverlineItem,
532 : pCrossedOutItem,
533 0 : pBlinkItem );
534 :
535 0 : OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( *this, rItemSet, bDeep );
536 : }
537 :
538 0 : if( !bFirstCSS1Property )
539 : {
540 : // wenn eine Property als Bestandteil einer Style-Option
541 : // ausgegeben wurde, muss die Optiomn noch beendet werden
542 0 : rtl::OStringBuffer sOut;
543 0 : switch( nCSS1OutMode & CSS1_OUTMODE_ANY_OFF )
544 : {
545 : case CSS1_OUTMODE_SPAN_TAG_OFF:
546 0 : sOut.append(sCSS1_span_tag_end);
547 0 : break;
548 :
549 : case CSS1_OUTMODE_STYLE_OPT_OFF:
550 0 : sOut.append(cCSS1_style_opt_end);
551 0 : break;
552 :
553 : case CSS1_OUTMODE_RULE_OFF:
554 0 : sOut.append(sCSS1_rule_end);
555 0 : break;
556 : }
557 0 : if (sOut.getLength())
558 0 : Strm() << sOut.makeStringAndClear().getStr();
559 : }
560 0 : }
561 :
562 0 : void SwHTMLWriter::OutStyleSheet( const SwPageDesc& rPageDesc, sal_Bool bUsed )
563 : {
564 0 : bFirstCSS1Rule = sal_True;
565 :
566 : // Feature: PrintExt
567 0 : if( IsHTMLMode(HTMLMODE_PRINT_EXT) )
568 : {
569 0 : const SwPageDesc *pFirstPageDesc = 0;
570 0 : sal_uInt16 nFirstRefPoolId = RES_POOLPAGE_HTML;
571 0 : bCSS1IgnoreFirstPageDesc = sal_True;
572 :
573 : // Erstmal versuchen wir zu erraten, wie das Dokument so augebaut ist.
574 : // Erlaubt sind nur die Vorlagen HTML, erste Seite, linke Seite und
575 : // rechte Seite.
576 : // Eine erste Seite wird nur exportiert, wenn die erste Seite auch
577 : // wirklich die Vorlage "erste Seite" ist.
578 : // Linke und rechte Seiten werden nur exportiert, wenn diese beiden
579 : // Vorlagen untereinander verkettet werden.
580 : // Wenn andere Vorlagen verwendet werden, wird nur in sehr einfachen
581 : // Faellen etwas exportiert.
582 0 : const SwPageDesc *pPageDesc = &rPageDesc;
583 0 : const SwPageDesc *pFollow = rPageDesc.GetFollow();
584 0 : if( RES_POOLPAGE_FIRST == pPageDesc->GetPoolFmtId() &&
585 : pFollow != pPageDesc &&
586 0 : !IsPoolUserFmt( pFollow->GetPoolFmtId() ) )
587 : {
588 : // Das Dokument hat eine erste Seite
589 0 : pFirstPageDesc = pPageDesc;
590 0 : pPageDesc = pFollow;
591 0 : pFollow = pPageDesc->GetFollow();
592 : }
593 :
594 0 : IDocumentStylePoolAccess* pStylePoolAccess = getIDocumentStylePoolAccess();
595 0 : if( pPageDesc == pFollow )
596 : {
597 : // Das Dokument ist einseitig. Egal welche Seite verwendet wird,
598 : // es wird kein zweiseitiges Dokument daraus gemacht.
599 : // Die Attributierung wird relativ zur HTML-Seitenvorlage
600 : // aus der HTML-Vorlage exportiert.
601 : OutCSS1_SwPageDesc( *this, *pPageDesc, pStylePoolAccess, pTemplate,
602 0 : RES_POOLPAGE_HTML, true, false );
603 0 : nFirstRefPoolId = pFollow->GetPoolFmtId();
604 : }
605 0 : else if( (RES_POOLPAGE_LEFT == pPageDesc->GetPoolFmtId() &&
606 0 : RES_POOLPAGE_RIGHT == pFollow->GetPoolFmtId()) ||
607 0 : (RES_POOLPAGE_RIGHT == pPageDesc->GetPoolFmtId() &&
608 0 : RES_POOLPAGE_LEFT == pFollow->GetPoolFmtId()) )
609 : {
610 : // Das Dokument ist zweiseitig
611 : OutCSS1_SwPageDesc( *this, *pPageDesc, pStylePoolAccess, pTemplate,
612 0 : RES_POOLPAGE_HTML, true );
613 : OutCSS1_SwPageDesc( *this, *pFollow, pStylePoolAccess, pTemplate,
614 0 : RES_POOLPAGE_HTML, true );
615 0 : nFirstRefPoolId = RES_POOLPAGE_RIGHT;
616 0 : bCSS1IgnoreFirstPageDesc = sal_False;
617 : }
618 : // Alles andere bekommen wir nicht hin.
619 :
620 0 : if( pFirstPageDesc )
621 : OutCSS1_SwPageDesc( *this, *pFirstPageDesc, pStylePoolAccess, pTemplate,
622 0 : nFirstRefPoolId, false );
623 : }
624 : // /Feature: PrintExt
625 :
626 :
627 : // The text body style has to be exported always (if it is changed compared
628 : // to the template), because it is used as reference for any style
629 : // that maps to <P>, and that's especially the standard style
630 0 : getIDocumentStylePoolAccess()->GetTxtCollFromPool( RES_POOLCOLL_TEXT, false );
631 :
632 : // das Default-TextStyle wir nicht mit ausgegeben !!
633 : // das 0-Style ist das Default, wird nie ausgegeben !!
634 0 : sal_uInt16 nArrLen = pDoc->GetTxtFmtColls()->size();
635 : sal_uInt16 i;
636 :
637 0 : for( i = 1; i < nArrLen; i++ )
638 : {
639 0 : const SwTxtFmtColl* pColl = (*pDoc->GetTxtFmtColls())[i];
640 0 : sal_uInt16 nPoolId = pColl->GetPoolFmtId();
641 0 : if( !bUsed || nPoolId == RES_POOLCOLL_TEXT ||
642 0 : pDoc->IsUsed( *pColl ) )
643 0 : OutCSS1_SwFmt( *this, *pColl, pDoc, pTemplate );
644 : }
645 :
646 : // das Default-TextStyle wir nicht mit ausgegeben !!
647 0 : nArrLen = pDoc->GetCharFmts()->size();
648 0 : for( i=1; i<nArrLen; i++ )
649 : {
650 0 : const SwCharFmt *pCFmt = (*pDoc->GetCharFmts())[i];
651 0 : sal_uInt16 nPoolId = pCFmt->GetPoolFmtId();
652 0 : if( !bUsed || nPoolId == RES_POOLCHR_INET_NORMAL ||
653 : nPoolId == RES_POOLCHR_INET_VISIT ||
654 0 : pDoc->IsUsed( *pCFmt ) )
655 0 : OutCSS1_SwFmt( *this, *pCFmt, pDoc, pTemplate );
656 : }
657 :
658 0 : const SwFtnIdxs& rIdxs = pDoc->GetFtnIdxs();
659 0 : nArrLen = rIdxs.size();
660 0 : sal_uInt16 nEnd = 0, nFtn = 0;
661 0 : for( i=0; i < nArrLen; i++ )
662 : {
663 0 : if( rIdxs[i]->GetFtn().IsEndNote() )
664 0 : nEnd++;
665 : else
666 0 : nFtn++;
667 : }
668 0 : OutCSS1_SwFtnInfo( *this, pDoc->GetFtnInfo(), pDoc, nFtn, false );
669 0 : OutCSS1_SwFtnInfo( *this, pDoc->GetEndNoteInfo(), pDoc, nEnd, true );
670 :
671 0 : if( !bFirstCSS1Rule )
672 : {
673 0 : DecIndentLevel();
674 0 : OutNewLine();
675 0 : Strm() << "-->";
676 :
677 0 : OutNewLine();
678 0 : HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_style, sal_False );
679 : }
680 : else
681 : {
682 0 : bFirstCSS1Rule = sal_False;
683 : }
684 :
685 0 : nDfltTopMargin = 0;
686 0 : nDfltBottomMargin = 0;
687 0 : }
688 :
689 : //-----------------------------------------------------------------------
690 :
691 : // wenn pPseudo gesetzt ist werden Styles-Sheets ausgegeben,
692 : // sonst wird nur nach Token und Class fuer ein Format gesucht
693 0 : sal_uInt16 SwHTMLWriter::GetCSS1Selector( const SwFmt *pFmt, rtl::OString& rToken,
694 : String& rClass, sal_uInt16& rRefPoolId,
695 : String *pPseudo )
696 : {
697 0 : sal_uInt16 nDeep = 0;
698 0 : rToken = rtl::OString();
699 0 : rClass.Erase();
700 0 : rRefPoolId = 0;
701 0 : if( pPseudo )
702 0 : pPseudo->Erase();
703 :
704 0 : sal_Bool bChrFmt = RES_CHRFMT==pFmt->Which();
705 :
706 : // Nach oben die Formate abklappern, bis man auf eine Standard-
707 : // oder eine HTML-Tag-Vorlage trifft
708 0 : const SwFmt *pPFmt = pFmt;
709 0 : while( pPFmt && !pPFmt->IsDefault() )
710 : {
711 0 : bool bStop = false;
712 0 : sal_uInt16 nPoolId = pPFmt->GetPoolFmtId();
713 0 : if( USER_FMT & nPoolId )
714 : {
715 : // Benutzer-Vorlagen
716 0 : const String& rNm = pPFmt->GetName();
717 0 : switch( rNm.GetChar(0) )
718 : {
719 : // nicht mehr unterstuetzt:
720 : // OOO_STRING_SVTOOLS_HTML_author
721 : // OOO_STRING_SVTOOLS_HTML_acronym
722 : // OOO_STRING_SVTOOLS_HTML_abbreviation
723 : // OOO_STRING_SVTOOLS_HTML_deletedtext
724 : // OOO_STRING_SVTOOLS_HTML_insertedtext
725 : // OOO_STRING_SVTOOLS_HTML_language
726 : // OOO_STRING_SVTOOLS_HTML_person
727 0 : case 'B': if( !bChrFmt && rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_blockquote) )
728 : {
729 0 : rRefPoolId = RES_POOLCOLL_HTML_BLOCKQUOTE;
730 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_blockquote);
731 : }
732 0 : break;
733 0 : case 'C': if( bChrFmt )
734 : {
735 0 : if( rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_citiation) )
736 : {
737 0 : rRefPoolId = RES_POOLCHR_HTML_CITIATION;
738 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_citiation);
739 : }
740 0 : else if( rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_code) )
741 : {
742 0 : rRefPoolId = RES_POOLCHR_HTML_CODE;
743 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_code);
744 : }
745 : }
746 0 : break;
747 0 : case 'D': if( bChrFmt && rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_definstance) )
748 : {
749 0 : rRefPoolId = RES_POOLCHR_HTML_DEFINSTANCE;
750 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_definstance);
751 : }
752 0 : else if( !bChrFmt )
753 : {
754 0 : sal_uInt16 nDefListLvl = GetDefListLvl( rNm, nPoolId );
755 : // Die Vorlagen DD 1/DT 1 werden ausgegeben,
756 : // aber keine von ihnen abgeleiteten Vorlagen,
757 : // auch nicht DD 2/DT 2 etc.
758 0 : if( nDefListLvl )
759 : {
760 0 : if( pPseudo &&
761 : (nDeep || (nDefListLvl & 0x0fff) > 1) )
762 : {
763 0 : bStop = true;
764 : }
765 0 : else if( nDefListLvl & HTML_DLCOLL_DD )
766 : {
767 0 : rRefPoolId = RES_POOLCOLL_HTML_DD;
768 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_dd);
769 : }
770 : else
771 : {
772 0 : rRefPoolId = RES_POOLCOLL_HTML_DT;
773 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_dt);
774 : }
775 : }
776 : }
777 0 : break;
778 0 : case 'E': if( bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_emphasis ) )
779 : {
780 0 : rRefPoolId = RES_POOLCHR_HTML_EMPHASIS;
781 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_emphasis);
782 : }
783 0 : break;
784 0 : case 'H': if( !bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_horzrule ) )
785 : // HR nicht ausgeben!
786 0 : bStop = (nDeep==0);
787 0 : break;
788 0 : case 'K': if( bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_keyboard ) )
789 : {
790 0 : rRefPoolId = RES_POOLCHR_HTML_KEYBOARD;
791 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_keyboard);
792 : }
793 0 : break;
794 0 : case 'L': if( !bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_listing ) )
795 : {
796 : // Listing als PRE exportieren bzw. von
797 : // PRE abgeleitete Vorlage exportieren
798 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_preformtxt);
799 0 : rRefPoolId = RES_POOLCOLL_HTML_PRE;
800 0 : nDeep = CSS1_FMT_CMPREF;
801 : }
802 0 : break;
803 0 : case 'P': if( !bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_preformtxt ) )
804 : {
805 0 : rRefPoolId = RES_POOLCOLL_HTML_PRE;
806 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_preformtxt);
807 : }
808 0 : break;
809 0 : case 'S': if( bChrFmt )
810 : {
811 0 : if( rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_sample ) )
812 : {
813 0 : rRefPoolId = RES_POOLCHR_HTML_SAMPLE;
814 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_sample);
815 : }
816 0 : else if( rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_strong ) )
817 : {
818 0 : rRefPoolId = RES_POOLCHR_HTML_STRONG;
819 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_strong);
820 : }
821 : }
822 0 : break;
823 0 : case 'T': if( bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_teletype ) )
824 : {
825 0 : rRefPoolId = RES_POOLCHR_HTML_TELETYPE;
826 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_teletype);
827 : }
828 0 : break;
829 0 : case 'V': if( bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_variable ) )
830 : {
831 0 : rRefPoolId = RES_POOLCHR_HTML_VARIABLE;
832 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_variable);
833 : }
834 0 : break;
835 0 : case 'X': if( !bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_xmp ) )
836 : {
837 : // XMP als PRE exportieren (aber nicht die
838 : // Vorlage als Style)
839 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_preformtxt);
840 0 : rRefPoolId = RES_POOLCOLL_HTML_PRE;
841 0 : nDeep = CSS1_FMT_CMPREF;
842 : }
843 0 : break;
844 : }
845 :
846 : // Wenn eine PoolId gesetzt ist, entspricht der Name der
847 : // Vorlage dem szugehoerigen Token
848 : OSL_ENSURE( (rRefPoolId != 0) == (!rToken.isEmpty()),
849 : "Token missing" );
850 : }
851 : else
852 : {
853 : // Pool-Vorlagen
854 0 : switch( nPoolId )
855 : {
856 : // Absatz-Vorlagen
857 : case RES_POOLCOLL_HEADLINE_BASE:
858 : case RES_POOLCOLL_STANDARD:
859 : // diese Vorlagen nicht ausgeben
860 0 : bStop = (nDeep==0);
861 0 : break;
862 : case RES_POOLCOLL_TEXT:
863 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_parabreak);
864 0 : break;
865 : case RES_POOLCOLL_HEADLINE1:
866 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_head1);
867 0 : break;
868 : case RES_POOLCOLL_HEADLINE2:
869 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_head2);
870 0 : break;
871 : case RES_POOLCOLL_HEADLINE3:
872 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_head3);
873 0 : break;
874 : case RES_POOLCOLL_HEADLINE4:
875 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_head4);
876 0 : break;
877 : case RES_POOLCOLL_HEADLINE5:
878 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_head5);
879 0 : break;
880 : case RES_POOLCOLL_HEADLINE6:
881 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_head6);
882 0 : break;
883 : case RES_POOLCOLL_SENDADRESS:
884 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_address);
885 0 : break;
886 : case RES_POOLCOLL_HTML_BLOCKQUOTE:
887 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_blockquote);
888 0 : break;
889 : case RES_POOLCOLL_HTML_PRE:
890 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_preformtxt);
891 0 : break;
892 :
893 : case RES_POOLCOLL_HTML_DD:
894 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_dd);
895 0 : break;
896 : case RES_POOLCOLL_HTML_DT:
897 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_dt);
898 0 : break;
899 :
900 : case RES_POOLCOLL_TABLE:
901 0 : if( pPseudo )
902 : {
903 : rToken = rtl::OStringBuffer(
904 : RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_tabledata))
905 0 : .append(' ')
906 0 : .append(RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_parabreak))
907 0 : .makeStringAndClear();
908 : }
909 : else
910 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_parabreak);
911 0 : break;
912 : case RES_POOLCOLL_TABLE_HDLN:
913 0 : if( pPseudo )
914 : {
915 : rToken = rtl::OStringBuffer(
916 : RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_tableheader))
917 0 : .append(' ')
918 0 : .append(RTL_CONSTASCII_STRINGPARAM(OOO_STRING_SVTOOLS_HTML_parabreak))
919 0 : .makeStringAndClear();
920 : }
921 : else
922 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_parabreak);
923 0 : break;
924 : case RES_POOLCOLL_HTML_HR:
925 : // HR nicht ausgeben!
926 0 : bStop = (nDeep==0);
927 0 : break;
928 : case RES_POOLCOLL_FOOTNOTE:
929 0 : if( !nDeep )
930 : {
931 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_parabreak);
932 0 : rClass.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdfootnote );
933 0 : rRefPoolId = RES_POOLCOLL_TEXT;
934 0 : nDeep = CSS1_FMT_CMPREF;
935 : }
936 0 : break;
937 : case RES_POOLCOLL_ENDNOTE:
938 0 : if( !nDeep )
939 : {
940 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_parabreak);
941 0 : rClass.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdendnote );
942 0 : rRefPoolId = RES_POOLCOLL_TEXT;
943 0 : nDeep = CSS1_FMT_CMPREF;
944 : }
945 0 : break;
946 :
947 : // Zeichen-Vorlagen
948 : case RES_POOLCHR_HTML_EMPHASIS:
949 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_emphasis);
950 0 : break;
951 : case RES_POOLCHR_HTML_CITIATION:
952 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_citiation);
953 0 : break;
954 : case RES_POOLCHR_HTML_STRONG:
955 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_strong);
956 0 : break;
957 : case RES_POOLCHR_HTML_CODE:
958 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_code);
959 0 : break;
960 : case RES_POOLCHR_HTML_SAMPLE:
961 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_sample);
962 0 : break;
963 : case RES_POOLCHR_HTML_KEYBOARD:
964 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_keyboard);
965 0 : break;
966 : case RES_POOLCHR_HTML_VARIABLE:
967 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_variable);
968 0 : break;
969 : case RES_POOLCHR_HTML_DEFINSTANCE:
970 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_definstance);
971 0 : break;
972 : case RES_POOLCHR_HTML_TELETYPE:
973 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_teletype);
974 0 : break;
975 :
976 : case RES_POOLCHR_INET_NORMAL:
977 0 : if( pPseudo )
978 : {
979 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_anchor);
980 0 : pPseudo->AssignAscii( sCSS1_link );
981 : }
982 0 : break;
983 : case RES_POOLCHR_INET_VISIT:
984 0 : if( pPseudo )
985 : {
986 0 : rToken = rtl::OString(OOO_STRING_SVTOOLS_HTML_anchor);
987 0 : pPseudo->AssignAscii( sCSS1_visited );
988 : }
989 0 : break;
990 : }
991 :
992 : // Wenn ein Token gesetzt ist, enthaelt nPoolId die dazugehoerige
993 : // Vorlage
994 0 : if( !rToken.isEmpty() && !rRefPoolId )
995 0 : rRefPoolId = nPoolId;
996 : }
997 :
998 0 : if( !rToken.isEmpty() || bStop )
999 : {
1000 : // Anhalten wenn eine HTML-Tag-Vorlage gefunden wurde
1001 0 : break;
1002 : }
1003 : else
1004 : {
1005 : // sonst weitersuchen
1006 0 : nDeep++;
1007 0 : pPFmt = pPFmt->DerivedFrom();
1008 : }
1009 : }
1010 :
1011 0 : if( !rToken.isEmpty() )
1012 : {
1013 : // Es ist eine HTML-Tag-Vorlage
1014 0 : if( !nDeep )
1015 0 : nDeep = CSS1_FMT_ISTAG;
1016 : }
1017 : else
1018 : {
1019 : // Es ist keine HTML-Tag-Vorlage und auch keine davon abgeleitete
1020 0 : nDeep = 0;
1021 : }
1022 0 : if( nDeep > 0 && nDeep < CSS1_FMT_SPECIAL )
1023 : {
1024 : // Wenn die Vorlage von einer HTML-Vorlage abgeleitet ist,
1025 : // wird sie als <TOKEN>.<CLASS> exportiert, sonst als .<CLASS>.
1026 : // <CLASS> ergibt sich aus dem Namen der Vorlage durch entfernen
1027 : // aller Zeichen vor und inklusive dem ersten '.'
1028 0 : rClass = pFmt->GetName();
1029 0 : xub_StrLen nPos = rClass.Search( '.' );
1030 0 : if( nPos != STRING_NOTFOUND && rClass.Len() > nPos+1 )
1031 : {
1032 0 : rClass.Erase( 0, nPos+1 );
1033 : }
1034 :
1035 0 : rClass = GetAppCharClass().lowercase( rClass );
1036 0 : while( STRING_NOTFOUND != rClass.SearchAndReplace( '.', '-' ) )
1037 : ;
1038 0 : while( STRING_NOTFOUND != rClass.SearchAndReplace( ' ', '-' ) )
1039 : ;
1040 0 : while( STRING_NOTFOUND != rClass.SearchAndReplace( '_', '-' ) )
1041 : ;
1042 : }
1043 :
1044 0 : return nDeep;
1045 : }
1046 :
1047 0 : static sal_uInt16 GetCSS1Selector( const SwFmt *pFmt, String& rSelector,
1048 : sal_uInt16& rRefPoolId )
1049 : {
1050 0 : rtl::OString aToken;
1051 0 : String aClass;
1052 0 : String aPseudo;
1053 :
1054 : sal_uInt16 nDeep = SwHTMLWriter::GetCSS1Selector( pFmt, aToken, aClass,
1055 0 : rRefPoolId, &aPseudo );
1056 0 : if( nDeep )
1057 : {
1058 0 : if( !aToken.isEmpty() )
1059 0 : rSelector = rtl::OStringToOUString(aToken, RTL_TEXTENCODING_ASCII_US);
1060 : else
1061 0 : rSelector.Erase();
1062 :
1063 0 : if( aClass.Len() )
1064 0 : (rSelector += '.') += aClass;
1065 0 : if( aPseudo.Len() )
1066 0 : (rSelector += ':') += aPseudo;
1067 : }
1068 :
1069 0 : return nDeep;
1070 : }
1071 :
1072 0 : const SwFmt *SwHTMLWriter::GetTemplateFmt( sal_uInt16 nPoolFmtId,
1073 : IDocumentStylePoolAccess* pTemplate /*SwDoc *pTemplate*/)
1074 : {
1075 0 : const SwFmt *pRefFmt = 0;
1076 :
1077 0 : if( pTemplate )
1078 : {
1079 : OSL_ENSURE( !(USER_FMT & nPoolFmtId),
1080 : "In der Dok-Vorlage gibt es keine Benutzer-Vorlagen" );
1081 0 : if( POOLGRP_NOCOLLID & nPoolFmtId )
1082 0 : pRefFmt = pTemplate->GetCharFmtFromPool( nPoolFmtId );
1083 : else
1084 0 : pRefFmt = pTemplate->GetTxtCollFromPool( nPoolFmtId, false );
1085 : }
1086 :
1087 0 : return pRefFmt;
1088 : }
1089 :
1090 0 : const SwFmt *SwHTMLWriter::GetParentFmt( const SwFmt& rFmt, sal_uInt16 nDeep )
1091 : {
1092 : OSL_ENSURE( nDeep != USHRT_MAX, "GetParent fuer HTML-Vorlage aufgerufen!" );
1093 0 : const SwFmt *pRefFmt = 0;
1094 :
1095 0 : if( nDeep > 0 )
1096 : {
1097 : // hier wird die HTML-Tag-Vorlage, von der die Vorlage abgeleitet
1098 : // ist als Referenz geholt
1099 0 : pRefFmt = &rFmt;
1100 0 : for( sal_uInt16 i=nDeep; i>0; i-- )
1101 0 : pRefFmt = pRefFmt->DerivedFrom();
1102 :
1103 0 : if( pRefFmt && pRefFmt->IsDefault() )
1104 0 : pRefFmt = 0;
1105 : }
1106 :
1107 0 : return pRefFmt;
1108 : }
1109 :
1110 0 : bool swhtml_css1atr_equalFontItems( const SfxPoolItem& r1, const SfxPoolItem& r2 )
1111 : {
1112 0 : return ((const SvxFontItem &)r1).GetFamilyName() ==
1113 0 : ((const SvxFontItem &)r2).GetFamilyName() &&
1114 0 : ((const SvxFontItem &)r1).GetFamily() ==
1115 0 : ((const SvxFontItem &)r2).GetFamily();
1116 : }
1117 :
1118 0 : void SwHTMLWriter::SubtractItemSet( SfxItemSet& rItemSet,
1119 : const SfxItemSet& rRefItemSet,
1120 : sal_Bool bSetDefaults,
1121 : sal_Bool bClearSame,
1122 : const SfxItemSet *pRefScriptItemSet )
1123 : {
1124 : OSL_ENSURE( bSetDefaults || bClearSame,
1125 : "SwHTMLWriter::SubtractItemSet: Bei diesen Flags passiert nix" );
1126 0 : SfxItemSet aRefItemSet( *rRefItemSet.GetPool(), rRefItemSet.GetRanges() );
1127 0 : aRefItemSet.Set( rRefItemSet );
1128 :
1129 : // und mit dem Attr-Set der Vorlage vergleichen
1130 0 : SfxWhichIter aIter( rItemSet );
1131 0 : sal_uInt16 nWhich = aIter.FirstWhich();
1132 0 : while( nWhich )
1133 : {
1134 : const SfxPoolItem *pRefItem, *pItem;
1135 : bool bItemSet = ( SFX_ITEM_SET ==
1136 0 : rItemSet.GetItemState( nWhich, sal_False, &pItem) );
1137 : bool bRefItemSet;
1138 :
1139 0 : if( pRefScriptItemSet )
1140 : {
1141 0 : switch( nWhich )
1142 : {
1143 : case RES_CHRATR_FONT:
1144 : case RES_CHRATR_FONTSIZE:
1145 : case RES_CHRATR_LANGUAGE:
1146 : case RES_CHRATR_POSTURE:
1147 : case RES_CHRATR_WEIGHT:
1148 : case RES_CHRATR_CJK_FONT:
1149 : case RES_CHRATR_CJK_FONTSIZE:
1150 : case RES_CHRATR_CJK_LANGUAGE:
1151 : case RES_CHRATR_CJK_POSTURE:
1152 : case RES_CHRATR_CJK_WEIGHT:
1153 : case RES_CHRATR_CTL_FONT:
1154 : case RES_CHRATR_CTL_FONTSIZE:
1155 : case RES_CHRATR_CTL_LANGUAGE:
1156 : case RES_CHRATR_CTL_POSTURE:
1157 : case RES_CHRATR_CTL_WEIGHT:
1158 : bRefItemSet = ( SFX_ITEM_SET ==
1159 0 : pRefScriptItemSet->GetItemState( nWhich, sal_True, &pRefItem) );
1160 0 : break;
1161 : default:
1162 : bRefItemSet = ( SFX_ITEM_SET ==
1163 0 : aRefItemSet.GetItemState( nWhich, sal_False, &pRefItem) );
1164 0 : break;
1165 : }
1166 : }
1167 : else
1168 : {
1169 : bRefItemSet = ( SFX_ITEM_SET ==
1170 0 : aRefItemSet.GetItemState( nWhich, sal_False, &pRefItem) );
1171 : }
1172 :
1173 0 : if( bItemSet )
1174 : {
1175 0 : if( (bClearSame || pRefScriptItemSet) && bRefItemSet &&
1176 0 : ( *pItem == *pRefItem ||
1177 : ((RES_CHRATR_FONT == nWhich ||
1178 : RES_CHRATR_CJK_FONT == nWhich ||
1179 : RES_CHRATR_CTL_FONT == nWhich) &&
1180 0 : swhtml_css1atr_equalFontItems( *pItem, *pRefItem )) ) )
1181 : {
1182 : // das Attribut ist mit dem gleichen Wert in beiden
1183 : // Vorlagen vorhanden und muss nicht ausgegeben werden
1184 0 : rItemSet.ClearItem( nWhich );
1185 : }
1186 : }
1187 : else
1188 : {
1189 0 : if( (bSetDefaults || pRefScriptItemSet) && bRefItemSet )
1190 : {
1191 : // das Attribut ist nur in der Referenz vorhanden. Das
1192 : // Default muss ggf. ausgegeben werden
1193 0 : rItemSet.Put( rItemSet.GetPool()->GetDefaultItem(nWhich) );
1194 : }
1195 : }
1196 :
1197 0 : nWhich = aIter.NextWhich();
1198 0 : }
1199 0 : }
1200 :
1201 0 : void SwHTMLWriter::PrepareFontList( const SvxFontItem& rFontItem,
1202 : String& rNames,
1203 : sal_Unicode cQuote, sal_Bool bGeneric )
1204 : {
1205 0 : rNames = aEmptyStr;
1206 0 : const String& rName = rFontItem.GetFamilyName();
1207 0 : sal_Bool bContainsKeyword = sal_False;
1208 0 : if( rName.Len() )
1209 : {
1210 0 : xub_StrLen nStrPos = 0;
1211 0 : while( nStrPos != STRING_NOTFOUND )
1212 : {
1213 0 : String aName = rName.GetToken( 0, ';', nStrPos );
1214 0 : aName = comphelper::string::strip(aName, ' ');
1215 0 : if( !aName.Len() )
1216 0 : continue;
1217 :
1218 0 : sal_Bool bIsKeyword = sal_False;
1219 0 : switch( aName.GetChar( 0 ) )
1220 : {
1221 : case 'c':
1222 : case 'C':
1223 0 : bIsKeyword = aName.EqualsIgnoreCaseAscii( sCSS1_PV_cursive );
1224 0 : break;
1225 :
1226 : case 'f':
1227 : case 'F':
1228 0 : bIsKeyword = aName.EqualsIgnoreCaseAscii( sCSS1_PV_fantasy );
1229 0 : break;
1230 :
1231 : case 'm':
1232 : case 'M':
1233 0 : bIsKeyword = aName.EqualsIgnoreCaseAscii( sCSS1_PV_monospace );
1234 0 : break;
1235 :
1236 : case 's':
1237 : case 'S':
1238 : bIsKeyword =
1239 0 : aName.EqualsIgnoreCaseAscii( sCSS1_PV_serif ) ||
1240 0 : aName.EqualsIgnoreCaseAscii( sCSS1_PV_sans_serif );
1241 0 : break;
1242 : }
1243 :
1244 0 : bContainsKeyword |= bIsKeyword;
1245 :
1246 0 : if( rNames.Len() )
1247 0 : rNames.AppendAscii( ", " );
1248 0 : if( cQuote && !bIsKeyword )
1249 0 : rNames += cQuote;
1250 0 : rNames += aName;
1251 0 : if( cQuote && !bIsKeyword )
1252 0 : rNames += cQuote;
1253 0 : }
1254 : }
1255 :
1256 0 : if( !bContainsKeyword && bGeneric )
1257 : {
1258 0 : const sal_Char *pStr = 0;
1259 0 : switch( rFontItem.GetFamily() )
1260 : {
1261 0 : case FAMILY_ROMAN: pStr = sCSS1_PV_serif; break;
1262 0 : case FAMILY_SWISS: pStr = sCSS1_PV_sans_serif; break;
1263 0 : case FAMILY_SCRIPT: pStr = sCSS1_PV_cursive; break;
1264 0 : case FAMILY_DECORATIVE: pStr = sCSS1_PV_fantasy; break;
1265 0 : case FAMILY_MODERN: pStr = sCSS1_PV_monospace; break;
1266 : default:
1267 : ;
1268 : }
1269 :
1270 0 : if( pStr )
1271 : {
1272 0 : if( rNames.Len() )
1273 0 : rNames.AppendAscii( ", " );
1274 0 : rNames.AppendAscii( pStr );
1275 : }
1276 : }
1277 0 : }
1278 :
1279 0 : sal_Bool SwHTMLWriter::HasScriptDependentItems( const SfxItemSet& rItemSet,
1280 : sal_Bool bCheckDropCap )
1281 : {
1282 : static sal_uInt16 aWhichIds[] =
1283 : {
1284 : RES_CHRATR_FONT, RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_FONT,
1285 : RES_CHRATR_FONTSIZE, RES_CHRATR_CJK_FONTSIZE, RES_CHRATR_CTL_FONTSIZE,
1286 : RES_CHRATR_LANGUAGE, RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CTL_LANGUAGE,
1287 : RES_CHRATR_POSTURE, RES_CHRATR_CJK_POSTURE, RES_CHRATR_CTL_POSTURE,
1288 : RES_CHRATR_WEIGHT, RES_CHRATR_CJK_WEIGHT, RES_CHRATR_CTL_WEIGHT,
1289 : 0, 0, 0
1290 : };
1291 :
1292 0 : for( sal_uInt16 i=0; aWhichIds[i]; i += 3 )
1293 : {
1294 0 : const SfxPoolItem *pItem = 0, *pItemCJK = 0, *pItemCTL = 0, *pTmp;
1295 0 : sal_uInt16 nItemCount = 0;
1296 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( aWhichIds[i], sal_False,
1297 0 : &pTmp ) )
1298 : {
1299 0 : pItem = pTmp;
1300 0 : nItemCount++;
1301 : }
1302 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( aWhichIds[i+1], sal_False,
1303 0 : &pTmp ) )
1304 : {
1305 0 : pItemCJK = pTmp;
1306 0 : nItemCount++;
1307 : }
1308 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( aWhichIds[i+2], sal_False,
1309 0 : &pTmp ) )
1310 : {
1311 0 : pItemCTL = pTmp;
1312 0 : nItemCount++;
1313 : }
1314 :
1315 : // If some of the items are set, but not all, we need script dependent
1316 : // styles
1317 0 : if( nItemCount > 0 && nItemCount < 3 )
1318 0 : return sal_True;
1319 :
1320 0 : if( 3 == nItemCount )
1321 : {
1322 : // If all items are set, but some of them have different values,
1323 : // we need script dependent styles, too. For font items, we have
1324 : // to take care about their special HTML/CSS1 representation.
1325 0 : if( RES_CHRATR_FONT == aWhichIds[i] )
1326 : {
1327 0 : if( !swhtml_css1atr_equalFontItems( *pItem, *pItemCJK ) ||
1328 0 : !swhtml_css1atr_equalFontItems( *pItem, *pItemCTL ) ||
1329 0 : !swhtml_css1atr_equalFontItems( *pItemCJK, *pItemCTL ) )
1330 0 : return sal_True;
1331 : }
1332 : else
1333 : {
1334 0 : if( !( *pItem == *pItemCJK ) ||
1335 0 : !( *pItem == *pItemCTL ) ||
1336 0 : !( *pItemCJK == *pItemCTL ) )
1337 0 : return sal_True;
1338 : }
1339 : }
1340 : }
1341 :
1342 : const SfxPoolItem *pItem;
1343 0 : if( bCheckDropCap &&
1344 : SFX_ITEM_SET == rItemSet.GetItemState( RES_PARATR_DROP, sal_True,
1345 0 : &pItem ) )
1346 : {
1347 0 : const SwFmtDrop *pDrop = (const SwFmtDrop *)pItem;
1348 0 : const SwCharFmt *pDCCharFmt = pDrop->GetCharFmt();
1349 0 : if( pDCCharFmt )
1350 : {
1351 : //sequence of (start, end) property ranges we want to
1352 : //query
1353 0 : SfxItemSet aTstItemSet( *pDCCharFmt->GetAttrSet().GetPool(),
1354 : RES_CHRATR_FONT, RES_CHRATR_FONT,
1355 : RES_CHRATR_POSTURE, RES_CHRATR_POSTURE,
1356 : RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT,
1357 : RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONT,
1358 : RES_CHRATR_CJK_POSTURE, RES_CHRATR_CJK_WEIGHT,
1359 : RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONT,
1360 : RES_CHRATR_CTL_POSTURE, RES_CHRATR_CTL_WEIGHT,
1361 0 : 0 );
1362 0 : aTstItemSet.Set( pDCCharFmt->GetAttrSet(), sal_True );
1363 0 : return HasScriptDependentItems( aTstItemSet, sal_False );
1364 : }
1365 : }
1366 :
1367 0 : return sal_False;
1368 : }
1369 :
1370 0 : static bool OutCSS1Rule( SwHTMLWriter& rHTMLWrt, const String& rSelector,
1371 : const SfxItemSet& rItemSet, sal_Bool bHasClass,
1372 : bool bCheckForPseudo )
1373 : {
1374 0 : bool bScriptDependent = false;
1375 0 : if( SwHTMLWriter::HasScriptDependentItems( rItemSet, bHasClass ) )
1376 : {
1377 0 : bScriptDependent = true;
1378 0 : String aSelector( rSelector );
1379 :
1380 0 : String aPseudo;
1381 0 : if( bCheckForPseudo )
1382 : {
1383 0 : xub_StrLen nPos = aSelector.SearchBackward( ':' );
1384 0 : if( STRING_NOTFOUND != nPos )
1385 : {
1386 0 : aPseudo = aSelector.Copy( nPos );
1387 0 : aSelector.Erase( nPos );
1388 : }
1389 : }
1390 :
1391 0 : if( !bHasClass )
1392 : {
1393 : // If we are exporting styles for a tag we have to export a tag
1394 : // rule for all properties that aren't style dependent and
1395 : // some class rule for the additional style dependen properties
1396 : {
1397 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_NO_SCRIPT|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1398 0 : true, &rSelector );
1399 0 : rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False );
1400 : }
1401 :
1402 : //sequence of (start, end) property ranges we want to
1403 : //query
1404 0 : SfxItemSet aScriptItemSet( *rItemSet.GetPool(),
1405 : RES_CHRATR_FONT, RES_CHRATR_FONTSIZE,
1406 : RES_CHRATR_LANGUAGE, RES_CHRATR_POSTURE,
1407 : RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT,
1408 : RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_WEIGHT,
1409 0 : 0 );
1410 0 : aScriptItemSet.Put( rItemSet );
1411 :
1412 0 : String aNewSelector( aSelector );
1413 0 : aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".western") );
1414 0 : aNewSelector.Append( aPseudo );
1415 : {
1416 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_WESTERN|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1417 0 : true, &aNewSelector );
1418 0 : rHTMLWrt.OutCSS1_SfxItemSet( aScriptItemSet, sal_False );
1419 : }
1420 :
1421 0 : aNewSelector = aSelector;
1422 0 : aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".cjk") );
1423 0 : aNewSelector.Append( aPseudo );
1424 : {
1425 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1426 0 : true, &aNewSelector );
1427 0 : rHTMLWrt.OutCSS1_SfxItemSet( aScriptItemSet, sal_False );
1428 : }
1429 :
1430 0 : aNewSelector = aSelector;
1431 0 : aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".ctl") );
1432 0 : aNewSelector.Append( aPseudo );
1433 : {
1434 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1435 0 : true, &aNewSelector );
1436 0 : rHTMLWrt.OutCSS1_SfxItemSet( aScriptItemSet, sal_False );
1437 0 : }
1438 : }
1439 : else
1440 : {
1441 : // If ther are script dependencies and we are derived from a tag,
1442 : // when we have to export a style dependent class for all
1443 : // scripts
1444 0 : String aNewSelector( aSelector );
1445 0 : aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-western") );
1446 0 : aNewSelector.Append( aPseudo );
1447 : {
1448 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_WESTERN|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1449 0 : true, &aNewSelector );
1450 0 : rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False );
1451 : }
1452 :
1453 0 : aNewSelector = aSelector;
1454 0 : aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-cjk") );
1455 0 : aNewSelector.Append( aPseudo );
1456 : {
1457 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1458 0 : true, &aNewSelector );
1459 0 : rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False );
1460 : }
1461 :
1462 0 : aNewSelector = aSelector;
1463 0 : aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-ctl") );
1464 0 : aNewSelector.Append( aPseudo );
1465 : {
1466 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1467 0 : true, &aNewSelector );
1468 0 : rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False );
1469 0 : }
1470 0 : }
1471 : }
1472 : else
1473 : {
1474 : // If there are no script dependencies, when all items are
1475 : // exported in one step. For hyperlinks only, a script information
1476 : // must be there, because these two chr formats don't support
1477 : // script dependencies by now.
1478 : SwCSS1OutMode aMode( rHTMLWrt,
1479 : rHTMLWrt.nCSS1Script|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1480 0 : true, &rSelector );
1481 0 : rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False );
1482 : }
1483 :
1484 0 : return bScriptDependent;
1485 : }
1486 :
1487 0 : static void OutCSS1DropCapRule(
1488 : SwHTMLWriter& rHTMLWrt, const String& rSelector,
1489 : const SwFmtDrop& rDrop, sal_Bool bHasClass,
1490 : bool bHasScriptDependencies )
1491 : {
1492 0 : const SwCharFmt *pDCCharFmt = rDrop.GetCharFmt();
1493 0 : if( (bHasScriptDependencies && bHasClass) ||
1494 0 : (pDCCharFmt && SwHTMLWriter::HasScriptDependentItems( pDCCharFmt->GetAttrSet(), sal_False ) ) )
1495 : {
1496 0 : String aSelector( rSelector );
1497 :
1498 0 : String aPseudo;
1499 0 : xub_StrLen nPos = aSelector.SearchBackward( ':' );
1500 0 : if( STRING_NOTFOUND != nPos )
1501 : {
1502 0 : aPseudo = aSelector.Copy( nPos );
1503 0 : aSelector.Erase( nPos );
1504 : }
1505 :
1506 0 : if( !bHasClass )
1507 : {
1508 : // If we are exporting styles for a tag we have to export a tag
1509 : // rule for all properties that aren't style dependent and
1510 : // some class rule for the additional style dependen properties
1511 : {
1512 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_NO_SCRIPT|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1513 0 : true, &rSelector );
1514 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
1515 : }
1516 :
1517 0 : SfxItemSet aScriptItemSet( rHTMLWrt.pDoc->GetAttrPool(),
1518 : RES_CHRATR_FONT, RES_CHRATR_FONTSIZE,
1519 : RES_CHRATR_LANGUAGE, RES_CHRATR_POSTURE,
1520 : RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT,
1521 : RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_WEIGHT,
1522 0 : 0 );
1523 0 : if( pDCCharFmt )
1524 0 : aScriptItemSet.Set( pDCCharFmt->GetAttrSet(), sal_True );
1525 :
1526 0 : String aNewSelector( aSelector );
1527 0 : aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".western") );
1528 0 : aNewSelector.Append( aPseudo );
1529 : {
1530 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_WESTERN|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1531 0 : true, &aNewSelector );
1532 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop, &aScriptItemSet );
1533 : }
1534 :
1535 0 : aNewSelector = aSelector;
1536 0 : aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".cjk") );
1537 0 : aNewSelector.Append( aPseudo );
1538 : {
1539 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1540 0 : true, &aNewSelector );
1541 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop, &aScriptItemSet );
1542 : }
1543 :
1544 0 : aNewSelector = aSelector;
1545 0 : aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".ctl") );
1546 0 : aNewSelector.Append( aPseudo );
1547 : {
1548 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1549 0 : true, &aNewSelector );
1550 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop, &aScriptItemSet );
1551 0 : }
1552 : }
1553 : else
1554 : {
1555 : // If ther are script dependencies and we are derived from a tag,
1556 : // when we have to export a style dependent class for all
1557 : // scripts
1558 0 : String aNewSelector( aSelector );
1559 0 : aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-western") );
1560 0 : aNewSelector.Append( aPseudo );
1561 : {
1562 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_WESTERN|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1563 0 : true, &aNewSelector );
1564 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
1565 : }
1566 :
1567 0 : aNewSelector = aSelector;
1568 0 : aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-cjk") );
1569 0 : aNewSelector.Append( aPseudo );
1570 : {
1571 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1572 0 : true, &aNewSelector );
1573 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
1574 : }
1575 :
1576 0 : aNewSelector = aSelector;
1577 0 : aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-ctl") );
1578 0 : aNewSelector.Append( aPseudo );
1579 : {
1580 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1581 0 : true, &aNewSelector );
1582 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
1583 0 : }
1584 0 : }
1585 : }
1586 : else
1587 : {
1588 : // If there are no script dependencies, when all items are
1589 : // exported in one step. For hyperlinks only, a script information
1590 : // must be there, because these two chr formats don't support
1591 : // script dependencies by now.
1592 : SwCSS1OutMode aMode( rHTMLWrt,
1593 : rHTMLWrt.nCSS1Script|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
1594 0 : true, &rSelector );
1595 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
1596 : }
1597 0 : }
1598 :
1599 0 : static Writer& OutCSS1_SwFmt( Writer& rWrt, const SwFmt& rFmt,
1600 : IDocumentStylePoolAccess/*SwDoc*/ *pDoc, SwDoc *pTemplate )
1601 : {
1602 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1603 :
1604 0 : bool bCharFmt = false;
1605 0 : switch( rFmt.Which() )
1606 : {
1607 : case RES_CHRFMT:
1608 0 : bCharFmt = true;
1609 0 : break;
1610 :
1611 : case RES_TXTFMTCOLL:
1612 : case RES_CONDTXTFMTCOLL:
1613 : // diese Vorlagen-Typen koennen exportiert werden
1614 0 : break;
1615 :
1616 : default:
1617 : // und diese nicht
1618 0 : return rWrt;
1619 : }
1620 :
1621 : // den Selector und die auszugebende Attr-Set-Tiefe ermitteln
1622 0 : String aSelector;
1623 0 : sal_uInt16 nRefPoolId = 0;
1624 0 : sal_uInt16 nDeep = GetCSS1Selector( &rFmt, aSelector, nRefPoolId );
1625 0 : if( !nDeep )
1626 0 : return rWrt; // von keiner HTML-Vorlage abgeleitet
1627 :
1628 0 : sal_uInt16 nPoolFmtId = rFmt.GetPoolFmtId();
1629 :
1630 : // Den auszugebenden Attr-Set bestimmen. Hier muessen 3 Faelle
1631 : // unterschieden werden:
1632 : // - HTML-Tag-Vorlagen (nDeep==USHRT_MAX):
1633 : // Es werden die Attrs ausgegeben
1634 : // - die in der Vorlage gesetzt sind, aber nicht im Original aus
1635 : // der HTML-Vorlage
1636 : // - die Default-Attrs fuer die Attrs, die im Original aus der
1637 : // HTML-Vorlage gesetzt sind, aber nicht in der vorliegeden Vorlage.
1638 : // - direkt von HTML-Vorlagen abgeleitete Vorlagen (nDeep==1):
1639 : // Es weren nur die Attribute des Vorlagen-Item-Set ohne seine
1640 : // Parents ausgegeben.
1641 : // - indirekt von HTML-Tag-Vorlagen abgeleitete Vorlagen (nDeep>1)
1642 : // Es werden die Attribute des Vorlagen-Item-Sets inkl. seiner Parents,
1643 : // aber ohne die Attribute, die in der HTML-Tag-Vorlage gesetzt sind,
1644 : // ausgegeben.
1645 :
1646 : // einen Item-Set mit allen Attributen aus der Vorlage anlegen
1647 : // (ausser fuer nDeep==1)
1648 0 : const SfxItemSet& rFmtItemSet = rFmt.GetAttrSet();
1649 0 : SfxItemSet aItemSet( *rFmtItemSet.GetPool(), rFmtItemSet.GetRanges() );
1650 0 : aItemSet.Set( rFmtItemSet, sal_True ); // Was nDeep!=1 that is not working
1651 : // for script dependent items buts should
1652 : // not make a deifference for any other
1653 :
1654 0 : sal_Bool bSetDefaults = sal_True, bClearSame = sal_True;
1655 0 : const SwFmt *pRefFmt = 0;
1656 0 : const SwFmt *pRefFmtScript = 0;
1657 0 : switch( nDeep )
1658 : {
1659 : case CSS1_FMT_ISTAG:
1660 0 : pRefFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate );
1661 0 : break;
1662 : case CSS1_FMT_CMPREF:
1663 0 : pRefFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pDoc );
1664 0 : pRefFmtScript = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate );
1665 0 : bClearSame = sal_False;
1666 0 : break;
1667 : default:
1668 0 : pRefFmt = SwHTMLWriter::GetParentFmt( rFmt, nDeep );
1669 0 : pRefFmtScript = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate );
1670 0 : bSetDefaults = sal_False;
1671 0 : break;
1672 : }
1673 :
1674 0 : if( pRefFmt )
1675 : {
1676 : // Den Item-Set der Referenz-Vorlage (inkl. seiner Parents) vom
1677 : // ItemSet abziehen
1678 0 : SwHTMLWriter::SubtractItemSet( aItemSet, pRefFmt->GetAttrSet(),
1679 : bSetDefaults, bClearSame,
1680 : pRefFmtScript
1681 : ? &pRefFmtScript->GetAttrSet()
1682 0 : : 0 );
1683 :
1684 0 : if( !bCharFmt )
1685 : {
1686 0 : const SvxULSpaceItem& rULItem = pRefFmt->GetULSpace();
1687 0 : rHTMLWrt.nDfltTopMargin = rULItem.GetUpper();
1688 0 : rHTMLWrt.nDfltBottomMargin = rULItem.GetLower();
1689 : }
1690 : }
1691 0 : else if( CSS1_FMT_ISTAG==nDeep && !bCharFmt )
1692 : {
1693 : // die Default-Abstaende nach oben und unten setzen (fuer den
1694 : // Fall, dass es keine Vorlage als Referenz gibt)
1695 0 : rHTMLWrt.nDfltTopMargin = 0;
1696 0 : rHTMLWrt.nDfltBottomMargin = HTML_PARSPACE;
1697 0 : if( USER_FMT & nPoolFmtId )
1698 : {
1699 : // Benutzer-Vorlagen
1700 0 : const String& rNm = rFmt.GetName();
1701 0 : switch( rNm.GetChar(0) )
1702 : {
1703 0 : case 'D': if( rNm.EqualsAscii("DD 1") || rNm.EqualsAscii("DT 1") )
1704 0 : rHTMLWrt.nDfltBottomMargin = 0;
1705 0 : break;
1706 0 : case 'L': if(rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_listing) )
1707 0 : rHTMLWrt.nDfltBottomMargin = 0;
1708 0 : break;
1709 0 : case 'P': if( rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_preformtxt) )
1710 0 : rHTMLWrt.nDfltBottomMargin = 0;
1711 0 : break;
1712 0 : case 'X': if( rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_xmp) )
1713 0 : rHTMLWrt.nDfltBottomMargin = 0;
1714 0 : break;
1715 : }
1716 : }
1717 : else
1718 : {
1719 : // Pool-Vorlagen
1720 0 : switch( nPoolFmtId )
1721 : {
1722 : case RES_POOLCOLL_HEADLINE1:
1723 : case RES_POOLCOLL_HEADLINE2:
1724 : case RES_POOLCOLL_HEADLINE3:
1725 : case RES_POOLCOLL_HEADLINE4:
1726 : case RES_POOLCOLL_HEADLINE5:
1727 : case RES_POOLCOLL_HEADLINE6:
1728 0 : rHTMLWrt.nDfltTopMargin = HTML_HEADSPACE;
1729 0 : break;
1730 : case RES_POOLCOLL_SENDADRESS:
1731 : case RES_POOLCOLL_HTML_DT:
1732 : case RES_POOLCOLL_HTML_DD:
1733 : case RES_POOLCOLL_HTML_PRE:
1734 0 : rHTMLWrt.nDfltBottomMargin = 0;
1735 0 : break;
1736 : }
1737 : }
1738 : }
1739 :
1740 : // wo nicht auszugeben ist ...
1741 0 : if( !aItemSet.Count() )
1742 0 : return rWrt;
1743 :
1744 : // There is no support for script dependent hyperlinks by now.
1745 0 : bool bCheckForPseudo = false;
1746 0 : if( bCharFmt &&
1747 : (RES_POOLCHR_INET_NORMAL==nRefPoolId ||
1748 : RES_POOLCHR_INET_VISIT==nRefPoolId) )
1749 0 : bCheckForPseudo = true;
1750 :
1751 :
1752 : // jetzt die Attribute (inkl. Selektor) ausgeben
1753 0 : bool bHasScriptDependencies = false;
1754 0 : if( OutCSS1Rule( rHTMLWrt, aSelector, aItemSet, CSS1_FMT_ISTAG != nDeep,
1755 0 : bCheckForPseudo ) )
1756 : {
1757 0 : if( bCharFmt )
1758 0 : rHTMLWrt.aScriptTextStyles.insert( rFmt.GetName() );
1759 : else
1760 : {
1761 0 : if( nPoolFmtId==RES_POOLCOLL_TEXT )
1762 0 : rHTMLWrt.aScriptParaStyles.insert( pDoc->GetTxtCollFromPool( RES_POOLCOLL_STANDARD, false )->GetName() );
1763 0 : rHTMLWrt.aScriptParaStyles.insert( rFmt.GetName() );
1764 : }
1765 0 : bHasScriptDependencies = true;
1766 : }
1767 :
1768 0 : if( nPoolFmtId==RES_POOLCOLL_TEXT && !rHTMLWrt.bFirstCSS1Property )
1769 0 : rHTMLWrt.bPoolCollTextModified = sal_True;
1770 :
1771 : // Drop-Caps ausgeben
1772 : const SfxPoolItem *pItem;
1773 0 : if( SFX_ITEM_SET==aItemSet.GetItemState( RES_PARATR_DROP, sal_False, &pItem ))
1774 : {
1775 0 : String sOut( aSelector );
1776 0 : sOut.Append( ':');
1777 0 : sOut.AppendAscii( sCSS1_first_letter );
1778 0 : const SwFmtDrop *pDrop = (const SwFmtDrop *)pItem;
1779 0 : OutCSS1DropCapRule( rHTMLWrt, sOut, *pDrop, CSS1_FMT_ISTAG != nDeep, bHasScriptDependencies );
1780 : }
1781 :
1782 0 : return rWrt;
1783 : }
1784 :
1785 0 : static Writer& OutCSS1_SwPageDesc( Writer& rWrt, const SwPageDesc& rPageDesc,
1786 : IDocumentStylePoolAccess/*SwDoc*/ *pDoc, SwDoc *pTemplate,
1787 : sal_uInt16 nRefPoolId, bool bExtRef,
1788 : bool bPseudo )
1789 : {
1790 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1791 :
1792 0 : const SwPageDesc* pRefPageDesc = 0;
1793 0 : if( !bExtRef )
1794 0 : pRefPageDesc = pDoc->GetPageDescFromPool( nRefPoolId, false );
1795 0 : else if( pTemplate )
1796 0 : pRefPageDesc = pTemplate->GetPageDescFromPool( nRefPoolId, false );
1797 :
1798 0 : String aSelector = rtl::OUString('@');
1799 0 : aSelector.AppendAscii( sCSS1_page );
1800 :
1801 0 : if( bPseudo )
1802 : {
1803 0 : const sal_Char *pPseudo = 0;
1804 0 : switch( rPageDesc.GetPoolFmtId() )
1805 : {
1806 0 : case RES_POOLPAGE_FIRST: pPseudo = sCSS1_first; break;
1807 0 : case RES_POOLPAGE_LEFT: pPseudo = sCSS1_left; break;
1808 0 : case RES_POOLPAGE_RIGHT: pPseudo = sCSS1_right; break;
1809 : }
1810 0 : if( pPseudo )
1811 : {
1812 0 : aSelector.Append( ':' );
1813 0 : aSelector.AppendAscii( pPseudo );
1814 : }
1815 : }
1816 :
1817 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_RULE_ON|CSS1_OUTMODE_TEMPLATE,
1818 0 : true, &aSelector );
1819 :
1820 : // Die Groesse: Wenn sie sich nur durch das Landscape-Flag unterscheidet,
1821 : // wird nur Portrait oder Landscape exportiert. Sonst wird die Groesse
1822 : // exportiert.
1823 0 : sal_Bool bRefLandscape = pRefPageDesc ? pRefPageDesc->GetLandscape() : sal_False;
1824 0 : Size aRefSz;
1825 0 : const Size& rSz = rPageDesc.GetMaster().GetFrmSize().GetSize();
1826 0 : if( pRefPageDesc )
1827 : {
1828 0 : aRefSz = pRefPageDesc->GetMaster().GetFrmSize().GetSize();
1829 0 : if( bRefLandscape != rPageDesc.GetLandscape() )
1830 : {
1831 0 : long nTmp = aRefSz.Height();
1832 0 : aRefSz.Height() = aRefSz.Width();
1833 0 : aRefSz.Width() = nTmp;
1834 : }
1835 : }
1836 :
1837 : // Boeser uebler Hack: Auf der Seiten-Tabpage gibt es leichte
1838 : // Rundungsfehler bei der Seitengroesse. Unter anderem wegen bug
1839 : // 25535 wird dummerweise auch noch immer Size-Item vom Dialog geputtet,
1840 : // auch wenn man gar nichts geaendert hat. Folge: Sobald man einmal im
1841 : // Seiten-Dialog war und ihn mit OK verlassen hat, bekommt man eine
1842 : // neue Seitengroesse, die dann hier exportiert wuerde. Um das
1843 : // vermeiden erlauben wir hier kleine Abweichungen.
1844 0 : if( Abs( rSz.Width() - aRefSz.Width() ) <= 2 &&
1845 0 : Abs( rSz.Height() - aRefSz.Height() ) <= 2 )
1846 : {
1847 0 : if( bRefLandscape != rPageDesc.GetLandscape() )
1848 : {
1849 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_size,
1850 0 : rPageDesc.GetLandscape() ? sCSS1_PV_landscape
1851 0 : : sCSS1_PV_portrait );
1852 : }
1853 : }
1854 : else
1855 : {
1856 0 : rtl::OStringBuffer sVal;
1857 0 : AddUnitPropertyValue(sVal, rSz.Width(), rHTMLWrt.GetCSS1Unit());
1858 0 : sVal.append(' ');
1859 0 : AddUnitPropertyValue(sVal, rSz.Height(), rHTMLWrt.GetCSS1Unit());
1860 0 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_size, sVal.makeStringAndClear());
1861 : }
1862 :
1863 : // Die Abstand-Attribute koennen auf gwohnte Weise exportiert werden
1864 0 : const SwFrmFmt &rMaster = rPageDesc.GetMaster();
1865 0 : SfxItemSet aItemSet( *rMaster.GetAttrSet().GetPool(),
1866 0 : RES_LR_SPACE, RES_UL_SPACE );
1867 0 : aItemSet.Set( rMaster.GetAttrSet(), sal_True );
1868 :
1869 0 : if( pRefPageDesc )
1870 : {
1871 : SwHTMLWriter::SubtractItemSet( aItemSet,
1872 0 : pRefPageDesc->GetMaster().GetAttrSet(),
1873 0 : sal_True );
1874 : }
1875 :
1876 0 : OutCSS1_SvxULSpace_SvxLRSpace( rWrt, aItemSet, sal_False );
1877 :
1878 : // Wenn fuer einen Pseudo-Selektor keine Property ausgegeben wurde, muessen
1879 : // wir trotzdem etwas ausgeben, damit beim Import die entsprechende
1880 : // Vorlage angelegt wird.
1881 0 : if( rHTMLWrt.bFirstCSS1Property && bPseudo )
1882 : {
1883 0 : rHTMLWrt.OutNewLine();
1884 0 : rtl::OString sTmp(rtl::OUStringToOString(aSelector, rHTMLWrt.eDestEnc));
1885 0 : rWrt.Strm() << sTmp.getStr() << " {";
1886 0 : rHTMLWrt.bFirstCSS1Property = sal_False;
1887 : }
1888 :
1889 0 : if( !rHTMLWrt.bFirstCSS1Property )
1890 0 : rWrt.Strm() << sCSS1_rule_end;
1891 :
1892 0 : return rWrt;
1893 : }
1894 :
1895 0 : static Writer& OutCSS1_SwFtnInfo( Writer& rWrt, const SwEndNoteInfo& rInfo,
1896 : SwDoc *pDoc, sal_uInt16 nNotes, bool bEndNote )
1897 : {
1898 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1899 :
1900 0 : String aSelector;
1901 :
1902 0 : if( nNotes > 0 )
1903 : {
1904 0 : aSelector.AssignAscii( OOO_STRING_SVTOOLS_HTML_anchor );
1905 0 : aSelector.Append( '.');
1906 : aSelector.AppendAscii( bEndNote ? OOO_STRING_SVTOOLS_HTML_sdendnote_anc
1907 0 : : OOO_STRING_SVTOOLS_HTML_sdfootnote_anc );
1908 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
1909 0 : true, &aSelector );
1910 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_size,
1911 0 : sHTML_FTN_fontheight );
1912 0 : rHTMLWrt.Strm() << sCSS1_rule_end;
1913 : }
1914 :
1915 0 : const SwCharFmt *pSymCharFmt = rInfo.GetCharFmt( *pDoc );
1916 0 : if( pSymCharFmt )
1917 : {
1918 0 : const SfxItemSet& rFmtItemSet = pSymCharFmt->GetAttrSet();
1919 0 : SfxItemSet aItemSet( *rFmtItemSet.GetPool(), rFmtItemSet.GetRanges() );
1920 0 : aItemSet.Set( rFmtItemSet, sal_True );
1921 :
1922 : // Wenn es Fuss- bzw. Endnoten gibt, dann muessen alles Attribute
1923 : // ausgegeben werden, damit Netscape das Dokument richtig anzeigt.
1924 : // Anderenfalls genuegt es, die Unterschiede zur Fuss-/Endnoten
1925 : // Vorlage rauszuschreiben.
1926 0 : if( nNotes == 0 && rHTMLWrt.pTemplate )
1927 : {
1928 : SwFmt *pRefFmt = rHTMLWrt.pTemplate->GetCharFmtFromPool(
1929 0 : static_cast< sal_uInt16 >(bEndNote ? RES_POOLCHR_ENDNOTE : RES_POOLCHR_FOOTNOTE) );
1930 0 : if( pRefFmt )
1931 0 : SwHTMLWriter::SubtractItemSet( aItemSet, pRefFmt->GetAttrSet(),
1932 0 : sal_True );
1933 : }
1934 0 : if( aItemSet.Count() )
1935 : {
1936 0 : aSelector.AssignAscii( OOO_STRING_SVTOOLS_HTML_anchor );
1937 0 : aSelector.Append( '.');
1938 : aSelector.AppendAscii( bEndNote ? OOO_STRING_SVTOOLS_HTML_sdendnote_sym
1939 0 : : OOO_STRING_SVTOOLS_HTML_sdfootnote_sym );
1940 0 : if( OutCSS1Rule( rHTMLWrt, aSelector, aItemSet, sal_True, false ))
1941 0 : rHTMLWrt.aScriptTextStyles.insert( pSymCharFmt->GetName() );
1942 0 : }
1943 : }
1944 :
1945 0 : return rWrt;
1946 : }
1947 :
1948 0 : Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet,
1949 : String aEmbBGGrfName )
1950 : {
1951 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
1952 :
1953 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
1954 0 : CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_BODY );
1955 :
1956 :
1957 : // Es werden nur die Attribute der Seiten-Vorlage ausgegeben.
1958 : // Die Attribute der Standard-Absatz-Vorlage werden schon beim
1959 : // Export der Absatz-Vorlagen beruecksichtigt.
1960 :
1961 : const SfxPoolItem *pItem;
1962 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BACKGROUND, sal_False,
1963 0 : &pItem ) )
1964 : {
1965 : OutCSS1_SvxBrush( rWrt, *pItem, CSS1_BACKGROUND_PAGE,
1966 0 : &aEmbBGGrfName );
1967 : }
1968 :
1969 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BOX, sal_False,
1970 0 : &pItem ))
1971 : {
1972 0 : OutCSS1_SvxBox( rWrt, *pItem );
1973 : }
1974 :
1975 0 : if( !rHTMLWrt.bFirstCSS1Property )
1976 : {
1977 : // wenn eine Property als Bestandteil einer Style-Option
1978 : // ausgegeben wurde, muss die Optiomn noch beendet werden
1979 0 : rWrt.Strm() << '\"';
1980 : }
1981 :
1982 0 : return rWrt;
1983 : }
1984 :
1985 0 : Writer& OutCSS1_ParaTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet )
1986 : {
1987 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
1988 :
1989 : SwCSS1OutMode aMode( rHTMLWrt, rHTMLWrt.nCSS1Script|CSS1_OUTMODE_STYLE_OPT |
1990 0 : CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_PARA );
1991 0 : rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False );
1992 :
1993 0 : return rWrt;
1994 : }
1995 :
1996 0 : Writer& OutCSS1_HintSpanTag( Writer& rWrt, const SfxPoolItem& rHt )
1997 : {
1998 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
1999 :
2000 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_SPAN_TAG |
2001 0 : CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_HINT );
2002 :
2003 0 : Out( aCSS1AttrFnTab, rHt, rWrt );
2004 :
2005 0 : if( !rHTMLWrt.bFirstCSS1Property && rHTMLWrt.bTagOn )
2006 0 : rWrt.Strm() << sCSS1_span_tag_end;
2007 :
2008 0 : return rWrt;
2009 : }
2010 :
2011 0 : Writer& OutCSS1_HintStyleOpt( Writer& rWrt, const SfxPoolItem& rHt )
2012 : {
2013 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2014 :
2015 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
2016 : CSS1_OUTMODE_ENCODE|
2017 0 : CSS1_OUTMODE_HINT );
2018 :
2019 0 : Out( aCSS1AttrFnTab, rHt, rWrt );
2020 :
2021 0 : if( !rHTMLWrt.bFirstCSS1Property )
2022 0 : rWrt.Strm() << '\"';
2023 :
2024 0 : return rWrt;
2025 : }
2026 :
2027 : // Wrapper fuer die Ausgabe von Tabellen-Hintergruenden
2028 0 : Writer& OutCSS1_TableBGStyleOpt( Writer& rWrt, const SfxPoolItem& rHt )
2029 : {
2030 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2031 :
2032 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
2033 : CSS1_OUTMODE_ENCODE|
2034 0 : CSS1_OUTMODE_TABLEBOX );
2035 0 : OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_TABLE, 0 );
2036 :
2037 0 : if( !rHTMLWrt.bFirstCSS1Property )
2038 0 : rWrt.Strm() << '\"';
2039 :
2040 0 : return rWrt;
2041 : }
2042 :
2043 :
2044 0 : Writer& OutCSS1_NumBulListStyleOpt( Writer& rWrt, const SwNumRule& rNumRule,
2045 : sal_uInt8 nLevel )
2046 : {
2047 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2048 :
2049 : SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT |
2050 0 : CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_PARA );
2051 :
2052 0 : const SwNumFmt& rNumFmt = rNumRule.Get( nLevel );
2053 :
2054 0 : long nLSpace = rNumFmt.GetAbsLSpace();
2055 0 : long nFirstLineOffset = rNumFmt.GetFirstLineOffset();
2056 0 : long nDfltFirstLineOffset = HTML_NUMBUL_INDENT;
2057 0 : if( nLevel > 0 )
2058 : {
2059 0 : const SwNumFmt& rPrevNumFmt = rNumRule.Get( nLevel-1 );
2060 0 : nLSpace -= rPrevNumFmt.GetAbsLSpace();
2061 0 : nDfltFirstLineOffset = rPrevNumFmt.GetFirstLineOffset();
2062 : }
2063 :
2064 0 : if( rHTMLWrt.IsHTMLMode(HTMLMODE_LSPACE_IN_NUMBUL) &&
2065 : nLSpace != HTML_NUMBUL_MARGINLEFT )
2066 0 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_left, nLSpace );
2067 :
2068 0 : if( rHTMLWrt.IsHTMLMode(HTMLMODE_FRSTLINE_IN_NUMBUL) &&
2069 : nFirstLineOffset != nDfltFirstLineOffset )
2070 0 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_text_indent, nFirstLineOffset );
2071 :
2072 0 : if( !rHTMLWrt.bFirstCSS1Property )
2073 0 : rWrt.Strm() << '\"';
2074 :
2075 0 : return rWrt;
2076 : }
2077 :
2078 : //-----------------------------------------------------------------------
2079 :
2080 0 : void SwHTMLWriter::OutCSS1_FrmFmtOptions( const SwFrmFmt& rFrmFmt,
2081 : sal_uInt32 nFrmOpts,
2082 : const SdrObject *pSdrObj,
2083 : const SfxItemSet *pItemSet )
2084 : {
2085 : SwCSS1OutMode aMode( *this, CSS1_OUTMODE_STYLE_OPT_ON |
2086 : CSS1_OUTMODE_ENCODE|
2087 0 : CSS1_OUTMODE_FRAME );
2088 :
2089 0 : const SwFmtHoriOrient& rHoriOri = rFrmFmt.GetHoriOrient();
2090 0 : SvxLRSpaceItem aLRItem( rFrmFmt.GetLRSpace() );
2091 0 : SvxULSpaceItem aULItem( rFrmFmt.GetULSpace() );
2092 0 : if( nFrmOpts & HTML_FRMOPT_S_ALIGN )
2093 : {
2094 0 : const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor();
2095 0 : switch( rAnchor.GetAnchorId() )
2096 : {
2097 : case FLY_AT_PARA:
2098 : case FLY_AT_CHAR:
2099 0 : if( text::RelOrientation::FRAME == rHoriOri.GetRelationOrient() ||
2100 0 : text::RelOrientation::PRINT_AREA == rHoriOri.GetRelationOrient() )
2101 : {
2102 0 : if( !(nFrmOpts & HTML_FRMOPT_ALIGN) )
2103 : {
2104 : // float
2105 0 : const sal_Char *pStr = text::HoriOrientation::RIGHT==rHoriOri.GetHoriOrient()
2106 : ? sCSS1_PV_right
2107 0 : : sCSS1_PV_left;
2108 0 : OutCSS1_PropertyAscii( sCSS1_P_float, pStr );
2109 : }
2110 0 : break;
2111 : }
2112 :
2113 : case FLY_AT_PAGE:
2114 : case FLY_AT_FLY:
2115 : {
2116 : // position
2117 0 : OutCSS1_PropertyAscii( sCSS1_P_position, sCSS1_PV_absolute );
2118 :
2119 : // Fuer top/left muessen die Abstaende des Rahmens von
2120 : // der Position abgezogen werden, da sie in CSS1 noch
2121 : // zur Position addiert werden.
2122 : // Das funktioniert auch fuer automatisch ausgerichtete
2123 : // Rahmen, obwohl der Abstand da ja auch im Writer noch
2124 : // addiert wird. Denn auch in diesem Fall enthalten
2125 : // die Orient-Attribute die korrekte Position
2126 :
2127 : // top
2128 0 : long nXPos=0, nYPos=0;
2129 0 : bool bOutXPos = false, bOutYPos = false;
2130 0 : if( RES_DRAWFRMFMT == rFrmFmt.Which() )
2131 : {
2132 : OSL_ENSURE( pSdrObj, "Kein SdrObject uebergeben. Ineffizient" );
2133 0 : if( !pSdrObj )
2134 0 : pSdrObj = rFrmFmt.FindSdrObject();
2135 : OSL_ENSURE( pSdrObj, "Wo ist das SdrObject" );
2136 0 : if( pSdrObj )
2137 : {
2138 0 : Point aPos( pSdrObj->GetRelativePos() );
2139 0 : nXPos = aPos.A();
2140 0 : nYPos = aPos.B();
2141 : }
2142 0 : bOutXPos = bOutYPos = true;
2143 : }
2144 : else
2145 : {
2146 0 : bOutXPos = text::RelOrientation::CHAR != rHoriOri.GetRelationOrient();
2147 0 : nXPos = text::HoriOrientation::NONE == rHoriOri.GetHoriOrient()
2148 0 : ? rHoriOri.GetPos() : 0;
2149 :
2150 0 : const SwFmtVertOrient& rVertOri = rFrmFmt.GetVertOrient();
2151 0 : bOutYPos = text::RelOrientation::CHAR != rVertOri.GetRelationOrient();
2152 0 : nYPos = text::VertOrientation::NONE == rVertOri.GetVertOrient()
2153 0 : ? rVertOri.GetPos() : 0;
2154 : }
2155 :
2156 0 : if( bOutYPos )
2157 : {
2158 0 : if( IsHTMLMode( HTMLMODE_FLY_MARGINS) )
2159 : {
2160 0 : nYPos -= aULItem.GetUpper();
2161 0 : if( nYPos < 0 )
2162 : {
2163 0 : aULItem.SetUpper( (sal_uInt16)(aULItem.GetUpper() + nYPos) );
2164 0 : nYPos = 0;
2165 : }
2166 : }
2167 :
2168 0 : OutCSS1_UnitProperty( sCSS1_P_top, nYPos );
2169 : }
2170 :
2171 0 : if( bOutXPos )
2172 : {
2173 : // left
2174 0 : if( IsHTMLMode( HTMLMODE_FLY_MARGINS) )
2175 : {
2176 0 : nXPos -= aLRItem.GetLeft();
2177 0 : if( nXPos < 0 )
2178 : {
2179 0 : aLRItem.SetLeft( (sal_uInt16)(aLRItem.GetLeft() + nXPos) );
2180 0 : nXPos = 0;
2181 : }
2182 : }
2183 :
2184 0 : OutCSS1_UnitProperty( sCSS1_P_left, nXPos );
2185 : }
2186 : }
2187 0 : break;
2188 :
2189 : default:
2190 : ;
2191 : }
2192 : }
2193 :
2194 : // width/height
2195 0 : if( nFrmOpts & HTML_FRMOPT_S_SIZE )
2196 : {
2197 0 : if( RES_DRAWFRMFMT == rFrmFmt.Which() )
2198 : {
2199 : OSL_ENSURE( pSdrObj, "Kein SdrObject uebergeben. Ineffizient" );
2200 0 : if( !pSdrObj )
2201 0 : pSdrObj = rFrmFmt.FindSdrObject();
2202 : OSL_ENSURE( pSdrObj, "Wo ist das SdrObject" );
2203 0 : if( pSdrObj )
2204 : {
2205 0 : Size aTwipSz( pSdrObj->GetLogicRect().GetSize() );
2206 0 : if( nFrmOpts & HTML_FRMOPT_S_WIDTH )
2207 : {
2208 0 : if( nFrmOpts & HTML_FRMOPT_S_PIXSIZE )
2209 0 : OutCSS1_PixelProperty( sCSS1_P_width, aTwipSz.Width(),
2210 0 : sal_False );
2211 : else
2212 0 : OutCSS1_UnitProperty( sCSS1_P_width, aTwipSz.Width() );
2213 : }
2214 0 : if( nFrmOpts & HTML_FRMOPT_S_HEIGHT )
2215 : {
2216 0 : if( nFrmOpts & HTML_FRMOPT_S_PIXSIZE )
2217 0 : OutCSS1_PixelProperty( sCSS1_P_height, aTwipSz.Height(),
2218 0 : sal_True );
2219 : else
2220 0 : OutCSS1_UnitProperty( sCSS1_P_height, aTwipSz.Height() );
2221 : }
2222 : }
2223 : }
2224 : else
2225 : {
2226 : OSL_ENSURE( HTML_FRMOPT_ABSSIZE & nFrmOpts,
2227 : "Absolute Groesse wird exportiert" );
2228 : OSL_ENSURE( HTML_FRMOPT_ANYSIZE & nFrmOpts,
2229 : "Jede Groesse wird exportiert" );
2230 0 : sal_uInt16 nMode = 0;
2231 0 : if( nFrmOpts & HTML_FRMOPT_S_WIDTH )
2232 0 : nMode |= CSS1_FRMSIZE_WIDTH;
2233 0 : if( nFrmOpts & HTML_FRMOPT_S_HEIGHT )
2234 0 : nMode |= (CSS1_FRMSIZE_MINHEIGHT|CSS1_FRMSIZE_FIXHEIGHT);
2235 0 : if( nFrmOpts & HTML_FRMOPT_S_PIXSIZE )
2236 0 : nMode |= CSS1_FRMSIZE_PIXEL;
2237 :
2238 0 : OutCSS1_SwFmtFrmSize( *this, rFrmFmt.GetFrmSize(), nMode );
2239 : }
2240 : }
2241 :
2242 0 : const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
2243 : // margin-*
2244 0 : if( (nFrmOpts & HTML_FRMOPT_S_SPACE) &&
2245 0 : IsHTMLMode( HTMLMODE_FLY_MARGINS) )
2246 : {
2247 0 : const SvxLRSpaceItem *pLRItem = 0;
2248 0 : const SvxULSpaceItem *pULItem = 0;
2249 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_LR_SPACE, sal_True ) )
2250 0 : pLRItem = &aLRItem;
2251 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_UL_SPACE, sal_True ) )
2252 0 : pULItem = &aULItem;
2253 0 : if( pLRItem || pULItem )
2254 0 : OutCSS1_SvxULSpace_SvxLRSpace( *this, pULItem, pLRItem );
2255 : }
2256 :
2257 : // border
2258 0 : if( nFrmOpts & HTML_FRMOPT_S_BORDER )
2259 : {
2260 : const SfxPoolItem* pItem;
2261 0 : if( nFrmOpts & HTML_FRMOPT_S_NOBORDER )
2262 0 : OutCSS1_SvxBox( *this, rFrmFmt.GetBox() );
2263 0 : else if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BOX, sal_True, &pItem ) )
2264 0 : OutCSS1_SvxBox( *this, *pItem );
2265 : }
2266 :
2267 : // background (wenn, dann muss auch eine Farbe ausgegeben werden)
2268 0 : if( nFrmOpts & HTML_FRMOPT_S_BACKGROUND )
2269 0 : OutCSS1_FrmFmtBackground( rFrmFmt );
2270 :
2271 0 : if( pItemSet )
2272 0 : OutCSS1_SfxItemSet( *pItemSet, sal_False );
2273 :
2274 0 : if( !bFirstCSS1Property )
2275 0 : Strm() << '\"';
2276 0 : }
2277 :
2278 0 : void SwHTMLWriter::OutCSS1_TableFrmFmtOptions( const SwFrmFmt& rFrmFmt )
2279 : {
2280 : SwCSS1OutMode aMode( *this, CSS1_OUTMODE_STYLE_OPT_ON |
2281 : CSS1_OUTMODE_ENCODE|
2282 0 : CSS1_OUTMODE_TABLE );
2283 :
2284 : const SfxPoolItem *pItem;
2285 0 : const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
2286 0 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BACKGROUND, sal_False, &pItem ) )
2287 0 : OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_TABLE, 0 );
2288 :
2289 0 : if( IsHTMLMode( HTMLMODE_PRINT_EXT ) )
2290 0 : OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( *this, rItemSet, sal_False );
2291 :
2292 0 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_LAYOUT_SPLIT, sal_False, &pItem ) )
2293 0 : OutCSS1_SwFmtLayoutSplit( *this, *pItem );
2294 :
2295 0 : if( !bFirstCSS1Property )
2296 0 : Strm() << '\"';
2297 0 : }
2298 :
2299 0 : void SwHTMLWriter::OutCSS1_TableCellBorderHack(SwFrmFmt const& rFrmFmt)
2300 : {
2301 : SwCSS1OutMode const aMode(*this,
2302 : CSS1_OUTMODE_STYLE_OPT_ON|CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_TABLEBOX,
2303 0 : true, 0);
2304 0 : OutCSS1_SvxBox(*this, rFrmFmt.GetBox());
2305 0 : if (!bFirstCSS1Property)
2306 : {
2307 0 : this->Strm() << cCSS1_style_opt_end;
2308 0 : }
2309 0 : }
2310 :
2311 0 : void SwHTMLWriter::OutCSS1_SectionFmtOptions( const SwFrmFmt& rFrmFmt )
2312 : {
2313 : SwCSS1OutMode aMode( *this, CSS1_OUTMODE_STYLE_OPT_ON |
2314 : CSS1_OUTMODE_ENCODE|
2315 0 : CSS1_OUTMODE_SECTION );
2316 :
2317 : const SfxPoolItem *pItem;
2318 0 : const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
2319 0 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BACKGROUND, sal_False, &pItem ) )
2320 0 : OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_SECTION, 0 );
2321 :
2322 0 : if( !bFirstCSS1Property )
2323 0 : Strm() << '\"';
2324 0 : }
2325 :
2326 0 : static bool OutCSS1_FrmFmtBrush( SwHTMLWriter& rWrt,
2327 : const SvxBrushItem& rBrushItem )
2328 : {
2329 0 : bool bWritten = false;
2330 : /// output brush of frame format, if its background color is not "no fill"/"auto fill"
2331 : /// or it has a background graphic.
2332 0 : if( rBrushItem.GetColor() != COL_TRANSPARENT ||
2333 0 : 0 != rBrushItem.GetGraphicLink() ||
2334 0 : 0 != rBrushItem.GetGraphicPos() )
2335 : {
2336 0 : OutCSS1_SvxBrush( rWrt, rBrushItem, CSS1_BACKGROUND_FLY, 0 );
2337 0 : bWritten = true;
2338 : }
2339 0 : return bWritten;
2340 : }
2341 :
2342 0 : void SwHTMLWriter::OutCSS1_FrmFmtBackground( const SwFrmFmt& rFrmFmt )
2343 : {
2344 : // Wenn der Rahmen selbst einen Hintergrund hat, wird der ausgegeben.
2345 0 : if( OutCSS1_FrmFmtBrush( *this, rFrmFmt.GetBackground() ) )
2346 0 : return;
2347 :
2348 : // Wenn der Rahmen nicht seitengebunden ist, wird sonst muss der
2349 : // Hintergrund vom Anker betrachtet
2350 0 : const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor();
2351 0 : RndStdIds eAnchorId = rAnchor.GetAnchorId();
2352 0 : const SwPosition *pAnchorPos = rAnchor.GetCntntAnchor();
2353 0 : if (FLY_AT_PAGE != eAnchorId && pAnchorPos)
2354 : {
2355 0 : const SwNode& rNode = pAnchorPos->nNode.GetNode();
2356 0 : if( rNode.IsCntntNode() )
2357 : {
2358 : // Wenn der Rahmen in einem Content-Node verankert ist,
2359 : // wird der Hintergrund von Content-Node ausgegeben, wenn
2360 : // der einen hat.
2361 0 : if( OutCSS1_FrmFmtBrush( *this,
2362 0 : rNode.GetCntntNode()->GetSwAttrSet().GetBackground()) )
2363 0 : return;
2364 :
2365 : // Sonst koennen wir evtl. auch in einer Tabelle stehen
2366 0 : const SwTableNode *pTableNd = rNode.FindTableNode();
2367 0 : if( pTableNd )
2368 : {
2369 0 : const SwStartNode *pBoxSttNd = rNode.FindTableBoxStartNode();
2370 : const SwTableBox *pBox =
2371 0 : pTableNd->GetTable().GetTblBox( pBoxSttNd->GetIndex() );
2372 :
2373 : // Wenn die Box einen Hintergrund hat, nehmen wir den.
2374 0 : if( OutCSS1_FrmFmtBrush( *this,
2375 0 : pBox->GetFrmFmt()->GetBackground() ) )
2376 0 : return;
2377 :
2378 : // Sonst betrachten wir den der Lines
2379 0 : const SwTableLine *pLine = pBox->GetUpper();
2380 0 : while( pLine )
2381 : {
2382 0 : if( OutCSS1_FrmFmtBrush( *this,
2383 0 : pLine->GetFrmFmt()->GetBackground() ) )
2384 0 : return;
2385 0 : pBox = pLine->GetUpper();
2386 0 : pLine = pBox ? pBox->GetUpper() : 0;
2387 : }
2388 :
2389 : // Wenn da auch nichts war den der Tabelle.
2390 0 : if( OutCSS1_FrmFmtBrush( *this,
2391 0 : pTableNd->GetTable().GetFrmFmt()->GetBackground() ) )
2392 0 : return;
2393 : }
2394 :
2395 : }
2396 :
2397 : // Wenn der Anker wieder in einem Fly-Frame steht, dann
2398 : // wird der Hintergrund des Fly-Frames ausgegeben.
2399 0 : const SwFrmFmt *pFrmFmt = rNode.GetFlyFmt();
2400 0 : if( pFrmFmt )
2401 : {
2402 0 : OutCSS1_FrmFmtBackground( *pFrmFmt );
2403 0 : return;
2404 : }
2405 : }
2406 :
2407 : // Schliesslich bleibt noch der Hintergrund der Seite uebrig und als
2408 : // letzte Rettung das Item der Config.
2409 : OSL_ENSURE( pCurrPageDesc, "Keine Seiten-Vorlage gemerkt" );
2410 0 : if( !OutCSS1_FrmFmtBrush( *this,
2411 0 : pCurrPageDesc->GetMaster().GetBackground() ) )
2412 : {
2413 0 : Color aColor( COL_WHITE );
2414 :
2415 : // Die Hintergrund-Farbe wird normalerweise nur in Browse-Mode
2416 : // benutzt. Wir benutzen si bei einem HTML-Dokument immer und
2417 : // bei einem Text-Dokument nur, wenn es im Browse-Mode angezeigt
2418 : // wird.
2419 0 : if( pDoc->get(IDocumentSettingAccess::HTML_MODE) ||
2420 0 : pDoc->get(IDocumentSettingAccess::BROWSE_MODE))
2421 : {
2422 0 : ViewShell *pVSh = 0;
2423 0 : pDoc->GetEditShell( &pVSh );
2424 0 : if ( pVSh &&
2425 0 : COL_TRANSPARENT != pVSh->GetViewOptions()->GetRetoucheColor().GetColor())
2426 0 : aColor = pVSh->GetViewOptions()->GetRetoucheColor().GetColor();
2427 : }
2428 :
2429 0 : OutCSS1_PropertyAscii(sCSS1_P_background, GetCSS1Color(aColor));
2430 : }
2431 : }
2432 :
2433 : //-----------------------------------------------------------------------
2434 :
2435 0 : static Writer& OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( Writer& rWrt,
2436 : const SvxUnderlineItem *pUItem,
2437 : const SvxOverlineItem *pOItem,
2438 : const SvxCrossedOutItem *pCOItem,
2439 : const SvxBlinkItem *pBItem )
2440 : {
2441 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2442 0 : bool bNone = false;
2443 :
2444 0 : const sal_Char *pUStr = 0;
2445 0 : if( pUItem )
2446 : {
2447 0 : switch( pUItem->GetLineStyle() )
2448 : {
2449 : case UNDERLINE_NONE:
2450 0 : bNone = true;
2451 0 : break;
2452 : case UNDERLINE_DONTKNOW:
2453 0 : break;
2454 : default:
2455 0 : if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2456 : {
2457 : // das geht auch in HTML und muss nicht als STYLE-Option
2458 : // und darf nicht als Hint geschrieben werden
2459 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2460 : "Underline als Hint schreiben?" );
2461 0 : pUStr = sCSS1_PV_underline;
2462 : }
2463 0 : break;
2464 : }
2465 : }
2466 :
2467 0 : const sal_Char *pOStr = 0;
2468 0 : if( pOItem )
2469 : {
2470 0 : switch( pOItem->GetLineStyle() )
2471 : {
2472 : case UNDERLINE_NONE:
2473 0 : bNone = true;
2474 0 : break;
2475 : case UNDERLINE_DONTKNOW:
2476 0 : break;
2477 : default:
2478 0 : if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2479 : {
2480 : // das geht auch in HTML und muss nicht als STYLE-Option
2481 : // und darf nicht als Hint geschrieben werden
2482 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2483 : "Overline als Hint schreiben?" );
2484 0 : pOStr = sCSS1_PV_overline;
2485 : }
2486 0 : break;
2487 : }
2488 : }
2489 :
2490 0 : const sal_Char *pCOStr = 0;
2491 0 : if( pCOItem )
2492 : {
2493 0 : switch( pCOItem->GetStrikeout() )
2494 : {
2495 : case STRIKEOUT_NONE:
2496 0 : bNone = true;
2497 0 : break;
2498 : case STRIKEOUT_DONTKNOW:
2499 0 : break;
2500 : default:
2501 0 : if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2502 : {
2503 : // das geht auch in HTML und muss nicht als STYLE-Option
2504 : // und darf nicht als Hint geschrieben werden
2505 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2506 : "CrossedOut als Hint schreiben?" );
2507 0 : pCOStr = sCSS1_PV_line_through;
2508 : }
2509 0 : break;
2510 : }
2511 : }
2512 :
2513 0 : const sal_Char *pBStr = 0;
2514 0 : if( pBItem )
2515 : {
2516 0 : if( !pBItem->GetValue() )
2517 : {
2518 0 : bNone = true;
2519 : }
2520 0 : else if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2521 : {
2522 : // das geht auch in HTML und muss nicht als STYLE-Option
2523 : // und darf nicht als Hint geschrieben werden
2524 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2525 : "Blink als Hint schreiben?" );
2526 0 : pBStr = sCSS1_PV_blink;
2527 : }
2528 : }
2529 :
2530 0 : rtl::OStringBuffer sOut;
2531 0 : if( pUStr )
2532 0 : sOut.append(pUStr);
2533 :
2534 0 : if( pOStr )
2535 : {
2536 0 : if (sOut.getLength())
2537 0 : sOut.append(' ');
2538 0 : sOut.append(pOStr);
2539 : }
2540 :
2541 0 : if( pCOStr )
2542 : {
2543 0 : if (sOut.getLength())
2544 0 : sOut.append(' ');
2545 0 : sOut.append(pCOStr);
2546 : }
2547 :
2548 0 : if( pBStr )
2549 : {
2550 0 : if (sOut.getLength())
2551 0 : sOut.append(' ');
2552 0 : sOut.append(pBStr);
2553 : }
2554 :
2555 0 : if (sOut.getLength())
2556 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_decoration, sOut.makeStringAndClear() );
2557 0 : else if( bNone )
2558 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_decoration, sCSS1_PV_none );
2559 :
2560 0 : return rWrt;
2561 : }
2562 :
2563 :
2564 0 : static Writer& OutCSS1_SvxCaseMap( Writer& rWrt, const SfxPoolItem& rHt )
2565 : {
2566 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2567 :
2568 0 : switch( ((const SvxCaseMapItem&)rHt).GetCaseMap() )
2569 : {
2570 : case SVX_CASEMAP_NOT_MAPPED:
2571 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_variant, sCSS1_PV_normal );
2572 0 : break;
2573 : case SVX_CASEMAP_KAPITAELCHEN:
2574 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_variant, sCSS1_PV_small_caps );
2575 0 : break;
2576 : case SVX_CASEMAP_VERSALIEN:
2577 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_transform, sCSS1_PV_uppercase );
2578 0 : break;
2579 : case SVX_CASEMAP_GEMEINE:
2580 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_transform, sCSS1_PV_lowercase );
2581 0 : break;
2582 : case SVX_CASEMAP_TITEL:
2583 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_transform, sCSS1_PV_capitalize );
2584 0 : break;
2585 : default:
2586 : ;
2587 : }
2588 :
2589 0 : return rWrt;
2590 : }
2591 :
2592 :
2593 0 : static Writer& OutCSS1_SvxColor( Writer& rWrt, const SfxPoolItem& rHt )
2594 : {
2595 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2596 :
2597 : // Farben muessen nicht in der Style-Option ausgegeben werden.
2598 0 : if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) &&
2599 0 : !rHTMLWrt.bCfgPreferStyles )
2600 0 : return rWrt;
2601 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2602 : "Farbe wirklich als Hint ausgeben?" );
2603 :
2604 0 : Color aColor( ((const SvxColorItem&)rHt).GetValue() );
2605 0 : if( COL_AUTO == aColor.GetColor() )
2606 0 : aColor.SetColor( COL_BLACK );
2607 :
2608 0 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_color, GetCSS1Color(aColor));
2609 :
2610 0 : return rWrt;
2611 : }
2612 :
2613 :
2614 0 : static Writer& OutCSS1_SvxCrossedOut( Writer& rWrt, const SfxPoolItem& rHt )
2615 : {
2616 : // Mit dieser Methode werden nur Hints ausgegeben!
2617 : // Sonst wird OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink() direkt aufgerufen.
2618 :
2619 0 : if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
2620 : OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( rWrt,
2621 0 : 0, 0, (const SvxCrossedOutItem *)&rHt, 0 );
2622 :
2623 0 : return rWrt;
2624 : }
2625 :
2626 0 : static Writer& OutCSS1_SvxFont( Writer& rWrt, const SfxPoolItem& rHt )
2627 : {
2628 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2629 :
2630 : // Fonts muessen nicht in der Style-Option ausgegeben werden.
2631 0 : if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2632 0 : return rWrt;
2633 :
2634 0 : sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
2635 0 : switch( rHt.Which() )
2636 : {
2637 0 : case RES_CHRATR_CJK_FONT: nScript = CSS1_OUTMODE_CJK; break;
2638 0 : case RES_CHRATR_CTL_FONT: nScript = CSS1_OUTMODE_CTL; break;
2639 : }
2640 0 : if( !rHTMLWrt.IsCSS1Script( nScript ) )
2641 0 : return rWrt;
2642 :
2643 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2644 : "Font wirklich als Hint ausgeben?" );
2645 :
2646 0 : String sOut;
2647 : // MS IE3b1 hat mit einfachen Haekchen Probleme
2648 0 : sal_uInt16 nMode = rHTMLWrt.nCSS1OutMode & CSS1_OUTMODE_ANY_ON;
2649 0 : sal_Unicode cQuote = nMode == CSS1_OUTMODE_RULE_ON ? '\"' : '\'';
2650 : SwHTMLWriter::PrepareFontList( ((const SvxFontItem&)rHt), sOut, cQuote,
2651 0 : sal_True );
2652 :
2653 0 : rHTMLWrt.OutCSS1_Property( sCSS1_P_font_family, sOut );
2654 :
2655 0 : return rWrt;
2656 : }
2657 :
2658 0 : static Writer& OutCSS1_SvxFontHeight( Writer& rWrt, const SfxPoolItem& rHt )
2659 : {
2660 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2661 :
2662 : // Font-Hoehen muessen nicht in der Style-Option ausgegeben werden.
2663 : // Fuer Drop-Caps wird ein andewres font-size ausgegeben
2664 0 : if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) ||
2665 0 : rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_DROPCAP ) )
2666 0 : return rWrt;
2667 :
2668 0 : sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
2669 0 : switch( rHt.Which() )
2670 : {
2671 0 : case RES_CHRATR_CJK_FONTSIZE: nScript = CSS1_OUTMODE_CJK; break;
2672 0 : case RES_CHRATR_CTL_FONTSIZE: nScript = CSS1_OUTMODE_CTL; break;
2673 : }
2674 0 : if( !rHTMLWrt.IsCSS1Script( nScript ) )
2675 0 : return rWrt;
2676 :
2677 0 : sal_uInt32 nHeight = ((const SvxFontHeightItem&)rHt).GetHeight();
2678 0 : if( rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT) )
2679 : {
2680 : // einen Hint nur dann ausgeben wenn es auch was bringt
2681 0 : sal_uInt16 nSize = rHTMLWrt.GetHTMLFontSize( nHeight );
2682 0 : if( rHTMLWrt.aFontHeights[nSize-1] == nHeight )
2683 0 : return rWrt;
2684 : }
2685 :
2686 0 : rtl::OStringBuffer sHeight;
2687 0 : sHeight.append(static_cast<sal_Int32>(nHeight/20));
2688 0 : sHeight.append(sCSS1_UNIT_pt);
2689 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_font_size,
2690 0 : sHeight.makeStringAndClear());
2691 :
2692 0 : return rWrt;
2693 : }
2694 :
2695 0 : static Writer& OutCSS1_SvxPosture( Writer& rWrt, const SfxPoolItem& rHt )
2696 : {
2697 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2698 :
2699 0 : sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
2700 0 : switch( rHt.Which() )
2701 : {
2702 0 : case RES_CHRATR_CJK_POSTURE: nScript = CSS1_OUTMODE_CJK; break;
2703 0 : case RES_CHRATR_CTL_POSTURE: nScript = CSS1_OUTMODE_CTL; break;
2704 : }
2705 0 : if( !rHTMLWrt.IsCSS1Script( nScript ) )
2706 0 : return rWrt;
2707 :
2708 0 : const sal_Char *pStr = 0;
2709 0 : switch( ((const SvxPostureItem&)rHt).GetPosture() )
2710 : {
2711 0 : case ITALIC_NONE: pStr = sCSS1_PV_normal; break;
2712 0 : case ITALIC_OBLIQUE: pStr = sCSS1_PV_oblique; break;
2713 : case ITALIC_NORMAL:
2714 0 : if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2715 : {
2716 : // das geht auch in HTML und muss nicht als STYLE-Option
2717 : // und darf nicht als Hint geschrieben werden
2718 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2719 : "Italic als Hint schreiben?" );
2720 0 : pStr = sCSS1_PV_italic;
2721 : }
2722 0 : break;
2723 : default:
2724 : ;
2725 : }
2726 :
2727 0 : if( pStr )
2728 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_style, pStr );
2729 :
2730 0 : return rWrt;
2731 : }
2732 :
2733 0 : static Writer& OutCSS1_SvxKerning( Writer& rWrt, const SfxPoolItem& rHt )
2734 : {
2735 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2736 :
2737 : // Kerning-Item nur ausgeben, wenn volle Style-Unterst?tzung da ist
2738 0 : if( !rHTMLWrt.IsHTMLMode(HTMLMODE_FULL_STYLES) )
2739 0 : return rWrt;
2740 :
2741 0 : sal_Int16 nValue = ((const SvxKerningItem&)rHt).GetValue();
2742 0 : if( nValue )
2743 : {
2744 0 : rtl::OStringBuffer sOut;
2745 0 : if( nValue < 0 )
2746 : {
2747 0 : sOut.append('-');
2748 0 : nValue = -nValue;
2749 : }
2750 :
2751 : // Breite als n.n pt
2752 0 : nValue = (nValue + 1) / 2; // 1/10pt
2753 0 : sOut.append(static_cast<sal_Int32>(nValue / 10));
2754 0 : sOut.append('.');
2755 0 : sOut.append(static_cast<sal_Int32>(nValue % 10));
2756 0 : sOut.append(sCSS1_UNIT_pt);
2757 :
2758 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_letter_spacing,
2759 0 : sOut.makeStringAndClear());
2760 : }
2761 : else
2762 : {
2763 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_letter_spacing,
2764 0 : sCSS1_PV_normal );
2765 : }
2766 :
2767 0 : return rWrt;
2768 : }
2769 :
2770 0 : static Writer& OutCSS1_SvxLanguage( Writer& rWrt, const SfxPoolItem& rHt )
2771 : {
2772 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2773 :
2774 : // Language will be exported rules only
2775 0 : if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2776 0 : return rWrt;
2777 :
2778 0 : sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
2779 0 : switch( rHt.Which() )
2780 : {
2781 0 : case RES_CHRATR_CJK_LANGUAGE: nScript = CSS1_OUTMODE_CJK; break;
2782 0 : case RES_CHRATR_CTL_LANGUAGE: nScript = CSS1_OUTMODE_CTL; break;
2783 : }
2784 0 : if( !rHTMLWrt.IsCSS1Script( nScript ) )
2785 0 : return rWrt;
2786 :
2787 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2788 : "Language wirklich als Hint ausgeben?" );
2789 :
2790 0 : LanguageType eLang = ((const SvxLanguageItem &)rHt).GetLanguage();
2791 0 : if( LANGUAGE_DONTKNOW == eLang )
2792 0 : return rWrt;
2793 :
2794 0 : String sOut = LanguageTag( eLang ).getBcp47();
2795 :
2796 0 : rHTMLWrt.OutCSS1_Property( sCSS1_P_so_language, sOut );
2797 :
2798 0 : return rWrt;
2799 : }
2800 :
2801 0 : static Writer& OutCSS1_SvxUnderline( Writer& rWrt, const SfxPoolItem& rHt )
2802 : {
2803 : // Mit dieser Methode werden nur Hints ausgegeben!
2804 : // Sonst wird OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink() direkt aufgerufen.
2805 :
2806 0 : if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
2807 : OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( rWrt,
2808 0 : (const SvxUnderlineItem *)&rHt, 0, 0, 0 );
2809 :
2810 0 : return rWrt;
2811 : }
2812 :
2813 :
2814 0 : static Writer& OutCSS1_SvxOverline( Writer& rWrt, const SfxPoolItem& rHt )
2815 : {
2816 : // Mit dieser Methode werden nur Hints ausgegeben!
2817 : // Sonst wird OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink() direkt aufgerufen.
2818 :
2819 0 : if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
2820 : OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( rWrt,
2821 0 : 0, (const SvxOverlineItem *)&rHt, 0, 0 );
2822 :
2823 0 : return rWrt;
2824 : }
2825 :
2826 0 : static Writer& OutCSS1_SvxHidden( Writer& rWrt, const SfxPoolItem& rHt )
2827 : {
2828 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2829 :
2830 0 : if ( ((const SvxCharHiddenItem&)rHt).GetValue() )
2831 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_display, sCSS1_PV_none );
2832 :
2833 0 : return rWrt;
2834 : }
2835 :
2836 0 : static Writer& OutCSS1_SvxFontWeight( Writer& rWrt, const SfxPoolItem& rHt )
2837 : {
2838 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2839 :
2840 0 : sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
2841 0 : switch( rHt.Which() )
2842 : {
2843 0 : case RES_CHRATR_CJK_WEIGHT: nScript = CSS1_OUTMODE_CJK; break;
2844 0 : case RES_CHRATR_CTL_WEIGHT: nScript = CSS1_OUTMODE_CTL; break;
2845 : }
2846 0 : if( !rHTMLWrt.IsCSS1Script( nScript ) )
2847 0 : return rWrt;
2848 :
2849 0 : const sal_Char *pStr = 0;
2850 0 : switch( ((const SvxWeightItem&)rHt).GetWeight() )
2851 : {
2852 0 : case WEIGHT_ULTRALIGHT: pStr = sCSS1_PV_extra_light; break;
2853 0 : case WEIGHT_LIGHT: pStr = sCSS1_PV_light; break;
2854 0 : case WEIGHT_SEMILIGHT: pStr = sCSS1_PV_demi_light; break;
2855 0 : case WEIGHT_NORMAL: pStr = sCSS1_PV_normal; break;
2856 0 : case WEIGHT_SEMIBOLD: pStr = sCSS1_PV_demi_bold; break;
2857 : case WEIGHT_BOLD:
2858 0 : if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
2859 : {
2860 : // das geht auch in HTML und muss nicht als STYLE-Option
2861 : // und darf nicht als Hint geschrieben werden
2862 : OSL_ENSURE( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
2863 : "Fett als Hint schreiben?" );
2864 0 : pStr = sCSS1_PV_bold;
2865 : }
2866 0 : break;
2867 0 : case WEIGHT_ULTRABOLD: pStr = sCSS1_PV_extra_bold; break;
2868 : default:
2869 0 : pStr = sCSS1_PV_normal;;
2870 : }
2871 :
2872 0 : if( pStr )
2873 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_weight, pStr );
2874 :
2875 0 : return rWrt;
2876 : }
2877 :
2878 0 : static Writer& OutCSS1_SvxBlink( Writer& rWrt, const SfxPoolItem& rHt )
2879 : {
2880 : // Mit dieser Methode werden nur Hints ausgegeben!
2881 : // Sonst wird OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink() direkt aufgerufen.
2882 :
2883 0 : if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
2884 : OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( rWrt,
2885 0 : 0, 0, 0, (const SvxBlinkItem *)&rHt );
2886 :
2887 0 : return rWrt;
2888 : }
2889 :
2890 0 : static Writer& OutCSS1_SvxLineSpacing( Writer& rWrt, const SfxPoolItem& rHt )
2891 : {
2892 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
2893 :
2894 : // Netscape4 hat massive Probleme mit den Zellenhoehen
2895 : // wenn der Zeilenabstand innerhalb einer Tabelle geaendert wird
2896 : // und die Breite der Tabelle nicht automatisch berechnet wird
2897 : // (also wenn eine WIDTH-Option vorhanden ist).
2898 0 : if( rHTMLWrt.bOutTable && rHTMLWrt.bCfgNetscape4 )
2899 0 : return rWrt;
2900 :
2901 0 : const SvxLineSpacingItem& rLSItem = (const SvxLineSpacingItem&)rHt;
2902 :
2903 0 : sal_uInt16 nHeight = 0;
2904 0 : sal_uInt16 nPrcHeight = 0;
2905 0 : SvxLineSpace eLineSpace = rLSItem.GetLineSpaceRule();
2906 0 : switch( rLSItem.GetInterLineSpaceRule() )
2907 : {
2908 : case SVX_INTER_LINE_SPACE_OFF:
2909 : case SVX_INTER_LINE_SPACE_FIX:
2910 : {
2911 0 : switch( eLineSpace )
2912 : {
2913 : case SVX_LINE_SPACE_MIN:
2914 : case SVX_LINE_SPACE_FIX:
2915 0 : nHeight = rLSItem.GetLineHeight();
2916 0 : break;
2917 : case SVX_LINE_SPACE_AUTO:
2918 0 : nPrcHeight = 100;
2919 0 : break;
2920 : default:
2921 : ;
2922 : }
2923 : }
2924 0 : break;
2925 : case SVX_INTER_LINE_SPACE_PROP:
2926 0 : nPrcHeight = rLSItem.GetPropLineSpace();
2927 0 : break;
2928 :
2929 : default:
2930 : ;
2931 : }
2932 :
2933 0 : if( nHeight )
2934 0 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_line_height, (long)nHeight );
2935 0 : else if( nPrcHeight )
2936 : {
2937 0 : rtl::OStringBuffer sHeight;
2938 0 : sHeight.append(static_cast<sal_Int32>(nPrcHeight));
2939 0 : sHeight.append('%');
2940 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_line_height,
2941 0 : sHeight.makeStringAndClear());
2942 : }
2943 :
2944 0 : return rWrt;
2945 : }
2946 :
2947 0 : static Writer& OutCSS1_SvxAdjust( Writer& rWrt, const SfxPoolItem& rHt )
2948 : {
2949 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
2950 :
2951 : // Alignment in Style-Option nur ausgeben, wenn das Tag kein
2952 : // ALIGN=xxx zulaesst
2953 0 : if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) &&
2954 0 : !rHTMLWrt.bNoAlign)
2955 0 : return rWrt;
2956 :
2957 0 : const sal_Char* pStr = 0;
2958 0 : switch( ((const SvxAdjustItem&)rHt).GetAdjust() )
2959 : {
2960 0 : case SVX_ADJUST_LEFT: pStr = sCSS1_PV_left; break;
2961 0 : case SVX_ADJUST_RIGHT: pStr = sCSS1_PV_right; break;
2962 0 : case SVX_ADJUST_BLOCK: pStr = sCSS1_PV_justify; break;
2963 0 : case SVX_ADJUST_CENTER: pStr = sCSS1_PV_center; break;
2964 : default:
2965 : ;
2966 : }
2967 :
2968 0 : if( pStr )
2969 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_align, pStr );
2970 :
2971 0 : return rWrt;
2972 : }
2973 :
2974 0 : static Writer& OutCSS1_SvxFmtSplit( Writer& rWrt, const SfxPoolItem& rHt )
2975 : {
2976 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
2977 :
2978 0 : const sal_Char *pStr = ((const SvxFmtSplitItem&)rHt).GetValue()
2979 : ? sCSS1_PV_auto
2980 0 : : sCSS1_PV_avoid;
2981 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_inside, pStr );
2982 :
2983 0 : return rWrt;
2984 : }
2985 :
2986 0 : static Writer& OutCSS1_SwFmtLayoutSplit( Writer& rWrt, const SfxPoolItem& rHt )
2987 : {
2988 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
2989 :
2990 0 : const sal_Char *pStr = ((const SwFmtLayoutSplit&)rHt).GetValue()
2991 : ? sCSS1_PV_auto
2992 0 : : sCSS1_PV_avoid;
2993 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_inside, pStr );
2994 :
2995 0 : return rWrt;
2996 : }
2997 :
2998 0 : static Writer& OutCSS1_SvxWidows( Writer& rWrt, const SfxPoolItem& rHt )
2999 : {
3000 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
3001 :
3002 : rtl::OString aStr(rtl::OString::valueOf(static_cast<sal_Int32>(
3003 0 : ((const SvxWidowsItem&)rHt).GetValue())));
3004 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_widows, aStr );
3005 :
3006 0 : return rWrt;
3007 : }
3008 :
3009 0 : static Writer& OutCSS1_SvxOrphans( Writer& rWrt, const SfxPoolItem& rHt )
3010 : {
3011 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
3012 :
3013 : rtl::OString aStr(rtl::OString::valueOf(static_cast<sal_Int32>(
3014 0 : ((const SvxOrphansItem&)rHt).GetValue())));
3015 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_orphans, aStr );
3016 :
3017 0 : return rWrt;
3018 : }
3019 :
3020 0 : static void OutCSS1_SwFmtDropAttrs( SwHTMLWriter& rHWrt,
3021 : const SwFmtDrop& rDrop,
3022 : const SfxItemSet *pCharFmtItemSet )
3023 : {
3024 : // Text fliesst rechts drumrum
3025 0 : rHWrt.OutCSS1_PropertyAscii( sCSS1_P_float, sCSS1_PV_left );
3026 :
3027 : // Anzahl der Zeilen -> %-Angabe fuer Font-Hoehe!
3028 0 : rtl::OStringBuffer sOut;
3029 0 : sOut.append(static_cast<sal_Int32>(rDrop.GetLines()*100));
3030 0 : sOut.append('%');
3031 0 : rHWrt.OutCSS1_PropertyAscii(sCSS1_P_font_size, sOut.makeStringAndClear());
3032 :
3033 : // Abstand zum Text = rechter Rand
3034 0 : sal_uInt16 nDistance = rDrop.GetDistance();
3035 0 : if( nDistance > 0 )
3036 0 : rHWrt.OutCSS1_UnitProperty( sCSS1_P_margin_right, nDistance );
3037 :
3038 0 : const SwCharFmt *pDCCharFmt = rDrop.GetCharFmt();
3039 0 : if( pCharFmtItemSet )
3040 0 : rHWrt.OutCSS1_SfxItemSet( *pCharFmtItemSet );
3041 0 : else if( pDCCharFmt )
3042 0 : rHWrt.OutCSS1_SfxItemSet( pDCCharFmt->GetAttrSet() );
3043 0 : else if( (rHWrt.nCSS1OutMode & CSS1_OUTMODE_ANY_OFF) == CSS1_OUTMODE_RULE_OFF )
3044 0 : rHWrt.Strm() << sCSS1_rule_end;
3045 :
3046 0 : }
3047 :
3048 0 : static Writer& OutCSS1_SwFmtDrop( Writer& rWrt, const SfxPoolItem& rHt )
3049 : {
3050 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
3051 :
3052 : // nie als Option eines Absatzes ausgeben, sondern nur als Hints
3053 0 : if( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT) )
3054 0 : return rWrt;
3055 :
3056 0 : if( rHTMLWrt.bTagOn )
3057 : {
3058 : SwCSS1OutMode aMode( rHTMLWrt,
3059 : rHTMLWrt.nCSS1Script|CSS1_OUTMODE_SPAN_TAG1_ON|CSS1_OUTMODE_ENCODE|
3060 0 : CSS1_OUTMODE_DROPCAP );
3061 :
3062 0 : OutCSS1_SwFmtDropAttrs( rHTMLWrt, (const SwFmtDrop&)rHt );
3063 : // Ein "> wird schon vom aufrufenden OutCSS1_HintAsSpanTag geschrieben.
3064 : }
3065 : else
3066 : {
3067 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_span, sal_False );
3068 : }
3069 :
3070 0 : return rWrt;
3071 : }
3072 :
3073 0 : static Writer& OutCSS1_SwFmtFrmSize( Writer& rWrt, const SfxPoolItem& rHt,
3074 : sal_uInt16 nMode )
3075 : {
3076 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
3077 :
3078 0 : const SwFmtFrmSize& rFSItem = (const SwFmtFrmSize&)rHt;
3079 :
3080 0 : if( nMode & CSS1_FRMSIZE_WIDTH )
3081 : {
3082 0 : sal_uInt8 nPrcWidth = rFSItem.GetWidthPercent();
3083 0 : if( nPrcWidth )
3084 : {
3085 0 : rtl::OStringBuffer sOut;
3086 0 : sOut.append(static_cast<sal_Int32>(nPrcWidth));
3087 0 : sOut.append('%');
3088 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_width,
3089 0 : sOut.makeStringAndClear());
3090 : }
3091 0 : else if( nMode & CSS1_FRMSIZE_PIXEL )
3092 : {
3093 : rHTMLWrt.OutCSS1_PixelProperty( sCSS1_P_width,
3094 0 : rFSItem.GetSize().Width(), sal_False );
3095 : }
3096 : else
3097 : {
3098 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_width,
3099 0 : rFSItem.GetSize().Width() );
3100 : }
3101 : }
3102 :
3103 0 : if( nMode & CSS1_FRMSIZE_ANYHEIGHT )
3104 : {
3105 0 : bool bOutHeight = false;
3106 0 : switch( rFSItem.GetHeightSizeType() )
3107 : {
3108 : case ATT_FIX_SIZE:
3109 0 : bOutHeight = (nMode & CSS1_FRMSIZE_FIXHEIGHT) != 0;
3110 0 : break;
3111 : case ATT_MIN_SIZE:
3112 0 : bOutHeight = (nMode & CSS1_FRMSIZE_MINHEIGHT) != 0;
3113 0 : break;
3114 : case ATT_VAR_SIZE:
3115 0 : bOutHeight = (nMode & CSS1_FRMSIZE_VARHEIGHT) != 0;
3116 0 : break;
3117 : default:
3118 : OSL_ENSURE( bOutHeight, "Hoehe wird nicht exportiert" );
3119 0 : break;
3120 : }
3121 :
3122 0 : if( bOutHeight )
3123 : {
3124 0 : sal_uInt8 nPrcHeight = rFSItem.GetHeightPercent();
3125 0 : if( nPrcHeight )
3126 : {
3127 0 : rtl::OStringBuffer sOut;
3128 0 : sOut.append(static_cast<sal_Int32>(nPrcHeight));
3129 0 : sOut.append('%');
3130 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_height,
3131 0 : sOut.makeStringAndClear());
3132 : }
3133 0 : else if( nMode & CSS1_FRMSIZE_PIXEL )
3134 : {
3135 : rHTMLWrt.OutCSS1_PixelProperty( sCSS1_P_height,
3136 0 : rFSItem.GetSize().Width(),
3137 0 : sal_True );
3138 : }
3139 : else
3140 : {
3141 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_height,
3142 0 : rFSItem.GetSize().Height() );
3143 : }
3144 : }
3145 : }
3146 :
3147 0 : return rWrt;
3148 : }
3149 :
3150 0 : static Writer& OutCSS1_SvxLRSpace( Writer& rWrt, const SfxPoolItem& rHt )
3151 : {
3152 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
3153 :
3154 0 : const SvxLRSpaceItem& rLRItem = (const SvxLRSpaceItem&)rHt;
3155 :
3156 : // Der Export der harten Attributierung ist unnoetig, wenn die
3157 : // neuen Werte denen der aktuellen Vorlage entsprechen
3158 :
3159 : // Einen linken Rand kann es durch eine Liste bereits in der
3160 : // Umgebung geben
3161 0 : long nLeftMargin = (long)rLRItem.GetTxtLeft() - rHTMLWrt.nLeftMargin;
3162 0 : if( rHTMLWrt.nDfltLeftMargin != nLeftMargin )
3163 : {
3164 0 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_left, nLeftMargin );
3165 : }
3166 :
3167 0 : if( rHTMLWrt.nDfltRightMargin != rLRItem.GetRight() )
3168 : {
3169 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_right,
3170 0 : (long)rLRItem.GetRight() );
3171 : }
3172 :
3173 : // Der Erstzeilen-Einzug kann den Platz fuer eine Numerierung
3174 : // enthalten
3175 0 : long nFirstLineIndent = (long)rLRItem.GetTxtFirstLineOfst() -
3176 0 : rHTMLWrt.nFirstLineIndent;
3177 0 : if( rHTMLWrt.nDfltFirstLineIndent != nFirstLineIndent )
3178 : {
3179 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_text_indent,
3180 0 : nFirstLineIndent );
3181 : }
3182 :
3183 0 : return rWrt;
3184 : }
3185 :
3186 0 : static Writer& OutCSS1_SvxULSpace( Writer& rWrt, const SfxPoolItem& rHt )
3187 : {
3188 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
3189 :
3190 0 : const SvxULSpaceItem& rULItem = (const SvxULSpaceItem&)rHt;
3191 :
3192 0 : if( rHTMLWrt.nDfltTopMargin != rULItem.GetUpper() )
3193 : {
3194 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_top,
3195 0 : (long)rULItem.GetUpper() );
3196 : }
3197 :
3198 0 : if( rHTMLWrt.nDfltBottomMargin != rULItem.GetLower() )
3199 : {
3200 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_bottom,
3201 0 : (long)rULItem.GetLower() );
3202 : }
3203 :
3204 0 : return rWrt;
3205 : }
3206 :
3207 0 : static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
3208 : const SvxULSpaceItem *pULItem,
3209 : const SvxLRSpaceItem *pLRItem )
3210 : {
3211 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
3212 :
3213 0 : if( pLRItem && pULItem &&
3214 0 : pLRItem->GetLeft() == pLRItem->GetRight() &&
3215 0 : pLRItem->GetLeft() == pULItem->GetUpper() &&
3216 0 : pLRItem->GetLeft() == pULItem->GetLower() &&
3217 0 : pLRItem->GetLeft() != rHTMLWrt.nDfltLeftMargin &&
3218 0 : pLRItem->GetRight() != rHTMLWrt.nDfltRightMargin &&
3219 0 : pULItem->GetUpper() != rHTMLWrt.nDfltTopMargin &&
3220 0 : pULItem->GetLower() != rHTMLWrt.nDfltBottomMargin )
3221 : {
3222 0 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin, (long)pLRItem->GetLeft() );
3223 : }
3224 : else
3225 : {
3226 0 : if( pLRItem )
3227 0 : OutCSS1_SvxLRSpace( rWrt, *pLRItem );
3228 0 : if( pULItem )
3229 0 : OutCSS1_SvxULSpace( rWrt, *pULItem );
3230 : }
3231 :
3232 0 : return rWrt;
3233 : }
3234 :
3235 0 : static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
3236 : const SfxItemSet& rItemSet,
3237 : sal_Bool bDeep )
3238 : {
3239 0 : const SvxULSpaceItem *pULSpace = 0;
3240 0 : const SvxLRSpaceItem *pLRSpace = 0;
3241 : const SfxPoolItem *pItem;
3242 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_LR_SPACE, bDeep, &pItem ) )
3243 0 : pLRSpace = (const SvxLRSpaceItem *)pItem;
3244 :
3245 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_UL_SPACE, bDeep, &pItem ) )
3246 0 : pULSpace = (const SvxULSpaceItem *)pItem;
3247 :
3248 0 : if( pLRSpace || pULSpace )
3249 0 : OutCSS1_SvxULSpace_SvxLRSpace( rWrt, pULSpace, pLRSpace );
3250 :
3251 0 : return rWrt;
3252 : }
3253 :
3254 0 : static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt,
3255 : const SvxFmtBreakItem *pBreakItem,
3256 : const SwFmtPageDesc *pPDescItem,
3257 : const SvxFmtKeepItem *pKeepItem )
3258 : {
3259 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
3260 :
3261 0 : if( !rHTMLWrt.IsHTMLMode(HTMLMODE_PRINT_EXT) )
3262 0 : return rWrt;
3263 :
3264 0 : const sal_Char *pBreakBefore = 0;
3265 0 : const sal_Char *pBreakAfter = 0;
3266 :
3267 0 : if( pKeepItem )
3268 : {
3269 0 : pBreakAfter = pKeepItem->GetValue() ? sCSS1_PV_avoid : sCSS1_PV_auto;
3270 : }
3271 0 : if( pBreakItem )
3272 : {
3273 0 : switch( pBreakItem->GetBreak() )
3274 : {
3275 : case SVX_BREAK_NONE:
3276 0 : pBreakBefore = sCSS1_PV_auto;
3277 0 : if( !pBreakAfter )
3278 0 : pBreakAfter = sCSS1_PV_auto;
3279 0 : break;
3280 :
3281 : case SVX_BREAK_PAGE_BEFORE:
3282 0 : pBreakBefore = sCSS1_PV_always;
3283 0 : break;
3284 :
3285 : case SVX_BREAK_PAGE_AFTER:
3286 0 : pBreakAfter= sCSS1_PV_always;
3287 0 : break;
3288 :
3289 : default:
3290 : ;
3291 : }
3292 : }
3293 0 : if( pPDescItem )
3294 : {
3295 0 : const SwPageDesc *pPDesc = pPDescItem->GetPageDesc();
3296 0 : if( pPDesc )
3297 : {
3298 0 : switch( pPDesc->GetPoolFmtId() )
3299 : {
3300 0 : case RES_POOLPAGE_LEFT: pBreakBefore = sCSS1_PV_left; break;
3301 0 : case RES_POOLPAGE_RIGHT: pBreakBefore = sCSS1_PV_right; break;
3302 0 : default: pBreakBefore = sCSS1_PV_always; break;
3303 : }
3304 : }
3305 0 : else if( !pBreakBefore )
3306 : {
3307 0 : pBreakBefore = sCSS1_PV_auto;
3308 : }
3309 : }
3310 :
3311 0 : if( pBreakBefore )
3312 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_before,
3313 0 : pBreakBefore );
3314 0 : if( pBreakAfter )
3315 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_after,
3316 0 : pBreakAfter );
3317 :
3318 0 : return rWrt;
3319 : }
3320 :
3321 0 : static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt,
3322 : const SfxItemSet& rItemSet,
3323 : sal_Bool bDeep )
3324 : {
3325 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
3326 : const SfxPoolItem *pItem;
3327 0 : const SvxFmtBreakItem *pBreakItem = 0;
3328 0 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BREAK, bDeep, &pItem ))
3329 0 : pBreakItem = (const SvxFmtBreakItem *)pItem;
3330 :
3331 0 : const SwFmtPageDesc *pPDescItem = 0;
3332 0 : if( ( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) ||
3333 0 : !rHTMLWrt.bCSS1IgnoreFirstPageDesc ||
3334 0 : rHTMLWrt.pStartNdIdx->GetIndex() !=
3335 0 : rHTMLWrt.pCurPam->GetPoint()->nNode.GetIndex() ) &&
3336 0 : SFX_ITEM_SET==rItemSet.GetItemState( RES_PAGEDESC, bDeep, &pItem ))
3337 0 : pPDescItem = (const SwFmtPageDesc*)pItem;
3338 :
3339 0 : const SvxFmtKeepItem *pKeepItem = 0;
3340 0 : if( SFX_ITEM_SET==rItemSet.GetItemState( RES_KEEP, bDeep, &pItem ))
3341 0 : pKeepItem = (const SvxFmtKeepItem *)pItem;
3342 :
3343 0 : if( pBreakItem || pPDescItem || pKeepItem )
3344 : OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( rWrt, pBreakItem,
3345 0 : pPDescItem, pKeepItem );
3346 :
3347 0 : return rWrt;
3348 : }
3349 :
3350 : // Wrapper fuer OutCSS1_SfxItemSet etc.
3351 0 : static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt )
3352 : {
3353 0 : OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_ATTR, 0 );
3354 0 : return rWrt;
3355 : }
3356 :
3357 :
3358 0 : static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt,
3359 : sal_uInt16 nMode, const String *pGrfName )
3360 : {
3361 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
3362 :
3363 : // Das Zeichen-Attribut wird nicht ausgegeben, wenn gerade
3364 : // Optionen ausgegeben werden
3365 0 : if( rHt.Which() < RES_CHRATR_END &&
3366 0 : rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
3367 0 : return rWrt;
3368 :
3369 : // Erstmal ein par Werte holen
3370 : // const Brush &rBrush = ((const SvxBrushItem &)rHt).GetBrush();
3371 0 : const Color & rColor = ((const SvxBrushItem &)rHt).GetColor();
3372 : const String *pLink = pGrfName ? pGrfName
3373 0 : : ((const SvxBrushItem &)rHt).GetGraphicLink();
3374 0 : SvxGraphicPosition ePos = ((const SvxBrushItem &)rHt).GetGraphicPos();
3375 :
3376 0 : if( CSS1_BACKGROUND_PAGE==nMode )
3377 : {
3378 : // Fuer Seitenvorlagen wurde der Grafik-Name uebergeben. Es wird
3379 : // nur ein Attribut ausgegeben, wenn die Grafik nicht gekachelt ist.
3380 : OSL_ENSURE( pLink, "Wo ist der Grafik-Name der Seitenvorlage?" );
3381 0 : if( !pLink || !pLink->Len() || GPOS_TILED==ePos )
3382 0 : return rWrt;
3383 : }
3384 :
3385 : // Erstmal die Farbe holen
3386 0 : bool bColor = false;
3387 : /// set <bTransparent> to sal_True, if color is "no fill"/"auto fill"
3388 0 : bool bTransparent = (rColor.GetColor() == COL_TRANSPARENT);
3389 0 : Color aColor;
3390 0 : if( !bTransparent )
3391 : {
3392 0 : aColor = rColor;
3393 0 : bColor = true;
3394 : }
3395 :
3396 : // und jetzt eine Grafik
3397 0 : String sGrfNm;
3398 :
3399 0 : if( !pLink )
3400 : {
3401 : // embeddete Grafik -> WriteEmbedded schreiben
3402 0 : const Graphic* pGrf = ((const SvxBrushItem &)rHt).GetGraphic();
3403 0 : if( pGrf )
3404 : {
3405 : // Grafik als (JPG-)File speichern
3406 0 : const String* pTempFileName = rHTMLWrt.GetOrigFileName();
3407 0 : if( pTempFileName )
3408 0 : sGrfNm = *pTempFileName;
3409 : sal_uInt16 nErr = XOutBitmap::WriteGraphic( *pGrf, sGrfNm,
3410 : rtl::OUString("JPG"),
3411 0 : XOUTBMP_USE_NATIVE_IF_POSSIBLE );
3412 0 : if( !nErr ) // fehlerhaft, da ist nichts auszugeben
3413 : {
3414 : sGrfNm = URIHelper::SmartRel2Abs(
3415 0 : INetURLObject(rWrt.GetBaseURL()), sGrfNm,
3416 0 : URIHelper::GetMaybeFileHdl() );
3417 0 : pLink = &sGrfNm;
3418 : }
3419 : else
3420 : {
3421 0 : rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
3422 : }
3423 : }
3424 : }
3425 0 : else if( !pGrfName && rHTMLWrt.bCfgCpyLinkedGrfs )
3426 : {
3427 0 : sGrfNm = *pLink;
3428 0 : rWrt.CopyLocalFileToINet( sGrfNm );
3429 0 : pLink = &sGrfNm;
3430 : }
3431 :
3432 : // In Tabellen wird nur dann etwas exportiert, wenn eine Grafik
3433 : // existiert.
3434 0 : if( CSS1_BACKGROUND_TABLE==nMode && !pLink )
3435 0 : return rWrt;
3436 :
3437 : // ggf. noch die Ausrichtung der Grafik
3438 0 : const sal_Char *pRepeat = 0, *pHori = 0, *pVert = 0;
3439 0 : if( pLink )
3440 : {
3441 0 : if( GPOS_TILED==ePos )
3442 : {
3443 0 : pRepeat = sCSS1_PV_repeat;
3444 : }
3445 : else
3446 : {
3447 0 : switch( ePos )
3448 : {
3449 : case GPOS_LT:
3450 : case GPOS_MT:
3451 : case GPOS_RT:
3452 0 : pHori = sCSS1_PV_top;
3453 0 : break;
3454 :
3455 : case GPOS_LM:
3456 : case GPOS_MM:
3457 : case GPOS_RM:
3458 0 : pHori = sCSS1_PV_middle;
3459 0 : break;
3460 :
3461 : case GPOS_LB:
3462 : case GPOS_MB:
3463 : case GPOS_RB:
3464 0 : pHori = sCSS1_PV_bottom;
3465 0 : break;
3466 :
3467 : default:
3468 : ;
3469 : }
3470 :
3471 0 : switch( ePos )
3472 : {
3473 : case GPOS_LT:
3474 : case GPOS_LM:
3475 : case GPOS_LB:
3476 0 : pVert = sCSS1_PV_left;
3477 0 : break;
3478 :
3479 : case GPOS_MT:
3480 : case GPOS_MM:
3481 : case GPOS_MB:
3482 0 : pVert = sCSS1_PV_center;
3483 0 : break;
3484 :
3485 : case GPOS_RT:
3486 : case GPOS_RM:
3487 : case GPOS_RB:
3488 0 : pVert = sCSS1_PV_right;
3489 0 : break;
3490 :
3491 : default:
3492 : ;
3493 : }
3494 :
3495 0 : if( pHori || pVert )
3496 0 : pRepeat = sCSS1_PV_no_repeat;
3497 : }
3498 : }
3499 :
3500 : // jetzt den String zusammen bauen
3501 0 : String sOut;
3502 0 : if( !pLink && !bColor )
3503 : {
3504 : // keine Farbe und kein Link, aber ein transparenter Brush
3505 0 : if( bTransparent && CSS1_BACKGROUND_FLY != nMode )
3506 0 : sOut.AssignAscii( sCSS1_PV_transparent );
3507 : }
3508 : else
3509 : {
3510 0 : if( bColor )
3511 : {
3512 0 : rtl::OString sTmp(GetCSS1Color(aColor));
3513 : sOut += String(rtl::OStringToOUString(sTmp,
3514 0 : RTL_TEXTENCODING_ASCII_US));
3515 : }
3516 :
3517 0 : if( pLink )
3518 : {
3519 0 : if( bColor )
3520 0 : sOut += ' ';
3521 :
3522 0 : sOut.AppendAscii( sCSS1_url );
3523 0 : sOut.Append( '(' );
3524 0 : sOut.Append( String(URIHelper::simpleNormalizedMakeRelative(rWrt.GetBaseURL(),
3525 0 : *pLink)));
3526 :
3527 0 : sOut.Append( ')' );
3528 :
3529 0 : if( pRepeat )
3530 : {
3531 0 : sOut.Append( ' ' );
3532 0 : sOut.AppendAscii( pRepeat );
3533 : }
3534 :
3535 0 : if( pHori )
3536 : {
3537 0 : sOut.Append( ' ' );
3538 0 : sOut.AppendAscii( pHori );
3539 : }
3540 0 : if( pVert )
3541 : {
3542 0 : sOut.Append( ' ' );
3543 0 : sOut.AppendAscii( pVert );
3544 : }
3545 :
3546 0 : sOut.Append( ' ' );
3547 0 : sOut.AppendAscii( sCSS1_PV_scroll );
3548 : }
3549 : }
3550 :
3551 0 : if( sOut.Len() )
3552 0 : rHTMLWrt.OutCSS1_Property( sCSS1_P_background, sOut );
3553 :
3554 0 : return rWrt;
3555 : }
3556 :
3557 0 : static void OutCSS1_SvxBorderLine( SwHTMLWriter& rHTMLWrt,
3558 : const sal_Char *pProperty,
3559 : const SvxBorderLine *pLine )
3560 : {
3561 0 : if( !pLine || pLine->isEmpty() )
3562 : {
3563 0 : rHTMLWrt.OutCSS1_PropertyAscii( pProperty, sCSS1_PV_none );
3564 0 : return;
3565 : }
3566 :
3567 0 : sal_Int32 nWidth = pLine->GetWidth();
3568 :
3569 0 : rtl::OStringBuffer sOut;
3570 0 : if( Application::GetDefaultDevice() &&
3571 : nWidth <= Application::GetDefaultDevice()->PixelToLogic(
3572 0 : Size( 1, 1 ), MapMode( MAP_TWIP) ).Width() )
3573 : {
3574 : // Wenn die Breite kleiner ist als ein Pixel, dann als 1px
3575 : // ausgeben, damit Netscape und IE die Linie auch darstellen.
3576 0 : sOut.append(RTL_CONSTASCII_STRINGPARAM("1px"));
3577 : }
3578 : else
3579 : {
3580 0 : nWidth *= 5; // 1/100pt
3581 :
3582 : // Breite als n.nn pt
3583 0 : sOut.append(static_cast<sal_Int32>(nWidth / 100));
3584 0 : sOut.append('.').append(static_cast<sal_Int32>((nWidth/10) % 10)).
3585 0 : append(static_cast<sal_Int32>(nWidth % 10)).append(sCSS1_UNIT_pt);
3586 : }
3587 :
3588 : // Linien-Stil: solid oder double
3589 0 : sOut.append(' ');
3590 0 : switch (pLine->GetBorderLineStyle())
3591 : {
3592 : case table::BorderLineStyle::SOLID:
3593 0 : sOut.append(sCSS1_PV_solid);
3594 0 : break;
3595 : case table::BorderLineStyle::DOTTED:
3596 0 : sOut.append(sCSS1_PV_dotted);
3597 0 : break;
3598 : case table::BorderLineStyle::DASHED:
3599 0 : sOut.append(sCSS1_PV_dashed);
3600 0 : break;
3601 : case table::BorderLineStyle::DOUBLE:
3602 : case table::BorderLineStyle::THINTHICK_SMALLGAP:
3603 : case table::BorderLineStyle::THINTHICK_MEDIUMGAP:
3604 : case table::BorderLineStyle::THINTHICK_LARGEGAP:
3605 : case table::BorderLineStyle::THICKTHIN_SMALLGAP:
3606 : case table::BorderLineStyle::THICKTHIN_MEDIUMGAP:
3607 : case table::BorderLineStyle::THICKTHIN_LARGEGAP:
3608 0 : sOut.append(sCSS1_PV_double);
3609 0 : break;
3610 : case table::BorderLineStyle::EMBOSSED:
3611 0 : sOut.append(sCSS1_PV_ridge);
3612 0 : break;
3613 : case table::BorderLineStyle::ENGRAVED:
3614 0 : sOut.append(sCSS1_PV_groove);
3615 0 : break;
3616 : case table::BorderLineStyle::INSET:
3617 0 : sOut.append(sCSS1_PV_inset);
3618 0 : break;
3619 : case table::BorderLineStyle::OUTSET:
3620 0 : sOut.append(sCSS1_PV_outset);
3621 0 : break;
3622 : default:
3623 0 : sOut.append(sCSS1_PV_none);
3624 : }
3625 0 : sOut.append(' ');
3626 :
3627 : // und noch die Farbe
3628 0 : sOut.append(GetCSS1Color(pLine->GetColor()));
3629 :
3630 0 : rHTMLWrt.OutCSS1_PropertyAscii(pProperty, sOut.makeStringAndClear());
3631 : }
3632 :
3633 0 : Writer& OutCSS1_SvxBox( Writer& rWrt, const SfxPoolItem& rHt )
3634 : {
3635 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
3636 :
3637 0 : const SvxBoxItem& rBoxItem = (const SvxBoxItem&)rHt;
3638 0 : const SvxBorderLine *pTop = rBoxItem.GetTop();
3639 0 : const SvxBorderLine *pBottom = rBoxItem.GetBottom();
3640 0 : const SvxBorderLine *pLeft = rBoxItem.GetLeft();
3641 0 : const SvxBorderLine *pRight = rBoxItem.GetRight();
3642 :
3643 0 : if( (pTop && pBottom && pLeft && pRight &&
3644 0 : *pTop == *pBottom && *pTop == *pLeft && *pTop == *pRight) ||
3645 : (!pTop && !pBottom && !pLeft && !pRight) )
3646 : {
3647 : // alle Linien gesetzt und gleich oder alle Linien nicht gesetzt
3648 : // => border : ...
3649 0 : OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border, pTop );
3650 : }
3651 : else
3652 : {
3653 : // sonst alle Linien individuell ausgeben
3654 0 : OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_top, pTop );
3655 0 : OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_bottom, pBottom );
3656 0 : OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_left, pLeft );
3657 0 : OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_right, pRight );
3658 : }
3659 :
3660 0 : long nTopDist = pTop ? rBoxItem.GetDistance( BOX_LINE_TOP ) : 0;
3661 0 : long nBottomDist = pBottom ? rBoxItem.GetDistance( BOX_LINE_BOTTOM ) : 0;
3662 0 : long nLeftDist = pLeft ? rBoxItem.GetDistance( BOX_LINE_LEFT ) : 0;
3663 0 : long nRightDist = pRight ? rBoxItem.GetDistance( BOX_LINE_RIGHT ) : 0;
3664 :
3665 0 : if( nTopDist == nBottomDist && nLeftDist == nRightDist )
3666 : {
3667 0 : rtl::OStringBuffer sVal;
3668 0 : AddUnitPropertyValue(sVal, nTopDist, rHTMLWrt.GetCSS1Unit());
3669 0 : if( nTopDist != nLeftDist )
3670 : {
3671 0 : sVal.append(' ');
3672 0 : AddUnitPropertyValue(sVal, nLeftDist, rHTMLWrt.GetCSS1Unit());
3673 : }
3674 0 : rHTMLWrt.OutCSS1_PropertyAscii(sCSS1_P_padding, sVal.makeStringAndClear());
3675 : }
3676 : else
3677 : {
3678 0 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_top, nTopDist );
3679 0 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_bottom, nBottomDist );
3680 0 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_left, nLeftDist );
3681 0 : rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_right, nRightDist );
3682 : }
3683 :
3684 0 : return rWrt;
3685 : }
3686 :
3687 0 : static Writer& OutCSS1_SvxFrameDirection( Writer& rWrt, const SfxPoolItem& rHt )
3688 : {
3689 0 : SwHTMLWriter& rHTMLWrt = static_cast< SwHTMLWriter& >( rWrt );
3690 :
3691 : // Language will be exported rules only
3692 0 : if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_TEMPLATE ) )
3693 0 : return rWrt;
3694 :
3695 : sal_uInt16 nDir =
3696 0 : static_cast< const SvxFrameDirectionItem& >( rHt ).GetValue();
3697 0 : sal_Char *pStr = 0;
3698 0 : switch( nDir )
3699 : {
3700 : case FRMDIR_HORI_LEFT_TOP:
3701 : case FRMDIR_VERT_TOP_LEFT:
3702 0 : pStr = sCSS1_PV_ltr;
3703 0 : break;
3704 : case FRMDIR_HORI_RIGHT_TOP:
3705 : case FRMDIR_VERT_TOP_RIGHT:
3706 0 : pStr = sCSS1_PV_rtl;
3707 0 : break;
3708 : case FRMDIR_ENVIRONMENT:
3709 0 : pStr = sCSS1_PV_inherit;
3710 0 : break;
3711 : }
3712 :
3713 0 : if( pStr )
3714 0 : rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_direction, pStr );
3715 :
3716 0 : return rWrt;
3717 : }
3718 :
3719 : /*
3720 : * lege hier die Tabellen fuer die HTML-Funktions-Pointer auf
3721 : * die Ausgabe-Funktionen an.
3722 : * Es sind lokale Strukturen, die nur innerhalb der HTML-DLL
3723 : * bekannt sein muessen.
3724 : */
3725 :
3726 :
3727 : SwAttrFnTab aCSS1AttrFnTab = {
3728 : /* RES_CHRATR_CASEMAP */ OutCSS1_SvxCaseMap,
3729 : /* RES_CHRATR_CHARSETCOLOR */ 0,
3730 : /* RES_CHRATR_COLOR */ OutCSS1_SvxColor,
3731 : /* RES_CHRATR_CONTOUR */ 0,
3732 : /* RES_CHRATR_CROSSEDOUT */ OutCSS1_SvxCrossedOut,
3733 : /* RES_CHRATR_ESCAPEMENT */ 0,
3734 : /* RES_CHRATR_FONT */ OutCSS1_SvxFont,
3735 : /* RES_CHRATR_FONTSIZE */ OutCSS1_SvxFontHeight,
3736 : /* RES_CHRATR_KERNING */ OutCSS1_SvxKerning,
3737 : /* RES_CHRATR_LANGUAGE */ OutCSS1_SvxLanguage,
3738 : /* RES_CHRATR_POSTURE */ OutCSS1_SvxPosture,
3739 : /* RES_CHRATR_PROPORTIONALFONTSIZE*/0,
3740 : /* RES_CHRATR_SHADOWED */ 0,
3741 : /* RES_CHRATR_UNDERLINE */ OutCSS1_SvxUnderline,
3742 : /* RES_CHRATR_WEIGHT */ OutCSS1_SvxFontWeight,
3743 : /* RES_CHRATR_WORDLINEMODE */ 0,
3744 : /* RES_CHRATR_AUTOKERN */ 0,
3745 : /* RES_CHRATR_BLINK */ OutCSS1_SvxBlink,
3746 : /* RES_CHRATR_NOHYPHEN */ 0, // Neu: nicht trennen
3747 : /* RES_CHRATR_NOLINEBREAK */ 0, // Neu: nicht umbrechen
3748 : /* RES_CHRATR_BACKGROUND */ OutCSS1_SvxBrush, // Neu: Zeichenhintergrund
3749 : /* RES_CHRATR_CJK_FONT */ OutCSS1_SvxFont,
3750 : /* RES_CHRATR_CJK_FONTSIZE */ OutCSS1_SvxFontHeight,
3751 : /* RES_CHRATR_CJK_LANGUAGE */ OutCSS1_SvxLanguage,
3752 : /* RES_CHRATR_CJK_POSTURE */ OutCSS1_SvxPosture,
3753 : /* RES_CHRATR_CJK_WEIGHT */ OutCSS1_SvxFontWeight,
3754 : /* RES_CHRATR_CTL_FONT */ OutCSS1_SvxFont,
3755 : /* RES_CHRATR_CTL_FONTSIZE */ OutCSS1_SvxFontHeight,
3756 : /* RES_CHRATR_CTL_LANGUAGE */ OutCSS1_SvxLanguage,
3757 : /* RES_CHRATR_CTL_POSTURE */ OutCSS1_SvxPosture,
3758 : /* RES_CHRATR_CTL_WEIGHT */ OutCSS1_SvxFontWeight,
3759 : /* RES_CHRATR_ROTATE */ 0,
3760 : /* RES_CHRATR_EMPHASIS_MARK */ 0,
3761 : /* RES_CHRATR_TWO_LINES */ 0,
3762 : /* RES_CHRATR_SCALEW */ 0,
3763 : /* RES_CHRATR_RELIEF */ 0,
3764 : /* RES_CHRATR_HIDDEN */ OutCSS1_SvxHidden,
3765 : /* RES_CHRATR_OVERLINE */ OutCSS1_SvxOverline,
3766 : /* RES_CHRATR_RSID */ 0,
3767 : /* RES_CHRATR_DUMMY1 */ 0,
3768 :
3769 : /* RES_TXTATR_REFMARK */ 0,
3770 : /* RES_TXTATR_TOXMARK */ 0,
3771 : /* RES_TXTATR_META */ 0,
3772 : /* RES_TXTATR_METAFIELD */ 0,
3773 : /* RES_TXTATR_AUTOFMT */ 0,
3774 : /* RES_TXTATR_INETFMT */ 0,
3775 : /* RES_TXTATR_CHARFMT */ 0,
3776 : /* RES_TXTATR_CJK_RUBY */ 0,
3777 : /* RES_TXTATR_UNKNOWN_CONTAINER */ 0,
3778 : /* RES_TXTATR_DUMMY5 */ 0,
3779 :
3780 : /* RES_TXTATR_FIELD */ 0,
3781 : /* RES_TXTATR_FLYCNT */ 0,
3782 : /* RES_TXTATR_FTN */ 0,
3783 : /* RES_TXTATR_DUMMY4 */ 0,
3784 : /* RES_TXTATR_DUMMY3 */ 0,
3785 : /* RES_TXTATR_DUMMY1 */ 0, // Dummy:
3786 : /* RES_TXTATR_DUMMY2 */ 0, // Dummy:
3787 :
3788 : /* RES_PARATR_LINESPACING */ OutCSS1_SvxLineSpacing,
3789 : /* RES_PARATR_ADJUST */ OutCSS1_SvxAdjust,
3790 : /* RES_PARATR_SPLIT */ OutCSS1_SvxFmtSplit,
3791 : /* RES_PARATR_WIDOWS */ OutCSS1_SvxWidows,
3792 : /* RES_PARATR_ORPHANS */ OutCSS1_SvxOrphans,
3793 : /* RES_PARATR_TABSTOP */ 0,
3794 : /* RES_PARATR_HYPHENZONE*/ 0,
3795 : /* RES_PARATR_DROP */ OutCSS1_SwFmtDrop,
3796 : /* RES_PARATR_REGISTER */ 0, // neu: Registerhaltigkeit
3797 : /* RES_PARATR_NUMRULE */ 0, // Dummy:
3798 : /* RES_PARATR_SCRIPTSPACE */ 0, // Dummy:
3799 : /* RES_PARATR_HANGINGPUNCTUATION */ 0, // Dummy:
3800 : /* RES_PARATR_FORBIDDEN_RULES */ 0, // new
3801 : /* RES_PARATR_VERTALIGN */ 0, // new
3802 : /* RES_PARATR_SNAPTOGRID*/ 0, // new
3803 : /* RES_PARATR_CONNECT_TO_BORDER */ 0, // new
3804 : /* RES_PARATR_OUTLINELEVEL */ 0, // new since cws outlinelevel
3805 : /* RES_PARATR_RSID */ 0, // new
3806 :
3807 : /* RES_PARATR_LIST_ID */ 0, // new
3808 : /* RES_PARATR_LIST_LEVEL */ 0, // new
3809 : /* RES_PARATR_LIST_ISRESTART */ 0, // new
3810 : /* RES_PARATR_LIST_RESTARTVALUE */ 0, // new
3811 : /* RES_PARATR_LIST_ISCOUNTED */ 0, // new
3812 :
3813 : /* RES_FILL_ORDER */ 0,
3814 : /* RES_FRM_SIZE */ 0,
3815 : /* RES_PAPER_BIN */ 0,
3816 : /* RES_LR_SPACE */ OutCSS1_SvxLRSpace,
3817 : /* RES_UL_SPACE */ OutCSS1_SvxULSpace,
3818 : /* RES_PAGEDESC */ 0,
3819 : /* RES_BREAK */ 0,
3820 : /* RES_CNTNT */ 0,
3821 : /* RES_HEADER */ 0,
3822 : /* RES_FOOTER */ 0,
3823 : /* RES_PRINT */ 0,
3824 : /* RES_OPAQUE */ 0,
3825 : /* RES_PROTECT */ 0,
3826 : /* RES_SURROUND */ 0,
3827 : /* RES_VERT_ORIENT */ 0,
3828 : /* RES_HORI_ORIENT */ 0,
3829 : /* RES_ANCHOR */ 0,
3830 : /* RES_BACKGROUND */ OutCSS1_SvxBrush,
3831 : /* RES_BOX */ OutCSS1_SvxBox,
3832 : /* RES_SHADOW */ 0,
3833 : /* RES_FRMMACRO */ 0,
3834 : /* RES_COL */ 0,
3835 : /* RES_KEEP */ 0,
3836 : /* RES_URL */ 0,
3837 : /* RES_EDIT_IN_READONLY */ 0,
3838 : /* RES_LAYOUT_SPLIT */ 0,
3839 : /* RES_CHAIN */ 0,
3840 : /* RES_TEXTGRID */ 0,
3841 : /* RES_LINENUMBER */ 0,
3842 : /* RES_FTN_AT_TXTEND */ 0,
3843 : /* RES_END_AT_TXTEND */ 0,
3844 : /* RES_COLUMNBALANCE */ 0,
3845 : /* RES_FRAMEDIR */ OutCSS1_SvxFrameDirection,
3846 : /* RES_HEADER_FOOTER_EAT_SPACING */ 0,
3847 : /* RES_FRMATR_DUMMY9 */ 0, // Dummy:
3848 : /* RES_FOLLOW_TEXT_FLOW */ 0,
3849 : /* RES_WRAP_INFLUENCE_ON_OBJPOS */ 0,
3850 : /* RES_FRMATR_DUMMY2 */ 0, // Dummy:
3851 : /* RES_AUTO_STYLE */ 0, // Dummy:
3852 : /* RES_FRMATR_DUMMY4 */ 0, // Dummy:
3853 : /* RES_FRMATR_DUMMY5 */ 0, // Dummy:
3854 :
3855 : /* RES_GRFATR_MIRRORGRF */ 0,
3856 : /* RES_GRFATR_CROPGRF */ 0,
3857 : /* RES_GRFATR_ROTATION */ 0,
3858 : /* RES_GRFATR_LUMINANCE */ 0,
3859 : /* RES_GRFATR_CONTRAST */ 0,
3860 : /* RES_GRFATR_CHANNELR */ 0,
3861 : /* RES_GRFATR_CHANNELG */ 0,
3862 : /* RES_GRFATR_CHANNELB */ 0,
3863 : /* RES_GRFATR_GAMMA */ 0,
3864 : /* RES_GRFATR_INVERT */ 0,
3865 : /* RES_GRFATR_TRANSPARENCY */ 0,
3866 : /* RES_GRFATR_DRWAMODE */ 0,
3867 : /* RES_GRFATR_DUMMY1 */ 0,
3868 : /* RES_GRFATR_DUMMY2 */ 0,
3869 : /* RES_GRFATR_DUMMY3 */ 0,
3870 : /* RES_GRFATR_DUMMY4 */ 0,
3871 : /* RES_GRFATR_DUMMY5 */ 0,
3872 :
3873 : /* RES_BOXATR_FORMAT */ 0,
3874 : /* RES_BOXATR_FORMULA */ 0,
3875 : /* RES_BOXATR_VALUE */ 0
3876 : };
3877 :
3878 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|