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

Generated by: LCOV version 1.11