1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_svx.hxx" 26 27 #include <vector> 28 29 #include <com/sun/star/table/XTable.hpp> 30 #include <com/sun/star/beans/XPropertySet.hpp> 31 32 #include <tools/stream.hxx> 33 #include <svtools/rtfkeywd.hxx> 34 #include <svtools/rtfout.hxx> 35 36 #include <editeng/eeitem.hxx> 37 #include <svx/sdtaitm.hxx> 38 #include <editeng/wghtitem.hxx> 39 #include <editeng/postitem.hxx> 40 #include <editeng/udlnitem.hxx> 41 42 #include "cell.hxx" 43 #include "celltypes.hxx" 44 #include "svx/svdotable.hxx" 45 #include "svx/svdoutl.hxx" 46 #include "editeng/editeng.hxx" 47 #include "editeng/outlobj.hxx" 48 49 //#include <tablertfexporter.hxx> 50 51 using ::rtl::OUString; 52 using namespace ::com::sun::star::uno; 53 using namespace ::com::sun::star::table; 54 using namespace ::com::sun::star::container; 55 using namespace ::com::sun::star::beans; 56 57 namespace sdr { namespace table { 58 59 class SdrTableRtfExporter 60 { 61 public: 62 SdrTableRtfExporter( SvStream& rStrmP, SdrTableObj& rObj ); 63 sal_uLong Write(); 64 void WriteRow( const Reference< XPropertySet >& xRowSet, sal_Int32 nRow, const std::vector< sal_Int32 >& aColumnStart ); 65 void WriteCell( sal_Int32 nCol, sal_Int32 nRow ); 66 67 private: 68 SvStream& mrStrm; 69 SdrTableObj& mrObj; 70 Reference< XTable > mxTable; 71 const OUString msSize; 72 }; 73 74 void SdrTableObj::ExportAsRTF( SvStream& rStrm, SdrTableObj& rObj ) 75 { 76 SdrTableRtfExporter aEx( rStrm, rObj ); 77 aEx.Write(); 78 } 79 80 SdrTableRtfExporter::SdrTableRtfExporter( SvStream& rStrm, SdrTableObj& rObj ) 81 : mrStrm( rStrm ) 82 , mrObj( rObj ) 83 , mxTable( rObj.getTable() ) 84 , msSize( RTL_CONSTASCII_USTRINGPARAM("Size") ) 85 { 86 } 87 88 long HundMMToTwips( long nIn ) 89 { 90 long nRet = OutputDevice::LogicToLogic( nIn, MAP_100TH_MM, MAP_TWIP ); 91 return nRet; 92 } 93 94 sal_uLong SdrTableRtfExporter::Write() 95 { 96 mrStrm << '{' << OOO_STRING_SVTOOLS_RTF_RTF; 97 mrStrm << OOO_STRING_SVTOOLS_RTF_ANSI << RTFOutFuncs::sNewLine; 98 99 Reference< XTableColumns > xColumns( mxTable->getColumns() ); 100 const sal_Int32 nColCount = xColumns->getCount(); 101 102 std::vector< sal_Int32 > aColumnStart; 103 aColumnStart.reserve( nColCount ); 104 105 // determine right offset of cells 106 sal_Int32 nPos = 0; 107 for( sal_Int32 nCol = 0; nCol < nColCount; nCol++ ) try 108 { 109 Reference< XPropertySet > xSet( xColumns->getByIndex(nCol), UNO_QUERY_THROW ); 110 sal_Int32 nWidth = 0; 111 xSet->getPropertyValue( msSize ) >>= nWidth; 112 nPos += HundMMToTwips( nWidth ); 113 aColumnStart.push_back( nPos ); 114 } 115 catch( Exception& e ) 116 { 117 (void)e; 118 DBG_ERROR("SdrTableRtfExporter::Write(), exception caught!"); 119 } 120 121 // export rows 122 Reference< XTableRows > xRows( mxTable->getRows() ); 123 const sal_Int32 nRowCount = xRows->getCount(); 124 125 for( sal_Int32 nRow = 0; nRow < nRowCount; nRow++ ) try 126 { 127 Reference< XPropertySet > xRowSet( xRows->getByIndex(nRow), UNO_QUERY_THROW ); 128 WriteRow( xRowSet, nRow, aColumnStart ); 129 } 130 catch( Exception& e ) 131 { 132 (void)e; 133 DBG_ERROR("SdrTableRtfExporter::Write(), exception caught!"); 134 } 135 136 mrStrm << '}' << RTFOutFuncs::sNewLine; 137 return mrStrm.GetError(); 138 } 139 140 void SdrTableRtfExporter::WriteRow( const Reference< XPropertySet >& xRowSet, sal_Int32 nRow, const std::vector< sal_Int32 >& aColumnStart ) 141 { 142 sal_Int32 nRowHeight = 0; 143 xRowSet->getPropertyValue( msSize ) >>= nRowHeight; 144 145 mrStrm << OOO_STRING_SVTOOLS_RTF_TROWD << OOO_STRING_SVTOOLS_RTF_TRGAPH << "30" << OOO_STRING_SVTOOLS_RTF_TRLEFT << "-30"; 146 mrStrm << OOO_STRING_SVTOOLS_RTF_TRRH << ByteString::CreateFromInt32( nRowHeight ).GetBuffer(); 147 148 const sal_Int32 nColCount = mxTable->getColumnCount(); 149 for( sal_Int32 nCol = 0; nCol < nColCount; nCol++ ) 150 { 151 CellRef xCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nCol, nRow ).get() ) ); 152 153 if( !xCell.is() ) 154 continue; 155 156 /* 157 const sal_Bool bIsMerged = xCell->isMerged(); 158 const sal_Int32 nRowSpan = xCell->getRowSpan(); 159 const sal_Int32 nColSpan = xCell->getColumnSpan(); 160 161 const sal_Char* pChar; 162 163 if( !bIsMerged && ((nRowSpan > 1) || (nColSpan > 1)) ) 164 mrStrm << OOO_STRING_SVTOOLS_RTF_CLMGF; // The first cell in a range of table cells to be merged. 165 166 SdrTextVertAdjust eVAdj = xCell->GetTextVerticalAdjust(); 167 switch( eVAdj ) 168 { 169 case SVX_VER_JUSTIFY_TOP: pChar = OOO_STRING_SVTOOLS_RTF_CLVERTALT; break; 170 case SVX_VER_JUSTIFY_CENTER: pChar = OOO_STRING_SVTOOLS_RTF_CLVERTALC; break; 171 case SVX_VER_JUSTIFY_BOTTOM: pChar = OOO_STRING_SVTOOLS_RTF_CLVERTALB; break; 172 case SVX_VER_JUSTIFY_STANDARD: pChar = OOO_STRING_SVTOOLS_RTF_CLVERTALB; break; //! Bottom 173 default: pChar = NULL; break; 174 } 175 if ( pChar ) 176 mrStrm << pChar; 177 */ 178 mrStrm << OOO_STRING_SVTOOLS_RTF_CELLX << ByteString::CreateFromInt32( aColumnStart[nCol] ).GetBuffer(); 179 if ( (nCol & 0x0F) == 0x0F ) 180 mrStrm << RTFOutFuncs::sNewLine; // Zeilen nicht zu lang werden lassen 181 } 182 mrStrm << OOO_STRING_SVTOOLS_RTF_PARD << OOO_STRING_SVTOOLS_RTF_PLAIN << OOO_STRING_SVTOOLS_RTF_INTBL << RTFOutFuncs::sNewLine; 183 184 sal_uLong nStrmPos = mrStrm.Tell(); 185 for( sal_Int32 nCol = 0; nCol < nColCount; nCol++ ) 186 { 187 WriteCell( nCol, nRow ); 188 if ( mrStrm.Tell() - nStrmPos > 255 ) 189 { 190 mrStrm << RTFOutFuncs::sNewLine; 191 nStrmPos = mrStrm.Tell(); 192 } 193 } 194 mrStrm << OOO_STRING_SVTOOLS_RTF_ROW << RTFOutFuncs::sNewLine; 195 } 196 197 198 void SdrTableRtfExporter::WriteCell( sal_Int32 nCol, sal_Int32 nRow ) 199 { 200 CellRef xCell( dynamic_cast< Cell* >( mxTable->getCellByPosition( nCol, nRow ).get() ) ); 201 202 if( !xCell.is() || xCell->isMerged() ) 203 { 204 mrStrm << OOO_STRING_SVTOOLS_RTF_CELL; 205 return ; 206 } 207 208 String aContent; 209 210 OutlinerParaObject* pParaObj = xCell->GetEditOutlinerParaObject(); 211 bool bOwnParaObj = pParaObj != 0; 212 213 if( pParaObj == 0 ) 214 pParaObj = xCell->GetOutlinerParaObject(); 215 216 if(pParaObj) 217 { 218 // handle outliner attributes 219 SdrOutliner& rOutliner = mrObj.ImpGetDrawOutliner(); 220 rOutliner.SetText(*pParaObj); 221 222 aContent = rOutliner.GetEditEngine().GetText( LINEEND_LF ); 223 224 rOutliner.Clear(); 225 226 if( bOwnParaObj ) 227 delete pParaObj; 228 } 229 230 bool bResetPar, bResetAttr; 231 bResetPar = bResetAttr = sal_False; 232 233 SdrTextHorzAdjust eHAdj = xCell->GetTextHorizontalAdjust(); 234 235 const SfxItemSet& rCellSet = xCell->GetItemSet(); 236 237 const SvxWeightItem& rWeightItem = (const SvxWeightItem&) rCellSet.Get( EE_CHAR_WEIGHT ); 238 const SvxPostureItem& rPostureItem = (const SvxPostureItem&) rCellSet.Get( EE_CHAR_ITALIC ); 239 const SvxUnderlineItem& rUnderlineItem = (const SvxUnderlineItem&) rCellSet.Get( EE_CHAR_UNDERLINE ); 240 241 const sal_Char* pChar; 242 243 switch( eHAdj ) 244 { 245 case SDRTEXTHORZADJUST_CENTER: pChar = OOO_STRING_SVTOOLS_RTF_QC; break; 246 case SDRTEXTHORZADJUST_BLOCK: pChar = OOO_STRING_SVTOOLS_RTF_QJ; break; 247 case SDRTEXTHORZADJUST_RIGHT: pChar = OOO_STRING_SVTOOLS_RTF_QR; break; 248 case SDRTEXTHORZADJUST_LEFT: 249 default: pChar = OOO_STRING_SVTOOLS_RTF_QL; break; 250 } 251 mrStrm << pChar; 252 253 if ( rWeightItem.GetWeight() >= WEIGHT_BOLD ) 254 { // bold 255 bResetAttr = true; 256 mrStrm << OOO_STRING_SVTOOLS_RTF_B; 257 } 258 if ( rPostureItem.GetPosture() != ITALIC_NONE ) 259 { // italic 260 bResetAttr = true; 261 mrStrm << OOO_STRING_SVTOOLS_RTF_I; 262 } 263 if ( rUnderlineItem.GetLineStyle() != UNDERLINE_NONE ) 264 { // underline 265 bResetAttr = true; 266 mrStrm << OOO_STRING_SVTOOLS_RTF_UL; 267 } 268 269 mrStrm << ' '; 270 RTFOutFuncs::Out_String( mrStrm, aContent ); 271 mrStrm << OOO_STRING_SVTOOLS_RTF_CELL; 272 273 if ( bResetPar ) 274 mrStrm << OOO_STRING_SVTOOLS_RTF_PARD << OOO_STRING_SVTOOLS_RTF_INTBL; 275 if ( bResetAttr ) 276 mrStrm << OOO_STRING_SVTOOLS_RTF_PLAIN; 277 } 278 279 } } 280 281