LCOV - code coverage report
Current view: top level - sw/source/filter/html - css1atr.cxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 826 1583 52.2 %
Date: 2014-04-11 Functions: 50 69 72.5 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10