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

Generated by: LCOV version 1.10