summaryrefslogtreecommitdiff
path: root/sw/source/filter/html/css1atr.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/filter/html/css1atr.cxx')
-rw-r--r--sw/source/filter/html/css1atr.cxx3864
1 files changed, 3864 insertions, 0 deletions
diff --git a/sw/source/filter/html/css1atr.cxx b/sw/source/filter/html/css1atr.cxx
new file mode 100644
index 000000000000..01108a0d2567
--- /dev/null
+++ b/sw/source/filter/html/css1atr.cxx
@@ -0,0 +1,3864 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: css1atr.cxx,v $
+ * $Revision: 1.44.138.1 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+
+
+
+#include "hintids.hxx"
+#include <vcl/svapp.hxx>
+#ifndef _WRKWIN_HXX //autogen
+#include <vcl/wrkwin.hxx>
+#endif
+#include <svtools/whiter.hxx>
+#include <svx/boxitem.hxx>
+#include <svx/ulspitem.hxx>
+#include <svx/udlnitem.hxx>
+#include <svx/crsditem.hxx>
+#include <svx/blnkitem.hxx>
+#include <svx/cmapitem.hxx>
+#include <svx/colritem.hxx>
+#include <svx/fontitem.hxx>
+#include <svx/fhgtitem.hxx>
+#include <svx/postitem.hxx>
+#include <svx/kernitem.hxx>
+#include <svx/wghtitem.hxx>
+#include <svx/lspcitem.hxx>
+#include <svx/adjitem.hxx>
+#include <svx/lrspitem.hxx>
+#include <svx/ulspitem.hxx>
+#include <svx/brshitem.hxx>
+#include <svx/brkitem.hxx>
+#include <svx/keepitem.hxx>
+#include <svx/widwitem.hxx>
+#include <svx/spltitem.hxx>
+#include <svx/orphitem.hxx>
+#include <svx/xoutbmp.hxx>
+#include <svx/langitem.hxx>
+#include <svx/frmdiritem.hxx>
+#include <svtools/htmlout.hxx>
+#include <svtools/htmlkywd.hxx>
+#include <svx/htmlmode.hxx>
+#include <svtools/urihelper.hxx>
+#include <tools/urlobj.hxx>
+#include <tools/bigint.hxx>
+#include <unotools/charclass.hxx>
+#include <i18npool/mslangid.hxx>
+#include <charfmt.hxx>
+#include <fmtcol.hxx>
+#include <fmtfsize.hxx>
+#include <fmtornt.hxx>
+#include <fmtpdsc.hxx>
+#include <fmtlsplt.hxx>
+#include <pagedesc.hxx>
+#include <fmtanchr.hxx>
+#include <docary.hxx>
+#include <pam.hxx>
+#include <viewsh.hxx>
+#include <viewopt.hxx>
+#include <swtable.hxx>
+// OTES
+#include <ftninfo.hxx>
+#include <ftnidx.hxx>
+#include <txtftn.hxx>
+#include <fmtftn.hxx>
+// FOOTNOTES
+#include <dcontact.hxx>
+
+#include "doc.hxx"
+#include "swerror.h"
+#include "charatr.hxx"
+#include "paratr.hxx"
+#include "frmatr.hxx"
+#include "poolfmt.hxx"
+#include "fltini.hxx"
+#include "css1kywd.hxx"
+#include "wrthtml.hxx"
+#include "htmlnum.hxx"
+
+#include <IDocumentStylePoolAccess.hxx>
+#include <numrule.hxx>
+
+/*
+ * um nicht immer wieder nach einem Update festzustellen, das irgendwelche
+ * Hint-Ids dazugekommen sind, wird hier definiert, die Groesse der Tabelle
+ * definiert und mit der akt. verglichen. Bei unterschieden wird der
+ * Compiler schon meckern.
+ *
+ * diese Section und die dazugeherigen Tabellen muessen in folgenden Files
+ * gepflegt werden: rtf\rtfatr.cxx, sw6\sw6atr.cxx, w4w\w4watr.cxx
+ */
+#if !defined(UNX) && !defined(MSC) && !defined(PPC) && !defined(CSET) && !defined(__MWERKS__) && !defined(WTC) && !defined(__MINGW32__) && !defined(OS2)
+
+#define ATTRFNTAB_SIZE 130
+#if ATTRFNTAB_SIZE != POOLATTR_END - POOLATTR_BEGIN
+#error Attribut-Tabelle ist ungueltigt. Wurden neue Hint-IDs zugefuegt ??
+#endif
+
+#endif
+
+#define HTML_HEADSPACE (12*20)
+
+#define CSS1_BACKGROUND_ATTR 1
+#define CSS1_BACKGROUND_PAGE 2
+#define CSS1_BACKGROUND_TABLE 3
+#define CSS1_BACKGROUND_FLY 4
+#define CSS1_BACKGROUND_SECTION 5
+
+#define CSS1_FRMSIZE_WIDTH 0x01
+#define CSS1_FRMSIZE_VARHEIGHT 0x02
+#define CSS1_FRMSIZE_MINHEIGHT 0x04
+#define CSS1_FRMSIZE_FIXHEIGHT 0x08
+#define CSS1_FRMSIZE_ANYHEIGHT 0x0e
+#define CSS1_FRMSIZE_PIXEL 0x10
+
+using namespace ::com::sun::star;
+
+//-----------------------------------------------------------------------
+
+sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_rule_end, " }" );
+sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sCSS1_span_tag_end, "\">" );
+const sal_Char cCSS1_style_opt_end = '\"';
+
+sal_Char __FAR_DATA CSS1_CONSTASCII_DEF( sHTML_FTN_fontheight, "57%" );
+
+extern SwAttrFnTab aCSS1AttrFnTab;
+
+static Writer& OutCSS1_SwFmt( Writer& rWrt, const SwFmt& rFmt,
+ IDocumentStylePoolAccess /*SwDoc*/ *pDoc, SwDoc *pTemplate );
+static Writer& OutCSS1_SwPageDesc( Writer& rWrt, const SwPageDesc& rFmt,
+ IDocumentStylePoolAccess /*SwDoc*/ *pDoc, SwDoc *pTemplate,
+ USHORT nRefPoolId, BOOL bExtRef,
+ BOOL bPseudo=TRUE );
+static Writer& OutCSS1_SwFtnInfo( Writer& rWrt, const SwEndNoteInfo& rInfo,
+ SwDoc *pDoc, USHORT nNotes, BOOL bEndNote );
+static void OutCSS1_SwFmtDropAttrs( SwHTMLWriter& rHWrt,
+ const SwFmtDrop& rDrop,
+ const SfxItemSet *pCharFmtItemSet=0 );
+static Writer& OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( Writer& rWrt,
+ const SvxUnderlineItem *pUItem,
+ const SvxOverlineItem *pOItem,
+ const SvxCrossedOutItem *pCOItem,
+ const SvxBlinkItem *pBItem );
+static Writer& OutCSS1_SvxFontWeight( Writer& rWrt, const SfxPoolItem& rHt );
+static Writer& OutCSS1_SvxPosture( Writer& rWrt, const SfxPoolItem& rHt );
+static Writer& OutCSS1_SvxULSpace( Writer& rWrt, const SfxPoolItem& rHt );
+static Writer& OutCSS1_SvxLRSpace( Writer& rWrt, const SfxPoolItem& rHt );
+static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
+ const SvxULSpaceItem *pULSpace,
+ const SvxLRSpaceItem *pLRSpace );
+static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
+ const SfxItemSet& rItemSet,
+ BOOL bDeep );
+static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt,
+ USHORT nMode, const String *pGrfName );
+static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt );
+static Writer& OutCSS1_SvxBox( Writer& rWrt, const SfxPoolItem& rHt );
+static Writer& OutCSS1_SwFmtFrmSize( Writer& rWrt, const SfxPoolItem& rHt,
+ USHORT nMode );
+static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt,
+ const SfxItemSet& rItemSet,
+ BOOL bDeep );
+static Writer& OutCSS1_SwFmtLayoutSplit( Writer& rWrt, const SfxPoolItem& rHt );
+
+static void ConvToHex( USHORT nHex, ByteString& rStr )
+{
+ sal_Char aNToABuf[] = "00";
+
+ // Pointer an das Bufferende setzen
+ sal_Char *pStr = aNToABuf + (sizeof(aNToABuf)-1);
+ for( BYTE n = 0; n < 2; ++n )
+ {
+ *(--pStr) = (sal_Char)(nHex & 0xf ) + 48;
+ if( *pStr > '9' )
+ *pStr += 39;
+ nHex >>= 4;
+ }
+
+ rStr.Append( aNToABuf );
+}
+
+static void GetCSS1Color( const Color& rColor, ByteString& rStr )
+{
+ rStr += '#';
+
+ ConvToHex( rColor.GetRed(), rStr );
+ ConvToHex( rColor.GetGreen(), rStr );
+ ConvToHex( rColor.GetBlue(), rStr );
+}
+
+class SwCSS1OutMode
+{
+ SwHTMLWriter& rWrt;
+ USHORT nOldMode;
+
+public:
+
+ SwCSS1OutMode( SwHTMLWriter& rHWrt, USHORT nMode, BOOL bStartFirst=TRUE,
+ const String *pSelector=0 ) :
+ rWrt( rHWrt ),
+ nOldMode( rHWrt.nCSS1OutMode )
+ {
+ rWrt.nCSS1OutMode = nMode;
+ if( bStartFirst )
+ rWrt.bFirstCSS1Property = TRUE;
+ if( pSelector )
+ rWrt.aCSS1Selector = *pSelector;
+ }
+
+ ~SwCSS1OutMode()
+ {
+ rWrt.nCSS1OutMode = nOldMode;
+ }
+};
+
+
+
+void SwHTMLWriter::OutCSS1_Property( const sal_Char *pProp,
+ const sal_Char *pVal,
+ const String *pSVal )
+{
+ ByteString sOut;
+
+ if( bFirstCSS1Rule && (nCSS1OutMode & CSS1_OUTMODE_RULE_ON)!=0 )
+ {
+ bFirstCSS1Rule = FALSE;
+ OutNewLine();
+ ((((sOut += '<') += OOO_STRING_SVTOOLS_HTML_style) += ' ') += OOO_STRING_SVTOOLS_HTML_O_type) += "=\"text/css\">";
+ Strm() << sOut.GetBuffer();
+ sOut.Erase();
+ OutNewLine();
+ Strm() << '<' << OOO_STRING_SVTOOLS_HTML_comment;
+
+ IncIndentLevel();
+ }
+
+ if( bFirstCSS1Property )
+ {
+ switch( nCSS1OutMode & CSS1_OUTMODE_ANY_ON )
+ {
+ case CSS1_OUTMODE_SPAN_TAG_ON:
+ case CSS1_OUTMODE_SPAN_TAG1_ON:
+ if( bTagOn )
+ {
+ ((((sOut += '<') += OOO_STRING_SVTOOLS_HTML_span) += ' ') += OOO_STRING_SVTOOLS_HTML_O_style) += "=\"";
+ }
+ else
+ {
+ HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_span, FALSE );
+ return;
+ }
+ break;
+
+ case CSS1_OUTMODE_RULE_ON:
+ {
+ ByteString sTmp( aCSS1Selector, eDestEnc );
+ OutNewLine();
+ (sOut = sTmp) += " { ";
+ }
+ break;
+
+ case CSS1_OUTMODE_STYLE_OPT_ON:
+ ((sOut = ' ') += OOO_STRING_SVTOOLS_HTML_O_style) += "=\"";
+ break;
+ }
+ bFirstCSS1Property = FALSE;
+ }
+ else
+ {
+ sOut += "; ";
+ }
+
+
+ (sOut += pProp) += ": ";
+ if( nCSS1OutMode & CSS1_OUTMODE_ENCODE )
+ {
+ // In STYLE-Optionen den String codieren
+ Strm() << sOut.GetBuffer();
+ sOut.Erase();
+ if( pVal )
+ HTMLOutFuncs::Out_String( Strm(), String::CreateFromAscii(pVal),
+ eDestEnc, &aNonConvertableCharacters );
+ else if( pSVal )
+ HTMLOutFuncs::Out_String( Strm(), *pSVal, eDestEnc, &aNonConvertableCharacters );
+ }
+ else
+ {
+ // Im STYLE-Tag des String direct ausgeben
+ if( pVal )
+ sOut += pVal;
+ else if( pSVal )
+ {
+ ByteString sTmp( *pSVal, eDestEnc );
+ sOut += sTmp;
+ }
+ }
+
+ if( sOut.Len() )
+ Strm() << sOut.GetBuffer();
+}
+
+static void AddUnitPropertyValue( long nVal, FieldUnit eUnit, ByteString& rOut )
+{
+ if( nVal < 0 )
+ {
+ // Vorzeichen extra behandeln
+ nVal = -nVal;
+ rOut += '-';
+ }
+
+ // Die umgerechnete Einheit ergibt sich aus (x * nMul)/(nDiv*nFac*10)
+ long nMul = 1000;
+ long nDiv = 1;
+ long nFac = 100;
+ const sal_Char *pUnit;
+ switch( eUnit )
+ {
+ case FUNIT_100TH_MM:
+ ASSERT( FUNIT_MM == eUnit, "Masseinheit wird nicht unterstuetzt" );
+ case FUNIT_MM:
+ // 0.01mm = 0.57twip
+ nMul = 25400; // 25.4 * 1000
+ nDiv = 1440; // 72 * 20;
+ nFac = 100;
+ pUnit = sCSS1_UNIT_mm;
+ break;
+
+ case FUNIT_M:
+ case FUNIT_KM:
+ ASSERT( FUNIT_CM == eUnit, "Masseinheit wird nicht unterstuetzt" );
+ case FUNIT_CM:
+#ifdef EXACT_VALUES
+ // 0.001cm = 0.57twip
+ nMul = 25400; // 2.54 * 10000
+ nDiv = 1440; // 72 * 20;
+ nFac = 1000;
+#else
+ // 0.01cm = 5.7twip (ist zwar ungenau, aber die UI ist auch ungenau)
+ nMul = 2540; // 2.54 * 1000
+ nDiv = 1440; // 72 * 20;
+ nFac = 100;
+#endif
+ pUnit = sCSS1_UNIT_cm;
+ break;
+
+ case FUNIT_TWIP:
+ ASSERT( FUNIT_POINT == eUnit, "Masseinheit wird nicht unterstuetzt" );
+ case FUNIT_POINT:
+#ifdef EXACT_VALUES
+ // 0.01pt = 0.2twip
+ nMul = 1000;
+ nDiv = 20;
+ nFac = 100;
+#else
+ // 0.1pt = 2.0twip (ist zwar ungenau, aber die UI ist auch ungenau)
+ nMul = 100;
+ nDiv = 20;
+ nFac = 10;
+#endif
+ pUnit = sCSS1_UNIT_pt;
+ break;
+
+ case FUNIT_PICA:
+#ifdef EXACT_VALUES
+ // 0.001pc = 0.24twip
+ nMul = 10000;
+ nDiv = 12 * 20;
+ nFac = 1000;
+#else
+ // 0.01pc = 2.40twip (ist zwar ungenau, aber die UI ist auch ungenau)
+ nMul = 1000;
+ nDiv = 240; // 12 * 20;
+ nFac = 100;
+#endif
+ pUnit = sCSS1_UNIT_pc;
+ break;
+
+ case FUNIT_NONE:
+ case FUNIT_FOOT:
+ case FUNIT_MILE:
+ case FUNIT_CUSTOM:
+ case FUNIT_PERCENT:
+ case FUNIT_INCH:
+ default:
+ ASSERT( FUNIT_INCH == eUnit, "Masseinheit wird nicht unterstuetzt" );
+#ifdef EXACT_VALUES
+ // 0.0001in = 0.144twip
+ nMul = 100000;
+ nDiv = 1440; // 72 * 20;
+ nFac = 10000;
+#else
+ // 0.01in = 14.4twip (ist zwar ungenau, aber die UI ist auch ungenau)
+ nMul = 1000;
+ nDiv = 1440; // 72 * 20;
+ nFac = 100;
+#endif
+ pUnit = sCSS1_UNIT_inch;
+ break;
+ }
+
+ long nLongVal = 0;
+ BOOL bOutLongVal = TRUE;
+ if( nVal > LONG_MAX / nMul )
+ {
+ // Zum Unrechnen der Einheit wird ein BigInt benoetigt
+#ifdef SAL_INT64_IS_STRUCT
+ BigInt nBigVal( nVal );
+ nBigVal *= nMul;
+ nBigVal /= nDiv;
+ nBigVal += 5;
+ nBigVal /= 10;
+
+ if( nBigVal.IsLong() )
+ {
+ // Zum Ausgeben des Wertes reicht ein long.
+ nLongVal = (long)nBigVal;
+ }
+ else
+ {
+ BigInt nBigFac( nFac );
+ BigInt nBig10( 10 );
+ rOut += (long)(nBigVal / nBigFac);
+ if( !(nBigVal % nBigFac).IsZero() )
+ {
+ rOut += '.';
+ while( nFac > 1 && !(nBigVal % nBigFac).IsZero() )
+ {
+ nFac /= 10;
+ nBigFac = nFac;
+ rOut += (int)((nBigVal / nBigFac) % nBig10 );
+ }
+ }
+ bOutLongVal = FALSE;
+ }
+#else
+ sal_Int64 nBigVal( nVal );
+ nBigVal *= nMul;
+ nBigVal /= nDiv;
+ nBigVal += 5;
+ nBigVal /= 10;
+
+ if( nBigVal <= LONG_MAX )
+ {
+ // Zum Ausgeben des Wertes reicht ein long.
+ nLongVal = (long)nBigVal;
+ }
+ else
+ {
+ rOut += ByteString::CreateFromInt64( nBigVal / (sal_Int64)nFac );
+ if( (nBigVal % (sal_Int64)nFac) != 0 )
+ {
+ rOut += '.';
+ while( nFac > 1 && (nBigVal % (sal_Int64)nFac) != 0 )
+ {
+ nFac /= 10;
+ rOut += ByteString::CreateFromInt64(
+ (nBigVal / (sal_Int64)nFac) % (sal_Int64)10 );
+ }
+ }
+ bOutLongVal = FALSE;
+ }
+#endif
+ }
+ else
+ {
+ nLongVal = nVal * nMul;
+ nLongVal /= nDiv;
+ nLongVal += 5;
+ nLongVal /= 10;
+ }
+
+ if( bOutLongVal )
+ {
+ rOut += ByteString::CreateFromInt32( nLongVal/nFac );
+ if( (nLongVal % nFac) != 0 )
+ {
+ rOut += '.';
+ while( nFac > 1 && (nLongVal % nFac) != 0 )
+ {
+ nFac /= 10;
+ rOut += ByteString::CreateFromInt32( (nLongVal / nFac) % 10 );
+ }
+ }
+ }
+
+ rOut.Append( pUnit );
+}
+
+void SwHTMLWriter::OutCSS1_UnitProperty( const sal_Char *pProp, long nVal )
+{
+ ByteString sOut;
+ AddUnitPropertyValue( nVal, eCSS1Unit, sOut );
+ OutCSS1_PropertyAscii( pProp, sOut );
+}
+
+void SwHTMLWriter::OutCSS1_PixelProperty( const sal_Char *pProp, long nVal,
+ BOOL bVert )
+{
+ if( nVal && Application::GetDefaultDevice() )
+ {
+ Size aSz( bVert ? 0 : nVal, bVert ? nVal : 0 );
+ aSz = Application::GetDefaultDevice()->LogicToPixel( aSz, MapMode( MAP_TWIP) );
+ nVal = bVert ? aSz.Height() : aSz.Width();
+ if( !nVal )
+ nVal = 1;
+ }
+
+ ByteString sOut( ByteString::CreateFromInt32( nVal ) );
+ sOut.Append( sCSS1_UNIT_px );
+ OutCSS1_PropertyAscii( pProp, sOut );
+}
+
+void SwHTMLWriter::OutCSS1_SfxItemSet( const SfxItemSet& rItemSet,
+ BOOL bDeep )
+{
+ // den ItemSet ausgeben, und zwar inklusive aller Attribute
+ Out_SfxItemSet( aCSS1AttrFnTab, *this, rItemSet, bDeep );
+
+ // ein par Attribute benoetigen eine Spezial-Behandlung
+ const SfxPoolItem *pItem = 0;
+
+ // Underline, Overline, CrossedOut und Blink bilden zusammen eine CSS1-Property
+ // (geht natuerlich nicht bei Hints)
+ if( !IsCSS1Source(CSS1_OUTMODE_HINT) )
+ {
+ const SvxUnderlineItem *pUnderlineItem = 0;
+ if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_UNDERLINE, bDeep, &pItem ))
+ pUnderlineItem = (const SvxUnderlineItem *)pItem;
+
+ const SvxOverlineItem *pOverlineItem = 0;
+ if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_OVERLINE, bDeep, &pItem ))
+ pOverlineItem = (const SvxOverlineItem *)pItem;
+
+ const SvxCrossedOutItem *pCrossedOutItem = 0;
+ if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_CROSSEDOUT, bDeep, &pItem ))
+ pCrossedOutItem = (const SvxCrossedOutItem *)pItem;
+
+ const SvxBlinkItem *pBlinkItem = 0;
+ if( SFX_ITEM_SET==rItemSet.GetItemState( RES_CHRATR_BLINK, bDeep, &pItem ))
+ pBlinkItem = (const SvxBlinkItem *)pItem;
+
+ if( pUnderlineItem || pOverlineItem || pCrossedOutItem || pBlinkItem )
+ OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( *this, pUnderlineItem,
+ pOverlineItem,
+ pCrossedOutItem,
+ pBlinkItem );
+
+ OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( *this, rItemSet, bDeep );
+ }
+
+ if( !bFirstCSS1Property )
+ {
+ // wenn eine Property als Bestandteil einer Style-Option
+ // ausgegeben wurde, muss die Optiomn noch beendet werden
+ ByteString sOut;
+ switch( nCSS1OutMode & CSS1_OUTMODE_ANY_OFF )
+ {
+ case CSS1_OUTMODE_SPAN_TAG_OFF:
+ sOut = sCSS1_span_tag_end;
+ break;
+
+ case CSS1_OUTMODE_STYLE_OPT_OFF:
+ sOut = cCSS1_style_opt_end;
+ break;
+
+ case CSS1_OUTMODE_RULE_OFF:
+ sOut = sCSS1_rule_end;
+ break;
+ }
+ if( sOut.Len() )
+ Strm() << sOut.GetBuffer();
+ }
+}
+
+void SwHTMLWriter::OutStyleSheet( const SwPageDesc& rPageDesc, BOOL bUsed )
+{
+ bFirstCSS1Rule = TRUE;
+
+// Feature: PrintExt
+ if( IsHTMLMode(HTMLMODE_PRINT_EXT) )
+ {
+ const SwPageDesc *pFirstPageDesc = 0;
+ USHORT nFirstRefPoolId = RES_POOLPAGE_HTML;
+ bCSS1IgnoreFirstPageDesc = TRUE;
+
+ // Erstmal versuchen wir zu erraten, wie das Dokument so augebaut ist.
+ // Erlaubt sind nur die Vorlagen HTML, erste Seite, linke Seite und
+ // rechte Seite.
+ // Eine erste Seite wird nur exportiert, wenn die erste Seite auch
+ // wirklich die Vorlage "erste Seite" ist.
+ // Linke und rechte Seiten werden nur exportiert, wenn diese beiden
+ // Vorlagen untereinander verkettet werden.
+ // Wenn andere Vorlagen verwendet werden, wird nur in sehr einfachen
+ // Faellen etwas exportiert.
+ const SwPageDesc *pPageDesc = &rPageDesc;
+ const SwPageDesc *pFollow = rPageDesc.GetFollow();
+ if( RES_POOLPAGE_FIRST == pPageDesc->GetPoolFmtId() &&
+ pFollow != pPageDesc &&
+ !IsPoolUserFmt( pFollow->GetPoolFmtId() ) )
+ {
+ // Das Dokument hat eine erste Seite
+ pFirstPageDesc = pPageDesc;
+ pPageDesc = pFollow;
+ pFollow = pPageDesc->GetFollow();
+ }
+
+ IDocumentStylePoolAccess* pStylePoolAccess = getIDocumentStylePoolAccess();
+ if( pPageDesc == pFollow )
+ {
+ // Das Dokument ist einseitig. Egal welche Seite verwendet wird,
+ // es wird kein zweiseitiges Dokument daraus gemacht.
+ // Die Attributierung wird relativ zur HTML-Seitenvorlage
+ // aus der HTML-Vorlage exportiert.
+ OutCSS1_SwPageDesc( *this, *pPageDesc, pStylePoolAccess, pTemplate,
+ RES_POOLPAGE_HTML, TRUE, FALSE );
+ nFirstRefPoolId = pFollow->GetPoolFmtId();
+ }
+ else if( (RES_POOLPAGE_LEFT == pPageDesc->GetPoolFmtId() &&
+ RES_POOLPAGE_RIGHT == pFollow->GetPoolFmtId()) ||
+ (RES_POOLPAGE_RIGHT == pPageDesc->GetPoolFmtId() &&
+ RES_POOLPAGE_LEFT == pFollow->GetPoolFmtId()) )
+ {
+ // Das Dokument ist zweiseitig
+ OutCSS1_SwPageDesc( *this, *pPageDesc, pStylePoolAccess, pTemplate,
+ RES_POOLPAGE_HTML, TRUE );
+ OutCSS1_SwPageDesc( *this, *pFollow, pStylePoolAccess, pTemplate,
+ RES_POOLPAGE_HTML, TRUE );
+ nFirstRefPoolId = RES_POOLPAGE_RIGHT;
+ bCSS1IgnoreFirstPageDesc = FALSE;
+ }
+ // Alles andere bekommen wir nicht hin.
+
+ if( pFirstPageDesc )
+ OutCSS1_SwPageDesc( *this, *pFirstPageDesc, pStylePoolAccess, pTemplate,
+ nFirstRefPoolId, FALSE );
+ }
+// /Feature: PrintExt
+
+
+ // The text body style has to be exported always (if it is changed compared
+ // to the template), because it is used as reference for any style
+ // that maps to <P>, and that's especially the standard style
+ getIDocumentStylePoolAccess()->GetTxtCollFromPool( RES_POOLCOLL_TEXT, false );
+
+ // das Default-TextStyle wir nicht mit ausgegeben !!
+ // das 0-Style ist das Default, wird nie ausgegeben !!
+ USHORT nArrLen = pDoc->GetTxtFmtColls()->Count();
+ USHORT i;
+
+ for( i = 1; i < nArrLen; i++ )
+ {
+ const SwTxtFmtColl* pColl = (*pDoc->GetTxtFmtColls())[i];
+ USHORT nPoolId = pColl->GetPoolFmtId();
+ if( !bUsed || nPoolId == RES_POOLCOLL_TEXT ||
+ pDoc->IsUsed( *pColl ) )
+ OutCSS1_SwFmt( *this, *pColl, pDoc, pTemplate );
+ }
+
+ // das Default-TextStyle wir nicht mit ausgegeben !!
+ nArrLen = pDoc->GetCharFmts()->Count();
+ for( i=1; i<nArrLen; i++ )
+ {
+ const SwCharFmt *pCFmt = (*pDoc->GetCharFmts())[i];
+ USHORT nPoolId = pCFmt->GetPoolFmtId();
+ if( !bUsed || nPoolId == RES_POOLCHR_INET_NORMAL ||
+ nPoolId == RES_POOLCHR_INET_VISIT ||
+ pDoc->IsUsed( *pCFmt ) )
+ OutCSS1_SwFmt( *this, *pCFmt, pDoc, pTemplate );
+ }
+
+ const SwFtnIdxs& rIdxs = pDoc->GetFtnIdxs();
+ nArrLen = rIdxs.Count();
+ USHORT nEnd = 0, nFtn = 0;
+ for( i=0; i < nArrLen; i++ )
+ {
+ if( rIdxs[i]->GetFtn().IsEndNote() )
+ nEnd++;
+ else
+ nFtn++;
+ }
+ OutCSS1_SwFtnInfo( *this, pDoc->GetFtnInfo(), pDoc, nFtn, FALSE );
+ OutCSS1_SwFtnInfo( *this, pDoc->GetEndNoteInfo(), pDoc, nEnd, TRUE );
+
+ if( !bFirstCSS1Rule )
+ {
+ DecIndentLevel();
+ OutNewLine();
+ Strm() << "-->";
+
+ OutNewLine();
+ HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_style, FALSE );
+ }
+ else
+ {
+ bFirstCSS1Rule = FALSE;
+ }
+
+ nDfltTopMargin = 0;
+ nDfltBottomMargin = 0;
+}
+
+//-----------------------------------------------------------------------
+
+// wenn pPseudo gesetzt ist werden Styles-Sheets ausgegeben,
+// sonst wird nur nach Token und Class fuer ein Format gesucht
+USHORT SwHTMLWriter::GetCSS1Selector( const SwFmt *pFmt, ByteString& rToken,
+ String& rClass, USHORT& rRefPoolId,
+ String *pPseudo )
+{
+ USHORT nDeep = 0;
+ rToken.Erase(); rClass.Erase();
+ rRefPoolId = 0;
+ if( pPseudo )
+ pPseudo->Erase();
+
+ BOOL bChrFmt = RES_CHRFMT==pFmt->Which();
+
+ // Nach oben die Formate abklappern, bis man auf eine Standard-
+ // oder eine HTML-Tag-Vorlage trifft
+ const SwFmt *pPFmt = pFmt;
+ while( pPFmt && !pPFmt->IsDefault() )
+ {
+ BOOL bStop = FALSE;
+ USHORT nPoolId = pPFmt->GetPoolFmtId();
+ if( USER_FMT & nPoolId )
+ {
+ // Benutzer-Vorlagen
+ const String& rNm = pPFmt->GetName();
+ switch( rNm.GetChar(0) )
+ {
+ // nicht mehr unterstuetzt:
+ // OOO_STRING_SVTOOLS_HTML_author
+ // OOO_STRING_SVTOOLS_HTML_acronym
+ // OOO_STRING_SVTOOLS_HTML_abbreviation
+ // OOO_STRING_SVTOOLS_HTML_deletedtext
+ // OOO_STRING_SVTOOLS_HTML_insertedtext
+ // OOO_STRING_SVTOOLS_HTML_language
+ // OOO_STRING_SVTOOLS_HTML_person
+ case 'B': if( !bChrFmt && rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_blockquote) )
+ {
+ rRefPoolId = RES_POOLCOLL_HTML_BLOCKQUOTE;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_blockquote );
+ }
+ break;
+ case 'C': if( bChrFmt )
+ {
+ if( rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_citiation) )
+ {
+ rRefPoolId = RES_POOLCHR_HTML_CITIATION;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_citiation );
+ }
+ else if( rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_code) )
+ {
+ rRefPoolId = RES_POOLCHR_HTML_CODE;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_code );
+ }
+ }
+ break;
+ case 'D': if( bChrFmt && rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_definstance) )
+ {
+ rRefPoolId = RES_POOLCHR_HTML_DEFINSTANCE;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_definstance);
+ }
+ else if( !bChrFmt )
+ {
+ USHORT nDefListLvl = GetDefListLvl( rNm, nPoolId );
+ // Die Vorlagen DD 1/DT 1 werden ausgegeben,
+ // aber keine von ihnen abgeleiteten Vorlagen,
+ // auch nicht DD 2/DT 2 etc.
+ if( nDefListLvl )
+ {
+ if( pPseudo &&
+ (nDeep || (nDefListLvl & 0x0fff) > 1) )
+ {
+ bStop = TRUE;
+ }
+ else if( nDefListLvl & HTML_DLCOLL_DD )
+ {
+ rRefPoolId = RES_POOLCOLL_HTML_DD;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_dd );
+ }
+ else
+ {
+ rRefPoolId = RES_POOLCOLL_HTML_DT;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_dt );
+ }
+ }
+ }
+ break;
+ case 'E': if( bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_emphasis ) )
+ {
+ rRefPoolId = RES_POOLCHR_HTML_EMPHASIS;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_emphasis );
+ }
+ break;
+ case 'H': if( !bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_horzrule ) )
+ // HR nicht ausgeben!
+ bStop = (nDeep==0);
+ break;
+ case 'K': if( bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_keyboard ) )
+ {
+ rRefPoolId = RES_POOLCHR_HTML_KEYBOARD;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_keyboard );
+ }
+ break;
+ case 'L': if( !bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_listing ) )
+ {
+ // Listing als PRE exportieren bzw. von
+ // PRE abgeleitete Vorlage exportieren
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_preformtxt );
+ rRefPoolId = RES_POOLCOLL_HTML_PRE;
+ nDeep = CSS1_FMT_CMPREF;
+ }
+ break;
+ case 'P': if( !bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_preformtxt ) )
+ {
+ rRefPoolId = RES_POOLCOLL_HTML_PRE;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_preformtxt );
+ }
+ break;
+ case 'S': if( bChrFmt )
+ {
+ if( rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_sample ) )
+ {
+ rRefPoolId = RES_POOLCHR_HTML_SAMPLE;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_sample );
+ }
+ else if( rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_strong ) )
+ {
+ rRefPoolId = RES_POOLCHR_HTML_STRONG;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_strong );
+ }
+ }
+ break;
+ case 'T': if( bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_teletype ) )
+ {
+ rRefPoolId = RES_POOLCHR_HTML_TELETYPE;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_teletype );
+ }
+ break;
+ case 'V': if( bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_variable ) )
+ {
+ rRefPoolId = RES_POOLCHR_HTML_VARIABLE;
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_variable );
+ }
+ break;
+ case 'X': if( !bChrFmt && rNm.EqualsAscii( OOO_STRING_SVTOOLS_HTML_xmp ) )
+ {
+ // XMP als PRE exportieren (aber nicht die
+ // Vorlage als Style)
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_preformtxt );
+ rRefPoolId = RES_POOLCOLL_HTML_PRE;
+ nDeep = CSS1_FMT_CMPREF;
+ }
+ break;
+ }
+
+ // Wenn eine PoolId gesetzt ist, entspricht der Name der
+ // Vorlage dem szugehoerigen Token
+ ASSERT( rRefPoolId != 0 == rToken.Len() > 0,
+ "Token missing" );
+ }
+ else
+ {
+ // Pool-Vorlagen
+ switch( nPoolId )
+ {
+ // Absatz-Vorlagen
+ case RES_POOLCOLL_HEADLINE_BASE:
+ case RES_POOLCOLL_STANDARD:
+ // diese Vorlagen nicht ausgeben
+ bStop = (nDeep==0);
+ break;
+ case RES_POOLCOLL_TEXT:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_parabreak );
+ break;
+ case RES_POOLCOLL_HEADLINE1:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_head1 );
+ break;
+ case RES_POOLCOLL_HEADLINE2:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_head2 );
+ break;
+ case RES_POOLCOLL_HEADLINE3:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_head3 );
+ break;
+ case RES_POOLCOLL_HEADLINE4:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_head4 );
+ break;
+ case RES_POOLCOLL_HEADLINE5:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_head5 );
+ break;
+ case RES_POOLCOLL_HEADLINE6:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_head6 );
+ break;
+ case RES_POOLCOLL_SENDADRESS:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_address );
+ break;
+ case RES_POOLCOLL_HTML_BLOCKQUOTE:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_blockquote );
+ break;
+ case RES_POOLCOLL_HTML_PRE:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_preformtxt );
+ break;
+
+ case RES_POOLCOLL_HTML_DD:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_dd );
+ break;
+ case RES_POOLCOLL_HTML_DT:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_dt );
+ break;
+
+ case RES_POOLCOLL_TABLE:
+ if( pPseudo )
+ {
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_tabledata );
+ rToken.Append( ' ' );
+ rToken.Append( OOO_STRING_SVTOOLS_HTML_parabreak );
+ }
+ else
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_parabreak );
+ break;
+ case RES_POOLCOLL_TABLE_HDLN:
+ if( pPseudo )
+ {
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_tableheader );
+ rToken.Append( ' ' );
+ rToken.Append( OOO_STRING_SVTOOLS_HTML_parabreak );
+ }
+ else
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_parabreak );
+ break;
+ case RES_POOLCOLL_HTML_HR:
+ // HR nicht ausgeben!
+ bStop = (nDeep==0);
+ break;
+ case RES_POOLCOLL_FOOTNOTE:
+ if( !nDeep )
+ {
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_parabreak );
+ rClass.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdfootnote );
+ rRefPoolId = RES_POOLCOLL_TEXT;
+ nDeep = CSS1_FMT_CMPREF;
+ }
+ break;
+ case RES_POOLCOLL_ENDNOTE:
+ if( !nDeep )
+ {
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_parabreak );
+ rClass.AssignAscii( OOO_STRING_SVTOOLS_HTML_sdendnote );
+ rRefPoolId = RES_POOLCOLL_TEXT;
+ nDeep = CSS1_FMT_CMPREF;
+ }
+ break;
+
+ // Zeichen-Vorlagen
+ case RES_POOLCHR_HTML_EMPHASIS:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_emphasis );
+ break;
+ case RES_POOLCHR_HTML_CITIATION:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_citiation );
+ break;
+ case RES_POOLCHR_HTML_STRONG:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_strong );
+ break;
+ case RES_POOLCHR_HTML_CODE:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_code );
+ break;
+ case RES_POOLCHR_HTML_SAMPLE:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_sample );
+ break;
+ case RES_POOLCHR_HTML_KEYBOARD:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_keyboard );
+ break;
+ case RES_POOLCHR_HTML_VARIABLE:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_variable );
+ break;
+ case RES_POOLCHR_HTML_DEFINSTANCE:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_definstance );
+ break;
+ case RES_POOLCHR_HTML_TELETYPE:
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_teletype );
+ break;
+
+ case RES_POOLCHR_INET_NORMAL:
+ if( pPseudo )
+ {
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_anchor );
+ pPseudo->AssignAscii( sCSS1_link );
+ }
+ break;
+ case RES_POOLCHR_INET_VISIT:
+ if( pPseudo )
+ {
+ rToken.Assign( OOO_STRING_SVTOOLS_HTML_anchor );
+ pPseudo->AssignAscii( sCSS1_visited );
+ }
+ break;
+ }
+
+ // Wenn ein Token gesetzt ist, enthaelt nPoolId die dazugehoerige
+ // Vorlage
+ if( rToken.Len() && !rRefPoolId )
+ rRefPoolId = nPoolId;
+ }
+
+ if( rToken.Len() || bStop )
+ {
+ // Anhalten wenn eine HTML-Tag-Vorlage gefunden wurde
+ break;
+ }
+ else
+ {
+ // sonst weitersuchen
+ nDeep++;
+ pPFmt = pPFmt->DerivedFrom();
+ }
+ }
+
+ if( rToken.Len() )
+ {
+ // Es ist eine HTML-Tag-Vorlage
+ if( !nDeep )
+ nDeep = CSS1_FMT_ISTAG;
+ }
+ else
+ {
+ // Es ist keine HTML-Tag-Vorlage und auch keine davon abgeleitete
+ nDeep = 0;
+ }
+ if( nDeep > 0 && nDeep < CSS1_FMT_SPECIAL )
+ {
+ // Wenn die Vorlage von einer HTML-Vorlage abgeleitet ist,
+ // wird sie als <TOKEN>.<CLASS> exportiert, sonst als .<CLASS>.
+ // <CLASS> ergibt sich aus dem Namen der Vorlage durch entfernen
+ // aller Zeichen vor und inklusive dem ersten '.'
+ rClass = pFmt->GetName();
+ xub_StrLen nPos = rClass.Search( '.' );
+ if( nPos != STRING_NOTFOUND && rClass.Len() > nPos+1 )
+ {
+ rClass.Erase( 0, nPos+1 );
+ }
+
+ GetAppCharClass().toLower( rClass );
+ while( STRING_NOTFOUND != rClass.SearchAndReplace( '.', '-' ) )
+ ;
+ while( STRING_NOTFOUND != rClass.SearchAndReplace( ' ', '-' ) )
+ ;
+ while( STRING_NOTFOUND != rClass.SearchAndReplace( '_', '-' ) )
+ ;
+ }
+
+ return nDeep;
+}
+
+static USHORT GetCSS1Selector( const SwFmt *pFmt, String& rSelector,
+ USHORT& rRefPoolId )
+{
+ ByteString aToken;
+ String aClass;
+ String aPseudo;
+
+ USHORT nDeep = SwHTMLWriter::GetCSS1Selector( pFmt, aToken, aClass,
+ rRefPoolId, &aPseudo );
+ if( nDeep )
+ {
+ if( aToken.Len() )
+ rSelector = String( aToken, RTL_TEXTENCODING_ASCII_US );
+ else
+ rSelector.Erase();
+
+ if( aClass.Len() )
+ (rSelector += '.') += aClass;
+ if( aPseudo.Len() )
+ (rSelector += ':') += aPseudo;
+ }
+
+ return nDeep;
+}
+
+const SwFmt *SwHTMLWriter::GetTemplateFmt( USHORT nPoolFmtId,
+ IDocumentStylePoolAccess* pTemplate /*SwDoc *pTemplate*/)
+{
+ const SwFmt *pRefFmt = 0;
+
+ if( pTemplate )
+ {
+ ASSERT( !(USER_FMT & nPoolFmtId),
+ "In der Dok-Vorlage gibt es keine Benutzer-Vorlagen" );
+ if( POOLGRP_NOCOLLID & nPoolFmtId )
+ pRefFmt = pTemplate->GetCharFmtFromPool( nPoolFmtId );
+ else
+ pRefFmt = pTemplate->GetTxtCollFromPool( nPoolFmtId, false );
+ }
+
+ return pRefFmt;
+}
+
+const SwFmt *SwHTMLWriter::GetParentFmt( const SwFmt& rFmt, USHORT nDeep )
+{
+ ASSERT( nDeep != USHRT_MAX, "GetParent fuer HTML-Vorlage aufgerufen!" );
+ const SwFmt *pRefFmt = 0;
+
+ if( nDeep > 0 )
+ {
+ // hier wird die HTML-Tag-Vorlage, von der die Vorlage abgeleitet
+ // ist als Referenz geholt
+ pRefFmt = &rFmt;
+ for( USHORT i=nDeep; i>0; i-- )
+ pRefFmt = pRefFmt->DerivedFrom();
+
+ if( pRefFmt && pRefFmt->IsDefault() )
+ pRefFmt = 0;
+ }
+
+ return pRefFmt;
+}
+
+BOOL lcl_css1atr_equalFontItems( const SfxPoolItem& r1, const SfxPoolItem& r2 )
+{
+ return ((const SvxFontItem &)r1).GetFamilyName() ==
+ ((const SvxFontItem &)r2).GetFamilyName() &&
+ ((const SvxFontItem &)r1).GetFamily() ==
+ ((const SvxFontItem &)r2).GetFamily();
+}
+
+void SwHTMLWriter::SubtractItemSet( SfxItemSet& rItemSet,
+ const SfxItemSet& rRefItemSet,
+ BOOL bSetDefaults,
+ BOOL bClearSame,
+ const SfxItemSet *pRefScriptItemSet )
+{
+ ASSERT( bSetDefaults || bClearSame,
+ "SwHTMLWriter::SubtractItemSet: Bei diesen Flags passiert nix" );
+ SfxItemSet aRefItemSet( *rRefItemSet.GetPool(), rRefItemSet.GetRanges() );
+ aRefItemSet.Set( rRefItemSet );
+
+ // und mit dem Attr-Set der Vorlage vergleichen
+ SfxWhichIter aIter( rItemSet );
+ USHORT nWhich = aIter.FirstWhich();
+ while( nWhich )
+ {
+ const SfxPoolItem *pRefItem, *pItem;
+ BOOL bItemSet = ( SFX_ITEM_SET ==
+ rItemSet.GetItemState( nWhich, FALSE, &pItem) );
+ BOOL bRefItemSet;
+
+ if( pRefScriptItemSet )
+ {
+ switch( nWhich )
+ {
+ case RES_CHRATR_FONT:
+ case RES_CHRATR_FONTSIZE:
+ case RES_CHRATR_LANGUAGE:
+ case RES_CHRATR_POSTURE:
+ case RES_CHRATR_WEIGHT:
+ case RES_CHRATR_CJK_FONT:
+ case RES_CHRATR_CJK_FONTSIZE:
+ case RES_CHRATR_CJK_LANGUAGE:
+ case RES_CHRATR_CJK_POSTURE:
+ case RES_CHRATR_CJK_WEIGHT:
+ case RES_CHRATR_CTL_FONT:
+ case RES_CHRATR_CTL_FONTSIZE:
+ case RES_CHRATR_CTL_LANGUAGE:
+ case RES_CHRATR_CTL_POSTURE:
+ case RES_CHRATR_CTL_WEIGHT:
+ bRefItemSet = ( SFX_ITEM_SET ==
+ pRefScriptItemSet->GetItemState( nWhich, TRUE, &pRefItem) );
+ break;
+ default:
+ bRefItemSet = ( SFX_ITEM_SET ==
+ aRefItemSet.GetItemState( nWhich, FALSE, &pRefItem) );
+ break;
+ }
+ }
+ else
+ {
+ bRefItemSet = ( SFX_ITEM_SET ==
+ aRefItemSet.GetItemState( nWhich, FALSE, &pRefItem) );
+ }
+
+ if( bItemSet )
+ {
+ if( (bClearSame || pRefScriptItemSet) && bRefItemSet &&
+ ( *pItem == *pRefItem ||
+ ((RES_CHRATR_FONT == nWhich ||
+ RES_CHRATR_CJK_FONT == nWhich ||
+ RES_CHRATR_CTL_FONT == nWhich) &&
+ lcl_css1atr_equalFontItems( *pItem, *pRefItem )) ) )
+ {
+ // das Attribut ist mit dem gleichen Wert in beiden
+ // Vorlagen vorhanden und muss nicht ausgegeben werden
+ rItemSet.ClearItem( nWhich );
+ }
+ }
+ else
+ {
+ if( (bSetDefaults || pRefScriptItemSet) && bRefItemSet )
+ {
+ // das Attribut ist nur in der Referenz vorhanden. Das
+ // Default muss ggf. ausgegeben werden
+ rItemSet.Put( rItemSet.GetPool()->GetDefaultItem(nWhich) );
+ }
+ }
+
+ nWhich = aIter.NextWhich();
+ }
+}
+
+void SwHTMLWriter::PrepareFontList( const SvxFontItem& rFontItem,
+ String& rNames,
+ sal_Unicode cQuote, BOOL bGeneric )
+{
+ rNames = aEmptyStr;
+ const String& rName = rFontItem.GetFamilyName();
+ BOOL bContainsKeyword = FALSE;
+ if( rName.Len() )
+ {
+ xub_StrLen nStrPos = 0;
+ while( nStrPos != STRING_NOTFOUND )
+ {
+ String aName = rName.GetToken( 0, ';', nStrPos );
+ aName.EraseTrailingChars().EraseLeadingChars();
+ if( !aName.Len() )
+ continue;
+
+ BOOL bIsKeyword = FALSE;
+ switch( aName.GetChar( 0 ) )
+ {
+ case 'c':
+ case 'C':
+ bIsKeyword = aName.EqualsIgnoreCaseAscii( sCSS1_PV_cursive );
+ break;
+
+ case 'f':
+ case 'F':
+ bIsKeyword = aName.EqualsIgnoreCaseAscii( sCSS1_PV_fantasy );
+ break;
+
+ case 'm':
+ case 'M':
+ bIsKeyword = aName.EqualsIgnoreCaseAscii( sCSS1_PV_monospace );
+ break;
+
+ case 's':
+ case 'S':
+ bIsKeyword =
+ aName.EqualsIgnoreCaseAscii( sCSS1_PV_serif ) ||
+ aName.EqualsIgnoreCaseAscii( sCSS1_PV_sans_serif );
+ break;
+ }
+
+ bContainsKeyword |= bIsKeyword;
+
+ if( rNames.Len() )
+ rNames.AppendAscii( ", " );
+ if( cQuote && !bIsKeyword )
+ rNames += cQuote;
+ rNames += aName;
+ if( cQuote && !bIsKeyword )
+ rNames += cQuote;
+ }
+ }
+
+ if( !bContainsKeyword && bGeneric )
+ {
+ const sal_Char *pStr = 0;
+ switch( rFontItem.GetFamily() )
+ {
+ case FAMILY_ROMAN: pStr = sCSS1_PV_serif; break;
+ case FAMILY_SWISS: pStr = sCSS1_PV_sans_serif; break;
+ case FAMILY_SCRIPT: pStr = sCSS1_PV_cursive; break;
+ case FAMILY_DECORATIVE: pStr = sCSS1_PV_fantasy; break;
+ case FAMILY_MODERN: pStr = sCSS1_PV_monospace; break;
+ default:
+ ;
+ }
+
+ if( pStr )
+ {
+ if( rNames.Len() )
+ rNames.AppendAscii( ", " );
+ rNames.AppendAscii( pStr );
+ }
+ }
+}
+
+sal_Bool SwHTMLWriter::HasScriptDependentItems( const SfxItemSet& rItemSet,
+ sal_Bool bCheckDropCap )
+{
+ static sal_uInt16 aWhichIds[] =
+ {
+ RES_CHRATR_FONT, RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_FONT,
+ RES_CHRATR_FONTSIZE, RES_CHRATR_CJK_FONTSIZE, RES_CHRATR_CTL_FONTSIZE,
+ RES_CHRATR_LANGUAGE, RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CTL_LANGUAGE,
+ RES_CHRATR_POSTURE, RES_CHRATR_CJK_POSTURE, RES_CHRATR_CTL_POSTURE,
+ RES_CHRATR_WEIGHT, RES_CHRATR_CJK_WEIGHT, RES_CHRATR_CTL_WEIGHT,
+ 0, 0, 0
+ };
+
+ for( sal_uInt16 i=0; aWhichIds[i]; i += 3 )
+ {
+ const SfxPoolItem *pItem = 0, *pItemCJK = 0, *pItemCTL = 0, *pTmp;
+ sal_uInt16 nItemCount = 0;
+ if( SFX_ITEM_SET == rItemSet.GetItemState( aWhichIds[i], sal_False,
+ &pTmp ) )
+ {
+ pItem = pTmp;
+ nItemCount++;
+ }
+ if( SFX_ITEM_SET == rItemSet.GetItemState( aWhichIds[i+1], sal_False,
+ &pTmp ) )
+ {
+ pItemCJK = pTmp;
+ nItemCount++;
+ }
+ if( SFX_ITEM_SET == rItemSet.GetItemState( aWhichIds[i+2], sal_False,
+ &pTmp ) )
+ {
+ pItemCTL = pTmp;
+ nItemCount++;
+ }
+
+ // If some of the items are set, but not all, we need script dependent
+ // styles
+ if( nItemCount > 0 && nItemCount < 3 )
+ return sal_True;
+
+ if( 3 == nItemCount )
+ {
+ // If all items are set, but some of them have different values,
+ // we need script dependent styles, too. For font items, we have
+ // to take care about their special HTML/CSS1 representation.
+ if( RES_CHRATR_FONT == aWhichIds[i] )
+ {
+ if( !lcl_css1atr_equalFontItems( *pItem, *pItemCJK ) ||
+ !lcl_css1atr_equalFontItems( *pItem, *pItemCTL ) ||
+ !lcl_css1atr_equalFontItems( *pItemCJK, *pItemCTL ) )
+ return sal_True;
+ }
+ else
+ {
+ if( !( *pItem == *pItemCJK ) ||
+ !( *pItem == *pItemCTL ) ||
+ !( *pItemCJK == *pItemCTL ) )
+ return sal_True;
+ }
+ }
+ }
+
+ const SfxPoolItem *pItem;
+ if( bCheckDropCap &&
+ SFX_ITEM_SET == rItemSet.GetItemState( RES_PARATR_DROP, sal_True,
+ &pItem ) )
+ {
+ const SwFmtDrop *pDrop = (const SwFmtDrop *)pItem;
+ const SwCharFmt *pDCCharFmt = pDrop->GetCharFmt();
+ if( pDCCharFmt )
+ {
+ SfxItemSet aTstItemSet( *pDCCharFmt->GetAttrSet().GetPool(),
+ RES_CHRATR_FONT, RES_CHRATR_FONT,
+ RES_CHRATR_POSTURE, RES_CHRATR_POSTURE,
+ RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT,
+ RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONT,
+ RES_CHRATR_CJK_POSTURE, RES_CHRATR_CJK_WEIGHT,
+ RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONT,
+ RES_CHRATR_CTL_POSTURE, RES_CHRATR_CTL_WEIGHT,
+ 0 );
+ aTstItemSet.Set( pDCCharFmt->GetAttrSet(), sal_True );
+ return HasScriptDependentItems( aTstItemSet, sal_False );
+ }
+ }
+
+ return sal_False;
+}
+
+static sal_Bool OutCSS1Rule( SwHTMLWriter& rHTMLWrt, const String& rSelector,
+ const SfxItemSet& rItemSet, sal_Bool bHasClass,
+ sal_Bool bCheckForPseudo )
+{
+ sal_Bool bScriptDependent = sal_False;
+ if( SwHTMLWriter::HasScriptDependentItems( rItemSet,
+ rHTMLWrt.IsHTMLMode(HTMLMODE_DROPCAPS) && bHasClass ) )
+ {
+ bScriptDependent = sal_True;
+ String aSelector( rSelector );
+
+ String aPseudo;
+ if( bCheckForPseudo )
+ {
+ xub_StrLen nPos = aSelector.SearchBackward( ':' );
+ if( STRING_NOTFOUND != nPos )
+ {
+ aPseudo = aSelector.Copy( nPos );
+ aSelector.Erase( nPos );
+ }
+ }
+
+ if( !bHasClass )
+ {
+ // If we are exporting styles for a tag we have to export a tag
+ // rule for all properties that aren't style dependent and
+ // some class rule for the additional style dependen properties
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_NO_SCRIPT|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
+ TRUE, &rSelector );
+ rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, FALSE );
+ }
+
+ SfxItemSet aScriptItemSet( *rItemSet.GetPool(),
+ RES_CHRATR_FONT, RES_CHRATR_FONTSIZE,
+ RES_CHRATR_LANGUAGE, RES_CHRATR_POSTURE,
+ RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT,
+ RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_WEIGHT,
+ 0 );
+ aScriptItemSet.Put( rItemSet );
+
+ String aNewSelector( aSelector );
+ aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".western") );
+ aNewSelector.Append( aPseudo );
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_WESTERN|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
+ TRUE, &aNewSelector );
+ rHTMLWrt.OutCSS1_SfxItemSet( aScriptItemSet, FALSE );
+ }
+
+ aNewSelector = aSelector;
+ aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".cjk") );
+ aNewSelector.Append( aPseudo );
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
+ TRUE, &aNewSelector );
+ rHTMLWrt.OutCSS1_SfxItemSet( aScriptItemSet, FALSE );
+ }
+
+ aNewSelector = aSelector;
+ aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".ctl") );
+ aNewSelector.Append( aPseudo );
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
+ TRUE, &aNewSelector );
+ rHTMLWrt.OutCSS1_SfxItemSet( aScriptItemSet, FALSE );
+ }
+ }
+ else
+ {
+ // If ther are script dependencies and we are derived from a tag,
+ // when we have to export a style dependent class for all
+ // scripts
+ String aNewSelector( aSelector );
+ aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-western") );
+ aNewSelector.Append( aPseudo );
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_WESTERN|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
+ TRUE, &aNewSelector );
+ rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, FALSE );
+ }
+
+ aNewSelector = aSelector;
+ aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-cjk") );
+ aNewSelector.Append( aPseudo );
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
+ TRUE, &aNewSelector );
+ rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, FALSE );
+ }
+
+ aNewSelector = aSelector;
+ aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-ctl") );
+ aNewSelector.Append( aPseudo );
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
+ TRUE, &aNewSelector );
+ rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, FALSE );
+ }
+ }
+ }
+ else
+ {
+ // If there are no script dependencies, when all items are
+ // exported in one step. For hyperlinks only, a script information
+ // must be there, because these two chr formats don't support
+ // script dependencies by now.
+ SwCSS1OutMode aMode( rHTMLWrt,
+ rHTMLWrt.nCSS1Script|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
+ TRUE, &rSelector );
+ rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, FALSE );
+ }
+
+ return bScriptDependent;
+}
+
+static void OutCSS1DropCapRule(
+ SwHTMLWriter& rHTMLWrt, const String& rSelector,
+ const SwFmtDrop& rDrop, sal_Bool bHasClass,
+ sal_Bool bHasScriptDependencies )
+{
+ const SwCharFmt *pDCCharFmt = rDrop.GetCharFmt();
+ if( (bHasScriptDependencies && bHasClass) ||
+ (pDCCharFmt && SwHTMLWriter::HasScriptDependentItems( pDCCharFmt->GetAttrSet(), sal_False ) ) )
+ {
+ String aSelector( rSelector );
+
+ String aPseudo;
+ xub_StrLen nPos = aSelector.SearchBackward( ':' );
+ if( STRING_NOTFOUND != nPos )
+ {
+ aPseudo = aSelector.Copy( nPos );
+ aSelector.Erase( nPos );
+ }
+
+ if( !bHasClass )
+ {
+ // If we are exporting styles for a tag we have to export a tag
+ // rule for all properties that aren't style dependent and
+ // some class rule for the additional style dependen properties
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_NO_SCRIPT|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
+ TRUE, &rSelector );
+ OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
+ }
+
+ SfxItemSet aScriptItemSet( rHTMLWrt.pDoc->GetAttrPool(),
+ RES_CHRATR_FONT, RES_CHRATR_FONTSIZE,
+ RES_CHRATR_LANGUAGE, RES_CHRATR_POSTURE,
+ RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT,
+ RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_WEIGHT,
+ 0 );
+ if( pDCCharFmt )
+ aScriptItemSet.Set( pDCCharFmt->GetAttrSet(), sal_True );
+
+ String aNewSelector( aSelector );
+ aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".western") );
+ aNewSelector.Append( aPseudo );
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_WESTERN|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
+ TRUE, &aNewSelector );
+ OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop, &aScriptItemSet );
+ }
+
+ aNewSelector = aSelector;
+ aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".cjk") );
+ aNewSelector.Append( aPseudo );
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
+ TRUE, &aNewSelector );
+ OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop, &aScriptItemSet );
+ }
+
+ aNewSelector = aSelector;
+ aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".ctl") );
+ aNewSelector.Append( aPseudo );
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
+ TRUE, &aNewSelector );
+ OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop, &aScriptItemSet );
+ }
+ }
+ else
+ {
+ // If ther are script dependencies and we are derived from a tag,
+ // when we have to export a style dependent class for all
+ // scripts
+ String aNewSelector( aSelector );
+ aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-western") );
+ aNewSelector.Append( aPseudo );
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_WESTERN|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
+ TRUE, &aNewSelector );
+ OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
+ }
+
+ aNewSelector = aSelector;
+ aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-cjk") );
+ aNewSelector.Append( aPseudo );
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
+ TRUE, &aNewSelector );
+ OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
+ }
+
+ aNewSelector = aSelector;
+ aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-ctl") );
+ aNewSelector.Append( aPseudo );
+ {
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
+ TRUE, &aNewSelector );
+ OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
+ }
+ }
+ }
+ else
+ {
+ // If there are no script dependencies, when all items are
+ // exported in one step. For hyperlinks only, a script information
+ // must be there, because these two chr formats don't support
+ // script dependencies by now.
+ SwCSS1OutMode aMode( rHTMLWrt,
+ rHTMLWrt.nCSS1Script|CSS1_OUTMODE_RULE|CSS1_OUTMODE_DROPCAP,
+ TRUE, &rSelector );
+ OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop );
+ }
+}
+
+static Writer& OutCSS1_SwFmt( Writer& rWrt, const SwFmt& rFmt,
+ IDocumentStylePoolAccess/*SwDoc*/ *pDoc, SwDoc *pTemplate )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ BOOL bCharFmt = FALSE;
+ switch( rFmt.Which() )
+ {
+ case RES_CHRFMT:
+ bCharFmt = TRUE;
+ break;
+
+ case RES_TXTFMTCOLL:
+ case RES_CONDTXTFMTCOLL:
+ // diese Vorlagen-Typen koennen exportiert werden
+ break;
+
+ default:
+ // und diese nicht
+ return rWrt;
+ }
+
+ // den Selector und die auszugebende Attr-Set-Tiefe ermitteln
+ String aSelector;
+ USHORT nRefPoolId = 0;
+ USHORT nDeep = GetCSS1Selector( &rFmt, aSelector, nRefPoolId );
+ if( !nDeep )
+ return rWrt; // von keiner HTML-Vorlage abgeleitet
+
+ USHORT nPoolFmtId = rFmt.GetPoolFmtId();
+
+ // Den auszugebenden Attr-Set bestimmen. Hier muessen 3 Faelle
+ // unterschieden werden:
+ // - HTML-Tag-Vorlagen (nDeep==USHRT_MAX):
+ // Es werden die Attrs ausgegeben
+ // - die in der Vorlage gesetzt sind, aber nicht im Original aus
+ // der HTML-Vorlage
+ // - die Default-Attrs fuer die Attrs, die im Original aus der
+ // HTML-Vorlage gesetzt sind, aber nicht in der vorliegeden Vorlage.
+ // - direkt von HTML-Vorlagen abgeleitete Vorlagen (nDeep==1):
+ // Es weren nur die Attribute des Vorlagen-Item-Set ohne seine
+ // Parents ausgegeben.
+ // - indirekt von HTML-Tag-Vorlagen abgeleitete Vorlagen (nDeep>1)
+ // Es werden die Attribute des Vorlagen-Item-Sets inkl. seiner Parents,
+ // aber ohne die Attribute, die in der HTML-Tag-Vorlage gesetzt sind,
+ // ausgegeben.
+
+ // einen Item-Set mit allen Attributen aus der Vorlage anlegen
+ // (ausser fuer nDeep==1)
+ const SfxItemSet& rFmtItemSet = rFmt.GetAttrSet();
+ SfxItemSet aItemSet( *rFmtItemSet.GetPool(), rFmtItemSet.GetRanges() );
+ aItemSet.Set( rFmtItemSet, TRUE ); // Was nDeep!=1 that is not working
+ // for script dependent items buts should
+ // not make a deifference for any other
+
+ BOOL bSetDefaults = TRUE, bClearSame = TRUE;
+ const SwFmt *pRefFmt = 0;
+ const SwFmt *pRefFmtScript = 0;
+ switch( nDeep )
+ {
+ case CSS1_FMT_ISTAG:
+ pRefFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate );
+ break;
+ case CSS1_FMT_CMPREF:
+ pRefFmt = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pDoc );
+ pRefFmtScript = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate );
+ bClearSame = FALSE;
+ break;
+ default:
+ pRefFmt = SwHTMLWriter::GetParentFmt( rFmt, nDeep );
+ pRefFmtScript = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate );
+ bSetDefaults = FALSE;
+ break;
+ }
+
+ if( pRefFmt )
+ {
+ // Den Item-Set der Referenz-Vorlage (inkl. seiner Parents) vom
+ // ItemSet abziehen
+ SwHTMLWriter::SubtractItemSet( aItemSet, pRefFmt->GetAttrSet(),
+ bSetDefaults, bClearSame,
+ pRefFmtScript
+ ? &pRefFmtScript->GetAttrSet()
+ : 0 );
+
+ if( !bCharFmt )
+ {
+ const SvxULSpaceItem& rULItem = pRefFmt->GetULSpace();
+ rHTMLWrt.nDfltTopMargin = rULItem.GetUpper();
+ rHTMLWrt.nDfltBottomMargin = rULItem.GetLower();
+ }
+ }
+ else if( CSS1_FMT_ISTAG==nDeep && !bCharFmt )
+ {
+ // die Default-Abstaende nach oben und unten setzen (fuer den
+ // Fall, dass es keine Vorlage als Referenz gibt)
+ rHTMLWrt.nDfltTopMargin = 0;
+ rHTMLWrt.nDfltBottomMargin = HTML_PARSPACE;
+ if( USER_FMT & nPoolFmtId )
+ {
+ // Benutzer-Vorlagen
+ const String& rNm = rFmt.GetName();
+ switch( rNm.GetChar(0) )
+ {
+ case 'D': if( rNm.EqualsAscii("DD 1") || rNm.EqualsAscii("DT 1") )
+ rHTMLWrt.nDfltBottomMargin = 0;
+ break;
+ case 'L': if(rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_listing) )
+ rHTMLWrt.nDfltBottomMargin = 0;
+ break;
+ case 'P': if( rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_preformtxt) )
+ rHTMLWrt.nDfltBottomMargin = 0;
+ break;
+ case 'X': if( rNm.EqualsAscii(OOO_STRING_SVTOOLS_HTML_xmp) )
+ rHTMLWrt.nDfltBottomMargin = 0;
+ break;
+ }
+ }
+ else
+ {
+ // Pool-Vorlagen
+ switch( nPoolFmtId )
+ {
+ case RES_POOLCOLL_HEADLINE1:
+ case RES_POOLCOLL_HEADLINE2:
+ case RES_POOLCOLL_HEADLINE3:
+ case RES_POOLCOLL_HEADLINE4:
+ case RES_POOLCOLL_HEADLINE5:
+ case RES_POOLCOLL_HEADLINE6:
+ rHTMLWrt.nDfltTopMargin = HTML_HEADSPACE;
+ break;
+ case RES_POOLCOLL_SENDADRESS:
+ case RES_POOLCOLL_HTML_DT:
+ case RES_POOLCOLL_HTML_DD:
+ case RES_POOLCOLL_HTML_PRE:
+ rHTMLWrt.nDfltBottomMargin = 0;
+ break;
+ }
+ }
+ }
+
+ // wo nicht auszugeben ist ...
+ if( !aItemSet.Count() )
+ return rWrt;
+
+ // There is no support for script dependent hyperlinks by now.
+ sal_Bool bCheckForPseudo = sal_False;
+ if( bCharFmt &&
+ (RES_POOLCHR_INET_NORMAL==nRefPoolId ||
+ RES_POOLCHR_INET_VISIT==nRefPoolId) )
+ bCheckForPseudo = sal_True;
+
+
+ // jetzt die Attribute (inkl. Selektor) ausgeben
+ sal_Bool bHasScriptDependencies = sal_False;
+ if( OutCSS1Rule( rHTMLWrt, aSelector, aItemSet, CSS1_FMT_ISTAG != nDeep,
+ bCheckForPseudo ) )
+ {
+ if( bCharFmt )
+ rHTMLWrt.aScriptTextStyles.Insert( new String( rFmt.GetName() ) );
+ else
+ {
+ if( nPoolFmtId==RES_POOLCOLL_TEXT )
+ rHTMLWrt.aScriptParaStyles.Insert
+ (new String( pDoc->GetTxtCollFromPool
+ ( RES_POOLCOLL_STANDARD, false )->GetName()
+ ) );
+ rHTMLWrt.aScriptParaStyles.Insert( new String( rFmt.GetName() ) );
+ }
+ bHasScriptDependencies = sal_True;
+ }
+
+ if( nPoolFmtId==RES_POOLCOLL_TEXT && !rHTMLWrt.bFirstCSS1Property )
+ rHTMLWrt.bPoolCollTextModified = TRUE;
+
+ // Drop-Caps ausgeben
+ const SfxPoolItem *pItem;
+ if( rHTMLWrt.IsHTMLMode(HTMLMODE_DROPCAPS) &&
+ SFX_ITEM_SET==aItemSet.GetItemState( RES_PARATR_DROP, FALSE, &pItem ))
+ {
+ String sOut( aSelector );
+ sOut.Append( ':');
+ sOut.AppendAscii( sCSS1_first_letter );
+ const SwFmtDrop *pDrop = (const SwFmtDrop *)pItem;
+ OutCSS1DropCapRule( rHTMLWrt, sOut, *pDrop, CSS1_FMT_ISTAG != nDeep, bHasScriptDependencies );
+ }
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SwPageDesc( Writer& rWrt, const SwPageDesc& rPageDesc,
+ IDocumentStylePoolAccess/*SwDoc*/ *pDoc, SwDoc *pTemplate,
+ USHORT nRefPoolId, BOOL bExtRef,
+ BOOL bPseudo )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ const SwPageDesc* pRefPageDesc = 0;
+ if( !bExtRef )
+ pRefPageDesc = pDoc->GetPageDescFromPool( nRefPoolId, false );
+ else if( pTemplate )
+ pRefPageDesc = pTemplate->GetPageDescFromPool( nRefPoolId, false );
+
+ String aSelector( '@' );
+ aSelector.AppendAscii( sCSS1_page );
+
+ if( bPseudo )
+ {
+ const sal_Char *pPseudo = 0;
+ switch( rPageDesc.GetPoolFmtId() )
+ {
+ case RES_POOLPAGE_FIRST: pPseudo = sCSS1_first; break;
+ case RES_POOLPAGE_LEFT: pPseudo = sCSS1_left; break;
+ case RES_POOLPAGE_RIGHT: pPseudo = sCSS1_right; break;
+ }
+ if( pPseudo )
+ {
+ aSelector.Append( ':' );
+ aSelector.AppendAscii( pPseudo );
+ }
+ }
+
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_RULE_ON|CSS1_OUTMODE_TEMPLATE,
+ TRUE, &aSelector );
+
+ // Die Groesse: Wenn sie sich nur durch das Landscape-Flag unterscheidet,
+ // wird nur Portrait oder Landscape exportiert. Sonst wird die Groesse
+ // exportiert.
+ BOOL bRefLandscape = pRefPageDesc ? pRefPageDesc->GetLandscape() : FALSE;
+ Size aRefSz;
+ const Size& rSz = rPageDesc.GetMaster().GetFrmSize().GetSize();
+ if( pRefPageDesc )
+ {
+ aRefSz = pRefPageDesc->GetMaster().GetFrmSize().GetSize();
+ if( bRefLandscape != rPageDesc.GetLandscape() )
+ {
+ long nTmp = aRefSz.Height();
+ aRefSz.Height() = aRefSz.Width();
+ aRefSz.Width() = nTmp;
+ }
+ }
+
+ // Boeser uebler Hack: Auf der Seiten-Tabpage gibt es leichte
+ // Rundungsfehler bei der Seitengroesse. Unter anderem wegen bug
+ // 25535 wird dummerweise auch noch immer Size-Item vom Dialog geputtet,
+ // auch wenn man gar nichts geaendert hat. Folge: Sobald man einmal im
+ // Seiten-Dialog war und ihn mit OK verlassen hat, bekommt man eine
+ // neue Seitengroesse, die dann hier exportiert wuerde. Um das
+ // vermeiden erlauben wir hier kleine Abweichungen.
+ if( Abs( rSz.Width() - aRefSz.Width() ) <= 2 &&
+ Abs( rSz.Height() - aRefSz.Height() ) <= 2 )
+ {
+ if( bRefLandscape != rPageDesc.GetLandscape() )
+ {
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_size,
+ rPageDesc.GetLandscape() ? sCSS1_PV_landscape
+ : sCSS1_PV_portrait );
+ }
+ }
+ else
+ {
+ ByteString sVal;
+ AddUnitPropertyValue( rSz.Width(), rHTMLWrt.GetCSS1Unit(), sVal );
+ sVal += ' ';
+ AddUnitPropertyValue( rSz.Height(), rHTMLWrt.GetCSS1Unit(), sVal );
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_size, sVal );
+ }
+
+ // Die Abstand-Attribute koennen auf gwohnte Weise exportiert werden
+ const SwFrmFmt &rMaster = rPageDesc.GetMaster();
+ SfxItemSet aItemSet( *rMaster.GetAttrSet().GetPool(),
+ RES_LR_SPACE, RES_UL_SPACE );
+ aItemSet.Set( rMaster.GetAttrSet(), TRUE );
+
+ if( pRefPageDesc )
+ {
+ SwHTMLWriter::SubtractItemSet( aItemSet,
+ pRefPageDesc->GetMaster().GetAttrSet(),
+ TRUE );
+ }
+
+ OutCSS1_SvxULSpace_SvxLRSpace( rWrt, aItemSet, FALSE );
+
+ // Wenn fuer einen Pseudo-Selektor keine Property ausgegeben wurde, muessen
+ // wir trotzdem etwas ausgeben, damit beim Import die entsprechende
+ // Vorlage angelegt wird.
+ if( rHTMLWrt.bFirstCSS1Property && bPseudo )
+ {
+ rHTMLWrt.OutNewLine();
+ ByteString sTmp( aSelector, rHTMLWrt.eDestEnc );
+ rWrt.Strm() << sTmp.GetBuffer() << " {";
+ rHTMLWrt.bFirstCSS1Property = FALSE;
+ }
+
+ if( !rHTMLWrt.bFirstCSS1Property )
+ rWrt.Strm() << sCSS1_rule_end;
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SwFtnInfo( Writer& rWrt, const SwEndNoteInfo& rInfo,
+ SwDoc *pDoc, USHORT nNotes, BOOL bEndNote )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ String aSelector;
+
+ if( nNotes > 0 )
+ {
+ aSelector.AssignAscii( OOO_STRING_SVTOOLS_HTML_anchor );
+ aSelector.Append( '.');
+ aSelector.AppendAscii( bEndNote ? OOO_STRING_SVTOOLS_HTML_sdendnote_anc
+ : OOO_STRING_SVTOOLS_HTML_sdfootnote_anc );
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE,
+ TRUE, &aSelector );
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_size,
+ sHTML_FTN_fontheight );
+ rHTMLWrt.Strm() << sCSS1_rule_end;
+ }
+
+ const SwCharFmt *pSymCharFmt = rInfo.GetCharFmt( *pDoc );
+ if( pSymCharFmt )
+ {
+ const SfxItemSet& rFmtItemSet = pSymCharFmt->GetAttrSet();
+ SfxItemSet aItemSet( *rFmtItemSet.GetPool(), rFmtItemSet.GetRanges() );
+ aItemSet.Set( rFmtItemSet, TRUE );
+
+ // Wenn es Fuss- bzw. Endnoten gibt, dann muessen alles Attribute
+ // ausgegeben werden, damit Netscape das Dokument richtig anzeigt.
+ // Anderenfalls genuegt es, die Unterschiede zur Fuss-/Endnoten
+ // Vorlage rauszuschreiben.
+ if( nNotes == 0 && rHTMLWrt.pTemplate )
+ {
+ SwFmt *pRefFmt = rHTMLWrt.pTemplate->GetCharFmtFromPool(
+ static_cast< sal_uInt16 >(bEndNote ? RES_POOLCHR_ENDNOTE : RES_POOLCHR_FOOTNOTE) );
+ if( pRefFmt )
+ SwHTMLWriter::SubtractItemSet( aItemSet, pRefFmt->GetAttrSet(),
+ TRUE );
+ }
+ if( aItemSet.Count() )
+ {
+ aSelector.AssignAscii( OOO_STRING_SVTOOLS_HTML_anchor );
+ aSelector.Append( '.');
+ aSelector.AppendAscii( bEndNote ? OOO_STRING_SVTOOLS_HTML_sdendnote_sym
+ : OOO_STRING_SVTOOLS_HTML_sdfootnote_sym );
+ if( OutCSS1Rule( rHTMLWrt, aSelector, aItemSet, sal_True, sal_False ))
+ rHTMLWrt.aScriptTextStyles.Insert( new String( pSymCharFmt->GetName() ) );
+ }
+ }
+
+ return rWrt;
+}
+
+Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet,
+ String aEmbBGGrfName )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
+ CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_BODY );
+
+
+ // Es werden nur die Attribute der Seiten-Vorlage ausgegeben.
+ // Die Attribute der Standard-Absatz-Vorlage werden schon beim
+ // Export der Absatz-Vorlagen beruecksichtigt.
+
+ const SfxPoolItem *pItem;
+ if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BACKGROUND, FALSE,
+ &pItem ) )
+ {
+ OutCSS1_SvxBrush( rWrt, *pItem, CSS1_BACKGROUND_PAGE,
+ &aEmbBGGrfName );
+ }
+
+ if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BOX, FALSE,
+ &pItem ))
+ {
+ OutCSS1_SvxBox( rWrt, *pItem );
+ }
+
+ if( !rHTMLWrt.bFirstCSS1Property )
+ {
+ // wenn eine Property als Bestandteil einer Style-Option
+ // ausgegeben wurde, muss die Optiomn noch beendet werden
+ rWrt.Strm() << '\"';
+ }
+
+ return rWrt;
+}
+
+Writer& OutCSS1_ParaTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ SwCSS1OutMode aMode( rHTMLWrt, rHTMLWrt.nCSS1Script|CSS1_OUTMODE_STYLE_OPT |
+ CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_PARA );
+ rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, FALSE );
+
+ return rWrt;
+}
+
+Writer& OutCSS1_HintSpanTag( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_SPAN_TAG |
+ CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_HINT );
+
+ Out( aCSS1AttrFnTab, rHt, rWrt );
+
+ if( !rHTMLWrt.bFirstCSS1Property && rHTMLWrt.bTagOn )
+ rWrt.Strm() << sCSS1_span_tag_end;
+
+ return rWrt;
+}
+
+Writer& OutCSS1_HintStyleOpt( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
+ CSS1_OUTMODE_ENCODE|
+ CSS1_OUTMODE_HINT );
+
+ Out( aCSS1AttrFnTab, rHt, rWrt );
+
+ if( !rHTMLWrt.bFirstCSS1Property )
+ rWrt.Strm() << '\"';
+
+ return rWrt;
+}
+
+// Wrapper fuer die Ausgabe von Tabellen-Hintergruenden
+Writer& OutCSS1_TableBGStyleOpt( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON |
+ CSS1_OUTMODE_ENCODE|
+ CSS1_OUTMODE_TABLEBOX );
+ OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_TABLE, 0 );
+
+ if( !rHTMLWrt.bFirstCSS1Property )
+ rWrt.Strm() << '\"';
+
+ return rWrt;
+}
+
+
+Writer& OutCSS1_NumBulListStyleOpt( Writer& rWrt, const SwNumRule& rNumRule,
+ BYTE nLevel )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT |
+ CSS1_OUTMODE_ENCODE|CSS1_OUTMODE_PARA );
+
+ const SwNumFmt& rNumFmt = rNumRule.Get( nLevel );
+
+ long nLSpace = rNumFmt.GetAbsLSpace();
+ long nFirstLineOffset = rNumFmt.GetFirstLineOffset();
+ long nDfltFirstLineOffset = HTML_NUMBUL_INDENT;
+ if( nLevel > 0 )
+ {
+ const SwNumFmt& rPrevNumFmt = rNumRule.Get( nLevel-1 );
+ nLSpace -= rPrevNumFmt.GetAbsLSpace();
+ nDfltFirstLineOffset = rPrevNumFmt.GetFirstLineOffset();
+ }
+
+ if( rHTMLWrt.IsHTMLMode(HTMLMODE_LSPACE_IN_NUMBUL) &&
+ nLSpace != HTML_NUMBUL_MARGINLEFT )
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_left, nLSpace );
+
+ if( rHTMLWrt.IsHTMLMode(HTMLMODE_FRSTLINE_IN_NUMBUL) &&
+ nFirstLineOffset != nDfltFirstLineOffset )
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_text_indent, nFirstLineOffset );
+
+ if( !rHTMLWrt.bFirstCSS1Property )
+ rWrt.Strm() << '\"';
+
+ return rWrt;
+}
+
+//-----------------------------------------------------------------------
+
+void SwHTMLWriter::OutCSS1_FrmFmtOptions( const SwFrmFmt& rFrmFmt,
+ sal_uInt32 nFrmOpts,
+ const SdrObject *pSdrObj,
+ const SfxItemSet *pItemSet )
+{
+ SwCSS1OutMode aMode( *this, CSS1_OUTMODE_STYLE_OPT_ON |
+ CSS1_OUTMODE_ENCODE|
+ CSS1_OUTMODE_FRAME );
+
+ const SwFmtHoriOrient& rHoriOri = rFrmFmt.GetHoriOrient();
+ SvxLRSpaceItem aLRItem( rFrmFmt.GetLRSpace() );
+ SvxULSpaceItem aULItem( rFrmFmt.GetULSpace() );
+ if( nFrmOpts & HTML_FRMOPT_S_ALIGN )
+ {
+ const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor();
+ switch( rAnchor.GetAnchorId() )
+ {
+ case FLY_AT_CNTNT:
+ case FLY_AUTO_CNTNT:
+ if( text::RelOrientation::FRAME == rHoriOri.GetRelationOrient() ||
+ text::RelOrientation::PRINT_AREA == rHoriOri.GetRelationOrient() )
+ {
+ if( !(nFrmOpts & HTML_FRMOPT_ALIGN) )
+ {
+ // float
+ const sal_Char *pStr = text::HoriOrientation::RIGHT==rHoriOri.GetHoriOrient()
+ ? sCSS1_PV_right
+ : sCSS1_PV_left;
+ OutCSS1_PropertyAscii( sCSS1_P_float, pStr );
+ }
+ break;
+ }
+
+ case FLY_PAGE:
+ case FLY_AT_FLY:
+ {
+ // position
+ OutCSS1_PropertyAscii( sCSS1_P_position, sCSS1_PV_absolute );
+
+ // Fuer top/left muessen die Abstaende des Rahmens von
+ // der Position abgezogen werden, da sie in CSS1 noch
+ // zur Position addiert werden.
+ // Das funktioniert auch fuer automatisch ausgerichtete
+ // Rahmen, obwohl der Abstand da ja auch im Writer noch
+ // addiert wird. Denn auch in diesem Fall enthalten
+ // die Orient-Attribute die korrekte Position
+
+ // top
+ long nXPos=0, nYPos=0;
+ BOOL bOutXPos = FALSE, bOutYPos = FALSE;
+ if( RES_DRAWFRMFMT == rFrmFmt.Which() )
+ {
+ ASSERT( pSdrObj, "Kein SdrObject uebergeben. Ineffizient" );
+ if( !pSdrObj )
+ pSdrObj = rFrmFmt.FindSdrObject();
+ ASSERT( pSdrObj, "Wo ist das SdrObject" );
+ if( pSdrObj )
+ {
+ Point aPos( pSdrObj->GetRelativePos() );
+ nXPos = aPos.A();
+ nYPos = aPos.B();
+ }
+ bOutXPos = bOutYPos = TRUE;
+ }
+ else
+ {
+ bOutXPos = text::RelOrientation::CHAR != rHoriOri.GetRelationOrient();
+ nXPos = text::HoriOrientation::NONE == rHoriOri.GetHoriOrient()
+ ? rHoriOri.GetPos() : 0;
+
+ const SwFmtVertOrient& rVertOri = rFrmFmt.GetVertOrient();
+ bOutYPos = text::RelOrientation::CHAR != rVertOri.GetRelationOrient();
+ nYPos = text::VertOrientation::NONE == rVertOri.GetVertOrient()
+ ? rVertOri.GetPos() : 0;
+ }
+
+ if( bOutYPos )
+ {
+ if( IsHTMLMode( HTMLMODE_FLY_MARGINS) )
+ {
+ nYPos -= aULItem.GetUpper();
+ if( nYPos < 0 )
+ {
+ aULItem.SetUpper( (USHORT)(aULItem.GetUpper() + nYPos) );
+ nYPos = 0;
+ }
+ }
+
+ OutCSS1_UnitProperty( sCSS1_P_top, nYPos );
+ }
+
+ if( bOutXPos )
+ {
+ // left
+ if( IsHTMLMode( HTMLMODE_FLY_MARGINS) )
+ {
+ nXPos -= aLRItem.GetLeft();
+ if( nXPos < 0 )
+ {
+ aLRItem.SetLeft( (USHORT)(aLRItem.GetLeft() + nXPos) );
+ nXPos = 0;
+ }
+ }
+
+ OutCSS1_UnitProperty( sCSS1_P_left, nXPos );
+ }
+ }
+ break;
+
+ default:
+ ;
+ }
+ }
+
+ // width/height
+ if( nFrmOpts & HTML_FRMOPT_S_SIZE )
+ {
+ if( RES_DRAWFRMFMT == rFrmFmt.Which() )
+ {
+ ASSERT( pSdrObj, "Kein SdrObject uebergeben. Ineffizient" );
+ if( !pSdrObj )
+ pSdrObj = rFrmFmt.FindSdrObject();
+ ASSERT( pSdrObj, "Wo ist das SdrObject" );
+ if( pSdrObj )
+ {
+ Size aTwipSz( pSdrObj->GetLogicRect().GetSize() );
+ if( nFrmOpts & HTML_FRMOPT_S_WIDTH )
+ {
+ if( nFrmOpts & HTML_FRMOPT_S_PIXSIZE )
+ OutCSS1_PixelProperty( sCSS1_P_width, aTwipSz.Width(),
+ FALSE );
+ else
+ OutCSS1_UnitProperty( sCSS1_P_width, aTwipSz.Width() );
+ }
+ if( nFrmOpts & HTML_FRMOPT_S_HEIGHT )
+ {
+ if( nFrmOpts & HTML_FRMOPT_S_PIXSIZE )
+ OutCSS1_PixelProperty( sCSS1_P_height, aTwipSz.Height(),
+ TRUE );
+ else
+ OutCSS1_UnitProperty( sCSS1_P_height, aTwipSz.Height() );
+ }
+ }
+ }
+ else
+ {
+ ASSERT( HTML_FRMOPT_ABSSIZE & nFrmOpts,
+ "Absolute Groesse wird exportiert" );
+ ASSERT( HTML_FRMOPT_ANYSIZE & nFrmOpts,
+ "Jede Groesse wird exportiert" );
+ USHORT nMode = 0;
+ if( nFrmOpts & HTML_FRMOPT_S_WIDTH )
+ nMode |= CSS1_FRMSIZE_WIDTH;
+ if( nFrmOpts & HTML_FRMOPT_S_HEIGHT )
+ nMode |= (CSS1_FRMSIZE_MINHEIGHT|CSS1_FRMSIZE_FIXHEIGHT);
+ if( nFrmOpts & HTML_FRMOPT_S_PIXSIZE )
+ nMode |= CSS1_FRMSIZE_PIXEL;
+
+ OutCSS1_SwFmtFrmSize( *this, rFrmFmt.GetFrmSize(), nMode );
+ }
+ }
+
+ const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
+ // margin-*
+ if( (nFrmOpts & HTML_FRMOPT_S_SPACE) &&
+ IsHTMLMode( HTMLMODE_FLY_MARGINS) )
+ {
+ const SvxLRSpaceItem *pLRItem = 0;
+ const SvxULSpaceItem *pULItem = 0;
+ if( SFX_ITEM_SET == rItemSet.GetItemState( RES_LR_SPACE, TRUE ) )
+ pLRItem = &aLRItem;
+ if( SFX_ITEM_SET == rItemSet.GetItemState( RES_UL_SPACE, TRUE ) )
+ pULItem = &aULItem;
+ if( pLRItem || pULItem )
+ OutCSS1_SvxULSpace_SvxLRSpace( *this, pULItem, pLRItem );
+ }
+
+ // border
+ if( nFrmOpts & HTML_FRMOPT_S_BORDER )
+ {
+ const SfxPoolItem* pItem;
+ if( nFrmOpts & HTML_FRMOPT_S_NOBORDER )
+ OutCSS1_SvxBox( *this, rFrmFmt.GetBox() );
+ else if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BOX, TRUE, &pItem ) )
+ OutCSS1_SvxBox( *this, *pItem );
+ }
+
+ // background (wenn, dann muss auch eine Farbe ausgegeben werden)
+ if( nFrmOpts & HTML_FRMOPT_S_BACKGROUND )
+ OutCSS1_FrmFmtBackground( rFrmFmt );
+
+ if( pItemSet )
+ OutCSS1_SfxItemSet( *pItemSet, FALSE );
+
+ if( !bFirstCSS1Property )
+ Strm() << '\"';
+}
+
+void SwHTMLWriter::OutCSS1_TableFrmFmtOptions( const SwFrmFmt& rFrmFmt )
+{
+ SwCSS1OutMode aMode( *this, CSS1_OUTMODE_STYLE_OPT_ON |
+ CSS1_OUTMODE_ENCODE|
+ CSS1_OUTMODE_TABLE );
+
+ const SfxPoolItem *pItem;
+ const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
+ if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BACKGROUND, FALSE, &pItem ) )
+ OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_TABLE, 0 );
+
+ if( IsHTMLMode( HTMLMODE_PRINT_EXT ) )
+ OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( *this, rItemSet, FALSE );
+
+ if( SFX_ITEM_SET==rItemSet.GetItemState( RES_LAYOUT_SPLIT, FALSE, &pItem ) )
+ OutCSS1_SwFmtLayoutSplit( *this, *pItem );
+
+ if( !bFirstCSS1Property )
+ Strm() << '\"';
+}
+
+void SwHTMLWriter::OutCSS1_SectionFmtOptions( const SwFrmFmt& rFrmFmt )
+{
+ SwCSS1OutMode aMode( *this, CSS1_OUTMODE_STYLE_OPT_ON |
+ CSS1_OUTMODE_ENCODE|
+ CSS1_OUTMODE_SECTION );
+
+ const SfxPoolItem *pItem;
+ const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
+ if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BACKGROUND, FALSE, &pItem ) )
+ OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_SECTION, 0 );
+
+ if( !bFirstCSS1Property )
+ Strm() << '\"';
+}
+
+static BOOL OutCSS1_FrmFmtBrush( SwHTMLWriter& rWrt,
+ const SvxBrushItem& rBrushItem )
+{
+ BOOL bWritten = FALSE;
+ /// OD 02.09.2002 #99657#
+ /// output brush of frame format, if its background color is not "no fill"/"auto fill"
+ /// or it has a background graphic.
+ if( rBrushItem.GetColor() != COL_TRANSPARENT ||
+ 0 != rBrushItem.GetGraphicLink() ||
+ 0 != rBrushItem.GetGraphicPos() )
+ {
+ OutCSS1_SvxBrush( rWrt, rBrushItem, CSS1_BACKGROUND_FLY, 0 );
+ bWritten = TRUE;
+ }
+ return bWritten;
+}
+
+void SwHTMLWriter::OutCSS1_FrmFmtBackground( const SwFrmFmt& rFrmFmt )
+{
+ // Wenn der Rahmen selbst einen Hintergrund hat, wird der ausgegeben.
+ if( OutCSS1_FrmFmtBrush( *this, rFrmFmt.GetBackground() ) )
+ return;
+
+ // Wenn der Rahmen nicht seitengebunden ist, wird sonst muss der
+ // Hintergrund vom Anker betrachtet
+ const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor();
+ RndStdIds eAnchorId = rAnchor.GetAnchorId();
+ const SwPosition *pAnchorPos = rAnchor.GetCntntAnchor();
+ if( FLY_PAGE != eAnchorId && pAnchorPos )
+ {
+ const SwNode& rNode = pAnchorPos->nNode.GetNode();
+ if( rNode.IsCntntNode() )
+ {
+ // Wenn der Rahmen in einem Content-Node verankert ist,
+ // wird der Hintergrund von Content-Node ausgegeben, wenn
+ // der einen hat.
+ if( OutCSS1_FrmFmtBrush( *this,
+ rNode.GetCntntNode()->GetSwAttrSet().GetBackground()) )
+ return;
+
+ // Sonst koennen wir evtl. auch in einer Tabelle stehen
+ const SwTableNode *pTableNd = rNode.FindTableNode();
+ if( pTableNd )
+ {
+ const SwStartNode *pBoxSttNd = rNode.FindTableBoxStartNode();
+ const SwTableBox *pBox =
+ pTableNd->GetTable().GetTblBox( pBoxSttNd->GetIndex() );
+
+ // Wenn die Box einen Hintergrund hat, nehmen wir den.
+ if( OutCSS1_FrmFmtBrush( *this,
+ pBox->GetFrmFmt()->GetBackground() ) )
+ return;
+
+ // Sonst betrachten wir den der Lines
+ const SwTableLine *pLine = pBox->GetUpper();
+ while( pLine )
+ {
+ if( OutCSS1_FrmFmtBrush( *this,
+ pLine->GetFrmFmt()->GetBackground() ) )
+ return;
+ pBox = pLine->GetUpper();
+ pLine = pBox ? pBox->GetUpper() : 0;
+ }
+
+ // Wenn da auch nichts war den der Tabelle.
+ if( OutCSS1_FrmFmtBrush( *this,
+ pTableNd->GetTable().GetFrmFmt()->GetBackground() ) )
+ return;
+ }
+
+ }
+
+ // Wenn der Anker wieder in einem Fly-Frame steht, dann
+ // wird der Hintergrund des Fly-Frames ausgegeben.
+ const SwFrmFmt *pFrmFmt = rNode.GetFlyFmt();
+ if( pFrmFmt )
+ {
+ OutCSS1_FrmFmtBackground( *pFrmFmt );
+ return;
+ }
+ }
+
+ // Schliesslich bleibt noch der Hintergrund der Seite uebrig und als
+ // letzte Rettung das Item der Config.
+ ASSERT( pCurrPageDesc, "Keine Seiten-Vorlage gemerkt" );
+ if( !OutCSS1_FrmFmtBrush( *this,
+ pCurrPageDesc->GetMaster().GetBackground() ) )
+ {
+ Color aColor( COL_WHITE );
+
+ // Die Hintergrund-Farbe wird normalerweise nur in Browse-Mode
+ // benutzt. Wir benutzen si bei einem HTML-Dokument immer und
+ // bei einem Text-Dokument nur, wenn es im Browse-Mode angezeigt
+ // wird.
+ if( pDoc->get(IDocumentSettingAccess::HTML_MODE) ||
+ pDoc->get(IDocumentSettingAccess::BROWSE_MODE))
+ {
+ ViewShell *pVSh = 0;
+ pDoc->GetEditShell( &pVSh );
+ if ( pVSh &&
+ COL_TRANSPARENT != pVSh->GetViewOptions()->GetRetoucheColor().GetColor())
+ aColor = pVSh->GetViewOptions()->GetRetoucheColor().GetColor();
+ }
+
+ ByteString sOut;
+ GetCSS1Color( aColor, sOut );
+ OutCSS1_PropertyAscii( sCSS1_P_background, sOut );
+ }
+}
+
+//-----------------------------------------------------------------------
+
+static Writer& OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( Writer& rWrt,
+ const SvxUnderlineItem *pUItem,
+ const SvxOverlineItem *pOItem,
+ const SvxCrossedOutItem *pCOItem,
+ const SvxBlinkItem *pBItem )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+ BOOL bNone = FALSE;
+
+ const sal_Char *pUStr = 0;
+ if( pUItem )
+ {
+ switch( pUItem->GetLineStyle() )
+ {
+ case UNDERLINE_NONE:
+ bNone = TRUE;
+ break;
+ case UNDERLINE_DONTKNOW:
+ break;
+ default:
+ if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
+ {
+ // das geht auch in HTML und muss nicht als STYLE-Option
+ // und darf nicht als Hint geschrieben werden
+ ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
+ "Underline als Hint schreiben?" );
+ pUStr = sCSS1_PV_underline;
+ }
+ break;
+ }
+ }
+
+ const sal_Char *pOStr = 0;
+ if( pOItem )
+ {
+ switch( pOItem->GetLineStyle() )
+ {
+ case UNDERLINE_NONE:
+ bNone = TRUE;
+ break;
+ case UNDERLINE_DONTKNOW:
+ break;
+ default:
+ if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
+ {
+ // das geht auch in HTML und muss nicht als STYLE-Option
+ // und darf nicht als Hint geschrieben werden
+ ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
+ "Overline als Hint schreiben?" );
+ pOStr = sCSS1_PV_overline;
+ }
+ break;
+ }
+ }
+
+ const sal_Char *pCOStr = 0;
+ if( pCOItem )
+ {
+ switch( pCOItem->GetStrikeout() )
+ {
+ case STRIKEOUT_NONE:
+ bNone = TRUE;
+ break;
+ case STRIKEOUT_DONTKNOW:
+ break;
+ default:
+ if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
+ {
+ // das geht auch in HTML und muss nicht als STYLE-Option
+ // und darf nicht als Hint geschrieben werden
+ ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
+ "CrossedOut als Hint schreiben?" );
+ pCOStr = sCSS1_PV_line_through;
+ }
+ break;
+ }
+ }
+
+ const sal_Char *pBStr = 0;
+ if( pBItem && rHTMLWrt.IsHTMLMode(HTMLMODE_BLINK) )
+ {
+ if( !pBItem->GetValue() )
+ {
+ bNone = TRUE;
+ }
+ else if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
+ {
+ // das geht auch in HTML und muss nicht als STYLE-Option
+ // und darf nicht als Hint geschrieben werden
+ ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
+ "Blink als Hint schreiben?" );
+ pBStr = sCSS1_PV_blink;
+ }
+ }
+
+ ByteString sOut;
+ if( pUStr )
+ sOut.Append( pUStr );
+
+ if( pOStr )
+ {
+ if( sOut.Len() )
+ sOut += ' ';
+
+ sOut.Append( pOStr );
+ }
+
+ if( pCOStr )
+ {
+ if( sOut.Len() )
+ sOut += ' ';
+
+ sOut.Append( pCOStr );
+ }
+
+ if( pBStr )
+ {
+ if( sOut.Len() )
+ sOut += ' ';
+
+ sOut.Append( pBStr );
+ }
+
+ if( sOut.Len() )
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_decoration, sOut );
+ else if( bNone )
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_decoration, sCSS1_PV_none );
+
+ return rWrt;
+}
+
+
+static Writer& OutCSS1_SvxCaseMap( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ if( !rHTMLWrt.IsHTMLMode(HTMLMODE_SMALL_CAPS) )
+ return rWrt;
+
+ const sal_Char *pStr = 0;
+ switch( ((const SvxCaseMapItem&)rHt).GetCaseMap() )
+ {
+ case SVX_CASEMAP_NOT_MAPPED: pStr = sCSS1_PV_normal; break;
+ case SVX_CASEMAP_KAPITAELCHEN: pStr = sCSS1_PV_small_caps; break;
+ default:
+ ;
+ }
+
+ if( pStr )
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_variant, pStr );
+
+ return rWrt;
+}
+
+
+static Writer& OutCSS1_SvxColor( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ // Farben muessen nicht in der Style-Option ausgegeben werden.
+ if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) &&
+ !rHTMLWrt.bCfgPreferStyles )
+ return rWrt;
+ ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
+ "Farbe wirklich als Hint ausgeben?" );
+
+ Color aColor( ((const SvxColorItem&)rHt).GetValue() );
+ if( COL_AUTO == aColor.GetColor() )
+ aColor.SetColor( COL_BLACK );
+
+ ByteString sOut;
+ GetCSS1Color( aColor, sOut );
+
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_color, sOut );
+
+ return rWrt;
+}
+
+
+static Writer& OutCSS1_SvxCrossedOut( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ // Mit dieser Methode werden nur Hints ausgegeben!
+ // Sonst wird OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink() direkt aufgerufen.
+
+ if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
+ OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( rWrt,
+ 0, 0, (const SvxCrossedOutItem *)&rHt, 0 );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxFont( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ // Fonts muessen nicht in der Style-Option ausgegeben werden.
+ if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
+ return rWrt;
+
+ sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
+ switch( rHt.Which() )
+ {
+ case RES_CHRATR_CJK_FONT: nScript = CSS1_OUTMODE_CJK; break;
+ case RES_CHRATR_CTL_FONT: nScript = CSS1_OUTMODE_CTL; break;
+ }
+ if( !rHTMLWrt.IsCSS1Script( nScript ) )
+ return rWrt;
+
+ ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
+ "Font wirklich als Hint ausgeben?" );
+
+ String sOut;
+ // MS IE3b1 hat mit einfachen Haekchen Probleme
+ USHORT nMode = rHTMLWrt.nCSS1OutMode & CSS1_OUTMODE_ANY_ON;
+ sal_Unicode cQuote = nMode == CSS1_OUTMODE_RULE_ON ? '\"' : '\'';
+ SwHTMLWriter::PrepareFontList( ((const SvxFontItem&)rHt), sOut, cQuote,
+ TRUE );
+
+ rHTMLWrt.OutCSS1_Property( sCSS1_P_font_family, sOut );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxFontHeight( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ // Font-Hoehen muessen nicht in der Style-Option ausgegeben werden.
+ // Fuer Drop-Caps wird ein andewres font-size ausgegeben
+ if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) ||
+ rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_DROPCAP ) )
+ return rWrt;
+
+ sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
+ switch( rHt.Which() )
+ {
+ case RES_CHRATR_CJK_FONTSIZE: nScript = CSS1_OUTMODE_CJK; break;
+ case RES_CHRATR_CTL_FONTSIZE: nScript = CSS1_OUTMODE_CTL; break;
+ }
+ if( !rHTMLWrt.IsCSS1Script( nScript ) )
+ return rWrt;
+
+ UINT32 nHeight = ((const SvxFontHeightItem&)rHt).GetHeight();
+ if( rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT) )
+ {
+ // einen Hint nur dann ausgeben wenn es auch was bringt
+ USHORT nSize = rHTMLWrt.GetHTMLFontSize( nHeight );
+ if( rHTMLWrt.aFontHeights[nSize-1] == nHeight )
+ return rWrt;
+ }
+ ByteString sHeight( ByteString::CreateFromInt32(
+ (sal_Int32)(nHeight/20) ) );
+ sHeight.Append( sCSS1_UNIT_pt );
+
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_size, sHeight );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxPosture( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
+ switch( rHt.Which() )
+ {
+ case RES_CHRATR_CJK_POSTURE: nScript = CSS1_OUTMODE_CJK; break;
+ case RES_CHRATR_CTL_POSTURE: nScript = CSS1_OUTMODE_CTL; break;
+ }
+ if( !rHTMLWrt.IsCSS1Script( nScript ) )
+ return rWrt;
+
+ const sal_Char *pStr = 0;
+ switch( ((const SvxPostureItem&)rHt).GetPosture() )
+ {
+ case ITALIC_NONE: pStr = sCSS1_PV_normal; break;
+ case ITALIC_OBLIQUE: pStr = sCSS1_PV_oblique; break;
+ case ITALIC_NORMAL:
+ if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
+ {
+ // das geht auch in HTML und muss nicht als STYLE-Option
+ // und darf nicht als Hint geschrieben werden
+ ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
+ "Italic als Hint schreiben?" );
+ pStr = sCSS1_PV_italic;
+ }
+ break;
+ default:
+ ;
+ }
+
+ if( pStr )
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_style, pStr );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxKerning( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ // Kerning-Item nur ausgeben, wenn volle Style-Unterst?tzung da ist
+ if( !rHTMLWrt.IsHTMLMode(HTMLMODE_FULL_STYLES) )
+ return rWrt;
+
+ INT16 nValue = ((const SvxKerningItem&)rHt).GetValue();
+ if( nValue )
+ {
+ ByteString sOut;
+ if( nValue < 0 )
+ {
+ sOut = '-';
+ nValue = -nValue;
+ }
+
+ // Breite als n.n pt
+ nValue = (nValue + 1) / 2; // 1/10pt
+ sOut.Append( ByteString::CreateFromInt32( (sal_Int32)(nValue / 10) ) );
+ sOut.Append( '.' );
+ sOut.Append( ByteString::CreateFromInt32( (sal_Int32)(nValue % 10) ) );
+ sOut.Append( sCSS1_UNIT_pt );
+
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_letter_spacing, sOut );
+ }
+ else
+ {
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_letter_spacing,
+ sCSS1_PV_normal );
+ }
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxLanguage( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ // Language will be exported rules only
+ if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
+ return rWrt;
+
+ sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
+ switch( rHt.Which() )
+ {
+ case RES_CHRATR_CJK_LANGUAGE: nScript = CSS1_OUTMODE_CJK; break;
+ case RES_CHRATR_CTL_LANGUAGE: nScript = CSS1_OUTMODE_CTL; break;
+ }
+ if( !rHTMLWrt.IsCSS1Script( nScript ) )
+ return rWrt;
+
+ ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
+ "Language wirklich als Hint ausgeben?" );
+
+ LanguageType eLang = ((const SvxLanguageItem &)rHt).GetLanguage();
+ if( LANGUAGE_DONTKNOW == eLang )
+ return rWrt;
+
+ String sOut = MsLangId::convertLanguageToIsoString( eLang );
+
+ rHTMLWrt.OutCSS1_Property( sCSS1_P_so_language, sOut );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxUnderline( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ // Mit dieser Methode werden nur Hints ausgegeben!
+ // Sonst wird OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink() direkt aufgerufen.
+
+ if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
+ OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( rWrt,
+ (const SvxUnderlineItem *)&rHt, 0, 0, 0 );
+
+ return rWrt;
+}
+
+
+static Writer& OutCSS1_SvxOverline( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ // Mit dieser Methode werden nur Hints ausgegeben!
+ // Sonst wird OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink() direkt aufgerufen.
+
+ if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
+ OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( rWrt,
+ 0, (const SvxOverlineItem *)&rHt, 0, 0 );
+
+ return rWrt;
+}
+
+
+static Writer& OutCSS1_SvxFontWeight( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ sal_uInt16 nScript = CSS1_OUTMODE_WESTERN;
+ switch( rHt.Which() )
+ {
+ case RES_CHRATR_CJK_WEIGHT: nScript = CSS1_OUTMODE_CJK; break;
+ case RES_CHRATR_CTL_WEIGHT: nScript = CSS1_OUTMODE_CTL; break;
+ }
+ if( !rHTMLWrt.IsCSS1Script( nScript ) )
+ return rWrt;
+
+ const sal_Char *pStr = 0;
+ switch( ((const SvxWeightItem&)rHt).GetWeight() )
+ {
+ case WEIGHT_ULTRALIGHT: pStr = sCSS1_PV_extra_light; break;
+ case WEIGHT_LIGHT: pStr = sCSS1_PV_light; break;
+ case WEIGHT_SEMILIGHT: pStr = sCSS1_PV_demi_light; break;
+ case WEIGHT_NORMAL: pStr = sCSS1_PV_normal; break;
+ case WEIGHT_SEMIBOLD: pStr = sCSS1_PV_demi_bold; break;
+ case WEIGHT_BOLD:
+ if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
+ {
+ // das geht auch in HTML und muss nicht als STYLE-Option
+ // und darf nicht als Hint geschrieben werden
+ ASSERT( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT),
+ "Fett als Hint schreiben?" );
+ pStr = sCSS1_PV_bold;
+ }
+ break;
+ case WEIGHT_ULTRABOLD: pStr = sCSS1_PV_extra_bold; break;
+ default:
+ pStr = sCSS1_PV_normal;;
+ }
+
+ if( pStr )
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_font_weight, pStr );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxBlink( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ // Mit dieser Methode werden nur Hints ausgegeben!
+ // Sonst wird OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink() direkt aufgerufen.
+
+ if( ((SwHTMLWriter&)rWrt).IsCSS1Source(CSS1_OUTMODE_HINT) )
+ OutCSS1_SvxTxtLn_SvxCrOut_SvxBlink( rWrt,
+ 0, 0, 0, (const SvxBlinkItem *)&rHt );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxLineSpacing( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ // #60393#: Netscape4 hat massive Probleme mit den Zellenhoehen
+ // wenn der Zeilenabstand innerhalb einer Tabelle geaendert wird
+ // und die Breite der Tabelle nicht automatisch berechnet wird
+ // (also wenn eine WIDTH-Option vorhanden ist).
+ if( rHTMLWrt.bOutTable && rHTMLWrt.bCfgNetscape4 )
+ return rWrt;
+
+ const SvxLineSpacingItem& rLSItem = (const SvxLineSpacingItem&)rHt;
+
+ USHORT nHeight = 0;
+ USHORT nPrcHeight = 0;
+ SvxLineSpace eLineSpace = rLSItem.GetLineSpaceRule();
+ switch( rLSItem.GetInterLineSpaceRule() )
+ {
+ case SVX_INTER_LINE_SPACE_OFF:
+ case SVX_INTER_LINE_SPACE_FIX:
+ {
+ switch( eLineSpace )
+ {
+ case SVX_LINE_SPACE_MIN:
+ case SVX_LINE_SPACE_FIX:
+ nHeight = rLSItem.GetLineHeight();
+ break;
+ case SVX_LINE_SPACE_AUTO:
+ nPrcHeight = 100;
+ break;
+ default:
+ ;
+ }
+ }
+ break;
+ case SVX_INTER_LINE_SPACE_PROP:
+ nPrcHeight = rLSItem.GetPropLineSpace();
+ break;
+
+ default:
+ ;
+ }
+
+ if( nHeight )
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_line_height, (long)nHeight );
+ else if( nPrcHeight )
+ {
+ ByteString sHeight(
+ ByteString::CreateFromInt32( (sal_Int32)nPrcHeight ) );
+ sHeight += '%';
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_line_height, sHeight );
+ }
+
+ return rWrt;
+
+}
+
+static Writer& OutCSS1_SvxAdjust( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ // Alignment in Style-Option nur ausgeben, wenn das Tag kein
+ // ALIGN=xxx zulaesst
+ if( rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) &&
+ !rHTMLWrt.bNoAlign)
+ return rWrt;
+
+ const sal_Char* pStr = 0;
+ switch( ((const SvxAdjustItem&)rHt).GetAdjust() )
+ {
+ case SVX_ADJUST_LEFT: pStr = sCSS1_PV_left; break;
+ case SVX_ADJUST_RIGHT: pStr = sCSS1_PV_right; break;
+ case SVX_ADJUST_BLOCK: pStr = sCSS1_PV_justify; break;
+ case SVX_ADJUST_CENTER: pStr = sCSS1_PV_center; break;
+ default:
+ ;
+ }
+
+ if( pStr )
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_text_align, pStr );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxFmtSplit( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ const sal_Char *pStr = ((const SvxFmtSplitItem&)rHt).GetValue()
+ ? sCSS1_PV_auto
+ : sCSS1_PV_avoid;
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_inside, pStr );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SwFmtLayoutSplit( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ const sal_Char *pStr = ((const SwFmtLayoutSplit&)rHt).GetValue()
+ ? sCSS1_PV_auto
+ : sCSS1_PV_avoid;
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_inside, pStr );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxWidows( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ ByteString aStr(
+ ByteString::CreateFromInt32( ((const SvxWidowsItem&)rHt).GetValue() ) );
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_widows, aStr );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxOrphans( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ ByteString aStr(
+ ByteString::CreateFromInt32( ((const SvxOrphansItem&)rHt).GetValue() ) );
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_orphans, aStr );
+
+ return rWrt;
+}
+
+static void OutCSS1_SwFmtDropAttrs( SwHTMLWriter& rHWrt,
+ const SwFmtDrop& rDrop,
+ const SfxItemSet *pCharFmtItemSet )
+{
+ // Text fliesst rechts drumrum
+ rHWrt.OutCSS1_PropertyAscii( sCSS1_P_float, sCSS1_PV_left );
+
+ // Anzahl der Zeilen -> %-Angabe fuer Font-Hoehe!
+ ByteString sOut( ByteString::CreateFromInt32( rDrop.GetLines()*100 ) );
+ sOut += '%';
+ rHWrt.OutCSS1_PropertyAscii( sCSS1_P_font_size, sOut );
+
+ // Abstand zum Text = rechter Rand
+ USHORT nDistance = rDrop.GetDistance();
+ if( nDistance > 0 )
+ rHWrt.OutCSS1_UnitProperty( sCSS1_P_margin_right, nDistance );
+
+ const SwCharFmt *pDCCharFmt = rDrop.GetCharFmt();
+ if( pCharFmtItemSet )
+ rHWrt.OutCSS1_SfxItemSet( *pCharFmtItemSet );
+ else if( pDCCharFmt )
+ rHWrt.OutCSS1_SfxItemSet( pDCCharFmt->GetAttrSet() );
+ else if( (rHWrt.nCSS1OutMode & CSS1_OUTMODE_ANY_OFF) == CSS1_OUTMODE_RULE_OFF )
+ rHWrt.Strm() << sCSS1_rule_end;
+
+}
+
+static Writer& OutCSS1_SwFmtDrop( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ // nie als Option eines Absatzes ausgeben, sondern nur als Hints
+ if( !rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT) )
+ return rWrt;
+
+ if( rHTMLWrt.bTagOn )
+ {
+ SwCSS1OutMode aMode( rHTMLWrt,
+ rHTMLWrt.nCSS1Script|CSS1_OUTMODE_SPAN_TAG1_ON|CSS1_OUTMODE_ENCODE|
+ CSS1_OUTMODE_DROPCAP );
+
+ OutCSS1_SwFmtDropAttrs( rHTMLWrt, (const SwFmtDrop&)rHt );
+ // Ein "> wird schon vom aufrufenden OutCSS1_HintAsSpanTag geschrieben.
+ }
+ else
+ {
+ HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_span, FALSE );
+ }
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SwFmtFrmSize( Writer& rWrt, const SfxPoolItem& rHt,
+ USHORT nMode )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ ByteString sOut;
+ const SwFmtFrmSize& rFSItem = (const SwFmtFrmSize&)rHt;
+
+ if( nMode & CSS1_FRMSIZE_WIDTH )
+ {
+ BYTE nPrcWidth = rFSItem.GetWidthPercent();
+ if( nPrcWidth )
+ {
+ (sOut = ByteString::CreateFromInt32( nPrcWidth) ) += '%';
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_width, sOut );
+ }
+ else if( nMode & CSS1_FRMSIZE_PIXEL )
+ {
+ rHTMLWrt.OutCSS1_PixelProperty( sCSS1_P_width,
+ rFSItem.GetSize().Width(), FALSE );
+ }
+ else
+ {
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_width,
+ rFSItem.GetSize().Width() );
+ }
+ }
+
+ if( nMode & CSS1_FRMSIZE_ANYHEIGHT )
+ {
+ BOOL bOutHeight = FALSE;
+ switch( rFSItem.GetHeightSizeType() )
+ {
+ case ATT_FIX_SIZE:
+ bOutHeight = (nMode & CSS1_FRMSIZE_FIXHEIGHT) != 0;
+ break;
+ case ATT_MIN_SIZE:
+ bOutHeight = (nMode & CSS1_FRMSIZE_MINHEIGHT) != 0;
+ break;
+ case ATT_VAR_SIZE:
+ bOutHeight = (nMode & CSS1_FRMSIZE_VARHEIGHT) != 0;
+ break;
+ default:
+ ASSERT( bOutHeight, "Hoehe wird nicht exportiert" );
+ break;
+ }
+
+ if( bOutHeight )
+ {
+ BYTE nPrcHeight = rFSItem.GetHeightPercent();
+ if( nPrcHeight )
+ {
+ (sOut = ByteString::CreateFromInt32( nPrcHeight ) ) += '%';
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_height, sOut );
+ }
+ else if( nMode & CSS1_FRMSIZE_PIXEL )
+ {
+ rHTMLWrt.OutCSS1_PixelProperty( sCSS1_P_height,
+ rFSItem.GetSize().Width(),
+ TRUE );
+ }
+ else
+ {
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_height,
+ rFSItem.GetSize().Height() );
+ }
+ }
+ }
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxLRSpace( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ const SvxLRSpaceItem& rLRItem = (const SvxLRSpaceItem&)rHt;
+
+ // Der Export der harten Attributierung ist unnoetig, wenn die
+ // neuen Werte denen der aktuellen Vorlage entsprechen
+
+ // Einen linken Rand kann es durch eine Liste bereits in der
+ // Umgebung geben
+ long nLeftMargin = (long)rLRItem.GetTxtLeft() - rHTMLWrt.nLeftMargin;
+ if( rHTMLWrt.nDfltLeftMargin != nLeftMargin )
+ {
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_left, nLeftMargin );
+ }
+
+ if( rHTMLWrt.nDfltRightMargin != rLRItem.GetRight() )
+ {
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_right,
+ (long)rLRItem.GetRight() );
+ }
+
+ // Der Erstzeilen-Einzug kann den Platz fuer eine Numerierung
+ // enthalten
+ long nFirstLineIndent = (long)rLRItem.GetTxtFirstLineOfst() -
+ rHTMLWrt.nFirstLineIndent;
+ if( rHTMLWrt.nDfltFirstLineIndent != nFirstLineIndent )
+ {
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_text_indent,
+ nFirstLineIndent );
+ }
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxULSpace( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ const SvxULSpaceItem& rULItem = (const SvxULSpaceItem&)rHt;
+
+ if( rHTMLWrt.nDfltTopMargin != rULItem.GetUpper() )
+ {
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_top,
+ (long)rULItem.GetUpper() );
+ }
+
+ if( rHTMLWrt.nDfltBottomMargin != rULItem.GetLower() )
+ {
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin_bottom,
+ (long)rULItem.GetLower() );
+ }
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
+ const SvxULSpaceItem *pULItem,
+ const SvxLRSpaceItem *pLRItem )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ if( pLRItem && pULItem &&
+ pLRItem->GetLeft() == pLRItem->GetRight() &&
+ pLRItem->GetLeft() == pULItem->GetUpper() &&
+ pLRItem->GetLeft() == pULItem->GetLower() &&
+ pLRItem->GetLeft() != rHTMLWrt.nDfltLeftMargin &&
+ pLRItem->GetRight() != rHTMLWrt.nDfltRightMargin &&
+ pULItem->GetUpper() != rHTMLWrt.nDfltTopMargin &&
+ pULItem->GetLower() != rHTMLWrt.nDfltBottomMargin )
+ {
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_margin, (long)pLRItem->GetLeft() );
+ }
+ else
+ {
+ if( pLRItem )
+ OutCSS1_SvxLRSpace( rWrt, *pLRItem );
+ if( pULItem )
+ OutCSS1_SvxULSpace( rWrt, *pULItem );
+ }
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt,
+ const SfxItemSet& rItemSet,
+ BOOL bDeep )
+{
+ const SvxULSpaceItem *pULSpace = 0;
+ const SvxLRSpaceItem *pLRSpace = 0;
+ const SfxPoolItem *pItem;
+ if( SFX_ITEM_SET == rItemSet.GetItemState( RES_LR_SPACE, bDeep, &pItem ) )
+ pLRSpace = (const SvxLRSpaceItem *)pItem;
+
+ if( SFX_ITEM_SET == rItemSet.GetItemState( RES_UL_SPACE, bDeep, &pItem ) )
+ pULSpace = (const SvxULSpaceItem *)pItem;
+
+ if( pLRSpace || pULSpace )
+ OutCSS1_SvxULSpace_SvxLRSpace( rWrt, pULSpace, pLRSpace );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt,
+ const SvxFmtBreakItem *pBreakItem,
+ const SwFmtPageDesc *pPDescItem,
+ const SvxFmtKeepItem *pKeepItem )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ if( !rHTMLWrt.IsHTMLMode(HTMLMODE_PRINT_EXT) )
+ return rWrt;
+
+ const sal_Char *pBreakBefore = 0;
+ const sal_Char *pBreakAfter = 0;
+
+ if( pKeepItem )
+ {
+ pBreakAfter = pKeepItem->GetValue() ? sCSS1_PV_avoid : sCSS1_PV_auto;
+ }
+ if( pBreakItem )
+ {
+ switch( pBreakItem->GetBreak() )
+ {
+ case SVX_BREAK_NONE:
+ pBreakBefore = sCSS1_PV_auto;
+ if( !pBreakAfter )
+ pBreakAfter = sCSS1_PV_auto;
+ break;
+
+ case SVX_BREAK_PAGE_BEFORE:
+ pBreakBefore = sCSS1_PV_always;
+ break;
+
+ case SVX_BREAK_PAGE_AFTER:
+ pBreakAfter= sCSS1_PV_always;
+ break;
+
+ default:
+ ;
+ }
+ }
+ if( pPDescItem )
+ {
+ const SwPageDesc *pPDesc = pPDescItem->GetPageDesc();
+ if( pPDesc )
+ {
+ switch( pPDesc->GetPoolFmtId() )
+ {
+ case RES_POOLPAGE_LEFT: pBreakBefore = sCSS1_PV_left; break;
+ case RES_POOLPAGE_RIGHT: pBreakBefore = sCSS1_PV_right; break;
+ default: pBreakBefore = sCSS1_PV_always; break;
+ }
+ }
+ else if( !pBreakBefore )
+ {
+ pBreakBefore = sCSS1_PV_auto;
+ }
+ }
+
+ if( pBreakBefore )
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_before,
+ pBreakBefore );
+ if( pBreakAfter )
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_page_break_after,
+ pBreakAfter );
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt,
+ const SfxItemSet& rItemSet,
+ BOOL bDeep )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+ const SfxPoolItem *pItem;
+ const SvxFmtBreakItem *pBreakItem = 0;
+ if( SFX_ITEM_SET==rItemSet.GetItemState( RES_BREAK, bDeep, &pItem ))
+ pBreakItem = (const SvxFmtBreakItem *)pItem;
+
+ const SwFmtPageDesc *pPDescItem = 0;
+ if( ( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) ||
+ !rHTMLWrt.bCSS1IgnoreFirstPageDesc ||
+ rHTMLWrt.pStartNdIdx->GetIndex() !=
+ rHTMLWrt.pCurPam->GetPoint()->nNode.GetIndex() ) &&
+ SFX_ITEM_SET==rItemSet.GetItemState( RES_PAGEDESC, bDeep, &pItem ))
+ pPDescItem = (const SwFmtPageDesc*)pItem;
+
+ const SvxFmtKeepItem *pKeepItem = 0;
+ if( SFX_ITEM_SET==rItemSet.GetItemState( RES_KEEP, bDeep, &pItem ))
+ pKeepItem = (const SvxFmtKeepItem *)pItem;
+
+ if( pBreakItem || pPDescItem || pKeepItem )
+ OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( rWrt, pBreakItem,
+ pPDescItem, pKeepItem );
+
+ return rWrt;
+}
+
+// Wrapper fuer OutCSS1_SfxItemSet etc.
+static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_ATTR, 0 );
+ return rWrt;
+}
+
+
+static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt,
+ USHORT nMode, const String *pGrfName )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ // Das Zeichen-Attribut wird nicht ausgegeben, wenn gerade
+ // Optionen ausgegeben werden
+ if( rHt.Which() < RES_CHRATR_END &&
+ rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_PARA ) )
+ return rWrt;
+
+ // Erstmal ein par Werte holen
+// const Brush &rBrush = ((const SvxBrushItem &)rHt).GetBrush();
+ const Color & rColor = ((const SvxBrushItem &)rHt).GetColor();
+ const String *pLink = pGrfName ? pGrfName
+ : ((const SvxBrushItem &)rHt).GetGraphicLink();
+ SvxGraphicPosition ePos = ((const SvxBrushItem &)rHt).GetGraphicPos();
+
+ if( CSS1_BACKGROUND_PAGE==nMode )
+ {
+ // Fuer Seitenvorlagen wurde der Grafik-Name uebergeben. Es wird
+ // nur ein Attribut ausgegeben, wenn die Grafik nicht gekachelt ist.
+ ASSERT( pLink, "Wo ist der Grafik-Name der Seitenvorlage?" );
+ if( !pLink || !pLink->Len() || GPOS_TILED==ePos )
+ return rWrt;
+ }
+
+ // Erstmal die Farbe holen
+ BOOL bColor = FALSE;
+ /// OD 02.09.2002 #99657#
+ /// set <bTransparent> to TRUE, if color is "no fill"/"auto fill"
+ BOOL bTransparent = (rColor.GetColor() == COL_TRANSPARENT);
+ Color aColor;
+ if( !bTransparent )
+ {
+ aColor = rColor;
+ bColor = TRUE;
+ }
+
+ // und jetzt eine Grafik
+ String sGrfNm;
+
+ if( !pLink )
+ {
+ // embeddete Grafik -> WriteEmbedded schreiben
+ const Graphic* pGrf = ((const SvxBrushItem &)rHt).GetGraphic();
+ if( pGrf )
+ {
+ // Grafik als (JPG-)File speichern
+ const String* pTempFileName = rHTMLWrt.GetOrigFileName();
+ if( pTempFileName )
+ sGrfNm = *pTempFileName;
+ USHORT nErr = XOutBitmap::WriteGraphic( *pGrf, sGrfNm,
+ String::CreateFromAscii("JPG"),
+ XOUTBMP_USE_NATIVE_IF_POSSIBLE );
+ if( !nErr ) // fehlerhaft, da ist nichts auszugeben
+ {
+ sGrfNm = URIHelper::SmartRel2Abs(
+ INetURLObject(rWrt.GetBaseURL()), sGrfNm,
+ URIHelper::GetMaybeFileHdl() );
+ pLink = &sGrfNm;
+ }
+ else
+ {
+ rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
+ }
+ }
+ }
+ else if( !pGrfName && rHTMLWrt.bCfgCpyLinkedGrfs )
+ {
+ sGrfNm = *pLink;
+ rWrt.CopyLocalFileToINet( sGrfNm );
+ pLink = &sGrfNm;
+ }
+
+ // In Tabellen wird nur dann etwas exportiert, wenn eine Grafik
+ // existiert.
+ if( CSS1_BACKGROUND_TABLE==nMode && !pLink )
+ return rWrt;
+
+ // ggf. noch die Ausrichtung der Grafik
+ const sal_Char *pRepeat = 0, *pHori = 0, *pVert = 0;
+ if( pLink )
+ {
+ if( GPOS_TILED==ePos )
+ {
+ pRepeat = sCSS1_PV_repeat;
+ }
+ else
+ {
+ switch( ePos )
+ {
+ case GPOS_LT:
+ case GPOS_MT:
+ case GPOS_RT:
+ pHori = sCSS1_PV_top;
+ break;
+
+ case GPOS_LM:
+ case GPOS_MM:
+ case GPOS_RM:
+ pHori = sCSS1_PV_middle;
+ break;
+
+ case GPOS_LB:
+ case GPOS_MB:
+ case GPOS_RB:
+ pHori = sCSS1_PV_bottom;
+ break;
+
+ default:
+ ;
+ }
+
+ switch( ePos )
+ {
+ case GPOS_LT:
+ case GPOS_LM:
+ case GPOS_LB:
+ pVert = sCSS1_PV_left;
+ break;
+
+ case GPOS_MT:
+ case GPOS_MM:
+ case GPOS_MB:
+ pVert = sCSS1_PV_center;
+ break;
+
+ case GPOS_RT:
+ case GPOS_RM:
+ case GPOS_RB:
+ pVert = sCSS1_PV_right;
+ break;
+
+ default:
+ ;
+ }
+
+ if( pHori || pVert )
+ pRepeat = sCSS1_PV_no_repeat;
+ }
+ }
+
+ // jetzt den String zusammen bauen
+ String sOut;
+ if( !pLink && !bColor )
+ {
+ // keine Farbe und kein Link, aber ein transparenter Brush
+ if( bTransparent && CSS1_BACKGROUND_FLY != nMode )
+ sOut.AssignAscii( sCSS1_PV_transparent );
+ }
+ else
+ {
+ if( bColor )
+ {
+ ByteString sTmp;
+ GetCSS1Color( aColor, sTmp );
+ sOut += String( sTmp, RTL_TEXTENCODING_ASCII_US );
+ }
+
+ if( pLink )
+ {
+ if( bColor )
+ sOut += ' ';
+
+ sOut.AppendAscii( sCSS1_url );
+ sOut.Append( '(' );
+ sOut.Append( String(URIHelper::simpleNormalizedMakeRelative(rWrt.GetBaseURL(),
+ *pLink)));
+
+ sOut.Append( ')' );
+
+ if( pRepeat )
+ {
+ sOut.Append( ' ' );
+ sOut.AppendAscii( pRepeat );
+ }
+
+ if( pHori )
+ {
+ sOut.Append( ' ' );
+ sOut.AppendAscii( pHori );
+ }
+ if( pVert )
+ {
+ sOut.Append( ' ' );
+ sOut.AppendAscii( pVert );
+ }
+
+ sOut.Append( ' ' );
+ sOut.AppendAscii( sCSS1_PV_scroll );
+ }
+ }
+
+ if( sOut.Len() )
+ rHTMLWrt.OutCSS1_Property( sCSS1_P_background, sOut );
+
+ return rWrt;
+}
+
+static void OutCSS1_SvxBorderLine( SwHTMLWriter& rHTMLWrt,
+ const sal_Char *pProperty,
+ const SvxBorderLine *pLine )
+{
+ if( !pLine )
+ {
+ rHTMLWrt.OutCSS1_PropertyAscii( pProperty, sCSS1_PV_none );
+ return;
+ }
+
+ BOOL bDouble = FALSE;
+ INT32 nWidth = pLine->GetOutWidth();
+ if( pLine->GetInWidth() )
+ {
+ nWidth += pLine->GetDistance();
+ nWidth += pLine->GetInWidth();
+ bDouble = TRUE;
+ }
+
+ ByteString sOut;
+ if( Application::GetDefaultDevice() &&
+ nWidth <= Application::GetDefaultDevice()->PixelToLogic(
+ Size( 1, 1 ), MapMode( MAP_TWIP) ).Width() )
+ {
+ // Wenn die Breite kleiner ist als ein Pixel, dann als 1px
+ // ausgeben, damit Netscape und IE die Linie auch darstellen.
+ sOut += "1px";
+ }
+ else
+ {
+ nWidth *= 5; // 1/100pt
+
+ // Breite als n.nn pt
+ sOut += ByteString::CreateFromInt32( nWidth / 100 );
+ (((sOut += '.')
+ += ByteString::CreateFromInt32((nWidth/10) % 10))
+ += ByteString::CreateFromInt32(nWidth % 10)) += sCSS1_UNIT_pt;
+ }
+
+ // Linien-Stil: solid oder double
+ ((sOut += ' ')
+ += (bDouble ? sCSS1_PV_double : sCSS1_PV_solid)) += ' ';
+
+ // und noch die Farbe
+ GetCSS1Color( pLine->GetColor(), sOut );
+
+ rHTMLWrt.OutCSS1_PropertyAscii( pProperty, sOut );
+}
+
+static Writer& OutCSS1_SvxBox( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ // Das Zeichen-Attribut wird nicht ausgegeben, wenn gerade
+ // Optionen ausgegeben werden
+ if( !rHTMLWrt.IsHTMLMode(HTMLMODE_PARA_BORDER))
+ return rWrt;
+
+ const SvxBoxItem& rBoxItem = (const SvxBoxItem&)rHt;
+ const SvxBorderLine *pTop = rBoxItem.GetTop();
+ const SvxBorderLine *pBottom = rBoxItem.GetBottom();
+ const SvxBorderLine *pLeft = rBoxItem.GetLeft();
+ const SvxBorderLine *pRight = rBoxItem.GetRight();
+
+ if( (pTop && pBottom && pLeft && pRight &&
+ *pTop == *pBottom && *pTop == *pLeft && *pTop == *pRight) ||
+ (!pTop && !pBottom && !pLeft && !pRight) )
+ {
+ // alle Linien gesetzt und gleich oder alle Linien nicht gesetzt
+ // => border : ...
+ OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border, pTop );
+ }
+ else
+ {
+ // sonst alle Linien individuell ausgeben
+ OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_top, pTop );
+ OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_bottom, pBottom );
+ OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_left, pLeft );
+ OutCSS1_SvxBorderLine( rHTMLWrt, sCSS1_P_border_right, pRight );
+ }
+
+ long nTopDist = pTop ? rBoxItem.GetDistance( BOX_LINE_TOP ) : 0;
+ long nBottomDist = pBottom ? rBoxItem.GetDistance( BOX_LINE_BOTTOM ) : 0;
+ long nLeftDist = pLeft ? rBoxItem.GetDistance( BOX_LINE_LEFT ) : 0;
+ long nRightDist = pRight ? rBoxItem.GetDistance( BOX_LINE_RIGHT ) : 0;
+
+ if( nTopDist == nBottomDist && nLeftDist == nRightDist )
+ {
+ ByteString sVal;
+ AddUnitPropertyValue( nTopDist, rHTMLWrt.GetCSS1Unit(), sVal );
+ if( nTopDist != nLeftDist )
+ {
+ sVal += ' ';
+ AddUnitPropertyValue( nLeftDist, rHTMLWrt.GetCSS1Unit(), sVal );
+ }
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_padding, sVal );
+ }
+ else
+ {
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_top, nTopDist );
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_bottom, nBottomDist );
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_left, nLeftDist );
+ rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_padding_right, nRightDist );
+ }
+
+ return rWrt;
+}
+
+static Writer& OutCSS1_SvxFrameDirection( Writer& rWrt, const SfxPoolItem& rHt )
+{
+ SwHTMLWriter& rHTMLWrt = static_cast< SwHTMLWriter& >( rWrt );
+
+ // Language will be exported rules only
+ if( !rHTMLWrt.IsCSS1Source( CSS1_OUTMODE_TEMPLATE ) )
+ return rWrt;
+
+ sal_uInt16 nDir =
+ static_cast< const SvxFrameDirectionItem& >( rHt ).GetValue();
+ sal_Char *pStr = 0;
+ switch( nDir )
+ {
+ case FRMDIR_HORI_LEFT_TOP:
+ case FRMDIR_VERT_TOP_LEFT:
+ pStr = sCSS1_PV_ltr;
+ break;
+ case FRMDIR_HORI_RIGHT_TOP:
+ case FRMDIR_VERT_TOP_RIGHT:
+ pStr = sCSS1_PV_rtl;
+ break;
+ case FRMDIR_ENVIRONMENT:
+ pStr = sCSS1_PV_inherit;
+ break;
+ }
+
+ if( pStr )
+ rHTMLWrt.OutCSS1_PropertyAscii( sCSS1_P_direction, pStr );
+
+ return rWrt;
+}
+
+/*
+ * lege hier die Tabellen fuer die HTML-Funktions-Pointer auf
+ * die Ausgabe-Funktionen an.
+ * Es sind lokale Strukturen, die nur innerhalb der HTML-DLL
+ * bekannt sein muessen.
+ */
+
+
+SwAttrFnTab aCSS1AttrFnTab = {
+/* RES_CHRATR_CASEMAP */ OutCSS1_SvxCaseMap,
+/* RES_CHRATR_CHARSETCOLOR */ 0,
+/* RES_CHRATR_COLOR */ OutCSS1_SvxColor,
+/* RES_CHRATR_CONTOUR */ 0,
+/* RES_CHRATR_CROSSEDOUT */ OutCSS1_SvxCrossedOut,
+/* RES_CHRATR_ESCAPEMENT */ 0,
+/* RES_CHRATR_FONT */ OutCSS1_SvxFont,
+/* RES_CHRATR_FONTSIZE */ OutCSS1_SvxFontHeight,
+/* RES_CHRATR_KERNING */ OutCSS1_SvxKerning,
+/* RES_CHRATR_LANGUAGE */ OutCSS1_SvxLanguage,
+/* RES_CHRATR_POSTURE */ OutCSS1_SvxPosture,
+/* RES_CHRATR_PROPORTIONALFONTSIZE*/0,
+/* RES_CHRATR_SHADOWED */ 0,
+/* RES_CHRATR_UNDERLINE */ OutCSS1_SvxUnderline,
+/* RES_CHRATR_WEIGHT */ OutCSS1_SvxFontWeight,
+/* RES_CHRATR_WORDLINEMODE */ 0,
+/* RES_CHRATR_AUTOKERN */ 0,
+/* RES_CHRATR_BLINK */ OutCSS1_SvxBlink,
+/* RES_CHRATR_NOHYPHEN */ 0, // Neu: nicht trennen
+/* RES_CHRATR_NOLINEBREAK */ 0, // Neu: nicht umbrechen
+/* RES_CHRATR_BACKGROUND */ OutCSS1_SvxBrush, // Neu: Zeichenhintergrund
+/* RES_CHRATR_CJK_FONT */ OutCSS1_SvxFont,
+/* RES_CHRATR_CJK_FONTSIZE */ OutCSS1_SvxFontHeight,
+/* RES_CHRATR_CJK_LANGUAGE */ OutCSS1_SvxLanguage,
+/* RES_CHRATR_CJK_POSTURE */ OutCSS1_SvxPosture,
+/* RES_CHRATR_CJK_WEIGHT */ OutCSS1_SvxFontWeight,
+/* RES_CHRATR_CTL_FONT */ OutCSS1_SvxFont,
+/* RES_CHRATR_CTL_FONTSIZE */ OutCSS1_SvxFontHeight,
+/* RES_CHRATR_CTL_LANGUAGE */ OutCSS1_SvxLanguage,
+/* RES_CHRATR_CTL_POSTURE */ OutCSS1_SvxPosture,
+/* RES_CHRATR_CTL_WEIGHT */ OutCSS1_SvxFontWeight,
+/* RES_CHRATR_ROTATE */ 0,
+/* RES_CHRATR_EMPHASIS_MARK */ 0,
+/* RES_CHRATR_TWO_LINES */ 0,
+/* RES_CHRATR_SCALEW */ 0,
+/* RES_CHRATR_RELIEF */ 0,
+/* RES_CHRATR_HIDDEN */ 0,
+/* RES_CHRATR_OVERLINE */ OutCSS1_SvxOverline,
+/* RES_CHRATR_DUMMY1 */ 0,
+/* RES_CHRATR_DUMMY2 */ 0,
+
+/* RES_TXTATR_REFMARK */ 0,
+/* RES_TXTATR_TOXMARK */ 0,
+/* RES_TXTATR_META */ 0,
+/* RES_TXTATR_METAFIELD */ 0,
+/* RES_TXTATR_AUTOFMT */ 0,
+/* RES_TXTATR_INETFMT */ 0,
+/* RES_TXTATR_CHARFMT */ 0,
+/* RES_TXTATR_CJK_RUBY */ 0,
+/* RES_TXTATR_UNKNOWN_CONTAINER */ 0,
+/* RES_TXTATR_DUMMY5 */ 0,
+
+/* RES_TXTATR_FIELD */ 0,
+/* RES_TXTATR_FLYCNT */ 0,
+/* RES_TXTATR_FTN */ 0,
+/* RES_TXTATR_DUMMY4 */ 0,
+/* RES_TXTATR_DUMMY3 */ 0,
+/* RES_TXTATR_DUMMY1 */ 0, // Dummy:
+/* RES_TXTATR_DUMMY2 */ 0, // Dummy:
+
+/* RES_PARATR_LINESPACING */ OutCSS1_SvxLineSpacing,
+/* RES_PARATR_ADJUST */ OutCSS1_SvxAdjust,
+/* RES_PARATR_SPLIT */ OutCSS1_SvxFmtSplit,
+/* RES_PARATR_WIDOWS */ OutCSS1_SvxWidows,
+/* RES_PARATR_ORPHANS */ OutCSS1_SvxOrphans,
+/* RES_PARATR_TABSTOP */ 0,
+/* RES_PARATR_HYPHENZONE*/ 0,
+/* RES_PARATR_DROP */ OutCSS1_SwFmtDrop,
+/* RES_PARATR_REGISTER */ 0, // neu: Registerhaltigkeit
+/* RES_PARATR_NUMRULE */ 0, // Dummy:
+/* RES_PARATR_SCRIPTSPACE */ 0, // Dummy:
+/* RES_PARATR_HANGINGPUNCTUATION */ 0, // Dummy:
+/* RES_PARATR_FORBIDDEN_RULES */ 0, // new
+/* RES_PARATR_VERTALIGN */ 0, // new
+/* RES_PARATR_SNAPTOGRID*/ 0, // new
+/* RES_PARATR_CONNECT_TO_BORDER */ 0, // new
+/* RES_PARATR_OUTLINELEVEL */ 0, // new since cws outlinelevel
+
+/* RES_PARATR_LIST_ID */ 0, // new
+/* RES_PARATR_LIST_LEVEL */ 0, // new
+/* RES_PARATR_LIST_ISRESTART */ 0, // new
+/* RES_PARATR_LIST_RESTARTVALUE */ 0, // new
+/* RES_PARATR_LIST_ISCOUNTED */ 0, // new
+
+/* RES_FILL_ORDER */ 0,
+/* RES_FRM_SIZE */ 0,
+/* RES_PAPER_BIN */ 0,
+/* RES_LR_SPACE */ OutCSS1_SvxLRSpace,
+/* RES_UL_SPACE */ OutCSS1_SvxULSpace,
+/* RES_PAGEDESC */ 0,
+/* RES_BREAK */ 0,
+/* RES_CNTNT */ 0,
+/* RES_HEADER */ 0,
+/* RES_FOOTER */ 0,
+/* RES_PRINT */ 0,
+/* RES_OPAQUE */ 0,
+/* RES_PROTECT */ 0,
+/* RES_SURROUND */ 0,
+/* RES_VERT_ORIENT */ 0,
+/* RES_HORI_ORIENT */ 0,
+/* RES_ANCHOR */ 0,
+/* RES_BACKGROUND */ OutCSS1_SvxBrush,
+/* RES_BOX */ OutCSS1_SvxBox,
+/* RES_SHADOW */ 0,
+/* RES_FRMMACRO */ 0,
+/* RES_COL */ 0,
+/* RES_KEEP */ 0,
+/* RES_URL */ 0,
+/* RES_EDIT_IN_READONLY */ 0,
+/* RES_LAYOUT_SPLIT */ 0,
+/* RES_CHAIN */ 0,
+/* RES_TEXTGRID */ 0,
+/* RES_LINENUMBER */ 0,
+/* RES_FTN_AT_TXTEND */ 0,
+/* RES_END_AT_TXTEND */ 0,
+/* RES_COLUMNBALANCE */ 0,
+/* RES_FRAMEDIR */ OutCSS1_SvxFrameDirection,
+/* RES_HEADER_FOOTER_EAT_SPACING */ 0,
+/* RES_FRMATR_DUMMY9 */ 0, // Dummy:
+/* RES_FOLLOW_TEXT_FLOW */ 0,
+/* RES_WRAP_INFLUENCE_ON_OBJPOS */ 0,
+/* RES_FRMATR_DUMMY2 */ 0, // Dummy:
+/* RES_AUTO_STYLE */ 0, // Dummy:
+/* RES_FRMATR_DUMMY4 */ 0, // Dummy:
+/* RES_FRMATR_DUMMY5 */ 0, // Dummy:
+
+/* RES_GRFATR_MIRRORGRF */ 0,
+/* RES_GRFATR_CROPGRF */ 0,
+/* RES_GRFATR_ROTATION */ 0,
+/* RES_GRFATR_LUMINANCE */ 0,
+/* RES_GRFATR_CONTRAST */ 0,
+/* RES_GRFATR_CHANNELR */ 0,
+/* RES_GRFATR_CHANNELG */ 0,
+/* RES_GRFATR_CHANNELB */ 0,
+/* RES_GRFATR_GAMMA */ 0,
+/* RES_GRFATR_INVERT */ 0,
+/* RES_GRFATR_TRANSPARENCY */ 0,
+/* RES_GRFATR_DRWAMODE */ 0,
+/* RES_GRFATR_DUMMY1 */ 0,
+/* RES_GRFATR_DUMMY2 */ 0,
+/* RES_GRFATR_DUMMY3 */ 0,
+/* RES_GRFATR_DUMMY4 */ 0,
+/* RES_GRFATR_DUMMY5 */ 0,
+
+/* RES_BOXATR_FORMAT */ 0,
+/* RES_BOXATR_FORMULA */ 0,
+/* RES_BOXATR_VALUE */ 0
+};