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 "TokenWriter.hxx" 27 #include <tools/debug.hxx> 28 #include <tools/diagnose_ex.h> 29 #include "RtfReader.hxx" 30 #include "HtmlReader.hxx" 31 #include "dbustrings.hrc" 32 #include <connectivity/dbtools.hxx> 33 #include <comphelper/types.hxx> 34 #include <com/sun/star/sdbc/XConnection.hpp> 35 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp> 36 #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp> 37 #include <com/sun/star/sdbc/XRowSet.hpp> 38 #include <com/sun/star/sdbcx/XTablesSupplier.hpp> 39 #include <com/sun/star/sdb/XQueriesSupplier.hpp> 40 #include <com/sun/star/sdbc/XDataSource.hpp> 41 #include <com/sun/star/awt/FontWeight.hpp> 42 #include <com/sun/star/awt/FontStrikeout.hpp> 43 #include <com/sun/star/awt/FontSlant.hpp> 44 #include <com/sun/star/awt/FontUnderline.hpp> 45 #include <com/sun/star/document/XDocumentProperties.hpp> 46 #include <svtools/htmlkywd.hxx> 47 #include <svtools/rtfkeywd.hxx> 48 #include <tools/color.hxx> 49 #include <svtools/htmlout.hxx> 50 #include <sfx2/frmhtmlw.hxx> 51 #include <svl/numuno.hxx> 52 #include <vcl/svapp.hxx> 53 #include "UITools.hxx" 54 #include <toolkit/helper/vclunohelper.hxx> 55 #include <vcl/outdev.hxx> 56 #include <svtools/rtfout.hxx> 57 #include <svtools/htmlcfg.hxx> 58 #include <connectivity/formattedcolumnvalue.hxx> 59 #include <unotools/syslocale.hxx> 60 #include <comphelper/componentcontext.hxx> 61 #include <rtl/logfile.hxx> 62 63 using namespace dbaui; 64 using namespace dbtools; 65 using namespace svx; 66 using namespace ::com::sun::star; 67 using namespace ::com::sun::star::uno; 68 using namespace ::com::sun::star::beans; 69 using namespace ::com::sun::star::container; 70 using namespace ::com::sun::star::sdbc; 71 using namespace ::com::sun::star::sdb; 72 using namespace ::com::sun::star::frame; 73 using namespace ::com::sun::star::lang; 74 using namespace ::com::sun::star::sdbcx; 75 using namespace ::com::sun::star::awt; 76 using namespace ::com::sun::star::util; 77 using ::com::sun::star::frame::XModel; 78 79 #if defined(UNX) 80 const char __FAR_DATA ODatabaseImportExport::sNewLine = '\012'; 81 #else 82 const char __FAR_DATA ODatabaseImportExport::sNewLine[] = "\015\012"; 83 #endif 84 85 const static char __FAR_DATA sMyBegComment[] = "<!-- "; 86 const static char __FAR_DATA sMyEndComment[] = " -->"; 87 const static char __FAR_DATA sFontFamily[] = "font-family: "; 88 const static char __FAR_DATA sFontSize[] = "font-size: "; 89 90 #define SBA_FORMAT_SELECTION_COUNT 4 91 #define CELL_X 1437 92 93 DBG_NAME(ODatabaseImportExport) 94 //====================================================================== 95 ODatabaseImportExport::ODatabaseImportExport(const ::svx::ODataAccessDescriptor& _aDataDescriptor, 96 const Reference< XMultiServiceFactory >& _rM, 97 const Reference< ::com::sun::star::util::XNumberFormatter >& _rxNumberF, 98 const String& rExchange) 99 :m_bBookmarkSelection( sal_False ) 100 ,m_xFormatter(_rxNumberF) 101 ,m_xFactory(_rM) 102 ,m_nCommandType(CommandType::TABLE) 103 ,m_bNeedToReInitialize(sal_False) 104 ,m_pReader(NULL) 105 ,m_pRowMarker(NULL) 106 ,m_bInInitialize(sal_False) 107 ,m_bCheckOnly(sal_False) 108 { 109 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ODatabaseImportExport::ODatabaseImportExport" ); 110 DBG_CTOR(ODatabaseImportExport,NULL); 111 112 m_eDestEnc = osl_getThreadTextEncoding(); 113 114 osl_incrementInterlockedCount( &m_refCount ); 115 impl_initFromDescriptor( _aDataDescriptor, false ); 116 117 xub_StrLen nCount = rExchange.GetTokenCount(char(11)); 118 if( nCount > SBA_FORMAT_SELECTION_COUNT && rExchange.GetToken(4).Len()) 119 { 120 m_pRowMarker = new sal_Int32[nCount-SBA_FORMAT_SELECTION_COUNT]; 121 for(xub_StrLen i=SBA_FORMAT_SELECTION_COUNT;i<nCount;++i) 122 m_pRowMarker[i-SBA_FORMAT_SELECTION_COUNT] = rExchange.GetToken(i,char(11)).ToInt32(); 123 } 124 osl_decrementInterlockedCount( &m_refCount ); 125 } 126 // ----------------------------------------------------------------------------- 127 // import data 128 ODatabaseImportExport::ODatabaseImportExport( const ::dbtools::SharedConnection& _rxConnection, 129 const Reference< XNumberFormatter >& _rxNumberF, const Reference< XMultiServiceFactory >& _rM ) 130 :m_bBookmarkSelection( sal_False ) 131 ,m_xConnection(_rxConnection) 132 ,m_xFormatter(_rxNumberF) 133 ,m_xFactory(_rM) 134 ,m_nCommandType(::com::sun::star::sdb::CommandType::TABLE) 135 ,m_bNeedToReInitialize(sal_False) 136 ,m_pReader(NULL) 137 ,m_pRowMarker(NULL) 138 ,m_bInInitialize(sal_False) 139 ,m_bCheckOnly(sal_False) 140 { 141 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ODatabaseImportExport::ODatabaseImportExport" ); 142 DBG_CTOR(ODatabaseImportExport,NULL); 143 m_eDestEnc = osl_getThreadTextEncoding(); 144 try 145 { 146 SvtSysLocale aSysLocale; 147 m_aLocale = aSysLocale.GetLocaleData().getLocale(); 148 } 149 catch(Exception&) 150 { 151 } 152 } 153 //------------------------------------------------------------------- 154 ODatabaseImportExport::~ODatabaseImportExport() 155 { 156 DBG_DTOR(ODatabaseImportExport,NULL); 157 acquire(); 158 159 dispose(); 160 161 if(m_pReader) 162 m_pReader->release(); 163 delete m_pRowMarker; 164 } 165 // ----------------------------------------------------------------------------- 166 void ODatabaseImportExport::dispose() 167 { 168 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ODatabaseImportExport::disposing" ); 169 DBG_CHKTHIS(ODatabaseImportExport,NULL); 170 // remove me as listener 171 Reference< XComponent > xComponent(m_xConnection, UNO_QUERY); 172 if (xComponent.is()) 173 { 174 Reference< XEventListener> xEvt((::cppu::OWeakObject*)this,UNO_QUERY); 175 xComponent->removeEventListener(xEvt); 176 } 177 m_xConnection.clear(); 178 179 ::comphelper::disposeComponent(m_xRow); 180 181 m_xObject.clear(); 182 m_xResultSetMetaData.clear(); 183 m_xResultSet.clear(); 184 m_xRow.clear(); 185 m_xRowLocate.clear(); 186 m_xFormatter.clear(); 187 } 188 // ----------------------------------------------------------------------------- 189 void SAL_CALL ODatabaseImportExport::disposing( const EventObject& Source ) throw(::com::sun::star::uno::RuntimeException) 190 { 191 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ODatabaseImportExport::disposing" ); 192 DBG_CHKTHIS(ODatabaseImportExport,NULL); 193 Reference<XConnection> xCon(Source.Source,UNO_QUERY); 194 if(m_xConnection.is() && m_xConnection == xCon) 195 { 196 m_xConnection.clear(); 197 dispose(); 198 m_bNeedToReInitialize = true; 199 //if(!m_bInInitialize) 200 // initialize(); 201 } 202 } 203 // ----------------------------------------------------------------------------- 204 void ODatabaseImportExport::initialize( const ODataAccessDescriptor& _aDataDescriptor ) 205 { 206 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ODatabaseImportExport::initialize" ); 207 impl_initFromDescriptor( _aDataDescriptor, true ); 208 } 209 210 // ----------------------------------------------------------------------------- 211 void ODatabaseImportExport::impl_initFromDescriptor( const ODataAccessDescriptor& _aDataDescriptor, bool _bPlusDefaultInit) 212 { 213 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ODatabaseImportExport::impl_initFromDescriptor" ); 214 DBG_CHKTHIS(ODatabaseImportExport,NULL); 215 if ( !_bPlusDefaultInit ) 216 { 217 m_sDataSourceName = _aDataDescriptor.getDataSource(); 218 _aDataDescriptor[daCommandType] >>= m_nCommandType; 219 _aDataDescriptor[daCommand] >>= m_sName; 220 // some additonal information 221 if(_aDataDescriptor.has(daConnection)) 222 { 223 Reference< XConnection > xPureConn( _aDataDescriptor[daConnection], UNO_QUERY ); 224 m_xConnection.reset( xPureConn, SharedConnection::NoTakeOwnership ); 225 Reference< XEventListener> xEvt((::cppu::OWeakObject*)this,UNO_QUERY); 226 Reference< XComponent > xComponent(m_xConnection, UNO_QUERY); 227 if (xComponent.is() && xEvt.is()) 228 xComponent->addEventListener(xEvt); 229 } 230 231 if ( _aDataDescriptor.has( daSelection ) ) 232 _aDataDescriptor[ daSelection ] >>= m_aSelection; 233 234 if ( _aDataDescriptor.has( daBookmarkSelection ) ) 235 _aDataDescriptor[ daBookmarkSelection ] >>= m_bBookmarkSelection; 236 237 if ( _aDataDescriptor.has( daCursor ) ) 238 { 239 _aDataDescriptor[ daCursor ] >>= m_xResultSet; 240 m_xRowLocate.set( m_xResultSet, UNO_QUERY ); 241 } 242 243 if ( m_aSelection.getLength() != 0 ) 244 { 245 if ( !m_xResultSet.is() ) 246 { 247 OSL_ENSURE( false, "ODatabaseImportExport::impl_initFromDescriptor: selection without result set is nonsense!" ); 248 m_aSelection.realloc( 0 ); 249 } 250 } 251 252 if ( m_aSelection.getLength() != 0 ) 253 { 254 if ( m_bBookmarkSelection && !m_xRowLocate.is() ) 255 { 256 OSL_ENSURE( false, "ODatabaseImportExport::impl_initFromDescriptor: no XRowLocate -> no bookmars!" ); 257 m_aSelection.realloc( 0 ); 258 } 259 } 260 } 261 else 262 initialize(); 263 264 try 265 { 266 SvtSysLocale aSysLocale; 267 m_aLocale = aSysLocale.GetLocaleData().getLocale(); 268 } 269 catch(Exception&) 270 { 271 } 272 } 273 // ----------------------------------------------------------------------------- 274 void ODatabaseImportExport::initialize() 275 { 276 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ODatabaseImportExport::initialize" ); 277 DBG_CHKTHIS(ODatabaseImportExport,NULL); 278 m_bInInitialize = sal_True; 279 m_bNeedToReInitialize = false; 280 281 if ( !m_xConnection.is() ) 282 { // we need a connection 283 OSL_ENSURE(m_sDataSourceName.getLength(),"There must be a datsource name!"); 284 Reference<XNameAccess> xDatabaseContext = Reference< XNameAccess >(m_xFactory->createInstance(SERVICE_SDB_DATABASECONTEXT), UNO_QUERY); 285 Reference< XEventListener> xEvt((::cppu::OWeakObject*)this,UNO_QUERY); 286 287 Reference< XConnection > xConnection; 288 SQLExceptionInfo aInfo = ::dbaui::createConnection( m_sDataSourceName, xDatabaseContext, m_xFactory, xEvt, xConnection ); 289 m_xConnection.reset( xConnection ); 290 291 if(aInfo.isValid() && aInfo.getType() == SQLExceptionInfo::SQL_EXCEPTION) 292 throw *static_cast<const SQLException*>(aInfo); 293 } 294 295 Reference<XNameAccess> xNameAccess; 296 switch(m_nCommandType) 297 { 298 case CommandType::TABLE: 299 { 300 // only for tables 301 Reference<XTablesSupplier> xSup(m_xConnection,UNO_QUERY); 302 if(xSup.is()) 303 xNameAccess = xSup->getTables(); 304 } 305 break; 306 case CommandType::QUERY: 307 { 308 Reference<XQueriesSupplier> xSup(m_xConnection,UNO_QUERY); 309 if(xSup.is()) 310 xNameAccess = xSup->getQueries(); 311 } 312 break; 313 } 314 if(xNameAccess.is() && xNameAccess->hasByName(m_sName)) 315 { 316 Reference<XPropertySet> xSourceObject; 317 xNameAccess->getByName(m_sName) >>= m_xObject; 318 } 319 320 if(m_xObject.is()) 321 { 322 try 323 { 324 if(m_xObject->getPropertySetInfo()->hasPropertyByName(PROPERTY_FONT)) 325 m_xObject->getPropertyValue(PROPERTY_FONT) >>= m_aFont; 326 327 // the result set may be already set with the datadescriptor 328 if ( !m_xResultSet.is() ) 329 { 330 m_xResultSet.set( m_xFactory->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.sdb.RowSet" ) ), UNO_QUERY ); 331 Reference< XPropertySet > xProp( m_xResultSet, UNO_QUERY_THROW ); 332 xProp->setPropertyValue( PROPERTY_ACTIVE_CONNECTION, makeAny( m_xConnection.getTyped() ) ); 333 xProp->setPropertyValue( PROPERTY_COMMAND_TYPE, makeAny( m_nCommandType ) ); 334 xProp->setPropertyValue( PROPERTY_COMMAND, makeAny( m_sName ) ); 335 Reference< XRowSet > xRowSet( xProp, UNO_QUERY ); 336 xRowSet->execute(); 337 } 338 impl_initializeRowMember_throw(); 339 } 340 catch(Exception& ) 341 { 342 m_xRow = NULL; 343 m_xResultSetMetaData = NULL; 344 ::comphelper::disposeComponent(m_xResultSet); 345 throw; 346 } 347 } 348 if ( !m_aFont.Name.getLength() ) 349 { 350 Font aApplicationFont = OutputDevice::GetDefaultFont( 351 DEFAULTFONT_SANS_UNICODE, 352 Application::GetSettings().GetUILanguage(), 353 DEFAULTFONT_FLAGS_ONLYONE 354 ); 355 m_aFont = VCLUnoHelper::CreateFontDescriptor( aApplicationFont ); 356 } 357 358 m_bInInitialize = sal_False; 359 } 360 // ----------------------------------------------------------------------------- 361 sal_Bool ODatabaseImportExport::Write() 362 { 363 if ( m_bNeedToReInitialize ) 364 { 365 if ( !m_bInInitialize ) 366 initialize(); 367 } // if ( m_bNeedToReInitialize ) 368 return sal_True; 369 } 370 // ----------------------------------------------------------------------------- 371 sal_Bool ODatabaseImportExport::Read() 372 { 373 if ( m_bNeedToReInitialize ) 374 { 375 if ( !m_bInInitialize ) 376 initialize(); 377 } // if ( m_bNeedToReInitialize ) 378 return sal_True; 379 } 380 // ----------------------------------------------------------------------------- 381 void ODatabaseImportExport::impl_initializeRowMember_throw() 382 { 383 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ODatabaseImportExport::impl_initializeRowMember_throw" ); 384 if ( !m_xRow.is() && m_xResultSet.is() ) 385 { 386 m_xRow.set( m_xResultSet, UNO_QUERY ); 387 m_xRowLocate.set( m_xResultSet, UNO_QUERY ); 388 m_xResultSetMetaData = Reference<XResultSetMetaDataSupplier>(m_xRow,UNO_QUERY)->getMetaData(); 389 Reference<XColumnsSupplier> xSup(m_xResultSet,UNO_QUERY_THROW); 390 m_xRowSetColumns.set(xSup->getColumns(),UNO_QUERY_THROW); 391 } 392 } 393 //====================================================================== 394 sal_Bool ORTFImportExport::Write() 395 { 396 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORTFImportExport::Write" ); 397 ODatabaseImportExport::Write(); 398 (*m_pStream) << '{' << OOO_STRING_SVTOOLS_RTF_RTF; 399 (*m_pStream) << OOO_STRING_SVTOOLS_RTF_ANSI << ODatabaseImportExport::sNewLine; 400 rtl_TextEncoding eDestEnc = RTL_TEXTENCODING_MS_1252; 401 402 /* 403 // Access RTF Export Beispiel 404 {\rtf1\ansi 405 {\colortbl\red0\green0\blue0;\red255\green255\blue255;\red192\green192\blue192;} 406 {\fonttbl\f0\fcharset0\fnil MS Sans Serif;\f1\fcharset0\fnil Arial;\f2\fcharset0\fnil Arial;} 407 \trowd\trgaph40 408 \clbrdrl\brdrs\brdrcf0\clbrdrt\brdrs\brdrcf0\clbrdrb\brdrs\brdrcf0\clbrdrr\brdrs\brdrcf0\clshdng10000\clcfpat2\cellx1437 409 \clbrdrl\brdrs\brdrcf0\clbrdrt\brdrs\brdrcf0\clbrdrb\brdrs\brdrcf0\clbrdrr\brdrs\brdrcf0\clshdng10000\clcfpat2\cellx2874 410 { 411 \trrh-270\pard\intbl 412 {\qc\fs20\b\f1\cf0\cb2 text\cell} 413 \pard\intbl 414 {\qc\fs20\b\f1\cf0\cb2 datum\cell} 415 \pard\intbl\row 416 } 417 \trowd\trgaph40\clbrdrl\brdrs\brdrcf2\clbrdrt\brdrs\brdrcf2\clbrdrb\brdrs\brdrcf2\clbrdrr\brdrs\brdrcf2\clshdng10000\clcfpat1\cellx1437\clbrdrl\brdrs\brdrcf2\clbrdrt\brdrs\brdrcf2\clbrdrb\brdrs\brdrcf2\clbrdrr\brdrs\brdrcf2\clshdng10000\clcfpat1\cellx2874 418 {\trrh-270\pard\intbl 419 {\ql\fs20\f2\cf0\cb1 heute\cell} 420 \pard\intbl 421 {\qr\fs20\f2\cf0\cb1 10.11.98\cell} 422 \pard\intbl\row 423 } 424 \trowd\trgaph40\clbrdrl\brdrs\brdrcf2\clbrdrt\brdrs\brdrcf2\clbrdrb\brdrs\brdrcf2\clbrdrr\brdrs\brdrcf2\clshdng10000\clcfpat1\cellx1437\clbrdrl\brdrs\brdrcf2\clbrdrt\brdrs\brdrcf2\clbrdrb\brdrs\brdrcf2\clbrdrr\brdrs\brdrcf2\clshdng10000\clcfpat1\cellx2874 425 {\trrh-270\pard\intbl 426 {\ql\fs20\f2\cf0\cb1 morgen\cell} 427 \pard\intbl 428 {\qr\fs20\f2\cf0\cb1 11.11.98\cell} 429 \pard\intbl\row 430 } 431 \trowd\trgaph40\clbrdrl\brdrs\brdrcf2\clbrdrt\brdrs\brdrcf2\clbrdrb\brdrs\brdrcf2\clbrdrr\brdrs\brdrcf2\clshdng10000\clcfpat1\cellx1437\clbrdrl\brdrs\brdrcf2\clbrdrt\brdrs\brdrcf2\clbrdrb\brdrs\brdrcf2\clbrdrr\brdrs\brdrcf2\clshdng10000\clcfpat1\cellx2874 432 {\trrh-270\pard\intbl 433 {\ql\fs20\f2\cf0\cb1 bruder\cell} 434 \pard\intbl 435 {\qr\fs20\f2\cf0\cb1 21.04.98\cell} 436 \pard\intbl\row 437 } 438 \trowd\trgaph40 439 \clbrdrl\brdrs\brdrcf2\clbrdrt\brdrs\brdrcf2\clbrdrb\brdrs\brdrcf2\clbrdrr\brdrs\brdrcf2\clshdng10000\clcfpat1\cellx 440 \clbrdrl\brdrs\brdrcf2\clbrdrt\brdrs\brdrcf2\clbrdrb\brdrs\brdrcf2\clbrdrr\brdrs\brdrcf2\clshdng10000\clcfpat1\cellx2874 441 {\trrh-270\pard\intbl 442 {\ql\fs20\f2\cf0\cb1 vater\cell} 443 \pard\intbl 444 {\qr\fs20\f2\cf0\cb1 28.06.98\cell} 445 \pard\intbl\row 446 } 447 } 448 */ 449 450 sal_Bool bBold = ( ::com::sun::star::awt::FontWeight::BOLD == m_aFont.Weight ); 451 sal_Bool bItalic = ( ::com::sun::star::awt::FontSlant_ITALIC == m_aFont.Slant ); 452 sal_Bool bUnderline = ( ::com::sun::star::awt::FontUnderline::NONE != m_aFont.Underline ); 453 sal_Bool bStrikeout = ( ::com::sun::star::awt::FontStrikeout::NONE != m_aFont.Strikeout ); 454 455 sal_Int32 nColor = 0; 456 if(m_xObject.is()) 457 m_xObject->getPropertyValue(PROPERTY_TEXTCOLOR) >>= nColor; 458 ::Color aColor(nColor); 459 460 ByteString aFonts(String(m_aFont.Name),eDestEnc); 461 if(!aFonts.Len()) 462 { 463 String aName = Application::GetSettings().GetStyleSettings().GetAppFont().GetName(); 464 aFonts = ByteString (aName,eDestEnc); 465 } 466 ::rtl::OString aFormat("\\fcharset0\\fnil "); 467 ByteString aFontNr; 468 469 (*m_pStream) << "{\\fonttbl"; 470 xub_StrLen nTokenCount = aFonts.GetTokenCount(); 471 for(xub_StrLen j=0;j<nTokenCount;++j) 472 { 473 (*m_pStream) << "\\f"; 474 m_pStream->WriteNumber(j); 475 (*m_pStream) << aFormat; 476 (*m_pStream) << aFonts.GetToken(j).GetBuffer(); 477 (*m_pStream) << ';'; 478 } 479 (*m_pStream) << '}' ; 480 (*m_pStream) << ODatabaseImportExport::sNewLine; 481 // write the rtf color table 482 (*m_pStream) << '{' << OOO_STRING_SVTOOLS_RTF_COLORTBL << OOO_STRING_SVTOOLS_RTF_RED; 483 m_pStream->WriteNumber(aColor.GetRed()); 484 (*m_pStream) << OOO_STRING_SVTOOLS_RTF_GREEN; 485 m_pStream->WriteNumber(aColor.GetGreen()); 486 (*m_pStream) << OOO_STRING_SVTOOLS_RTF_BLUE; 487 m_pStream->WriteNumber(aColor.GetBlue()); 488 489 (*m_pStream) << ";\\red255\\green255\\blue255;\\red192\\green192\\blue192;}" 490 << ODatabaseImportExport::sNewLine; 491 492 ::rtl::OString aTRRH("\\trrh-270\\pard\\intbl"); 493 ::rtl::OString aFS("\\fs20\\f0\\cf0\\cb2"); 494 ::rtl::OString aCell1("\\clbrdrl\\brdrs\\brdrcf0\\clbrdrt\\brdrs\\brdrcf0\\clbrdrb\\brdrs\\brdrcf0\\clbrdrr\\brdrs\\brdrcf0\\clshdng10000\\clcfpat2\\cellx"); 495 496 (*m_pStream) << OOO_STRING_SVTOOLS_RTF_TROWD << OOO_STRING_SVTOOLS_RTF_TRGAPH; 497 m_pStream->WriteNumber(40); 498 (*m_pStream) << ODatabaseImportExport::sNewLine; 499 500 if(m_xObject.is()) 501 { 502 Reference<XColumnsSupplier> xColSup(m_xObject,UNO_QUERY); 503 Reference<XNameAccess> xColumns = xColSup->getColumns(); 504 Sequence< ::rtl::OUString> aNames(xColumns->getElementNames()); 505 const ::rtl::OUString* pIter = aNames.getConstArray(); 506 507 sal_Int32 nCount = aNames.getLength(); 508 sal_Bool bUseResultMetaData = sal_False; 509 if ( !nCount ) 510 { 511 nCount = m_xResultSetMetaData->getColumnCount(); 512 bUseResultMetaData = sal_True; 513 } 514 515 for( sal_Int32 i=1; i<=nCount; ++i ) 516 { 517 (*m_pStream) << aCell1; 518 m_pStream->WriteNumber(i*CELL_X); 519 (*m_pStream) << ODatabaseImportExport::sNewLine; 520 } 521 522 // Spaltenbeschreibung 523 (*m_pStream) << '{' << ODatabaseImportExport::sNewLine; 524 (*m_pStream) << aTRRH; 525 526 527 ::rtl::OString* pHorzChar = new ::rtl::OString[nCount]; 528 529 for ( sal_Int32 i=1; i <= nCount; ++i ) 530 { 531 sal_Int32 nAlign = 0; 532 ::rtl::OUString sColumnName; 533 if ( bUseResultMetaData ) 534 sColumnName = m_xResultSetMetaData->getColumnName(i); 535 else 536 { 537 sColumnName = *pIter; 538 Reference<XPropertySet> xColumn; 539 xColumns->getByName(sColumnName) >>= xColumn; 540 xColumn->getPropertyValue(PROPERTY_ALIGN) >>= nAlign; 541 ++pIter; 542 } 543 544 const char* pChar; 545 switch( nAlign ) 546 { 547 case 1: pChar = OOO_STRING_SVTOOLS_RTF_QC; break; 548 case 2: pChar = OOO_STRING_SVTOOLS_RTF_QR; break; 549 case 0: 550 default:pChar = OOO_STRING_SVTOOLS_RTF_QL; break; 551 } 552 553 pHorzChar[i-1] = pChar; // um sp"ater nicht immer im ITEMSET zuw"uhlen 554 555 (*m_pStream) << ODatabaseImportExport::sNewLine; 556 (*m_pStream) << '{'; 557 (*m_pStream) << OOO_STRING_SVTOOLS_RTF_QC; // column header always centered 558 559 if ( bBold ) (*m_pStream) << OOO_STRING_SVTOOLS_RTF_B; 560 if ( bItalic ) (*m_pStream) << OOO_STRING_SVTOOLS_RTF_I; 561 if ( bUnderline ) (*m_pStream) << OOO_STRING_SVTOOLS_RTF_UL; 562 if ( bStrikeout ) (*m_pStream) << OOO_STRING_SVTOOLS_RTF_STRIKE; 563 564 (*m_pStream) << aFS; 565 (*m_pStream) << ' '; 566 RTFOutFuncs::Out_String(*m_pStream,sColumnName,eDestEnc); 567 568 (*m_pStream) << OOO_STRING_SVTOOLS_RTF_CELL; 569 (*m_pStream) << '}'; 570 (*m_pStream) << ODatabaseImportExport::sNewLine; 571 (*m_pStream) << OOO_STRING_SVTOOLS_RTF_PARD << OOO_STRING_SVTOOLS_RTF_INTBL; 572 } 573 574 (*m_pStream) << OOO_STRING_SVTOOLS_RTF_ROW; 575 (*m_pStream) << ODatabaseImportExport::sNewLine << '}'; 576 (*m_pStream) << ODatabaseImportExport::sNewLine; 577 578 ::comphelper::ComponentContext aContext(m_xFactory); 579 Reference< XRowSet > xRowSet(m_xRow,UNO_QUERY); 580 sal_Int32 k=1; 581 sal_Int32 kk=0; 582 if ( m_aSelection.getLength() ) 583 { 584 const Any* pSelIter = m_aSelection.getConstArray(); 585 const Any* pEnd = pSelIter + m_aSelection.getLength(); 586 587 sal_Bool bContinue = sal_True; 588 for( ; pSelIter != pEnd && bContinue; ++pSelIter ) 589 { 590 if ( m_bBookmarkSelection ) 591 { 592 bContinue = m_xRowLocate->moveToBookmark( *pSelIter ); 593 } 594 else 595 { 596 sal_Int32 nPos = -1; 597 OSL_VERIFY( *pSelIter >>= nPos ); 598 bContinue = ( m_xResultSet->absolute( nPos ) ); 599 } 600 601 if ( bContinue ) 602 appendRow( pHorzChar, nCount, k, kk ); 603 } 604 } 605 else 606 { 607 m_xResultSet->beforeFirst(); // set back before the first row 608 while(m_xResultSet->next()) 609 { 610 appendRow(pHorzChar,nCount,k,kk); 611 } 612 } 613 delete [] pHorzChar; 614 } 615 616 (*m_pStream) << '}' << ODatabaseImportExport::sNewLine; 617 (*m_pStream) << (sal_uInt8) 0; 618 return ((*m_pStream).GetError() == SVSTREAM_OK); 619 } 620 // ----------------------------------------------------------------------------- 621 void ORTFImportExport::appendRow(::rtl::OString* pHorzChar,sal_Int32 _nColumnCount,sal_Int32& k,sal_Int32& kk) 622 { 623 if(!m_pRowMarker || m_pRowMarker[kk] == k) 624 { 625 ++kk; 626 (*m_pStream) << OOO_STRING_SVTOOLS_RTF_TROWD << OOO_STRING_SVTOOLS_RTF_TRGAPH; 627 m_pStream->WriteNumber(40); 628 (*m_pStream) << ODatabaseImportExport::sNewLine; 629 630 static const ::rtl::OString aCell2("\\clbrdrl\\brdrs\\brdrcf2\\clbrdrt\\brdrs\\brdrcf2\\clbrdrb\\brdrs\\brdrcf2\\clbrdrr\\brdrs\\brdrcf2\\clshdng10000\\clcfpat1\\cellx"); 631 static const ::rtl::OString aTRRH("\\trrh-270\\pard\\intbl"); 632 633 for ( sal_Int32 i=1; i<=_nColumnCount; ++i ) 634 { 635 (*m_pStream) << aCell2; 636 m_pStream->WriteNumber(i*CELL_X); 637 (*m_pStream) << ODatabaseImportExport::sNewLine; 638 } 639 640 const sal_Bool bBold = ( ::com::sun::star::awt::FontWeight::BOLD == m_aFont.Weight ); 641 const sal_Bool bItalic = ( ::com::sun::star::awt::FontSlant_ITALIC == m_aFont.Slant ); 642 const sal_Bool bUnderline = ( ::com::sun::star::awt::FontUnderline::NONE != m_aFont.Underline ); 643 const sal_Bool bStrikeout = ( ::com::sun::star::awt::FontStrikeout::NONE != m_aFont.Strikeout ); 644 static const ::rtl::OString aFS2("\\fs20\\f1\\cf0\\cb1"); 645 ::comphelper::ComponentContext aContext(m_xFactory); 646 Reference< XRowSet > xRowSet(m_xRow,UNO_QUERY); 647 648 (*m_pStream) << '{'; 649 (*m_pStream) << aTRRH; 650 for ( sal_Int32 i=1; i <= _nColumnCount; ++i ) 651 { 652 (*m_pStream) << ODatabaseImportExport::sNewLine; 653 (*m_pStream) << '{'; 654 (*m_pStream) << pHorzChar[i-1]; 655 656 if ( bBold ) (*m_pStream) << OOO_STRING_SVTOOLS_RTF_B; 657 if ( bItalic ) (*m_pStream) << OOO_STRING_SVTOOLS_RTF_I; 658 if ( bUnderline ) (*m_pStream) << OOO_STRING_SVTOOLS_RTF_UL; 659 if ( bStrikeout ) (*m_pStream) << OOO_STRING_SVTOOLS_RTF_STRIKE; 660 661 (*m_pStream) << aFS2; 662 (*m_pStream) << ' '; 663 664 try 665 { 666 Reference<XPropertySet> xColumn(m_xRowSetColumns->getByIndex(i-1),UNO_QUERY_THROW); 667 dbtools::FormattedColumnValue aFormatedValue(aContext,xRowSet,xColumn); 668 ::rtl::OUString sValue = aFormatedValue.getFormattedValue(); 669 // m_xRow->getString(i); 670 //if (!m_xRow->wasNull()) 671 if ( sValue.getLength() ) 672 RTFOutFuncs::Out_String(*m_pStream,sValue,m_eDestEnc); 673 } 674 catch (Exception&) 675 { 676 OSL_ENSURE(0,"RTF WRITE!"); 677 } 678 679 (*m_pStream) << OOO_STRING_SVTOOLS_RTF_CELL; 680 (*m_pStream) << '}'; 681 (*m_pStream) << ODatabaseImportExport::sNewLine; 682 (*m_pStream) << OOO_STRING_SVTOOLS_RTF_PARD << OOO_STRING_SVTOOLS_RTF_INTBL; 683 } 684 (*m_pStream) << OOO_STRING_SVTOOLS_RTF_ROW << ODatabaseImportExport::sNewLine; 685 (*m_pStream) << '}'; 686 } 687 ++k; 688 } 689 //------------------------------------------------------------------- 690 sal_Bool ORTFImportExport::Read() 691 { 692 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORTFImportExport::Read" ); 693 ODatabaseImportExport::Read(); 694 SvParserState eState = SVPAR_ERROR; 695 if ( m_pStream ) 696 { 697 m_pReader = new ORTFReader((*m_pStream),m_xConnection,m_xFormatter,m_xFactory); 698 ((ORTFReader*)m_pReader)->AddRef(); 699 if ( isCheckEnabled() ) 700 m_pReader->enableCheckOnly(); 701 eState = ((ORTFReader*)m_pReader)->CallParser(); 702 m_pReader->release(); 703 m_pReader = NULL; 704 } 705 706 return eState != SVPAR_ERROR; 707 } 708 //------------------------------------------------------------------- 709 //=================================================================== 710 const sal_Int16 __FAR_DATA OHTMLImportExport::nDefaultFontSize[SBA_HTML_FONTSIZES] = 711 { 712 HTMLFONTSZ1_DFLT, HTMLFONTSZ2_DFLT, HTMLFONTSZ3_DFLT, HTMLFONTSZ4_DFLT, 713 HTMLFONTSZ5_DFLT, HTMLFONTSZ6_DFLT, HTMLFONTSZ7_DFLT 714 }; 715 716 sal_Int16 OHTMLImportExport::nFontSize[SBA_HTML_FONTSIZES] = { 0 }; 717 718 const sal_Int16 OHTMLImportExport::nCellSpacing = 0; 719 const char __FAR_DATA OHTMLImportExport::sIndentSource[nIndentMax+1] = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; 720 721 //======================================================================== 722 // Makros fuer HTML-Export 723 //======================================================================== 724 #define OUT_PROLOGUE() ((*m_pStream) << sHTML30_Prologue << ODatabaseImportExport::sNewLine << ODatabaseImportExport::sNewLine) 725 #define TAG_ON( tag ) HTMLOutFuncs::Out_AsciiTag( (*m_pStream), tag ) 726 #define TAG_OFF( tag ) HTMLOutFuncs::Out_AsciiTag( (*m_pStream), tag, sal_False ) 727 #define OUT_STR( str ) HTMLOutFuncs::Out_String( (*m_pStream), str ) 728 #define OUT_LF() (*m_pStream) << ODatabaseImportExport::sNewLine << GetIndentStr() 729 #define lcl_OUT_LF() (*m_pStream) << ODatabaseImportExport::sNewLine 730 #define TAG_ON_LF( tag ) (TAG_ON( tag ) << ODatabaseImportExport::sNewLine << GetIndentStr()) 731 #define TAG_OFF_LF( tag ) (TAG_OFF( tag ) << ODatabaseImportExport::sNewLine << GetIndentStr()) 732 #define OUT_HR() TAG_ON_LF( OOO_STRING_SVTOOLS_HTML_horzrule ) 733 #define OUT_COMMENT( comment ) ((*m_pStream) << sMyBegComment, OUT_STR( comment ) << sMyEndComment << ODatabaseImportExport::sNewLine << GetIndentStr()) 734 #define lcl_OUT_COMMENT( comment ) ((*m_pStream) << sMyBegComment, OUT_STR( comment ) << sMyEndComment << ODatabaseImportExport::sNewLine) 735 736 //------------------------------------------------------------------- 737 OHTMLImportExport::OHTMLImportExport(const ::svx::ODataAccessDescriptor& _aDataDescriptor, 738 const Reference< XMultiServiceFactory >& _rM, 739 const Reference< ::com::sun::star::util::XNumberFormatter >& _rxNumberF, 740 const String& rExchange) 741 : ODatabaseImportExport(_aDataDescriptor,_rM,_rxNumberF,rExchange) 742 ,m_nIndent(0) 743 #ifdef DBG_UTIL 744 ,m_bCheckFont(sal_False) 745 #endif 746 { 747 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLImportExport::OHTMLImportExport" ); 748 // set HTML configuration 749 SvxHtmlOptions* pHtmlOptions = SvxHtmlOptions::Get(); 750 m_eDestEnc = pHtmlOptions->GetTextEncoding(); 751 strncpy( sIndent, sIndentSource ,std::min(sizeof(sIndent),sizeof(sIndentSource))); 752 sIndent[0] = 0; 753 } 754 //------------------------------------------------------------------- 755 sal_Bool OHTMLImportExport::Write() 756 { 757 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLImportExport::Write" ); 758 ODatabaseImportExport::Write(); 759 if(m_xObject.is()) 760 { 761 (*m_pStream) << '<' << OOO_STRING_SVTOOLS_HTML_doctype << ' ' << OOO_STRING_SVTOOLS_HTML_doctype32 << '>' << ODatabaseImportExport::sNewLine << ODatabaseImportExport::sNewLine; 762 TAG_ON_LF( OOO_STRING_SVTOOLS_HTML_html ); 763 WriteHeader(); 764 OUT_LF(); 765 WriteBody(); 766 OUT_LF(); 767 TAG_OFF_LF( OOO_STRING_SVTOOLS_HTML_html ); 768 769 return ((*m_pStream).GetError() == SVSTREAM_OK); 770 } 771 return sal_False; 772 } 773 //------------------------------------------------------------------- 774 sal_Bool OHTMLImportExport::Read() 775 { 776 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLImportExport::Read" ); 777 ODatabaseImportExport::Read(); 778 SvParserState eState = SVPAR_ERROR; 779 if ( m_pStream ) 780 { 781 m_pReader = new OHTMLReader((*m_pStream),m_xConnection,m_xFormatter,m_xFactory); 782 ((OHTMLReader*)m_pReader)->AddRef(); 783 if ( isCheckEnabled() ) 784 m_pReader->enableCheckOnly(); 785 //dyf add 20070601 786 m_pReader->SetTableName(m_sDefaultTableName); 787 //dyf add end 788 eState = ((OHTMLReader*)m_pReader)->CallParser(); 789 m_pReader->release(); 790 m_pReader = NULL; 791 } 792 793 return eState != SVPAR_ERROR; 794 } 795 //------------------------------------------------------------------- 796 void OHTMLImportExport::WriteHeader() 797 { 798 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLImportExport::WriteHeader" ); 799 uno::Reference<document::XDocumentProperties> xDocProps( 800 m_xFactory->createInstance(::rtl::OUString::createFromAscii( 801 "com.sun.star.document.DocumentProperties")), 802 uno::UNO_QUERY); 803 if (xDocProps.is()) { 804 xDocProps->setTitle(m_sName); 805 } 806 807 IncIndent(1); TAG_ON_LF( OOO_STRING_SVTOOLS_HTML_head ); 808 809 SfxFrameHTMLWriter::Out_DocInfo( (*m_pStream), String(), 810 xDocProps, sIndent ); 811 OUT_LF(); 812 IncIndent(-1); OUT_LF(); TAG_OFF_LF( OOO_STRING_SVTOOLS_HTML_head ); 813 } 814 //----------------------------------------------------------------------- 815 void OHTMLImportExport::WriteBody() 816 { 817 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLImportExport::WriteBody" ); 818 819 IncIndent(1); TAG_ON_LF( OOO_STRING_SVTOOLS_HTML_style ); 820 821 (*m_pStream) << sMyBegComment; OUT_LF(); 822 (*m_pStream) << OOO_STRING_SVTOOLS_HTML_body << " { " << sFontFamily << '\"' << ::rtl::OString(m_aFont.Name,m_aFont.Name.getLength(), gsl_getSystemTextEncoding()) << '\"'; 823 // TODO : think about the encoding of the font name 824 (*m_pStream) << "; " << sFontSize; 825 m_pStream->WriteNumber(m_aFont.Height); 826 (*m_pStream) << '}'; 827 828 OUT_LF(); 829 (*m_pStream) << sMyEndComment; 830 IncIndent(-1); OUT_LF(); TAG_OFF_LF( OOO_STRING_SVTOOLS_HTML_style ); 831 OUT_LF(); 832 833 // default Textfarbe schwarz 834 (*m_pStream) << '<' << OOO_STRING_SVTOOLS_HTML_body << ' ' << OOO_STRING_SVTOOLS_HTML_O_text << '='; 835 sal_Int32 nColor = 0; 836 if(m_xObject.is()) 837 m_xObject->getPropertyValue(PROPERTY_TEXTCOLOR) >>= nColor; 838 ::Color aColor(nColor); 839 HTMLOutFuncs::Out_Color( (*m_pStream), aColor ); 840 841 ::rtl::OString sOut( ' ' ); 842 sOut = sOut + OOO_STRING_SVTOOLS_HTML_O_bgcolor; 843 sOut = sOut + "="; 844 (*m_pStream) << sOut; 845 HTMLOutFuncs::Out_Color( (*m_pStream), aColor ); 846 847 (*m_pStream) << '>'; OUT_LF(); 848 849 WriteTables(); 850 851 TAG_OFF_LF( OOO_STRING_SVTOOLS_HTML_body ); 852 } 853 //----------------------------------------------------------------------- 854 void OHTMLImportExport::WriteTables() 855 { 856 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLImportExport::WriteTables" ); 857 ::rtl::OString aStrOut = OOO_STRING_SVTOOLS_HTML_table; 858 aStrOut = aStrOut + " "; 859 aStrOut = aStrOut + OOO_STRING_SVTOOLS_HTML_frame; 860 aStrOut = aStrOut + "="; 861 aStrOut = aStrOut + OOO_STRING_SVTOOLS_HTML_TF_void; 862 863 Sequence< ::rtl::OUString> aNames; 864 Reference<XNameAccess> xColumns; 865 sal_Bool bUseResultMetaData = sal_False; 866 if(m_xObject.is()) 867 { 868 Reference<XColumnsSupplier> xColSup(m_xObject,UNO_QUERY); 869 xColumns = xColSup->getColumns(); 870 aNames = xColumns->getElementNames(); 871 if ( !aNames.getLength() ) 872 { 873 sal_Int32 nCount = m_xResultSetMetaData->getColumnCount(); 874 aNames.realloc(nCount); 875 for (sal_Int32 i= 0; i < nCount; ++i) 876 aNames[i] = m_xResultSetMetaData->getColumnName(i+1); 877 bUseResultMetaData = sal_True; 878 } 879 } 880 881 aStrOut = aStrOut + " "; 882 aStrOut = aStrOut + OOO_STRING_SVTOOLS_HTML_O_align; 883 aStrOut = aStrOut + "="; 884 aStrOut = aStrOut + OOO_STRING_SVTOOLS_HTML_AL_left; 885 aStrOut = aStrOut + " "; 886 aStrOut = aStrOut + OOO_STRING_SVTOOLS_HTML_O_cellspacing; 887 aStrOut = aStrOut + "="; 888 aStrOut = aStrOut + ::rtl::OString::valueOf((sal_Int32)nCellSpacing); 889 aStrOut = aStrOut + " "; 890 aStrOut = aStrOut + OOO_STRING_SVTOOLS_HTML_O_cols; 891 aStrOut = aStrOut + "="; 892 aStrOut = aStrOut + ::rtl::OString::valueOf(aNames.getLength()); 893 aStrOut = aStrOut + " "; 894 aStrOut = aStrOut + OOO_STRING_SVTOOLS_HTML_O_border; 895 aStrOut = aStrOut + "=1"; 896 897 IncIndent(1); 898 TAG_ON( aStrOut ); 899 900 FontOn(); 901 902 TAG_ON( OOO_STRING_SVTOOLS_HTML_caption ); 903 TAG_ON( OOO_STRING_SVTOOLS_HTML_bold ); 904 905 (*m_pStream) << ::rtl::OString(m_sName,m_sName.getLength(), gsl_getSystemTextEncoding()); 906 // TODO : think about the encoding of the name 907 TAG_OFF( OOO_STRING_SVTOOLS_HTML_bold ); 908 TAG_OFF( OOO_STRING_SVTOOLS_HTML_caption ); 909 910 FontOff(); 911 OUT_LF(); 912 // </FONT> 913 914 IncIndent(1); 915 TAG_ON_LF( OOO_STRING_SVTOOLS_HTML_thead ); 916 917 IncIndent(1); 918 TAG_ON_LF( OOO_STRING_SVTOOLS_HTML_tablerow ); 919 920 if(m_xObject.is()) 921 { 922 sal_Int32* pFormat = new sal_Int32[aNames.getLength()]; 923 924 const char **pHorJustify = new const char*[aNames.getLength()]; 925 sal_Int32 *pColWidth = new sal_Int32[aNames.getLength()]; 926 927 928 sal_Int32 nHeight = 0; 929 m_xObject->getPropertyValue(PROPERTY_ROW_HEIGHT) >>= nHeight; 930 931 // 1. die Spaltenbeschreibung rauspusten 932 const ::rtl::OUString* pIter = aNames.getConstArray(); 933 const ::rtl::OUString* pEnd = pIter + aNames.getLength(); 934 935 for( sal_Int32 i=0;pIter != pEnd; ++pIter,++i ) 936 { 937 sal_Int32 nAlign = 0; 938 pFormat[i] = 0; 939 pColWidth[i] = 100; 940 if ( !bUseResultMetaData ) 941 { 942 Reference<XPropertySet> xColumn; 943 xColumns->getByName(*pIter) >>= xColumn; 944 xColumn->getPropertyValue(PROPERTY_ALIGN) >>= nAlign; 945 pFormat[i] = ::comphelper::getINT32(xColumn->getPropertyValue(PROPERTY_FORMATKEY)); 946 pColWidth[i] = ::comphelper::getINT32(xColumn->getPropertyValue(PROPERTY_WIDTH)); 947 } 948 949 switch( nAlign ) 950 { 951 case 1: pHorJustify[i] = OOO_STRING_SVTOOLS_HTML_AL_center; break; 952 case 2: pHorJustify[i] = OOO_STRING_SVTOOLS_HTML_AL_right; break; 953 default: pHorJustify[i] = OOO_STRING_SVTOOLS_HTML_AL_left; break; 954 } 955 956 if(i == aNames.getLength()-1) 957 IncIndent(-1); 958 959 WriteCell(pFormat[i],pColWidth[i],nHeight,pHorJustify[i],*pIter,OOO_STRING_SVTOOLS_HTML_tableheader); 960 } 961 962 IncIndent(-1); 963 TAG_OFF_LF( OOO_STRING_SVTOOLS_HTML_tablerow ); 964 TAG_OFF_LF( OOO_STRING_SVTOOLS_HTML_thead ); 965 966 IncIndent(1); 967 TAG_ON_LF( OOO_STRING_SVTOOLS_HTML_tbody ); 968 969 // 2. und jetzt die Daten 970 ::comphelper::ComponentContext aContext(m_xFactory); 971 Reference< XRowSet > xRowSet(m_xRow,UNO_QUERY); 972 sal_Int32 j=1; 973 sal_Int32 kk=0; 974 m_xResultSet->beforeFirst(); // set back before the first row 975 while(m_xResultSet->next()) 976 { 977 IncIndent(1); 978 TAG_ON_LF( OOO_STRING_SVTOOLS_HTML_tablerow ); 979 980 if(!m_pRowMarker || m_pRowMarker[kk] == j) 981 { 982 ++kk; 983 for(sal_Int32 i=1;i<=aNames.getLength();++i) 984 { 985 if(i == aNames.getLength()) 986 IncIndent(-1); 987 988 String aValue; 989 try 990 { 991 Reference<XPropertySet> xColumn(m_xRowSetColumns->getByIndex(i-1),UNO_QUERY_THROW); 992 dbtools::FormattedColumnValue aFormatedValue(aContext,xRowSet,xColumn); 993 ::rtl::OUString sValue = aFormatedValue.getFormattedValue(); 994 if (sValue.getLength()) 995 { 996 aValue = sValue; 997 } 998 } 999 catch( const Exception& ) 1000 { 1001 DBG_UNHANDLED_EXCEPTION(); 1002 } 1003 WriteCell(pFormat[i-1],pColWidth[i-1],nHeight,pHorJustify[i-1],aValue,OOO_STRING_SVTOOLS_HTML_tabledata); 1004 } 1005 } 1006 ++j; 1007 TAG_OFF_LF( OOO_STRING_SVTOOLS_HTML_tablerow ); 1008 } 1009 1010 delete [] pFormat; 1011 delete [] pHorJustify; 1012 delete [] pColWidth; 1013 } 1014 else 1015 { 1016 IncIndent(-1); 1017 TAG_OFF_LF( OOO_STRING_SVTOOLS_HTML_tablerow ); 1018 TAG_OFF_LF( OOO_STRING_SVTOOLS_HTML_thead ); 1019 1020 IncIndent(1); 1021 TAG_ON_LF( OOO_STRING_SVTOOLS_HTML_tbody ); 1022 } 1023 1024 IncIndent(-1); OUT_LF(); TAG_OFF_LF( OOO_STRING_SVTOOLS_HTML_tbody ); 1025 IncIndent(-1); TAG_OFF_LF( OOO_STRING_SVTOOLS_HTML_table ); 1026 } 1027 //----------------------------------------------------------------------- 1028 void OHTMLImportExport::WriteCell( sal_Int32 nFormat,sal_Int32 nWidthPixel,sal_Int32 nHeightPixel,const char* pChar, 1029 const String& rValue,const char* pHtmlTag) 1030 { 1031 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLImportExport::WriteCell" ); 1032 ::rtl::OString aStrTD = pHtmlTag; 1033 1034 nWidthPixel = nWidthPixel ? nWidthPixel : 86; 1035 nHeightPixel = nHeightPixel ? nHeightPixel : 17; 1036 1037 // trotz der <TABLE COLS=n> und <COL WIDTH=x> Angaben noetig, 1038 // da die nicht von Netscape beachtet werden.. 1039 // Spaltenbreite 1040 aStrTD = aStrTD + " "; 1041 aStrTD = aStrTD + OOO_STRING_SVTOOLS_HTML_O_width; 1042 aStrTD = aStrTD + "="; 1043 aStrTD = aStrTD + ::rtl::OString::valueOf((sal_Int32)nWidthPixel); 1044 // Zeilenhoehe 1045 aStrTD = aStrTD + " "; 1046 aStrTD = aStrTD + OOO_STRING_SVTOOLS_HTML_O_height; 1047 aStrTD = aStrTD + "="; 1048 aStrTD = aStrTD + ::rtl::OString::valueOf((sal_Int32)nHeightPixel); 1049 1050 aStrTD = aStrTD + " "; 1051 aStrTD = aStrTD + OOO_STRING_SVTOOLS_HTML_O_align; 1052 aStrTD = aStrTD + "="; 1053 aStrTD = aStrTD + pChar; 1054 1055 double fVal = 0.0; 1056 1057 Reference< ::com::sun::star::util::XNumberFormatsSupplier > xSupplier = m_xFormatter->getNumberFormatsSupplier(); 1058 SvNumberFormatsSupplierObj* pSupplierImpl = SvNumberFormatsSupplierObj::getImplementation( xSupplier ); 1059 SvNumberFormatter* pFormatter = pSupplierImpl ? pSupplierImpl->GetNumberFormatter() : NULL; 1060 if(pFormatter) 1061 { 1062 try 1063 { 1064 fVal = m_xFormatter->convertStringToNumber(nFormat,rValue); 1065 ByteString aTmpString(aStrTD); 1066 HTMLOutFuncs::CreateTableDataOptionsValNum( aTmpString, sal_False, fVal,nFormat, *pFormatter ); 1067 } 1068 catch(Exception&) 1069 { 1070 ByteString aTmpString(aStrTD); 1071 HTMLOutFuncs::CreateTableDataOptionsValNum( aTmpString, sal_False, fVal,nFormat, *pFormatter ); 1072 } 1073 } 1074 1075 TAG_ON( aStrTD ); 1076 1077 FontOn(); 1078 1079 sal_Bool bBold = ( ::com::sun::star::awt::FontWeight::BOLD == m_aFont.Weight ); 1080 sal_Bool bItalic = ( ::com::sun::star::awt::FontSlant_ITALIC == m_aFont.Slant ); 1081 sal_Bool bUnderline = ( ::com::sun::star::awt::FontUnderline::NONE != m_aFont.Underline ); 1082 sal_Bool bStrikeout = ( ::com::sun::star::awt::FontStrikeout::NONE != m_aFont.Strikeout ); 1083 1084 if ( bBold ) TAG_ON( OOO_STRING_SVTOOLS_HTML_bold ); 1085 if ( bItalic ) TAG_ON( OOO_STRING_SVTOOLS_HTML_italic ); 1086 if ( bUnderline ) TAG_ON( OOO_STRING_SVTOOLS_HTML_underline ); 1087 if ( bStrikeout ) TAG_ON( OOO_STRING_SVTOOLS_HTML_strike ); 1088 1089 if ( !rValue.Len() ) 1090 TAG_ON( OOO_STRING_SVTOOLS_HTML_linebreak ); // #42573# keine komplett leere Zelle 1091 else 1092 HTMLOutFuncs::Out_String( (*m_pStream), rValue ,m_eDestEnc); 1093 1094 1095 if ( bStrikeout ) TAG_OFF( OOO_STRING_SVTOOLS_HTML_strike ); 1096 if ( bUnderline ) TAG_OFF( OOO_STRING_SVTOOLS_HTML_underline ); 1097 if ( bItalic ) TAG_OFF( OOO_STRING_SVTOOLS_HTML_italic ); 1098 if ( bBold ) TAG_OFF( OOO_STRING_SVTOOLS_HTML_bold ); 1099 1100 FontOff(); 1101 1102 TAG_OFF_LF( pHtmlTag ); 1103 } 1104 //----------------------------------------------------------------------- 1105 void OHTMLImportExport::FontOn() 1106 { 1107 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLImportExport::FontOn" ); 1108 #ifdef DBG_UTIL 1109 m_bCheckFont = sal_True; 1110 #endif 1111 1112 // <FONT FACE="xxx"> 1113 ::rtl::OString aStrOut = "<"; 1114 aStrOut = aStrOut + OOO_STRING_SVTOOLS_HTML_font; 1115 aStrOut = aStrOut + " "; 1116 aStrOut = aStrOut + OOO_STRING_SVTOOLS_HTML_O_face; 1117 aStrOut = aStrOut + "="; 1118 aStrOut = aStrOut + "\""; 1119 aStrOut = aStrOut + ::rtl::OString(m_aFont.Name,m_aFont.Name.getLength(),gsl_getSystemTextEncoding()); 1120 // TODO : think about the encoding of the font name 1121 aStrOut = aStrOut + "\""; 1122 aStrOut = aStrOut + " "; 1123 aStrOut = aStrOut + OOO_STRING_SVTOOLS_HTML_O_color; 1124 aStrOut = aStrOut + "="; 1125 (*m_pStream) << aStrOut; 1126 1127 sal_Int32 nColor = 0; 1128 if(m_xObject.is()) 1129 m_xObject->getPropertyValue(PROPERTY_TEXTCOLOR) >>= nColor; 1130 ::Color aColor(nColor); 1131 1132 HTMLOutFuncs::Out_Color( (*m_pStream), aColor ); 1133 (*m_pStream) << ">"; 1134 } 1135 //----------------------------------------------------------------------- 1136 inline void OHTMLImportExport::FontOff() 1137 { 1138 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLImportExport::FontOff" ); 1139 DBG_ASSERT(m_bCheckFont,"Kein FontOn() gerufen"); 1140 TAG_OFF( OOO_STRING_SVTOOLS_HTML_font ); 1141 #ifdef DBG_UTIL 1142 m_bCheckFont = sal_False; 1143 #endif 1144 } 1145 //----------------------------------------------------------------------- 1146 void OHTMLImportExport::IncIndent( sal_Int16 nVal ) 1147 { 1148 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLImportExport::IncIndent" ); 1149 sIndent[m_nIndent] = '\t'; 1150 m_nIndent = m_nIndent + nVal; 1151 if ( m_nIndent < 0 ) 1152 m_nIndent = 0; 1153 else if ( m_nIndent > nIndentMax ) 1154 m_nIndent = nIndentMax; 1155 sIndent[m_nIndent] = 0; 1156 } 1157 // ----------------------------------------------------------------------------- 1158