xref: /AOO41X/main/svx/source/table/tablertfexporter.cxx (revision f6e50924346d0b8c0b07c91832a97665dd718b0c)
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 
ExportAsRTF(SvStream & rStrm,SdrTableObj & rObj)74 void SdrTableObj::ExportAsRTF( SvStream& rStrm, SdrTableObj& rObj )
75 {
76     SdrTableRtfExporter aEx( rStrm, rObj );
77     aEx.Write();
78 }
79 
SdrTableRtfExporter(SvStream & rStrm,SdrTableObj & rObj)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 
HundMMToTwips(long nIn)88 long HundMMToTwips( long nIn )
89 {
90     long nRet = OutputDevice::LogicToLogic( nIn, MAP_100TH_MM, MAP_TWIP );
91     return nRet;
92 }
93 
Write()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 
WriteRow(const Reference<XPropertySet> & xRowSet,sal_Int32 nRow,const std::vector<sal_Int32> & aColumnStart)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 
WriteCell(sal_Int32 nCol,sal_Int32 nRow)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