| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sw.hxx" |
| |
| |
| |
| #include "hintids.hxx" |
| #include <vcl/svapp.hxx> |
| #include <vcl/wrkwin.hxx> |
| #include <svl/whiter.hxx> |
| #include <editeng/boxitem.hxx> |
| #include <editeng/ulspitem.hxx> |
| #include <editeng/udlnitem.hxx> |
| #include <editeng/crsditem.hxx> |
| #include <editeng/blnkitem.hxx> |
| #include <editeng/cmapitem.hxx> |
| #include <editeng/colritem.hxx> |
| #include <editeng/fontitem.hxx> |
| #include <editeng/fhgtitem.hxx> |
| #include <editeng/postitem.hxx> |
| #include <editeng/kernitem.hxx> |
| #include <editeng/wghtitem.hxx> |
| #include <editeng/lspcitem.hxx> |
| #include <editeng/adjitem.hxx> |
| #include <editeng/lrspitem.hxx> |
| #include <editeng/ulspitem.hxx> |
| #include <editeng/brshitem.hxx> |
| #include <editeng/brkitem.hxx> |
| #include <editeng/keepitem.hxx> |
| #include <editeng/widwitem.hxx> |
| #include <editeng/spltitem.hxx> |
| #include <editeng/orphitem.hxx> |
| #include <svx/xoutbmp.hxx> |
| #include <svx/svdobj.hxx> |
| #include <editeng/langitem.hxx> |
| #include <editeng/frmdiritem.hxx> |
| #include <svtools/htmlout.hxx> |
| #include <svtools/htmlkywd.hxx> |
| #include <svx/htmlmode.hxx> |
| #include <svl/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 "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, |
| sal_uInt16 nRefPoolId, sal_Bool bExtRef, |
| sal_Bool bPseudo=sal_True ); |
| static Writer& OutCSS1_SwFtnInfo( Writer& rWrt, const SwEndNoteInfo& rInfo, |
| SwDoc *pDoc, sal_uInt16 nNotes, sal_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, |
| sal_Bool bDeep ); |
| static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt, |
| sal_uInt16 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, |
| sal_uInt16 nMode ); |
| static Writer& OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( Writer& rWrt, |
| const SfxItemSet& rItemSet, |
| sal_Bool bDeep ); |
| static Writer& OutCSS1_SwFmtLayoutSplit( Writer& rWrt, const SfxPoolItem& rHt ); |
| |
| static void ConvToHex( sal_uInt16 nHex, ByteString& rStr ) |
| { |
| sal_Char aNToABuf[] = "00"; |
| |
| // Pointer an das Bufferende setzen |
| sal_Char *pStr = aNToABuf + (sizeof(aNToABuf)-1); |
| for( sal_uInt8 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; |
| sal_uInt16 nOldMode; |
| |
| public: |
| |
| SwCSS1OutMode( SwHTMLWriter& rHWrt, sal_uInt16 nMode, sal_Bool bStartFirst=sal_True, |
| const String *pSelector=0 ) : |
| rWrt( rHWrt ), |
| nOldMode( rHWrt.nCSS1OutMode ) |
| { |
| rWrt.nCSS1OutMode = nMode; |
| if( bStartFirst ) |
| rWrt.bFirstCSS1Property = sal_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 = sal_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, sal_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 = sal_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; |
| sal_Bool bOutLongVal = sal_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 = sal_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 = sal_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, |
| sal_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, |
| sal_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, sal_Bool bUsed ) |
| { |
| bFirstCSS1Rule = sal_True; |
| |
| // Feature: PrintExt |
| if( IsHTMLMode(HTMLMODE_PRINT_EXT) ) |
| { |
| const SwPageDesc *pFirstPageDesc = 0; |
| sal_uInt16 nFirstRefPoolId = RES_POOLPAGE_HTML; |
| bCSS1IgnoreFirstPageDesc = sal_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, sal_True, sal_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, sal_True ); |
| OutCSS1_SwPageDesc( *this, *pFollow, pStylePoolAccess, pTemplate, |
| RES_POOLPAGE_HTML, sal_True ); |
| nFirstRefPoolId = RES_POOLPAGE_RIGHT; |
| bCSS1IgnoreFirstPageDesc = sal_False; |
| } |
| // Alles andere bekommen wir nicht hin. |
| |
| if( pFirstPageDesc ) |
| OutCSS1_SwPageDesc( *this, *pFirstPageDesc, pStylePoolAccess, pTemplate, |
| nFirstRefPoolId, sal_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 !! |
| sal_uInt16 nArrLen = pDoc->GetTxtFmtColls()->Count(); |
| sal_uInt16 i; |
| |
| for( i = 1; i < nArrLen; i++ ) |
| { |
| const SwTxtFmtColl* pColl = (*pDoc->GetTxtFmtColls())[i]; |
| sal_uInt16 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]; |
| sal_uInt16 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(); |
| sal_uInt16 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, sal_False ); |
| OutCSS1_SwFtnInfo( *this, pDoc->GetEndNoteInfo(), pDoc, nEnd, sal_True ); |
| |
| if( !bFirstCSS1Rule ) |
| { |
| DecIndentLevel(); |
| OutNewLine(); |
| Strm() << "-->"; |
| |
| OutNewLine(); |
| HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_style, sal_False ); |
| } |
| else |
| { |
| bFirstCSS1Rule = sal_False; |
| } |
| |
| nDfltTopMargin = 0; |
| nDfltBottomMargin = 0; |
| } |
| |
| //----------------------------------------------------------------------- |
| |
| // wenn pPseudo gesetzt ist werden Styles-Sheets ausgegeben, |
| // sonst wird nur nach Token und Class fuer ein Format gesucht |
| sal_uInt16 SwHTMLWriter::GetCSS1Selector( const SwFmt *pFmt, ByteString& rToken, |
| String& rClass, sal_uInt16& rRefPoolId, |
| String *pPseudo ) |
| { |
| sal_uInt16 nDeep = 0; |
| rToken.Erase(); rClass.Erase(); |
| rRefPoolId = 0; |
| if( pPseudo ) |
| pPseudo->Erase(); |
| |
| sal_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() ) |
| { |
| sal_Bool bStop = sal_False; |
| sal_uInt16 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 ) |
| { |
| sal_uInt16 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 = sal_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 sal_uInt16 GetCSS1Selector( const SwFmt *pFmt, String& rSelector, |
| sal_uInt16& rRefPoolId ) |
| { |
| ByteString aToken; |
| String aClass; |
| String aPseudo; |
| |
| sal_uInt16 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( sal_uInt16 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, sal_uInt16 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( sal_uInt16 i=nDeep; i>0; i-- ) |
| pRefFmt = pRefFmt->DerivedFrom(); |
| |
| if( pRefFmt && pRefFmt->IsDefault() ) |
| pRefFmt = 0; |
| } |
| |
| return pRefFmt; |
| } |
| |
| sal_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, |
| sal_Bool bSetDefaults, |
| sal_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 ); |
| sal_uInt16 nWhich = aIter.FirstWhich(); |
| while( nWhich ) |
| { |
| const SfxPoolItem *pRefItem, *pItem; |
| sal_Bool bItemSet = ( SFX_ITEM_SET == |
| rItemSet.GetItemState( nWhich, sal_False, &pItem) ); |
| sal_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, sal_True, &pRefItem) ); |
| break; |
| default: |
| bRefItemSet = ( SFX_ITEM_SET == |
| aRefItemSet.GetItemState( nWhich, sal_False, &pRefItem) ); |
| break; |
| } |
| } |
| else |
| { |
| bRefItemSet = ( SFX_ITEM_SET == |
| aRefItemSet.GetItemState( nWhich, sal_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, sal_Bool bGeneric ) |
| { |
| rNames = aEmptyStr; |
| const String& rName = rFontItem.GetFamilyName(); |
| sal_Bool bContainsKeyword = sal_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; |
| |
| sal_Bool bIsKeyword = sal_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, |
| sal_True, &rSelector ); |
| rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_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, |
| sal_True, &aNewSelector ); |
| rHTMLWrt.OutCSS1_SfxItemSet( aScriptItemSet, sal_False ); |
| } |
| |
| aNewSelector = aSelector; |
| aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".cjk") ); |
| aNewSelector.Append( aPseudo ); |
| { |
| SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE, |
| sal_True, &aNewSelector ); |
| rHTMLWrt.OutCSS1_SfxItemSet( aScriptItemSet, sal_False ); |
| } |
| |
| aNewSelector = aSelector; |
| aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM(".ctl") ); |
| aNewSelector.Append( aPseudo ); |
| { |
| SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE, |
| sal_True, &aNewSelector ); |
| rHTMLWrt.OutCSS1_SfxItemSet( aScriptItemSet, sal_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, |
| sal_True, &aNewSelector ); |
| rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False ); |
| } |
| |
| aNewSelector = aSelector; |
| aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-cjk") ); |
| aNewSelector.Append( aPseudo ); |
| { |
| SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CJK|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE, |
| sal_True, &aNewSelector ); |
| rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_False ); |
| } |
| |
| aNewSelector = aSelector; |
| aNewSelector.AppendAscii( RTL_CONSTASCII_STRINGPARAM("-ctl") ); |
| aNewSelector.Append( aPseudo ); |
| { |
| SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_CTL|CSS1_OUTMODE_RULE|CSS1_OUTMODE_TEMPLATE, |
| sal_True, &aNewSelector ); |
| rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_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, |
| sal_True, &rSelector ); |
| rHTMLWrt.OutCSS1_SfxItemSet( rItemSet, sal_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, |
| sal_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, |
| sal_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, |
| sal_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, |
| sal_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, |
| sal_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, |
| sal_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, |
| sal_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, |
| sal_True, &rSelector ); |
| OutCSS1_SwFmtDropAttrs( rHTMLWrt, rDrop ); |
| } |
| } |
| |
| static Writer& OutCSS1_SwFmt( Writer& rWrt, const SwFmt& rFmt, |
| IDocumentStylePoolAccess/*SwDoc*/ *pDoc, SwDoc *pTemplate ) |
| { |
| SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt; |
| |
| sal_Bool bCharFmt = sal_False; |
| switch( rFmt.Which() ) |
| { |
| case RES_CHRFMT: |
| bCharFmt = sal_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; |
| sal_uInt16 nRefPoolId = 0; |
| sal_uInt16 nDeep = GetCSS1Selector( &rFmt, aSelector, nRefPoolId ); |
| if( !nDeep ) |
| return rWrt; // von keiner HTML-Vorlage abgeleitet |
| |
| sal_uInt16 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, sal_True ); // Was nDeep!=1 that is not working |
| // for script dependent items buts should |
| // not make a deifference for any other |
| |
| sal_Bool bSetDefaults = sal_True, bClearSame = sal_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 = sal_False; |
| break; |
| default: |
| pRefFmt = SwHTMLWriter::GetParentFmt( rFmt, nDeep ); |
| pRefFmtScript = SwHTMLWriter::GetTemplateFmt( nRefPoolId, pTemplate ); |
| bSetDefaults = sal_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 = sal_True; |
| |
| // Drop-Caps ausgeben |
| const SfxPoolItem *pItem; |
| if( rHTMLWrt.IsHTMLMode(HTMLMODE_DROPCAPS) && |
| SFX_ITEM_SET==aItemSet.GetItemState( RES_PARATR_DROP, sal_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, |
| sal_uInt16 nRefPoolId, sal_Bool bExtRef, |
| sal_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, |
| sal_True, &aSelector ); |
| |
| // Die Groesse: Wenn sie sich nur durch das Landscape-Flag unterscheidet, |
| // wird nur Portrait oder Landscape exportiert. Sonst wird die Groesse |
| // exportiert. |
| sal_Bool bRefLandscape = pRefPageDesc ? pRefPageDesc->GetLandscape() : sal_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(), sal_True ); |
| |
| if( pRefPageDesc ) |
| { |
| SwHTMLWriter::SubtractItemSet( aItemSet, |
| pRefPageDesc->GetMaster().GetAttrSet(), |
| sal_True ); |
| } |
| |
| OutCSS1_SvxULSpace_SvxLRSpace( rWrt, aItemSet, sal_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 = sal_False; |
| } |
| |
| if( !rHTMLWrt.bFirstCSS1Property ) |
| rWrt.Strm() << sCSS1_rule_end; |
| |
| return rWrt; |
| } |
| |
| static Writer& OutCSS1_SwFtnInfo( Writer& rWrt, const SwEndNoteInfo& rInfo, |
| SwDoc *pDoc, sal_uInt16 nNotes, sal_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, |
| sal_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, sal_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(), |
| sal_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, sal_False, |
| &pItem ) ) |
| { |
| OutCSS1_SvxBrush( rWrt, *pItem, CSS1_BACKGROUND_PAGE, |
| &aEmbBGGrfName ); |
| } |
| |
| if( SFX_ITEM_SET == rItemSet.GetItemState( RES_BOX, sal_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, sal_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, |
| sal_uInt8 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_PARA: |
| case FLY_AT_CHAR: |
| 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_AT_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; |
| sal_Bool bOutXPos = sal_False, bOutYPos = sal_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 = sal_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( (sal_uInt16)(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( (sal_uInt16)(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(), |
| sal_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(), |
| sal_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" ); |
| sal_uInt16 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, sal_True ) ) |
| pLRItem = &aLRItem; |
| if( SFX_ITEM_SET == rItemSet.GetItemState( RES_UL_SPACE, sal_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, sal_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, sal_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, sal_False, &pItem ) ) |
| OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_TABLE, 0 ); |
| |
| if( IsHTMLMode( HTMLMODE_PRINT_EXT ) ) |
| OutCSS1_SvxFmtBreak_SwFmtPDesc_SvxFmtKeep( *this, rItemSet, sal_False ); |
| |
| if( SFX_ITEM_SET==rItemSet.GetItemState( RES_LAYOUT_SPLIT, sal_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, sal_False, &pItem ) ) |
| OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_SECTION, 0 ); |
| |
| if( !bFirstCSS1Property ) |
| Strm() << '\"'; |
| } |
| |
| static sal_Bool OutCSS1_FrmFmtBrush( SwHTMLWriter& rWrt, |
| const SvxBrushItem& rBrushItem ) |
| { |
| sal_Bool bWritten = sal_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 = sal_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_AT_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; |
| sal_Bool bNone = sal_False; |
| |
| const sal_Char *pUStr = 0; |
| if( pUItem ) |
| { |
| switch( pUItem->GetLineStyle() ) |
| { |
| case UNDERLINE_NONE: |
| bNone = sal_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 = sal_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 = sal_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 = sal_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 |
| sal_uInt16 nMode = rHTMLWrt.nCSS1OutMode & CSS1_OUTMODE_ANY_ON; |
| sal_Unicode cQuote = nMode == CSS1_OUTMODE_RULE_ON ? '\"' : '\''; |
| SwHTMLWriter::PrepareFontList( ((const SvxFontItem&)rHt), sOut, cQuote, |
| sal_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; |
| |
| sal_uInt32 nHeight = ((const SvxFontHeightItem&)rHt).GetHeight(); |
| if( rHTMLWrt.IsCSS1Source(CSS1_OUTMODE_HINT) ) |
| { |
| // einen Hint nur dann ausgeben wenn es auch was bringt |
| sal_uInt16 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; |
| |
| sal_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; |
| |
| sal_uInt16 nHeight = 0; |
| sal_uInt16 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 |
| sal_uInt16 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, sal_False ); |
| } |
| |
| return rWrt; |
| } |
| |
| static Writer& OutCSS1_SwFmtFrmSize( Writer& rWrt, const SfxPoolItem& rHt, |
| sal_uInt16 nMode ) |
| { |
| SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt; |
| |
| ByteString sOut; |
| const SwFmtFrmSize& rFSItem = (const SwFmtFrmSize&)rHt; |
| |
| if( nMode & CSS1_FRMSIZE_WIDTH ) |
| { |
| sal_uInt8 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(), sal_False ); |
| } |
| else |
| { |
| rHTMLWrt.OutCSS1_UnitProperty( sCSS1_P_width, |
| rFSItem.GetSize().Width() ); |
| } |
| } |
| |
| if( nMode & CSS1_FRMSIZE_ANYHEIGHT ) |
| { |
| sal_Bool bOutHeight = sal_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 ) |
| { |
| sal_uInt8 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(), |
| sal_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, |
| sal_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, |
| sal_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, |
| sal_uInt16 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 |
| sal_Bool bColor = sal_False; |
| /// OD 02.09.2002 #99657# |
| /// set <bTransparent> to sal_True, if color is "no fill"/"auto fill" |
| sal_Bool bTransparent = (rColor.GetColor() == COL_TRANSPARENT); |
| Color aColor; |
| if( !bTransparent ) |
| { |
| aColor = rColor; |
| bColor = sal_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; |
| sal_uInt16 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; |
| } |
| |
| sal_Bool bDouble = sal_False; |
| sal_Int32 nWidth = pLine->GetOutWidth(); |
| if( pLine->GetInWidth() ) |
| { |
| nWidth += pLine->GetDistance(); |
| nWidth += pLine->GetInWidth(); |
| bDouble = sal_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_CHRATR_BIDIRTL */ 0, |
| /* RES_CHRATR_IDCTHINT */ 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_INPUTFIELD */ 0, |
| |
| /* RES_TXTATR_FIELD */ 0, |
| /* RES_TXTATR_FLYCNT */ 0, |
| /* RES_TXTATR_FTN */ 0, |
| /* RES_TXTATR_ANNOTATION */ 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, |
| /* RES_PARATR_SCRIPTSPACE */ 0, |
| /* RES_PARATR_HANGINGPUNCTUATION */ 0, |
| /* 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_ROW_SPLIT */ 0, |
| /* RES_FOLLOW_TEXT_FLOW */ 0, |
| /* RES_COLLAPSING_BORDERS */ 0, |
| /* RES_WRAP_INFLUENCE_ON_OBJPOS */ 0, |
| /* RES_AUTO_STYLE */ 0, |
| /* RES_FRMATR_STYLE_NAME */ 0, |
| /* RES_FRMATR_CONDITIONAL_STYLE_NAME */ 0, |
| |
| /* 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 |
| }; |