blob: fbe91ba7385530b283e564e8f4d49afc57775421 [file] [log] [blame]
/**************************************************************
*
* 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 <com/sun/star/text/HoriOrientation.hpp>
#include <com/sun/star/text/VertOrientation.hpp>
#include <com/sun/star/text/RelOrientation.hpp>
#include <svx/svxids.hrc>
#include "hintids.hxx"
#include <tools/string.hxx>
#include <svl/urihelper.hxx>
#include <vcl/svapp.hxx>
#include <vcl/wrkwin.hxx>
#include <svtools/htmlkywd.hxx>
#include <svtools/htmlout.hxx>
#include <svtools/imap.hxx>
#include <svtools/imapobj.hxx>
#include <svtools/htmlcfg.hxx>
#include <svx/xoutbmp.hxx>
#include <editeng/boxitem.hxx>
#include <editeng/lrspitem.hxx>
#include <editeng/ulspitem.hxx>
#include <editeng/brshitem.hxx>
#include <fmtanchr.hxx>
#include <fmtornt.hxx>
#include <fmturl.hxx>
#include <fmtfsize.hxx>
#include <fmtclds.hxx>
#include <fmtcntnt.hxx>
#include <fmtsrnd.hxx>
#include <fmtinfmt.hxx>
#include <txtinet.hxx>
#include "frmatr.hxx"
#include <grfatr.hxx>
#include <flypos.hxx>
#include <docary.hxx>
#include <ndgrf.hxx>
#include "doc.hxx"
#include "ndtxt.hxx"
#include "pam.hxx"
#include "swerror.h"
#include "frmfmt.hxx"
#include "wrthtml.hxx"
#include "css1kywd.hxx"
#include "htmlfly.hxx"
using namespace ::com::sun::star;
////////////////////////////////////////////////////////////
const sal_uLong HTML_FRMOPTS_IMG_ALL =
HTML_FRMOPT_ALT |
HTML_FRMOPT_SIZE |
HTML_FRMOPT_ANYSIZE |
HTML_FRMOPT_BORDER |
HTML_FRMOPT_NAME;
const sal_uLong HTML_FRMOPTS_IMG_CNTNR =
HTML_FRMOPTS_IMG_ALL |
HTML_FRMOPT_ABSSIZE;
const sal_uLong HTML_FRMOPTS_IMG =
HTML_FRMOPTS_IMG_ALL |
HTML_FRMOPT_ALIGN |
HTML_FRMOPT_SPACE |
HTML_FRMOPT_BRCLEAR;
const sal_uLong HTML_FRMOPTS_IMG_CSS1 =
HTML_FRMOPT_S_ALIGN |
HTML_FRMOPT_S_SPACE;
const sal_uLong HTML_FRMOPTS_DIV =
HTML_FRMOPT_ID |
HTML_FRMOPT_S_ALIGN |
HTML_FRMOPT_S_SIZE |
HTML_FRMOPT_ANYSIZE |
HTML_FRMOPT_ABSSIZE |
HTML_FRMOPT_S_SPACE |
HTML_FRMOPT_S_BORDER |
HTML_FRMOPT_S_BACKGROUND |
HTML_FRMOPT_BRCLEAR |
HTML_FRMOPT_DIR;
const sal_uLong HTML_FRMOPTS_MULTICOL =
HTML_FRMOPT_ID |
HTML_FRMOPT_WIDTH |
HTML_FRMOPT_ANYSIZE |
HTML_FRMOPT_ABSSIZE |
HTML_FRMOPT_DIR;
const sal_uLong HTML_FRMOPTS_MULTICOL_CNTNR =
HTML_FRMOPTS_MULTICOL;
const sal_uLong HTML_FRMOPTS_MULTICOL_CSS1 =
HTML_FRMOPT_S_ALIGN |
HTML_FRMOPT_S_SIZE |
HTML_FRMOPT_S_SPACE |
HTML_FRMOPT_S_BORDER|
HTML_FRMOPT_S_BACKGROUND;
const sal_uLong HTML_FRMOPTS_SPACER =
HTML_FRMOPT_ALIGN |
HTML_FRMOPT_SIZE |
HTML_FRMOPT_ANYSIZE |
HTML_FRMOPT_BRCLEAR |
HTML_FRMOPT_MARGINSIZE |
HTML_FRMOPT_ABSSIZE;
const sal_uLong HTML_FRMOPTS_CNTNR =
HTML_FRMOPT_S_ALIGN |
HTML_FRMOPT_S_SPACE |
HTML_FRMOPT_S_WIDTH |
HTML_FRMOPT_ANYSIZE |
HTML_FRMOPT_ABSSIZE |
HTML_FRMOPT_S_PIXSIZE;
static Writer& OutHTML_FrmFmtTableNode( Writer& rWrt, const SwFrmFmt& rFrmFmt );
static Writer& OutHTML_FrmFmtAsMulticol( Writer& rWrt, const SwFrmFmt& rFmt,
sal_Bool bInCntnr );
static Writer& OutHTML_FrmFmtAsSpacer( Writer& rWrt, const SwFrmFmt& rFmt );
static Writer& OutHTML_FrmFmtAsDivOrSpan( Writer& rWrt,
const SwFrmFmt& rFrmFmt, sal_Bool bSpan );
static Writer& OutHTML_FrmFmtAsImage( Writer& rWrt, const SwFrmFmt& rFmt,
sal_Bool bInCntnr );
static Writer& OutHTML_FrmFmtGrfNode( Writer& rWrt, const SwFrmFmt& rFmt,
sal_Bool bInCntnr );
static Writer& OutHTML_FrmFmtAsMarquee( Writer& rWrt, const SwFrmFmt& rFrmFmt,
const SdrObject& rSdrObj );
//-----------------------------------------------------------------------
extern HTMLOutEvent __FAR_DATA aAnchorEventTable[];
static HTMLOutEvent __FAR_DATA aImageEventTable[] =
{
{ OOO_STRING_SVTOOLS_HTML_O_SDonload, OOO_STRING_SVTOOLS_HTML_O_onload, SVX_EVENT_IMAGE_LOAD },
{ OOO_STRING_SVTOOLS_HTML_O_SDonabort, OOO_STRING_SVTOOLS_HTML_O_onabort, SVX_EVENT_IMAGE_ABORT },
{ OOO_STRING_SVTOOLS_HTML_O_SDonerror, OOO_STRING_SVTOOLS_HTML_O_onerror, SVX_EVENT_IMAGE_ERROR },
{ 0, 0, 0 }
};
static HTMLOutEvent __FAR_DATA aIMapEventTable[] =
{
{ OOO_STRING_SVTOOLS_HTML_O_SDonmouseover, OOO_STRING_SVTOOLS_HTML_O_onmouseover, SFX_EVENT_MOUSEOVER_OBJECT },
{ OOO_STRING_SVTOOLS_HTML_O_SDonmouseout, OOO_STRING_SVTOOLS_HTML_O_onmouseout, SFX_EVENT_MOUSEOUT_OBJECT },
{ 0, 0, 0 }
};
SV_IMPL_OP_PTRARR_SORT( SwHTMLPosFlyFrms, SwHTMLPosFlyFrmPtr )
sal_uInt16 SwHTMLWriter::GuessFrmType( const SwFrmFmt& rFrmFmt,
const SdrObject*& rpSdrObj )
{
SwHTMLFrmType eType;
if( RES_DRAWFRMFMT == rFrmFmt.Which() )
{
// Als Default irgendein Zeichen-Objekt
eType = HTML_FRMTYPE_DRAW;
const SdrObject *pObj =
SwHTMLWriter::GetMarqueeTextObj( (const SwDrawFrmFmt &)rFrmFmt );
if( pObj )
{
// Laufschrift
rpSdrObj = pObj;
eType = HTML_FRMTYPE_MARQUEE;
}
else
{
pObj = GetHTMLControl( (const SwDrawFrmFmt &)rFrmFmt );
if( pObj )
{
// Form-Control
rpSdrObj = pObj;
eType = HTML_FRMTYPE_CONTROL;
}
}
}
else
{
// Als Default ein Textrahmen
eType = HTML_FRMTYPE_TEXT;
const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
const SwNode* pNd = pDoc->GetNodes()[ nStt ];
if( pNd->IsGrfNode() )
{
// Grafik - Node
eType = HTML_FRMTYPE_GRF;
}
else if( pNd->IsOLENode() )
{
// Applet, Plugin, Floating-Frame
eType = (SwHTMLFrmType)GuessOLENodeFrmType( *pNd );
}
else
{
sal_uLong nEnd = pDoc->GetNodes()[nStt-1]->EndOfSectionIndex();
const SfxPoolItem* pItem;
const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
if( SFX_ITEM_SET == rItemSet.GetItemState( RES_COL,
sal_True, &pItem ) &&
((const SwFmtCol *)pItem)->GetNumCols() > 1 )
{
// spaltiger Rahmen
eType = HTML_FRMTYPE_MULTICOL;
}
else if( pNd->IsTableNode() )
{
const SwTableNode *pTblNd = pNd->GetTableNode();
sal_uLong nTblEnd = pTblNd->EndOfSectionIndex();
if( nTblEnd+1 == nEnd )
{
// Tabelle
eType = HTML_FRMTYPE_TABLE;
}
else if( nTblEnd+2 == nEnd )
{
// Tabelle mit Unterschrft
eType = HTML_FRMTYPE_TABLE_CAP;
}
}
else if( pNd->IsTxtNode() )
{
const SwTxtNode *pTxtNd = pNd->GetTxtNode();
sal_Bool bEmpty = sal_False;
if( nStt==nEnd-1 && !pTxtNd->Len() )
{
// leerer Rahmen? Nur wenn kein Rahmen am
// Text- oder Start-Node verankert ist.
bEmpty = sal_True;
if( pHTMLPosFlyFrms )
{
for( sal_uInt16 i=0; i<pHTMLPosFlyFrms->Count(); i++ )
{
sal_uLong nIdx = (*pHTMLPosFlyFrms)[i]
->GetNdIndex().GetIndex();
bEmpty = (nIdx != nStt) && (nIdx != nStt-1);
if( !bEmpty || nIdx > nStt )
break;
}
}
}
if( bEmpty )
{
const SvxBrushItem& rBrush = rFrmFmt.GetBackground();
/// OD 02.09.2002 #99657#
/// background is not empty, if it has a background graphic
/// or its background color is not "no fill"/"auto fill".
if( GPOS_NONE != rBrush.GetGraphicPos() ||
rBrush.GetColor() != COL_TRANSPARENT )
bEmpty = sal_False;
}
if( bEmpty )
{
// leerer Rahmen
eType = HTML_FRMTYPE_EMPTY;
}
else if( pDoc->GetNodes()[nStt+1]->IsTableNode() )
{
const SwTableNode *pTblNd =
pDoc->GetNodes()[nStt+1]->GetTableNode();
if( pTblNd->EndOfSectionIndex()+1 == nEnd )
{
// Tabelle mit Ueberschrift
eType = HTML_FRMTYPE_TABLE_CAP;
}
}
}
}
}
return static_cast< sal_uInt16 >(eType);
}
void SwHTMLWriter::CollectFlyFrms()
{
ASSERT( HTML_CFG_MAX+1 == MAX_BROWSERS,
"number of browser configurations has changed" );
// sal_uInt8 nSz = (sal_uInt8)Min( pDoc->GetSpzFrmFmts()->Count(), sal_uInt16(255) );
SwPosFlyFrms aFlyPos(pDoc->GetAllFlyFmts(bWriteAll ? 0 : pCurPam, sal_True));
for(SwPosFlyFrms::const_iterator aIter(aFlyPos.begin()); aIter != aFlyPos.end(); aIter++)
{
const SwFrmFmt& rFrmFmt = (*aIter)->GetFmt();
const SdrObject *pSdrObj = 0;
const SwPosition *pAPos;
const SwCntntNode *pACNd;
SwHTMLFrmType eType = (SwHTMLFrmType)GuessFrmType( rFrmFmt, pSdrObj );
sal_uInt8 nMode;
const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor();
sal_Int16 eHoriRel = rFrmFmt.GetHoriOrient().GetRelationOrient();
switch( rAnchor.GetAnchorId() )
{
case FLY_AT_PAGE:
case FLY_AT_FLY:
nMode = aHTMLOutFrmPageFlyTable[eType][nExportMode];
break;
case FLY_AT_PARA:
// Absatz-gebundene Rahmen werden nur dann vor den
// Absatz geschrieben, wenn der Absatz einen Abstand
// hat.
if( text::RelOrientation::FRAME == eHoriRel &&
(pAPos = rAnchor.GetCntntAnchor()) != 0 &&
(pACNd = pAPos->nNode.GetNode().GetCntntNode()) != 0 )
{
const SvxLRSpaceItem& rLRItem =
(const SvxLRSpaceItem&)pACNd->GetAttr(RES_LR_SPACE);
if( rLRItem.GetTxtLeft() || rLRItem.GetRight() )
{
nMode = aHTMLOutFrmParaFrameTable[eType][nExportMode];
break;
}
}
nMode = aHTMLOutFrmParaPrtAreaTable[eType][nExportMode];
break;
case FLY_AT_CHAR:
if( text::RelOrientation::FRAME == eHoriRel || text::RelOrientation::PRINT_AREA == eHoriRel )
nMode = aHTMLOutFrmParaPrtAreaTable[eType][nExportMode];
else
nMode = aHTMLOutFrmParaOtherTable[eType][nExportMode];
break;
default:
nMode = aHTMLOutFrmParaPrtAreaTable[eType][nExportMode];
break;
}
if( !pHTMLPosFlyFrms )
pHTMLPosFlyFrms = new SwHTMLPosFlyFrms;
SwHTMLPosFlyFrm *pNew = new SwHTMLPosFlyFrm(**aIter, pSdrObj, nMode);
pHTMLPosFlyFrms->Insert( pNew );
}
}
sal_Bool SwHTMLWriter::OutFlyFrm( sal_uLong nNdIdx, xub_StrLen nCntntIdx, sal_uInt8 nPos,
HTMLOutContext *pContext )
{
sal_Bool bFlysLeft = sal_False; // Noch Flys an aktueller Node-Position da?
// OutFlyFrm kan rekursiv aufgerufen werden. Deshalb muss man
// manchmal wieder von vorne anfangen, nachdem ein Fly ausgegeben
// wurde.
sal_Bool bRestart = sal_True;
while( pHTMLPosFlyFrms && bRestart )
{
bFlysLeft = bRestart = sal_False;
// suche nach dem Anfang der FlyFrames
sal_uInt16 i;
for( i = 0; i < pHTMLPosFlyFrms->Count() &&
(*pHTMLPosFlyFrms)[i]->GetNdIndex().GetIndex() < nNdIdx; i++ )
;
for( ; !bRestart && i < pHTMLPosFlyFrms->Count() &&
(*pHTMLPosFlyFrms)[i]->GetNdIndex().GetIndex() == nNdIdx; i++ )
{
SwHTMLPosFlyFrm *pPosFly = (*pHTMLPosFlyFrms)[i];
if( ( HTML_POS_ANY == nPos ||
pPosFly->GetOutPos() == nPos ) &&
pPosFly->GetCntntIndex() == nCntntIdx )
{
// Erst entfernen ist wichtig, weil in tieferen
// Rekursionen evtl. weitere Eintraege oder das
// ganze Array geloscht werden koennte.
pHTMLPosFlyFrms->Remove( i, 1 );
i--;
if( !pHTMLPosFlyFrms->Count() )
{
delete pHTMLPosFlyFrms;
pHTMLPosFlyFrms = 0;
bRestart = sal_True; // nicht wirklich, nur raus
// aus der Schleife
}
if( pContext )
{
HTMLOutFuncs::FlushToAscii(Strm(), *pContext );
pContext = 0; // one time only
}
OutFrmFmt( pPosFly->GetOutMode(), pPosFly->GetFmt(),
pPosFly->GetSdrObject() );
switch( pPosFly->GetOutFn() )
{
case HTML_OUT_DIV:
case HTML_OUT_SPAN:
case HTML_OUT_MULTICOL:
case HTML_OUT_TBLNODE:
bRestart = sal_True; // Hier wird's evtl rekursiv
break;
}
delete pPosFly;
}
else
{
bFlysLeft = sal_True;
}
}
}
return bFlysLeft;
}
void SwHTMLWriter::OutFrmFmt( sal_uInt8 nMode, const SwFrmFmt& rFrmFmt,
const SdrObject *pSdrObject )
{
sal_uInt8 nCntnrMode = SwHTMLPosFlyFrm::GetOutCntnr( nMode );
sal_uInt8 nOutMode = SwHTMLPosFlyFrm::GetOutFn(nMode);
const sal_Char *pCntnrStr = 0;
if( HTML_CNTNR_NONE != nCntnrMode )
{
if( bLFPossible && HTML_CNTNR_DIV == nCntnrMode )
OutNewLine();
ByteString sOut( '<' );
pCntnrStr = (HTML_CNTNR_DIV == nCntnrMode)
? OOO_STRING_SVTOOLS_HTML_division
: OOO_STRING_SVTOOLS_HTML_span;
sOut += pCntnrStr;
((((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_class) += "=\"")
+= sCSS1_class_abs_pos) += '\"';
Strm() << sOut.GetBuffer();
// Fuer Nicht-Zeichenobekte eine Breite ausgeben
sal_uLong nFrmFlags = HTML_FRMOPTS_CNTNR;
// Fuer spaltige Rahmen koennen wir auch noch den Hintergrund ausgeben.
if( HTML_OUT_MULTICOL == nOutMode )
nFrmFlags |= HTML_FRMOPT_S_BACKGROUND|HTML_FRMOPT_S_BORDER;
if( IsHTMLMode( HTMLMODE_BORDER_NONE ) )
nFrmFlags |= HTML_FRMOPT_S_NOBORDER;
OutCSS1_FrmFmtOptions( rFrmFmt, nFrmFlags, pSdrObject );
Strm() << '>';
if( HTML_CNTNR_DIV == nCntnrMode )
{
IncIndentLevel();
bLFPossible = sal_True;
}
}
switch( nOutMode )
{
case HTML_OUT_TBLNODE: // OK
ASSERT( !pCntnrStr, "Table: Container ist hier nicht vorgesehen" );
OutHTML_FrmFmtTableNode( *this, rFrmFmt );
break;
case HTML_OUT_GRFNODE: // OK
OutHTML_FrmFmtGrfNode( *this, rFrmFmt, pCntnrStr != 0 );
break;
case HTML_OUT_OLENODE: // OK
OutHTML_FrmFmtOLENode( *this, rFrmFmt, pCntnrStr != 0 );
break;
case HTML_OUT_OLEGRF: // OK
OutHTML_FrmFmtOLENodeGrf( *this, rFrmFmt, pCntnrStr != 0 );
break;
case HTML_OUT_DIV:
case HTML_OUT_SPAN:
ASSERT( !pCntnrStr, "Div: Container ist hier nicht vorgesehen" );
OutHTML_FrmFmtAsDivOrSpan( *this, rFrmFmt, HTML_OUT_SPAN==nOutMode );
break;
case HTML_OUT_MULTICOL: // OK
OutHTML_FrmFmtAsMulticol( *this, rFrmFmt, pCntnrStr != 0 );
break;
case HTML_OUT_SPACER: // OK
ASSERT( !pCntnrStr, "Spacer: Container ist hier nicht vorgesehen" );
OutHTML_FrmFmtAsSpacer( *this, rFrmFmt );
break;
case HTML_OUT_CONTROL: // OK
OutHTML_DrawFrmFmtAsControl( *this,
(const SwDrawFrmFmt &)rFrmFmt, *pSdrObject,
pCntnrStr != 0 );
break;
case HTML_OUT_AMARQUEE:
OutHTML_FrmFmtAsMarquee( *this, rFrmFmt, *pSdrObject );
break;
case HTML_OUT_MARQUEE:
ASSERT( !pCntnrStr, "Marquee: Container ist hier nicht vorgesehen" );
OutHTML_DrawFrmFmtAsMarquee( *this,
(const SwDrawFrmFmt &)rFrmFmt, *pSdrObject );
break;
case HTML_OUT_GRFFRM:
OutHTML_FrmFmtAsImage( *this, rFrmFmt, pCntnrStr != 0 );
break;
}
if( HTML_CNTNR_DIV == nCntnrMode )
{
DecIndentLevel();
if( bLFPossible )
OutNewLine();
HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_division, sal_False );
bLFPossible = sal_True;
}
else if( HTML_CNTNR_SPAN == nCntnrMode )
HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_span, sal_False );
}
void SwHTMLWriter::OutFrmFmtOptions( const SwFrmFmt &rFrmFmt,
const String& rAlternateTxt,
ByteString &rEndTags,
sal_uInt32 nFrmOpts )
{
ByteString sOut;
const SfxPoolItem* pItem;
const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
// Name
if( (nFrmOpts & (HTML_FRMOPT_ID|HTML_FRMOPT_NAME)) &&
rFrmFmt.GetName().Len() )
{
const sal_Char *pStr =
(nFrmOpts & HTML_FRMOPT_ID) ? OOO_STRING_SVTOOLS_HTML_O_id : OOO_STRING_SVTOOLS_HTML_O_name;
((sOut += ' ') += pStr) += "=\"";
Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( Strm(), rFrmFmt.GetName(), eDestEnc, &aNonConvertableCharacters );
sOut = '\"';
}
// Name
if( nFrmOpts & HTML_FRMOPT_DIR )
{
sal_uInt16 nDir = GetHTMLDirection( rItemSet );
Strm() << sOut.GetBuffer();
sOut.Erase();
OutDirection( nDir );
}
// ALT
if( (nFrmOpts & HTML_FRMOPT_ALT) && rAlternateTxt.Len() )
{
((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_alt) += "=\"";
Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( Strm(), rAlternateTxt, eDestEnc, &aNonConvertableCharacters );
sOut = '\"';
}
// ALIGN
const sal_Char *pStr = 0;
RndStdIds eAnchorId = rFrmFmt.GetAnchor().GetAnchorId();
if( (nFrmOpts & HTML_FRMOPT_ALIGN) &&
((FLY_AT_PARA == eAnchorId) || (FLY_AT_CHAR == eAnchorId)) )
{
// MIB 12.3.98: Ist es nicht schlauer, absatzgebundene
// Rahmen notfalls links auszurichten als sie
// zeichengebunden einzufuegen???
const SwFmtHoriOrient& rHoriOri = rFrmFmt.GetHoriOrient();
if( !(nFrmOpts & HTML_FRMOPT_S_ALIGN) ||
text::RelOrientation::FRAME == rHoriOri.GetRelationOrient() ||
text::RelOrientation::PRINT_AREA == rHoriOri.GetRelationOrient() )
{
pStr = text::HoriOrientation::RIGHT == rHoriOri.GetHoriOrient()
? OOO_STRING_SVTOOLS_HTML_AL_right
: OOO_STRING_SVTOOLS_HTML_AL_left;
}
}
if( (nFrmOpts & HTML_FRMOPT_ALIGN) && !pStr &&
( (nFrmOpts & HTML_FRMOPT_S_ALIGN) == 0 ||
(FLY_AS_CHAR == eAnchorId) ) &&
SFX_ITEM_SET == rItemSet.GetItemState( RES_VERT_ORIENT, sal_True, &pItem ))
{
switch( ((SwFmtVertOrient*)pItem)->GetVertOrient() )
{
case text::VertOrientation::LINE_TOP: pStr = OOO_STRING_SVTOOLS_HTML_VA_top; break;
case text::VertOrientation::CHAR_TOP:
case text::VertOrientation::BOTTOM: pStr = OOO_STRING_SVTOOLS_HTML_VA_texttop; break; // geht nicht
case text::VertOrientation::LINE_CENTER:
case text::VertOrientation::CHAR_CENTER: pStr = OOO_STRING_SVTOOLS_HTML_VA_absmiddle; break; // geht nicht
case text::VertOrientation::CENTER: pStr = OOO_STRING_SVTOOLS_HTML_VA_middle; break;
case text::VertOrientation::LINE_BOTTOM:
case text::VertOrientation::CHAR_BOTTOM: pStr = OOO_STRING_SVTOOLS_HTML_VA_absbottom; break; // geht nicht
case text::VertOrientation::TOP: pStr = OOO_STRING_SVTOOLS_HTML_VA_bottom; break;
case text::VertOrientation::NONE: break;
}
}
if( pStr )
(((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_align) += '=') += pStr;
// HSPACE und VSPACE
Size aTwipSpc( 0, 0 );
if( (nFrmOpts & (HTML_FRMOPT_SPACE|HTML_FRMOPT_MARGINSIZE)) &&
SFX_ITEM_SET == rItemSet.GetItemState( RES_LR_SPACE, sal_True, &pItem ))
{
aTwipSpc.Width() =
( ((SvxLRSpaceItem*)pItem)->GetLeft() +
((SvxLRSpaceItem*)pItem)->GetRight() ) / 2;
nDfltLeftMargin = nDfltRightMargin = aTwipSpc.Width();
}
if( (nFrmOpts & (HTML_FRMOPT_SPACE|HTML_FRMOPT_MARGINSIZE)) &&
SFX_ITEM_SET == rItemSet.GetItemState( RES_UL_SPACE, sal_True, &pItem ))
{
aTwipSpc.Height() =
( ((SvxULSpaceItem*)pItem)->GetUpper() +
((SvxULSpaceItem*)pItem)->GetLower() ) / 2;
nDfltTopMargin = nDfltBottomMargin = (sal_uInt16)aTwipSpc.Height();
}
if( (nFrmOpts & HTML_FRMOPT_SPACE) &&
(aTwipSpc.Width() || aTwipSpc.Height()) &&
Application::GetDefaultDevice() )
{
Size aPixelSpc =
Application::GetDefaultDevice()->LogicToPixel( aTwipSpc,
MapMode(MAP_TWIP) );
if( !aPixelSpc.Width() && aTwipSpc.Width() )
aPixelSpc.Width() = 1;
if( !aPixelSpc.Height() && aTwipSpc.Height() )
aPixelSpc.Height() = 1;
if( aPixelSpc.Width() )
{
(((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_hspace) += '=')
+= ByteString::CreateFromInt32( aPixelSpc.Width() );
}
if( aPixelSpc.Height() )
{
(((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_vspace) += '=')
+= ByteString::CreateFromInt32( aPixelSpc.Height() );
}
}
// Der Abstand muss bei der Groesse beruecksichtigt, wenn das entsprechende
// Flag gesetzt ist.
if( (nFrmOpts & HTML_FRMOPT_MARGINSIZE) )
{
aTwipSpc.Width() *= -2;
aTwipSpc.Height() *= -2;
}
else
{
aTwipSpc.Width() = 0;
aTwipSpc.Height() = 0;
}
if( !(nFrmOpts & HTML_FRMOPT_ABSSIZE) &&
SFX_ITEM_SET == rItemSet.GetItemState( RES_BOX, sal_True, &pItem ))
{
const SvxBoxItem* pBoxItem = (const SvxBoxItem*)pItem;
aTwipSpc.Width() += pBoxItem->CalcLineSpace( BOX_LINE_LEFT );
aTwipSpc.Width() += pBoxItem->CalcLineSpace( BOX_LINE_RIGHT );
aTwipSpc.Height() += pBoxItem->CalcLineSpace( BOX_LINE_TOP );
aTwipSpc.Height() += pBoxItem->CalcLineSpace( BOX_LINE_BOTTOM );
}
// WIDTH und/oder HEIGHT
// ATT_VAR_SIZE/ATT_MIN_SIZE nur ausgeben, wenn ANYSIZE gesezut ist
if( (nFrmOpts & HTML_FRMOPT_SIZE) &&
SFX_ITEM_SET == rItemSet.GetItemState( RES_FRM_SIZE, sal_True, &pItem ) &&
( (nFrmOpts & HTML_FRMOPT_ANYSIZE) ||
ATT_FIX_SIZE == ((const SwFmtFrmSize *)pItem)->GetHeightSizeType()) )
{
const SwFmtFrmSize *pFSItem = (const SwFmtFrmSize *)pItem;
sal_uInt8 nPrcWidth = pFSItem->GetWidthPercent();
sal_uInt8 nPrcHeight = pFSItem->GetHeightPercent();
// Groesse des Objekts Twips ohne Raender
Size aTwipSz( (nPrcWidth ? 0
: pFSItem->GetWidth()-aTwipSpc.Width()),
(nPrcHeight ? 0
: pFSItem->GetHeight()-aTwipSpc.Height()) );
ASSERT( aTwipSz.Width() >= 0 && aTwipSz.Height() >= 0,
"Rahmengroesse minus Abstand < 0!!!???" );
if( aTwipSz.Width() < 0 )
aTwipSz.Width() = 0;
if( aTwipSz.Height() < 0 )
aTwipSz.Height() = 0;
Size aPixelSz( 0, 0 );
if( (aTwipSz.Width() || aTwipSz.Height()) &&
Application::GetDefaultDevice() )
{
aPixelSz =
Application::GetDefaultDevice()->LogicToPixel( aTwipSz,
MapMode(MAP_TWIP) );
if( !aPixelSz.Width() && aTwipSz.Width() )
aPixelSz.Width() = 1;
if( !aPixelSz.Height() && aTwipSz.Height() )
aPixelSz.Height() = 1;
}
if( (nFrmOpts & HTML_FRMOPT_WIDTH) &&
((nPrcWidth && nPrcWidth!=255) || aPixelSz.Width()) )
{
((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_width) += '=';
if( nPrcWidth )
(sOut += ByteString::CreateFromInt32( nPrcWidth )) += '%';
else
sOut += ByteString::CreateFromInt32( aPixelSz.Width() );
}
if( (nFrmOpts & HTML_FRMOPT_HEIGHT) &&
((nPrcHeight && nPrcHeight!=255) || aPixelSz.Height()) )
{
((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_height) += '=';
if( nPrcHeight )
(sOut += ByteString::CreateFromInt32( nPrcHeight )) += '%';
else
sOut += ByteString::CreateFromInt32( aPixelSz.Height() );
}
}
if( sOut.Len() )
Strm() << sOut.GetBuffer();
// Umlauf fuer absatzgeb. Grafiken als <BR CLEAR=...> in den String
// schreiben
if( (nFrmOpts & HTML_FRMOPT_BRCLEAR) &&
((FLY_AT_PARA == rFrmFmt.GetAnchor().GetAnchorId()) ||
(FLY_AT_CHAR == rFrmFmt.GetAnchor().GetAnchorId())) &&
SFX_ITEM_SET == rItemSet.GetItemState( RES_SURROUND, sal_True, &pItem ))
{
const SwFmtSurround* pSurround = (const SwFmtSurround*)pItem;
sal_Int16 eHoriOri = rFrmFmt.GetHoriOrient().GetHoriOrient();
pStr = 0;
SwSurround eSurround = pSurround->GetSurround();
sal_Bool bAnchorOnly = pSurround->IsAnchorOnly();
switch( eHoriOri )
{
case text::HoriOrientation::RIGHT:
{
switch( eSurround )
{
case SURROUND_NONE:
case SURROUND_RIGHT:
pStr = OOO_STRING_SVTOOLS_HTML_AL_right;
break;
case SURROUND_LEFT:
case SURROUND_PARALLEL:
if( bAnchorOnly )
bClearRight = sal_True;
break;
default:
;
}
}
break;
default:
// #67508#: If a frame is centered, it gets left aligned. This
// should be taken into account here, too.
{
switch( eSurround )
{
case SURROUND_NONE:
case SURROUND_LEFT:
pStr = OOO_STRING_SVTOOLS_HTML_AL_left;
break;
case SURROUND_RIGHT:
case SURROUND_PARALLEL:
if( bAnchorOnly )
bClearLeft = sal_True;
break;
default:
;
}
}
break;
}
if( pStr )
{
(((((((sOut = '<') += OOO_STRING_SVTOOLS_HTML_linebreak) += ' ')
+= OOO_STRING_SVTOOLS_HTML_O_clear) += '=') += pStr) += '>') += rEndTags;
rEndTags = sOut;
}
}
}
Writer& OutHTML_Image( Writer& rWrt, const SwFrmFmt &rFrmFmt,
const String &rGrfName, const String& rAlternateTxt,
const Size &rRealSize, sal_uInt32 nFrmOpts,
const sal_Char *pMarkType,
const ImageMap *pAltImgMap )
{
SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
// ggf. ein noch offenes Attribut voruebergehend beenden
if( rHTMLWrt.aINetFmts.Count() )
{
SwFmtINetFmt *pINetFmt =
rHTMLWrt.aINetFmts[ rHTMLWrt.aINetFmts.Count()-1 ];
OutHTML_INetFmt( rWrt, *pINetFmt, sal_False );
}
String aGrfNm( rGrfName );
if( !HTMLOutFuncs::PrivateURLToInternalImg(aGrfNm) )
aGrfNm = URIHelper::simpleNormalizedMakeRelative( rWrt.GetBaseURL(), aGrfNm);
const SfxPoolItem* pItem;
const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
const SwFmtURL *pURLItem = 0;
// das URL-Attribut nur beruecksichtigen, wenn keine Image-Map
// uebergeben wurde
if( !pAltImgMap &&
SFX_ITEM_SET == rItemSet.GetItemState( RES_URL, sal_True, &pItem ))
{
pURLItem = (const SwFmtURL *)pItem;
}
// Image-Map rausschreiben
const ImageMap *pIMap = pAltImgMap;
if( !pIMap && pURLItem )
{
pIMap = pURLItem->GetMap();
}
String aIMapName;
if( pIMap )
{
// den Namen eindeutig machen
aIMapName = pIMap->GetName();
String aNameBase;
if( aIMapName.Len() )
aNameBase = aIMapName;
else
aNameBase.AssignAscii( OOO_STRING_SVTOOLS_HTML_map );
if( !aIMapName.Len() )
(aIMapName = aNameBase)
+= String::CreateFromInt32( rHTMLWrt.nImgMapCnt );
sal_Bool bFound;
do
{
bFound = sal_False;
for( sal_uInt16 i=0; i<rHTMLWrt.aImgMapNames.Count(); i++ )
{
// TODO: Unicode: Comparison is case insensitive for ASCII
// characters only now!
if( aIMapName.EqualsIgnoreCaseAscii(*rHTMLWrt.aImgMapNames[i]) )
{
bFound = sal_True;
break;
}
}
if( bFound )
{
rHTMLWrt.nImgMapCnt++;
(aIMapName = aNameBase)
+= String::CreateFromInt32( rHTMLWrt.nImgMapCnt );
}
} while( bFound );
sal_Bool bScale = sal_False;
//Size aGrfSize( rNode.GetTwipSize() );
Fraction aScaleX( 1, 1 );
Fraction aScaleY( 1, 1 );
const SwFmtFrmSize& rFrmSize = rFrmFmt.GetFrmSize();
const SvxBoxItem& rBox = rFrmFmt.GetBox();
if( !rFrmSize.GetWidthPercent() && rRealSize.Width() )
{
SwTwips nWidth = rFrmSize.GetWidth();
nWidth -= ( rBox.CalcLineSpace(BOX_LINE_LEFT) +
rBox.CalcLineSpace(BOX_LINE_RIGHT) );
ASSERT( nWidth>0, "Gibt es 0 twip breite Grafiken!?" );
if( nWidth<=0 ) // sollte nicht passieren
nWidth = 1;
if( rRealSize.Width() != nWidth )
{
aScaleX = Fraction( nWidth, rRealSize.Width() );
bScale = sal_True;
}
}
if( !rFrmSize.GetHeightPercent() && rRealSize.Height() )
{
SwTwips nHeight = rFrmSize.GetHeight();
nHeight -= ( rBox.CalcLineSpace(BOX_LINE_TOP) +
rBox.CalcLineSpace(BOX_LINE_BOTTOM) );
ASSERT( nHeight>0, "Gibt es 0 twip hohe Grafiken!?" );
if( nHeight<=0 )
nHeight = 1;
if( rRealSize.Height() != nHeight )
{
aScaleY = Fraction( nHeight, rRealSize.Height() );
bScale = sal_True;
}
}
rHTMLWrt.aImgMapNames.Insert( new String(aIMapName),
rHTMLWrt.aImgMapNames.Count() );
ByteString aIndMap, aIndArea;
const sal_Char *pLF = 0, *pIndArea = 0, *pIndMap = 0;
#if defined(UNX)
sal_Char aLF[2] = "\x00";
#endif
if( rHTMLWrt.bLFPossible )
{
rHTMLWrt.OutNewLine( sal_True );
rHTMLWrt.GetIndentString( aIndMap );
rHTMLWrt.GetIndentString( aIndArea, 1 );
#if defined(UNX)
aLF[0] = SwHTMLWriter::sNewLine;
pLF = aLF;
#else
pLF = SwHTMLWriter::sNewLine;
#endif
pIndArea = aIndArea.GetBuffer();
pIndMap = aIndMap.GetBuffer();
}
if( bScale )
{
ImageMap aScaledIMap( *pIMap );
aScaledIMap.Scale( aScaleX, aScaleY );
HTMLOutFuncs::Out_ImageMap( rWrt.Strm(), rWrt.GetBaseURL(), aScaledIMap, aIMapName,
aIMapEventTable,
rHTMLWrt.bCfgStarBasic,
pLF, pIndArea, pIndMap,
rHTMLWrt.eDestEnc,
&rHTMLWrt.aNonConvertableCharacters );
}
else
{
HTMLOutFuncs::Out_ImageMap( rWrt.Strm(), rWrt.GetBaseURL(), *pIMap, aIMapName,
aIMapEventTable,
rHTMLWrt.bCfgStarBasic,
pLF, pIndArea, pIndMap,
rHTMLWrt.eDestEnc,
&rHTMLWrt.aNonConvertableCharacters );
}
}
// wenn meoglich vor der Grafik einen Zeilen-Umbruch ausgeben
if( rHTMLWrt.bLFPossible )
rHTMLWrt.OutNewLine( sal_True );
// Attribute die ausserhelb der Grafik geschreiben werden muessen sammeln
ByteString sOut;
ByteString aEndTags;
// implizite Sprungmarke -> <A NAME=...></A>...<IMG ...>
if( pMarkType && rFrmFmt.GetName().Len() )
rHTMLWrt.OutImplicitMark( rFrmFmt.GetName(), pMarkType );
// URL -> <A>...<IMG ... >...</A>
const SvxMacroItem *pMacItem = 0;
if( SFX_ITEM_SET == rItemSet.GetItemState( RES_FRMMACRO, sal_True, &pItem ))
pMacItem = (const SvxMacroItem *)pItem;
if( pURLItem || pMacItem )
{
String aMapURL;
String aName;
String aTarget;
if( pURLItem )
{
aMapURL = pURLItem->GetURL();
aName = pURLItem->GetName();
aTarget = pURLItem->GetTargetFrameName();
}
sal_Bool bEvents = pMacItem && pMacItem->GetMacroTable().Count();
if( aMapURL.Len() || aName.Len() || aTarget.Len() || bEvents )
{
(sOut = '<') += OOO_STRING_SVTOOLS_HTML_anchor;
// Ein HREF nur Ausgaben, wenn es einen Link oder Makros gibt
if( aMapURL.Len() || bEvents )
{
((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_href) += "=\"";
rWrt.Strm() << sOut.GetBuffer();
rHTMLWrt.OutHyperlinkHRefValue( aMapURL );
sOut = '\"';
}
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( aTarget.Len() )
{
((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_target) += "=\"";
rWrt.Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( rWrt.Strm(), aTarget,
rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
sOut = '\"';
}
if( sOut.Len() )
{
rWrt.Strm() << sOut.GetBuffer();
sOut.Erase();
}
if( pMacItem )
{
const SvxMacroTableDtor& rMacTable = pMacItem->GetMacroTable();
if( rMacTable.Count() )
HTMLOutFuncs::Out_Events( rWrt.Strm(), rMacTable,
aAnchorEventTable,
rHTMLWrt.bCfgStarBasic,
rHTMLWrt.eDestEnc,
&rHTMLWrt.aNonConvertableCharacters );
}
rWrt.Strm() << ">";
(((sOut = "</") += OOO_STRING_SVTOOLS_HTML_anchor) += ">") += aEndTags;
aEndTags = sOut;
}
}
// Umrandung -> <FONT COLOR = ...>...<IMG ... >...</FONT>
sal_uInt16 nBorderWidth = 0;
if( (nFrmOpts & HTML_FRMOPT_BORDER) &&
SFX_ITEM_SET == rItemSet.GetItemState( RES_BOX, sal_True, &pItem ))
{
Size aTwipBorder( 0, 0 );
const SvxBoxItem* pBoxItem = (const SvxBoxItem*)pItem;
const SvxBorderLine *pColBorderLine = 0;
const SvxBorderLine *pBorderLine = pBoxItem->GetLeft();
if( pBorderLine )
{
pColBorderLine = pBorderLine;
aTwipBorder.Width() += pBorderLine->GetOutWidth();
}
pBorderLine = pBoxItem->GetRight();
if( pBorderLine )
{
pColBorderLine = pBorderLine;
aTwipBorder.Width() += pBorderLine->GetOutWidth();
}
pBorderLine = pBoxItem->GetTop();
if( pBorderLine )
{
pColBorderLine = pBorderLine;
aTwipBorder.Height() += pBorderLine->GetOutWidth();
}
pBorderLine = pBoxItem->GetBottom();
if( pBorderLine )
{
pColBorderLine = pBorderLine;
aTwipBorder.Height() += pBorderLine->GetOutWidth();
}
aTwipBorder.Width() /= 2;
aTwipBorder.Height() /= 2;
if( (aTwipBorder.Width() || aTwipBorder.Height()) &&
Application::GetDefaultDevice() )
{
Size aPixelBorder =
Application::GetDefaultDevice()->LogicToPixel( aTwipBorder,
MapMode(MAP_TWIP) );
if( !aPixelBorder.Width() && aTwipBorder.Width() )
aPixelBorder.Width() = 1;
if( !aPixelBorder.Height() && aTwipBorder.Height() )
aPixelBorder.Height() = 1;
if( aPixelBorder.Width() )
aPixelBorder.Height() = 0;
nBorderWidth =
(sal_uInt16)(aPixelBorder.Width() + aPixelBorder.Height());
}
if( pColBorderLine )
{
sOut = '<';
(((sOut += OOO_STRING_SVTOOLS_HTML_font) += ' ') += OOO_STRING_SVTOOLS_HTML_O_color) += '=';
rWrt.Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_Color( rWrt.Strm(),
pColBorderLine->GetColor(), rHTMLWrt.eDestEnc ) << '>';
(((sOut = "</" ) += OOO_STRING_SVTOOLS_HTML_font) += '>') += aEndTags;
aEndTags = sOut;
}
}
sOut = '<';
(((sOut += OOO_STRING_SVTOOLS_HTML_image) += ' ') += OOO_STRING_SVTOOLS_HTML_O_src) += "=\"";
rWrt.Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( rWrt.Strm(), aGrfNm, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ) << '\"';
// Events
sOut.Erase();
if( SFX_ITEM_SET == rItemSet.GetItemState( RES_FRMMACRO, sal_True, &pItem ))
{
const SvxMacroTableDtor& rMacTable =
((const SvxMacroItem *)pItem)->GetMacroTable();
if( rMacTable.Count() )
HTMLOutFuncs::Out_Events( rWrt.Strm(), rMacTable, aImageEventTable,
rHTMLWrt.bCfgStarBasic, rHTMLWrt.eDestEnc,
&rHTMLWrt.aNonConvertableCharacters );
}
// ALT, ALIGN, WIDTH, HEIGHT, HSPACE, VSPACE
rHTMLWrt.OutFrmFmtOptions( rFrmFmt, rAlternateTxt, aEndTags, nFrmOpts );
if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) )
rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmOpts );
if( nFrmOpts & HTML_FRMOPT_BORDER )
{
(((sOut = ' ') += OOO_STRING_SVTOOLS_HTML_O_border) += '=')
+= ByteString::CreateFromInt32( nBorderWidth );
rWrt.Strm() << sOut.GetBuffer();
}
if( pURLItem && pURLItem->IsServerMap() )
{
(sOut = ' ') += OOO_STRING_SVTOOLS_HTML_O_ismap;
rWrt.Strm() << sOut.GetBuffer();
}
if( aIMapName.Len() )
{
((sOut = ' ') += OOO_STRING_SVTOOLS_HTML_O_usemap) += "=\"#";
rWrt.Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( rWrt.Strm(), aIMapName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ) << '\"';
}
rHTMLWrt.Strm() << '>';
if( aEndTags.Len() )
rWrt.Strm() << aEndTags.GetBuffer();
if( rHTMLWrt.aINetFmts.Count() )
{
// es ist noch ein Attribut auf dem Stack, das wieder geoeffnet
// werden muss
SwFmtINetFmt *pINetFmt =
rHTMLWrt.aINetFmts[ rHTMLWrt.aINetFmts.Count()-1 ];
OutHTML_INetFmt( rWrt, *pINetFmt, sal_True );
}
return rHTMLWrt;
}
Writer& OutHTML_BulletImage( Writer& rWrt,
const sal_Char *pTag,
const SvxBrushItem* pBrush,
String &rGrfName,
const Size &rSize,
const SwFmtVertOrient* pVertOrient )
{
SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
// Wenn es ein BrushItem gibt, muss die Grafiknoch exportiert werden
const String *pLink = 0;
if( pBrush )
{
pLink = pBrush->GetGraphicLink();
// embeddete Grafik -> WriteEmbedded schreiben
if( !pLink )
{
const Graphic* pGrf = pBrush->GetGraphic();
if( pGrf )
{
// Grafik als (JPG-)File speichern
if( rHTMLWrt.GetOrigFileName() )
rGrfName = *rHTMLWrt.GetOrigFileName();
sal_uInt16 nErr = XOutBitmap::WriteGraphic( *pGrf, rGrfName,
String::CreateFromAscii("JPG"),
(XOUTBMP_USE_GIF_IF_SENSIBLE |
XOUTBMP_USE_NATIVE_IF_POSSIBLE));
if( !nErr )
{
rGrfName = URIHelper::SmartRel2Abs(
INetURLObject( rWrt.GetBaseURL() ), rGrfName,
URIHelper::GetMaybeFileHdl() );
pLink = &rGrfName;
}
else
{
rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
}
}
}
else
{
rGrfName = *pLink;
if( rHTMLWrt.bCfgCpyLinkedGrfs )
{
rHTMLWrt.CopyLocalFileToINet( rGrfName );
pLink = &rGrfName;
}
}
}
else
{
pLink = &rGrfName;
}
ByteString sOut;
if( pTag )
(sOut += '<') += pTag;
if( pLink )
{
sOut += ' ';
String s( *pLink );
if( !HTMLOutFuncs::PrivateURLToInternalImg(s) )
s = URIHelper::simpleNormalizedMakeRelative( rWrt.GetBaseURL(), s);
(sOut += OOO_STRING_SVTOOLS_HTML_O_src) += "=\"";
rWrt.Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( rWrt.Strm(), s, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
sOut = '\"';
// Groesse des Objekts Twips ohne Raender
Size aPixelSz( 0, 0 );
if( (rSize.Width() || rSize.Height()) && Application::GetDefaultDevice() )
{
aPixelSz =
Application::GetDefaultDevice()->LogicToPixel( rSize,
MapMode(MAP_TWIP) );
if( !aPixelSz.Width() && rSize.Width() )
aPixelSz.Width() = 1;
if( !aPixelSz.Height() && rSize.Height() )
aPixelSz.Height() = 1;
}
if( aPixelSz.Width() )
(((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_width) += '=')
+= ByteString::CreateFromInt32( aPixelSz.Width() );
if( aPixelSz.Height() )
(((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_height) += '=')
+= ByteString::CreateFromInt32( aPixelSz.Height() );
if( pVertOrient )
{
const sal_Char *pStr = 0;
switch( pVertOrient->GetVertOrient() )
{
case text::VertOrientation::LINE_TOP: pStr = OOO_STRING_SVTOOLS_HTML_VA_top; break;
case text::VertOrientation::CHAR_TOP:
case text::VertOrientation::BOTTOM: pStr = OOO_STRING_SVTOOLS_HTML_VA_texttop; break; // geht nicht
case text::VertOrientation::LINE_CENTER:
case text::VertOrientation::CHAR_CENTER: pStr = OOO_STRING_SVTOOLS_HTML_VA_absmiddle; break; // geht nicht
case text::VertOrientation::CENTER: pStr = OOO_STRING_SVTOOLS_HTML_VA_middle; break;
case text::VertOrientation::LINE_BOTTOM:
case text::VertOrientation::CHAR_BOTTOM: pStr = OOO_STRING_SVTOOLS_HTML_VA_absbottom; break; // geht nicht
case text::VertOrientation::TOP: pStr = OOO_STRING_SVTOOLS_HTML_VA_bottom; break;
case text::VertOrientation::NONE: break;
}
if( pStr )
(((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_align) += '=') += pStr;
}
}
if( pTag )
sOut += '>';
rWrt.Strm() << sOut.GetBuffer();
return rWrt;
}
//-----------------------------------------------------------------------
static Writer& OutHTML_FrmFmtTableNode( Writer& rWrt, const SwFrmFmt& rFrmFmt )
{
SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
sal_uLong nEnd = rHTMLWrt.pDoc->GetNodes()[nStt-1]->EndOfSectionIndex();
String aCaption;
sal_Bool bTopCaption = sal_False;
// Nicht const, weil GetTable spater mal nicht const ist
SwNode *pNd = rHTMLWrt.pDoc->GetNodes()[ nStt ];
SwTableNode *pTblNd = pNd->GetTableNode();
const SwTxtNode *pTxtNd = pNd->GetTxtNode();
if( !pTblNd && pTxtNd )
{
// Tabelle mit Ueberschrift
bTopCaption = sal_True;
pTblNd = rHTMLWrt.pDoc->GetNodes()[nStt+1]->GetTableNode();
}
ASSERT( pTblNd, "Rahmen enthaelt keine Tabelle" );
if( pTblNd )
{
sal_uLong nTblEnd = pTblNd->EndOfSectionIndex();
ASSERT( nTblEnd == nEnd - 1 ||
(nTblEnd == nEnd - 2 && !bTopCaption),
"Ungeuelter Rahmen-Inhalt fuer Tabelle" );
if( nTblEnd == nEnd - 2 )
pTxtNd = rHTMLWrt.pDoc->GetNodes()[nTblEnd+1]->GetTxtNode();
}
if( pTxtNd )
aCaption = pTxtNd->GetTxt();
{
HTMLSaveData aSaveData( rHTMLWrt, pTblNd->GetIndex()+1,
pTblNd->EndOfSectionIndex(),
sal_True, &rFrmFmt );
rHTMLWrt.bOutFlyFrame = sal_True;
OutHTML_SwTblNode( rHTMLWrt, *pTblNd, &rFrmFmt, &aCaption,
bTopCaption );
}
return rWrt;
}
static Writer & OutHTML_FrmFmtAsMulticol( Writer& rWrt,
const SwFrmFmt& rFrmFmt,
sal_Bool bInCntnr )
{
SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
rHTMLWrt.ChangeParaToken( 0 );
// Die aktulle <DL> beenden!
rHTMLWrt.OutAndSetDefList( 0 );
// als Multicol ausgeben
if( rHTMLWrt.bLFPossible )
rHTMLWrt.OutNewLine();
ByteString sOut( '<' );
sOut += OOO_STRING_SVTOOLS_HTML_multicol;
const SwFmtCol& rFmtCol = rFrmFmt.GetCol();
// die Anzahl der Spalten als COLS ausgeben
sal_uInt16 nCols = rFmtCol.GetNumCols();
if( nCols )
(((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_cols) += '=')
+= ByteString::CreateFromInt32( nCols );
// die Gutter-Breite (Minimalwert) als GUTTER
sal_uInt16 nGutter = rFmtCol.GetGutterWidth( sal_True );
if( nGutter!=USHRT_MAX )
{
if( nGutter && Application::GetDefaultDevice() )
{
nGutter = (sal_uInt16)Application::GetDefaultDevice()
->LogicToPixel( Size(nGutter,0),
MapMode(MAP_TWIP) ).Width();
}
(((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_gutter) += '=')
+= ByteString::CreateFromInt32( nGutter );
}
rWrt.Strm() << sOut.GetBuffer();
// WIDTH
sal_uLong nFrmFlags = bInCntnr ? HTML_FRMOPTS_MULTICOL_CNTNR
: HTML_FRMOPTS_MULTICOL;
if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bInCntnr )
nFrmFlags |= HTML_FRMOPTS_MULTICOL_CSS1;
ByteString aEndTags;
rHTMLWrt.OutFrmFmtOptions( rFrmFmt, aEmptyStr, aEndTags, nFrmFlags );
if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bInCntnr )
rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmFlags );
rWrt.Strm() << '>';
rHTMLWrt.bLFPossible = sal_True;
rHTMLWrt.IncIndentLevel(); // den Inhalt von Multicol einruecken;
const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex();
const SwStartNode* pSttNd = rWrt.pDoc->GetNodes()[nStt]->GetStartNode();
ASSERT( pSttNd, "Wo ist der Start-Node" );
{
// in einem Block damit rechtzeitig vor dem Ende der alte Zustand
// wieder hergestellt wird.
HTMLSaveData aSaveData( rHTMLWrt, nStt+1,
pSttNd->EndOfSectionIndex(),
sal_True, &rFrmFmt );
rHTMLWrt.bOutFlyFrame = sal_True;
rHTMLWrt.Out_SwDoc( rWrt.pCurPam );
}
// rHTMLWrt.ChangeParaToken( 0 ); // MIB 8.7.97: Passiert jetzt in Out_SwDoc
rHTMLWrt.DecIndentLevel(); // den Inhalt von Multicol einruecken;
if( rHTMLWrt.bLFPossible )
rHTMLWrt.OutNewLine();
HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_multicol, sal_False );
rHTMLWrt.bLFPossible = sal_True;
return rWrt;
}
static Writer& OutHTML_FrmFmtAsSpacer( Writer& rWrt, const SwFrmFmt& rFrmFmt )
{
SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
// wenn meoglich vor der Grafik einen Zeilen-Umbruch ausgeben
if( rHTMLWrt.bLFPossible )
rHTMLWrt.OutNewLine( sal_True );
ByteString sOut('<');
((((sOut += OOO_STRING_SVTOOLS_HTML_spacer) += ' ') += OOO_STRING_SVTOOLS_HTML_O_type) += '=')
+= OOO_STRING_SVTOOLS_HTML_SPTYPE_block;
rWrt.Strm() << sOut.GetBuffer();
// ALIGN, WIDTH, HEIGHT
ByteString aEndTags;
rHTMLWrt.OutFrmFmtOptions( rFrmFmt, aEmptyStr, aEndTags,
HTML_FRMOPTS_SPACER );
rWrt.Strm() << '>';
if( aEndTags.Len() )
rWrt.Strm() << aEndTags.GetBuffer();
return rWrt;
}
static Writer& OutHTML_FrmFmtAsDivOrSpan( Writer& rWrt,
const SwFrmFmt& rFrmFmt, sal_Bool bSpan)
{
SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
const sal_Char *pStr = 0;
if( !bSpan )
{
rHTMLWrt.ChangeParaToken( 0 );
// Die aktulle <DL> beenden!
rHTMLWrt.OutAndSetDefList( 0 );
pStr = OOO_STRING_SVTOOLS_HTML_division;
}
else
pStr = OOO_STRING_SVTOOLS_HTML_span;
// als DIV ausgeben
if( rHTMLWrt.bLFPossible )
rHTMLWrt.OutNewLine();
ByteString sOut( '<' );
sOut += pStr;
rWrt.Strm() << sOut.GetBuffer();
ByteString aEndTags;
sal_uLong nFrmFlags = HTML_FRMOPTS_DIV;
if( rHTMLWrt.IsHTMLMode( HTMLMODE_BORDER_NONE ) )
nFrmFlags |= HTML_FRMOPT_S_NOBORDER;
rHTMLWrt.OutFrmFmtOptions( rFrmFmt, aEmptyStr, aEndTags, nFrmFlags );
rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmFlags );
rWrt.Strm() << '>';
rHTMLWrt.IncIndentLevel(); // den Inhalt einruecken
rHTMLWrt.bLFPossible = sal_True;
const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex();
// Am Start-Node verankerte Rahmen-gebundene Rahmen ausgeben
rHTMLWrt.OutFlyFrm( nStt, 0, HTML_POS_ANY );
const SwStartNode* pSttNd = rWrt.pDoc->GetNodes()[nStt]->GetStartNode();
ASSERT( pSttNd, "Wo ist der Start-Node" );
{
// in einem Block damit rechtzeitig vor dem Ende der alte Zustand
// wieder hergestellt wird.
HTMLSaveData aSaveData( rHTMLWrt, nStt+1,
pSttNd->EndOfSectionIndex(),
sal_True, &rFrmFmt );
rHTMLWrt.bOutFlyFrame = sal_True;
rHTMLWrt.Out_SwDoc( rWrt.pCurPam );
}
rHTMLWrt.DecIndentLevel(); // den Inhalt von Multicol einruecken;
if( rHTMLWrt.bLFPossible )
rHTMLWrt.OutNewLine();
HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), pStr, sal_False );
if( aEndTags.Len() )
rWrt.Strm() << aEndTags.GetBuffer();
return rWrt;
}
static Writer & OutHTML_FrmFmtAsImage( Writer& rWrt, const SwFrmFmt& rFrmFmt,
sal_Bool /*bInCntnr*/ )
{
SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
ImageMap aIMap;
Graphic aGrf( ((SwFrmFmt &)rFrmFmt).MakeGraphic( &aIMap ) );
String aGrfNm;
if( rHTMLWrt.GetOrigFileName() )
aGrfNm = *rHTMLWrt.GetOrigFileName();
if( aGrf.GetType() == GRAPHIC_NONE ||
XOutBitmap::WriteGraphic( aGrf, aGrfNm,
String::CreateFromAscii( "JPG" ),
(XOUTBMP_USE_GIF_IF_POSSIBLE|
XOUTBMP_USE_NATIVE_IF_POSSIBLE) ) != 0 )
{
// leer oder fehlerhaft, da ist nichts auszugeben
rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
return rWrt;
}
aGrfNm = URIHelper::SmartRel2Abs(
INetURLObject(rWrt.GetBaseURL()), aGrfNm,
URIHelper::GetMaybeFileHdl() );
Size aSz( 0, 0 );
OutHTML_Image( rWrt, rFrmFmt, aGrfNm, rFrmFmt.GetName(), aSz,
HTML_FRMOPTS_GENIMG, pMarkToFrame,
aIMap.GetIMapObjectCount() ? &aIMap : 0 );
return rWrt;
}
static Writer& OutHTML_FrmFmtGrfNode( Writer& rWrt, const SwFrmFmt& rFrmFmt,
sal_Bool bInCntnr )
{
SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
SwGrfNode *pGrfNd = rHTMLWrt.pDoc->GetNodes()[ nStt ]->GetGrfNode();
ASSERT( pGrfNd, "Grf-Node erwartet" );
if( !pGrfNd )
return rWrt;
const SwMirrorGrf& rMirror = pGrfNd->GetSwAttrSet().GetMirrorGrf();
String aGrfNm;
if( !pGrfNd->IsLinkedFile() || RES_MIRROR_GRAPH_DONT != rMirror.GetValue() )
{
// Grafik als File-Referenz speichern (als JPEG-Grafik speichern)
if( rHTMLWrt.GetOrigFileName() )
aGrfNm = *rHTMLWrt.GetOrigFileName();
pGrfNd->SwapIn( sal_True );
sal_uLong nFlags = XOUTBMP_USE_GIF_IF_SENSIBLE |
XOUTBMP_USE_NATIVE_IF_POSSIBLE;
switch( rMirror.GetValue() )
{
case RES_MIRROR_GRAPH_VERT: nFlags = XOUTBMP_MIRROR_HORZ; break;
case RES_MIRROR_GRAPH_HOR: nFlags = XOUTBMP_MIRROR_VERT; break;
case RES_MIRROR_GRAPH_BOTH:
nFlags = XOUTBMP_MIRROR_VERT | XOUTBMP_MIRROR_HORZ;
break;
}
Size aMM100Size;
const SwFmtFrmSize& rSize = rFrmFmt.GetFrmSize();
aMM100Size = OutputDevice::LogicToLogic( rSize.GetSize(),
MapMode( MAP_TWIP ), MapMode( MAP_100TH_MM ));
sal_uInt16 nErr = XOutBitmap::WriteGraphic( pGrfNd->GetGrf(), aGrfNm,
String::CreateFromAscii("JPG"), nFlags, &aMM100Size );
if( nErr ) // fehlerhaft, da ist nichts auszugeben
{
rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
return rWrt;
}
aGrfNm = URIHelper::SmartRel2Abs(
INetURLObject(rWrt.GetBaseURL()), aGrfNm,
URIHelper::GetMaybeFileHdl() );
}
else
{
pGrfNd->GetFileFilterNms( &aGrfNm, 0 );
if( rHTMLWrt.bCfgCpyLinkedGrfs )
rWrt.CopyLocalFileToINet( aGrfNm );
}
sal_uLong nFrmFlags = bInCntnr ? HTML_FRMOPTS_IMG_CNTNR : HTML_FRMOPTS_IMG;
if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bInCntnr )
nFrmFlags |= HTML_FRMOPTS_IMG_CSS1;
OutHTML_Image( rWrt, rFrmFmt, aGrfNm, pGrfNd->GetTitle(),
pGrfNd->GetTwipSize(), nFrmFlags, pMarkToGraphic );
return rWrt;
}
static Writer& OutHTML_FrmFmtAsMarquee( Writer& rWrt, const SwFrmFmt& rFrmFmt,
const SdrObject& rSdrObj )
{
SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
// die Edit-Engine-Attribute des Objekts als SW-Attribute holen
// und als Hints einsortieren
const SfxItemSet& rFmtItemSet = rFrmFmt.GetAttrSet();
SfxItemSet aItemSet( *rFmtItemSet.GetPool(), RES_CHRATR_BEGIN,
RES_CHRATR_END );
SwHTMLWriter::GetEEAttrsFromDrwObj( aItemSet, &rSdrObj, sal_True );
sal_Bool bCfgOutStylesOld = rHTMLWrt.bCfgOutStyles;
rHTMLWrt.bCfgOutStyles = sal_False;
rHTMLWrt.bTxtAttr = sal_True;
rHTMLWrt.bTagOn = sal_True;
Out_SfxItemSet( aHTMLAttrFnTab, rWrt, aItemSet, sal_False );
rHTMLWrt.bTxtAttr = sal_False;
OutHTML_DrawFrmFmtAsMarquee( rHTMLWrt,
(const SwDrawFrmFmt &)rFrmFmt,
rSdrObj );
rHTMLWrt.bTxtAttr = sal_True;
rHTMLWrt.bTagOn = sal_False;
Out_SfxItemSet( aHTMLAttrFnTab, rWrt, aItemSet, sal_False );
rHTMLWrt.bTxtAttr = sal_False;
rHTMLWrt.bCfgOutStyles = bCfgOutStylesOld;
return rWrt;
}
//-----------------------------------------------------------------------
Writer& OutHTML_HeaderFooter( Writer& rWrt, const SwFrmFmt& rFrmFmt,
sal_Bool bHeader )
{
SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
// als Multicol ausgeben
rHTMLWrt.OutNewLine();
ByteString sOut( OOO_STRING_SVTOOLS_HTML_division );
((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_type) += '=';
sOut += (bHeader ? "HEADER" : "FOOTER" );
HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sOut.GetBuffer() );
rHTMLWrt.IncIndentLevel(); // den Inhalt von Multicol einruecken;
// Einen Spacer fuer den Absatnd zusammenbasteln. Da durch das
// <DL> bzw. </DL> immer einer Absatz-Abstand entsteht, wird der
// ggf. abgezogen.
const SvxULSpaceItem& rULSpace = rFrmFmt.GetULSpace();
sal_uInt16 nSize = bHeader ? rULSpace.GetLower() : rULSpace.GetUpper();
rHTMLWrt.nHeaderFooterSpace = nSize;
ByteString aSpacer;
if( rHTMLWrt.IsHTMLMode(HTMLMODE_VERT_SPACER) &&
nSize > HTML_PARSPACE && Application::GetDefaultDevice() )
{
nSize -= HTML_PARSPACE;
nSize = (sal_Int16)Application::GetDefaultDevice()
->LogicToPixel( Size(nSize,0), MapMode(MAP_TWIP) ).Width();
((((((((aSpacer = OOO_STRING_SVTOOLS_HTML_spacer) += ' ')
+= OOO_STRING_SVTOOLS_HTML_O_type) += '=') += OOO_STRING_SVTOOLS_HTML_SPTYPE_vertical) += ' ')
+= OOO_STRING_SVTOOLS_HTML_O_size) += '=') += ByteString::CreateFromInt32(nSize);
}
const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex();
const SwStartNode* pSttNd = rWrt.pDoc->GetNodes()[nStt]->GetStartNode();
ASSERT( pSttNd, "Wo ist der Start-Node" );
if( !bHeader && aSpacer.Len() )
{
rHTMLWrt.OutNewLine();
HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), aSpacer.GetBuffer() );
}
{
// in einem Block damit rechtzeitig vor dem Ende der alte Zustand
// wieder hergestellt wird. pFlyFmt braucht hier nicht gestzt zu
// werden, denn PageDesc-Attribute koennen hier nicht vorkommen
HTMLSaveData aSaveData( rHTMLWrt, nStt+1,
pSttNd->EndOfSectionIndex() );
if( bHeader )
rHTMLWrt.bOutHeader = sal_True;
else
rHTMLWrt.bOutFooter = sal_True;
rHTMLWrt.Out_SwDoc( rWrt.pCurPam );
}
if( bHeader && aSpacer.Len() )
{
rHTMLWrt.OutNewLine();
HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), aSpacer.GetBuffer() );
}
rHTMLWrt.DecIndentLevel(); // den Inhalt von Multicol einruecken;
rHTMLWrt.OutNewLine();
HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_division, sal_False );
rHTMLWrt.nHeaderFooterSpace = 0;
return rWrt;
}
void SwHTMLWriter::AddLinkTarget( const String& rURL )
{
if( !rURL.Len() || rURL.GetChar(0) != '#' )
return;
// There might be a '|' as delimiter (if the link has been inserted
// freshly) or a '%7c' or a '%7C' if the document has been saved and
// loaded already.
xub_StrLen nPos = rURL.Len();
sal_Bool bFound = sal_False, bEncoded = sal_False;
while( !bFound && nPos > 0 )
{
sal_Unicode c = rURL.GetChar( --nPos );
switch( c )
{
case cMarkSeperator:
bFound = sal_True;
break;
case '%':
bFound = (rURL.Len() - nPos) >=3 &&
rURL.GetChar( nPos+1 ) == '7' &&
((c =rURL.GetChar( nPos+2 )) == 'C' || c == 'c');
if( bFound )
bEncoded = sal_True;
}
}
if( !bFound || nPos < 2 ) // mindetsens "#a|..."
return;
String aURL( rURL.Copy( 1 ) );
String sCmp( aURL.Copy( bEncoded ? nPos+2 : nPos ) ); // nPos-1+1/3 (-1 wg. Erase)
sCmp.EraseAllChars();
if( !sCmp.Len() )
return;
sCmp.ToLowerAscii();
if( sCmp.EqualsAscii( pMarkToRegion ) ||
sCmp.EqualsAscii( pMarkToFrame ) ||
sCmp.EqualsAscii( pMarkToGraphic ) ||
sCmp.EqualsAscii( pMarkToOLE ) ||
sCmp.EqualsAscii( pMarkToTable ) )
{
// Einfach nur in einem sortierten Array merken
if( bEncoded )
{
aURL.Erase( nPos, 2 );
aURL.SetChar( nPos-1, cMarkSeperator );
}
aImplicitMarks.Insert( new String( aURL ) );
}
else if( sCmp.EqualsAscii( pMarkToOutline ) )
{
// Hier brauchen wir Position und Name. Deshalb sortieren wir
// ein sal_uInt16 und ein String-Array selbst
String aOutline( aURL.Copy( 0, nPos-1 ) );
SwPosition aPos( *pCurPam->GetPoint() );
if( pDoc->GotoOutline( aPos, aOutline ) )
{
sal_uLong nIdx = aPos.nNode.GetIndex();
sal_uInt16 nIns=0;
while( nIns < aOutlineMarkPoss.Count() &&
aOutlineMarkPoss[nIns] < nIdx )
nIns++;
aOutlineMarkPoss.Insert( nIdx, nIns );
if( bEncoded )
{
aURL.Erase( nPos, 2 );
aURL.SetChar( nPos-1, cMarkSeperator );
}
aOutlineMarks.Insert( new String( aURL ), nIns );
}
}
else if( sCmp.EqualsAscii( pMarkToText ) )
{
//
}
}
void SwHTMLWriter::CollectLinkTargets()
{
const SwFmtINetFmt* pINetFmt;
const SwTxtINetFmt* pTxtAttr;
const SwTxtNode* pTxtNd;
sal_uInt32 n, nMaxItems = pDoc->GetAttrPool().GetItemCount2( RES_TXTATR_INETFMT );
for( n = 0; n < nMaxItems; ++n )
{
if( 0 != (pINetFmt = (SwFmtINetFmt*)pDoc->GetAttrPool().GetItem2(
RES_TXTATR_INETFMT, n ) ) &&
0 != ( pTxtAttr = pINetFmt->GetTxtINetFmt()) &&
0 != ( pTxtNd = pTxtAttr->GetpTxtNode() ) &&
pTxtNd->GetNodes().IsDocNodes() )
{
AddLinkTarget( pINetFmt->GetValue() );
}
}
const SwFmtURL *pURL;
nMaxItems = pDoc->GetAttrPool().GetItemCount2( RES_URL );
for( n = 0; n < nMaxItems; ++n )
{
if( 0 != (pURL = (SwFmtURL*)pDoc->GetAttrPool().GetItem2(
RES_URL, n ) ) )
{
AddLinkTarget( pURL->GetURL() );
const ImageMap *pIMap = pURL->GetMap();
if( pIMap )
{
for( sal_uInt16 i=0; i<pIMap->GetIMapObjectCount(); i++ )
{
const IMapObject* pObj = pIMap->GetIMapObject( i );
if( pObj )
{
AddLinkTarget( pObj->GetURL() );
}
}
}
}
}
}
//-----------------------------------------------------------------------
SwHTMLPosFlyFrm::SwHTMLPosFlyFrm( const SwPosFlyFrm& rPosFly,
const SdrObject *pSdrObj,
sal_uInt8 nOutMode ) :
pFrmFmt( &rPosFly.GetFmt() ),
pSdrObject( pSdrObj ),
pNdIdx( new SwNodeIndex( rPosFly.GetNdIndex() ) ),
nOrdNum( rPosFly.GetOrdNum() ),
nCntntIdx( 0 ),
nOutputMode( nOutMode )
{
const SwFmtAnchor& rAnchor = rPosFly.GetFmt().GetAnchor();
if ((FLY_AT_CHAR == rAnchor.GetAnchorId()) &&
HTML_POS_INSIDE == GetOutPos() )
{
// Auto-gebundene Rahmen werden ein Zeichen weiter hinten
// ausgegeben, weil dann die Positionierung mit Netscape
// uebereinstimmt.
ASSERT( rAnchor.GetCntntAnchor(), "Keine Anker-Position?" );
if( rAnchor.GetCntntAnchor() )
{
nCntntIdx = rAnchor.GetCntntAnchor()->nContent.GetIndex();
sal_Int16 eHoriRel = rPosFly.GetFmt().GetHoriOrient().
GetRelationOrient();
if( text::RelOrientation::FRAME == eHoriRel || text::RelOrientation::PRINT_AREA == eHoriRel )
{
const SwCntntNode *pCNd = pNdIdx->GetNode().GetCntntNode();
ASSERT( pCNd, "Kein Content-Node an PaM-Position" );
if( pCNd && nCntntIdx < pCNd->Len() )
nCntntIdx++;
}
}
}
}
sal_Bool SwHTMLPosFlyFrm::operator<( const SwHTMLPosFlyFrm& rFrm ) const
{
if( pNdIdx->GetIndex() == rFrm.pNdIdx->GetIndex() )
{
if( nCntntIdx == rFrm.nCntntIdx )
{
if( GetOutPos() == rFrm.GetOutPos() )
return nOrdNum < rFrm.nOrdNum;
else
return GetOutPos() < rFrm.GetOutPos();
}
else
return nCntntIdx < rFrm.nCntntIdx;
}
else
return pNdIdx->GetIndex() < rFrm.pNdIdx->GetIndex();
}