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

Generated by: LCOV version 1.11