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