blob: b5db885091b27161327d1c8e9cc7941716c896d8 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the 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 = sal_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 = sal_True;
break;
}
}
}
}
}
void ScHTMLExport::FillGraphList( const SdrPage* pPage, SCTAB nTab,
SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow )
{
sal_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?
sal_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();
sal_uInt16 nMirrorCase = (pGeo->aGeo.nDrehWink == 18000 ?
( pGeo->bMirrored ? 3 : 4 ) : ( pGeo->bMirrored ? 2 : 1 ));
sal_Bool bHMirr = ( ( nMirrorCase == 2 ) || ( nMirrorCase == 4 ) );
sal_Bool bVMirr = ( ( nMirrorCase == 3 ) || ( nMirrorCase == 4 ) );
sal_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 = sal_True;
}
break;
case OBJ_OLE2:
{
Graphic* pGraphic = ((SdrOle2Obj*)pObject)->GetGraphic();
if ( pGraphic )
{
String aLinkName;
WriteImage( aLinkName, *pGraphic, aOpt );
pE->bWritten = sal_True;
}
}
break;
default:
{
Graphic aGraph( SdrExchangeView::GetObjGraphic(
pDoc->GetDrawLayer(), pObject ) );
String aLinkName;
WriteImage( aLinkName, aGraph, aOpt );
pE->bWritten = sal_True;
}
}
}
void ScHTMLExport::WriteImage( String& rLinkName, const Graphic& rGrf,
const ByteString& rImgOptions, sal_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;
sal_uInt16 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();
}
}