summaryrefslogtreecommitdiff
path: root/sw/source/filter/html/htmldraw.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/filter/html/htmldraw.cxx')
-rw-r--r--sw/source/filter/html/htmldraw.cxx860
1 files changed, 860 insertions, 0 deletions
diff --git a/sw/source/filter/html/htmldraw.cxx b/sw/source/filter/html/htmldraw.cxx
new file mode 100644
index 000000000000..328eb21be526
--- /dev/null
+++ b/sw/source/filter/html/htmldraw.cxx
@@ -0,0 +1,860 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: htmldraw.cxx,v $
+ * $Revision: 1.20 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+
+
+#include "hintids.hxx"
+#include <vcl/svapp.hxx>
+#ifndef _WRKWIN_HXX //autogen
+#include <vcl/wrkwin.hxx>
+#endif
+#include <svx/svdmodel.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/eeitem.hxx>
+
+#ifndef _OUTLINER_HXX //autogen
+#define _EEITEMID_HXX
+#include <svx/outliner.hxx>
+#endif
+#include <svx/xfillit.hxx>
+#include <svx/colritem.hxx>
+#include <svx/brshitem.hxx>
+#include <svx/lrspitem.hxx>
+#include <svx/ulspitem.hxx>
+#include <svtools/itemiter.hxx>
+#include <svtools/whiter.hxx>
+#include <svtools/htmlout.hxx>
+#include <svtools/htmltokn.h>
+#include <svtools/htmlkywd.hxx>
+#include <svx/svdpool.hxx>
+
+
+#include "charatr.hxx"
+#include <frmfmt.hxx>
+#include <fmtanchr.hxx>
+#include <fmtsrnd.hxx>
+#include "ndtxt.hxx"
+#include "doc.hxx"
+#include "dcontact.hxx"
+#include "poolfmt.hxx"
+#include "swcss1.hxx"
+#include "swhtml.hxx"
+#include "wrthtml.hxx"
+
+using namespace ::com::sun::star;
+
+
+const sal_uInt32 HTML_FRMOPTS_MARQUEE =
+ HTML_FRMOPT_ALIGN |
+ HTML_FRMOPT_SPACE;
+
+const sal_uInt32 HTML_FRMOPTS_MARQUEE_CSS1 =
+ HTML_FRMOPT_S_ALIGN |
+ HTML_FRMOPT_S_SPACE;
+
+static HTMLOptionEnum __FAR_DATA aHTMLMarqBehaviorTable[] =
+{
+ { OOO_STRING_SVTOOLS_HTML_BEHAV_scroll, SDRTEXTANI_SCROLL },
+ { OOO_STRING_SVTOOLS_HTML_BEHAV_alternate, SDRTEXTANI_ALTERNATE },
+ { OOO_STRING_SVTOOLS_HTML_BEHAV_slide, SDRTEXTANI_SLIDE },
+ { 0, 0 }
+};
+
+static HTMLOptionEnum __FAR_DATA aHTMLMarqDirectionTable[] =
+{
+ { OOO_STRING_SVTOOLS_HTML_AL_left, SDRTEXTANI_LEFT },
+ { OOO_STRING_SVTOOLS_HTML_AL_right, SDRTEXTANI_RIGHT },
+ { 0, 0 }
+};
+
+/* */
+void SwHTMLParser::InsertDrawObject( SdrObject* pNewDrawObj,
+ const Size& rPixSpace,
+ sal_Int16 eVertOri,
+ sal_Int16 eHoriOri,
+ SfxItemSet& rCSS1ItemSet,
+ SvxCSS1PropertyInfo& rCSS1PropInfo,
+ sal_Bool bHidden )
+{
+ // always on top of text.
+ // OD 02.07.2003 #108784# but in invisible layer. <ConnectToLayout> will
+ // move the object to the visible layer.
+ pNewDrawObj->SetLayer( pDoc->GetInvisibleHeavenId() );
+
+ SfxItemSet aFrmSet( pDoc->GetAttrPool(),
+ RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
+ if( !IsNewDoc() )
+ Reader::ResetFrmFmtAttrs( aFrmSet );
+
+ sal_uInt16 nLeftSpace = 0, nRightSpace = 0, nUpperSpace = 0, nLowerSpace = 0;
+ if( (rPixSpace.Width() || rPixSpace.Height()) && Application::GetDefaultDevice() )
+ {
+ Size aTwipSpc( rPixSpace.Width(), rPixSpace.Height() );
+ aTwipSpc =
+ Application::GetDefaultDevice()->PixelToLogic( aTwipSpc,
+ MapMode(MAP_TWIP) );
+ nLeftSpace = nRightSpace = (sal_uInt16)aTwipSpc.Width();
+ nUpperSpace = nLowerSpace = (sal_uInt16)aTwipSpc.Height();
+ }
+
+ // linken/rechten Rand setzen
+ const SfxPoolItem *pItem;
+ if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_LR_SPACE, sal_True, &pItem ) )
+ {
+ // Ggf. den Erstzeilen-Einzug noch plaetten
+ const SvxLRSpaceItem *pLRItem = (const SvxLRSpaceItem *)pItem;
+ SvxLRSpaceItem aLRItem( *pLRItem );
+ aLRItem.SetTxtFirstLineOfst( 0 );
+ if( rCSS1PropInfo.bLeftMargin )
+ {
+ nLeftSpace = static_cast< sal_uInt16 >(aLRItem.GetLeft());
+ rCSS1PropInfo.bLeftMargin = sal_False;
+ }
+ if( rCSS1PropInfo.bRightMargin )
+ {
+ nRightSpace = static_cast< sal_uInt16 >(aLRItem.GetRight());
+ rCSS1PropInfo.bRightMargin = sal_False;
+ }
+ rCSS1ItemSet.ClearItem( RES_LR_SPACE );
+ }
+ if( nLeftSpace || nRightSpace )
+ {
+ SvxLRSpaceItem aLRItem( RES_LR_SPACE );
+ aLRItem.SetLeft( nLeftSpace );
+ aLRItem.SetRight( nRightSpace );
+ aFrmSet.Put( aLRItem );
+ }
+
+ // oberen/unteren Rand setzen
+ if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_UL_SPACE, sal_True, &pItem ) )
+ {
+ // Ggf. den Erstzeilen-Einzug noch plaetten
+ const SvxULSpaceItem *pULItem = (const SvxULSpaceItem *)pItem;
+ if( rCSS1PropInfo.bTopMargin )
+ {
+ nUpperSpace = pULItem->GetUpper();
+ rCSS1PropInfo.bTopMargin = sal_False;
+ }
+ if( rCSS1PropInfo.bBottomMargin )
+ {
+ nLowerSpace = pULItem->GetLower();
+ rCSS1PropInfo.bBottomMargin = sal_False;
+ }
+
+ rCSS1ItemSet.ClearItem( RES_UL_SPACE );
+ }
+ if( nUpperSpace || nLowerSpace )
+ {
+ SvxULSpaceItem aULItem( RES_UL_SPACE );
+ aULItem.SetUpper( nUpperSpace );
+ aULItem.SetLower( nLowerSpace );
+ aFrmSet.Put( aULItem );
+ }
+
+ SwFmtAnchor aAnchor( FLY_IN_CNTNT );
+ if( SVX_CSS1_POS_ABSOLUTE == rCSS1PropInfo.ePosition &&
+ SVX_CSS1_LTYPE_TWIP == rCSS1PropInfo.eLeftType &&
+ SVX_CSS1_LTYPE_TWIP == rCSS1PropInfo.eTopType )
+ {
+ const SwStartNode *pFlySttNd =
+ pDoc->GetNodes()[pPam->GetPoint()->nNode]->FindFlyStartNode();
+
+ if( pFlySttNd )
+ {
+ aAnchor.SetType( FLY_AT_FLY );
+ SwPosition aPos( *pFlySttNd );
+ aAnchor.SetAnchor( &aPos );
+ }
+ else
+ {
+ aAnchor.SetType( FLY_PAGE );
+ }
+ // OD 2004-04-13 #i26791# - direct positioning for <SwDoc::Insert(..)>
+ pNewDrawObj->SetRelativePos( Point(rCSS1PropInfo.nLeft + nLeftSpace,
+ rCSS1PropInfo.nTop + nUpperSpace) );
+ aFrmSet.Put( SwFmtSurround(SURROUND_THROUGHT) );
+ }
+ else if( SVX_ADJUST_LEFT == rCSS1PropInfo.eFloat ||
+ text::HoriOrientation::LEFT == eHoriOri )
+ {
+ aAnchor.SetType( FLY_AT_CNTNT );
+ aFrmSet.Put( SwFmtSurround(bHidden ? SURROUND_THROUGHT
+ : SURROUND_RIGHT) );
+ // OD 2004-04-13 #i26791# - direct positioning for <SwDoc::Insert(..)>
+ pNewDrawObj->SetRelativePos( Point(nLeftSpace, nUpperSpace) );
+ }
+ else if( text::VertOrientation::NONE != eVertOri )
+ {
+ aFrmSet.Put( SwFmtVertOrient( 0, eVertOri ) );
+ }
+
+ if( FLY_PAGE == aAnchor.GetAnchorId() )
+ aAnchor.SetPageNum( 1 );
+ else if( FLY_AT_FLY != aAnchor.GetAnchorId() )
+ aAnchor.SetAnchor( pPam->GetPoint() );
+ aFrmSet.Put( aAnchor );
+
+ pDoc->Insert( *pPam, *pNewDrawObj, &aFrmSet, NULL );
+}
+
+/* */
+
+static void PutEEPoolItem( SfxItemSet &rEEItemSet,
+ const SfxPoolItem& rSwItem )
+{
+
+ sal_uInt16 nEEWhich = 0;
+
+ switch( rSwItem.Which() )
+ {
+ case RES_CHRATR_COLOR: nEEWhich = EE_CHAR_COLOR; break;
+ case RES_CHRATR_CROSSEDOUT: nEEWhich = EE_CHAR_STRIKEOUT; break;
+ case RES_CHRATR_ESCAPEMENT: nEEWhich = EE_CHAR_ESCAPEMENT; break;
+ case RES_CHRATR_FONT: nEEWhich = EE_CHAR_FONTINFO; break;
+ case RES_CHRATR_CJK_FONT: nEEWhich = EE_CHAR_FONTINFO_CJK; break;
+ case RES_CHRATR_CTL_FONT: nEEWhich = EE_CHAR_FONTINFO_CTL; break;
+ case RES_CHRATR_FONTSIZE: nEEWhich = EE_CHAR_FONTHEIGHT; break;
+ case RES_CHRATR_CJK_FONTSIZE: nEEWhich = EE_CHAR_FONTHEIGHT_CJK; break;
+ case RES_CHRATR_CTL_FONTSIZE: nEEWhich = EE_CHAR_FONTHEIGHT_CTL; break;
+ case RES_CHRATR_KERNING: nEEWhich = EE_CHAR_KERNING; break;
+ case RES_CHRATR_POSTURE: nEEWhich = EE_CHAR_ITALIC; break;
+ case RES_CHRATR_CJK_POSTURE: nEEWhich = EE_CHAR_ITALIC_CJK; break;
+ case RES_CHRATR_CTL_POSTURE: nEEWhich = EE_CHAR_ITALIC_CTL; break;
+ case RES_CHRATR_UNDERLINE: nEEWhich = EE_CHAR_UNDERLINE; break;
+ case RES_CHRATR_WEIGHT: nEEWhich = EE_CHAR_WEIGHT; break;
+ case RES_CHRATR_CJK_WEIGHT: nEEWhich = EE_CHAR_WEIGHT_CJK; break;
+ case RES_CHRATR_CTL_WEIGHT: nEEWhich = EE_CHAR_WEIGHT_CTL; break;
+ case RES_BACKGROUND:
+ case RES_CHRATR_BACKGROUND:
+ {
+ const SvxBrushItem& rBrushItem = (const SvxBrushItem&)rSwItem;
+ rEEItemSet.Put( XFillStyleItem(XFILL_SOLID) );
+ rEEItemSet.Put( XFillColorItem(aEmptyStr,
+ rBrushItem.GetColor()) );
+ }
+ break;
+ }
+
+ if( nEEWhich )
+ {
+ SfxPoolItem *pEEItem = rSwItem.Clone();
+ pEEItem->SetWhich( nEEWhich );
+ rEEItemSet.Put( *pEEItem );
+ delete pEEItem;
+ }
+}
+
+void SwHTMLParser::NewMarquee( HTMLTable *pCurTable )
+{
+
+ ASSERT( !pMarquee, "Marquee in Marquee???" );
+ aContents.Erase();
+
+ String aId, aStyle, aClass;
+
+ long nWidth=0, nHeight=0;
+ sal_Bool bPrcWidth = sal_False, bDirection = sal_False, bBGColor = sal_False;
+ Size aSpace( 0, 0 );
+ sal_Int16 eVertOri = text::VertOrientation::TOP;
+ sal_Int16 eHoriOri = text::HoriOrientation::NONE;
+ SdrTextAniKind eAniKind = SDRTEXTANI_SCROLL;
+ SdrTextAniDirection eAniDir = SDRTEXTANI_LEFT;
+ sal_uInt16 nCount = 0, nDelay = 60;
+ sal_Int16 nAmount = -6;
+ Color aBGColor;
+
+ const HTMLOptions *pHTMLOptions = GetOptions();
+ sal_uInt16 nArrLen = pHTMLOptions->Count();
+ for ( sal_uInt16 i=0; i<nArrLen; i++ )
+ {
+ const HTMLOption *pOption = (*pHTMLOptions)[i];
+ switch( pOption->GetToken() )
+ {
+ case HTML_O_ID:
+ aId = pOption->GetString();
+ break;
+ case HTML_O_STYLE:
+ aStyle = pOption->GetString();
+ break;
+ case HTML_O_CLASS:
+ aClass = pOption->GetString();
+ break;
+
+ case HTML_O_BEHAVIOR:
+ eAniKind =
+ (SdrTextAniKind)pOption->GetEnum( aHTMLMarqBehaviorTable,
+ static_cast< sal_uInt16 >(eAniKind) );
+ break;
+
+ case HTML_O_BGCOLOR:
+ pOption->GetColor( aBGColor );
+ bBGColor = sal_True;
+ break;
+
+ case HTML_O_DIRECTION:
+ eAniDir =
+ (SdrTextAniDirection)pOption->GetEnum( aHTMLMarqDirectionTable,
+ static_cast< sal_uInt16 >(eAniDir) );
+ bDirection = sal_True;
+ break;
+
+ case HTML_O_LOOP:
+ if( pOption->GetString().
+ EqualsIgnoreCaseAscii(OOO_STRING_SVTOOLS_HTML_LOOP_infinite) )
+ {
+ nCount = 0;
+ }
+ else
+ {
+ sal_uInt32 nLoop = pOption->GetSNumber();
+ nCount = (sal_uInt16)(nLoop>0 ? nLoop : 0 );
+ }
+ break;
+
+ case HTML_O_SCROLLAMOUNT:
+ nAmount = -((sal_Int16)pOption->GetNumber());
+ break;
+
+ case HTML_O_SCROLLDELAY:
+ nDelay = (sal_uInt16)pOption->GetNumber();
+ break;
+
+ case HTML_O_WIDTH:
+ // erstmal nur als Pixelwerte merken!
+ nWidth = pOption->GetNumber();
+ bPrcWidth = pOption->GetString().Search('%') != STRING_NOTFOUND;
+ if( bPrcWidth && nWidth>100 )
+ nWidth = 100;
+ break;
+
+ case HTML_O_HEIGHT:
+ // erstmal nur als Pixelwerte merken!
+ nHeight = pOption->GetNumber();
+ if( pOption->GetString().Search('%') != STRING_NOTFOUND )
+ nHeight = 0;
+ break;
+
+ case HTML_O_HSPACE:
+ // erstmal nur als Pixelwerte merken!
+ aSpace.Height() = pOption->GetNumber();
+ break;
+
+ case HTML_O_VSPACE:
+ // erstmal nur als Pixelwerte merken!
+ aSpace.Width() = pOption->GetNumber();
+ break;
+
+ case HTML_O_ALIGN:
+ eVertOri =
+ pOption->GetEnum( aHTMLImgVAlignTable,
+ text::VertOrientation::TOP );
+ eHoriOri =
+ pOption->GetEnum( aHTMLImgHAlignTable,
+ text::HoriOrientation::NONE );
+ break;
+ }
+ }
+
+ // Ein DrawTxtobj anlegen
+ // --> OD 2005-08-08 #i52858# - method name changed
+ SdrModel* pModel = pDoc->GetOrCreateDrawModel();
+ // <--
+ SdrPage* pPg = pModel->GetPage( 0 );
+ pMarquee = SdrObjFactory::MakeNewObject( SdrInventor,
+ OBJ_TEXT, pPg, pModel );
+ if( !pMarquee )
+ return;
+
+ pPg->InsertObject( pMarquee );
+
+ if( aId.Len() )
+ InsertBookmark( aId );
+
+ // (Nur) Alternate leueft per Default von links nach rechts
+ if( SDRTEXTANI_ALTERNATE==eAniKind && !bDirection )
+ eAniDir = SDRTEXTANI_RIGHT;
+
+ // die fuer das Scrollen benoetigten Attribute umsetzen
+ sal_uInt16 aWhichMap[7] = { XATTR_FILL_FIRST, XATTR_FILL_LAST,
+ SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST,
+ EE_CHAR_START, EE_CHAR_END,
+ 0 };
+ SfxItemSet aItemSet( pModel->GetItemPool(), aWhichMap );
+ aItemSet.Put( SdrTextAutoGrowWidthItem( sal_False ) );
+ aItemSet.Put( SdrTextAutoGrowHeightItem( sal_True ) );
+ aItemSet.Put( SdrTextAniKindItem( eAniKind ) );
+ aItemSet.Put( SdrTextAniDirectionItem( eAniDir ) );
+ aItemSet.Put( SdrTextAniCountItem( nCount ) );
+ aItemSet.Put( SdrTextAniDelayItem( nDelay ) );
+ aItemSet.Put( SdrTextAniAmountItem( nAmount ) );
+ if( SDRTEXTANI_ALTERNATE==eAniKind )
+ {
+ // (Nur) Alternate startet und stoppt per default Inside
+ aItemSet.Put( SdrTextAniStartInsideItem(sal_True) );
+ aItemSet.Put( SdrTextAniStopInsideItem(sal_True) );
+ if( SDRTEXTANI_LEFT==eAniDir )
+ aItemSet.Put( SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT) );
+ }
+
+ // die Default-Farbe (aus der Standard-Vorlage) setzen, damit ueberhaupt
+ // eine sinnvolle Farbe gesetzt ist.
+ const Color& rDfltColor =
+ pCSS1Parser->GetTxtCollFromPool( RES_POOLCOLL_STANDARD )
+ ->GetColor().GetValue();
+ aItemSet.Put( SvxColorItem( rDfltColor, EE_CHAR_COLOR ) );
+
+ // Die Attribute der aktuellen Absatzvorlage setzen
+ sal_uInt16 nWhichIds[] =
+ {
+ RES_CHRATR_COLOR, RES_CHRATR_CROSSEDOUT, RES_CHRATR_ESCAPEMENT,
+ RES_CHRATR_FONT, RES_CHRATR_FONTSIZE, RES_CHRATR_KERNING,
+ RES_CHRATR_POSTURE, RES_CHRATR_UNDERLINE, RES_CHRATR_WEIGHT,
+ RES_CHRATR_BACKGROUND,
+ RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONTSIZE,
+ RES_CHRATR_CJK_POSTURE, RES_CHRATR_CJK_WEIGHT,
+ RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONTSIZE,
+ RES_CHRATR_CTL_POSTURE, RES_CHRATR_CTL_WEIGHT,
+ 0
+ };
+ const SwTxtNode *pTxtNd = pDoc->GetNodes()[pPam->GetPoint()->nNode]
+ ->GetTxtNode();
+ if( pTxtNd )
+ {
+ const SfxItemSet& rItemSet = pTxtNd->GetAnyFmtColl().GetAttrSet();
+ const SfxPoolItem *pItem;
+ for( sal_uInt16 i=0; nWhichIds[i]; i++ )
+ {
+ if( SFX_ITEM_SET == rItemSet.GetItemState( nWhichIds[i], sal_True, &pItem ) )
+ PutEEPoolItem( aItemSet, *pItem );
+ }
+ }
+
+ // die Attribute der Umgebung am Draw-Objekt setzen
+ _HTMLAttr** pTbl = (_HTMLAttr**)&aAttrTab;
+ for( sal_uInt16 nCnt = sizeof( _HTMLAttrTable ) / sizeof( _HTMLAttr* );
+ nCnt--; ++pTbl )
+ {
+ _HTMLAttr *pAttr = *pTbl;
+ if( pAttr )
+ PutEEPoolItem( aItemSet, pAttr->GetItem() );
+ }
+
+ if( bBGColor )
+ {
+ aItemSet.Put( XFillStyleItem(XFILL_SOLID) );
+ aItemSet.Put( XFillColorItem(aEmptyStr, aBGColor) );
+ }
+
+ // Styles parsen (funktioniert hier nur fuer Attribute, die auch
+ // am Zeichen-Objekt gesetzt werden koennen)
+ SfxItemSet aStyleItemSet( pDoc->GetAttrPool(),
+ pCSS1Parser->GetWhichMap() );
+ SvxCSS1PropertyInfo aPropInfo;
+ if( HasStyleOptions( aStyle, aId, aClass ) &&
+ ParseStyleOptions( aStyle, aId, aClass, aStyleItemSet, aPropInfo ) )
+ {
+ SfxItemIter aIter( aStyleItemSet );
+
+ const SfxPoolItem *pItem = aIter.FirstItem();
+ while( pItem )
+ {
+ PutEEPoolItem( aItemSet, *pItem );
+ pItem = aIter.NextItem();
+ }
+ }
+
+ // jetzt noch die Groesse setzen
+ Size aTwipSz( bPrcWidth ? 0 : nWidth, nHeight );
+ if( (aTwipSz.Width() || aTwipSz.Height()) && Application::GetDefaultDevice() )
+ {
+ aTwipSz = Application::GetDefaultDevice()
+ ->PixelToLogic( aTwipSz, MapMode( MAP_TWIP ) );
+ }
+
+ if( SVX_CSS1_LTYPE_TWIP== aPropInfo.eWidthType )
+ {
+ aTwipSz.Width() = aPropInfo.nWidth;
+ nWidth = 1; // != 0;
+ bPrcWidth = sal_False;
+ }
+ if( SVX_CSS1_LTYPE_TWIP== aPropInfo.eHeightType )
+ aTwipSz.Height() = aPropInfo.nHeight;
+
+ bFixMarqueeWidth = sal_False;
+ if( !nWidth || bPrcWidth )
+ {
+ if( pTable )
+ {
+ if( !pCurTable )
+ {
+ // Die Laufschrift steht in einer Tabelle, aber nicht
+ // in einer Zelle. Da jetzt keine vernuenftige Zuordung
+ // zu einer Zelle moeglich ist, passen wir hir die
+ // Breite dem Inhalt der Laufschrift an.
+ bFixMarqueeWidth = sal_True;
+ }
+ else if( !nWidth )
+ {
+ // Da wir wissen, in welcher Zelle die Laufschrift ist,
+ // koennen wir die Breite auch anpassen. Keine Breitenangabe
+ // wird wie 100% behandelt.
+ nWidth = 100;
+ bPrcWidth = sal_True;
+ }
+ aTwipSz.Width() = MINLAY;
+ }
+ else
+ {
+ long nBrowseWidth = GetCurrentBrowseWidth();
+ aTwipSz.Width() = !nWidth ? nBrowseWidth
+ : (nWidth*nBrowseWidth) / 100;
+ }
+ }
+
+ // Die Hoehe ist nur eine Mindest-Hoehe
+ if( aTwipSz.Height() < MINFLY )
+ aTwipSz.Height() = MINFLY;
+ aItemSet.Put( SdrTextMinFrameHeightItem( aTwipSz.Height() ) );
+
+ pMarquee->SetMergedItemSetAndBroadcast(aItemSet);
+
+ if( aTwipSz.Width() < MINFLY )
+ aTwipSz.Width() = MINFLY;
+ pMarquee->SetLogicRect( Rectangle( 0, 0, aTwipSz.Width(), aTwipSz.Height() ) );
+
+ // und das Objekt in das Dok einfuegen
+ InsertDrawObject( pMarquee, aSpace, eVertOri, eHoriOri, aStyleItemSet,
+ aPropInfo );
+
+ // Das Zeichen-Objekt der Tabelle bekanntmachen. Ist ein bisserl
+ // umstaendlich, weil noch ueber den Parser gegangen wird, obwohl die
+ // Tabelle bekannt ist, aber anderenfalls muesste man die Tabelle
+ // oeffentlich machen, und das ist auch nicht schoen. Das globale
+ // pTable kann uebrigens auch nicht verwendet werden, denn die
+ // Laufschrift kann sich auch mal in einer Sub-Tabelle befinden.
+ if( pCurTable && bPrcWidth)
+ RegisterDrawObjectToTable( pCurTable, pMarquee, (sal_uInt8)nWidth );
+}
+
+void SwHTMLParser::EndMarquee()
+{
+ ASSERT( pMarquee && OBJ_TEXT==pMarquee->GetObjIdentifier(),
+ "kein Marquee oder falscher Typ" );
+
+ if( bFixMarqueeWidth )
+ {
+ // Da es keine fixe Hoehe gibt, das Text-Objekt erstmal breiter
+ // als den Text machen, damit nicht umgebrochen wird.
+ const Rectangle& rOldRect = pMarquee->GetLogicRect();
+ pMarquee->SetLogicRect( Rectangle( rOldRect.TopLeft(),
+ Size( USHRT_MAX, 240 ) ) );
+ }
+
+ // den gesammelten Text einfuegen
+ ((SdrTextObj*)pMarquee)->SetText( aContents );
+ pMarquee->SetMergedItemSetAndBroadcast( pMarquee->GetMergedItemSet() );
+
+ if( bFixMarqueeWidth )
+ {
+ // die Groesse dem Text anpassen.
+ ((SdrTextObj*)pMarquee)->FitFrameToTextSize();
+ }
+
+ aContents.Erase();
+ pMarquee = 0;
+}
+
+void SwHTMLParser::InsertMarqueeText()
+{
+ ASSERT( pMarquee && OBJ_TEXT==pMarquee->GetObjIdentifier(),
+ "kein Marquee oder falscher Typ" );
+
+ // das akteulle Textstueck an den Text anhaengen
+ aContents += aToken;
+}
+
+void SwHTMLParser::ResizeDrawObject( SdrObject* pObj, SwTwips nWidth )
+{
+ ASSERT( OBJ_TEXT==pObj->GetObjIdentifier(),
+ "kein Marquee oder falscher Typ" );
+
+ if( OBJ_TEXT!=pObj->GetObjIdentifier() )
+ return;
+
+ // die alte Groesse
+ const Rectangle& rOldRect = pObj->GetLogicRect();
+ Size aNewSz( nWidth, rOldRect.GetSize().Height() );
+ pObj->SetLogicRect( Rectangle( rOldRect.TopLeft(), aNewSz ) );
+}
+
+/* */
+
+const SdrObject *SwHTMLWriter::GetMarqueeTextObj( const SwDrawFrmFmt& rFmt )
+{
+ const SdrObject* pObj = rFmt.FindSdrObject();
+ return (pObj && ::IsMarqueeTextObj( *pObj )) ? pObj : 0;
+}
+
+void SwHTMLWriter::GetEEAttrsFromDrwObj( SfxItemSet& rItemSet,
+ const SdrObject *pObj,
+ sal_Bool bSetDefaults )
+{
+ // die Edit script::Engine-Attribute aus dem Objekt holen
+ SfxItemSet rObjItemSet = pObj->GetMergedItemSet();
+
+ // ueber die Edit script::Engine-Attribute iterieren und die Attribute
+ // in SW-Attrs wandeln bzw. default setzen
+ SfxWhichIter aIter( rObjItemSet );
+ sal_uInt16 nEEWhich = aIter.FirstWhich();
+ while( nEEWhich )
+ {
+ const SfxPoolItem *pEEItem;
+ sal_Bool bSet = SFX_ITEM_SET == rObjItemSet.GetItemState( nEEWhich, sal_False,
+ &pEEItem );
+
+ if( bSet || bSetDefaults )
+ {
+ sal_uInt16 nSwWhich = 0;
+ switch( nEEWhich )
+ {
+ case EE_CHAR_COLOR: nSwWhich = RES_CHRATR_COLOR; break;
+ case EE_CHAR_STRIKEOUT: nSwWhich = RES_CHRATR_CROSSEDOUT; break;
+ case EE_CHAR_ESCAPEMENT: nSwWhich = RES_CHRATR_ESCAPEMENT; break;
+ case EE_CHAR_FONTINFO: nSwWhich = RES_CHRATR_FONT; break;
+ case EE_CHAR_FONTINFO_CJK: nSwWhich = RES_CHRATR_CJK_FONT; break;
+ case EE_CHAR_FONTINFO_CTL: nSwWhich = RES_CHRATR_CTL_FONT; break;
+ case EE_CHAR_FONTHEIGHT: nSwWhich = RES_CHRATR_FONTSIZE; break;
+ case EE_CHAR_FONTHEIGHT_CJK:nSwWhich = RES_CHRATR_CJK_FONTSIZE; break;
+ case EE_CHAR_FONTHEIGHT_CTL:nSwWhich = RES_CHRATR_CTL_FONTSIZE; break;
+ case EE_CHAR_KERNING: nSwWhich = RES_CHRATR_KERNING; break;
+ case EE_CHAR_ITALIC: nSwWhich = RES_CHRATR_POSTURE; break;
+ case EE_CHAR_ITALIC_CJK: nSwWhich = RES_CHRATR_CJK_POSTURE; break;
+ case EE_CHAR_ITALIC_CTL: nSwWhich = RES_CHRATR_CTL_POSTURE; break;
+ case EE_CHAR_UNDERLINE: nSwWhich = RES_CHRATR_UNDERLINE; break;
+ case EE_CHAR_WEIGHT: nSwWhich = RES_CHRATR_WEIGHT; break;
+ case EE_CHAR_WEIGHT_CJK: nSwWhich = RES_CHRATR_CJK_WEIGHT; break;
+ case EE_CHAR_WEIGHT_CTL: nSwWhich = RES_CHRATR_CTL_WEIGHT; break;
+ }
+
+ if( nSwWhich )
+ {
+ // wenn das Item nicht gesetzt ist nehmen wir ggf. das
+ // Default-Item
+ if( !bSet )
+ pEEItem = &rObjItemSet.GetPool()->GetDefaultItem(nEEWhich);
+
+ // jetzt Clonen wir das Item mit der Which-Id des Writers
+ SfxPoolItem *pSwItem = pEEItem->Clone();
+ pSwItem->SetWhich( nSwWhich );
+ rItemSet.Put( *pSwItem );
+ delete pSwItem;
+ }
+ }
+
+ nEEWhich = aIter.NextWhich();
+ }
+}
+
+
+Writer& OutHTML_DrawFrmFmtAsMarquee( Writer& rWrt,
+ const SwDrawFrmFmt& rFmt,
+ const SdrObject& rSdrObject )
+{
+ SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
+
+ ASSERT( rWrt.pDoc->GetDrawModel(), "Da gibt's ein Draw-Obj ohne ein Draw-Model zu haben?" );
+ const SdrTextObj *pTextObj = (const SdrTextObj *)&rSdrObject;
+
+ // Gibt es ueberhaupt auszugebenden Text
+ const OutlinerParaObject *pOutlinerParaObj =
+ pTextObj->GetOutlinerParaObject();
+ if( !pOutlinerParaObj )
+ return rWrt;
+
+ ByteString sOut( '<' );
+ sOut += OOO_STRING_SVTOOLS_HTML_marquee;
+
+ // Die Attribute des Objektd holen
+ const SfxItemSet& rItemSet = pTextObj->GetMergedItemSet();
+
+ // BEHAVIOUR
+ SdrTextAniKind eAniKind = pTextObj->GetTextAniKind();
+ ASSERT( SDRTEXTANI_SCROLL==eAniKind ||
+ SDRTEXTANI_ALTERNATE==eAniKind ||
+ SDRTEXTANI_SLIDE==eAniKind,
+ "Text-Draw-Objekt nicht fuer Marquee geeignet" )
+
+ const sal_Char *pStr = 0;
+ switch( eAniKind )
+ {
+ case SDRTEXTANI_SCROLL: pStr = OOO_STRING_SVTOOLS_HTML_BEHAV_scroll; break;
+ case SDRTEXTANI_SLIDE: pStr = OOO_STRING_SVTOOLS_HTML_BEHAV_slide; break;
+ case SDRTEXTANI_ALTERNATE: pStr = OOO_STRING_SVTOOLS_HTML_BEHAV_alternate; break;
+ default:
+ ;
+ }
+
+ if( pStr )
+ (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_behavior) += '=') += pStr;
+
+ // DIRECTION
+ pStr = 0;
+ SdrTextAniDirection eAniDir = pTextObj->GetTextAniDirection();
+ switch( eAniDir )
+ {
+ case SDRTEXTANI_LEFT: pStr = OOO_STRING_SVTOOLS_HTML_AL_left; break;
+ case SDRTEXTANI_RIGHT: pStr = OOO_STRING_SVTOOLS_HTML_AL_right; break;
+ default:
+ ;
+ }
+
+ if( pStr )
+ (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_direction) += '=') += pStr;
+
+ // LOOP
+ sal_Int32 nCount =
+ ((const SdrTextAniCountItem&)rItemSet.Get( SDRATTR_TEXT_ANICOUNT ))
+ .GetValue();
+ if( 0==nCount )
+ nCount = SDRTEXTANI_SLIDE==eAniKind ? 1 : -1;
+ (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_loop) += '=')
+ += ByteString::CreateFromInt32( nCount );
+
+ // SCROLLDELAY
+ sal_uInt16 nDelay =
+ ((const SdrTextAniDelayItem&)rItemSet.Get( SDRATTR_TEXT_ANIDELAY ))
+ .GetValue();
+ (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_scrolldelay) += '=')
+ += ByteString::CreateFromInt32( nDelay );
+
+ // SCROLLAMOUNT
+ sal_Int16 nAmount =
+ ((const SdrTextAniAmountItem&)rItemSet.Get( SDRATTR_TEXT_ANIAMOUNT ))
+ .GetValue();
+ if( nAmount < 0 )
+ {
+ nAmount = -nAmount;
+ }
+ else if( nAmount && Application::GetDefaultDevice() )
+ {
+ nAmount = (sal_uInt16)(Application::GetDefaultDevice()
+ ->LogicToPixel( Size(nAmount,0),
+ MapMode(MAP_TWIP) ).Width());
+ }
+ if( nAmount )
+ (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_scrollamount) += '=')
+ += ByteString::CreateFromInt32( nAmount );
+
+ Size aTwipSz( pTextObj->GetLogicRect().GetSize() );
+ if( pTextObj->IsAutoGrowWidth() )
+ aTwipSz.Width() = 0;
+ // Die Hoehe ist bei MS eine Mindesthoehe, also geben wir auch die
+ // Mindestheoehe aus, wenn es sie gibt. Da eine Mindesthoehe MINFLY
+ // mit hoher Wahrscheinlichkeit vom Import kommt, wird sie nicht mit
+ // ausgegeben. Falsch machen kann man da nichst, denn jeder Font ist
+ // hoeher.
+ if( pTextObj->IsAutoGrowHeight() )
+ {
+ aTwipSz.Height() = pTextObj->GetMinTextFrameHeight();
+ if( MINFLY==aTwipSz.Height() )
+ aTwipSz.Height() = 0;
+ }
+
+ if( (aTwipSz.Width() || aTwipSz.Height()) &&
+ Application::GetDefaultDevice() )
+ {
+ Size 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( 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() );
+ }
+
+ // BGCOLOR
+ XFillStyle eFillStyle =
+ ((const XFillStyleItem&)rItemSet.Get(XATTR_FILLSTYLE)).GetValue();
+ if( XFILL_SOLID==eFillStyle )
+ {
+ const Color& rFillColor =
+ ((const XFillColorItem&)rItemSet.Get(XATTR_FILLCOLOR)).GetColorValue();
+
+ ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_bgcolor) += '=';
+ rWrt.Strm() << sOut.GetBuffer();
+ HTMLOutFuncs::Out_Color( rWrt.Strm(), rFillColor, rHTMLWrt.eDestEnc );
+ sOut.Erase();
+ }
+
+ if( sOut.Len() )
+ rWrt.Strm() << sOut.GetBuffer();
+
+ // und nun noch ALIGN, HSPACE und VSPACE
+ ByteString aEndTags;
+ sal_uInt32 nFrmFlags = HTML_FRMOPTS_MARQUEE;
+ if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_DRAW ) )
+ nFrmFlags |= HTML_FRMOPTS_MARQUEE_CSS1;
+ rHTMLWrt.OutFrmFmtOptions( rFmt, aEmptyStr, aEndTags, nFrmFlags );
+ if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_DRAW ) )
+ rHTMLWrt.OutCSS1_FrmFmtOptions( rFmt, nFrmFlags, &rSdrObject );
+
+
+ rWrt.Strm() << '>';
+
+ // Was jetzt kommt ist das Gegenstueck zu SdrTextObjectt::SetText()
+ Outliner aOutliner(0, OUTLINERMODE_TEXTOBJECT);
+ aOutliner.SetUpdateMode( sal_False );
+ aOutliner.SetText( *pOutlinerParaObj );
+ String aText( aOutliner.GetText( aOutliner.GetParagraph(0),
+ aOutliner.GetParagraphCount() ) );
+ HTMLOutFuncs::Out_String( rWrt.Strm(), aText,
+ rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
+
+ HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_marquee, sal_False );
+
+ if( aEndTags.Len() )
+ rWrt.Strm() << aEndTags.GetBuffer();
+
+ return rWrt;
+}
+
+