blob: 01a355b06531fa013d02d4ea91ea3459c90aca71 [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 "scitems.hxx"
#include <editeng/eeitem.hxx>
#include <svx/algitem.hxx>
#include <editeng/wghtitem.hxx>
#include <editeng/postitem.hxx>
#include <editeng/udlnitem.hxx>
#include <editeng/fontitem.hxx>
#include <editeng/fhgtitem.hxx>
#include <svl/style.hxx>
#include <svtools/rtfout.hxx>
#include <svtools/rtfkeywd.hxx>
#include "rtfexp.hxx"
#include "filter.hxx"
#include "document.hxx"
#include "patattr.hxx"
#include "attrib.hxx"
#include "cell.hxx"
#include "cellform.hxx"
#include "editutil.hxx"
#include "stlpool.hxx"
#include "ftools.hxx"
//------------------------------------------------------------------
FltError ScFormatFilterPluginImpl::ScExportRTF( SvStream& rStrm, ScDocument* pDoc,
const ScRange& rRange, const CharSet /*eNach*/ )
{
ScRTFExport aEx( rStrm, pDoc, rRange );
return aEx.Write();
}
ScRTFExport::ScRTFExport( SvStream& rStrmP, ScDocument* pDocP, const ScRange& rRangeP )
:
ScExportBase( rStrmP, pDocP, rRangeP ),
pCellX( new sal_uLong[ MAXCOL+2 ] )
{
}
ScRTFExport::~ScRTFExport()
{
delete [] pCellX;
}
sal_uLong ScRTFExport::Write()
{
rStrm << '{' << OOO_STRING_SVTOOLS_RTF_RTF;
rStrm << OOO_STRING_SVTOOLS_RTF_ANSI << sNewLine;
#if 0
// das ist noch nicht ausgegoren
/*
SfxStyleSheetBasePool* pStylePool = pDoc->GetStyleSheetPool();
SfxStyleSheetBase* pStyleSheet = NULL;
DBG_ASSERT( pStylePool, "StylePool not found! :-(" );
pStylePool->SetSearchMask( SFX_STYLE_FAMILY_PARA, SFXSTYLEBIT_ALL );
pStyleSheet = pStylePool->Find( STRING_STANDARD, SFX_STYLE_FAMILY_PARA );
DBG_ASSERT( pStyleSheet, "ParaStyle not found! :-(" );
const SfxItemSet& rSetPara = pStyleSheet->GetItemSet();
// fonttbl
String aFontFamilyName(
((const SvxFontItem&)(rSetPara.Get( ATTR_FONT ))).GetFamilyName() );
rStrm << OOO_STRING_SVTOOLS_RTF_DEFF << '0'
<< '{' << OOO_STRING_SVTOOLS_RTF_FONTTBL
<< '{' << OOO_STRING_SVTOOLS_RTF_F << '0' << OOO_STRING_SVTOOLS_RTF_FNIL << ' ' << aFontFamilyName.GetStr() << ";}"
<< '}' << sNewLine;
// hier kaeme die colortbl
// stylesheet
sal_uInt32 nFontHeight =
((const SvxFontHeightItem&)(rSetPara.Get( ATTR_FONT_HEIGHT ))).GetHeight();
rStrm << '{' << OOO_STRING_SVTOOLS_RTF_STYLESHEET
<< '{' << OOO_STRING_SVTOOLS_RTF_FS << String( sal_uInt32(nFontHeight / TWIPS_PER_POINT) ).GetStr()
<< ' ' << pStyleSheet->GetName().GetStr() << ";}"
<< '}' << sNewLine;
*/
#endif
// Daten
for ( SCTAB nTab = aRange.aStart.Tab(); nTab <= aRange.aEnd.Tab(); nTab++ )
{
if ( nTab > aRange.aStart.Tab() )
rStrm << OOO_STRING_SVTOOLS_RTF_PAR;
WriteTab( nTab );
}
rStrm << '}' << sNewLine;
return rStrm.GetError();
}
void ScRTFExport::WriteTab( SCTAB nTab )
{
rStrm << '{' << sNewLine;
if ( pDoc->HasTable( nTab ) )
{
memset( &pCellX[0], 0, (MAXCOL+2) * sizeof(sal_uLong) );
SCCOL nCol;
SCCOL nEndCol = aRange.aEnd.Col();
for ( nCol = aRange.aStart.Col(); nCol <= nEndCol; nCol++ )
{
pCellX[nCol+1] = pCellX[nCol] + pDoc->GetColWidth( nCol, nTab );
}
SCROW nEndRow = aRange.aEnd.Row();
for ( SCROW nRow = aRange.aStart.Row(); nRow <= nEndRow; nRow++ )
{
WriteRow( nTab, nRow );
}
}
rStrm << '}' << sNewLine;
}
void ScRTFExport::WriteRow( SCTAB nTab, SCROW nRow )
{
rStrm << OOO_STRING_SVTOOLS_RTF_TROWD << OOO_STRING_SVTOOLS_RTF_TRGAPH << "30" << OOO_STRING_SVTOOLS_RTF_TRLEFT << "-30";
rStrm << OOO_STRING_SVTOOLS_RTF_TRRH << ByteString::CreateFromInt32( pDoc->GetRowHeight( nRow, nTab ) ).GetBuffer();
SCCOL nCol;
SCCOL nEndCol = aRange.aEnd.Col();
for ( nCol = aRange.aStart.Col(); nCol <= nEndCol; nCol++ )
{
const ScPatternAttr* pAttr = pDoc->GetPattern( nCol, nRow, nTab );
const ScMergeAttr& rMergeAttr = (const ScMergeAttr&) pAttr->GetItem( ATTR_MERGE );
const SvxVerJustifyItem& rVerJustifyItem= (const SvxVerJustifyItem&)pAttr->GetItem( ATTR_VER_JUSTIFY );
const sal_Char* pChar;
if ( rMergeAttr.GetColMerge() != 0 )
rStrm << OOO_STRING_SVTOOLS_RTF_CLMGF;
else
{
const ScMergeFlagAttr& rMergeFlagAttr = (const ScMergeFlagAttr&) pAttr->GetItem( ATTR_MERGE_FLAG );
if ( rMergeFlagAttr.IsHorOverlapped() )
rStrm << OOO_STRING_SVTOOLS_RTF_CLMRG;
}
switch( rVerJustifyItem.GetValue() )
{
case SVX_VER_JUSTIFY_TOP: pChar = OOO_STRING_SVTOOLS_RTF_CLVERTALT; break;
case SVX_VER_JUSTIFY_CENTER: pChar = OOO_STRING_SVTOOLS_RTF_CLVERTALC; break;
case SVX_VER_JUSTIFY_BOTTOM: pChar = OOO_STRING_SVTOOLS_RTF_CLVERTALB; break;
case SVX_VER_JUSTIFY_STANDARD: pChar = OOO_STRING_SVTOOLS_RTF_CLVERTALB; break; //! Bottom
default: pChar = NULL; break;
}
if ( pChar )
rStrm << pChar;
rStrm << OOO_STRING_SVTOOLS_RTF_CELLX << ByteString::CreateFromInt32( pCellX[nCol+1] ).GetBuffer();
if ( (nCol & 0x0F) == 0x0F )
rStrm << sNewLine; // Zeilen nicht zu lang werden lassen
}
rStrm << OOO_STRING_SVTOOLS_RTF_PARD << OOO_STRING_SVTOOLS_RTF_PLAIN << OOO_STRING_SVTOOLS_RTF_INTBL << sNewLine;
sal_uLong nStrmPos = rStrm.Tell();
for ( nCol = aRange.aStart.Col(); nCol <= nEndCol; nCol++ )
{
WriteCell( nTab, nRow, nCol );
if ( rStrm.Tell() - nStrmPos > 255 )
{ // Zeilen nicht zu lang werden lassen
rStrm << sNewLine;
nStrmPos = rStrm.Tell();
}
}
rStrm << OOO_STRING_SVTOOLS_RTF_ROW << sNewLine;
}
void ScRTFExport::WriteCell( SCTAB nTab, SCROW nRow, SCCOL nCol )
{
const ScPatternAttr* pAttr = pDoc->GetPattern( nCol, nRow, nTab );
const ScMergeFlagAttr& rMergeFlagAttr = (const ScMergeFlagAttr&) pAttr->GetItem( ATTR_MERGE_FLAG );
if ( rMergeFlagAttr.IsHorOverlapped() )
{
rStrm << OOO_STRING_SVTOOLS_RTF_CELL;
return ;
}
ScBaseCell* pCell;
pDoc->GetCell( nCol, nRow, nTab, pCell );
sal_Bool bValueData;
String aContent;
if ( pCell )
{
switch ( pCell->GetCellType() )
{
case CELLTYPE_NOTE :
bValueData = sal_False;
break; // nix
case CELLTYPE_EDIT :
{
bValueData = sal_False;
EditEngine& rEngine = GetEditEngine();
const EditTextObject* pObj;
((const ScEditCell*)pCell)->GetData( pObj );
if ( pObj )
{
rEngine.SetText( *pObj );
aContent = rEngine.GetText( LINEEND_LF ); // LineFeed zwischen Absaetzen!
}
}
break;
default:
{
bValueData = pCell->HasValueData();
sal_uLong nFormat = pAttr->GetNumberFormat( pFormatter );
Color* pColor;
ScCellFormat::GetString( pCell, nFormat, aContent, &pColor, *pFormatter );
}
}
}
else
bValueData = sal_False;
sal_Bool bResetPar, bResetAttr;
bResetPar = bResetAttr = sal_False;
const SvxHorJustifyItem& rHorJustifyItem = (const SvxHorJustifyItem&)pAttr->GetItem( ATTR_HOR_JUSTIFY );
const SvxWeightItem& rWeightItem = (const SvxWeightItem&) pAttr->GetItem( ATTR_FONT_WEIGHT );
const SvxPostureItem& rPostureItem = (const SvxPostureItem&) pAttr->GetItem( ATTR_FONT_POSTURE );
const SvxUnderlineItem& rUnderlineItem = (const SvxUnderlineItem&) pAttr->GetItem( ATTR_FONT_UNDERLINE );
const sal_Char* pChar;
switch( rHorJustifyItem.GetValue() )
{
case SVX_HOR_JUSTIFY_STANDARD:
pChar = (bValueData ? OOO_STRING_SVTOOLS_RTF_QR : OOO_STRING_SVTOOLS_RTF_QL);
break;
case SVX_HOR_JUSTIFY_CENTER: pChar = OOO_STRING_SVTOOLS_RTF_QC; break;
case SVX_HOR_JUSTIFY_BLOCK: pChar = OOO_STRING_SVTOOLS_RTF_QJ; break;
case SVX_HOR_JUSTIFY_RIGHT: pChar = OOO_STRING_SVTOOLS_RTF_QR; break;
case SVX_HOR_JUSTIFY_LEFT:
case SVX_HOR_JUSTIFY_REPEAT:
default: pChar = OOO_STRING_SVTOOLS_RTF_QL; break;
}
rStrm << pChar;
if ( rWeightItem.GetWeight() >= WEIGHT_BOLD )
{ // bold
bResetAttr = sal_True;
rStrm << OOO_STRING_SVTOOLS_RTF_B;
}
if ( rPostureItem.GetPosture() != ITALIC_NONE )
{ // italic
bResetAttr = sal_True;
rStrm << OOO_STRING_SVTOOLS_RTF_I;
}
if ( rUnderlineItem.GetLineStyle() != UNDERLINE_NONE )
{ // underline
bResetAttr = sal_True;
rStrm << OOO_STRING_SVTOOLS_RTF_UL;
}
rStrm << ' ';
RTFOutFuncs::Out_String( rStrm, aContent );
rStrm << OOO_STRING_SVTOOLS_RTF_CELL;
if ( bResetPar )
rStrm << OOO_STRING_SVTOOLS_RTF_PARD << OOO_STRING_SVTOOLS_RTF_INTBL;
if ( bResetAttr )
rStrm << OOO_STRING_SVTOOLS_RTF_PLAIN;
}