xref: /AOO41X/main/dbaccess/source/ui/misc/RtfReader.cxx (revision 96de54900b79e13b861fbc62cbf36018b54e21b7)
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_dbaccess.hxx"
26 #include "RtfReader.hxx"
27 #include <tools/debug.hxx>
28 #include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp>
29 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
30 #include <com/sun/star/sdbcx/XAppend.hpp>
31 #include <com/sun/star/sdbc/DataType.hpp>
32 #include <com/sun/star/sdbc/ColumnValue.hpp>
33 #include <com/sun/star/awt/FontDescriptor.hpp>
34 #include <com/sun/star/awt/FontWeight.hpp>
35 #include <com/sun/star/awt/FontStrikeout.hpp>
36 #include <com/sun/star/awt/FontSlant.hpp>
37 #include <com/sun/star/awt/FontUnderline.hpp>
38 #include <com/sun/star/util/NumberFormat.hpp>
39 #include <com/sun/star/util/XNumberFormatTypes.hpp>
40 #include "dbustrings.hrc"
41 #include <svtools/rtftoken.h>
42 #include "dbu_misc.hrc"
43 #include <vcl/msgbox.hxx>
44 #include <connectivity/dbconversion.hxx>
45 #include <connectivity/dbtools.hxx>
46 #include <comphelper/extract.hxx>
47 #include <tools/color.hxx>
48 #include "WExtendPages.hxx"
49 #include "moduledbu.hxx"
50 #include "QEnumTypes.hxx"
51 #include "UITools.hxx"
52 #include <vcl/svapp.hxx>
53 #include <rtl/logfile.hxx>
54 
55 using namespace dbaui;
56 using namespace ::com::sun::star::uno;
57 using namespace ::com::sun::star::beans;
58 using namespace ::com::sun::star::container;
59 using namespace ::com::sun::star::sdbc;
60 using namespace ::com::sun::star::sdbcx;
61 using namespace ::com::sun::star::awt;
62 
DBG_NAME(ORTFReader)63 DBG_NAME(ORTFReader)
64 // ==========================================================================
65 // ORTFReader
66 // ==========================================================================
67 ORTFReader::ORTFReader( SvStream& rIn,
68                         const SharedConnection& _rxConnection,
69                         const Reference< ::com::sun::star::util::XNumberFormatter >& _rxNumberF,
70                         const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rM,
71                         const TColumnVector* pList,
72                         const OTypeInfoMap* _pInfoMap)
73     :SvRTFParser(rIn)
74     ,ODatabaseExport( _rxConnection, _rxNumberF, _rM, pList, _pInfoMap, rIn )
75 {
76     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORTFReader::ORTFReader" );
77     DBG_CTOR(ORTFReader,NULL);
78     m_bAppendFirstLine = false;
79 }
80 // ---------------------------------------------------------------------------
ORTFReader(SvStream & rIn,sal_Int32 nRows,const TPositions & _rColumnPositions,const Reference<::com::sun::star::util::XNumberFormatter> & _rxNumberF,const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & _rM,const TColumnVector * pList,const OTypeInfoMap * _pInfoMap,sal_Bool _bAutoIncrementEnabled)81 ORTFReader::ORTFReader(SvStream& rIn,
82                        sal_Int32 nRows,
83                        const TPositions &_rColumnPositions,
84                        const Reference< ::com::sun::star::util::XNumberFormatter >& _rxNumberF,
85                        const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rM,
86                        const TColumnVector* pList,
87                        const OTypeInfoMap* _pInfoMap,
88                        sal_Bool _bAutoIncrementEnabled)
89    :SvRTFParser(rIn)
90    ,ODatabaseExport( nRows, _rColumnPositions, _rxNumberF, _rM, pList, _pInfoMap, _bAutoIncrementEnabled, rIn )
91 {
92     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORTFReader::ORTFReader" );
93     DBG_CTOR(ORTFReader,NULL);
94     m_bAppendFirstLine = false;
95 }
96 // ---------------------------------------------------------------------------
~ORTFReader()97 ORTFReader::~ORTFReader()
98 {
99     DBG_DTOR(ORTFReader,NULL);
100 }
101 // ---------------------------------------------------------------------------
CallParser()102 SvParserState ORTFReader::CallParser()
103 {
104     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORTFReader::CallParser" );
105     DBG_CHKTHIS(ORTFReader,NULL);
106     rInput.Seek(STREAM_SEEK_TO_BEGIN);
107     rInput.ResetError();
108     SvParserState  eParseState = SvRTFParser::CallParser();
109     SetColumnTypes(m_pColumnList,m_pInfoMap);
110     return m_bFoundTable ? eParseState : SVPAR_ERROR;
111 }
112 // ---------------------------------------------------------------------------
NextToken(int nToken)113 void ORTFReader::NextToken( int nToken )
114 {
115     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORTFReader::NextToken" );
116     DBG_CHKTHIS(ORTFReader,NULL);
117     if(m_bError || !m_nRows) // falls Fehler oder keine Rows mehr zur "Uberpr"ufung dann gleich zur"uck
118         return;
119 
120     if(m_xConnection.is())    // gibt an welcher CTOR gerufen wurde und damit, ob eine Tabelle erstellt werden soll
121     {
122         switch(nToken)
123         {
124             case RTF_COLORTBL:
125                 {
126 
127                     int nTmpToken2 = GetNextToken();
128                     sal_Bool bNext = sal_True;
129                     do
130                     {
131                         Color aColor;
132                         do
133                         {
134                             switch(nTmpToken2)
135                             {
136                                 case RTF_RED:   aColor.SetRed((sal_uInt8)nTokenValue); break;
137                                 case RTF_BLUE:  aColor.SetBlue((sal_uInt8)nTokenValue); break;
138                                 case RTF_GREEN: aColor.SetGreen((sal_uInt8)nTokenValue); break;
139                                 default:
140                                     bNext = sal_False;
141                             }
142                             nTmpToken2 = GetNextToken();
143                         }
144                         while(aToken.GetChar(0) != ';' && eState != SVPAR_ERROR && eState != SVPAR_ACCEPTED);
145                         m_vecColor.push_back(aColor.GetRGBColor());
146                         nTmpToken2 = GetNextToken();
147                     }
148                     while(nTmpToken2 == RTF_RED && eState != SVPAR_ERROR && eState != SVPAR_ACCEPTED);
149                     SkipToken();
150                 }
151                 break;
152 
153             case RTF_DEFLANG:
154             case RTF_LANG: // Sprache abfragen
155                 m_nDefToken = (rtl_TextEncoding)nTokenValue;
156                 break;
157             case RTF_TROWD:
158                 {
159                     bool bInsertRow = true;
160                     if ( !m_xTable.is() ) // erste Zeile als Header verwenden
161                     {
162                         sal_uInt32 nTell = rInput.Tell(); // ver�ndert vielleicht die Position des Streams
163 
164                         m_bError = !CreateTable(nToken);
165                         bInsertRow = m_bAppendFirstLine;
166                         if ( m_bAppendFirstLine )
167                         {
168                             rInput.Seek(nTell);
169                             rInput.ResetError();
170                         }
171                     }
172                     if ( bInsertRow && !m_bError)
173                     {
174                         try
175                         {
176                             m_pUpdateHelper->moveToInsertRow(); // sonst neue Zeile anh"angen
177                         }
178                         catch(SQLException& e)
179                         // UpdateFehlerbehandlung
180                         {
181                             showErrorDialog(e);
182                         }
183                     }
184                 }
185                 break;
186             case RTF_INTBL:
187                 if(m_bInTbl)
188                 {
189                     eraseTokens();
190                 }
191 
192                 m_bInTbl = sal_True; // jetzt befinden wir uns in einer Tabellenbeschreibung
193                 break;
194             case RTF_TEXTTOKEN:
195             case RTF_SINGLECHAR:
196                 if(m_bInTbl) // wichtig, da wir sonst auch die Namen der Fonts bekommen
197                     m_sTextToken += aToken;
198                 break;
199             case RTF_CELL:
200                 {
201                     try
202                     {
203                         insertValueIntoColumn();
204                     }
205                     catch(SQLException& e)
206                     // UpdateFehlerbehandlung
207                     {
208                         showErrorDialog(e);
209                     }
210                     m_nColumnPos++;
211                     eraseTokens();
212                 }
213                 break;
214             case RTF_ROW:
215                 // es kann vorkommen, da� die letzte Celle nicht mit \cell abgeschlossen ist
216                 try
217                 {
218                     insertValueIntoColumn();
219                     m_nRowCount++;
220                     if(m_bIsAutoIncrement) // if bSetAutoIncrement then I have to set the autoincrement
221                         m_pUpdateHelper->updateInt(1,m_nRowCount);
222                     m_pUpdateHelper->insertRow();
223                 }
224                 catch(SQLException& e)
225                 //////////////////////////////////////////////////////////////////////
226                 // UpdateFehlerbehandlung
227                 {
228                     showErrorDialog(e);
229                 }
230                 m_nColumnPos = 0;
231                 break;
232         }
233     }
234     else // Zweig nur f"ur Typpr"ufung g"ultig
235     {
236         switch(nToken)
237         {
238             case RTF_TROWD:
239                 // Der Spalten Kopf z"ahlt nicht mit
240                 if(m_bHead)
241                 {
242                     do
243                     {}
244                     while(GetNextToken() != RTF_ROW && eState != SVPAR_ERROR && eState != SVPAR_ACCEPTED);
245                     m_bHead = sal_False;
246                 }
247                 break;
248             case RTF_INTBL:
249                 m_bInTbl = sal_True;
250                 break;
251             case RTF_TEXTTOKEN:
252             case RTF_SINGLECHAR:
253                 if(m_bInTbl)
254                     m_sTextToken += aToken;
255                 break;
256             case RTF_CELL:
257                 adjustFormat();
258                 m_nColumnPos++;
259                 break;
260             case RTF_ROW:
261                 adjustFormat();
262                 m_nColumnPos = 0;
263                 m_nRows--;
264                 break;
265         }
266     }
267 }
268 // ---------------------------------------------------------------------------
CreateTable(int nToken)269 sal_Bool ORTFReader::CreateTable(int nToken)
270 {
271     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORTFReader::CreateTable" );
272     DBG_CHKTHIS(ORTFReader,NULL);
273     String aTableName(ModuleRes(STR_TBL_TITLE));
274     aTableName = aTableName.GetToken(0,' ');
275     aTableName = String(::dbtools::createUniqueName(m_xTables,::rtl::OUString(aTableName)));
276 
277     int nTmpToken2 = nToken;
278     String aColumnName;
279 
280     FontDescriptor aFont = ::dbaui::CreateFontDescriptor(Application::GetSettings().GetStyleSettings().GetAppFont());
281     do
282     {
283         switch(nTmpToken2)
284         {
285             case RTF_UNKNOWNCONTROL:
286             case RTF_UNKNOWNDATA:
287                 m_bInTbl = sal_False;
288                 aColumnName.Erase();
289                 break;
290             case RTF_INTBL:
291                 if(m_bInTbl)
292                     aColumnName.Erase();
293 
294                 m_bInTbl = sal_True;
295                 break;
296             case RTF_TEXTTOKEN:
297             case RTF_SINGLECHAR:
298                 if(m_bInTbl)
299                     aColumnName += aToken;
300                 break;
301             case RTF_CELL:
302                 {
303                     aColumnName.EraseLeadingChars();
304                     aColumnName.EraseTrailingChars();
305                     if (!aColumnName.Len() || m_bAppendFirstLine )
306                         aColumnName = String(ModuleRes(STR_COLUMN_NAME));
307 
308                     CreateDefaultColumn(aColumnName);
309                     aColumnName.Erase();
310                 }
311                 break;
312             case RTF_CF:
313                 //  if(nTokenValue < m_vecColor.size())
314                     //  m_xTable->setPropertyValue(PROPERTY_TEXTCOLOR,makeAny(m_vecColor[nTokenValue]));
315                 break;
316             case RTF_B:
317                 aFont.Weight = ::com::sun::star::awt::FontWeight::BOLD;
318                 break;
319             case RTF_I:
320                 aFont.Slant = ::com::sun::star::awt::FontSlant_ITALIC;
321                 break;
322             case RTF_UL:
323                 aFont.Underline = ::com::sun::star::awt::FontUnderline::SINGLE;
324                 break;
325             case RTF_STRIKE:
326                 aFont.Strikeout = ::com::sun::star::awt::FontStrikeout::SINGLE;
327                 break;
328         }
329     }
330     while((nTmpToken2 = GetNextToken()) != RTF_TROWD && eState != SVPAR_ERROR && eState != SVPAR_ACCEPTED);
331 
332     sal_Bool bOk = !m_vDestVector.empty();
333     if(bOk)
334     {
335         if ( aColumnName.Len() )
336         {
337             if ( m_bAppendFirstLine )
338                 aColumnName = String(ModuleRes(STR_COLUMN_NAME));
339             CreateDefaultColumn(aColumnName);
340         }
341 
342         m_bInTbl        = sal_False;
343         m_bFoundTable   = sal_True;
344 
345         if ( isCheckEnabled() )
346             return sal_True;
347         Any aTextColor;
348         if(!m_vecColor.empty())
349             aTextColor <<= m_vecColor[0];
350 
351         bOk = !executeWizard(aTableName,aTextColor,aFont) && m_xTable.is();
352     }
353     return bOk;
354 }
355 // -----------------------------------------------------------------------------
release()356 void ORTFReader::release()
357 {
358     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORTFReader::release" );
359     DBG_CHKTHIS(ORTFReader,NULL);
360     ReleaseRef();
361 }
362 
363 // -----------------------------------------------------------------------------
getTypeSelectionPageFactory()364 TypeSelectionPageFactory ORTFReader::getTypeSelectionPageFactory()
365 {
366     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORTFReader::getTypeSelectionPageFactory" );
367     DBG_CHKTHIS(ORTFReader,NULL);
368     return &OWizRTFExtend::Create;
369 }
370 // -----------------------------------------------------------------------------
371 
372 
373 
374