LCOV - code coverage report
Current view: top level - sw/source/filter/html - htmlflywriter.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 423 924 45.8 %
Date: 2014-11-03 Functions: 14 21 66.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <com/sun/star/text/HoriOrientation.hpp>
      21             : #include <com/sun/star/text/VertOrientation.hpp>
      22             : #include <com/sun/star/text/RelOrientation.hpp>
      23             : #include <comphelper/string.hxx>
      24             : #include <svx/svxids.hrc>
      25             : #include "hintids.hxx"
      26             : #include <svl/urihelper.hxx>
      27             : #include <vcl/svapp.hxx>
      28             : #include <vcl/wrkwin.hxx>
      29             : #include <svtools/htmlkywd.hxx>
      30             : #include <svtools/htmlout.hxx>
      31             : #include <svtools/imap.hxx>
      32             : #include <svtools/imapobj.hxx>
      33             : #include <svtools/htmlcfg.hxx>
      34             : #include <svx/xoutbmp.hxx>
      35             : #include <editeng/boxitem.hxx>
      36             : #include <editeng/lrspitem.hxx>
      37             : #include <editeng/ulspitem.hxx>
      38             : #include <editeng/brushitem.hxx>
      39             : 
      40             : #include <fmtanchr.hxx>
      41             : #include <fmtornt.hxx>
      42             : #include <fmturl.hxx>
      43             : #include <fmtfsize.hxx>
      44             : #include <fmtclds.hxx>
      45             : #include <fmtcntnt.hxx>
      46             : #include <fmtsrnd.hxx>
      47             : #include <fmtinfmt.hxx>
      48             : #include <txtinet.hxx>
      49             : #include "frmatr.hxx"
      50             : #include <grfatr.hxx>
      51             : #include <flypos.hxx>
      52             : #include <docary.hxx>
      53             : #include <ndgrf.hxx>
      54             : 
      55             : #include "doc.hxx"
      56             : #include "ndtxt.hxx"
      57             : #include "pam.hxx"
      58             : #include "swerror.h"
      59             : #include "frmfmt.hxx"
      60             : #include "wrthtml.hxx"
      61             : #include "css1kywd.hxx"
      62             : #include "htmlfly.hxx"
      63             : 
      64             : using namespace css;
      65             : 
      66             : const sal_uLong HTML_FRMOPTS_IMG_ALL        =
      67             :     HTML_FRMOPT_ALT |
      68             :     HTML_FRMOPT_SIZE |
      69             :     HTML_FRMOPT_ANYSIZE |
      70             :     HTML_FRMOPT_BORDER |
      71             :     HTML_FRMOPT_NAME;
      72             : const sal_uLong HTML_FRMOPTS_IMG_CNTNR      =
      73             :     HTML_FRMOPTS_IMG_ALL |
      74             :     HTML_FRMOPT_ABSSIZE;
      75             : const sal_uLong HTML_FRMOPTS_IMG            =
      76             :     HTML_FRMOPTS_IMG_ALL |
      77             :     HTML_FRMOPT_ALIGN |
      78             :     HTML_FRMOPT_SPACE |
      79             :     HTML_FRMOPT_BRCLEAR;
      80             : const sal_uLong HTML_FRMOPTS_IMG_CSS1       =
      81             :     HTML_FRMOPT_S_ALIGN |
      82             :     HTML_FRMOPT_S_SPACE;
      83             : 
      84             : const sal_uLong HTML_FRMOPTS_DIV            =
      85             :     HTML_FRMOPT_ID |
      86             :     HTML_FRMOPT_S_ALIGN |
      87             :     HTML_FRMOPT_S_SIZE |
      88             :     HTML_FRMOPT_ANYSIZE |
      89             :     HTML_FRMOPT_ABSSIZE |
      90             :     HTML_FRMOPT_S_SPACE |
      91             :     HTML_FRMOPT_S_BORDER |
      92             :     HTML_FRMOPT_S_BACKGROUND |
      93             :     HTML_FRMOPT_BRCLEAR |
      94             :     HTML_FRMOPT_DIR;
      95             : 
      96             : const sal_uLong HTML_FRMOPTS_MULTICOL       =
      97             :     HTML_FRMOPT_ID |
      98             :     HTML_FRMOPT_WIDTH |
      99             :     HTML_FRMOPT_ANYSIZE |
     100             :     HTML_FRMOPT_ABSSIZE |
     101             :     HTML_FRMOPT_DIR;
     102             : const sal_uLong HTML_FRMOPTS_MULTICOL_CNTNR =
     103             :     HTML_FRMOPTS_MULTICOL;
     104             : const sal_uLong HTML_FRMOPTS_MULTICOL_CSS1  =
     105             :     HTML_FRMOPT_S_ALIGN |
     106             :     HTML_FRMOPT_S_SIZE |
     107             :     HTML_FRMOPT_S_SPACE |
     108             :     HTML_FRMOPT_S_BORDER|
     109             :     HTML_FRMOPT_S_BACKGROUND;
     110             : 
     111             : const sal_uLong HTML_FRMOPTS_SPACER         =
     112             :     HTML_FRMOPT_ALIGN |
     113             :     HTML_FRMOPT_SIZE |
     114             :     HTML_FRMOPT_ANYSIZE |
     115             :     HTML_FRMOPT_BRCLEAR |
     116             :     HTML_FRMOPT_MARGINSIZE |
     117             :     HTML_FRMOPT_ABSSIZE;
     118             : 
     119             : const sal_uLong HTML_FRMOPTS_CNTNR          =
     120             :     HTML_FRMOPT_S_ALIGN |
     121             :     HTML_FRMOPT_S_SPACE |
     122             :     HTML_FRMOPT_S_WIDTH |
     123             :     HTML_FRMOPT_ANYSIZE |
     124             :     HTML_FRMOPT_ABSSIZE |
     125             :     HTML_FRMOPT_S_PIXSIZE;
     126             : 
     127             : static Writer& OutHTML_FrmFmtTableNode( Writer& rWrt, const SwFrmFmt& rFrmFmt );
     128             : static Writer& OutHTML_FrmFmtAsMulticol( Writer& rWrt, const SwFrmFmt& rFmt,
     129             :                                          bool bInCntnr );
     130             : static Writer& OutHTML_FrmFmtAsSpacer( Writer& rWrt, const SwFrmFmt& rFmt );
     131             : static Writer& OutHTML_FrmFmtAsDivOrSpan( Writer& rWrt,
     132             :                                           const SwFrmFmt& rFrmFmt, bool bSpan );
     133             : static Writer& OutHTML_FrmFmtAsImage( Writer& rWrt, const SwFrmFmt& rFmt,
     134             :                                       bool bInCntnr );
     135             : 
     136             : static Writer& OutHTML_FrmFmtGrfNode( Writer& rWrt, const SwFrmFmt& rFmt,
     137             :                                       bool bInCntnr );
     138             : 
     139             : static Writer& OutHTML_FrmFmtAsMarquee( Writer& rWrt, const SwFrmFmt& rFrmFmt,
     140             :                                         const SdrObject& rSdrObj    );
     141             : 
     142             : extern HTMLOutEvent aAnchorEventTable[];
     143             : 
     144             : static HTMLOutEvent aImageEventTable[] =
     145             : {
     146             :     { OOO_STRING_SVTOOLS_HTML_O_SDonload,           OOO_STRING_SVTOOLS_HTML_O_onload,       SVX_EVENT_IMAGE_LOAD        },
     147             :     { OOO_STRING_SVTOOLS_HTML_O_SDonabort,      OOO_STRING_SVTOOLS_HTML_O_onabort,  SVX_EVENT_IMAGE_ABORT       },
     148             :     { OOO_STRING_SVTOOLS_HTML_O_SDonerror,      OOO_STRING_SVTOOLS_HTML_O_onerror,  SVX_EVENT_IMAGE_ERROR       },
     149             :     { 0,                        0,                  0                       }
     150             : };
     151             : 
     152             : static HTMLOutEvent aIMapEventTable[] =
     153             : {
     154             :     { OOO_STRING_SVTOOLS_HTML_O_SDonmouseover,  OOO_STRING_SVTOOLS_HTML_O_onmouseover,  SFX_EVENT_MOUSEOVER_OBJECT  },
     155             :     { OOO_STRING_SVTOOLS_HTML_O_SDonmouseout,       OOO_STRING_SVTOOLS_HTML_O_onmouseout,       SFX_EVENT_MOUSEOUT_OBJECT   },
     156             :     { 0,                        0,                      0                           }
     157             : };
     158             : 
     159          22 : sal_uInt16 SwHTMLWriter::GuessFrmType( const SwFrmFmt& rFrmFmt,
     160             :                                    const SdrObject*& rpSdrObj )
     161             : {
     162             :     SwHTMLFrmType eType;
     163             : 
     164          22 :     if( RES_DRAWFRMFMT == rFrmFmt.Which() )
     165             :     {
     166             :         // Als Default irgendein Zeichen-Objekt
     167           8 :         eType = HTML_FRMTYPE_DRAW;
     168             : 
     169             :         const SdrObject *pObj =
     170           8 :             SwHTMLWriter::GetMarqueeTextObj( (const SwDrawFrmFmt &)rFrmFmt );
     171           8 :         if( pObj )
     172             :         {
     173             :             // Laufschrift
     174           0 :             rpSdrObj = pObj;
     175           0 :             eType = HTML_FRMTYPE_MARQUEE;
     176             :         }
     177             :         else
     178             :         {
     179           8 :             pObj = GetHTMLControl( (const SwDrawFrmFmt &)rFrmFmt );
     180             : 
     181           8 :             if( pObj )
     182             :             {
     183             :                 // Form-Control
     184           8 :                 rpSdrObj = pObj;
     185           8 :                 eType = HTML_FRMTYPE_CONTROL;
     186             :             }
     187             :         }
     188             :     }
     189             :     else
     190             :     {
     191             :         // Als Default ein Textrahmen
     192          14 :         eType = HTML_FRMTYPE_TEXT;
     193             : 
     194          14 :         const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
     195          14 :         sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
     196          14 :         const SwNode* pNd = pDoc->GetNodes()[ nStt ];
     197             : 
     198          14 :         if( pNd->IsGrfNode() )
     199             :         {
     200             :             // Grafik - Node
     201          10 :             eType = HTML_FRMTYPE_GRF;
     202             :         }
     203           4 :         else if( pNd->IsOLENode() )
     204             :         {
     205             :             // Applet, Plugin, Floating-Frame
     206           4 :             eType = (SwHTMLFrmType)GuessOLENodeFrmType( *pNd );
     207             :         }
     208             :         else
     209             :         {
     210           0 :             sal_uLong nEnd = pDoc->GetNodes()[nStt-1]->EndOfSectionIndex();
     211             : 
     212             :             const SfxPoolItem* pItem;
     213           0 :             const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
     214           0 :             if( SfxItemState::SET == rItemSet.GetItemState( RES_COL,
     215           0 :                                                        true, &pItem ) &&
     216           0 :                 ((const SwFmtCol *)pItem)->GetNumCols() > 1 )
     217             :             {
     218             :                 // spaltiger Rahmen
     219           0 :                 eType = HTML_FRMTYPE_MULTICOL;
     220             :             }
     221           0 :             else if( pNd->IsTableNode() )
     222             :             {
     223           0 :                 const SwTableNode *pTblNd = pNd->GetTableNode();
     224           0 :                 sal_uLong nTblEnd = pTblNd->EndOfSectionIndex();
     225             : 
     226           0 :                 if( nTblEnd+1 == nEnd )
     227             :                 {
     228             :                     // Tabelle
     229           0 :                     eType = HTML_FRMTYPE_TABLE;
     230             :                 }
     231           0 :                 else if( nTblEnd+2 == nEnd )
     232             :                 {
     233             :                     // Tabelle mit Unterschrft
     234           0 :                     eType = HTML_FRMTYPE_TABLE_CAP;
     235             :                 }
     236             :             }
     237           0 :             else if( pNd->IsTxtNode() )
     238             :             {
     239           0 :                 const SwTxtNode *pTxtNd = pNd->GetTxtNode();
     240             : 
     241           0 :                 bool bEmpty = false;
     242           0 :                 if( nStt==nEnd-1 && !pTxtNd->Len() )
     243             :                 {
     244             :                     // leerer Rahmen? Nur wenn kein Rahmen am
     245             :                     // Text- oder Start-Node verankert ist.
     246           0 :                     bEmpty = true;
     247           0 :                     if( pHTMLPosFlyFrms )
     248             :                     {
     249           0 :                         for( sal_uInt16 i=0; i<pHTMLPosFlyFrms->size(); i++ )
     250             :                         {
     251           0 :                             sal_uLong nIdx = (*pHTMLPosFlyFrms)[i]
     252           0 :                                                 ->GetNdIndex().GetIndex();
     253           0 :                             bEmpty = (nIdx != nStt) && (nIdx != nStt-1);
     254           0 :                             if( !bEmpty || nIdx > nStt )
     255             :                                 break;
     256             :                         }
     257             :                     }
     258             :                 }
     259           0 :                 if( bEmpty )
     260             :                 {
     261           0 :                     SvxBrushItem aBrush = rFrmFmt.makeBackgroundBrushItem();
     262             :                     /// background is not empty, if it has a background graphic
     263             :                     /// or its background color is not "no fill"/"auto fill".
     264           0 :                     if( GPOS_NONE != aBrush.GetGraphicPos() ||
     265           0 :                         aBrush.GetColor() != COL_TRANSPARENT )
     266           0 :                         bEmpty = false;
     267             :                 }
     268           0 :                 if( bEmpty )
     269             :                 {
     270             :                     // leerer Rahmen
     271           0 :                     eType = HTML_FRMTYPE_EMPTY;
     272             :                 }
     273           0 :                 else if( pDoc->GetNodes()[nStt+1]->IsTableNode() )
     274             :                 {
     275             :                     const SwTableNode *pTblNd =
     276           0 :                         pDoc->GetNodes()[nStt+1]->GetTableNode();
     277           0 :                     if( pTblNd->EndOfSectionIndex()+1 == nEnd )
     278             :                     {
     279             :                         // Tabelle mit Ueberschrift
     280           0 :                         eType = HTML_FRMTYPE_TABLE_CAP;
     281             :                     }
     282             :                 }
     283             :             }
     284             :         }
     285             :     }
     286             : 
     287          22 :     return static_cast< sal_uInt16 >(eType);
     288             : }
     289             : 
     290          24 : void SwHTMLWriter::CollectFlyFrms()
     291             : {
     292             :     OSL_ENSURE( HTML_CFG_MAX+1 == MAX_BROWSERS,
     293             :             "number of browser configurations has changed" );
     294             : 
     295          24 :     SwPosFlyFrms aFlyPos(pDoc->GetAllFlyFmts(bWriteAll ? 0 : pCurPam, true));
     296             : 
     297          30 :     for(SwPosFlyFrms::const_iterator aIter(aFlyPos.begin()); aIter != aFlyPos.end(); ++aIter)
     298             :     {
     299           6 :         const SwFrmFmt& rFrmFmt = (*aIter)->GetFmt();
     300           6 :         const SdrObject *pSdrObj = 0;
     301             :         const SwPosition *pAPos;
     302             :         const SwCntntNode *pACNd;
     303           6 :         SwHTMLFrmType eType = (SwHTMLFrmType)GuessFrmType( rFrmFmt, pSdrObj );
     304             : 
     305             :         sal_uInt8 nMode;
     306           6 :         const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor();
     307           6 :         sal_Int16 eHoriRel = rFrmFmt.GetHoriOrient().GetRelationOrient();
     308           6 :         switch( rAnchor.GetAnchorId() )
     309             :         {
     310             :         case FLY_AT_PAGE:
     311             :         case FLY_AT_FLY:
     312           0 :             nMode = aHTMLOutFrmPageFlyTable[eType][nExportMode];
     313           0 :             break;
     314             : 
     315             :         case FLY_AT_PARA:
     316             :             // Absatz-gebundene Rahmen werden nur dann vor den
     317             :             // Absatz geschrieben, wenn der Absatz einen Abstand
     318             :             // hat.
     319           4 :             if( text::RelOrientation::FRAME == eHoriRel &&
     320           4 :                 (pAPos = rAnchor.GetCntntAnchor()) != 0 &&
     321           2 :                 (pACNd = pAPos->nNode.GetNode().GetCntntNode()) != 0 )
     322             :             {
     323             :                 const SvxLRSpaceItem& rLRItem =
     324           2 :                     (const SvxLRSpaceItem&)pACNd->GetAttr(RES_LR_SPACE);
     325           2 :                 if( rLRItem.GetTxtLeft() || rLRItem.GetRight() )
     326             :                 {
     327           2 :                     nMode = aHTMLOutFrmParaFrameTable[eType][nExportMode];
     328           2 :                     break;
     329             :                 }
     330             :             }
     331           0 :             nMode = aHTMLOutFrmParaPrtAreaTable[eType][nExportMode];
     332           0 :             break;
     333             : 
     334             :         case FLY_AT_CHAR:
     335           4 :             if( text::RelOrientation::FRAME == eHoriRel || text::RelOrientation::PRINT_AREA == eHoriRel )
     336           4 :                 nMode = aHTMLOutFrmParaPrtAreaTable[eType][nExportMode];
     337             :             else
     338           0 :                 nMode = aHTMLOutFrmParaOtherTable[eType][nExportMode];
     339           4 :             break;
     340             : 
     341             :         default:
     342           0 :             nMode = aHTMLOutFrmParaPrtAreaTable[eType][nExportMode];
     343           0 :             break;
     344             :         }
     345             : 
     346           6 :         if( !pHTMLPosFlyFrms )
     347           6 :             pHTMLPosFlyFrms = new SwHTMLPosFlyFrms;
     348             : 
     349           6 :         SwHTMLPosFlyFrm *pNew = new SwHTMLPosFlyFrm(**aIter, pSdrObj, nMode);
     350           6 :         pHTMLPosFlyFrms->insert( pNew );
     351          24 :     }
     352          24 : }
     353             : 
     354         592 : bool SwHTMLWriter::OutFlyFrm( sal_uLong nNdIdx, sal_Int32 nCntntIdx, sal_uInt8 nPos,
     355             :                               HTMLOutContext *pContext )
     356             : {
     357         592 :     bool bFlysLeft = false; // Noch Flys an aktueller Node-Position da?
     358             : 
     359             :     // OutFlyFrm kan rekursiv aufgerufen werden. Deshalb muss man
     360             :     // manchmal wieder von vorne anfangen, nachdem ein Fly ausgegeben
     361             :     // wurde.
     362         592 :     bool bRestart = true;
     363        1214 :     while( pHTMLPosFlyFrms && bRestart )
     364             :     {
     365          30 :         bFlysLeft = bRestart = false;
     366             : 
     367             :         // suche nach dem Anfang der FlyFrames
     368             :         sal_uInt16 i;
     369             : 
     370          60 :         for( i = 0; i < pHTMLPosFlyFrms->size() &&
     371          30 :             (*pHTMLPosFlyFrms)[i]->GetNdIndex().GetIndex() < nNdIdx; i++ )
     372             :             ;
     373          86 :         for( ; !bRestart && i < pHTMLPosFlyFrms->size() &&
     374          28 :             (*pHTMLPosFlyFrms)[i]->GetNdIndex().GetIndex() == nNdIdx; i++ )
     375             :         {
     376          28 :             SwHTMLPosFlyFrm *pPosFly = (*pHTMLPosFlyFrms)[i];
     377          56 :             if( ( HTML_POS_ANY == nPos ||
     378          46 :                   pPosFly->GetOutPos() == nPos ) &&
     379          18 :                 pPosFly->GetCntntIndex() == nCntntIdx )
     380             :             {
     381             :                 // Erst entfernen ist wichtig, weil in tieferen
     382             :                 // Rekursionen evtl. weitere Eintraege oder das
     383             :                 // ganze Array geloscht werden koennte.
     384           6 :                 pHTMLPosFlyFrms->erase(i);
     385           6 :                 i--;
     386           6 :                 if( pHTMLPosFlyFrms->empty() )
     387             :                 {
     388           6 :                     delete pHTMLPosFlyFrms;
     389           6 :                     pHTMLPosFlyFrms = 0;
     390           6 :                     bRestart = true;    // nicht wirklich, nur raus
     391             :                                         // aus der Schleife
     392             :                 }
     393             : 
     394           6 :                 if( pContext )
     395             :                 {
     396           0 :                     HTMLOutFuncs::FlushToAscii(Strm(), *pContext );
     397           0 :                     pContext = 0; // one time only
     398             :                 }
     399             : 
     400           6 :                 OutFrmFmt( pPosFly->GetOutMode(), pPosFly->GetFmt(),
     401          12 :                            pPosFly->GetSdrObject() );
     402           6 :                 switch( pPosFly->GetOutFn() )
     403             :                 {
     404             :                 case HTML_OUT_DIV:
     405             :                 case HTML_OUT_SPAN:
     406             :                 case HTML_OUT_MULTICOL:
     407             :                 case HTML_OUT_TBLNODE:
     408           0 :                     bRestart = true; // Hier wird's evtl rekursiv
     409           0 :                     break;
     410             :                 }
     411           6 :                 delete pPosFly;
     412             :             }
     413             :             else
     414             :             {
     415          22 :                 bFlysLeft = true;
     416             :             }
     417             :         }
     418             :     }
     419             : 
     420         592 :     return bFlysLeft;
     421             : }
     422             : 
     423          22 : void SwHTMLWriter::OutFrmFmt( sal_uInt8 nMode, const SwFrmFmt& rFrmFmt,
     424             :                               const SdrObject *pSdrObject )
     425             : {
     426          22 :     sal_uInt8 nCntnrMode = SwHTMLPosFlyFrm::GetOutCntnr( nMode );
     427          22 :     sal_uInt8 nOutMode = SwHTMLPosFlyFrm::GetOutFn(nMode);
     428          22 :     const sal_Char *pCntnrStr = 0;
     429          22 :     if( HTML_CNTNR_NONE != nCntnrMode )
     430             :     {
     431             : 
     432           0 :         if( bLFPossible && HTML_CNTNR_DIV == nCntnrMode )
     433           0 :             OutNewLine();
     434             : 
     435           0 :         OStringBuffer sOut;
     436             :         pCntnrStr = (HTML_CNTNR_DIV == nCntnrMode)
     437             :                             ? OOO_STRING_SVTOOLS_HTML_division
     438           0 :                             : OOO_STRING_SVTOOLS_HTML_span;
     439           0 :         sOut.append('<').append(pCntnrStr).append(' ')
     440           0 :             .append(OOO_STRING_SVTOOLS_HTML_O_class).append("=\"")
     441           0 :             .append("sd-abs-pos").append('\"');
     442           0 :         Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
     443             : 
     444             :         // Fuer Nicht-Zeichenobekte eine Breite ausgeben
     445           0 :         sal_uLong nFrmFlags = HTML_FRMOPTS_CNTNR;
     446             : 
     447             :         // Fuer spaltige Rahmen koennen wir auch noch den Hintergrund ausgeben.
     448           0 :         if( HTML_OUT_MULTICOL == nOutMode )
     449           0 :             nFrmFlags |= HTML_FRMOPT_S_BACKGROUND|HTML_FRMOPT_S_BORDER;
     450             : 
     451           0 :         if( IsHTMLMode( HTMLMODE_BORDER_NONE ) )
     452           0 :            nFrmFlags |= HTML_FRMOPT_S_NOBORDER;
     453           0 :         OutCSS1_FrmFmtOptions( rFrmFmt, nFrmFlags, pSdrObject );
     454           0 :         Strm().WriteChar( '>' );
     455             : 
     456           0 :         if( HTML_CNTNR_DIV == nCntnrMode )
     457             :         {
     458           0 :             IncIndentLevel();
     459           0 :             bLFPossible = true;
     460           0 :         }
     461             :     }
     462             : 
     463          22 :     switch( nOutMode )
     464             :     {
     465             :     case HTML_OUT_TBLNODE:      // OK
     466             :         OSL_ENSURE( !pCntnrStr, "Table: Container ist hier nicht vorgesehen" );
     467           0 :         OutHTML_FrmFmtTableNode( *this, rFrmFmt );
     468           0 :         break;
     469             :     case HTML_OUT_GRFNODE:      // OK
     470          10 :         OutHTML_FrmFmtGrfNode( *this, rFrmFmt, pCntnrStr != 0 );
     471          10 :         break;
     472             :     case HTML_OUT_OLENODE:      // OK
     473           0 :         OutHTML_FrmFmtOLENode( *this, rFrmFmt, pCntnrStr != 0 );
     474           0 :         break;
     475             :     case HTML_OUT_OLEGRF:       // OK
     476           4 :         OutHTML_FrmFmtOLENodeGrf( *this, rFrmFmt, pCntnrStr != 0 );
     477           4 :         break;
     478             :     case HTML_OUT_DIV:
     479             :     case HTML_OUT_SPAN:
     480             :         OSL_ENSURE( !pCntnrStr, "Div: Container ist hier nicht vorgesehen" );
     481           0 :         OutHTML_FrmFmtAsDivOrSpan( *this, rFrmFmt, HTML_OUT_SPAN==nOutMode );
     482           0 :         break;
     483             :     case HTML_OUT_MULTICOL:     // OK
     484           0 :         OutHTML_FrmFmtAsMulticol( *this, rFrmFmt, pCntnrStr != 0 );
     485           0 :         break;
     486             :     case HTML_OUT_SPACER:       // OK
     487             :         OSL_ENSURE( !pCntnrStr, "Spacer: Container ist hier nicht vorgesehen" );
     488           0 :         OutHTML_FrmFmtAsSpacer( *this, rFrmFmt );
     489           0 :         break;
     490             :     case HTML_OUT_CONTROL:      // OK
     491             :         OutHTML_DrawFrmFmtAsControl( *this,
     492             :                                     (const SwDrawFrmFmt &)rFrmFmt, *pSdrObject,
     493           8 :                                     pCntnrStr != 0 );
     494           8 :         break;
     495             :     case HTML_OUT_AMARQUEE:
     496           0 :         OutHTML_FrmFmtAsMarquee( *this, rFrmFmt, *pSdrObject );
     497           0 :         break;
     498             :     case HTML_OUT_MARQUEE:
     499             :         OSL_ENSURE( !pCntnrStr, "Marquee: Container ist hier nicht vorgesehen" );
     500             :         OutHTML_DrawFrmFmtAsMarquee( *this,
     501           0 :                     (const SwDrawFrmFmt &)rFrmFmt, *pSdrObject );
     502           0 :         break;
     503             :     case HTML_OUT_GRFFRM:
     504           0 :         OutHTML_FrmFmtAsImage( *this, rFrmFmt, pCntnrStr != 0 );
     505           0 :         break;
     506             :     }
     507             : 
     508          22 :     if( HTML_CNTNR_DIV == nCntnrMode )
     509             :     {
     510           0 :         DecIndentLevel();
     511           0 :         if( bLFPossible )
     512           0 :             OutNewLine();
     513           0 :         HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_division, false );
     514           0 :         bLFPossible = true;
     515             :     }
     516          22 :     else if( HTML_CNTNR_SPAN == nCntnrMode )
     517           0 :         HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_span, false );
     518          22 : }
     519             : 
     520           8 : OString SwHTMLWriter::OutFrmFmtOptions( const SwFrmFmt &rFrmFmt,
     521             :                                      const OUString& rAlternateTxt,
     522             :                                      sal_uInt32 nFrmOpts,
     523             :                                      const OString &rEndTags )
     524             : {
     525           8 :     OString sRetEndTags(rEndTags);
     526          16 :     OStringBuffer sOut;
     527             :     const SfxPoolItem* pItem;
     528           8 :     const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
     529             : 
     530             :     // Name
     531          24 :     if( (nFrmOpts & (HTML_FRMOPT_ID|HTML_FRMOPT_NAME)) &&
     532           8 :         !rFrmFmt.GetName().isEmpty() )
     533             :     {
     534             :         const sal_Char *pStr =
     535           0 :             (nFrmOpts & HTML_FRMOPT_ID) ? OOO_STRING_SVTOOLS_HTML_O_id : OOO_STRING_SVTOOLS_HTML_O_name;
     536           0 :         sOut.append(' ').append(pStr).
     537           0 :             append("=\"");
     538           0 :         Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
     539           0 :         HTMLOutFuncs::Out_String( Strm(), rFrmFmt.GetName(), eDestEnc, &aNonConvertableCharacters );
     540           0 :         sOut.append('\"');
     541             :     }
     542             : 
     543             :     // Name
     544           8 :     if( nFrmOpts & HTML_FRMOPT_DIR )
     545             :     {
     546           0 :         sal_uInt16 nDir = GetHTMLDirection( rItemSet );
     547           0 :         Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
     548           0 :         OutDirection( nDir );
     549             :     }
     550             : 
     551             :     // ALT
     552           8 :     if( (nFrmOpts & HTML_FRMOPT_ALT) && !rAlternateTxt.isEmpty() )
     553             :     {
     554           0 :         sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_alt).
     555           0 :             append("=\"");
     556           0 :         Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
     557           0 :         HTMLOutFuncs::Out_String( Strm(), rAlternateTxt, eDestEnc, &aNonConvertableCharacters );
     558           0 :         sOut.append('\"');
     559             :     }
     560             : 
     561             :     // ALIGN
     562           8 :     const sal_Char *pStr = 0;
     563           8 :     RndStdIds eAnchorId = rFrmFmt.GetAnchor().GetAnchorId();
     564           8 :     if( (nFrmOpts & HTML_FRMOPT_ALIGN) &&
     565           0 :         ((FLY_AT_PARA == eAnchorId) || (FLY_AT_CHAR == eAnchorId)) )
     566             :     {
     567             :         // MIB 12.3.98: Ist es nicht schlauer, absatzgebundene
     568             :         // Rahmen notfalls links auszurichten als sie
     569             :         // zeichengebunden einzufuegen???
     570           0 :         const SwFmtHoriOrient& rHoriOri = rFrmFmt.GetHoriOrient();
     571           0 :         if( !(nFrmOpts & HTML_FRMOPT_S_ALIGN) ||
     572           0 :             text::RelOrientation::FRAME == rHoriOri.GetRelationOrient() ||
     573           0 :             text::RelOrientation::PRINT_AREA == rHoriOri.GetRelationOrient() )
     574             :         {
     575           0 :             pStr = text::HoriOrientation::RIGHT == rHoriOri.GetHoriOrient()
     576             :                         ? OOO_STRING_SVTOOLS_HTML_AL_right
     577           0 :                         : OOO_STRING_SVTOOLS_HTML_AL_left;
     578             :         }
     579             :     }
     580          16 :     if( (nFrmOpts & HTML_FRMOPT_ALIGN) && !pStr &&
     581           0 :         ( (nFrmOpts & HTML_FRMOPT_S_ALIGN) == 0 ||
     582           8 :           (FLY_AS_CHAR == eAnchorId) ) &&
     583           0 :         SfxItemState::SET == rItemSet.GetItemState( RES_VERT_ORIENT, true, &pItem ))
     584             :     {
     585           0 :         switch( ((SwFmtVertOrient*)pItem)->GetVertOrient() )
     586             :         {
     587           0 :         case text::VertOrientation::LINE_TOP:     pStr = OOO_STRING_SVTOOLS_HTML_VA_top;        break;
     588             :         case text::VertOrientation::CHAR_TOP:
     589           0 :         case text::VertOrientation::BOTTOM:       pStr = OOO_STRING_SVTOOLS_HTML_VA_texttop;    break;  // geht nicht
     590             :         case text::VertOrientation::LINE_CENTER:
     591           0 :         case text::VertOrientation::CHAR_CENTER:  pStr = OOO_STRING_SVTOOLS_HTML_VA_absmiddle;  break;  // geht nicht
     592           0 :         case text::VertOrientation::CENTER:       pStr = OOO_STRING_SVTOOLS_HTML_VA_middle;     break;
     593             :         case text::VertOrientation::LINE_BOTTOM:
     594           0 :         case text::VertOrientation::CHAR_BOTTOM:  pStr = OOO_STRING_SVTOOLS_HTML_VA_absbottom;  break;  // geht nicht
     595           0 :         case text::VertOrientation::TOP:          pStr = OOO_STRING_SVTOOLS_HTML_VA_bottom;     break;
     596           0 :         case text::VertOrientation::NONE:     break;
     597             :         }
     598             :     }
     599           8 :     if( pStr )
     600             :     {
     601           0 :         sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_align).append("=\"").
     602           0 :             append(pStr).append("\"");
     603             :     }
     604             : 
     605             :     // HSPACE und VSPACE
     606           8 :     Size aTwipSpc( 0, 0 );
     607           8 :     if( (nFrmOpts & (HTML_FRMOPT_SPACE|HTML_FRMOPT_MARGINSIZE)) &&
     608           0 :         SfxItemState::SET == rItemSet.GetItemState( RES_LR_SPACE, true, &pItem ))
     609             :     {
     610           0 :         aTwipSpc.Width() =
     611           0 :             ( ((SvxLRSpaceItem*)pItem)->GetLeft() +
     612           0 :                 ((SvxLRSpaceItem*)pItem)->GetRight() ) / 2;
     613           0 :         nDfltLeftMargin = nDfltRightMargin = aTwipSpc.Width();
     614             :     }
     615           8 :     if( (nFrmOpts & (HTML_FRMOPT_SPACE|HTML_FRMOPT_MARGINSIZE)) &&
     616           0 :         SfxItemState::SET == rItemSet.GetItemState( RES_UL_SPACE, true, &pItem ))
     617             :     {
     618           0 :         aTwipSpc.Height()  =
     619           0 :             ( ((SvxULSpaceItem*)pItem)->GetUpper() +
     620           0 :                 ((SvxULSpaceItem*)pItem)->GetLower() ) / 2;
     621           0 :         nDfltTopMargin = nDfltBottomMargin = (sal_uInt16)aTwipSpc.Height();
     622             :     }
     623             : 
     624          16 :     if( (nFrmOpts & HTML_FRMOPT_SPACE) &&
     625           8 :         (aTwipSpc.Width() || aTwipSpc.Height()) &&
     626           0 :         Application::GetDefaultDevice() )
     627             :     {
     628             :         Size aPixelSpc =
     629             :             Application::GetDefaultDevice()->LogicToPixel( aTwipSpc,
     630           0 :                                                 MapMode(MAP_TWIP) );
     631           0 :         if( !aPixelSpc.Width() && aTwipSpc.Width() )
     632           0 :             aPixelSpc.Width() = 1;
     633           0 :         if( !aPixelSpc.Height() && aTwipSpc.Height() )
     634           0 :             aPixelSpc.Height() = 1;
     635             : 
     636           0 :         if( aPixelSpc.Width() )
     637             :         {
     638           0 :             sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_hspace).
     639           0 :                 append("=\"").append(static_cast<sal_Int32>(aPixelSpc.Width())).append("\"");
     640             :         }
     641             : 
     642           0 :         if( aPixelSpc.Height() )
     643             :         {
     644           0 :             sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_vspace).
     645           0 :                 append("=\"").append(static_cast<sal_Int32>(aPixelSpc.Height())).append("\"");
     646             :         }
     647             :     }
     648             : 
     649             :     // Der Abstand muss bei der Groesse beruecksichtigt, wenn das entsprechende
     650             :     // Flag gesetzt ist.
     651           8 :     if( (nFrmOpts & HTML_FRMOPT_MARGINSIZE) )
     652             :     {
     653           0 :         aTwipSpc.Width() *= -2;
     654           0 :         aTwipSpc.Height() *= -2;
     655             :     }
     656             :     else
     657             :     {
     658           8 :         aTwipSpc.Width() = 0;
     659           8 :         aTwipSpc.Height() = 0;
     660             :     }
     661             : 
     662          16 :     if( !(nFrmOpts & HTML_FRMOPT_ABSSIZE) &&
     663           8 :         SfxItemState::SET == rItemSet.GetItemState( RES_BOX, true, &pItem ))
     664             :     {
     665           8 :         const SvxBoxItem* pBoxItem = (const SvxBoxItem*)pItem;
     666             : 
     667           8 :         aTwipSpc.Width() += pBoxItem->CalcLineSpace( BOX_LINE_LEFT );
     668           8 :         aTwipSpc.Width() += pBoxItem->CalcLineSpace( BOX_LINE_RIGHT );
     669           8 :         aTwipSpc.Height() += pBoxItem->CalcLineSpace( BOX_LINE_TOP );
     670           8 :         aTwipSpc.Height() += pBoxItem->CalcLineSpace( BOX_LINE_BOTTOM );
     671             :     }
     672             : 
     673             :     // WIDTH und/oder HEIGHT
     674             :     // ATT_VAR_SIZE/ATT_MIN_SIZE nur ausgeben, wenn ANYSIZE gesezut ist
     675          16 :     if( (nFrmOpts & HTML_FRMOPT_SIZE) &&
     676           8 :         SfxItemState::SET == rItemSet.GetItemState( RES_FRM_SIZE, true, &pItem ) &&
     677           0 :         ( (nFrmOpts & HTML_FRMOPT_ANYSIZE) ||
     678           0 :           ATT_FIX_SIZE == ((const SwFmtFrmSize *)pItem)->GetHeightSizeType()) )
     679             :     {
     680           0 :         const SwFmtFrmSize *pFSItem = (const SwFmtFrmSize *)pItem;
     681           0 :         sal_uInt8 nPrcWidth = pFSItem->GetWidthPercent();
     682           0 :         sal_uInt8 nPrcHeight = pFSItem->GetHeightPercent();
     683             : 
     684             :         // Groesse des Objekts Twips ohne Raender
     685             :         Size aTwipSz( (nPrcWidth ? 0
     686           0 :                                  : pFSItem->GetWidth()-aTwipSpc.Width()),
     687             :                       (nPrcHeight ? 0
     688           0 :                                   : pFSItem->GetHeight()-aTwipSpc.Height()) );
     689             : 
     690             :         OSL_ENSURE( aTwipSz.Width() >= 0 && aTwipSz.Height() >= 0,
     691             :                 "Rahmengroesse minus Abstand < 0!!!???" );
     692           0 :         if( aTwipSz.Width() < 0 )
     693           0 :             aTwipSz.Width() = 0;
     694           0 :         if( aTwipSz.Height() < 0 )
     695           0 :             aTwipSz.Height() = 0;
     696             : 
     697           0 :         Size aPixelSz( 0, 0 );
     698           0 :         if( (aTwipSz.Width() || aTwipSz.Height()) &&
     699           0 :             Application::GetDefaultDevice() )
     700             :         {
     701             :             aPixelSz =
     702             :                 Application::GetDefaultDevice()->LogicToPixel( aTwipSz,
     703           0 :                                                     MapMode(MAP_TWIP) );
     704           0 :             if( !aPixelSz.Width() && aTwipSz.Width() )
     705           0 :                 aPixelSz.Width() = 1;
     706           0 :             if( !aPixelSz.Height() && aTwipSz.Height() )
     707           0 :                 aPixelSz.Height() = 1;
     708             :         }
     709             : 
     710           0 :         if( (nFrmOpts & HTML_FRMOPT_WIDTH) &&
     711           0 :             ((nPrcWidth && nPrcWidth!=255) || aPixelSz.Width()) )
     712             :         {
     713           0 :             sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_width).
     714           0 :                 append("=\"");
     715           0 :             if( nPrcWidth )
     716           0 :                 sOut.append(static_cast<sal_Int32>(nPrcWidth)).append('%');
     717             :             else
     718           0 :                 sOut.append(static_cast<sal_Int32>(aPixelSz.Width()));
     719           0 :             sOut.append("\"");
     720             :         }
     721             : 
     722           0 :         if( (nFrmOpts & HTML_FRMOPT_HEIGHT) &&
     723           0 :             ((nPrcHeight && nPrcHeight!=255) || aPixelSz.Height()) )
     724             :         {
     725           0 :             sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_height).
     726           0 :                 append("=\"");
     727           0 :             if( nPrcHeight )
     728           0 :                 sOut.append(static_cast<sal_Int32>(nPrcHeight)).append('%');
     729             :             else
     730           0 :                 sOut.append(static_cast<sal_Int32>(aPixelSz.Height()));
     731           0 :             sOut.append("\"");
     732             :         }
     733             :     }
     734             : 
     735           8 :     if (!sOut.isEmpty())
     736           0 :         Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
     737             : 
     738             :     // Umlauf fuer absatzgeb. Grafiken als <BR CLEAR=...> in den String
     739             :     // schreiben
     740          24 :     if( (nFrmOpts & HTML_FRMOPT_BRCLEAR) &&
     741          16 :         ((FLY_AT_PARA == rFrmFmt.GetAnchor().GetAnchorId()) ||
     742          16 :          (FLY_AT_CHAR == rFrmFmt.GetAnchor().GetAnchorId())) &&
     743           0 :         SfxItemState::SET == rItemSet.GetItemState( RES_SURROUND, true, &pItem ))
     744             :     {
     745           0 :         const SwFmtSurround* pSurround = (const SwFmtSurround*)pItem;
     746           0 :         sal_Int16 eHoriOri =    rFrmFmt.GetHoriOrient().GetHoriOrient();
     747           0 :         pStr = 0;
     748           0 :         SwSurround eSurround = pSurround->GetSurround();
     749           0 :         bool bAnchorOnly = pSurround->IsAnchorOnly();
     750           0 :         switch( eHoriOri )
     751             :         {
     752             :         case text::HoriOrientation::RIGHT:
     753             :             {
     754           0 :                 switch( eSurround )
     755             :                 {
     756             :                 case SURROUND_NONE:
     757             :                 case SURROUND_RIGHT:
     758           0 :                     pStr = OOO_STRING_SVTOOLS_HTML_AL_right;
     759           0 :                     break;
     760             :                 case SURROUND_LEFT:
     761             :                 case SURROUND_PARALLEL:
     762           0 :                     if( bAnchorOnly )
     763           0 :                         bClearRight = true;
     764           0 :                     break;
     765             :                 default:
     766             :                     ;
     767             :                 }
     768             :             }
     769           0 :             break;
     770             : 
     771             :         default:
     772             :             // If a frame is centered, it gets left aligned. This
     773             :             // should be taken into account here, too.
     774             :             {
     775           0 :                 switch( eSurround )
     776             :                 {
     777             :                 case SURROUND_NONE:
     778             :                 case SURROUND_LEFT:
     779           0 :                     pStr = OOO_STRING_SVTOOLS_HTML_AL_left;
     780           0 :                     break;
     781             :                 case SURROUND_RIGHT:
     782             :                 case SURROUND_PARALLEL:
     783           0 :                     if( bAnchorOnly )
     784           0 :                         bClearLeft = true;
     785           0 :                     break;
     786             :                 default:
     787             :                     ;
     788             :                 }
     789             :             }
     790           0 :             break;
     791             : 
     792             :         }
     793             : 
     794           0 :         if( pStr )
     795             :         {
     796           0 :             sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_linebreak).
     797           0 :                 append(' ').append(OOO_STRING_SVTOOLS_HTML_O_clear).
     798           0 :                 append("=\"").append(pStr).append("\">").append(rEndTags);
     799           0 :             sRetEndTags = sOut.makeStringAndClear();
     800             :         }
     801             :     }
     802             :     assert(sRetEndTags.endsWith(rEndTags)); // fdo#58286
     803          16 :     return sRetEndTags;
     804             : }
     805             : 
     806           6 : void SwHTMLWriter::writeFrameFormatOptions(HtmlWriter& aHtml, const SwFrmFmt& rFrmFmt, const OUString& rAlternateText, sal_uInt32 nFrameOptions)
     807             : {
     808             :     const SfxPoolItem* pItem;
     809           6 :     const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
     810             : 
     811             :     // Name
     812          24 :     if( (nFrameOptions & (HTML_FRMOPT_ID|HTML_FRMOPT_NAME)) &&
     813          24 :         !rFrmFmt.GetName().isEmpty() )
     814             :     {
     815           6 :         const sal_Char* pAttributeName = (nFrameOptions & HTML_FRMOPT_ID) ? OOO_STRING_SVTOOLS_HTML_O_id : OOO_STRING_SVTOOLS_HTML_O_name;
     816           6 :         aHtml.attribute(pAttributeName, rFrmFmt.GetName());
     817             :     }
     818             : 
     819             :     // Name
     820           6 :     if (nFrameOptions & HTML_FRMOPT_DIR)
     821             :     {
     822           0 :         sal_uInt16 nCurrentDirection = GetHTMLDirection(rItemSet);
     823           0 :         OString sDirection = convertDirection(nCurrentDirection);
     824           0 :         aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_dir, sDirection);
     825             :     }
     826             : 
     827             :     // alt
     828           6 :     if( (nFrameOptions & HTML_FRMOPT_ALT) && !rAlternateText.isEmpty() )
     829             :     {
     830           2 :         aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_alt, rAlternateText);
     831             :     }
     832             : 
     833             :     // align
     834           6 :     const sal_Char* pAlignString = 0;
     835           6 :     RndStdIds eAnchorId = rFrmFmt.GetAnchor().GetAnchorId();
     836           6 :     if( (nFrameOptions & HTML_FRMOPT_ALIGN) &&
     837           4 :         ((FLY_AT_PARA == eAnchorId) || (FLY_AT_CHAR == eAnchorId)) )
     838             :     {
     839           4 :         const SwFmtHoriOrient& rHoriOri = rFrmFmt.GetHoriOrient();
     840          12 :         if( !(nFrameOptions & HTML_FRMOPT_S_ALIGN) ||
     841           4 :             text::RelOrientation::FRAME == rHoriOri.GetRelationOrient() ||
     842           0 :             text::RelOrientation::PRINT_AREA == rHoriOri.GetRelationOrient() )
     843             :         {
     844           4 :             pAlignString = text::HoriOrientation::RIGHT == rHoriOri.GetHoriOrient()
     845             :                         ? OOO_STRING_SVTOOLS_HTML_AL_right
     846           4 :                         : OOO_STRING_SVTOOLS_HTML_AL_left;
     847             :         }
     848             :     }
     849          20 :     if( (nFrameOptions & HTML_FRMOPT_ALIGN) && !pAlignString &&
     850           4 :         ( (nFrameOptions & HTML_FRMOPT_S_ALIGN) == 0 ||
     851           8 :           (FLY_AS_CHAR == eAnchorId) ) &&
     852           2 :         SfxItemState::SET == rItemSet.GetItemState( RES_VERT_ORIENT, true, &pItem ))
     853             :     {
     854           2 :         switch( ((SwFmtVertOrient*)pItem)->GetVertOrient() )
     855             :         {
     856           0 :         case text::VertOrientation::LINE_TOP:     pAlignString = OOO_STRING_SVTOOLS_HTML_VA_top;        break;
     857             :         case text::VertOrientation::CHAR_TOP:
     858           0 :         case text::VertOrientation::BOTTOM:       pAlignString = OOO_STRING_SVTOOLS_HTML_VA_texttop;    break;
     859             :         case text::VertOrientation::LINE_CENTER:
     860           0 :         case text::VertOrientation::CHAR_CENTER:  pAlignString = OOO_STRING_SVTOOLS_HTML_VA_absmiddle;  break;
     861           2 :         case text::VertOrientation::CENTER:       pAlignString = OOO_STRING_SVTOOLS_HTML_VA_middle;     break;
     862             :         case text::VertOrientation::LINE_BOTTOM:
     863           0 :         case text::VertOrientation::CHAR_BOTTOM:  pAlignString = OOO_STRING_SVTOOLS_HTML_VA_absbottom;  break;
     864           0 :         case text::VertOrientation::TOP:          pAlignString = OOO_STRING_SVTOOLS_HTML_VA_bottom;     break;
     865           0 :         case text::VertOrientation::NONE:     break;
     866             :         }
     867             :     }
     868           6 :     if (pAlignString)
     869             :     {
     870           6 :         aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_align, pAlignString);
     871             :     }
     872             : 
     873             :     // hspace und vspace
     874           6 :     Size aTwipSpc( 0, 0 );
     875          12 :     if( (nFrameOptions & (HTML_FRMOPT_SPACE | HTML_FRMOPT_MARGINSIZE)) &&
     876           6 :         SfxItemState::SET == rItemSet.GetItemState( RES_LR_SPACE, true, &pItem ))
     877             :     {
     878           4 :         aTwipSpc.Width() =
     879           8 :             ( ((SvxLRSpaceItem*)pItem)->GetLeft() +
     880           8 :                 ((SvxLRSpaceItem*)pItem)->GetRight() ) / 2;
     881           4 :         nDfltLeftMargin = nDfltRightMargin = aTwipSpc.Width();
     882             :     }
     883          12 :     if( (nFrameOptions & (HTML_FRMOPT_SPACE|HTML_FRMOPT_MARGINSIZE)) &&
     884           6 :         SfxItemState::SET == rItemSet.GetItemState( RES_UL_SPACE, true, &pItem ))
     885             :     {
     886           4 :         aTwipSpc.Height()  =
     887           8 :             ( ((SvxULSpaceItem*)pItem)->GetUpper() +
     888           8 :                 ((SvxULSpaceItem*)pItem)->GetLower() ) / 2;
     889           4 :         nDfltTopMargin = nDfltBottomMargin = (sal_uInt16)aTwipSpc.Height();
     890             :     }
     891             : 
     892          18 :     if( (nFrameOptions & HTML_FRMOPT_SPACE) &&
     893          12 :         (aTwipSpc.Width() || aTwipSpc.Height()) &&
     894           2 :         Application::GetDefaultDevice() )
     895             :     {
     896             :         Size aPixelSpc =
     897             :             Application::GetDefaultDevice()->LogicToPixel( aTwipSpc,
     898           2 :                                                 MapMode(MAP_TWIP) );
     899           2 :         if( !aPixelSpc.Width() && aTwipSpc.Width() )
     900           0 :             aPixelSpc.Width() = 1;
     901           2 :         if( !aPixelSpc.Height() && aTwipSpc.Height() )
     902           0 :             aPixelSpc.Height() = 1;
     903             : 
     904           2 :         if (aPixelSpc.Width())
     905             :         {
     906           2 :             aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_hspace, static_cast<sal_Int32>(aPixelSpc.Width()));
     907             :         }
     908             : 
     909           2 :         if (aPixelSpc.Height())
     910             :         {
     911           2 :             aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_vspace, static_cast<sal_Int32>(aPixelSpc.Height()));
     912             :         }
     913             :     }
     914             : 
     915             :     // Der Abstand muss bei der Groesse beruecksichtigt, wenn das entsprechende
     916             :     // Flag gesetzt ist.
     917           6 :     if( (nFrameOptions & HTML_FRMOPT_MARGINSIZE) )
     918             :     {
     919           0 :         aTwipSpc.Width() *= -2;
     920           0 :         aTwipSpc.Height() *= -2;
     921             :     }
     922             :     else
     923             :     {
     924           6 :         aTwipSpc.Width() = 0;
     925           6 :         aTwipSpc.Height() = 0;
     926             :     }
     927             : 
     928          12 :     if( !(nFrameOptions & HTML_FRMOPT_ABSSIZE) &&
     929           6 :         SfxItemState::SET == rItemSet.GetItemState( RES_BOX, true, &pItem ))
     930             :     {
     931           4 :         const SvxBoxItem* pBoxItem = (const SvxBoxItem*)pItem;
     932             : 
     933           4 :         aTwipSpc.Width() += pBoxItem->CalcLineSpace( BOX_LINE_LEFT );
     934           4 :         aTwipSpc.Width() += pBoxItem->CalcLineSpace( BOX_LINE_RIGHT );
     935           4 :         aTwipSpc.Height() += pBoxItem->CalcLineSpace( BOX_LINE_TOP );
     936           4 :         aTwipSpc.Height() += pBoxItem->CalcLineSpace( BOX_LINE_BOTTOM );
     937             :     }
     938             : 
     939             :     // "width" and/or "height"
     940             :     // ATT_VAR_SIZE/ATT_MIN_SIZE nur ausgeben, wenn ANYSIZE gesezut ist
     941          18 :     if( (nFrameOptions & HTML_FRMOPT_SIZE) &&
     942          18 :         SfxItemState::SET == rItemSet.GetItemState( RES_FRM_SIZE, true, &pItem ) &&
     943           6 :         ( (nFrameOptions & HTML_FRMOPT_ANYSIZE) ||
     944           0 :           ATT_FIX_SIZE == ((const SwFmtFrmSize *)pItem)->GetHeightSizeType()) )
     945             :     {
     946           6 :         const SwFmtFrmSize *pFSItem = (const SwFmtFrmSize *)pItem;
     947           6 :         sal_uInt8 nPrcWidth = pFSItem->GetWidthPercent();
     948           6 :         sal_uInt8 nPrcHeight = pFSItem->GetHeightPercent();
     949             : 
     950             :         // Groesse des Objekts Twips ohne Raender
     951             :         Size aTwipSz( (nPrcWidth ? 0
     952           6 :                                  : pFSItem->GetWidth()-aTwipSpc.Width()),
     953             :                       (nPrcHeight ? 0
     954          12 :                                   : pFSItem->GetHeight()-aTwipSpc.Height()) );
     955             : 
     956             :         OSL_ENSURE( aTwipSz.Width() >= 0 && aTwipSz.Height() >= 0,
     957             :                 "Rahmengroesse minus Abstand < 0!!!???" );
     958           6 :         if( aTwipSz.Width() < 0 )
     959           0 :             aTwipSz.Width() = 0;
     960           6 :         if( aTwipSz.Height() < 0 )
     961           0 :             aTwipSz.Height() = 0;
     962             : 
     963           6 :         Size aPixelSz( 0, 0 );
     964          12 :         if( (aTwipSz.Width() || aTwipSz.Height()) &&
     965           6 :             Application::GetDefaultDevice() )
     966             :         {
     967             :             aPixelSz =
     968             :                 Application::GetDefaultDevice()->LogicToPixel( aTwipSz,
     969           6 :                                                     MapMode(MAP_TWIP) );
     970           6 :             if( !aPixelSz.Width() && aTwipSz.Width() )
     971           0 :                 aPixelSz.Width() = 1;
     972           6 :             if( !aPixelSz.Height() && aTwipSz.Height() )
     973           0 :                 aPixelSz.Height() = 1;
     974             :         }
     975             : 
     976          12 :         if( (nFrameOptions & HTML_FRMOPT_WIDTH) &&
     977           0 :             ((nPrcWidth && nPrcWidth!=255) || aPixelSz.Width()) )
     978             :         {
     979           6 :             OString sWidth;
     980           6 :             if (nPrcWidth)
     981           0 :                 sWidth = OString::number(static_cast<sal_Int32>(nPrcWidth)) + "%";
     982             :             else
     983           6 :                 sWidth = OString::number(static_cast<sal_Int32>(aPixelSz.Width()));
     984           6 :             aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_width, sWidth);
     985             :         }
     986             : 
     987          12 :         if( (nFrameOptions & HTML_FRMOPT_HEIGHT) &&
     988           0 :             ((nPrcHeight && nPrcHeight!=255) || aPixelSz.Height()) )
     989             :         {
     990           6 :             OString sHeight;
     991           6 :             if (nPrcHeight)
     992           0 :                 sHeight = OString::number(static_cast<sal_Int32>(nPrcHeight)) + "%";
     993             :             else
     994           6 :                 sHeight = OString::number(static_cast<sal_Int32>(aPixelSz.Height()));
     995           6 :             aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_height, sHeight);
     996             :         }
     997             :     }
     998             : 
     999             :     // Umlauf fuer absatzgeb. Grafiken als <BR CLEAR=...> in den String
    1000             :     // schreiben
    1001             : 
    1002           6 :     const sal_Char* pSurroundString = 0;
    1003          18 :     if( (nFrameOptions & HTML_FRMOPT_BRCLEAR) &&
    1004          10 :         ((FLY_AT_PARA == rFrmFmt.GetAnchor().GetAnchorId()) ||
    1005          14 :          (FLY_AT_CHAR == rFrmFmt.GetAnchor().GetAnchorId())) &&
    1006           4 :         SfxItemState::SET == rItemSet.GetItemState( RES_SURROUND, true, &pItem ))
    1007             :     {
    1008           4 :         const SwFmtSurround* pSurround = (const SwFmtSurround*)pItem;
    1009           4 :         sal_Int16 eHoriOri = rFrmFmt.GetHoriOrient().GetHoriOrient();
    1010           4 :         SwSurround eSurround = pSurround->GetSurround();
    1011           4 :         bool bAnchorOnly = pSurround->IsAnchorOnly();
    1012           4 :         switch( eHoriOri )
    1013             :         {
    1014             :             case text::HoriOrientation::RIGHT:
    1015             :             {
    1016           0 :                 switch( eSurround )
    1017             :                 {
    1018             :                 case SURROUND_NONE:
    1019             :                 case SURROUND_RIGHT:
    1020           0 :                     pSurroundString = OOO_STRING_SVTOOLS_HTML_AL_right;
    1021           0 :                     break;
    1022             :                 case SURROUND_LEFT:
    1023             :                 case SURROUND_PARALLEL:
    1024           0 :                     if( bAnchorOnly )
    1025           0 :                         bClearRight = true;
    1026           0 :                     break;
    1027             :                 default:
    1028             :                     ;
    1029             :                 }
    1030             :             }
    1031           0 :             break;
    1032             : 
    1033             :             default:
    1034             :             // If a frame is centered, it gets left aligned. This
    1035             :             // should be taken into account here, too.
    1036             :             {
    1037           4 :                 switch( eSurround )
    1038             :                 {
    1039             :                 case SURROUND_NONE:
    1040             :                 case SURROUND_LEFT:
    1041           0 :                     pSurroundString = OOO_STRING_SVTOOLS_HTML_AL_left;
    1042           0 :                     break;
    1043             :                 case SURROUND_RIGHT:
    1044             :                 case SURROUND_PARALLEL:
    1045           0 :                     if( bAnchorOnly )
    1046           0 :                         bClearLeft = true;
    1047           0 :                     break;
    1048             :                 default:
    1049           4 :                     break;
    1050             :                 }
    1051             :             }
    1052           4 :             break;
    1053             :         }
    1054             : 
    1055           4 :         if (pSurroundString)
    1056             :         {
    1057           0 :             aHtml.start(OOO_STRING_SVTOOLS_HTML_linebreak);
    1058           0 :             aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_clear, pSurroundString);
    1059           0 :             aHtml.end();
    1060             :         }
    1061             :     }
    1062           6 : }
    1063             : 
    1064             : namespace
    1065             : {
    1066             : 
    1067           6 : OUString lclWriteOutImap(SwHTMLWriter& rHTMLWrt, const SfxItemSet& rItemSet, const SwFrmFmt& rFrmFmt,
    1068             :                          const Size& rRealSize, const ImageMap* pAltImgMap, SwFmtURL*& pURLItem)
    1069             : {
    1070           6 :     OUString aIMapName;
    1071             : 
    1072             :     const SfxPoolItem* pItem;
    1073             : 
    1074             :     // das URL-Attribut nur beruecksichtigen, wenn keine Image-Map
    1075             :     // uebergeben wurde
    1076           6 :     if (!pAltImgMap && SfxItemState::SET == rItemSet.GetItemState( RES_URL, true, &pItem))
    1077             :     {
    1078           4 :         pURLItem = (SwFmtURL*) pItem;
    1079             :     }
    1080             : 
    1081             :     // Image-Map rausschreiben
    1082           6 :     const ImageMap* pIMap = pAltImgMap;
    1083           6 :     if( !pIMap && pURLItem )
    1084             :     {
    1085           4 :         pIMap = pURLItem->GetMap();
    1086             :     }
    1087             : 
    1088           6 :     if (pIMap)
    1089             :     {
    1090             :         // den Namen eindeutig machen
    1091           2 :         aIMapName = pIMap->GetName();
    1092           2 :         OUString aNameBase;
    1093           2 :         if (!aIMapName.isEmpty())
    1094           0 :             aNameBase = aIMapName;
    1095             :         else
    1096           2 :             aNameBase = OOO_STRING_SVTOOLS_HTML_map;
    1097             : 
    1098           2 :         if (aIMapName.isEmpty())
    1099           2 :             aIMapName = aNameBase + OUString::number(rHTMLWrt.nImgMapCnt);
    1100             : 
    1101             :         bool bFound;
    1102           2 :         do
    1103             :         {
    1104           2 :             bFound = false;
    1105           2 :             for (size_t i = 0; i < rHTMLWrt.aImgMapNames.size(); ++i)
    1106             :             {
    1107             :                 // TODO: Unicode: Comparison is case insensitive for ASCII
    1108             :                 // characters only now!
    1109           0 :                 if (aIMapName.equalsIgnoreAsciiCase(rHTMLWrt.aImgMapNames[i]))
    1110             :                 {
    1111           0 :                     bFound = true;
    1112           0 :                     break;
    1113             :                 }
    1114             :             }
    1115           2 :             if (bFound)
    1116             :             {
    1117           0 :                 rHTMLWrt.nImgMapCnt++;
    1118           0 :                 aIMapName = aNameBase + OUString::number( rHTMLWrt.nImgMapCnt );
    1119             :             }
    1120             :         } while (bFound);
    1121             : 
    1122           2 :         bool bScale = false;
    1123           2 :         Fraction aScaleX(1, 1);
    1124           2 :         Fraction aScaleY(1, 1);
    1125             : 
    1126           2 :         const SwFmtFrmSize& rFrmSize = rFrmFmt.GetFrmSize();
    1127           2 :         const SvxBoxItem& rBox = rFrmFmt.GetBox();
    1128             : 
    1129           2 :         if (!rFrmSize.GetWidthPercent() && rRealSize.Width())
    1130             :         {
    1131           2 :             SwTwips nWidth = rFrmSize.GetWidth();
    1132           2 :             nWidth -= rBox.CalcLineSpace(BOX_LINE_LEFT) + rBox.CalcLineSpace(BOX_LINE_RIGHT);
    1133             : 
    1134             :             OSL_ENSURE( nWidth > 0, "Gibt es 0 twip breite Grafiken!?" );
    1135           2 :             if (nWidth <= 0) // sollte nicht passieren
    1136           0 :                 nWidth = 1;
    1137             : 
    1138           2 :             if (rRealSize.Width() != nWidth)
    1139             :             {
    1140           2 :                 aScaleX = Fraction(nWidth, rRealSize.Width());
    1141           2 :                 bScale = true;
    1142             :             }
    1143             :         }
    1144             : 
    1145           2 :         if (!rFrmSize.GetHeightPercent() && rRealSize.Height())
    1146             :         {
    1147           2 :             SwTwips nHeight = rFrmSize.GetHeight();
    1148             : 
    1149           2 :             nHeight -= rBox.CalcLineSpace(BOX_LINE_TOP) + rBox.CalcLineSpace(BOX_LINE_BOTTOM);
    1150             : 
    1151             :             OSL_ENSURE( nHeight > 0, "Gibt es 0 twip hohe Grafiken!?" );
    1152           2 :             if (nHeight <= 0)
    1153           0 :                 nHeight = 1;
    1154             : 
    1155           2 :             if (rRealSize.Height() != nHeight)
    1156             :             {
    1157           2 :                 aScaleY = Fraction(nHeight, rRealSize.Height());
    1158           2 :                 bScale = true;
    1159             :             }
    1160             :         }
    1161             : 
    1162           2 :         rHTMLWrt.aImgMapNames.push_back(aIMapName);
    1163             : 
    1164           4 :         OString aIndMap, aIndArea;
    1165           2 :         const sal_Char *pIndArea = 0, *pIndMap = 0;
    1166             : 
    1167           2 :         if (rHTMLWrt.bLFPossible)
    1168             :         {
    1169           2 :             rHTMLWrt.OutNewLine( true );
    1170           2 :             aIndMap = rHTMLWrt.GetIndentString();
    1171           2 :             aIndArea = rHTMLWrt.GetIndentString(1);
    1172           2 :             pIndArea = aIndArea.getStr();
    1173           2 :             pIndMap = aIndMap.getStr();
    1174             :         }
    1175             : 
    1176           2 :         if (bScale)
    1177             :         {
    1178           2 :             ImageMap aScaledIMap(*pIMap);
    1179           2 :             aScaledIMap.Scale(aScaleX, aScaleY);
    1180           2 :             HTMLOutFuncs::Out_ImageMap( rHTMLWrt.Strm(), rHTMLWrt.GetBaseURL(), aScaledIMap, aIMapName,
    1181             :                                         aIMapEventTable,
    1182             :                                         rHTMLWrt.bCfgStarBasic,
    1183             :                                         SAL_NEWLINE_STRING, pIndArea, pIndMap,
    1184             :                                         rHTMLWrt.eDestEnc,
    1185           4 :                                         &rHTMLWrt.aNonConvertableCharacters );
    1186             :         }
    1187             :         else
    1188             :         {
    1189           0 :             HTMLOutFuncs::Out_ImageMap( rHTMLWrt.Strm(), rHTMLWrt.GetBaseURL(), *pIMap, aIMapName,
    1190             :                                         aIMapEventTable,
    1191             :                                         rHTMLWrt.bCfgStarBasic,
    1192             :                                         SAL_NEWLINE_STRING, pIndArea, pIndMap,
    1193             :                                          rHTMLWrt.eDestEnc,
    1194           0 :                                         &rHTMLWrt.aNonConvertableCharacters );
    1195           2 :         }
    1196             :     }
    1197           6 :     return aIMapName;
    1198             : }
    1199             : 
    1200             : }
    1201             : 
    1202           6 : Writer& OutHTML_Image( Writer& rWrt, const SwFrmFmt &rFrmFmt,
    1203             :                        Graphic& rGraphic, const OUString& rAlternateTxt,
    1204             :                        const Size &rRealSize, sal_uInt32 nFrmOpts,
    1205             :                        const sal_Char *pMarkType,
    1206             :                        const ImageMap *pAltImgMap )
    1207             : {
    1208           6 :     SwHTMLWriter& rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt);
    1209             : 
    1210           6 :     if (rHTMLWrt.mbSkipImages)
    1211           0 :         return rHTMLWrt;
    1212             : 
    1213             :     // ggf. ein noch offenes Attribut voruebergehend beenden
    1214           6 :     if( !rHTMLWrt.aINetFmts.empty() )
    1215             :     {
    1216           0 :         SwFmtINetFmt* pINetFmt = rHTMLWrt.aINetFmts.back();
    1217           0 :         OutHTML_INetFmt( rWrt, *pINetFmt, false );
    1218             :     }
    1219             : 
    1220             :     const SfxPoolItem* pItem;
    1221           6 :     const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
    1222             : 
    1223           6 :     SwFmtURL* pURLItem = 0;
    1224           6 :     OUString aIMapName = lclWriteOutImap(rHTMLWrt, rItemSet, rFrmFmt, rRealSize, pAltImgMap, pURLItem);
    1225             : 
    1226             :     // put img into new line
    1227           6 :     if( rHTMLWrt.bLFPossible )
    1228           4 :         rHTMLWrt.OutNewLine( true );
    1229             : 
    1230          12 :     HtmlWriter aHtml(rWrt.Strm());
    1231             : 
    1232             :     // <a name=...></a>...<img ...>
    1233           6 :     if( pMarkType && !rFrmFmt.GetName().isEmpty() )
    1234             :     {
    1235           6 :         rHTMLWrt.OutImplicitMark( rFrmFmt.GetName(), pMarkType );
    1236             :     }
    1237             : 
    1238             :     // URL -> <a>...<img ... >...</a>
    1239           6 :     const SvxMacroItem *pMacItem = 0;
    1240           6 :     if (SfxItemState::SET == rItemSet.GetItemState(RES_FRMMACRO, true, &pItem))
    1241             :     {
    1242           0 :         pMacItem = (const SvxMacroItem *)pItem;
    1243             :     }
    1244             : 
    1245           6 :     if (pURLItem || pMacItem)
    1246             :     {
    1247           4 :         OUString aMapURL;
    1248           8 :         OUString aName;
    1249           8 :         OUString aTarget;
    1250             : 
    1251           4 :         if(pURLItem)
    1252             :         {
    1253           4 :             aMapURL = pURLItem->GetURL();
    1254           4 :             aName = pURLItem->GetName();
    1255           4 :             aTarget = pURLItem->GetTargetFrameName();
    1256             :         }
    1257             : 
    1258           4 :         bool bEvents = pMacItem && !pMacItem->GetMacroTable().empty();
    1259             : 
    1260           4 :         if( !aMapURL.isEmpty() || !aName.isEmpty() || !aTarget.isEmpty() || bEvents )
    1261             :         {
    1262           4 :             aHtml.start(OOO_STRING_SVTOOLS_HTML_anchor);
    1263             : 
    1264             :             // Output "href" element if a link or macro exists
    1265           4 :             if( !aMapURL.isEmpty() || bEvents )
    1266             :             {
    1267           4 :                 aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_href, OUStringToOString(rHTMLWrt.convertHyperlinkHRefValue(aMapURL), RTL_TEXTENCODING_UTF8));
    1268             :             }
    1269             : 
    1270           4 :             if( !aName.isEmpty() )
    1271             :             {
    1272           4 :                 aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_name, OUStringToOString(aName, RTL_TEXTENCODING_UTF8));
    1273             :             }
    1274             : 
    1275           4 :             if( !aTarget.isEmpty() )
    1276             :             {
    1277           2 :                 aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_target, OUStringToOString(aTarget, RTL_TEXTENCODING_UTF8));
    1278             :             }
    1279             : 
    1280           4 :             if( pMacItem )
    1281             :             {
    1282           0 :                 const SvxMacroTableDtor& rMacTable = pMacItem->GetMacroTable();
    1283           0 :                 if (!rMacTable.empty())
    1284             :                 {
    1285           0 :                     HtmlWriterHelper::applyEvents(aHtml, rMacTable, aAnchorEventTable, rHTMLWrt.bCfgStarBasic);
    1286             :                 }
    1287             :             }
    1288           4 :         }
    1289             :     }
    1290             : 
    1291             :     // <font color = ...>...<img ... >...</font>
    1292           6 :     sal_uInt16 nBorderWidth = 0;
    1293          12 :     if( (nFrmOpts & HTML_FRMOPT_BORDER) &&
    1294           6 :         SfxItemState::SET == rItemSet.GetItemState( RES_BOX, true, &pItem ))
    1295             :     {
    1296           4 :         Size aTwipBorder( 0, 0 );
    1297           4 :         const SvxBoxItem* pBoxItem = (const SvxBoxItem*)pItem;
    1298             : 
    1299           4 :         const ::editeng::SvxBorderLine *pColBorderLine = 0;
    1300           4 :         const ::editeng::SvxBorderLine *pBorderLine = pBoxItem->GetLeft();
    1301           4 :         if( pBorderLine )
    1302             :         {
    1303           4 :             pColBorderLine = pBorderLine;
    1304           4 :             aTwipBorder.Width() += pBorderLine->GetOutWidth();
    1305             :         }
    1306             : 
    1307           4 :         pBorderLine = pBoxItem->GetRight();
    1308           4 :         if( pBorderLine )
    1309             :         {
    1310           4 :             pColBorderLine = pBorderLine;
    1311           4 :             aTwipBorder.Width() += pBorderLine->GetOutWidth();
    1312             :         }
    1313             : 
    1314           4 :         pBorderLine = pBoxItem->GetTop();
    1315           4 :         if( pBorderLine )
    1316             :         {
    1317           4 :             pColBorderLine = pBorderLine;
    1318           4 :             aTwipBorder.Height() += pBorderLine->GetOutWidth();
    1319             :         }
    1320             : 
    1321           4 :         pBorderLine = pBoxItem->GetBottom();
    1322           4 :         if( pBorderLine )
    1323             :         {
    1324           4 :             pColBorderLine = pBorderLine;
    1325           4 :             aTwipBorder.Height() += pBorderLine->GetOutWidth();
    1326             :         }
    1327             : 
    1328           4 :         aTwipBorder.Width() /= 2;
    1329           4 :         aTwipBorder.Height() /= 2;
    1330             : 
    1331           8 :         if( (aTwipBorder.Width() || aTwipBorder.Height()) &&
    1332           4 :             Application::GetDefaultDevice() )
    1333             :         {
    1334             :             Size aPixelBorder =
    1335             :                 Application::GetDefaultDevice()->LogicToPixel( aTwipBorder,
    1336           4 :                                                     MapMode(MAP_TWIP) );
    1337           4 :             if( !aPixelBorder.Width() && aTwipBorder.Width() )
    1338           0 :                 aPixelBorder.Width() = 1;
    1339           4 :             if( !aPixelBorder.Height() && aTwipBorder.Height() )
    1340           0 :                 aPixelBorder.Height() = 1;
    1341             : 
    1342           4 :             if( aPixelBorder.Width() )
    1343           4 :                 aPixelBorder.Height() = 0;
    1344             : 
    1345             :             nBorderWidth =
    1346           4 :                 (sal_uInt16)(aPixelBorder.Width() + aPixelBorder.Height());
    1347             :         }
    1348             : 
    1349           4 :         if( pColBorderLine )
    1350             :         {
    1351           4 :             aHtml.start(OOO_STRING_SVTOOLS_HTML_font);
    1352           4 :             HtmlWriterHelper::applyColor(aHtml, OOO_STRING_SVTOOLS_HTML_O_color, pColBorderLine->GetColor());
    1353             :         }
    1354             :     }
    1355             : 
    1356           6 :     aHtml.start(OOO_STRING_SVTOOLS_HTML_image);
    1357             : 
    1358          12 :     OUString aGraphicInBase64;
    1359           6 :     sal_uLong nErr = XOutBitmap::GraphicToBase64(rGraphic, aGraphicInBase64);
    1360           6 :     if (nErr)
    1361             :     {
    1362           0 :         rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
    1363             :     }
    1364             : 
    1365          12 :     OStringBuffer sBuffer;
    1366           6 :     sBuffer.append(OOO_STRING_SVTOOLS_HTML_O_data);
    1367           6 :     sBuffer.append(":");
    1368           6 :     sBuffer.append(OUStringToOString(aGraphicInBase64, RTL_TEXTENCODING_UTF8));
    1369           6 :     aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_src, sBuffer.makeStringAndClear().getStr());
    1370             : 
    1371             :     // Events
    1372           6 :     if (SfxItemState::SET == rItemSet.GetItemState(RES_FRMMACRO, true, &pItem))
    1373             :     {
    1374           0 :         const SvxMacroTableDtor& rMacTable = ((const SvxMacroItem *)pItem)->GetMacroTable();
    1375           0 :         if (!rMacTable.empty())
    1376             :         {
    1377           0 :             HtmlWriterHelper::applyEvents(aHtml, rMacTable, aImageEventTable, rHTMLWrt.bCfgStarBasic);
    1378             :         }
    1379             :     }
    1380             : 
    1381             :     // alt, align, width, height, hspace, vspace
    1382           6 :     rHTMLWrt.writeFrameFormatOptions(aHtml, rFrmFmt, rAlternateTxt, nFrmOpts);
    1383           6 :     if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) )
    1384           6 :         rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmOpts );
    1385             : 
    1386           6 :     if( nFrmOpts & HTML_FRMOPT_BORDER )
    1387             :     {
    1388           6 :         aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_border, nBorderWidth);
    1389             :     }
    1390             : 
    1391           6 :     if( pURLItem && pURLItem->IsServerMap() )
    1392             :     {
    1393           0 :         aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_ismap);
    1394             :     }
    1395             : 
    1396           6 :     if( !aIMapName.isEmpty() )
    1397             :     {
    1398           2 :         aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_usemap, "#" + aIMapName);
    1399             :     }
    1400             : 
    1401           6 :     aHtml.flushStack();
    1402             : 
    1403           6 :     if( !rHTMLWrt.aINetFmts.empty() )
    1404             :     {
    1405             :         // es ist noch ein Attribut auf dem Stack, das wieder geoeffnet
    1406             :         // werden muss
    1407           0 :         SwFmtINetFmt *pINetFmt = rHTMLWrt.aINetFmts.back();
    1408           0 :         OutHTML_INetFmt( rWrt, *pINetFmt, true );
    1409             :     }
    1410             : 
    1411          12 :     return rHTMLWrt;
    1412             : }
    1413             : 
    1414           0 : Writer& OutHTML_BulletImage( Writer& rWrt,
    1415             :                              const sal_Char *pTag,
    1416             :                              const SvxBrushItem* pBrush )
    1417             : {
    1418           0 :     SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
    1419             : 
    1420           0 :     OUString aGraphicInBase64;
    1421           0 :     if( pBrush )
    1422             :     {
    1423           0 :         const Graphic* pGrf = pBrush->GetGraphic();
    1424           0 :         if( pGrf )
    1425             :         {
    1426           0 :             sal_uLong nErr = XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64);
    1427           0 :             if( nErr )
    1428             :             {
    1429           0 :                 rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
    1430             :             }
    1431             :         }
    1432             :     }
    1433             : 
    1434           0 :     OStringBuffer sOut;
    1435           0 :     if( pTag )
    1436           0 :         sOut.append('<').append(pTag);
    1437             : 
    1438           0 :     sOut.append(' ');
    1439           0 :     sOut.append(OOO_STRING_SVTOOLS_HTML_O_style).append("=\"").
    1440           0 :     append("list-style-image: ").append("url(").
    1441           0 :     append(OOO_STRING_SVTOOLS_HTML_O_data).append(":");
    1442           0 :     rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
    1443           0 :     HTMLOutFuncs::Out_String( rWrt.Strm(), aGraphicInBase64, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
    1444           0 :     sOut.append(");").append('\"');
    1445             : 
    1446           0 :     if (pTag)
    1447           0 :         sOut.append('>');
    1448           0 :     rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
    1449             : 
    1450           0 :     return rWrt;
    1451             : }
    1452             : 
    1453           0 : static Writer& OutHTML_FrmFmtTableNode( Writer& rWrt, const SwFrmFmt& rFrmFmt )
    1454             : {
    1455           0 :     SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
    1456             : 
    1457           0 :     const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
    1458           0 :     sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
    1459           0 :     sal_uLong nEnd = rHTMLWrt.pDoc->GetNodes()[nStt-1]->EndOfSectionIndex();
    1460             : 
    1461           0 :     OUString aCaption;
    1462           0 :     bool bTopCaption = false;
    1463             : 
    1464             :     // Nicht const, weil GetTable spater mal nicht const ist
    1465           0 :     SwNode *pNd = rHTMLWrt.pDoc->GetNodes()[ nStt ];
    1466           0 :     SwTableNode *pTblNd = pNd->GetTableNode();
    1467           0 :     const SwTxtNode *pTxtNd = pNd->GetTxtNode();
    1468           0 :     if( !pTblNd && pTxtNd )
    1469             :     {
    1470             :         // Tabelle mit Ueberschrift
    1471           0 :         bTopCaption = true;
    1472           0 :         pTblNd = rHTMLWrt.pDoc->GetNodes()[nStt+1]->GetTableNode();
    1473             :     }
    1474             :     OSL_ENSURE( pTblNd, "Rahmen enthaelt keine Tabelle" );
    1475           0 :     if( pTblNd )
    1476             :     {
    1477           0 :         sal_uLong nTblEnd = pTblNd->EndOfSectionIndex();
    1478             :         OSL_ENSURE( nTblEnd == nEnd - 1 ||
    1479             :                 (nTblEnd == nEnd - 2 && !bTopCaption),
    1480             :                 "Ungeuelter Rahmen-Inhalt fuer Tabelle" );
    1481             : 
    1482           0 :         if( nTblEnd == nEnd - 2 )
    1483           0 :             pTxtNd = rHTMLWrt.pDoc->GetNodes()[nTblEnd+1]->GetTxtNode();
    1484             :     }
    1485           0 :     if( pTxtNd )
    1486           0 :         aCaption = pTxtNd->GetTxt();
    1487             : 
    1488           0 :     if( pTblNd )
    1489             :     {
    1490           0 :         HTMLSaveData aSaveData( rHTMLWrt, pTblNd->GetIndex()+1,
    1491             :                                 pTblNd->EndOfSectionIndex(),
    1492           0 :                                    true, &rFrmFmt );
    1493           0 :         rHTMLWrt.bOutFlyFrame = true;
    1494             :         OutHTML_SwTblNode( rHTMLWrt, *pTblNd, &rFrmFmt, &aCaption,
    1495           0 :                            bTopCaption );
    1496             :     }
    1497             : 
    1498           0 :     return rWrt;
    1499             : }
    1500             : 
    1501           0 : static Writer & OutHTML_FrmFmtAsMulticol( Writer& rWrt,
    1502             :                                           const SwFrmFmt& rFrmFmt,
    1503             :                                           bool bInCntnr )
    1504             : {
    1505           0 :     SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
    1506             : 
    1507           0 :     rHTMLWrt.ChangeParaToken( 0 );
    1508             : 
    1509             :     // Die aktulle <DL> beenden!
    1510           0 :     rHTMLWrt.OutAndSetDefList( 0 );
    1511             : 
    1512             :     // als Multicol ausgeben
    1513           0 :     if( rHTMLWrt.bLFPossible )
    1514           0 :         rHTMLWrt.OutNewLine();
    1515             : 
    1516           0 :     OStringBuffer sOut;
    1517           0 :     sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_multicol);
    1518             : 
    1519           0 :     const SwFmtCol& rFmtCol = rFrmFmt.GetCol();
    1520             : 
    1521             :     // die Anzahl der Spalten als COLS ausgeben
    1522           0 :     sal_uInt16 nCols = rFmtCol.GetNumCols();
    1523           0 :     if( nCols )
    1524             :     {
    1525           0 :         sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_cols).
    1526           0 :             append("=\"").append(static_cast<sal_Int32>(nCols)).append("\"");
    1527             :     }
    1528             : 
    1529             :     // die Gutter-Breite (Minimalwert) als GUTTER
    1530           0 :     sal_uInt16 nGutter = rFmtCol.GetGutterWidth( true );
    1531           0 :     if( nGutter!=USHRT_MAX )
    1532             :     {
    1533           0 :         if( nGutter && Application::GetDefaultDevice() )
    1534             :         {
    1535             :             nGutter = (sal_uInt16)Application::GetDefaultDevice()
    1536             :                             ->LogicToPixel( Size(nGutter,0),
    1537           0 :                                             MapMode(MAP_TWIP) ).Width();
    1538             :         }
    1539           0 :         sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_gutter).
    1540           0 :             append("=\"").append(static_cast<sal_Int32>(nGutter)).append("\"");
    1541             :     }
    1542             : 
    1543           0 :     rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
    1544             : 
    1545             :     // WIDTH
    1546             :     sal_uLong nFrmFlags = bInCntnr ? HTML_FRMOPTS_MULTICOL_CNTNR
    1547           0 :                                 : HTML_FRMOPTS_MULTICOL;
    1548           0 :     if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bInCntnr )
    1549           0 :         nFrmFlags |= HTML_FRMOPTS_MULTICOL_CSS1;
    1550           0 :     rHTMLWrt.OutFrmFmtOptions( rFrmFmt, aEmptyOUStr, nFrmFlags );
    1551           0 :     if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bInCntnr )
    1552           0 :         rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmFlags );
    1553             : 
    1554           0 :     rWrt.Strm().WriteChar( '>' );
    1555             : 
    1556           0 :     rHTMLWrt.bLFPossible = true;
    1557           0 :     rHTMLWrt.IncIndentLevel();  // den Inhalt von Multicol einruecken;
    1558             : 
    1559           0 :     const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
    1560           0 :     sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex();
    1561           0 :     const SwStartNode* pSttNd = rWrt.pDoc->GetNodes()[nStt]->GetStartNode();
    1562             :     OSL_ENSURE( pSttNd, "Wo ist der Start-Node" );
    1563             : 
    1564             :     {
    1565             :         // in einem Block damit rechtzeitig vor dem Ende der alte Zustand
    1566             :         // wieder hergestellt wird.
    1567             :         HTMLSaveData aSaveData( rHTMLWrt, nStt+1,
    1568             :                                 pSttNd->EndOfSectionIndex(),
    1569           0 :                                    true, &rFrmFmt );
    1570           0 :         rHTMLWrt.bOutFlyFrame = true;
    1571           0 :         rHTMLWrt.Out_SwDoc( rWrt.pCurPam );
    1572             :     }
    1573             : 
    1574           0 :     rHTMLWrt.DecIndentLevel();  // den Inhalt von Multicol einruecken;
    1575           0 :     if( rHTMLWrt.bLFPossible )
    1576           0 :         rHTMLWrt.OutNewLine();
    1577           0 :     HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_multicol, false );
    1578           0 :     rHTMLWrt.bLFPossible = true;
    1579             : 
    1580           0 :     return rWrt;
    1581             : }
    1582             : 
    1583           0 : static Writer& OutHTML_FrmFmtAsSpacer( Writer& rWrt, const SwFrmFmt& rFrmFmt )
    1584             : {
    1585           0 :     SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
    1586             : 
    1587             :     // wenn meoglich vor der Grafik einen Zeilen-Umbruch ausgeben
    1588           0 :     if( rHTMLWrt.bLFPossible )
    1589           0 :         rHTMLWrt.OutNewLine( true );
    1590             : 
    1591           0 :     OStringBuffer sOut;
    1592           0 :     sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_spacer).append(' ')
    1593           0 :         .append(OOO_STRING_SVTOOLS_HTML_O_type).append("=\"")
    1594           0 :         .append(OOO_STRING_SVTOOLS_HTML_SPTYPE_block).append("\"");
    1595           0 :     rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
    1596             : 
    1597             :     // ALIGN, WIDTH, HEIGHT
    1598           0 :     OString aEndTags = rHTMLWrt.OutFrmFmtOptions( rFrmFmt, aEmptyOUStr, HTML_FRMOPTS_SPACER );
    1599             : 
    1600           0 :     rWrt.Strm().WriteChar( '>' );
    1601           0 :     if( !aEndTags.isEmpty() )
    1602           0 :         rWrt.Strm().WriteCharPtr( aEndTags.getStr() );
    1603             : 
    1604           0 :     return rWrt;
    1605             : }
    1606             : 
    1607           0 : static Writer& OutHTML_FrmFmtAsDivOrSpan( Writer& rWrt,
    1608             :                                           const SwFrmFmt& rFrmFmt, bool bSpan)
    1609             : {
    1610           0 :     SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
    1611             : 
    1612           0 :     const sal_Char *pStr = 0;
    1613           0 :     if( !bSpan )
    1614             :     {
    1615           0 :         rHTMLWrt.ChangeParaToken( 0 );
    1616             : 
    1617             :         // Die aktulle <DL> beenden!
    1618           0 :         rHTMLWrt.OutAndSetDefList( 0 );
    1619           0 :         pStr = OOO_STRING_SVTOOLS_HTML_division;
    1620             :     }
    1621             :     else
    1622           0 :         pStr = OOO_STRING_SVTOOLS_HTML_span;
    1623             : 
    1624             :     // als DIV ausgeben
    1625           0 :     if( rHTMLWrt.bLFPossible )
    1626           0 :         rHTMLWrt.OutNewLine();
    1627             : 
    1628           0 :     OStringBuffer sOut;
    1629           0 :     sOut.append('<').append(pStr);
    1630             : 
    1631           0 :     rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() );
    1632           0 :     sal_uLong nFrmFlags = HTML_FRMOPTS_DIV;
    1633           0 :     if( rHTMLWrt.IsHTMLMode( HTMLMODE_BORDER_NONE ) )
    1634           0 :        nFrmFlags |= HTML_FRMOPT_S_NOBORDER;
    1635           0 :     OString aEndTags = rHTMLWrt.OutFrmFmtOptions( rFrmFmt, aEmptyOUStr, nFrmFlags );
    1636           0 :     rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmFlags );
    1637           0 :     rWrt.Strm().WriteChar( '>' );
    1638             : 
    1639           0 :     rHTMLWrt.IncIndentLevel();  // den Inhalt einruecken
    1640           0 :     rHTMLWrt.bLFPossible = true;
    1641             : 
    1642           0 :     const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
    1643           0 :     sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex();
    1644             : 
    1645             :     // Am Start-Node verankerte Rahmen-gebundene Rahmen ausgeben
    1646           0 :     rHTMLWrt.OutFlyFrm( nStt, 0, HTML_POS_ANY );
    1647             : 
    1648           0 :     const SwStartNode* pSttNd = rWrt.pDoc->GetNodes()[nStt]->GetStartNode();
    1649             :     OSL_ENSURE( pSttNd, "Wo ist der Start-Node" );
    1650             : 
    1651             :     {
    1652             :         // in einem Block damit rechtzeitig vor dem Ende der alte Zustand
    1653             :         // wieder hergestellt wird.
    1654             :         HTMLSaveData aSaveData( rHTMLWrt, nStt+1,
    1655             :                                 pSttNd->EndOfSectionIndex(),
    1656           0 :                                    true, &rFrmFmt );
    1657           0 :         rHTMLWrt.bOutFlyFrame = true;
    1658           0 :         rHTMLWrt.Out_SwDoc( rWrt.pCurPam );
    1659             :     }
    1660             : 
    1661           0 :     rHTMLWrt.DecIndentLevel();  // den Inhalt von Multicol einruecken;
    1662           0 :     if( rHTMLWrt.bLFPossible )
    1663           0 :         rHTMLWrt.OutNewLine();
    1664           0 :     HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), pStr, false );
    1665             : 
    1666           0 :     if( !aEndTags.isEmpty() )
    1667           0 :         rWrt.Strm().WriteCharPtr( aEndTags.getStr() );
    1668             : 
    1669           0 :     return rWrt;
    1670             : }
    1671             : 
    1672           0 : static Writer & OutHTML_FrmFmtAsImage( Writer& rWrt, const SwFrmFmt& rFrmFmt,
    1673             :                                        bool /*bInCntnr*/ )
    1674             : {
    1675           0 :     SwHTMLWriter& rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt);
    1676             : 
    1677           0 :     if (rHTMLWrt.mbSkipImages)
    1678           0 :         return rWrt;
    1679             : 
    1680           0 :     ImageMap aIMap;
    1681           0 :     Graphic aGraphic( ((SwFrmFmt &)rFrmFmt).MakeGraphic( &aIMap ) );
    1682           0 :     Size aSz( 0, 0 );
    1683             :     OutHTML_Image( rWrt, rFrmFmt, aGraphic, rFrmFmt.GetName(), aSz,
    1684             :                     HTML_FRMOPTS_GENIMG, "frame",
    1685           0 :                     aIMap.GetIMapObjectCount() ? &aIMap : 0 );
    1686             : 
    1687           0 :     return rWrt;
    1688             : }
    1689             : 
    1690          10 : static Writer& OutHTML_FrmFmtGrfNode( Writer& rWrt, const SwFrmFmt& rFrmFmt,
    1691             :                                       bool bInCntnr )
    1692             : {
    1693          10 :     SwHTMLWriter& rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt);
    1694             : 
    1695          10 :     if (rHTMLWrt.mbSkipImages)
    1696           4 :         return rWrt;
    1697             : 
    1698           6 :     const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
    1699           6 :     sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
    1700           6 :     SwGrfNode *pGrfNd = rHTMLWrt.pDoc->GetNodes()[ nStt ]->GetGrfNode();
    1701             :     OSL_ENSURE( pGrfNd, "Grf-Node erwartet" );
    1702           6 :     if( !pGrfNd )
    1703           0 :         return rWrt;
    1704             : 
    1705           6 :     sal_uLong nFrmFlags = bInCntnr ? HTML_FRMOPTS_IMG_CNTNR : HTML_FRMOPTS_IMG;
    1706           6 :     if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bInCntnr )
    1707           6 :          nFrmFlags |= HTML_FRMOPTS_IMG_CSS1;
    1708             : 
    1709           6 :     Graphic aGraphic = pGrfNd->GetGraphic();
    1710             :     OutHTML_Image( rWrt, rFrmFmt, aGraphic, pGrfNd->GetTitle(),
    1711           6 :                   pGrfNd->GetTwipSize(), nFrmFlags, "graphic" );
    1712             : 
    1713           6 :     return rWrt;
    1714             : }
    1715             : 
    1716           0 : static Writer& OutHTML_FrmFmtAsMarquee( Writer& rWrt, const SwFrmFmt& rFrmFmt,
    1717             :                                   const SdrObject& rSdrObj  )
    1718             : {
    1719           0 :     SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
    1720             : 
    1721             :     // die Edit-Engine-Attribute des Objekts als SW-Attribute holen
    1722             :     // und als Hints einsortieren
    1723           0 :     const SfxItemSet& rFmtItemSet = rFrmFmt.GetAttrSet();
    1724           0 :     SfxItemSet aItemSet( *rFmtItemSet.GetPool(), RES_CHRATR_BEGIN,
    1725           0 :                                                  RES_CHRATR_END );
    1726           0 :     SwHTMLWriter::GetEEAttrsFromDrwObj( aItemSet, &rSdrObj, true );
    1727           0 :     bool bCfgOutStylesOld = rHTMLWrt.bCfgOutStyles;
    1728           0 :     rHTMLWrt.bCfgOutStyles = false;
    1729           0 :     rHTMLWrt.bTxtAttr = true;
    1730           0 :     rHTMLWrt.bTagOn = true;
    1731           0 :     Out_SfxItemSet( aHTMLAttrFnTab, rWrt, aItemSet, false );
    1732           0 :     rHTMLWrt.bTxtAttr = false;
    1733             : 
    1734             :     OutHTML_DrawFrmFmtAsMarquee( rHTMLWrt,
    1735             :                                  (const SwDrawFrmFmt &)rFrmFmt,
    1736           0 :                                  rSdrObj );
    1737           0 :     rHTMLWrt.bTxtAttr = true;
    1738           0 :     rHTMLWrt.bTagOn = false;
    1739           0 :     Out_SfxItemSet( aHTMLAttrFnTab, rWrt, aItemSet, false );
    1740           0 :     rHTMLWrt.bTxtAttr = false;
    1741           0 :     rHTMLWrt.bCfgOutStyles = bCfgOutStylesOld;
    1742             : 
    1743           0 :     return rWrt;
    1744             : }
    1745             : 
    1746           2 : Writer& OutHTML_HeaderFooter( Writer& rWrt, const SwFrmFmt& rFrmFmt,
    1747             :                               bool bHeader )
    1748             : {
    1749           2 :     SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
    1750             : 
    1751             :     // als Multicol ausgeben
    1752           2 :     rHTMLWrt.OutNewLine();
    1753           2 :     OStringBuffer sOut;
    1754           2 :     sOut.append(OOO_STRING_SVTOOLS_HTML_division).append(' ')
    1755           2 :         .append(OOO_STRING_SVTOOLS_HTML_O_title).append("=\"")
    1756           4 :         .append( bHeader ? "header" : "footer" ).append("\"");
    1757           2 :     HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sOut.makeStringAndClear().getStr() );
    1758             : 
    1759           2 :     rHTMLWrt.IncIndentLevel();  // den Inhalt von Multicol einruecken;
    1760             : 
    1761             :     // Einen Spacer fuer den Absatnd zusammenbasteln. Da durch das
    1762             :     // <DL> bzw. </DL> immer einer Absatz-Abstand entsteht, wird der
    1763             :     // ggf. abgezogen.
    1764           2 :     const SvxULSpaceItem& rULSpace = rFrmFmt.GetULSpace();
    1765           2 :     sal_uInt16 nSize = bHeader ? rULSpace.GetLower() : rULSpace.GetUpper();
    1766           2 :     rHTMLWrt.nHeaderFooterSpace = nSize;
    1767             : 
    1768           4 :     OString aSpacer;
    1769           4 :     if( rHTMLWrt.IsHTMLMode(HTMLMODE_VERT_SPACER) &&
    1770           2 :         nSize > HTML_PARSPACE && Application::GetDefaultDevice() )
    1771             :     {
    1772           0 :         nSize -= HTML_PARSPACE;
    1773             :         nSize = (sal_Int16)Application::GetDefaultDevice()
    1774           0 :             ->LogicToPixel( Size(nSize,0), MapMode(MAP_TWIP) ).Width();
    1775             : 
    1776           0 :         aSpacer = OStringBuffer(OOO_STRING_SVTOOLS_HTML_spacer).
    1777           0 :             append(' ').append(OOO_STRING_SVTOOLS_HTML_O_type).
    1778           0 :             append("=\"").append(OOO_STRING_SVTOOLS_HTML_SPTYPE_vertical).append("\"").
    1779           0 :             append(' ').append(OOO_STRING_SVTOOLS_HTML_O_size).
    1780           0 :             append("=\"").append(static_cast<sal_Int32>(nSize)).append("\"").
    1781           0 :             makeStringAndClear();
    1782             :     }
    1783             : 
    1784           2 :     const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
    1785           2 :     sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex();
    1786           2 :     const SwStartNode* pSttNd = rWrt.pDoc->GetNodes()[nStt]->GetStartNode();
    1787             :     OSL_ENSURE( pSttNd, "Wo ist der Start-Node" );
    1788             : 
    1789           2 :     if( !bHeader && !aSpacer.isEmpty() )
    1790             :     {
    1791           0 :         rHTMLWrt.OutNewLine();
    1792           0 :         HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), aSpacer.getStr() );
    1793             :     }
    1794             : 
    1795             :     {
    1796             :         // in einem Block damit rechtzeitig vor dem Ende der alte Zustand
    1797             :         // wieder hergestellt wird. pFlyFmt braucht hier nicht gestzt zu
    1798             :         // werden, denn PageDesc-Attribute koennen hier nicht vorkommen
    1799             :         HTMLSaveData aSaveData( rHTMLWrt, nStt+1,
    1800           2 :                                 pSttNd->EndOfSectionIndex() );
    1801             : 
    1802           2 :         if( bHeader )
    1803           0 :             rHTMLWrt.bOutHeader = true;
    1804             :         else
    1805           2 :             rHTMLWrt.bOutFooter = true;
    1806             : 
    1807           2 :         rHTMLWrt.Out_SwDoc( rWrt.pCurPam );
    1808             :     }
    1809             : 
    1810           2 :     if( bHeader && !aSpacer.isEmpty() )
    1811             :     {
    1812           0 :         rHTMLWrt.OutNewLine();
    1813           0 :         HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), aSpacer.getStr() );
    1814             :     }
    1815             : 
    1816           2 :     rHTMLWrt.DecIndentLevel();  // den Inhalt von Multicol einruecken;
    1817           2 :     rHTMLWrt.OutNewLine();
    1818           2 :     HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_division, false );
    1819             : 
    1820           2 :     rHTMLWrt.nHeaderFooterSpace = 0;
    1821             : 
    1822           4 :     return rWrt;
    1823             : }
    1824             : 
    1825           6 : void SwHTMLWriter::AddLinkTarget( const OUString& rURL )
    1826             : {
    1827           6 :     if( rURL.isEmpty() || rURL[0] != '#' )
    1828          12 :         return;
    1829             : 
    1830             :     // There might be a '|' as delimiter (if the link has been inserted
    1831             :     // freshly) or a '%7c' or a '%7C' if the document has been saved and
    1832             :     // loaded already.
    1833           0 :     sal_Int32 nPos = rURL.getLength();
    1834           0 :     bool bFound = false, bEncoded = false;
    1835           0 :     while( !bFound && nPos > 0 )
    1836             :     {
    1837           0 :         sal_Unicode c = rURL[ --nPos ];
    1838           0 :         switch( c )
    1839             :         {
    1840             :         case cMarkSeparator:
    1841           0 :             bFound = true;
    1842           0 :             break;
    1843             :         case '%':
    1844           0 :             bFound = (rURL.getLength() - nPos) >=3 &&
    1845           0 :                      rURL[ nPos+1 ] == '7' &&
    1846           0 :                      ((c =rURL[ nPos+2 ]) == 'C' || c == 'c');
    1847           0 :             if( bFound )
    1848           0 :                 bEncoded = true;
    1849             :         }
    1850             :     }
    1851           0 :     if( !bFound || nPos < 2 ) // mindetsens "#a|..."
    1852           0 :         return;
    1853             : 
    1854           0 :     OUString aURL( rURL.copy( 1 ) );
    1855             : 
    1856             :     // nPos-1+1/3 (-1 wg. Erase)
    1857             :     OUString sCmp(comphelper::string::remove(aURL.copy(bEncoded ? nPos+2 : nPos),
    1858           0 :         ' '));
    1859           0 :     if( sCmp.isEmpty() )
    1860           0 :         return;
    1861             : 
    1862           0 :     sCmp = sCmp.toAsciiLowerCase();
    1863             : 
    1864           0 :     if( sCmp == "region" ||
    1865           0 :         sCmp == "frame" ||
    1866           0 :         sCmp == "graphic" ||
    1867           0 :         sCmp == "ole" ||
    1868           0 :         sCmp == "table" )
    1869             :     {
    1870             :         // Einfach nur in einem sortierten Array merken
    1871           0 :         if( bEncoded )
    1872             :         {
    1873           0 :             aURL = aURL.replaceAt( nPos - 1, 3, OUString(cMarkSeparator)  );
    1874             :         }
    1875           0 :         aImplicitMarks.insert( aURL );
    1876             :     }
    1877           0 :     else if( sCmp == "outline" )
    1878             :     {
    1879             :         // Hier brauchen wir Position und Name. Deshalb sortieren wir
    1880             :         // ein sal_uInt16 und ein String-Array selbst
    1881           0 :         OUString aOutline( aURL.copy( 0, nPos-1 ) );
    1882           0 :         SwPosition aPos( *pCurPam->GetPoint() );
    1883           0 :         if( pDoc->GotoOutline( aPos, aOutline ) )
    1884             :         {
    1885           0 :             sal_uInt32 nIdx = aPos.nNode.GetIndex();
    1886             : 
    1887           0 :             sal_uInt32 nIns=0;
    1888           0 :             while( nIns < aOutlineMarkPoss.size() &&
    1889           0 :                    aOutlineMarkPoss[nIns] < nIdx )
    1890           0 :                 nIns++;
    1891             : 
    1892           0 :             aOutlineMarkPoss.insert( aOutlineMarkPoss.begin()+nIns, nIdx );
    1893           0 :             if( bEncoded )
    1894             :             {
    1895           0 :                 aURL = aURL.replaceAt( nPos - 1, 3, OUString(cMarkSeparator) );
    1896             :             }
    1897           0 :             aOutlineMarks.insert( aOutlineMarks.begin()+nIns, aURL );
    1898           0 :         }
    1899             :     }
    1900           0 :     else if( sCmp == "text" )
    1901             :     {
    1902             : 
    1903           0 :     }
    1904             : }
    1905             : 
    1906          24 : void SwHTMLWriter::CollectLinkTargets()
    1907             : {
    1908             :     const SwFmtINetFmt* pINetFmt;
    1909             :     const SwTxtINetFmt* pTxtAttr;
    1910             :     const SwTxtNode* pTxtNd;
    1911             : 
    1912          24 :     sal_uInt32 n, nMaxItems = pDoc->GetAttrPool().GetItemCount2( RES_TXTATR_INETFMT );
    1913          24 :     for( n = 0; n < nMaxItems; ++n )
    1914             :     {
    1915           0 :         if( 0 != (pINetFmt = (SwFmtINetFmt*)pDoc->GetAttrPool().GetItem2(
    1916           0 :             RES_TXTATR_INETFMT, n ) ) &&
    1917           0 :             0 != ( pTxtAttr = pINetFmt->GetTxtINetFmt()) &&
    1918           0 :             0 != ( pTxtNd = pTxtAttr->GetpTxtNode() ) &&
    1919           0 :             pTxtNd->GetNodes().IsDocNodes() )
    1920             :         {
    1921           0 :             AddLinkTarget( pINetFmt->GetValue() );
    1922             :         }
    1923             :     }
    1924             : 
    1925             :     const SwFmtURL *pURL;
    1926          24 :     nMaxItems = pDoc->GetAttrPool().GetItemCount2( RES_URL );
    1927          32 :     for( n = 0; n < nMaxItems; ++n )
    1928             :     {
    1929          16 :         if( 0 != (pURL = (SwFmtURL*)pDoc->GetAttrPool().GetItem2(
    1930           8 :             RES_URL, n ) ) )
    1931             :         {
    1932           4 :             AddLinkTarget( pURL->GetURL() );
    1933           4 :             const ImageMap *pIMap = pURL->GetMap();
    1934           4 :             if( pIMap )
    1935             :             {
    1936           4 :                 for( sal_uInt16 i=0; i<pIMap->GetIMapObjectCount(); i++ )
    1937             :                 {
    1938           2 :                     const IMapObject* pObj = pIMap->GetIMapObject( i );
    1939           2 :                     if( pObj )
    1940             :                     {
    1941           2 :                         AddLinkTarget( pObj->GetURL() );
    1942             :                     }
    1943             :                 }
    1944             :             }
    1945             :         }
    1946             :     }
    1947         294 : }
    1948             : 
    1949             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10