| /************************************************************** |
| * |
| * 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_svx.hxx" |
| |
| #include <vector> |
| |
| #include <com/sun/star/table/XTable.hpp> |
| #include <com/sun/star/beans/XPropertySet.hpp> |
| |
| #include <tools/stream.hxx> |
| #include <svtools/rtfkeywd.hxx> |
| #include <svtools/rtfout.hxx> |
| |
| #include <editeng/eeitem.hxx> |
| #include <svx/sdtaitm.hxx> |
| #include <editeng/wghtitem.hxx> |
| #include <editeng/postitem.hxx> |
| #include <editeng/udlnitem.hxx> |
| |
| #include "cell.hxx" |
| #include "celltypes.hxx" |
| #include "svx/svdotable.hxx" |
| #include "svx/svdoutl.hxx" |
| #include "editeng/editeng.hxx" |
| #include "editeng/outlobj.hxx" |
| |
| //#include <tablertfexporter.hxx> |
| |
| using ::rtl::OUString; |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::table; |
| using namespace ::com::sun::star::container; |
| using namespace ::com::sun::star::beans; |
| |
| namespace sdr { namespace table { |
| |
| class SdrTableRtfExporter |
| { |
| public: |
| SdrTableRtfExporter( SvStream& rStrmP, SdrTableObj& rObj ); |
| sal_uLong Write(); |
| void WriteRow( const Reference< XPropertySet >& xRowSet, sal_Int32 nRow, const std::vector< sal_Int32 >& aColumnStart ); |
| void WriteCell( sal_Int32 nCol, sal_Int32 nRow ); |
| |
| private: |
| SvStream& mrStrm; |
| SdrTableObj& mrObj; |
| Reference< XTable > mxTable; |
| const OUString msSize; |
| }; |
| |
| void SdrTableObj::ExportAsRTF( SvStream& rStrm, SdrTableObj& rObj ) |
| { |
| SdrTableRtfExporter aEx( rStrm, rObj ); |
| aEx.Write(); |
| } |
| |
| SdrTableRtfExporter::SdrTableRtfExporter( SvStream& rStrm, SdrTableObj& rObj ) |
| : mrStrm( rStrm ) |
| , mrObj( rObj ) |
| , mxTable( rObj.getTable() ) |
| , msSize( RTL_CONSTASCII_USTRINGPARAM("Size") ) |
| { |
| } |
| |
| long HundMMToTwips( long nIn ) |
| { |
| long nRet = OutputDevice::LogicToLogic( nIn, MAP_100TH_MM, MAP_TWIP ); |
| return nRet; |
| } |
| |
| sal_uLong SdrTableRtfExporter::Write() |
| { |
| mrStrm << '{' << OOO_STRING_SVTOOLS_RTF_RTF; |
| mrStrm << OOO_STRING_SVTOOLS_RTF_ANSI << RTFOutFuncs::sNewLine; |
| |
| Reference< XTableColumns > xColumns( mxTable->getColumns() ); |
| const sal_Int32 nColCount = xColumns->getCount(); |
| |
| std::vector< sal_Int32 > aColumnStart; |
| aColumnStart.reserve( nColCount ); |
| |
| // determine right offset of cells |
| sal_Int32 nPos = 0; |
| for( sal_Int32 nCol = 0; nCol < nColCount; nCol++ ) try |
| { |
| Reference< XPropertySet > xSet( xColumns->getByIndex(nCol), UNO_QUERY_THROW ); |
| sal_Int32 nWidth = 0; |
| xSet->getPropertyValue( msSize ) >>= nWidth; |
| nPos += HundMMToTwips( nWidth ); |
| aColumnStart.push_back( nPos ); |
| } |
| catch( Exception& e ) |
| { |
| (void)e; |
| DBG_ERROR("SdrTableRtfExporter::Write(), exception caught!"); |
| } |
| |
| // export rows |
| Reference< XTableRows > xRows( mxTable->getRows() ); |
| const sal_Int32 nRowCount = xRows->getCount(); |
| |
| for( sal_Int32 nRow = 0; nRow < nRowCount; nRow++ ) try |
| { |
| Reference< XPropertySet > xRowSet( xRows->getByIndex(nRow), UNO_QUERY_THROW ); |
| WriteRow( xRowSet, nRow, aColumnStart ); |
| } |
| catch( Exception& e ) |
| { |
| (void)e; |
| DBG_ERROR("SdrTableRtfExporter::Write(), exception caught!"); |
| } |
| |
| mrStrm << '}' << RTFOutFuncs::sNewLine; |
| return mrStrm.GetError(); |
| } |
| |
| void SdrTableRtfExporter::WriteRow( const Reference< XPropertySet >& xRowSet, sal_Int32 nRow, const std::vector< sal_Int32 >& aColumnStart ) |
| { |
| sal_Int32 nRowHeight = 0; |
| xRowSet->getPropertyValue( msSize ) >>= nRowHeight; |
| |
| mrStrm << OOO_STRING_SVTOOLS_RTF_TROWD << OOO_STRING_SVTOOLS_RTF_TRGAPH << "30" << OOO_STRING_SVTOOLS_RTF_TRLEFT << "-30"; |
| mrStrm << OOO_STRING_SVTOOLS_RTF_TRRH << ByteString::CreateFromInt32( nRowHeight ).GetBuffer(); |
| |
| const sal_Int32 nColCount = mxTable->getColumnCount(); |
| for( sal_Int32 nCol = 0; nCol < nColCount; nCol++ ) |
| { |
| CellRef xCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nCol, nRow ).get() ) ); |
| |
| if( !xCell.is() ) |
| continue; |
| |
| /* |
| const sal_Bool bIsMerged = xCell->isMerged(); |
| const sal_Int32 nRowSpan = xCell->getRowSpan(); |
| const sal_Int32 nColSpan = xCell->getColumnSpan(); |
| |
| const sal_Char* pChar; |
| |
| if( !bIsMerged && ((nRowSpan > 1) || (nColSpan > 1)) ) |
| mrStrm << OOO_STRING_SVTOOLS_RTF_CLMGF; // The first cell in a range of table cells to be merged. |
| |
| SdrTextVertAdjust eVAdj = xCell->GetTextVerticalAdjust(); |
| switch( eVAdj ) |
| { |
| 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 ) |
| mrStrm << pChar; |
| */ |
| mrStrm << OOO_STRING_SVTOOLS_RTF_CELLX << ByteString::CreateFromInt32( aColumnStart[nCol] ).GetBuffer(); |
| if ( (nCol & 0x0F) == 0x0F ) |
| mrStrm << RTFOutFuncs::sNewLine; // Zeilen nicht zu lang werden lassen |
| } |
| mrStrm << OOO_STRING_SVTOOLS_RTF_PARD << OOO_STRING_SVTOOLS_RTF_PLAIN << OOO_STRING_SVTOOLS_RTF_INTBL << RTFOutFuncs::sNewLine; |
| |
| sal_uLong nStrmPos = mrStrm.Tell(); |
| for( sal_Int32 nCol = 0; nCol < nColCount; nCol++ ) |
| { |
| WriteCell( nCol, nRow ); |
| if ( mrStrm.Tell() - nStrmPos > 255 ) |
| { |
| mrStrm << RTFOutFuncs::sNewLine; |
| nStrmPos = mrStrm.Tell(); |
| } |
| } |
| mrStrm << OOO_STRING_SVTOOLS_RTF_ROW << RTFOutFuncs::sNewLine; |
| } |
| |
| |
| void SdrTableRtfExporter::WriteCell( sal_Int32 nCol, sal_Int32 nRow ) |
| { |
| CellRef xCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nCol, nRow ).get() ) ); |
| |
| if( !xCell.is() || xCell->isMerged() ) |
| { |
| mrStrm << OOO_STRING_SVTOOLS_RTF_CELL; |
| return ; |
| } |
| |
| String aContent; |
| |
| OutlinerParaObject* pParaObj = xCell->GetEditOutlinerParaObject(); |
| bool bOwnParaObj = pParaObj != 0; |
| |
| if( pParaObj == 0 ) |
| pParaObj = xCell->GetOutlinerParaObject(); |
| |
| if(pParaObj) |
| { |
| // handle outliner attributes |
| SdrOutliner& rOutliner = mrObj.ImpGetDrawOutliner(); |
| rOutliner.SetText(*pParaObj); |
| |
| aContent = rOutliner.GetEditEngine().GetText( LINEEND_LF ); |
| |
| rOutliner.Clear(); |
| |
| if( bOwnParaObj ) |
| delete pParaObj; |
| } |
| |
| bool bResetPar, bResetAttr; |
| bResetPar = bResetAttr = sal_False; |
| |
| SdrTextHorzAdjust eHAdj = xCell->GetTextHorizontalAdjust(); |
| |
| const SfxItemSet& rCellSet = xCell->GetItemSet(); |
| |
| const SvxWeightItem& rWeightItem = (const SvxWeightItem&) rCellSet.Get( EE_CHAR_WEIGHT ); |
| const SvxPostureItem& rPostureItem = (const SvxPostureItem&) rCellSet.Get( EE_CHAR_ITALIC ); |
| const SvxUnderlineItem& rUnderlineItem = (const SvxUnderlineItem&) rCellSet.Get( EE_CHAR_UNDERLINE ); |
| |
| const sal_Char* pChar; |
| |
| switch( eHAdj ) |
| { |
| case SDRTEXTHORZADJUST_CENTER: pChar = OOO_STRING_SVTOOLS_RTF_QC; break; |
| case SDRTEXTHORZADJUST_BLOCK: pChar = OOO_STRING_SVTOOLS_RTF_QJ; break; |
| case SDRTEXTHORZADJUST_RIGHT: pChar = OOO_STRING_SVTOOLS_RTF_QR; break; |
| case SDRTEXTHORZADJUST_LEFT: |
| default: pChar = OOO_STRING_SVTOOLS_RTF_QL; break; |
| } |
| mrStrm << pChar; |
| |
| if ( rWeightItem.GetWeight() >= WEIGHT_BOLD ) |
| { // bold |
| bResetAttr = true; |
| mrStrm << OOO_STRING_SVTOOLS_RTF_B; |
| } |
| if ( rPostureItem.GetPosture() != ITALIC_NONE ) |
| { // italic |
| bResetAttr = true; |
| mrStrm << OOO_STRING_SVTOOLS_RTF_I; |
| } |
| if ( rUnderlineItem.GetLineStyle() != UNDERLINE_NONE ) |
| { // underline |
| bResetAttr = true; |
| mrStrm << OOO_STRING_SVTOOLS_RTF_UL; |
| } |
| |
| mrStrm << ' '; |
| RTFOutFuncs::Out_String( mrStrm, aContent ); |
| mrStrm << OOO_STRING_SVTOOLS_RTF_CELL; |
| |
| if ( bResetPar ) |
| mrStrm << OOO_STRING_SVTOOLS_RTF_PARD << OOO_STRING_SVTOOLS_RTF_INTBL; |
| if ( bResetAttr ) |
| mrStrm << OOO_STRING_SVTOOLS_RTF_PLAIN; |
| } |
| |
| } } |
| |