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

Generated by: LCOV version 1.10