diff options
Diffstat (limited to 'sc/source/filter/html/htmlexp2.cxx')
-rw-r--r-- | sc/source/filter/html/htmlexp2.cxx | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/sc/source/filter/html/htmlexp2.cxx b/sc/source/filter/html/htmlexp2.cxx new file mode 100644 index 000000000000..c6299bda127a --- /dev/null +++ b/sc/source/filter/html/htmlexp2.cxx @@ -0,0 +1,251 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" + + + +//------------------------------------------------------------------------ + +#include <svx/svditer.hxx> +#include <svx/svdograf.hxx> +#include <svx/svdoole2.hxx> +#include <svx/svdpage.hxx> +#include <svx/xoutbmp.hxx> +#include <svx/svdxcgv.hxx> +#include <sot/exchange.hxx> +#include <svtools/htmlkywd.hxx> +#include <svtools/htmlout.hxx> +#include <svtools/transfer.hxx> +#include <svtools/embedtransfer.hxx> +#include <svl/urihelper.hxx> +#include <tools/urlobj.hxx> + +#include "htmlexp.hxx" +#include "global.hxx" +#include "document.hxx" +#include "drwlayer.hxx" +#include "ftools.hxx" + +using namespace com::sun::star; + +//------------------------------------------------------------------------ + +void ScHTMLExport::PrepareGraphics( ScDrawLayer* pDrawLayer, SCTAB nTab, + SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow ) +{ + if ( pDrawLayer->HasObjectsInRows( nTab, nStartRow, nEndRow ) ) + { + SdrPage* pDrawPage = pDrawLayer->GetPage( static_cast<sal_uInt16>(nTab) ); + if ( pDrawPage ) + { + bTabHasGraphics = TRUE; + FillGraphList( pDrawPage, nTab, + nStartCol, nStartRow, nEndCol, nEndRow ); + for ( ScHTMLGraphEntry* pE = aGraphList.First(); pE; + pE = aGraphList.Next() ) + { + if ( !pE->bInCell ) + { // nicht alle in Zellen: einige neben Tabelle + bTabAlignedLeft = TRUE; + break; + } + } + } + } +} + + +void ScHTMLExport::FillGraphList( const SdrPage* pPage, SCTAB nTab, + SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow ) +{ + ULONG nObjCount = pPage->GetObjCount(); + if ( nObjCount ) + { + Rectangle aRect; + if ( !bAll ) + aRect = pDoc->GetMMRect( nStartCol, nStartRow, nEndCol, nEndRow, nTab ); + SdrObjListIter aIter( *pPage, IM_FLAT ); + SdrObject* pObject = aIter.Next(); + while ( pObject ) + { + Rectangle aObjRect = pObject->GetCurrentBoundRect(); + if ( bAll || aRect.IsInside( aObjRect ) ) + { + Size aSpace; + ScRange aR = pDoc->GetRange( nTab, aObjRect ); + // Rectangle in mm/100 + Size aSize( MMToPixel( aObjRect.GetSize() ) ); + // If the image is somewhere in a merged range we must + // move the anchor to the upper left (THE span cell). + pDoc->ExtendOverlapped( aR ); + SCCOL nCol1 = aR.aStart.Col(); + SCROW nRow1 = aR.aStart.Row(); + SCCOL nCol2 = aR.aEnd.Col(); + SCROW nRow2 = aR.aEnd.Row(); + // All cells empty under object? + BOOL bInCell = (pDoc->GetEmptyLinesInBlock( + nCol1, nRow1, nTab, nCol2, nRow2, nTab, DIR_TOP ) + == static_cast< SCSIZE >( nRow2 - nRow1 )); // rows-1 ! + if ( bInCell ) + { // Spacing in spanning cell + Rectangle aCellRect = pDoc->GetMMRect( + nCol1, nRow1, nCol2, nRow2, nTab ); + aSpace = MMToPixel( Size( + aCellRect.GetWidth() - aObjRect.GetWidth(), + aCellRect.GetHeight() - aObjRect.GetHeight() )); + aSpace.Width() += (nCol2-nCol1) * (nCellSpacing+1); + aSpace.Height() += (nRow2-nRow1) * (nCellSpacing+1); + aSpace.Width() /= 2; + aSpace.Height() /= 2; + } + ScHTMLGraphEntry* pE = new ScHTMLGraphEntry( pObject, + aR, aSize, bInCell, aSpace ); + aGraphList.Insert( pE, LIST_APPEND ); + } + pObject = aIter.Next(); + } + } +} + + +void ScHTMLExport::WriteGraphEntry( ScHTMLGraphEntry* pE ) +{ + SdrObject* pObject = pE->pObject; + ByteString aOpt; + (((aOpt += ' ') += OOO_STRING_SVTOOLS_HTML_O_width) += '=') += + ByteString::CreateFromInt32( pE->aSize.Width() ); + (((aOpt += ' ') += OOO_STRING_SVTOOLS_HTML_O_height) += '=') += + ByteString::CreateFromInt32( pE->aSize.Height() ); + if ( pE->bInCell ) + { + (((aOpt += ' ') += OOO_STRING_SVTOOLS_HTML_O_hspace) += '=') += + ByteString::CreateFromInt32( pE->aSpace.Width() ); + (((aOpt += ' ') += OOO_STRING_SVTOOLS_HTML_O_vspace) += '=') += + ByteString::CreateFromInt32( pE->aSpace.Height() ); + } + switch ( pObject->GetObjIdentifier() ) + { + case OBJ_GRAF: + { + const SdrGrafObj* pSGO = (SdrGrafObj*)pObject; + const SdrGrafObjGeoData* pGeo = (SdrGrafObjGeoData*)pSGO->GetGeoData(); + USHORT nMirrorCase = (pGeo->aGeo.nDrehWink == 18000 ? + ( pGeo->bMirrored ? 3 : 4 ) : ( pGeo->bMirrored ? 2 : 1 )); + BOOL bHMirr = ( ( nMirrorCase == 2 ) || ( nMirrorCase == 4 ) ); + BOOL bVMirr = ( ( nMirrorCase == 3 ) || ( nMirrorCase == 4 ) ); + ULONG nXOutFlags = 0; + if ( bHMirr ) + nXOutFlags |= XOUTBMP_MIRROR_HORZ; + if ( bVMirr ) + nXOutFlags |= XOUTBMP_MIRROR_VERT; + String aLinkName; + if ( pSGO->IsLinkedGraphic() ) + aLinkName = pSGO->GetFileName(); + WriteImage( aLinkName, pSGO->GetGraphic(), aOpt, nXOutFlags ); + pE->bWritten = TRUE; + } + break; + case OBJ_OLE2: + { + Graphic* pGraphic = ((SdrOle2Obj*)pObject)->GetGraphic(); + if ( pGraphic ) + { + String aLinkName; + WriteImage( aLinkName, *pGraphic, aOpt ); + pE->bWritten = TRUE; + } + } + break; + default: + { + Graphic aGraph( SdrExchangeView::GetObjGraphic( + pDoc->GetDrawLayer(), pObject ) ); + String aLinkName; + WriteImage( aLinkName, aGraph, aOpt ); + pE->bWritten = TRUE; + } + } +} + + +void ScHTMLExport::WriteImage( String& rLinkName, const Graphic& rGrf, + const ByteString& rImgOptions, ULONG nXOutFlags ) +{ + // embeddete Grafik -> via WriteGraphic schreiben + if( !rLinkName.Len() ) + { + if( aStreamPath.Len() > 0 ) + { + // Grafik als (JPG-)File speichern + String aGrfNm( aStreamPath ); + nXOutFlags |= XOUTBMP_USE_NATIVE_IF_POSSIBLE; + USHORT nErr = XOutBitmap::WriteGraphic( rGrf, aGrfNm, + CREATE_STRING( "JPG" ), nXOutFlags ); + if( !nErr ) // sonst fehlerhaft, da ist nichts auszugeben + { + rLinkName = URIHelper::SmartRel2Abs( + INetURLObject(aBaseURL), + aGrfNm, + URIHelper::GetMaybeFileHdl()); + if ( HasCId() ) + MakeCIdURL( rLinkName ); + } + } + } + else + { + if( bCopyLocalFileToINet || HasCId() ) + { + CopyLocalFileToINet( rLinkName, aStreamPath ); + if ( HasCId() ) + MakeCIdURL( rLinkName ); + } + else + rLinkName = URIHelper::SmartRel2Abs( + INetURLObject(aBaseURL), + rLinkName, + URIHelper::GetMaybeFileHdl()); + } + if( rLinkName.Len() ) + { // <IMG SRC="..."[ rImgOptions]> + rStrm << '<' << OOO_STRING_SVTOOLS_HTML_image << ' ' << OOO_STRING_SVTOOLS_HTML_O_src << "=\""; + HTMLOutFuncs::Out_String( rStrm, URIHelper::simpleNormalizedMakeRelative( + aBaseURL, + rLinkName ), eDestEnc ) << '\"'; + if ( rImgOptions.Len() ) + rStrm << rImgOptions.GetBuffer(); + rStrm << '>' << sNewLine << GetIndentStr(); + } +} + + + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |