diff options
Diffstat (limited to 'sw/source/filter/html/htmlfldw.cxx')
-rw-r--r-- | sw/source/filter/html/htmlfldw.cxx | 541 |
1 files changed, 541 insertions, 0 deletions
diff --git a/sw/source/filter/html/htmlfldw.cxx b/sw/source/filter/html/htmlfldw.cxx new file mode 100644 index 000000000000..1d2def315b93 --- /dev/null +++ b/sw/source/filter/html/htmlfldw.cxx @@ -0,0 +1,541 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + + +#include <com/sun/star/i18n/ScriptType.hpp> +#include <tools/string.hxx> +#include <svtools/htmlkywd.hxx> +#include <svtools/htmlout.hxx> +#include <svtools/htmltokn.h> +#include <fmtfld.hxx> +#include <doc.hxx> +#include <breakit.hxx> +#include <ndtxt.hxx> +#include <txtfld.hxx> +#include "fldbas.hxx" +#include "docufld.hxx" +#include "flddat.hxx" +#include "htmlfld.hxx" +#include "wrthtml.hxx" + +using namespace nsSwDocInfoSubType; + +const sal_Char *SwHTMLWriter::GetNumFormat( sal_uInt16 nFmt ) +{ + const sal_Char *pFmtStr = 0; + + switch( (SvxExtNumType)nFmt ) + { + case SVX_NUM_CHARS_UPPER_LETTER: pFmtStr = OOO_STRING_SW_HTML_FF_uletter; break; + case SVX_NUM_CHARS_LOWER_LETTER: pFmtStr = OOO_STRING_SW_HTML_FF_lletter; break; + case SVX_NUM_ROMAN_UPPER: pFmtStr = OOO_STRING_SW_HTML_FF_uroman; break; + case SVX_NUM_ROMAN_LOWER: pFmtStr = OOO_STRING_SW_HTML_FF_lroman; break; + case SVX_NUM_ARABIC: pFmtStr = OOO_STRING_SW_HTML_FF_arabic; break; + case SVX_NUM_NUMBER_NONE: pFmtStr = OOO_STRING_SW_HTML_FF_none; break; + case SVX_NUM_CHAR_SPECIAL: pFmtStr = OOO_STRING_SW_HTML_FF_char; break; + case SVX_NUM_PAGEDESC: pFmtStr = OOO_STRING_SW_HTML_FF_page; break; + case SVX_NUM_CHARS_UPPER_LETTER_N: pFmtStr = OOO_STRING_SW_HTML_FF_ulettern; break; + case SVX_NUM_CHARS_LOWER_LETTER_N: pFmtStr = OOO_STRING_SW_HTML_FF_llettern; break; + default: + ; + } + + return pFmtStr; +} + +extern sal_Bool lcl_css1atr_equalFontItems( const SfxPoolItem& r1, const SfxPoolItem& r2 ); +static Writer& OutHTML_SwField( Writer& rWrt, const SwField* pFld, + const SwTxtNode& rTxtNd, xub_StrLen nFldPos ) +{ + SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt; + + const SwFieldType* pFldTyp = pFld->GetTyp(); + sal_uInt16 nField = pFldTyp->Which(); + sal_uLong nFmt = pFld->GetFormat(); + + const sal_Char *pTypeStr=0, // TYPE + *pSubStr=0, // SUBTYPE + *pFmtStr=0; // FORMAT (SW) + String aValue; // VALUE (SW) + sal_Bool bNumFmt=sal_False; // SDNUM (Number-Formatter-Format) + sal_Bool bNumValue=sal_False; // SDVAL (Number-Formatter-Value) + double dNumValue = 0.0; // SDVAL (Number-Formatter-Value) + sal_Bool bFixed=sal_False; // SDFIXED + String aName; // NAME (CUSTOM) + + switch( nField ) + { + case RES_EXTUSERFLD: + pTypeStr = OOO_STRING_SW_HTML_FT_sender; + switch( (SwExtUserSubType)pFld->GetSubType() ) + { + case EU_COMPANY: pSubStr = OOO_STRING_SW_HTML_FS_company; break; + case EU_FIRSTNAME: pSubStr = OOO_STRING_SW_HTML_FS_firstname; break; + case EU_NAME: pSubStr = OOO_STRING_SW_HTML_FS_name; break; + case EU_SHORTCUT: pSubStr = OOO_STRING_SW_HTML_FS_shortcut; break; + case EU_STREET: pSubStr = OOO_STRING_SW_HTML_FS_street; break; + case EU_COUNTRY: pSubStr = OOO_STRING_SW_HTML_FS_country; break; + case EU_ZIP: pSubStr = OOO_STRING_SW_HTML_FS_zip; break; + case EU_CITY: pSubStr = OOO_STRING_SW_HTML_FS_city; break; + case EU_TITLE: pSubStr = OOO_STRING_SW_HTML_FS_title; break; + case EU_POSITION: pSubStr = OOO_STRING_SW_HTML_FS_position; break; + case EU_PHONE_PRIVATE: pSubStr = OOO_STRING_SW_HTML_FS_pphone; break; + case EU_PHONE_COMPANY: pSubStr = OOO_STRING_SW_HTML_FS_cphone; break; + case EU_FAX: pSubStr = OOO_STRING_SW_HTML_FS_fax; break; + case EU_EMAIL: pSubStr = OOO_STRING_SW_HTML_FS_email; break; + case EU_STATE: pSubStr = OOO_STRING_SW_HTML_FS_state; break; + default: + ; + } + OSL_ENSURE( pSubStr, "ubekannter Subtyp fuer SwExtUserField" ); + bFixed = ((const SwExtUserField*)pFld)->IsFixed(); + break; + + case RES_AUTHORFLD: + pTypeStr = OOO_STRING_SW_HTML_FT_author; + switch( (SwAuthorFormat)nFmt & 0xff) + { + case AF_NAME: pFmtStr = OOO_STRING_SW_HTML_FF_name; break; + case AF_SHORTCUT: pFmtStr = OOO_STRING_SW_HTML_FF_shortcut; break; + } + OSL_ENSURE( pFmtStr, "ubekanntes Format fuer SwAuthorField" ); + bFixed = ((const SwAuthorField*)pFld)->IsFixed(); + break; + + case RES_DATETIMEFLD: + pTypeStr = OOO_STRING_SW_HTML_FT_datetime; + bNumFmt = sal_True; + if( ((SwDateTimeField*)pFld)->IsFixed() ) + { + bNumValue = sal_True; + dNumValue = ((SwDateTimeField*)pFld)->GetValue(); + } + break; + + case RES_PAGENUMBERFLD: + { + pTypeStr = OOO_STRING_SW_HTML_FT_page; + SwPageNumSubType eSubType = (SwPageNumSubType)pFld->GetSubType(); + switch( eSubType ) + { + case PG_RANDOM: pSubStr = OOO_STRING_SW_HTML_FS_random; break; + case PG_NEXT: pSubStr = OOO_STRING_SW_HTML_FS_next; break; + case PG_PREV: pSubStr = OOO_STRING_SW_HTML_FS_prev; break; + } + OSL_ENSURE( pSubStr, "ubekannter Subtyp fuer SwPageNumberField" ); + pFmtStr = SwHTMLWriter::GetNumFormat( static_cast< sal_uInt16 >(nFmt) ); + + if( (SvxExtNumType)nFmt==SVX_NUM_CHAR_SPECIAL ) + { + aValue = ((const SwPageNumberField *)pFld)->GetUserString(); + } + else + { + const String& rValue = pFld->GetPar2(); + short nValue = (short)rValue.ToInt32(); + if( (eSubType == PG_NEXT && nValue!=1) || + (eSubType == PG_PREV && nValue!=-1) || + (eSubType == PG_RANDOM && nValue!=0) ) + { + aValue = rValue; + } + } + } + break; + case RES_DOCINFOFLD: + { + sal_uInt16 nSubType = pFld->GetSubType(); + pTypeStr = OOO_STRING_SW_HTML_FT_docinfo; + sal_uInt16 nExtSubType = nSubType & 0x0f00; + nSubType &= 0x00ff; + + switch( nSubType ) + { + case DI_TITEL: pSubStr = OOO_STRING_SW_HTML_FS_title; break; + case DI_THEMA: pSubStr = OOO_STRING_SW_HTML_FS_theme; break; + case DI_KEYS: pSubStr = OOO_STRING_SW_HTML_FS_keys; break; + case DI_COMMENT: pSubStr = OOO_STRING_SW_HTML_FS_comment; break; + case DI_CREATE: pSubStr = OOO_STRING_SW_HTML_FS_create; break; + case DI_CHANGE: pSubStr = OOO_STRING_SW_HTML_FS_change; break; + case DI_CUSTOM: pSubStr = OOO_STRING_SW_HTML_FS_custom; break; + default: pTypeStr = 0; break; + } + + if( DI_CUSTOM == nSubType ) { + aName = static_cast<const SwDocInfoField*>(pFld)->GetName(); + } + + if( DI_CREATE == nSubType || DI_CHANGE == nSubType ) + { + switch( nExtSubType ) + { + case DI_SUB_AUTHOR: + pFmtStr = OOO_STRING_SW_HTML_FF_author; + break; + case DI_SUB_TIME: + pFmtStr = OOO_STRING_SW_HTML_FF_time; + bNumFmt = sal_True; + break; + case DI_SUB_DATE: + pFmtStr = OOO_STRING_SW_HTML_FF_date; + bNumFmt = sal_True; + break; + } + } + bFixed = ((const SwDocInfoField*)pFld)->IsFixed(); + if( bNumFmt ) + { + if( bFixed ) + { + // Fuer ein fixes Feld och den Num-Value ausgeben. + // Fixe Felder ohne Zahlenformate sollte es + // eigentlich nicht geben. OSL_ENSURE(ist unten. + dNumValue = ((const SwDocInfoField*)pFld)->GetValue(); + bNumValue = sal_True; + } + else if( !nFmt ) + { + // Nicht fixe Felder muessen kein Zahlenformat haben, + // wenn sie aus 4.0-Dokumenten stammen. + bNumFmt = sal_False; + } + } + } + break; + + case RES_DOCSTATFLD: + { + pTypeStr = OOO_STRING_SW_HTML_FT_docstat; + sal_uInt16 nSubType = pFld->GetSubType(); + switch( nSubType ) + { + case DS_PAGE: pSubStr = OOO_STRING_SW_HTML_FS_page; break; + case DS_PARA: pSubStr = OOO_STRING_SW_HTML_FS_para; break; + case DS_WORD: pSubStr = OOO_STRING_SW_HTML_FS_word; break; + case DS_CHAR: pSubStr = OOO_STRING_SW_HTML_FS_char; break; + case DS_TBL: pSubStr = OOO_STRING_SW_HTML_FS_tbl; break; + case DS_GRF: pSubStr = OOO_STRING_SW_HTML_FS_grf; break; + case DS_OLE: pSubStr = OOO_STRING_SW_HTML_FS_ole; break; + default: pTypeStr = 0; break; + } + pFmtStr = SwHTMLWriter::GetNumFormat( static_cast< sal_uInt16 >(nFmt) ); + } + break; + + case RES_FILENAMEFLD: + pTypeStr = OOO_STRING_SW_HTML_FT_filename; + switch( (SwFileNameFormat)(nFmt & ~FF_FIXED) ) + { + case FF_NAME: pFmtStr = OOO_STRING_SW_HTML_FF_name; break; + case FF_PATHNAME: pFmtStr = OOO_STRING_SW_HTML_FF_pathname; break; + case FF_PATH: pFmtStr = OOO_STRING_SW_HTML_FF_path; break; + case FF_NAME_NOEXT: pFmtStr = OOO_STRING_SW_HTML_FF_name_noext; break; + default: + ; + } + bFixed = ((const SwFileNameField*)pFld)->IsFixed(); + OSL_ENSURE( pFmtStr, "unbekanntes Format fuer SwFileNameField" ); + break; + } + + // <SDFIELD>-Tag ausgeben + if( pTypeStr ) + { + ByteString sOut( '<' ); + ((((sOut += OOO_STRING_SVTOOLS_HTML_sdfield) += ' ') += OOO_STRING_SVTOOLS_HTML_O_type) += '=') + += pTypeStr; + if( pSubStr ) + (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_subtype) += '=') += pSubStr; + if( pFmtStr ) + (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_format) += '=') += pFmtStr; + if( aName.Len() ) + { + (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_name) += "=\""); + rWrt.Strm() << sOut.GetBuffer(); + HTMLOutFuncs::Out_String( rWrt.Strm(), aName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ); + sOut = '\"'; + } + if( aValue.Len() ) + { + ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_value) += "=\""; + rWrt.Strm() << sOut.GetBuffer(); + HTMLOutFuncs::Out_String( rWrt.Strm(), aValue, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ); + sOut = '\"'; + } + if( bNumFmt ) + { + OSL_ENSURE( nFmt, "Zahlenformat ist 0" ); + sOut = HTMLOutFuncs::CreateTableDataOptionsValNum( sOut, + bNumValue, dNumValue, nFmt, + *rHTMLWrt.pDoc->GetNumberFormatter(), + rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ); + + } + if( bFixed ) + (sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_sdfixed; + sOut += '>'; + rWrt.Strm() << sOut.GetBuffer(); + } + + // Inhalt des Feldes ausgeben + String const sExpand( pFld->ExpandField(true) ); + sal_Bool bNeedsCJKProcessing = sal_False; + if( sExpand.Len() ) + { + sal_uInt16 nScriptType = pBreakIt->GetBreakIter()->getScriptType( sExpand, 0 ); + xub_StrLen nPos = (xub_StrLen)pBreakIt->GetBreakIter()->endOfScript( sExpand, 0, + nScriptType ); + + sal_uInt16 nScript = + SwHTMLWriter::GetCSS1ScriptForScriptType( nScriptType ); + if( nPos < sExpand.Len() || nScript != rHTMLWrt.nCSS1Script ) + { + bNeedsCJKProcessing = sal_True; + } + } + + if( bNeedsCJKProcessing ) + { + SfxItemSet aScriptItemSet( rWrt.pDoc->GetAttrPool(), + RES_CHRATR_FONT, RES_CHRATR_FONTSIZE, + RES_CHRATR_POSTURE, RES_CHRATR_POSTURE, + RES_CHRATR_WEIGHT, RES_CHRATR_WEIGHT, + RES_CHRATR_CJK_FONT, RES_CHRATR_CTL_WEIGHT, + 0 ); + rTxtNd.GetAttr( aScriptItemSet, nFldPos, nFldPos+1 ); + + sal_uInt16 aWesternWhichIds[4] = + { RES_CHRATR_FONT, RES_CHRATR_FONTSIZE, + RES_CHRATR_POSTURE, RES_CHRATR_WEIGHT }; + sal_uInt16 aCJKWhichIds[4] = + { RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONTSIZE, + RES_CHRATR_CJK_POSTURE, RES_CHRATR_CJK_WEIGHT }; + sal_uInt16 aCTLWhichIds[4] = + { RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONTSIZE, + RES_CHRATR_CTL_POSTURE, RES_CHRATR_CTL_WEIGHT }; + + sal_uInt16 *pRefWhichIds = 0; + switch( rHTMLWrt.nCSS1Script ) + { + case CSS1_OUTMODE_WESTERN: + pRefWhichIds = aWesternWhichIds; + break; + case CSS1_OUTMODE_CJK: + pRefWhichIds = aCJKWhichIds; + break; + case CSS1_OUTMODE_CTL: + pRefWhichIds = aCTLWhichIds; + break; + } + + xub_StrLen nPos = 0; + do + { + sal_uInt16 nScriptType = pBreakIt->GetBreakIter()->getScriptType( sExpand, nPos ); + sal_uInt16 nScript = + SwHTMLWriter::GetCSS1ScriptForScriptType( nScriptType ); + xub_StrLen nEndPos = (xub_StrLen)pBreakIt->GetBreakIter()->endOfScript( + sExpand, nPos, nScriptType ); + if( nScript != CSS1_OUTMODE_ANY_SCRIPT && + /* #108791# */ nScript != rHTMLWrt.nCSS1Script ) + { + sal_uInt16 *pWhichIds = 0; + switch( nScript ) + { + case CSS1_OUTMODE_WESTERN: pWhichIds = aWesternWhichIds; break; + case CSS1_OUTMODE_CJK: pWhichIds = aCJKWhichIds; break; + case CSS1_OUTMODE_CTL: pWhichIds = aCTLWhichIds; break; + } + + rHTMLWrt.bTagOn = sal_True; + const SfxPoolItem *aItems[5]; + sal_uInt16 nItems = 0; + for( sal_uInt16 i=0; i<4; i++ ) + { + const SfxPoolItem *pRefItem = + aScriptItemSet.GetItem( pRefWhichIds[i] ); + const SfxPoolItem *pItem = + aScriptItemSet.GetItem( pWhichIds[i] ); + if( pRefItem && pItem && + !(0==i ? lcl_css1atr_equalFontItems( *pRefItem, *pItem ) + : *pRefItem == *pItem) ) + { + Out( aHTMLAttrFnTab, *pItem, rHTMLWrt ); + aItems[nItems++] = pItem; + } + } + + HTMLOutFuncs::Out_String( rWrt.Strm(), sExpand.Copy( nPos, nEndPos ), + rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ); + + rHTMLWrt.bTagOn = sal_False; + while( nItems ) + Out( aHTMLAttrFnTab, *aItems[--nItems], rHTMLWrt ); + + } + else + { + HTMLOutFuncs::Out_String( rWrt.Strm(), sExpand.Copy( nPos, nEndPos ), + rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ); + } + nPos = nEndPos; + } + while( nPos < sExpand.Len() ); + } + else + { + HTMLOutFuncs::Out_String( rWrt.Strm(), sExpand, + rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ); + } + + // Off-Tag ausgeben + if( pTypeStr ) + HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_sdfield, sal_False ); + + return rWrt; +} + + +Writer& OutHTML_SwFmtFld( Writer& rWrt, const SfxPoolItem& rHt ) +{ + SwFmtFld & rFld = (SwFmtFld&)rHt; + const SwField* pFld = rFld.GetFld(); + const SwFieldType* pFldTyp = pFld->GetTyp(); + + if( RES_SETEXPFLD == pFldTyp->Which() && + (nsSwGetSetExpType::GSE_STRING & pFld->GetSubType()) ) + { + int bOn = sal_False; + if( pFldTyp->GetName().EqualsAscii("HTML_ON" ) ) + bOn = sal_True; + else if( !pFldTyp->GetName().EqualsAscii( "HTML_OFF" ) ) + return rWrt; + + String rTxt( pFld->GetPar2() ); + rTxt.EraseLeadingChars().EraseTrailingChars(); + rWrt.Strm() << '<'; + if( !bOn ) + rWrt.Strm() << '/'; + // TODO: HTML-Tags are written without entitities, that for, characters + // not contained in the destination encoding are lost! + ByteString sTmp( rTxt, ((SwHTMLWriter&)rWrt).eDestEnc ); + rWrt.Strm() << sTmp.GetBuffer() << '>'; + } + else if( RES_POSTITFLD == pFldTyp->Which() ) + { + // Kommentare werden im ANSI-Zeichensetz, aber mit System-Zeilen- + // Umbruechen gesschrieben. + const String& rComment = pFld->GetPar2(); + sal_Bool bWritten = sal_False; + + if( (rComment.Len() >= 6 && '<' == rComment.GetChar(0) && + '>' == rComment.GetChar(rComment.Len()-1) && + rComment.Copy( 1, 4 ).EqualsIgnoreCaseAscii(OOO_STRING_SVTOOLS_HTML_meta)) || + (rComment.Len() >= 7 && + rComment.Copy( 0, 4 ).EqualsAscii( "<!--" ) && + rComment.Copy( rComment.Len()-3, 3 ).EqualsAscii( "-->" )) ) + { + // META-Tags direkt ausgeben + String sComment( rComment ); + sComment.ConvertLineEnd( GetSystemLineEnd() ); + // TODO: HTML-Tags are written without entitities, that for, + // characters not contained in the destination encoding are lost! + ByteString sTmp( sComment, ((SwHTMLWriter&)rWrt).eDestEnc ); + rWrt.Strm() << sTmp.GetBuffer(); + bWritten = sal_True; + } + else if( rComment.Len() >= 7 && + '>' == rComment.GetChar(rComment.Len()-1) && + rComment.Copy(0,5).EqualsIgnoreCaseAscii("HTML:") ) + { + String sComment( rComment.Copy(5) ); + sComment.EraseLeadingChars(); + if( '<' == sComment.GetChar(0) ) + { + sComment.ConvertLineEnd( GetSystemLineEnd() ); + // TODO: HTML-Tags are written without entitities, that for, + // characters not contained in the destination encoding are + // lost! + ByteString sTmp( sComment, ((SwHTMLWriter&)rWrt).eDestEnc ); + rWrt.Strm() << sTmp.GetBuffer(); + bWritten = sal_True; + } + + } + + if( !bWritten ) + { + ByteString sOut( '<' ); + + String sComment( rComment ); + sComment.ConvertLineEnd( GetSystemLineEnd() ); + // TODO: ??? + (((sOut += OOO_STRING_SVTOOLS_HTML_comment) += ' ') + += ByteString( sComment, ((SwHTMLWriter&)rWrt).eDestEnc )) + += " -->"; + rWrt.Strm() << sOut.GetBuffer(); + } + } + else if( RES_SCRIPTFLD == pFldTyp->Which() ) + { + SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt; + if( rHTMLWrt.bLFPossible ) + rHTMLWrt.OutNewLine( sal_True ); + + sal_Bool bURL = ((const SwScriptField *)pFld)->IsCodeURL(); + const String& rType = pFld->GetPar1(); + String aContents, aURL; + if(bURL) + aURL = pFld->GetPar2(); + else + aContents = pFld->GetPar2(); + + // sonst ist es der Script-Inhalt selbst. Da nur noh JavaScript + // in Feldern landet, muss es sich um JavaSrript handeln ...:) + HTMLOutFuncs::OutScript( rWrt.Strm(), rWrt.GetBaseURL(), aContents, rType, JAVASCRIPT, + aURL, 0, 0, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ); + + if( rHTMLWrt.bLFPossible ) + rHTMLWrt.OutNewLine( sal_True ); + } + else + { + const SwTxtFld *pTxtFld = rFld.GetTxtFld(); + OSL_ENSURE( pTxtFld, "Where is the txt fld?" ); + if( pTxtFld ) + OutHTML_SwField( rWrt, pFld, pTxtFld->GetTxtNode(), + *pTxtFld->GetStart() ); + } + return rWrt; +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |