1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sw.hxx" 30*cdf0e10cSrcweir #if STLPORT_VERSION>=321 31*cdf0e10cSrcweir #include <cstdarg> 32*cdf0e10cSrcweir #endif 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir #include <stdio.h> 35*cdf0e10cSrcweir #include <unotxdoc.hxx> 36*cdf0e10cSrcweir #include <com/sun/star/text/NotePrintMode.hpp> 37*cdf0e10cSrcweir #include <sfx2/app.hxx> 38*cdf0e10cSrcweir #include <com/sun/star/sdb/CommandType.hpp> 39*cdf0e10cSrcweir #include <com/sun/star/sdb/XDocumentDataSource.hpp> 40*cdf0e10cSrcweir #include <com/sun/star/frame/XComponentLoader.hpp> 41*cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp> 42*cdf0e10cSrcweir #include <com/sun/star/lang/XEventListener.hpp> 43*cdf0e10cSrcweir #include <com/sun/star/util/XNumberFormatter.hpp> 44*cdf0e10cSrcweir #include <com/sun/star/sdb/XCompletedConnection.hpp> 45*cdf0e10cSrcweir #include <com/sun/star/sdb/XCompletedExecution.hpp> 46*cdf0e10cSrcweir #include <com/sun/star/container/XChild.hpp> 47*cdf0e10cSrcweir #include <com/sun/star/text/MailMergeEvent.hpp> 48*cdf0e10cSrcweir #include <com/sun/star/frame/XStorable.hpp> 49*cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/TemplateDescription.hpp> 50*cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilePicker.hpp> 51*cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilterManager.hpp> 52*cdf0e10cSrcweir #include <com/sun/star/uno/XNamingService.hpp> 53*cdf0e10cSrcweir #include <com/sun/star/util/XCloseable.hpp> 54*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 55*cdf0e10cSrcweir #include <sfx2/fcontnr.hxx> 56*cdf0e10cSrcweir #include <sfx2/filedlghelper.hxx> 57*cdf0e10cSrcweir #include <sfx2/viewfrm.hxx> 58*cdf0e10cSrcweir #include <dbconfig.hxx> 59*cdf0e10cSrcweir #include <swdbtoolsclient.hxx> 60*cdf0e10cSrcweir #include <pagedesc.hxx> 61*cdf0e10cSrcweir #include <vcl/lstbox.hxx> 62*cdf0e10cSrcweir #include <unotools/tempfile.hxx> 63*cdf0e10cSrcweir #include <unotools/pathoptions.hxx> 64*cdf0e10cSrcweir #include <svl/urihelper.hxx> 65*cdf0e10cSrcweir #define _SVSTDARR_STRINGSDTOR 66*cdf0e10cSrcweir #include <svl/svstdarr.hxx> 67*cdf0e10cSrcweir #include <svl/zforlist.hxx> 68*cdf0e10cSrcweir #include <svl/zformat.hxx> 69*cdf0e10cSrcweir #include <svl/stritem.hxx> 70*cdf0e10cSrcweir #include <svl/eitem.hxx> 71*cdf0e10cSrcweir #include <vcl/oldprintadaptor.hxx> 72*cdf0e10cSrcweir #include <sfx2/docfile.hxx> 73*cdf0e10cSrcweir #include <sfx2/progress.hxx> 74*cdf0e10cSrcweir #include <sfx2/dispatch.hxx> 75*cdf0e10cSrcweir #include <svl/mailenum.hxx> 76*cdf0e10cSrcweir #include <cmdid.h> 77*cdf0e10cSrcweir #include <swmodule.hxx> 78*cdf0e10cSrcweir #include <view.hxx> 79*cdf0e10cSrcweir #include <docsh.hxx> 80*cdf0e10cSrcweir #include <edtwin.hxx> 81*cdf0e10cSrcweir #include <wrtsh.hxx> 82*cdf0e10cSrcweir #include <fldbas.hxx> 83*cdf0e10cSrcweir #include <initui.hxx> 84*cdf0e10cSrcweir #include <swundo.hxx> 85*cdf0e10cSrcweir #include <flddat.hxx> 86*cdf0e10cSrcweir #include <modcfg.hxx> 87*cdf0e10cSrcweir #include <shellio.hxx> 88*cdf0e10cSrcweir #include <dbui.hxx> 89*cdf0e10cSrcweir #include <dbmgr.hxx> 90*cdf0e10cSrcweir #include <doc.hxx> 91*cdf0e10cSrcweir #include <swwait.hxx> 92*cdf0e10cSrcweir #include <swunohelper.hxx> 93*cdf0e10cSrcweir #include <dbui.hrc> 94*cdf0e10cSrcweir #include <globals.hrc> 95*cdf0e10cSrcweir #include <statstr.hrc> 96*cdf0e10cSrcweir #include <mmconfigitem.hxx> 97*cdf0e10cSrcweir #include <sfx2/request.hxx> 98*cdf0e10cSrcweir #include <hintids.hxx> 99*cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> 100*cdf0e10cSrcweir #include <com/sun/star/sdbc/XRowSet.hpp> 101*cdf0e10cSrcweir #include <com/sun/star/sdbcx/XTablesSupplier.hpp> 102*cdf0e10cSrcweir #include <com/sun/star/sdbcx/XColumnsSupplier.hpp> 103*cdf0e10cSrcweir #include <com/sun/star/sdb/XQueriesSupplier.hpp> 104*cdf0e10cSrcweir #include <com/sun/star/sdb/XColumn.hpp> 105*cdf0e10cSrcweir #include <com/sun/star/sdbc/DataType.hpp> 106*cdf0e10cSrcweir #include <com/sun/star/sdbc/ResultSetType.hpp> 107*cdf0e10cSrcweir #include <com/sun/star/mail/MailAttachment.hpp> 108*cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 109*cdf0e10cSrcweir #include <comphelper/types.hxx> 110*cdf0e10cSrcweir #include <comphelper/property.hxx> 111*cdf0e10cSrcweir #include <mailmergehelper.hxx> 112*cdf0e10cSrcweir #include <maildispatcher.hxx> 113*cdf0e10cSrcweir #include <svtools/htmlcfg.hxx> 114*cdf0e10cSrcweir #include <i18npool/mslangid.hxx> 115*cdf0e10cSrcweir #include <com/sun/star/util/XNumberFormatTypes.hpp> 116*cdf0e10cSrcweir #include <editeng/langitem.hxx> 117*cdf0e10cSrcweir #include <svl/numuno.hxx> 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir #include <unomailmerge.hxx> 120*cdf0e10cSrcweir #include <sfx2/event.hxx> 121*cdf0e10cSrcweir #include <vcl/msgbox.hxx> 122*cdf0e10cSrcweir #include <svx/dataaccessdescriptor.hxx> 123*cdf0e10cSrcweir #include <vos/mutex.hxx> 124*cdf0e10cSrcweir #include <rtl/textenc.h> 125*cdf0e10cSrcweir #include <ndindex.hxx> 126*cdf0e10cSrcweir #include <pam.hxx> 127*cdf0e10cSrcweir #include <swcrsr.hxx> 128*cdf0e10cSrcweir #include <swevent.hxx> 129*cdf0e10cSrcweir #include <osl/file.hxx> 130*cdf0e10cSrcweir #include <swabstdlg.hxx> 131*cdf0e10cSrcweir #include <fmthdft.hxx> 132*cdf0e10cSrcweir #include <dbui.hrc> 133*cdf0e10cSrcweir #include <envelp.hrc> 134*cdf0e10cSrcweir #include <memory> 135*cdf0e10cSrcweir #include <vector> 136*cdf0e10cSrcweir #include <unomid.h> 137*cdf0e10cSrcweir #include <section.hxx> 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir using namespace ::osl; 140*cdf0e10cSrcweir using namespace ::svx; 141*cdf0e10cSrcweir using namespace ::com::sun::star; 142*cdf0e10cSrcweir using namespace ::com::sun::star::text; 143*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 144*cdf0e10cSrcweir using namespace ::com::sun::star::container; 145*cdf0e10cSrcweir using namespace ::com::sun::star::frame; 146*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 147*cdf0e10cSrcweir using namespace ::com::sun::star::sdb; 148*cdf0e10cSrcweir using namespace ::com::sun::star::sdbc; 149*cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx; 150*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 151*cdf0e10cSrcweir using namespace ::com::sun::star::util; 152*cdf0e10cSrcweir using namespace ::com::sun::star::task; 153*cdf0e10cSrcweir using namespace ::com::sun::star::ui::dialogs; 154*cdf0e10cSrcweir 155*cdf0e10cSrcweir #define DB_SEP_SPACE 0 156*cdf0e10cSrcweir #define DB_SEP_TAB 1 157*cdf0e10cSrcweir #define DB_SEP_RETURN 2 158*cdf0e10cSrcweir #define DB_SEP_NEWLINE 3 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir SV_IMPL_PTRARR(SwDSParamArr, SwDSParamPtr); 161*cdf0e10cSrcweir const sal_Char cCursor[] = "Cursor"; 162*cdf0e10cSrcweir const sal_Char cCommand[] = "Command"; 163*cdf0e10cSrcweir const sal_Char cCommandType[] = "CommandType"; 164*cdf0e10cSrcweir const sal_Char cDataSourceName[] = "DataSourceName"; 165*cdf0e10cSrcweir const sal_Char cSelection[] = "Selection"; 166*cdf0e10cSrcweir const sal_Char cActiveConnection[] = "ActiveConnection"; 167*cdf0e10cSrcweir 168*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 169*cdf0e10cSrcweir // Use nameless namespace to avoid to rubbish the global namespace 170*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 171*cdf0e10cSrcweir namespace 172*cdf0e10cSrcweir { 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir bool lcl_getCountFromResultSet( sal_Int32& rCount, const uno::Reference<XResultSet>& xResultSet ) 175*cdf0e10cSrcweir { 176*cdf0e10cSrcweir uno::Reference<XPropertySet> xPrSet(xResultSet, UNO_QUERY); 177*cdf0e10cSrcweir if(xPrSet.is()) 178*cdf0e10cSrcweir { 179*cdf0e10cSrcweir try 180*cdf0e10cSrcweir { 181*cdf0e10cSrcweir sal_Bool bFinal = sal_False; 182*cdf0e10cSrcweir Any aFinal = xPrSet->getPropertyValue(C2U("IsRowCountFinal")); 183*cdf0e10cSrcweir aFinal >>= bFinal; 184*cdf0e10cSrcweir if(!bFinal) 185*cdf0e10cSrcweir { 186*cdf0e10cSrcweir xResultSet->last(); 187*cdf0e10cSrcweir xResultSet->first(); 188*cdf0e10cSrcweir } 189*cdf0e10cSrcweir Any aCount = xPrSet->getPropertyValue(C2U("RowCount")); 190*cdf0e10cSrcweir if( aCount >>= rCount ) 191*cdf0e10cSrcweir return true; 192*cdf0e10cSrcweir } 193*cdf0e10cSrcweir catch(Exception&) 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir } 196*cdf0e10cSrcweir } 197*cdf0e10cSrcweir return false; 198*cdf0e10cSrcweir } 199*cdf0e10cSrcweir // #122799# copy compatibility options 200*cdf0e10cSrcweir void lcl_CopyCompatibilityOptions( SwWrtShell& rSourceShell, SwWrtShell& rTargetShell) 201*cdf0e10cSrcweir { 202*cdf0e10cSrcweir IDocumentSettingAccess* pIDsa = rSourceShell.getIDocumentSettingAccess(); 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir rTargetShell.SetParaSpaceMax( pIDsa->get(IDocumentSettingAccess::PARA_SPACE_MAX)); 205*cdf0e10cSrcweir rTargetShell.SetParaSpaceMaxAtPages(pIDsa->get(IDocumentSettingAccess::PARA_SPACE_MAX_AT_PAGES)); 206*cdf0e10cSrcweir rTargetShell.SetTabCompat( pIDsa->get(IDocumentSettingAccess::TAB_COMPAT)); 207*cdf0e10cSrcweir rTargetShell.SetAddExtLeading( pIDsa->get(IDocumentSettingAccess::ADD_EXT_LEADING)); 208*cdf0e10cSrcweir rTargetShell.SetUseVirDev( pIDsa->get(IDocumentSettingAccess::USE_VIRTUAL_DEVICE)); 209*cdf0e10cSrcweir rTargetShell.SetAddParaSpacingToTableCells( pIDsa->get(IDocumentSettingAccess::ADD_PARA_SPACING_TO_TABLE_CELLS)); 210*cdf0e10cSrcweir rTargetShell.SetUseFormerLineSpacing( pIDsa->get(IDocumentSettingAccess::OLD_LINE_SPACING)); 211*cdf0e10cSrcweir rTargetShell.SetUseFormerObjectPositioning( pIDsa->get(IDocumentSettingAccess::USE_FORMER_OBJECT_POS)); 212*cdf0e10cSrcweir rTargetShell.SetConsiderWrapOnObjPos( pIDsa->get(IDocumentSettingAccess::CONSIDER_WRAP_ON_OBJECT_POSITION)); 213*cdf0e10cSrcweir rTargetShell.SetUseFormerTextWrapping( pIDsa->get(IDocumentSettingAccess::USE_FORMER_TEXT_WRAPPING)); 214*cdf0e10cSrcweir } 215*cdf0e10cSrcweir } 216*cdf0e10cSrcweir /* -----------------09.12.2002 12:35----------------- 217*cdf0e10cSrcweir * 218*cdf0e10cSrcweir * --------------------------------------------------*/ 219*cdf0e10cSrcweir 220*cdf0e10cSrcweir class SwConnectionDisposedListener_Impl : public cppu::WeakImplHelper1 221*cdf0e10cSrcweir < lang::XEventListener > 222*cdf0e10cSrcweir { 223*cdf0e10cSrcweir SwNewDBMgr& rDBMgr; 224*cdf0e10cSrcweir 225*cdf0e10cSrcweir virtual void SAL_CALL disposing( const EventObject& Source ) throw (RuntimeException); 226*cdf0e10cSrcweir public: 227*cdf0e10cSrcweir SwConnectionDisposedListener_Impl(SwNewDBMgr& rMgr); 228*cdf0e10cSrcweir ~SwConnectionDisposedListener_Impl(); 229*cdf0e10cSrcweir 230*cdf0e10cSrcweir }; 231*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 232*cdf0e10cSrcweir struct SwNewDBMgr_Impl 233*cdf0e10cSrcweir { 234*cdf0e10cSrcweir SwDSParam* pMergeData; 235*cdf0e10cSrcweir AbstractMailMergeDlg* pMergeDialog; 236*cdf0e10cSrcweir uno::Reference<lang::XEventListener> xDisposeListener; 237*cdf0e10cSrcweir 238*cdf0e10cSrcweir SwNewDBMgr_Impl(SwNewDBMgr& rDBMgr) 239*cdf0e10cSrcweir :pMergeData(0) 240*cdf0e10cSrcweir ,pMergeDialog(0) 241*cdf0e10cSrcweir ,xDisposeListener(new SwConnectionDisposedListener_Impl(rDBMgr)) 242*cdf0e10cSrcweir {} 243*cdf0e10cSrcweir }; 244*cdf0e10cSrcweir /*-- 24.10.2003 15:54:18--------------------------------------------------- 245*cdf0e10cSrcweir 246*cdf0e10cSrcweir -----------------------------------------------------------------------*/ 247*cdf0e10cSrcweir void lcl_InitNumberFormatter(SwDSParam& rParam, uno::Reference<XDataSource> xSource) 248*cdf0e10cSrcweir { 249*cdf0e10cSrcweir uno::Reference<XMultiServiceFactory> xMgr = ::comphelper::getProcessServiceFactory(); 250*cdf0e10cSrcweir if( xMgr.is() ) 251*cdf0e10cSrcweir { 252*cdf0e10cSrcweir uno::Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.util.NumberFormatter" )); 253*cdf0e10cSrcweir rParam.xFormatter = uno::Reference<util::XNumberFormatter>(xInstance, UNO_QUERY) ; 254*cdf0e10cSrcweir } 255*cdf0e10cSrcweir if(!xSource.is()) 256*cdf0e10cSrcweir xSource = SwNewDBMgr::getDataSourceAsParent(rParam.xConnection, rParam.sDataSource); 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir uno::Reference<XPropertySet> xSourceProps(xSource, UNO_QUERY); 259*cdf0e10cSrcweir if(xSourceProps.is()) 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir Any aFormats = xSourceProps->getPropertyValue(C2U("NumberFormatsSupplier")); 262*cdf0e10cSrcweir if(aFormats.hasValue()) 263*cdf0e10cSrcweir { 264*cdf0e10cSrcweir uno::Reference<XNumberFormatsSupplier> xSuppl; 265*cdf0e10cSrcweir aFormats >>= xSuppl; 266*cdf0e10cSrcweir if(xSuppl.is()) 267*cdf0e10cSrcweir { 268*cdf0e10cSrcweir uno::Reference< XPropertySet > xSettings = xSuppl->getNumberFormatSettings(); 269*cdf0e10cSrcweir Any aNull = xSettings->getPropertyValue(C2U("NullDate")); 270*cdf0e10cSrcweir aNull >>= rParam.aNullDate; 271*cdf0e10cSrcweir if(rParam.xFormatter.is()) 272*cdf0e10cSrcweir rParam.xFormatter->attachNumberFormatsSupplier(xSuppl); 273*cdf0e10cSrcweir } 274*cdf0e10cSrcweir } 275*cdf0e10cSrcweir } 276*cdf0e10cSrcweir } 277*cdf0e10cSrcweir /* -----------------------------17.07.00 17:04-------------------------------- 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 280*cdf0e10cSrcweir sal_Bool lcl_MoveAbsolute(SwDSParam* pParam, long nAbsPos) 281*cdf0e10cSrcweir { 282*cdf0e10cSrcweir sal_Bool bRet = sal_False; 283*cdf0e10cSrcweir try 284*cdf0e10cSrcweir { 285*cdf0e10cSrcweir if(pParam->bScrollable) 286*cdf0e10cSrcweir { 287*cdf0e10cSrcweir bRet = pParam->xResultSet->absolute( nAbsPos ); 288*cdf0e10cSrcweir } 289*cdf0e10cSrcweir else 290*cdf0e10cSrcweir { 291*cdf0e10cSrcweir DBG_ERROR("no absolute positioning available"); 292*cdf0e10cSrcweir } 293*cdf0e10cSrcweir } 294*cdf0e10cSrcweir catch(Exception aExcept) 295*cdf0e10cSrcweir { 296*cdf0e10cSrcweir } 297*cdf0e10cSrcweir return bRet; 298*cdf0e10cSrcweir } 299*cdf0e10cSrcweir /* -----------------------------17.07.00 17:23-------------------------------- 300*cdf0e10cSrcweir 301*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 302*cdf0e10cSrcweir sal_Bool lcl_GetColumnCnt(SwDSParam* pParam, 303*cdf0e10cSrcweir const String& rColumnName, long nLanguage, String& rResult, double* pNumber) 304*cdf0e10cSrcweir { 305*cdf0e10cSrcweir uno::Reference< XColumnsSupplier > xColsSupp( pParam->xResultSet, UNO_QUERY ); 306*cdf0e10cSrcweir uno::Reference<XNameAccess> xCols; 307*cdf0e10cSrcweir try 308*cdf0e10cSrcweir { 309*cdf0e10cSrcweir xCols = xColsSupp->getColumns(); 310*cdf0e10cSrcweir } 311*cdf0e10cSrcweir catch( lang::DisposedException& ) 312*cdf0e10cSrcweir { 313*cdf0e10cSrcweir } 314*cdf0e10cSrcweir if(!xCols.is() || !xCols->hasByName(rColumnName)) 315*cdf0e10cSrcweir return sal_False; 316*cdf0e10cSrcweir Any aCol = xCols->getByName(rColumnName); 317*cdf0e10cSrcweir uno::Reference< XPropertySet > xColumnProps; 318*cdf0e10cSrcweir aCol >>= xColumnProps; 319*cdf0e10cSrcweir 320*cdf0e10cSrcweir SwDBFormatData aFormatData; 321*cdf0e10cSrcweir if(!pParam->xFormatter.is()) 322*cdf0e10cSrcweir { 323*cdf0e10cSrcweir uno::Reference<XDataSource> xSource = SwNewDBMgr::getDataSourceAsParent( 324*cdf0e10cSrcweir pParam->xConnection,pParam->sDataSource); 325*cdf0e10cSrcweir lcl_InitNumberFormatter(*pParam, xSource ); 326*cdf0e10cSrcweir } 327*cdf0e10cSrcweir aFormatData.aNullDate = pParam->aNullDate; 328*cdf0e10cSrcweir aFormatData.xFormatter = pParam->xFormatter; 329*cdf0e10cSrcweir 330*cdf0e10cSrcweir MsLangId::convertLanguageToLocale( (LanguageType)nLanguage, aFormatData.aLocale ); 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir rResult = SwNewDBMgr::GetDBField( xColumnProps, aFormatData, pNumber); 333*cdf0e10cSrcweir return sal_True; 334*cdf0e10cSrcweir }; 335*cdf0e10cSrcweir /*-------------------------------------------------------------------- 336*cdf0e10cSrcweir Beschreibung: Daten importieren 337*cdf0e10cSrcweir --------------------------------------------------------------------*/ 338*cdf0e10cSrcweir sal_Bool SwNewDBMgr::MergeNew(const SwMergeDescriptor& rMergeDesc ) 339*cdf0e10cSrcweir { 340*cdf0e10cSrcweir SetMergeType( rMergeDesc.nMergeType ); 341*cdf0e10cSrcweir 342*cdf0e10cSrcweir DBG_ASSERT(!bInMerge && !pImpl->pMergeData, "merge already activated!"); 343*cdf0e10cSrcweir 344*cdf0e10cSrcweir SwDBData aData; 345*cdf0e10cSrcweir aData.nCommandType = CommandType::TABLE; 346*cdf0e10cSrcweir uno::Reference<XResultSet> xResSet; 347*cdf0e10cSrcweir Sequence<Any> aSelection; 348*cdf0e10cSrcweir uno::Reference< XConnection> xConnection; 349*cdf0e10cSrcweir 350*cdf0e10cSrcweir aData.sDataSource = rMergeDesc.rDescriptor.getDataSource(); 351*cdf0e10cSrcweir rMergeDesc.rDescriptor[daCommand] >>= aData.sCommand; 352*cdf0e10cSrcweir rMergeDesc.rDescriptor[daCommandType] >>= aData.nCommandType; 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir if ( rMergeDesc.rDescriptor.has(daCursor) ) 355*cdf0e10cSrcweir rMergeDesc.rDescriptor[daCursor] >>= xResSet; 356*cdf0e10cSrcweir if ( rMergeDesc.rDescriptor.has(daSelection) ) 357*cdf0e10cSrcweir rMergeDesc.rDescriptor[daSelection] >>= aSelection; 358*cdf0e10cSrcweir if ( rMergeDesc.rDescriptor.has(daConnection) ) 359*cdf0e10cSrcweir rMergeDesc.rDescriptor[daConnection] >>= xConnection; 360*cdf0e10cSrcweir 361*cdf0e10cSrcweir if(!aData.sDataSource.getLength() || !aData.sCommand.getLength() || !xResSet.is()) 362*cdf0e10cSrcweir { 363*cdf0e10cSrcweir return sal_False; 364*cdf0e10cSrcweir } 365*cdf0e10cSrcweir 366*cdf0e10cSrcweir pImpl->pMergeData = new SwDSParam(aData, xResSet, aSelection); 367*cdf0e10cSrcweir SwDSParam* pTemp = FindDSData(aData, sal_False); 368*cdf0e10cSrcweir if(pTemp) 369*cdf0e10cSrcweir *pTemp = *pImpl->pMergeData; 370*cdf0e10cSrcweir else 371*cdf0e10cSrcweir { 372*cdf0e10cSrcweir //#94779# calls from the calculator may have added a connection with an invalid commandtype 373*cdf0e10cSrcweir //"real" data base connections added here have to re-use the already available 374*cdf0e10cSrcweir //DSData and set the correct CommandType 375*cdf0e10cSrcweir SwDBData aTempData(aData); 376*cdf0e10cSrcweir aData.nCommandType = -1; 377*cdf0e10cSrcweir pTemp = FindDSData(aData, sal_False); 378*cdf0e10cSrcweir if(pTemp) 379*cdf0e10cSrcweir *pTemp = *pImpl->pMergeData; 380*cdf0e10cSrcweir else 381*cdf0e10cSrcweir { 382*cdf0e10cSrcweir SwDSParam* pInsert = new SwDSParam(*pImpl->pMergeData); 383*cdf0e10cSrcweir aDataSourceParams.Insert(pInsert, aDataSourceParams.Count()); 384*cdf0e10cSrcweir try 385*cdf0e10cSrcweir { 386*cdf0e10cSrcweir uno::Reference<XComponent> xComponent(pInsert->xConnection, UNO_QUERY); 387*cdf0e10cSrcweir if(xComponent.is()) 388*cdf0e10cSrcweir xComponent->addEventListener(pImpl->xDisposeListener); 389*cdf0e10cSrcweir } 390*cdf0e10cSrcweir catch(Exception&) 391*cdf0e10cSrcweir { 392*cdf0e10cSrcweir } 393*cdf0e10cSrcweir } 394*cdf0e10cSrcweir } 395*cdf0e10cSrcweir if(!pImpl->pMergeData->xConnection.is()) 396*cdf0e10cSrcweir pImpl->pMergeData->xConnection = xConnection; 397*cdf0e10cSrcweir // add an XEventListener 398*cdf0e10cSrcweir 399*cdf0e10cSrcweir try{ 400*cdf0e10cSrcweir //set to start position 401*cdf0e10cSrcweir if(pImpl->pMergeData->aSelection.getLength()) 402*cdf0e10cSrcweir { 403*cdf0e10cSrcweir sal_Int32 nPos = 0; 404*cdf0e10cSrcweir pImpl->pMergeData->aSelection.getConstArray()[ pImpl->pMergeData->nSelectionIndex++ ] >>= nPos; 405*cdf0e10cSrcweir pImpl->pMergeData->bEndOfDB = !pImpl->pMergeData->xResultSet->absolute( nPos ); 406*cdf0e10cSrcweir pImpl->pMergeData->CheckEndOfDB(); 407*cdf0e10cSrcweir if(pImpl->pMergeData->nSelectionIndex >= pImpl->pMergeData->aSelection.getLength()) 408*cdf0e10cSrcweir pImpl->pMergeData->bEndOfDB = sal_True; 409*cdf0e10cSrcweir } 410*cdf0e10cSrcweir else 411*cdf0e10cSrcweir { 412*cdf0e10cSrcweir pImpl->pMergeData->bEndOfDB = !pImpl->pMergeData->xResultSet->first(); 413*cdf0e10cSrcweir pImpl->pMergeData->CheckEndOfDB(); 414*cdf0e10cSrcweir } 415*cdf0e10cSrcweir } 416*cdf0e10cSrcweir catch(Exception&) 417*cdf0e10cSrcweir { 418*cdf0e10cSrcweir pImpl->pMergeData->bEndOfDB = sal_True; 419*cdf0e10cSrcweir pImpl->pMergeData->CheckEndOfDB(); 420*cdf0e10cSrcweir DBG_ERROR("exception in MergeNew()"); 421*cdf0e10cSrcweir } 422*cdf0e10cSrcweir 423*cdf0e10cSrcweir uno::Reference<XDataSource> xSource = SwNewDBMgr::getDataSourceAsParent(xConnection,aData.sDataSource); 424*cdf0e10cSrcweir 425*cdf0e10cSrcweir lcl_InitNumberFormatter(*pImpl->pMergeData, xSource); 426*cdf0e10cSrcweir 427*cdf0e10cSrcweir rMergeDesc.rSh.ChgDBData(aData); 428*cdf0e10cSrcweir bInMerge = sal_True; 429*cdf0e10cSrcweir 430*cdf0e10cSrcweir if (IsInitDBFields()) 431*cdf0e10cSrcweir { 432*cdf0e10cSrcweir // Bei Datenbankfeldern ohne DB-Name DB-Name von Dok einsetzen 433*cdf0e10cSrcweir SvStringsDtor aDBNames(1, 1); 434*cdf0e10cSrcweir aDBNames.Insert( new String(), 0); 435*cdf0e10cSrcweir SwDBData aInsertData = rMergeDesc.rSh.GetDBData(); 436*cdf0e10cSrcweir String sDBName = aInsertData.sDataSource; 437*cdf0e10cSrcweir sDBName += DB_DELIM; 438*cdf0e10cSrcweir sDBName += (String)aInsertData.sCommand; 439*cdf0e10cSrcweir sDBName += DB_DELIM; 440*cdf0e10cSrcweir sDBName += String::CreateFromInt32(aInsertData.nCommandType); 441*cdf0e10cSrcweir rMergeDesc.rSh.ChangeDBFields( aDBNames, sDBName); 442*cdf0e10cSrcweir SetInitDBFields(sal_False); 443*cdf0e10cSrcweir } 444*cdf0e10cSrcweir 445*cdf0e10cSrcweir sal_Bool bRet = sal_True; 446*cdf0e10cSrcweir switch(rMergeDesc.nMergeType) 447*cdf0e10cSrcweir { 448*cdf0e10cSrcweir case DBMGR_MERGE: 449*cdf0e10cSrcweir bRet = Merge(&rMergeDesc.rSh); // Mischen 450*cdf0e10cSrcweir break; 451*cdf0e10cSrcweir 452*cdf0e10cSrcweir case DBMGR_MERGE_MAILMERGE: // printing merge from 'old' merge dialog or from UNO-component 453*cdf0e10cSrcweir case DBMGR_MERGE_MAILING: 454*cdf0e10cSrcweir case DBMGR_MERGE_MAILFILES: 455*cdf0e10cSrcweir case DBMGR_MERGE_SINGLE_FILE: 456*cdf0e10cSrcweir // save files and send them as e-Mail if required 457*cdf0e10cSrcweir bRet = MergeMailFiles(&rMergeDesc.rSh, 458*cdf0e10cSrcweir rMergeDesc); 459*cdf0e10cSrcweir break; 460*cdf0e10cSrcweir 461*cdf0e10cSrcweir default: // Einfuegen der selektierten Eintraege 462*cdf0e10cSrcweir // (war: InsertRecord) 463*cdf0e10cSrcweir ImportFromConnection(&rMergeDesc.rSh); 464*cdf0e10cSrcweir break; 465*cdf0e10cSrcweir } 466*cdf0e10cSrcweir 467*cdf0e10cSrcweir EndMerge(); 468*cdf0e10cSrcweir return bRet; 469*cdf0e10cSrcweir } 470*cdf0e10cSrcweir 471*cdf0e10cSrcweir /*-------------------------------------------------------------------- 472*cdf0e10cSrcweir Beschreibung: Daten importieren 473*cdf0e10cSrcweir --------------------------------------------------------------------*/ 474*cdf0e10cSrcweir 475*cdf0e10cSrcweir 476*cdf0e10cSrcweir sal_Bool SwNewDBMgr::Merge(SwWrtShell* pSh) 477*cdf0e10cSrcweir { 478*cdf0e10cSrcweir pSh->StartAllAction(); 479*cdf0e10cSrcweir 480*cdf0e10cSrcweir pSh->ViewShell::UpdateFlds(sal_True); 481*cdf0e10cSrcweir pSh->SetModified(); 482*cdf0e10cSrcweir 483*cdf0e10cSrcweir pSh->EndAllAction(); 484*cdf0e10cSrcweir 485*cdf0e10cSrcweir return sal_True; 486*cdf0e10cSrcweir } 487*cdf0e10cSrcweir 488*cdf0e10cSrcweir /*-------------------------------------------------------------------- 489*cdf0e10cSrcweir Beschreibung: 490*cdf0e10cSrcweir --------------------------------------------------------------------*/ 491*cdf0e10cSrcweir void SwNewDBMgr::ImportFromConnection( SwWrtShell* pSh ) 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir if(pImpl->pMergeData && !pImpl->pMergeData->bEndOfDB) 494*cdf0e10cSrcweir { 495*cdf0e10cSrcweir { 496*cdf0e10cSrcweir pSh->StartAllAction(); 497*cdf0e10cSrcweir pSh->StartUndo(UNDO_EMPTY); 498*cdf0e10cSrcweir sal_Bool bGroupUndo(pSh->DoesGroupUndo()); 499*cdf0e10cSrcweir pSh->DoGroupUndo(sal_False); 500*cdf0e10cSrcweir 501*cdf0e10cSrcweir if( pSh->HasSelection() ) 502*cdf0e10cSrcweir pSh->DelRight(); 503*cdf0e10cSrcweir 504*cdf0e10cSrcweir SwWait *pWait = 0; 505*cdf0e10cSrcweir 506*cdf0e10cSrcweir { 507*cdf0e10cSrcweir sal_uLong i = 0; 508*cdf0e10cSrcweir do { 509*cdf0e10cSrcweir 510*cdf0e10cSrcweir ImportDBEntry(pSh); 511*cdf0e10cSrcweir if( 10 == ++i ) 512*cdf0e10cSrcweir pWait = new SwWait( *pSh->GetView().GetDocShell(), sal_True); 513*cdf0e10cSrcweir 514*cdf0e10cSrcweir } while(ToNextMergeRecord()); 515*cdf0e10cSrcweir } 516*cdf0e10cSrcweir 517*cdf0e10cSrcweir pSh->DoGroupUndo(bGroupUndo); 518*cdf0e10cSrcweir pSh->EndUndo(UNDO_EMPTY); 519*cdf0e10cSrcweir pSh->EndAllAction(); 520*cdf0e10cSrcweir delete pWait; 521*cdf0e10cSrcweir } 522*cdf0e10cSrcweir } 523*cdf0e10cSrcweir } 524*cdf0e10cSrcweir /*-----------------24.02.97 10.30------------------- 525*cdf0e10cSrcweir 526*cdf0e10cSrcweir --------------------------------------------------*/ 527*cdf0e10cSrcweir 528*cdf0e10cSrcweir String lcl_FindColumn(const String& sFormatStr,sal_uInt16 &nUsedPos, sal_uInt8 &nSeparator) 529*cdf0e10cSrcweir { 530*cdf0e10cSrcweir String sReturn; 531*cdf0e10cSrcweir sal_uInt16 nLen = sFormatStr.Len(); 532*cdf0e10cSrcweir nSeparator = 0xff; 533*cdf0e10cSrcweir while(nUsedPos < nLen && nSeparator == 0xff) 534*cdf0e10cSrcweir { 535*cdf0e10cSrcweir sal_Unicode cAkt = sFormatStr.GetChar(nUsedPos); 536*cdf0e10cSrcweir switch(cAkt) 537*cdf0e10cSrcweir { 538*cdf0e10cSrcweir case ',': 539*cdf0e10cSrcweir nSeparator = DB_SEP_SPACE; 540*cdf0e10cSrcweir break; 541*cdf0e10cSrcweir case ';': 542*cdf0e10cSrcweir nSeparator = DB_SEP_RETURN; 543*cdf0e10cSrcweir break; 544*cdf0e10cSrcweir case ':': 545*cdf0e10cSrcweir nSeparator = DB_SEP_TAB; 546*cdf0e10cSrcweir break; 547*cdf0e10cSrcweir case '#': 548*cdf0e10cSrcweir nSeparator = DB_SEP_NEWLINE; 549*cdf0e10cSrcweir break; 550*cdf0e10cSrcweir default: 551*cdf0e10cSrcweir sReturn += cAkt; 552*cdf0e10cSrcweir } 553*cdf0e10cSrcweir nUsedPos++; 554*cdf0e10cSrcweir 555*cdf0e10cSrcweir } 556*cdf0e10cSrcweir return sReturn; 557*cdf0e10cSrcweir } 558*cdf0e10cSrcweir 559*cdf0e10cSrcweir /*-------------------------------------------------------------------- 560*cdf0e10cSrcweir Beschreibung: 561*cdf0e10cSrcweir --------------------------------------------------------------------*/ 562*cdf0e10cSrcweir void SwNewDBMgr::ImportDBEntry(SwWrtShell* pSh) 563*cdf0e10cSrcweir { 564*cdf0e10cSrcweir if(pImpl->pMergeData && !pImpl->pMergeData->bEndOfDB) 565*cdf0e10cSrcweir { 566*cdf0e10cSrcweir uno::Reference< XColumnsSupplier > xColsSupp( pImpl->pMergeData->xResultSet, UNO_QUERY ); 567*cdf0e10cSrcweir uno::Reference<XNameAccess> xCols = xColsSupp->getColumns(); 568*cdf0e10cSrcweir String sFormatStr; 569*cdf0e10cSrcweir sal_uInt16 nFmtLen = sFormatStr.Len(); 570*cdf0e10cSrcweir if( nFmtLen ) 571*cdf0e10cSrcweir { 572*cdf0e10cSrcweir const char cSpace = ' '; 573*cdf0e10cSrcweir const char cTab = '\t'; 574*cdf0e10cSrcweir sal_uInt16 nUsedPos = 0; 575*cdf0e10cSrcweir sal_uInt8 nSeparator; 576*cdf0e10cSrcweir String sColumn = lcl_FindColumn(sFormatStr, nUsedPos, nSeparator); 577*cdf0e10cSrcweir while( sColumn.Len() ) 578*cdf0e10cSrcweir { 579*cdf0e10cSrcweir if(!xCols->hasByName(sColumn)) 580*cdf0e10cSrcweir return; 581*cdf0e10cSrcweir Any aCol = xCols->getByName(sColumn); 582*cdf0e10cSrcweir uno::Reference< XPropertySet > xColumnProp; 583*cdf0e10cSrcweir aCol >>= xColumnProp; 584*cdf0e10cSrcweir if(xColumnProp.is()) 585*cdf0e10cSrcweir { 586*cdf0e10cSrcweir SwDBFormatData aDBFormat; 587*cdf0e10cSrcweir String sInsert = GetDBField( xColumnProp, aDBFormat); 588*cdf0e10cSrcweir if( DB_SEP_SPACE == nSeparator ) 589*cdf0e10cSrcweir sInsert += cSpace; 590*cdf0e10cSrcweir else if( DB_SEP_TAB == nSeparator) 591*cdf0e10cSrcweir sInsert += cTab; 592*cdf0e10cSrcweir pSh->Insert(sInsert); 593*cdf0e10cSrcweir if( DB_SEP_RETURN == nSeparator) 594*cdf0e10cSrcweir pSh->SplitNode(); 595*cdf0e10cSrcweir else if(DB_SEP_NEWLINE == nSeparator) 596*cdf0e10cSrcweir pSh->InsertLineBreak(); 597*cdf0e10cSrcweir } 598*cdf0e10cSrcweir else 599*cdf0e10cSrcweir { 600*cdf0e10cSrcweir // Spalte nicht gefunden -> Fehler anzeigen 601*cdf0e10cSrcweir String sInsert = '?'; 602*cdf0e10cSrcweir sInsert += sColumn; 603*cdf0e10cSrcweir sInsert += '?'; 604*cdf0e10cSrcweir pSh->Insert(sInsert); 605*cdf0e10cSrcweir } 606*cdf0e10cSrcweir sColumn = lcl_FindColumn(sFormatStr, nUsedPos, nSeparator); 607*cdf0e10cSrcweir } 608*cdf0e10cSrcweir pSh->SplitNode(); 609*cdf0e10cSrcweir } 610*cdf0e10cSrcweir else 611*cdf0e10cSrcweir { 612*cdf0e10cSrcweir String sStr; 613*cdf0e10cSrcweir Sequence<rtl::OUString> aColNames = xCols->getElementNames(); 614*cdf0e10cSrcweir const rtl::OUString* pColNames = aColNames.getConstArray(); 615*cdf0e10cSrcweir long nLength = aColNames.getLength(); 616*cdf0e10cSrcweir for(long i = 0; i < nLength; i++) 617*cdf0e10cSrcweir { 618*cdf0e10cSrcweir Any aCol = xCols->getByName(pColNames[i]); 619*cdf0e10cSrcweir uno::Reference< XPropertySet > xColumnProp; 620*cdf0e10cSrcweir aCol >>= xColumnProp; 621*cdf0e10cSrcweir SwDBFormatData aDBFormat; 622*cdf0e10cSrcweir sStr += GetDBField( xColumnProp, aDBFormat); 623*cdf0e10cSrcweir if (i < nLength - 1) 624*cdf0e10cSrcweir sStr += '\t'; 625*cdf0e10cSrcweir } 626*cdf0e10cSrcweir pSh->SwEditShell::Insert2(sStr); 627*cdf0e10cSrcweir pSh->SwFEShell::SplitNode(); // Zeilenvorschub 628*cdf0e10cSrcweir } 629*cdf0e10cSrcweir } 630*cdf0e10cSrcweir } 631*cdf0e10cSrcweir /*-------------------------------------------------------------------- 632*cdf0e10cSrcweir Beschreibung: Listbox mit Tabellenliste fuellen 633*cdf0e10cSrcweir --------------------------------------------------------------------*/ 634*cdf0e10cSrcweir sal_Bool SwNewDBMgr::GetTableNames(ListBox* pListBox, const String& rDBName) 635*cdf0e10cSrcweir { 636*cdf0e10cSrcweir sal_Bool bRet = sal_False; 637*cdf0e10cSrcweir String sOldTableName(pListBox->GetSelectEntry()); 638*cdf0e10cSrcweir pListBox->Clear(); 639*cdf0e10cSrcweir SwDSParam* pParam = FindDSConnection(rDBName, sal_False); 640*cdf0e10cSrcweir uno::Reference< XConnection> xConnection; 641*cdf0e10cSrcweir if(pParam && pParam->xConnection.is()) 642*cdf0e10cSrcweir xConnection = pParam->xConnection; 643*cdf0e10cSrcweir else 644*cdf0e10cSrcweir { 645*cdf0e10cSrcweir rtl::OUString sDBName(rDBName); 646*cdf0e10cSrcweir if ( sDBName.getLength() ) 647*cdf0e10cSrcweir xConnection = RegisterConnection( sDBName ); 648*cdf0e10cSrcweir } 649*cdf0e10cSrcweir if(xConnection.is()) 650*cdf0e10cSrcweir { 651*cdf0e10cSrcweir uno::Reference<XTablesSupplier> xTSupplier = uno::Reference<XTablesSupplier>(xConnection, UNO_QUERY); 652*cdf0e10cSrcweir if(xTSupplier.is()) 653*cdf0e10cSrcweir { 654*cdf0e10cSrcweir uno::Reference<XNameAccess> xTbls = xTSupplier->getTables(); 655*cdf0e10cSrcweir Sequence<rtl::OUString> aTbls = xTbls->getElementNames(); 656*cdf0e10cSrcweir const rtl::OUString* pTbls = aTbls.getConstArray(); 657*cdf0e10cSrcweir for(long i = 0; i < aTbls.getLength(); i++) 658*cdf0e10cSrcweir { 659*cdf0e10cSrcweir sal_uInt16 nEntry = pListBox->InsertEntry(pTbls[i]); 660*cdf0e10cSrcweir pListBox->SetEntryData(nEntry, (void*)0); 661*cdf0e10cSrcweir } 662*cdf0e10cSrcweir } 663*cdf0e10cSrcweir uno::Reference<XQueriesSupplier> xQSupplier = uno::Reference<XQueriesSupplier>(xConnection, UNO_QUERY); 664*cdf0e10cSrcweir if(xQSupplier.is()) 665*cdf0e10cSrcweir { 666*cdf0e10cSrcweir uno::Reference<XNameAccess> xQueries = xQSupplier->getQueries(); 667*cdf0e10cSrcweir Sequence<rtl::OUString> aQueries = xQueries->getElementNames(); 668*cdf0e10cSrcweir const rtl::OUString* pQueries = aQueries.getConstArray(); 669*cdf0e10cSrcweir for(long i = 0; i < aQueries.getLength(); i++) 670*cdf0e10cSrcweir { 671*cdf0e10cSrcweir sal_uInt16 nEntry = pListBox->InsertEntry(pQueries[i]); 672*cdf0e10cSrcweir pListBox->SetEntryData(nEntry, (void*)1); 673*cdf0e10cSrcweir } 674*cdf0e10cSrcweir } 675*cdf0e10cSrcweir if (sOldTableName.Len()) 676*cdf0e10cSrcweir pListBox->SelectEntry(sOldTableName); 677*cdf0e10cSrcweir bRet = sal_True; 678*cdf0e10cSrcweir } 679*cdf0e10cSrcweir return bRet; 680*cdf0e10cSrcweir } 681*cdf0e10cSrcweir 682*cdf0e10cSrcweir /*-------------------------------------------------------------------- 683*cdf0e10cSrcweir Beschreibung: Listbox mit Spaltennamen einer Datenbank fuellen 684*cdf0e10cSrcweir --------------------------------------------------------------------*/ 685*cdf0e10cSrcweir sal_Bool SwNewDBMgr::GetColumnNames(ListBox* pListBox, 686*cdf0e10cSrcweir const String& rDBName, const String& rTableName, sal_Bool bAppend) 687*cdf0e10cSrcweir { 688*cdf0e10cSrcweir if (!bAppend) 689*cdf0e10cSrcweir pListBox->Clear(); 690*cdf0e10cSrcweir SwDBData aData; 691*cdf0e10cSrcweir aData.sDataSource = rDBName; 692*cdf0e10cSrcweir aData.sCommand = rTableName; 693*cdf0e10cSrcweir aData.nCommandType = -1; 694*cdf0e10cSrcweir SwDSParam* pParam = FindDSData(aData, sal_False); 695*cdf0e10cSrcweir uno::Reference< XConnection> xConnection; 696*cdf0e10cSrcweir if(pParam && pParam->xConnection.is()) 697*cdf0e10cSrcweir xConnection = pParam->xConnection; 698*cdf0e10cSrcweir else 699*cdf0e10cSrcweir { 700*cdf0e10cSrcweir rtl::OUString sDBName(rDBName); 701*cdf0e10cSrcweir xConnection = RegisterConnection( sDBName ); 702*cdf0e10cSrcweir } 703*cdf0e10cSrcweir uno::Reference< XColumnsSupplier> xColsSupp = SwNewDBMgr::GetColumnSupplier(xConnection, rTableName); 704*cdf0e10cSrcweir if(xColsSupp.is()) 705*cdf0e10cSrcweir { 706*cdf0e10cSrcweir uno::Reference<XNameAccess> xCols = xColsSupp->getColumns(); 707*cdf0e10cSrcweir const Sequence<rtl::OUString> aColNames = xCols->getElementNames(); 708*cdf0e10cSrcweir const rtl::OUString* pColNames = aColNames.getConstArray(); 709*cdf0e10cSrcweir for(int nCol = 0; nCol < aColNames.getLength(); nCol++) 710*cdf0e10cSrcweir { 711*cdf0e10cSrcweir pListBox->InsertEntry(pColNames[nCol]); 712*cdf0e10cSrcweir } 713*cdf0e10cSrcweir ::comphelper::disposeComponent( xColsSupp ); 714*cdf0e10cSrcweir } 715*cdf0e10cSrcweir return(sal_True); 716*cdf0e10cSrcweir } 717*cdf0e10cSrcweir /* -----------------------------08.06.01 15:11-------------------------------- 718*cdf0e10cSrcweir 719*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 720*cdf0e10cSrcweir sal_Bool SwNewDBMgr::GetColumnNames(ListBox* pListBox, 721*cdf0e10cSrcweir uno::Reference< XConnection> xConnection, 722*cdf0e10cSrcweir const String& rTableName, sal_Bool bAppend) 723*cdf0e10cSrcweir { 724*cdf0e10cSrcweir if (!bAppend) 725*cdf0e10cSrcweir pListBox->Clear(); 726*cdf0e10cSrcweir uno::Reference< XColumnsSupplier> xColsSupp = SwNewDBMgr::GetColumnSupplier(xConnection, rTableName); 727*cdf0e10cSrcweir if(xColsSupp.is()) 728*cdf0e10cSrcweir { 729*cdf0e10cSrcweir uno::Reference<XNameAccess> xCols = xColsSupp->getColumns(); 730*cdf0e10cSrcweir const Sequence<rtl::OUString> aColNames = xCols->getElementNames(); 731*cdf0e10cSrcweir const rtl::OUString* pColNames = aColNames.getConstArray(); 732*cdf0e10cSrcweir for(int nCol = 0; nCol < aColNames.getLength(); nCol++) 733*cdf0e10cSrcweir { 734*cdf0e10cSrcweir pListBox->InsertEntry(pColNames[nCol]); 735*cdf0e10cSrcweir } 736*cdf0e10cSrcweir ::comphelper::disposeComponent( xColsSupp ); 737*cdf0e10cSrcweir } 738*cdf0e10cSrcweir return(sal_True); 739*cdf0e10cSrcweir } 740*cdf0e10cSrcweir 741*cdf0e10cSrcweir /*-------------------------------------------------------------------- 742*cdf0e10cSrcweir Beschreibung: CTOR 743*cdf0e10cSrcweir --------------------------------------------------------------------*/ 744*cdf0e10cSrcweir 745*cdf0e10cSrcweir SwNewDBMgr::SwNewDBMgr() : 746*cdf0e10cSrcweir nMergeType(DBMGR_INSERT), 747*cdf0e10cSrcweir bInitDBFields(sal_False), 748*cdf0e10cSrcweir bInMerge(sal_False), 749*cdf0e10cSrcweir bMergeSilent(sal_False), 750*cdf0e10cSrcweir bMergeLock(sal_False), 751*cdf0e10cSrcweir pImpl(new SwNewDBMgr_Impl(*this)), 752*cdf0e10cSrcweir pMergeEvtSrc(NULL) 753*cdf0e10cSrcweir { 754*cdf0e10cSrcweir } 755*cdf0e10cSrcweir /* -----------------------------18.07.00 08:56-------------------------------- 756*cdf0e10cSrcweir 757*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 758*cdf0e10cSrcweir SwNewDBMgr::~SwNewDBMgr() 759*cdf0e10cSrcweir { 760*cdf0e10cSrcweir for(sal_uInt16 nPos = 0; nPos < aDataSourceParams.Count(); nPos++) 761*cdf0e10cSrcweir { 762*cdf0e10cSrcweir SwDSParam* pParam = aDataSourceParams[nPos]; 763*cdf0e10cSrcweir if(pParam->xConnection.is()) 764*cdf0e10cSrcweir { 765*cdf0e10cSrcweir try 766*cdf0e10cSrcweir { 767*cdf0e10cSrcweir uno::Reference<XComponent> xComp(pParam->xConnection, UNO_QUERY); 768*cdf0e10cSrcweir if(xComp.is()) 769*cdf0e10cSrcweir xComp->dispose(); 770*cdf0e10cSrcweir } 771*cdf0e10cSrcweir catch(const RuntimeException& ) 772*cdf0e10cSrcweir { 773*cdf0e10cSrcweir //may be disposed already since multiple entries may have used the same connection 774*cdf0e10cSrcweir } 775*cdf0e10cSrcweir } 776*cdf0e10cSrcweir } 777*cdf0e10cSrcweir delete pImpl; 778*cdf0e10cSrcweir } 779*cdf0e10cSrcweir 780*cdf0e10cSrcweir /*-------------------------------------------------------------------- 781*cdf0e10cSrcweir Beschreibung: Serienbriefe als einzelne Dokumente speichern 782*cdf0e10cSrcweir --------------------------------------------------------------------*/ 783*cdf0e10cSrcweir String lcl_FindUniqueName(SwWrtShell* pTargetShell, const String& rStartingPageDesc, sal_uLong nDocNo ) 784*cdf0e10cSrcweir { 785*cdf0e10cSrcweir do 786*cdf0e10cSrcweir { 787*cdf0e10cSrcweir String sTest = rStartingPageDesc; 788*cdf0e10cSrcweir sTest += String::CreateFromInt32( nDocNo ); 789*cdf0e10cSrcweir if( !pTargetShell->FindPageDescByName( sTest ) ) 790*cdf0e10cSrcweir return sTest; 791*cdf0e10cSrcweir ++nDocNo; 792*cdf0e10cSrcweir }while(true); 793*cdf0e10cSrcweir } 794*cdf0e10cSrcweir void lcl_CopyDynamicDefaults( const SwDoc& rSource, SwDoc& rTarget ) 795*cdf0e10cSrcweir { 796*cdf0e10cSrcweir sal_uInt16 __FAR_DATA aRangeOfDefaults[] = { 797*cdf0e10cSrcweir RES_FRMATR_BEGIN, RES_FRMATR_END-1, 798*cdf0e10cSrcweir RES_CHRATR_BEGIN, RES_CHRATR_END-1, 799*cdf0e10cSrcweir RES_PARATR_BEGIN, RES_PARATR_END-1, 800*cdf0e10cSrcweir // --> OD 2008-02-25 #refactorlists## 801*cdf0e10cSrcweir RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END-1, 802*cdf0e10cSrcweir // <-- 803*cdf0e10cSrcweir RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1, 804*cdf0e10cSrcweir 0 805*cdf0e10cSrcweir }; 806*cdf0e10cSrcweir 807*cdf0e10cSrcweir SfxItemSet aNewDefaults( rTarget.GetAttrPool(), aRangeOfDefaults ); 808*cdf0e10cSrcweir 809*cdf0e10cSrcweir sal_uInt16 nWhich; 810*cdf0e10cSrcweir sal_uInt16 nRange = 0; 811*cdf0e10cSrcweir while( aRangeOfDefaults[nRange] != 0) 812*cdf0e10cSrcweir { 813*cdf0e10cSrcweir for( nWhich = aRangeOfDefaults[nRange]; nWhich < aRangeOfDefaults[nRange + 1]; ++nWhich ) 814*cdf0e10cSrcweir { 815*cdf0e10cSrcweir const SfxPoolItem& rSourceAttr = rSource.GetDefault( nWhich ); 816*cdf0e10cSrcweir if( rSourceAttr != rTarget.GetDefault( nWhich ) ) 817*cdf0e10cSrcweir aNewDefaults.Put( rSourceAttr ); 818*cdf0e10cSrcweir } 819*cdf0e10cSrcweir nRange += 2; 820*cdf0e10cSrcweir } 821*cdf0e10cSrcweir if( aNewDefaults.Count() ) 822*cdf0e10cSrcweir rTarget.SetDefault( aNewDefaults ); 823*cdf0e10cSrcweir } 824*cdf0e10cSrcweir void lcl_CopyFollowPageDesc( 825*cdf0e10cSrcweir SwWrtShell& rTargetShell, 826*cdf0e10cSrcweir const SwPageDesc& rSourcePageDesc, 827*cdf0e10cSrcweir const SwPageDesc& rTargetPageDesc, 828*cdf0e10cSrcweir const sal_uLong nDocNo ) 829*cdf0e10cSrcweir { 830*cdf0e10cSrcweir //now copy the follow page desc, too 831*cdf0e10cSrcweir const SwPageDesc* pFollowPageDesc = rSourcePageDesc.GetFollow(); 832*cdf0e10cSrcweir String sFollowPageDesc = pFollowPageDesc->GetName(); 833*cdf0e10cSrcweir if( sFollowPageDesc != rSourcePageDesc.GetName() ) 834*cdf0e10cSrcweir { 835*cdf0e10cSrcweir SwDoc* pTargetDoc = rTargetShell.GetDoc(); 836*cdf0e10cSrcweir String sNewFollowPageDesc = lcl_FindUniqueName(&rTargetShell, sFollowPageDesc, nDocNo ); 837*cdf0e10cSrcweir sal_uInt16 nNewDesc = pTargetDoc->MakePageDesc( sNewFollowPageDesc ); 838*cdf0e10cSrcweir SwPageDesc& rTargetFollowPageDesc = pTargetDoc->_GetPageDesc( nNewDesc ); 839*cdf0e10cSrcweir 840*cdf0e10cSrcweir pTargetDoc->CopyPageDesc( *pFollowPageDesc, rTargetFollowPageDesc, sal_False ); 841*cdf0e10cSrcweir SwPageDesc aDesc( rTargetPageDesc ); 842*cdf0e10cSrcweir aDesc.SetFollow( &rTargetFollowPageDesc ); 843*cdf0e10cSrcweir pTargetDoc->ChgPageDesc( rTargetPageDesc.GetName(), aDesc ); 844*cdf0e10cSrcweir } 845*cdf0e10cSrcweir } 846*cdf0e10cSrcweir 847*cdf0e10cSrcweir void lcl_RemoveSectionLinks( SwWrtShell& rWorkShell ) 848*cdf0e10cSrcweir { 849*cdf0e10cSrcweir //reset all links of the sections of synchronized labels 850*cdf0e10cSrcweir sal_uInt16 nSections = rWorkShell.GetSectionFmtCount(); 851*cdf0e10cSrcweir for( sal_uInt16 nSection = 0; nSection < nSections; ++nSection ) 852*cdf0e10cSrcweir { 853*cdf0e10cSrcweir SwSectionData aSectionData( *rWorkShell.GetSectionFmt( nSection ).GetSection() ); 854*cdf0e10cSrcweir if( aSectionData.GetType() == FILE_LINK_SECTION ) 855*cdf0e10cSrcweir { 856*cdf0e10cSrcweir aSectionData.SetType( CONTENT_SECTION ); 857*cdf0e10cSrcweir aSectionData.SetLinkFileName( String() ); 858*cdf0e10cSrcweir rWorkShell.UpdateSection( nSection, aSectionData ); 859*cdf0e10cSrcweir } 860*cdf0e10cSrcweir } 861*cdf0e10cSrcweir rWorkShell.SetLabelDoc( sal_False ); 862*cdf0e10cSrcweir } 863*cdf0e10cSrcweir 864*cdf0e10cSrcweir sal_Bool SwNewDBMgr::MergeMailFiles(SwWrtShell* pSourceShell, 865*cdf0e10cSrcweir const SwMergeDescriptor& rMergeDescriptor) 866*cdf0e10cSrcweir { 867*cdf0e10cSrcweir //check if the doc is synchronized and contains at least one linked section 868*cdf0e10cSrcweir sal_Bool bSynchronizedDoc = pSourceShell->IsLabelDoc() && pSourceShell->GetSectionFmtCount() > 1; 869*cdf0e10cSrcweir sal_Bool bLoop = sal_True; 870*cdf0e10cSrcweir sal_Bool bEMail = rMergeDescriptor.nMergeType == DBMGR_MERGE_MAILING; 871*cdf0e10cSrcweir const bool bAsSingleFile = rMergeDescriptor.nMergeType == DBMGR_MERGE_SINGLE_FILE; 872*cdf0e10cSrcweir 873*cdf0e10cSrcweir ::rtl::Reference< MailDispatcher > xMailDispatcher; 874*cdf0e10cSrcweir ::rtl::OUString sBodyMimeType; 875*cdf0e10cSrcweir rtl_TextEncoding eEncoding = ::gsl_getSystemTextEncoding(); 876*cdf0e10cSrcweir 877*cdf0e10cSrcweir if(bEMail) 878*cdf0e10cSrcweir { 879*cdf0e10cSrcweir xMailDispatcher.set( new MailDispatcher(rMergeDescriptor.xSmtpServer)); 880*cdf0e10cSrcweir if(!rMergeDescriptor.bSendAsAttachment && rMergeDescriptor.bSendAsHTML) 881*cdf0e10cSrcweir { 882*cdf0e10cSrcweir sBodyMimeType = ::rtl::OUString::createFromAscii("text/html; charset="); 883*cdf0e10cSrcweir sBodyMimeType += ::rtl::OUString::createFromAscii( 884*cdf0e10cSrcweir rtl_getBestMimeCharsetFromTextEncoding( eEncoding )); 885*cdf0e10cSrcweir SvxHtmlOptions* pHtmlOptions = SvxHtmlOptions::Get(); 886*cdf0e10cSrcweir eEncoding = pHtmlOptions->GetTextEncoding(); 887*cdf0e10cSrcweir } 888*cdf0e10cSrcweir else 889*cdf0e10cSrcweir sBodyMimeType = 890*cdf0e10cSrcweir ::rtl::OUString::createFromAscii("text/plain; charset=UTF-8; format=flowed"); 891*cdf0e10cSrcweir } 892*cdf0e10cSrcweir 893*cdf0e10cSrcweir uno::Reference< XPropertySet > xColumnProp; 894*cdf0e10cSrcweir { 895*cdf0e10cSrcweir sal_Bool bColumnName = sEMailAddrFld.Len() > 0; 896*cdf0e10cSrcweir 897*cdf0e10cSrcweir if (bColumnName) 898*cdf0e10cSrcweir { 899*cdf0e10cSrcweir uno::Reference< XColumnsSupplier > xColsSupp( pImpl->pMergeData->xResultSet, UNO_QUERY ); 900*cdf0e10cSrcweir uno::Reference<XNameAccess> xCols = xColsSupp->getColumns(); 901*cdf0e10cSrcweir if(!xCols->hasByName(sEMailAddrFld)) 902*cdf0e10cSrcweir return sal_False; 903*cdf0e10cSrcweir Any aCol = xCols->getByName(sEMailAddrFld); 904*cdf0e10cSrcweir aCol >>= xColumnProp; 905*cdf0e10cSrcweir } 906*cdf0e10cSrcweir 907*cdf0e10cSrcweir SfxDispatcher* pSfxDispatcher = pSourceShell->GetView().GetViewFrame()->GetDispatcher(); 908*cdf0e10cSrcweir SwDocShell* pSourrceDocSh = pSourceShell->GetView().GetDocShell(); 909*cdf0e10cSrcweir pSfxDispatcher->Execute( pSourrceDocSh->HasName() ? SID_SAVEDOC : SID_SAVEASDOC, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD); 910*cdf0e10cSrcweir // has document been saved successfully? 911*cdf0e10cSrcweir if( !pSourrceDocSh->IsModified() ) 912*cdf0e10cSrcweir { 913*cdf0e10cSrcweir SfxMedium* pOrig = pSourceShell->GetView().GetDocShell()->GetMedium(); 914*cdf0e10cSrcweir String sSourceDocumentURL(pOrig->GetURLObject().GetMainURL( INetURLObject::NO_DECODE )); 915*cdf0e10cSrcweir const SfxFilter* pSfxFlt = SwIoSystem::GetFileFilter( 916*cdf0e10cSrcweir sSourceDocumentURL, ::aEmptyStr ); 917*cdf0e10cSrcweir const SfxFilter* pStoreToFilter = pSfxFlt; 918*cdf0e10cSrcweir SfxFilterContainer* pFilterContainer = SwDocShell::Factory().GetFilterContainer(); 919*cdf0e10cSrcweir const String* pStoreToFilterOptions = 0; 920*cdf0e10cSrcweir // if a save_to filter is set then use it - otherwise use the default 921*cdf0e10cSrcweir if( bEMail && !rMergeDescriptor.bSendAsAttachment ) 922*cdf0e10cSrcweir { 923*cdf0e10cSrcweir String sExtension( String::CreateFromAscii( 924*cdf0e10cSrcweir rMergeDescriptor.bSendAsHTML ? "html" : "txt" )); 925*cdf0e10cSrcweir pStoreToFilter = pFilterContainer->GetFilter4Extension(sExtension, SFX_FILTER_EXPORT); 926*cdf0e10cSrcweir } 927*cdf0e10cSrcweir else if( rMergeDescriptor.sSaveToFilter.Len()) 928*cdf0e10cSrcweir { 929*cdf0e10cSrcweir const SfxFilter* pFilter = 930*cdf0e10cSrcweir pFilterContainer->GetFilter4FilterName( rMergeDescriptor.sSaveToFilter ); 931*cdf0e10cSrcweir if(pFilter) 932*cdf0e10cSrcweir { 933*cdf0e10cSrcweir pStoreToFilter = pFilter; 934*cdf0e10cSrcweir if(rMergeDescriptor.sSaveToFilterOptions.Len()) 935*cdf0e10cSrcweir pStoreToFilterOptions = &rMergeDescriptor.sSaveToFilterOptions; 936*cdf0e10cSrcweir } 937*cdf0e10cSrcweir } 938*cdf0e10cSrcweir bCancel = sal_False; 939*cdf0e10cSrcweir 940*cdf0e10cSrcweir // in case of creating a single resulting file this has to be created here 941*cdf0e10cSrcweir SwWrtShell* pTargetShell = 0; 942*cdf0e10cSrcweir 943*cdf0e10cSrcweir // the shell will be explicitly closed at the end of the method, but it is 944*cdf0e10cSrcweir // still more safe to use SfxObjectShellLock here 945*cdf0e10cSrcweir SfxObjectShellLock xTargetDocShell; 946*cdf0e10cSrcweir 947*cdf0e10cSrcweir SwView* pTargetView = 0; 948*cdf0e10cSrcweir std::auto_ptr< utl::TempFile > aTempFile; 949*cdf0e10cSrcweir String sModifiedStartingPageDesc; 950*cdf0e10cSrcweir String sStartingPageDesc; 951*cdf0e10cSrcweir sal_uInt16 nStartingPageNo = 0; 952*cdf0e10cSrcweir bool bPageStylesWithHeaderFooter = false; 953*cdf0e10cSrcweir if(bAsSingleFile || rMergeDescriptor.bCreateSingleFile) 954*cdf0e10cSrcweir { 955*cdf0e10cSrcweir // create a target docshell to put the merged document into 956*cdf0e10cSrcweir xTargetDocShell = new SwDocShell( SFX_CREATE_MODE_STANDARD ); 957*cdf0e10cSrcweir xTargetDocShell->DoInitNew( 0 ); 958*cdf0e10cSrcweir SfxViewFrame* pTargetFrame = SfxViewFrame::LoadHiddenDocument( *xTargetDocShell, 0 ); 959*cdf0e10cSrcweir 960*cdf0e10cSrcweir pTargetView = static_cast<SwView*>( pTargetFrame->GetViewShell() ); 961*cdf0e10cSrcweir 962*cdf0e10cSrcweir //initiate SelectShell() to create sub shells 963*cdf0e10cSrcweir pTargetView->AttrChangedNotify( &pTargetView->GetWrtShell() ); 964*cdf0e10cSrcweir pTargetShell = pTargetView->GetWrtShellPtr(); 965*cdf0e10cSrcweir //copy the styles from the source to the target document 966*cdf0e10cSrcweir SwgReaderOption aOpt; 967*cdf0e10cSrcweir aOpt.SetTxtFmts( sal_True ); 968*cdf0e10cSrcweir aOpt.SetFrmFmts( sal_True ); 969*cdf0e10cSrcweir aOpt.SetPageDescs( sal_True ); 970*cdf0e10cSrcweir aOpt.SetNumRules( sal_True ); 971*cdf0e10cSrcweir aOpt.SetMerge( sal_False ); 972*cdf0e10cSrcweir pTargetView->GetDocShell()->LoadStylesFromFile( 973*cdf0e10cSrcweir sSourceDocumentURL, aOpt, sal_True ); 974*cdf0e10cSrcweir //determine the page style and number used at the start of the source document 975*cdf0e10cSrcweir pSourceShell->SttEndDoc(sal_True); 976*cdf0e10cSrcweir nStartingPageNo = pSourceShell->GetVirtPageNum(); 977*cdf0e10cSrcweir sStartingPageDesc = sModifiedStartingPageDesc = pSourceShell->GetPageDesc( 978*cdf0e10cSrcweir pSourceShell->GetCurPageDesc()).GetName(); 979*cdf0e10cSrcweir // #122799# copy compatibility options 980*cdf0e10cSrcweir lcl_CopyCompatibilityOptions( *pSourceShell, *pTargetShell); 981*cdf0e10cSrcweir // #72821# copy dynamic defaults 982*cdf0e10cSrcweir lcl_CopyDynamicDefaults( *pSourceShell->GetDoc(), *pTargetShell->GetDoc() ); 983*cdf0e10cSrcweir // #i72517# 984*cdf0e10cSrcweir const SwPageDesc* pSourcePageDesc = pSourceShell->FindPageDescByName( sStartingPageDesc ); 985*cdf0e10cSrcweir const SwFrmFmt& rMaster = pSourcePageDesc->GetMaster(); 986*cdf0e10cSrcweir bPageStylesWithHeaderFooter = rMaster.GetHeader().IsActive() || 987*cdf0e10cSrcweir rMaster.GetFooter().IsActive(); 988*cdf0e10cSrcweir 989*cdf0e10cSrcweir } 990*cdf0e10cSrcweir 991*cdf0e10cSrcweir PrintMonitor aPrtMonDlg(&pSourceShell->GetView().GetEditWin(), PrintMonitor::MONITOR_TYPE_PRINT); 992*cdf0e10cSrcweir aPrtMonDlg.aDocName.SetText(pSourceShell->GetView().GetDocShell()->GetTitle(22)); 993*cdf0e10cSrcweir 994*cdf0e10cSrcweir aPrtMonDlg.aCancel.SetClickHdl(LINK(this, SwNewDBMgr, PrtCancelHdl)); 995*cdf0e10cSrcweir if (!IsMergeSilent()) 996*cdf0e10cSrcweir aPrtMonDlg.Show(); 997*cdf0e10cSrcweir 998*cdf0e10cSrcweir // Progress, um KeyInputs zu unterbinden 999*cdf0e10cSrcweir SfxProgress aProgress(pSourrceDocSh, ::aEmptyStr, 1); 1000*cdf0e10cSrcweir 1001*cdf0e10cSrcweir // Alle Dispatcher sperren 1002*cdf0e10cSrcweir SfxViewFrame* pViewFrm = SfxViewFrame::GetFirst(pSourrceDocSh); 1003*cdf0e10cSrcweir while (pViewFrm) 1004*cdf0e10cSrcweir { 1005*cdf0e10cSrcweir pViewFrm->GetDispatcher()->Lock(sal_True); 1006*cdf0e10cSrcweir pViewFrm = SfxViewFrame::GetNext(*pViewFrm, pSourrceDocSh); 1007*cdf0e10cSrcweir } 1008*cdf0e10cSrcweir sal_uLong nDocNo = 1; 1009*cdf0e10cSrcweir 1010*cdf0e10cSrcweir long nStartRow, nEndRow; 1011*cdf0e10cSrcweir // collect temporary files 1012*cdf0e10cSrcweir ::std::vector< String> aFilesToRemove; 1013*cdf0e10cSrcweir do 1014*cdf0e10cSrcweir { 1015*cdf0e10cSrcweir nStartRow = pImpl->pMergeData ? pImpl->pMergeData->xResultSet->getRow() : 0; 1016*cdf0e10cSrcweir { 1017*cdf0e10cSrcweir String sPath(sSubject); 1018*cdf0e10cSrcweir 1019*cdf0e10cSrcweir String sAddress; 1020*cdf0e10cSrcweir if( !bEMail && bColumnName ) 1021*cdf0e10cSrcweir { 1022*cdf0e10cSrcweir SwDBFormatData aDBFormat; 1023*cdf0e10cSrcweir aDBFormat.xFormatter = pImpl->pMergeData->xFormatter; 1024*cdf0e10cSrcweir aDBFormat.aNullDate = pImpl->pMergeData->aNullDate; 1025*cdf0e10cSrcweir sAddress = GetDBField( xColumnProp, aDBFormat); 1026*cdf0e10cSrcweir if (!sAddress.Len()) 1027*cdf0e10cSrcweir sAddress = '_'; 1028*cdf0e10cSrcweir sPath += sAddress; 1029*cdf0e10cSrcweir } 1030*cdf0e10cSrcweir 1031*cdf0e10cSrcweir // create a new temporary file name - only done once in case of bCreateSingleFile 1032*cdf0e10cSrcweir if( 1 == nDocNo || (!rMergeDescriptor.bCreateSingleFile && !bAsSingleFile) ) 1033*cdf0e10cSrcweir { 1034*cdf0e10cSrcweir INetURLObject aEntry(sPath); 1035*cdf0e10cSrcweir String sLeading; 1036*cdf0e10cSrcweir //#i97667# if the name is from a database field then it will be used _as is_ 1037*cdf0e10cSrcweir if( sAddress.Len() ) 1038*cdf0e10cSrcweir sLeading = sAddress; 1039*cdf0e10cSrcweir else 1040*cdf0e10cSrcweir sLeading = aEntry.GetBase(); 1041*cdf0e10cSrcweir aEntry.removeSegment(); 1042*cdf0e10cSrcweir sPath = aEntry.GetMainURL( INetURLObject::NO_DECODE ); 1043*cdf0e10cSrcweir String sExt( pStoreToFilter->GetDefaultExtension() ); 1044*cdf0e10cSrcweir sExt.EraseLeadingChars('*'); 1045*cdf0e10cSrcweir aTempFile = std::auto_ptr< utl::TempFile >( 1046*cdf0e10cSrcweir new utl::TempFile(sLeading,&sExt,&sPath )); 1047*cdf0e10cSrcweir if( bAsSingleFile ) 1048*cdf0e10cSrcweir aTempFile->EnableKillingFile(); 1049*cdf0e10cSrcweir } 1050*cdf0e10cSrcweir 1051*cdf0e10cSrcweir if( !aTempFile->IsValid() ) 1052*cdf0e10cSrcweir { 1053*cdf0e10cSrcweir ErrorHandler::HandleError( ERRCODE_IO_NOTSUPPORTED ); 1054*cdf0e10cSrcweir bLoop = sal_False; 1055*cdf0e10cSrcweir bCancel = sal_True; 1056*cdf0e10cSrcweir } 1057*cdf0e10cSrcweir else 1058*cdf0e10cSrcweir { 1059*cdf0e10cSrcweir INetURLObject aTempFileURL(aTempFile->GetURL()); 1060*cdf0e10cSrcweir aPrtMonDlg.aPrinter.SetText( aTempFileURL.GetBase() ); 1061*cdf0e10cSrcweir String sStat(SW_RES(STR_STATSTR_LETTER)); // Brief 1062*cdf0e10cSrcweir sStat += ' '; 1063*cdf0e10cSrcweir sStat += String::CreateFromInt32( nDocNo ); 1064*cdf0e10cSrcweir aPrtMonDlg.aPrintInfo.SetText(sStat); 1065*cdf0e10cSrcweir 1066*cdf0e10cSrcweir // Rechenzeit fuer Save-Monitor: 1067*cdf0e10cSrcweir for (sal_uInt16 i = 0; i < 10; i++) 1068*cdf0e10cSrcweir Application::Reschedule(); 1069*cdf0e10cSrcweir 1070*cdf0e10cSrcweir // Create and save new document 1071*cdf0e10cSrcweir // The SfxObjectShell will be closed explicitly later but it is more safe to use SfxObjectShellLock here 1072*cdf0e10cSrcweir SfxObjectShellLock xWorkDocSh( new SwDocShell( SFX_CREATE_MODE_INTERNAL )); 1073*cdf0e10cSrcweir SfxMedium* pWorkMed = new SfxMedium( sSourceDocumentURL, STREAM_STD_READ, sal_True ); 1074*cdf0e10cSrcweir pWorkMed->SetFilter( pSfxFlt ); 1075*cdf0e10cSrcweir 1076*cdf0e10cSrcweir if (xWorkDocSh->DoLoad(pWorkMed)) 1077*cdf0e10cSrcweir { 1078*cdf0e10cSrcweir //create a view frame for the document 1079*cdf0e10cSrcweir SfxViewFrame* pWorkFrame = SfxViewFrame::LoadHiddenDocument( *xWorkDocSh, 0 ); 1080*cdf0e10cSrcweir //request the layout calculation 1081*cdf0e10cSrcweir SwWrtShell& rWorkShell = 1082*cdf0e10cSrcweir static_cast< SwView* >(pWorkFrame->GetViewShell())->GetWrtShell(); 1083*cdf0e10cSrcweir rWorkShell.CalcLayout(); 1084*cdf0e10cSrcweir SwDoc* pWorkDoc = ((SwDocShell*)(&xWorkDocSh))->GetDoc(); 1085*cdf0e10cSrcweir SwNewDBMgr* pOldDBMgr = pWorkDoc->GetNewDBMgr(); 1086*cdf0e10cSrcweir pWorkDoc->SetNewDBMgr( this ); 1087*cdf0e10cSrcweir SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_FIELD_MERGE, SwDocShell::GetEventName(STR_SW_EVENT_FIELD_MERGE), xWorkDocSh)); 1088*cdf0e10cSrcweir pWorkDoc->UpdateFlds(NULL, false); 1089*cdf0e10cSrcweir SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_FIELD_MERGE_FINISHED, SwDocShell::GetEventName(STR_SW_EVENT_FIELD_MERGE_FINISHED), xWorkDocSh)); 1090*cdf0e10cSrcweir 1091*cdf0e10cSrcweir // alle versteckten Felder/Bereiche entfernen 1092*cdf0e10cSrcweir pWorkDoc->RemoveInvisibleContent(); 1093*cdf0e10cSrcweir 1094*cdf0e10cSrcweir // launch MailMergeEvent if required 1095*cdf0e10cSrcweir const SwXMailMerge *pEvtSrc = GetMailMergeEvtSrc(); 1096*cdf0e10cSrcweir if(pEvtSrc) 1097*cdf0e10cSrcweir { 1098*cdf0e10cSrcweir uno::Reference< XInterface > xRef( (XMailMergeBroadcaster *) pEvtSrc ); 1099*cdf0e10cSrcweir text::MailMergeEvent aEvt( xRef, xWorkDocSh->GetModel() ); 1100*cdf0e10cSrcweir pEvtSrc->LaunchMailMergeEvent( aEvt ); 1101*cdf0e10cSrcweir } 1102*cdf0e10cSrcweir 1103*cdf0e10cSrcweir if(rMergeDescriptor.bCreateSingleFile || bAsSingleFile ) 1104*cdf0e10cSrcweir { 1105*cdf0e10cSrcweir DBG_ASSERT( pTargetShell, "no target shell available!" ); 1106*cdf0e10cSrcweir // copy created file into the target document 1107*cdf0e10cSrcweir rWorkShell.ConvertFieldsToText(); 1108*cdf0e10cSrcweir rWorkShell.SetNumberingRestart(); 1109*cdf0e10cSrcweir if( bSynchronizedDoc ) 1110*cdf0e10cSrcweir { 1111*cdf0e10cSrcweir lcl_RemoveSectionLinks( rWorkShell ); 1112*cdf0e10cSrcweir } 1113*cdf0e10cSrcweir 1114*cdf0e10cSrcweir // insert the document into the target document 1115*cdf0e10cSrcweir rWorkShell.SttEndDoc(sal_False); 1116*cdf0e10cSrcweir rWorkShell.SttEndDoc(sal_True); 1117*cdf0e10cSrcweir rWorkShell.SelAll(); 1118*cdf0e10cSrcweir pTargetShell->SwCrsrShell::SttEndDoc( sal_False ); 1119*cdf0e10cSrcweir //#i72517# the headers and footers are still those from the source - update in case of fields inside header/footer 1120*cdf0e10cSrcweir if( !nDocNo && bPageStylesWithHeaderFooter ) 1121*cdf0e10cSrcweir pTargetShell->GetView().GetDocShell()->_LoadStyles( *rWorkShell.GetView().GetDocShell(), sal_True ); 1122*cdf0e10cSrcweir //#i72517# put the styles to the target document 1123*cdf0e10cSrcweir //if the source uses headers or footers each new copy need to copy a new page styles 1124*cdf0e10cSrcweir if(bPageStylesWithHeaderFooter) 1125*cdf0e10cSrcweir { 1126*cdf0e10cSrcweir //create a new pagestyle 1127*cdf0e10cSrcweir //copy the pagedesc from the current document to the new document and change the name of the to-be-applied style 1128*cdf0e10cSrcweir 1129*cdf0e10cSrcweir SwDoc* pTargetDoc = pTargetShell->GetDoc(); 1130*cdf0e10cSrcweir SwPageDesc* pSourcePageDesc = rWorkShell.FindPageDescByName( sStartingPageDesc ); 1131*cdf0e10cSrcweir String sNewPageDescName = lcl_FindUniqueName(pTargetShell, sStartingPageDesc, nDocNo ); 1132*cdf0e10cSrcweir pTargetDoc->MakePageDesc( sNewPageDescName ); 1133*cdf0e10cSrcweir SwPageDesc* pTargetPageDesc = pTargetShell->FindPageDescByName( sNewPageDescName ); 1134*cdf0e10cSrcweir if(pSourcePageDesc && pTargetPageDesc) 1135*cdf0e10cSrcweir { 1136*cdf0e10cSrcweir pTargetDoc->CopyPageDesc( *pSourcePageDesc, *pTargetPageDesc, sal_False ); 1137*cdf0e10cSrcweir sModifiedStartingPageDesc = sNewPageDescName; 1138*cdf0e10cSrcweir lcl_CopyFollowPageDesc( *pTargetShell, *pSourcePageDesc, *pTargetPageDesc, nDocNo ); 1139*cdf0e10cSrcweir } 1140*cdf0e10cSrcweir } 1141*cdf0e10cSrcweir 1142*cdf0e10cSrcweir if(nDocNo > 1) 1143*cdf0e10cSrcweir pTargetShell->InsertPageBreak( &sModifiedStartingPageDesc, nStartingPageNo ); 1144*cdf0e10cSrcweir else 1145*cdf0e10cSrcweir pTargetShell->SetPageStyle(sModifiedStartingPageDesc); 1146*cdf0e10cSrcweir DBG_ASSERT(!pTargetShell->GetTableFmt(),"target document ends with a table - paragraph should be appended"); 1147*cdf0e10cSrcweir //#i51359# add a second paragraph in case there's only one 1148*cdf0e10cSrcweir { 1149*cdf0e10cSrcweir SwNodeIndex aIdx( pWorkDoc->GetNodes().GetEndOfExtras(), 2 ); 1150*cdf0e10cSrcweir SwPosition aTestPos( aIdx ); 1151*cdf0e10cSrcweir SwCursor aTestCrsr(aTestPos,0,false); 1152*cdf0e10cSrcweir if(!aTestCrsr.MovePara(fnParaNext, fnParaStart)) 1153*cdf0e10cSrcweir { 1154*cdf0e10cSrcweir //append a paragraph 1155*cdf0e10cSrcweir pWorkDoc->AppendTxtNode( aTestPos ); 1156*cdf0e10cSrcweir } 1157*cdf0e10cSrcweir } 1158*cdf0e10cSrcweir pTargetShell->Paste( rWorkShell.GetDoc(), sal_True ); 1159*cdf0e10cSrcweir 1160*cdf0e10cSrcweir //convert fields in page styles (header/footer - has to be done after the first document has been pasted 1161*cdf0e10cSrcweir if(1 == nDocNo) 1162*cdf0e10cSrcweir { 1163*cdf0e10cSrcweir pTargetShell->CalcLayout(); 1164*cdf0e10cSrcweir pTargetShell->ConvertFieldsToText(); 1165*cdf0e10cSrcweir } 1166*cdf0e10cSrcweir } 1167*cdf0e10cSrcweir else 1168*cdf0e10cSrcweir { 1169*cdf0e10cSrcweir String sFileURL = aTempFileURL.GetMainURL( INetURLObject::NO_DECODE ); 1170*cdf0e10cSrcweir SfxMedium* pDstMed = new SfxMedium( 1171*cdf0e10cSrcweir sFileURL, 1172*cdf0e10cSrcweir STREAM_STD_READWRITE, sal_True ); 1173*cdf0e10cSrcweir pDstMed->SetFilter( pStoreToFilter ); 1174*cdf0e10cSrcweir if(pDstMed->GetItemSet()) 1175*cdf0e10cSrcweir { 1176*cdf0e10cSrcweir if(pStoreToFilterOptions ) 1177*cdf0e10cSrcweir pDstMed->GetItemSet()->Put(SfxStringItem(SID_FILE_FILTEROPTIONS, *pStoreToFilterOptions)); 1178*cdf0e10cSrcweir if(rMergeDescriptor.aSaveToFilterData.getLength()) 1179*cdf0e10cSrcweir pDstMed->GetItemSet()->Put(SfxUsrAnyItem(SID_FILTER_DATA, makeAny(rMergeDescriptor.aSaveToFilterData))); 1180*cdf0e10cSrcweir } 1181*cdf0e10cSrcweir 1182*cdf0e10cSrcweir //convert fields to text if we are exporting to PDF 1183*cdf0e10cSrcweir //this prevents a second merge while updating the fields in SwXTextDocument::getRendererCount() 1184*cdf0e10cSrcweir if( pStoreToFilter && pStoreToFilter->GetFilterName().EqualsAscii("writer_pdf_Export")) 1185*cdf0e10cSrcweir rWorkShell.ConvertFieldsToText(); 1186*cdf0e10cSrcweir xWorkDocSh->DoSaveAs(*pDstMed); 1187*cdf0e10cSrcweir xWorkDocSh->DoSaveCompleted(pDstMed); 1188*cdf0e10cSrcweir if( xWorkDocSh->GetError() ) 1189*cdf0e10cSrcweir { 1190*cdf0e10cSrcweir // error message ?? 1191*cdf0e10cSrcweir ErrorHandler::HandleError( xWorkDocSh->GetError() ); 1192*cdf0e10cSrcweir bCancel = sal_True; 1193*cdf0e10cSrcweir bLoop = sal_False; 1194*cdf0e10cSrcweir } 1195*cdf0e10cSrcweir if( bEMail ) 1196*cdf0e10cSrcweir { 1197*cdf0e10cSrcweir SwDBFormatData aDBFormat; 1198*cdf0e10cSrcweir aDBFormat.xFormatter = pImpl->pMergeData->xFormatter; 1199*cdf0e10cSrcweir aDBFormat.aNullDate = pImpl->pMergeData->aNullDate; 1200*cdf0e10cSrcweir String sMailAddress = GetDBField( xColumnProp, aDBFormat); 1201*cdf0e10cSrcweir if(!SwMailMergeHelper::CheckMailAddress( sMailAddress )) 1202*cdf0e10cSrcweir { 1203*cdf0e10cSrcweir DBG_ERROR("invalid e-Mail address in database column"); 1204*cdf0e10cSrcweir } 1205*cdf0e10cSrcweir else 1206*cdf0e10cSrcweir { 1207*cdf0e10cSrcweir SwMailMessage* pMessage = 0; 1208*cdf0e10cSrcweir uno::Reference< mail::XMailMessage > xMessage = 1209*cdf0e10cSrcweir pMessage = new SwMailMessage; 1210*cdf0e10cSrcweir if(rMergeDescriptor.pMailMergeConfigItem->IsMailReplyTo()) 1211*cdf0e10cSrcweir pMessage->setReplyToAddress(rMergeDescriptor.pMailMergeConfigItem->GetMailReplyTo()); 1212*cdf0e10cSrcweir pMessage->addRecipient( sMailAddress ); 1213*cdf0e10cSrcweir pMessage->SetSenderAddress( rMergeDescriptor.pMailMergeConfigItem->GetMailAddress() ); 1214*cdf0e10cSrcweir ::rtl::OUString sBody; 1215*cdf0e10cSrcweir if(rMergeDescriptor.bSendAsAttachment) 1216*cdf0e10cSrcweir { 1217*cdf0e10cSrcweir sBody = rMergeDescriptor.sMailBody; 1218*cdf0e10cSrcweir mail::MailAttachment aAttach; 1219*cdf0e10cSrcweir aAttach.Data = new SwMailTransferable( 1220*cdf0e10cSrcweir sFileURL, 1221*cdf0e10cSrcweir rMergeDescriptor.sAttachmentName, 1222*cdf0e10cSrcweir pStoreToFilter->GetMimeType()); 1223*cdf0e10cSrcweir aAttach.ReadableName = rMergeDescriptor.sAttachmentName; 1224*cdf0e10cSrcweir pMessage->addAttachment( aAttach ); 1225*cdf0e10cSrcweir } 1226*cdf0e10cSrcweir else 1227*cdf0e10cSrcweir { 1228*cdf0e10cSrcweir { 1229*cdf0e10cSrcweir //read in the temporary file and use it as mail body 1230*cdf0e10cSrcweir SfxMedium aMedium( sFileURL, STREAM_READ, sal_True); 1231*cdf0e10cSrcweir SvStream* pInStream = aMedium.GetInStream(); 1232*cdf0e10cSrcweir DBG_ASSERT(pInStream, "no output file created?"); 1233*cdf0e10cSrcweir if(pInStream) 1234*cdf0e10cSrcweir { 1235*cdf0e10cSrcweir pInStream->SetStreamCharSet( eEncoding ); 1236*cdf0e10cSrcweir ByteString sLine; 1237*cdf0e10cSrcweir sal_Bool bDone = pInStream->ReadLine( sLine ); 1238*cdf0e10cSrcweir while ( bDone ) 1239*cdf0e10cSrcweir { 1240*cdf0e10cSrcweir sBody += String(sLine, eEncoding); 1241*cdf0e10cSrcweir sBody += ::rtl::OUString('\n'); 1242*cdf0e10cSrcweir bDone = pInStream->ReadLine( sLine ); 1243*cdf0e10cSrcweir } 1244*cdf0e10cSrcweir } 1245*cdf0e10cSrcweir } 1246*cdf0e10cSrcweir } 1247*cdf0e10cSrcweir pMessage->setSubject( rMergeDescriptor.sSubject ); 1248*cdf0e10cSrcweir uno::Reference< datatransfer::XTransferable> xBody = 1249*cdf0e10cSrcweir new SwMailTransferable( 1250*cdf0e10cSrcweir sBody, 1251*cdf0e10cSrcweir sBodyMimeType); 1252*cdf0e10cSrcweir pMessage->setBody( xBody ); 1253*cdf0e10cSrcweir 1254*cdf0e10cSrcweir if(rMergeDescriptor.aCopiesTo.getLength()) 1255*cdf0e10cSrcweir { 1256*cdf0e10cSrcweir const ::rtl::OUString* pCopies = rMergeDescriptor.aCopiesTo.getConstArray(); 1257*cdf0e10cSrcweir for( sal_Int32 nToken = 0; nToken < rMergeDescriptor.aCopiesTo.getLength(); ++nToken) 1258*cdf0e10cSrcweir pMessage->addCcRecipient( pCopies[nToken] ); 1259*cdf0e10cSrcweir } 1260*cdf0e10cSrcweir if(rMergeDescriptor.aBlindCopiesTo.getLength()) 1261*cdf0e10cSrcweir { 1262*cdf0e10cSrcweir const ::rtl::OUString* pCopies = rMergeDescriptor.aBlindCopiesTo.getConstArray(); 1263*cdf0e10cSrcweir for( sal_Int32 nToken = 0; nToken < rMergeDescriptor.aBlindCopiesTo.getLength(); ++nToken) 1264*cdf0e10cSrcweir pMessage->addBccRecipient( pCopies[nToken] ); 1265*cdf0e10cSrcweir } 1266*cdf0e10cSrcweir xMailDispatcher->enqueueMailMessage( xMessage ); 1267*cdf0e10cSrcweir if(!xMailDispatcher->isStarted()) 1268*cdf0e10cSrcweir xMailDispatcher->start(); 1269*cdf0e10cSrcweir //schedule for removal 1270*cdf0e10cSrcweir aFilesToRemove.push_back(sFileURL); 1271*cdf0e10cSrcweir } 1272*cdf0e10cSrcweir } 1273*cdf0e10cSrcweir } 1274*cdf0e10cSrcweir pWorkDoc->SetNewDBMgr( pOldDBMgr ); 1275*cdf0e10cSrcweir } 1276*cdf0e10cSrcweir xWorkDocSh->DoClose(); 1277*cdf0e10cSrcweir } 1278*cdf0e10cSrcweir } 1279*cdf0e10cSrcweir nDocNo++; 1280*cdf0e10cSrcweir nEndRow = pImpl->pMergeData ? pImpl->pMergeData->xResultSet->getRow() : 0; 1281*cdf0e10cSrcweir } while( !bCancel && 1282*cdf0e10cSrcweir (bSynchronizedDoc && (nStartRow != nEndRow)? ExistsNextRecord() : ToNextMergeRecord())); 1283*cdf0e10cSrcweir 1284*cdf0e10cSrcweir aPrtMonDlg.Show( sal_False ); 1285*cdf0e10cSrcweir 1286*cdf0e10cSrcweir // save the single output document 1287*cdf0e10cSrcweir if(rMergeDescriptor.bCreateSingleFile || bAsSingleFile) 1288*cdf0e10cSrcweir { 1289*cdf0e10cSrcweir if( rMergeDescriptor.nMergeType != DBMGR_MERGE_MAILMERGE ) 1290*cdf0e10cSrcweir { 1291*cdf0e10cSrcweir DBG_ASSERT( aTempFile.get(), "Temporary file not available" ); 1292*cdf0e10cSrcweir INetURLObject aTempFileURL(bAsSingleFile ? sSubject : aTempFile->GetURL()); 1293*cdf0e10cSrcweir SfxMedium* pDstMed = new SfxMedium( 1294*cdf0e10cSrcweir aTempFileURL.GetMainURL( INetURLObject::NO_DECODE ), 1295*cdf0e10cSrcweir STREAM_STD_READWRITE, sal_True ); 1296*cdf0e10cSrcweir pDstMed->SetFilter( pStoreToFilter ); 1297*cdf0e10cSrcweir if(pDstMed->GetItemSet()) 1298*cdf0e10cSrcweir { 1299*cdf0e10cSrcweir if(pStoreToFilterOptions ) 1300*cdf0e10cSrcweir pDstMed->GetItemSet()->Put(SfxStringItem(SID_FILE_FILTEROPTIONS, *pStoreToFilterOptions)); 1301*cdf0e10cSrcweir if(rMergeDescriptor.aSaveToFilterData.getLength()) 1302*cdf0e10cSrcweir pDstMed->GetItemSet()->Put(SfxUsrAnyItem(SID_FILTER_DATA, makeAny(rMergeDescriptor.aSaveToFilterData))); 1303*cdf0e10cSrcweir } 1304*cdf0e10cSrcweir 1305*cdf0e10cSrcweir xTargetDocShell->DoSaveAs(*pDstMed); 1306*cdf0e10cSrcweir xTargetDocShell->DoSaveCompleted(pDstMed); 1307*cdf0e10cSrcweir if( xTargetDocShell->GetError() ) 1308*cdf0e10cSrcweir { 1309*cdf0e10cSrcweir // error message ?? 1310*cdf0e10cSrcweir ErrorHandler::HandleError( xTargetDocShell->GetError() ); 1311*cdf0e10cSrcweir bLoop = sal_False; 1312*cdf0e10cSrcweir } 1313*cdf0e10cSrcweir } 1314*cdf0e10cSrcweir else if( pTargetView ) // must be available! 1315*cdf0e10cSrcweir { 1316*cdf0e10cSrcweir //print the target document 1317*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 1318*cdf0e10cSrcweir sal_Bool _bVal; 1319*cdf0e10cSrcweir sal_Int16 _nVal; 1320*cdf0e10cSrcweir rtl::OUString _sVal; 1321*cdf0e10cSrcweir const beans::PropertyValue* pDbgPrintOptions = rMergeDescriptor.aPrintOptions.getConstArray(); 1322*cdf0e10cSrcweir for( sal_Int32 nOption = 0; nOption < rMergeDescriptor.aPrintOptions.getLength(); ++nOption) 1323*cdf0e10cSrcweir { 1324*cdf0e10cSrcweir rtl::OUString aName( pDbgPrintOptions[nOption].Name ); 1325*cdf0e10cSrcweir uno::Any aVal( pDbgPrintOptions[nOption].Value ); 1326*cdf0e10cSrcweir aVal >>= _bVal; 1327*cdf0e10cSrcweir aVal >>= _nVal; 1328*cdf0e10cSrcweir aVal >>= _sVal; 1329*cdf0e10cSrcweir } 1330*cdf0e10cSrcweir #endif 1331*cdf0e10cSrcweir // printing should be done synchronously otherwise the document 1332*cdf0e10cSrcweir // might already become invalid during the process 1333*cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aOptions( rMergeDescriptor.aPrintOptions ); 1334*cdf0e10cSrcweir const sal_Int32 nOpts = aOptions.getLength(); 1335*cdf0e10cSrcweir aOptions.realloc( nOpts + 1 ); 1336*cdf0e10cSrcweir aOptions[ nOpts ].Name = rtl::OUString::createFromAscii( "Wait" ); 1337*cdf0e10cSrcweir aOptions[ nOpts ].Value <<= sal_True ; 1338*cdf0e10cSrcweir // aPrintArgs.Put(SfxBoolItem(FN_QRY_MERGE, sal_True) ); 1339*cdf0e10cSrcweir // // #i52629# aynchronous printing should only be done in silent mode - otherwise 1340*cdf0e10cSrcweir // // the printer dialog does not come up 1341*cdf0e10cSrcweir // aPrintArgs.Put( SfxBoolItem( SID_ASYNCHRON, rMergeDescriptor.bPrintAsync )); 1342*cdf0e10cSrcweir // move print options 1343*cdf0e10cSrcweir const beans::PropertyValue* pPrintOptions = rMergeDescriptor.aPrintOptions.getConstArray(); 1344*cdf0e10cSrcweir for( sal_Int32 nOption = 0; nOption < rMergeDescriptor.aPrintOptions.getLength(); ++nOption) 1345*cdf0e10cSrcweir { 1346*cdf0e10cSrcweir if( pPrintOptions[nOption].Name.equalsAscii( "CopyCount" ) 1347*cdf0e10cSrcweir ||( pPrintOptions[nOption].Name.equalsAscii( "FileName" )) 1348*cdf0e10cSrcweir ||( pPrintOptions[nOption].Name.equalsAscii( "Collate" )) 1349*cdf0e10cSrcweir ||( pPrintOptions[nOption].Name.equalsAscii( "Pages" )) 1350*cdf0e10cSrcweir ||( pPrintOptions[nOption].Name.equalsAscii( "Wait" ))) 1351*cdf0e10cSrcweir { 1352*cdf0e10cSrcweir aOptions.realloc( nOpts + 1 ); 1353*cdf0e10cSrcweir aOptions[ nOpts ].Name = pPrintOptions[nOption].Name; 1354*cdf0e10cSrcweir aOptions[ nOpts ].Value = pPrintOptions[nOption].Value ; 1355*cdf0e10cSrcweir } 1356*cdf0e10cSrcweir } 1357*cdf0e10cSrcweir 1358*cdf0e10cSrcweir // const SwModuleOptions * pModOpt = SW_MOD()->GetModuleConfig(); 1359*cdf0e10cSrcweir // if (pModOpt->IsSinglePrintJob()) 1360*cdf0e10cSrcweir // { 1361*cdf0e10cSrcweir // } 1362*cdf0e10cSrcweir // else 1363*cdf0e10cSrcweir // { 1364*cdf0e10cSrcweir pTargetView->ExecPrint( aOptions, IsMergeSilent(), rMergeDescriptor.bPrintAsync ); 1365*cdf0e10cSrcweir // } 1366*cdf0e10cSrcweir } 1367*cdf0e10cSrcweir xTargetDocShell->DoClose(); 1368*cdf0e10cSrcweir } 1369*cdf0e10cSrcweir 1370*cdf0e10cSrcweir //remove the temporary files 1371*cdf0e10cSrcweir ::std::vector<String>::iterator aFileIter; 1372*cdf0e10cSrcweir for(aFileIter = aFilesToRemove.begin(); 1373*cdf0e10cSrcweir aFileIter != aFilesToRemove.end(); aFileIter++) 1374*cdf0e10cSrcweir SWUnoHelper::UCB_DeleteFile( *aFileIter ); 1375*cdf0e10cSrcweir 1376*cdf0e10cSrcweir // Alle Dispatcher freigeben 1377*cdf0e10cSrcweir pViewFrm = SfxViewFrame::GetFirst(pSourrceDocSh); 1378*cdf0e10cSrcweir while (pViewFrm) 1379*cdf0e10cSrcweir { 1380*cdf0e10cSrcweir pViewFrm->GetDispatcher()->Lock(sal_False); 1381*cdf0e10cSrcweir pViewFrm = SfxViewFrame::GetNext(*pViewFrm, pSourrceDocSh); 1382*cdf0e10cSrcweir } 1383*cdf0e10cSrcweir 1384*cdf0e10cSrcweir SW_MOD()->SetView(&pSourceShell->GetView()); 1385*cdf0e10cSrcweir } 1386*cdf0e10cSrcweir 1387*cdf0e10cSrcweir nMergeType = DBMGR_INSERT; 1388*cdf0e10cSrcweir } 1389*cdf0e10cSrcweir 1390*cdf0e10cSrcweir if(bEMail) 1391*cdf0e10cSrcweir { 1392*cdf0e10cSrcweir xMailDispatcher->stop(); 1393*cdf0e10cSrcweir xMailDispatcher->shutdown(); 1394*cdf0e10cSrcweir 1395*cdf0e10cSrcweir } 1396*cdf0e10cSrcweir 1397*cdf0e10cSrcweir return bLoop; 1398*cdf0e10cSrcweir } 1399*cdf0e10cSrcweir 1400*cdf0e10cSrcweir /*-------------------------------------------------------------------- 1401*cdf0e10cSrcweir Beschreibung: 1402*cdf0e10cSrcweir --------------------------------------------------------------------*/ 1403*cdf0e10cSrcweir 1404*cdf0e10cSrcweir IMPL_LINK_INLINE_START( SwNewDBMgr, PrtCancelHdl, Button *, pButton ) 1405*cdf0e10cSrcweir { 1406*cdf0e10cSrcweir pButton->GetParent()->Hide(); 1407*cdf0e10cSrcweir bCancel = sal_True; 1408*cdf0e10cSrcweir return 0; 1409*cdf0e10cSrcweir } 1410*cdf0e10cSrcweir IMPL_LINK_INLINE_END( SwNewDBMgr, PrtCancelHdl, Button *, pButton ) 1411*cdf0e10cSrcweir 1412*cdf0e10cSrcweir 1413*cdf0e10cSrcweir /*-------------------------------------------------------------------- 1414*cdf0e10cSrcweir Beschreibung: Numberformat der Spalte ermitteln und ggfs. in 1415*cdf0e10cSrcweir den uebergebenen Formatter uebertragen 1416*cdf0e10cSrcweir --------------------------------------------------------------------*/ 1417*cdf0e10cSrcweir 1418*cdf0e10cSrcweir sal_uLong SwNewDBMgr::GetColumnFmt( const String& rDBName, 1419*cdf0e10cSrcweir const String& rTableName, 1420*cdf0e10cSrcweir const String& rColNm, 1421*cdf0e10cSrcweir SvNumberFormatter* pNFmtr, 1422*cdf0e10cSrcweir long nLanguage ) 1423*cdf0e10cSrcweir { 1424*cdf0e10cSrcweir sal_uLong nRet = 0; 1425*cdf0e10cSrcweir if(pNFmtr) 1426*cdf0e10cSrcweir { 1427*cdf0e10cSrcweir uno::Reference< XDataSource> xSource; 1428*cdf0e10cSrcweir uno::Reference< XConnection> xConnection; 1429*cdf0e10cSrcweir sal_Bool bUseMergeData = sal_False; 1430*cdf0e10cSrcweir uno::Reference< XColumnsSupplier> xColsSupp; 1431*cdf0e10cSrcweir bool bDisposeConnection = false; 1432*cdf0e10cSrcweir if(pImpl->pMergeData && 1433*cdf0e10cSrcweir pImpl->pMergeData->sDataSource.equals(rDBName) && pImpl->pMergeData->sCommand.equals(rTableName)) 1434*cdf0e10cSrcweir { 1435*cdf0e10cSrcweir xConnection = pImpl->pMergeData->xConnection; 1436*cdf0e10cSrcweir xSource = SwNewDBMgr::getDataSourceAsParent(xConnection,rDBName); 1437*cdf0e10cSrcweir bUseMergeData = sal_True; 1438*cdf0e10cSrcweir xColsSupp = xColsSupp.query( pImpl->pMergeData->xResultSet ); 1439*cdf0e10cSrcweir } 1440*cdf0e10cSrcweir if(!xConnection.is()) 1441*cdf0e10cSrcweir { 1442*cdf0e10cSrcweir SwDBData aData; 1443*cdf0e10cSrcweir aData.sDataSource = rDBName; 1444*cdf0e10cSrcweir aData.sCommand = rTableName; 1445*cdf0e10cSrcweir aData.nCommandType = -1; 1446*cdf0e10cSrcweir SwDSParam* pParam = FindDSData(aData, sal_False); 1447*cdf0e10cSrcweir if(pParam && pParam->xConnection.is()) 1448*cdf0e10cSrcweir { 1449*cdf0e10cSrcweir xConnection = pParam->xConnection; 1450*cdf0e10cSrcweir xColsSupp = xColsSupp.query( pParam->xResultSet ); 1451*cdf0e10cSrcweir } 1452*cdf0e10cSrcweir else 1453*cdf0e10cSrcweir { 1454*cdf0e10cSrcweir rtl::OUString sDBName(rDBName); 1455*cdf0e10cSrcweir xConnection = RegisterConnection( sDBName ); 1456*cdf0e10cSrcweir bDisposeConnection = true; 1457*cdf0e10cSrcweir } 1458*cdf0e10cSrcweir if(bUseMergeData) 1459*cdf0e10cSrcweir pImpl->pMergeData->xConnection = xConnection; 1460*cdf0e10cSrcweir } 1461*cdf0e10cSrcweir bool bDispose = !xColsSupp.is(); 1462*cdf0e10cSrcweir if(bDispose) 1463*cdf0e10cSrcweir { 1464*cdf0e10cSrcweir xColsSupp = SwNewDBMgr::GetColumnSupplier(xConnection, rTableName); 1465*cdf0e10cSrcweir } 1466*cdf0e10cSrcweir if(xColsSupp.is()) 1467*cdf0e10cSrcweir { 1468*cdf0e10cSrcweir uno::Reference<XNameAccess> xCols; 1469*cdf0e10cSrcweir try 1470*cdf0e10cSrcweir { 1471*cdf0e10cSrcweir xCols = xColsSupp->getColumns(); 1472*cdf0e10cSrcweir } 1473*cdf0e10cSrcweir catch(Exception&) 1474*cdf0e10cSrcweir { 1475*cdf0e10cSrcweir DBG_ERROR("Exception in getColumns()"); 1476*cdf0e10cSrcweir } 1477*cdf0e10cSrcweir if(!xCols.is() || !xCols->hasByName(rColNm)) 1478*cdf0e10cSrcweir return nRet; 1479*cdf0e10cSrcweir Any aCol = xCols->getByName(rColNm); 1480*cdf0e10cSrcweir uno::Reference< XPropertySet > xColumn; 1481*cdf0e10cSrcweir aCol >>= xColumn; 1482*cdf0e10cSrcweir nRet = GetColumnFmt(xSource, xConnection, xColumn, pNFmtr, nLanguage); 1483*cdf0e10cSrcweir if(bDispose) 1484*cdf0e10cSrcweir { 1485*cdf0e10cSrcweir ::comphelper::disposeComponent( xColsSupp ); 1486*cdf0e10cSrcweir } 1487*cdf0e10cSrcweir if(bDisposeConnection) 1488*cdf0e10cSrcweir { 1489*cdf0e10cSrcweir ::comphelper::disposeComponent( xConnection ); 1490*cdf0e10cSrcweir } 1491*cdf0e10cSrcweir } 1492*cdf0e10cSrcweir else 1493*cdf0e10cSrcweir nRet = pNFmtr->GetFormatIndex( NF_NUMBER_STANDARD, LANGUAGE_SYSTEM ); 1494*cdf0e10cSrcweir } 1495*cdf0e10cSrcweir return nRet; 1496*cdf0e10cSrcweir } 1497*cdf0e10cSrcweir /* -----------------------------07.06.01 15:43-------------------------------- 1498*cdf0e10cSrcweir 1499*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1500*cdf0e10cSrcweir sal_uLong SwNewDBMgr::GetColumnFmt( uno::Reference< XDataSource> xSource, 1501*cdf0e10cSrcweir uno::Reference< XConnection> xConnection, 1502*cdf0e10cSrcweir uno::Reference< XPropertySet> xColumn, 1503*cdf0e10cSrcweir SvNumberFormatter* pNFmtr, 1504*cdf0e10cSrcweir long nLanguage ) 1505*cdf0e10cSrcweir { 1506*cdf0e10cSrcweir //JP 12.01.99: ggfs. das NumberFormat im Doc setzen 1507*cdf0e10cSrcweir sal_uLong nRet = 0; 1508*cdf0e10cSrcweir 1509*cdf0e10cSrcweir if(!xSource.is()) 1510*cdf0e10cSrcweir { 1511*cdf0e10cSrcweir uno::Reference<XChild> xChild(xConnection, UNO_QUERY); 1512*cdf0e10cSrcweir if ( xChild.is() ) 1513*cdf0e10cSrcweir xSource = uno::Reference<XDataSource>(xChild->getParent(), UNO_QUERY); 1514*cdf0e10cSrcweir } 1515*cdf0e10cSrcweir if(xSource.is() && xConnection.is() && xColumn.is() && pNFmtr) 1516*cdf0e10cSrcweir { 1517*cdf0e10cSrcweir SvNumberFormatsSupplierObj* pNumFmt = new SvNumberFormatsSupplierObj( pNFmtr ); 1518*cdf0e10cSrcweir uno::Reference< util::XNumberFormatsSupplier > xDocNumFmtsSupplier = pNumFmt; 1519*cdf0e10cSrcweir uno::Reference< XNumberFormats > xDocNumberFormats = xDocNumFmtsSupplier->getNumberFormats(); 1520*cdf0e10cSrcweir uno::Reference< XNumberFormatTypes > xDocNumberFormatTypes(xDocNumberFormats, UNO_QUERY); 1521*cdf0e10cSrcweir 1522*cdf0e10cSrcweir Locale aLocale( MsLangId::convertLanguageToLocale( (LanguageType)nLanguage )); 1523*cdf0e10cSrcweir 1524*cdf0e10cSrcweir //get the number formatter of the data source 1525*cdf0e10cSrcweir uno::Reference<XPropertySet> xSourceProps(xSource, UNO_QUERY); 1526*cdf0e10cSrcweir uno::Reference< XNumberFormats > xNumberFormats; 1527*cdf0e10cSrcweir if(xSourceProps.is()) 1528*cdf0e10cSrcweir { 1529*cdf0e10cSrcweir Any aFormats = xSourceProps->getPropertyValue(C2U("NumberFormatsSupplier")); 1530*cdf0e10cSrcweir if(aFormats.hasValue()) 1531*cdf0e10cSrcweir { 1532*cdf0e10cSrcweir uno::Reference<XNumberFormatsSupplier> xSuppl; 1533*cdf0e10cSrcweir aFormats >>= xSuppl; 1534*cdf0e10cSrcweir if(xSuppl.is()) 1535*cdf0e10cSrcweir { 1536*cdf0e10cSrcweir xNumberFormats = xSuppl->getNumberFormats(); 1537*cdf0e10cSrcweir } 1538*cdf0e10cSrcweir } 1539*cdf0e10cSrcweir } 1540*cdf0e10cSrcweir bool bUseDefault = true; 1541*cdf0e10cSrcweir try 1542*cdf0e10cSrcweir { 1543*cdf0e10cSrcweir Any aFormatKey = xColumn->getPropertyValue(C2U("FormatKey")); 1544*cdf0e10cSrcweir if(aFormatKey.hasValue()) 1545*cdf0e10cSrcweir { 1546*cdf0e10cSrcweir sal_Int32 nFmt = 0; 1547*cdf0e10cSrcweir aFormatKey >>= nFmt; 1548*cdf0e10cSrcweir if(xNumberFormats.is()) 1549*cdf0e10cSrcweir { 1550*cdf0e10cSrcweir try 1551*cdf0e10cSrcweir { 1552*cdf0e10cSrcweir uno::Reference<XPropertySet> xNumProps = xNumberFormats->getByKey( nFmt ); 1553*cdf0e10cSrcweir Any aFormatString = xNumProps->getPropertyValue(C2U("FormatString")); 1554*cdf0e10cSrcweir Any aLocaleVal = xNumProps->getPropertyValue(C2U("Locale")); 1555*cdf0e10cSrcweir rtl::OUString sFormat; 1556*cdf0e10cSrcweir aFormatString >>= sFormat; 1557*cdf0e10cSrcweir lang::Locale aLoc; 1558*cdf0e10cSrcweir aLocaleVal >>= aLoc; 1559*cdf0e10cSrcweir nFmt = xDocNumberFormats->queryKey( sFormat, aLoc, sal_False ); 1560*cdf0e10cSrcweir if(NUMBERFORMAT_ENTRY_NOT_FOUND == sal::static_int_cast< sal_uInt32, sal_Int32>(nFmt)) 1561*cdf0e10cSrcweir nFmt = xDocNumberFormats->addNew( sFormat, aLoc ); 1562*cdf0e10cSrcweir nRet = nFmt; 1563*cdf0e10cSrcweir bUseDefault = false; 1564*cdf0e10cSrcweir } 1565*cdf0e10cSrcweir catch(const Exception&) 1566*cdf0e10cSrcweir { 1567*cdf0e10cSrcweir DBG_ERROR("illegal number format key"); 1568*cdf0e10cSrcweir } 1569*cdf0e10cSrcweir } 1570*cdf0e10cSrcweir } 1571*cdf0e10cSrcweir } 1572*cdf0e10cSrcweir catch( const Exception& ) 1573*cdf0e10cSrcweir { 1574*cdf0e10cSrcweir DBG_ERROR("no FormatKey property found"); 1575*cdf0e10cSrcweir } 1576*cdf0e10cSrcweir if(bUseDefault) 1577*cdf0e10cSrcweir nRet = SwNewDBMgr::GetDbtoolsClient().getDefaultNumberFormat(xColumn, xDocNumberFormatTypes, aLocale); 1578*cdf0e10cSrcweir } 1579*cdf0e10cSrcweir return nRet; 1580*cdf0e10cSrcweir } 1581*cdf0e10cSrcweir 1582*cdf0e10cSrcweir /* -----------------------------17.07.00 09:47-------------------------------- 1583*cdf0e10cSrcweir 1584*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1585*cdf0e10cSrcweir sal_Int32 SwNewDBMgr::GetColumnType( const String& rDBName, 1586*cdf0e10cSrcweir const String& rTableName, 1587*cdf0e10cSrcweir const String& rColNm ) 1588*cdf0e10cSrcweir { 1589*cdf0e10cSrcweir sal_Int32 nRet = DataType::SQLNULL; 1590*cdf0e10cSrcweir SwDBData aData; 1591*cdf0e10cSrcweir aData.sDataSource = rDBName; 1592*cdf0e10cSrcweir aData.sCommand = rTableName; 1593*cdf0e10cSrcweir aData.nCommandType = -1; 1594*cdf0e10cSrcweir SwDSParam* pParam = FindDSData(aData, sal_False); 1595*cdf0e10cSrcweir uno::Reference< XConnection> xConnection; 1596*cdf0e10cSrcweir uno::Reference< XColumnsSupplier > xColsSupp; 1597*cdf0e10cSrcweir bool bDispose = false; 1598*cdf0e10cSrcweir if(pParam && pParam->xConnection.is()) 1599*cdf0e10cSrcweir { 1600*cdf0e10cSrcweir xConnection = pParam->xConnection; 1601*cdf0e10cSrcweir xColsSupp = uno::Reference< XColumnsSupplier >( pParam->xResultSet, UNO_QUERY ); 1602*cdf0e10cSrcweir } 1603*cdf0e10cSrcweir else 1604*cdf0e10cSrcweir { 1605*cdf0e10cSrcweir rtl::OUString sDBName(rDBName); 1606*cdf0e10cSrcweir xConnection = RegisterConnection( sDBName ); 1607*cdf0e10cSrcweir } 1608*cdf0e10cSrcweir if( !xColsSupp.is() ) 1609*cdf0e10cSrcweir { 1610*cdf0e10cSrcweir xColsSupp = SwNewDBMgr::GetColumnSupplier(xConnection, rTableName); 1611*cdf0e10cSrcweir bDispose = true; 1612*cdf0e10cSrcweir } 1613*cdf0e10cSrcweir if(xColsSupp.is()) 1614*cdf0e10cSrcweir { 1615*cdf0e10cSrcweir uno::Reference<XNameAccess> xCols = xColsSupp->getColumns(); 1616*cdf0e10cSrcweir if(xCols->hasByName(rColNm)) 1617*cdf0e10cSrcweir { 1618*cdf0e10cSrcweir Any aCol = xCols->getByName(rColNm); 1619*cdf0e10cSrcweir uno::Reference<XPropertySet> xCol; 1620*cdf0e10cSrcweir aCol >>= xCol; 1621*cdf0e10cSrcweir Any aType = xCol->getPropertyValue(C2S("Type")); 1622*cdf0e10cSrcweir aType >>= nRet; 1623*cdf0e10cSrcweir } 1624*cdf0e10cSrcweir if(bDispose) 1625*cdf0e10cSrcweir ::comphelper::disposeComponent( xColsSupp ); 1626*cdf0e10cSrcweir } 1627*cdf0e10cSrcweir return nRet; 1628*cdf0e10cSrcweir } 1629*cdf0e10cSrcweir 1630*cdf0e10cSrcweir /* -----------------------------03.07.00 17:12-------------------------------- 1631*cdf0e10cSrcweir 1632*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1633*cdf0e10cSrcweir uno::Reference< sdbc::XConnection> SwNewDBMgr::GetConnection(const String& rDataSource, 1634*cdf0e10cSrcweir uno::Reference<XDataSource>& rxSource) 1635*cdf0e10cSrcweir { 1636*cdf0e10cSrcweir Reference< sdbc::XConnection> xConnection; 1637*cdf0e10cSrcweir Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 1638*cdf0e10cSrcweir try 1639*cdf0e10cSrcweir { 1640*cdf0e10cSrcweir Reference<XCompletedConnection> xComplConnection(SwNewDBMgr::GetDbtoolsClient().getDataSource(rDataSource, xMgr),UNO_QUERY); 1641*cdf0e10cSrcweir if ( xComplConnection.is() ) 1642*cdf0e10cSrcweir { 1643*cdf0e10cSrcweir rxSource.set(xComplConnection,UNO_QUERY); 1644*cdf0e10cSrcweir Reference< XInteractionHandler > xHandler( 1645*cdf0e10cSrcweir xMgr->createInstance( C2U( "com.sun.star.task.InteractionHandler" )), UNO_QUERY); 1646*cdf0e10cSrcweir xConnection = xComplConnection->connectWithCompletion( xHandler ); 1647*cdf0e10cSrcweir } 1648*cdf0e10cSrcweir } 1649*cdf0e10cSrcweir catch(Exception&) {} 1650*cdf0e10cSrcweir 1651*cdf0e10cSrcweir return xConnection; 1652*cdf0e10cSrcweir } 1653*cdf0e10cSrcweir /* -----------------------------03.07.00 17:12-------------------------------- 1654*cdf0e10cSrcweir 1655*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1656*cdf0e10cSrcweir uno::Reference< sdbcx::XColumnsSupplier> SwNewDBMgr::GetColumnSupplier(uno::Reference<sdbc::XConnection> xConnection, 1657*cdf0e10cSrcweir const String& rTableOrQuery, 1658*cdf0e10cSrcweir sal_uInt8 eTableOrQuery) 1659*cdf0e10cSrcweir { 1660*cdf0e10cSrcweir Reference< sdbcx::XColumnsSupplier> xRet; 1661*cdf0e10cSrcweir try 1662*cdf0e10cSrcweir { 1663*cdf0e10cSrcweir if(eTableOrQuery == SW_DB_SELECT_UNKNOWN) 1664*cdf0e10cSrcweir { 1665*cdf0e10cSrcweir //search for a table with the given command name 1666*cdf0e10cSrcweir Reference<XTablesSupplier> xTSupplier = Reference<XTablesSupplier>(xConnection, UNO_QUERY); 1667*cdf0e10cSrcweir if(xTSupplier.is()) 1668*cdf0e10cSrcweir { 1669*cdf0e10cSrcweir Reference<XNameAccess> xTbls = xTSupplier->getTables(); 1670*cdf0e10cSrcweir eTableOrQuery = xTbls->hasByName(rTableOrQuery) ? 1671*cdf0e10cSrcweir SW_DB_SELECT_TABLE : SW_DB_SELECT_QUERY; 1672*cdf0e10cSrcweir } 1673*cdf0e10cSrcweir } 1674*cdf0e10cSrcweir sal_Int32 nCommandType = SW_DB_SELECT_TABLE == eTableOrQuery ? 1675*cdf0e10cSrcweir CommandType::TABLE : CommandType::QUERY; 1676*cdf0e10cSrcweir Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 1677*cdf0e10cSrcweir Reference<XRowSet> xRowSet( 1678*cdf0e10cSrcweir xMgr->createInstance(C2U("com.sun.star.sdb.RowSet")), UNO_QUERY); 1679*cdf0e10cSrcweir 1680*cdf0e10cSrcweir ::rtl::OUString sDataSource; 1681*cdf0e10cSrcweir Reference<XDataSource> xSource = SwNewDBMgr::getDataSourceAsParent(xConnection, sDataSource); 1682*cdf0e10cSrcweir Reference<XPropertySet> xSourceProperties(xSource, UNO_QUERY); 1683*cdf0e10cSrcweir if(xSourceProperties.is()) 1684*cdf0e10cSrcweir { 1685*cdf0e10cSrcweir xSourceProperties->getPropertyValue(C2U("Name")) >>= sDataSource; 1686*cdf0e10cSrcweir } 1687*cdf0e10cSrcweir 1688*cdf0e10cSrcweir Reference<XPropertySet> xRowProperties(xRowSet, UNO_QUERY); 1689*cdf0e10cSrcweir xRowProperties->setPropertyValue(C2U("DataSourceName"), makeAny(sDataSource)); 1690*cdf0e10cSrcweir xRowProperties->setPropertyValue(C2U("Command"), makeAny(::rtl::OUString(rTableOrQuery))); 1691*cdf0e10cSrcweir xRowProperties->setPropertyValue(C2U("CommandType"), makeAny(nCommandType)); 1692*cdf0e10cSrcweir xRowProperties->setPropertyValue(C2U("FetchSize"), makeAny((sal_Int32)10)); 1693*cdf0e10cSrcweir xRowProperties->setPropertyValue(C2U("ActiveConnection"), makeAny(xConnection)); 1694*cdf0e10cSrcweir xRowSet->execute(); 1695*cdf0e10cSrcweir xRet = Reference<XColumnsSupplier>( xRowSet, UNO_QUERY ); 1696*cdf0e10cSrcweir } 1697*cdf0e10cSrcweir catch( const uno::Exception& ) 1698*cdf0e10cSrcweir { 1699*cdf0e10cSrcweir DBG_ERROR("Exception in SwDBMgr::GetColumnSupplier"); 1700*cdf0e10cSrcweir } 1701*cdf0e10cSrcweir 1702*cdf0e10cSrcweir return xRet; 1703*cdf0e10cSrcweir } 1704*cdf0e10cSrcweir /* -----------------------------05.07.00 13:44-------------------------------- 1705*cdf0e10cSrcweir 1706*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1707*cdf0e10cSrcweir String SwNewDBMgr::GetDBField(uno::Reference<XPropertySet> xColumnProps, 1708*cdf0e10cSrcweir const SwDBFormatData& rDBFormatData, 1709*cdf0e10cSrcweir double* pNumber) 1710*cdf0e10cSrcweir { 1711*cdf0e10cSrcweir uno::Reference< XColumn > xColumn(xColumnProps, UNO_QUERY); 1712*cdf0e10cSrcweir String sRet; 1713*cdf0e10cSrcweir DBG_ASSERT(xColumn.is(), "SwNewDBMgr::::ImportDBField: illegal arguments"); 1714*cdf0e10cSrcweir if(!xColumn.is()) 1715*cdf0e10cSrcweir return sRet; 1716*cdf0e10cSrcweir 1717*cdf0e10cSrcweir Any aType = xColumnProps->getPropertyValue(C2U("Type")); 1718*cdf0e10cSrcweir sal_Int32 eDataType = 0; 1719*cdf0e10cSrcweir aType >>= eDataType; 1720*cdf0e10cSrcweir switch(eDataType) 1721*cdf0e10cSrcweir { 1722*cdf0e10cSrcweir case DataType::CHAR: 1723*cdf0e10cSrcweir case DataType::VARCHAR: 1724*cdf0e10cSrcweir case DataType::LONGVARCHAR: 1725*cdf0e10cSrcweir try 1726*cdf0e10cSrcweir { 1727*cdf0e10cSrcweir sRet = xColumn->getString(); 1728*cdf0e10cSrcweir } 1729*cdf0e10cSrcweir catch( SQLException& ) 1730*cdf0e10cSrcweir { 1731*cdf0e10cSrcweir } 1732*cdf0e10cSrcweir break; 1733*cdf0e10cSrcweir case DataType::BIT: 1734*cdf0e10cSrcweir case DataType::BOOLEAN: 1735*cdf0e10cSrcweir case DataType::TINYINT: 1736*cdf0e10cSrcweir case DataType::SMALLINT: 1737*cdf0e10cSrcweir case DataType::INTEGER: 1738*cdf0e10cSrcweir case DataType::BIGINT: 1739*cdf0e10cSrcweir case DataType::FLOAT: 1740*cdf0e10cSrcweir case DataType::REAL: 1741*cdf0e10cSrcweir case DataType::DOUBLE: 1742*cdf0e10cSrcweir case DataType::NUMERIC: 1743*cdf0e10cSrcweir case DataType::DECIMAL: 1744*cdf0e10cSrcweir case DataType::DATE: 1745*cdf0e10cSrcweir case DataType::TIME: 1746*cdf0e10cSrcweir case DataType::TIMESTAMP: 1747*cdf0e10cSrcweir { 1748*cdf0e10cSrcweir // ::Date aTempDate(rDBFormatData.aNullDate.Day, 1749*cdf0e10cSrcweir // rDBFormatData.aNullDate.Month, rDBFormatData.aNullDate.Year); 1750*cdf0e10cSrcweir 1751*cdf0e10cSrcweir try 1752*cdf0e10cSrcweir { 1753*cdf0e10cSrcweir SwDbtoolsClient& aClient = SwNewDBMgr::GetDbtoolsClient(); 1754*cdf0e10cSrcweir sRet = aClient.getFormattedValue( 1755*cdf0e10cSrcweir xColumnProps, 1756*cdf0e10cSrcweir rDBFormatData.xFormatter, 1757*cdf0e10cSrcweir rDBFormatData.aLocale, 1758*cdf0e10cSrcweir rDBFormatData.aNullDate); 1759*cdf0e10cSrcweir if (pNumber) 1760*cdf0e10cSrcweir { 1761*cdf0e10cSrcweir double fVal = xColumn->getDouble(); 1762*cdf0e10cSrcweir if(!xColumn->wasNull()) 1763*cdf0e10cSrcweir { 1764*cdf0e10cSrcweir *pNumber = fVal; 1765*cdf0e10cSrcweir } 1766*cdf0e10cSrcweir } 1767*cdf0e10cSrcweir } 1768*cdf0e10cSrcweir catch(Exception& ) 1769*cdf0e10cSrcweir { 1770*cdf0e10cSrcweir DBG_ERROR("exception caught"); 1771*cdf0e10cSrcweir } 1772*cdf0e10cSrcweir 1773*cdf0e10cSrcweir } 1774*cdf0e10cSrcweir break; 1775*cdf0e10cSrcweir 1776*cdf0e10cSrcweir // case DataType::BINARY: 1777*cdf0e10cSrcweir // case DataType::VARBINARY: 1778*cdf0e10cSrcweir // case DataType::LONGVARBINARY: 1779*cdf0e10cSrcweir // case DataType::SQLNULL: 1780*cdf0e10cSrcweir // case DataType::OTHER: 1781*cdf0e10cSrcweir // case DataType::OBJECT: 1782*cdf0e10cSrcweir // case DataType::DISTINCT: 1783*cdf0e10cSrcweir // case DataType::STRUCT: 1784*cdf0e10cSrcweir // case DataType::ARRAY: 1785*cdf0e10cSrcweir // case DataType::BLOB: 1786*cdf0e10cSrcweir // case DataType::CLOB: 1787*cdf0e10cSrcweir // case DataType::REF: 1788*cdf0e10cSrcweir // default: 1789*cdf0e10cSrcweir } 1790*cdf0e10cSrcweir // if (pFormat) 1791*cdf0e10cSrcweir // { 1792*cdf0e10cSrcweir // SFX_ITEMSET_GET(*pCol, pFormatItem, SfxUInt32Item, SBA_DEF_FMTVALUE, sal_True); 1793*cdf0e10cSrcweir // *pFormat = pFormatItem->GetValue(); 1794*cdf0e10cSrcweir // } 1795*cdf0e10cSrcweir 1796*cdf0e10cSrcweir return sRet; 1797*cdf0e10cSrcweir } 1798*cdf0e10cSrcweir /* -----------------------------06.07.00 14:28-------------------------------- 1799*cdf0e10cSrcweir releases the merge data source table or query after merge is completed 1800*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1801*cdf0e10cSrcweir void SwNewDBMgr::EndMerge() 1802*cdf0e10cSrcweir { 1803*cdf0e10cSrcweir DBG_ASSERT(bInMerge, "merge is not active"); 1804*cdf0e10cSrcweir bInMerge = sal_False; 1805*cdf0e10cSrcweir delete pImpl->pMergeData; 1806*cdf0e10cSrcweir pImpl->pMergeData = 0; 1807*cdf0e10cSrcweir } 1808*cdf0e10cSrcweir /* -----------------------------06.07.00 14:28-------------------------------- 1809*cdf0e10cSrcweir checks if a desired data source table or query is open 1810*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1811*cdf0e10cSrcweir sal_Bool SwNewDBMgr::IsDataSourceOpen(const String& rDataSource, 1812*cdf0e10cSrcweir const String& rTableOrQuery, sal_Bool bMergeOnly) 1813*cdf0e10cSrcweir { 1814*cdf0e10cSrcweir if(pImpl->pMergeData) 1815*cdf0e10cSrcweir { 1816*cdf0e10cSrcweir return !bMergeLock && 1817*cdf0e10cSrcweir ((rDataSource == (String)pImpl->pMergeData->sDataSource && 1818*cdf0e10cSrcweir rTableOrQuery == (String)pImpl->pMergeData->sCommand) 1819*cdf0e10cSrcweir ||(!rDataSource.Len() && !rTableOrQuery.Len())) 1820*cdf0e10cSrcweir && 1821*cdf0e10cSrcweir pImpl->pMergeData->xResultSet.is(); 1822*cdf0e10cSrcweir } 1823*cdf0e10cSrcweir else if(!bMergeOnly) 1824*cdf0e10cSrcweir { 1825*cdf0e10cSrcweir SwDBData aData; 1826*cdf0e10cSrcweir aData.sDataSource = rDataSource; 1827*cdf0e10cSrcweir aData.sCommand = rTableOrQuery; 1828*cdf0e10cSrcweir aData.nCommandType = -1; 1829*cdf0e10cSrcweir SwDSParam* pFound = FindDSData(aData, sal_False); 1830*cdf0e10cSrcweir return (pFound && pFound->xResultSet.is()); 1831*cdf0e10cSrcweir } 1832*cdf0e10cSrcweir return sal_False; 1833*cdf0e10cSrcweir } 1834*cdf0e10cSrcweir /* -----------------------------17.07.00 16:44-------------------------------- 1835*cdf0e10cSrcweir read column data a a specified position 1836*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1837*cdf0e10cSrcweir sal_Bool SwNewDBMgr::GetColumnCnt(const String& rSourceName, const String& rTableName, 1838*cdf0e10cSrcweir const String& rColumnName, sal_uInt32 nAbsRecordId, 1839*cdf0e10cSrcweir long nLanguage, 1840*cdf0e10cSrcweir String& rResult, double* pNumber) 1841*cdf0e10cSrcweir { 1842*cdf0e10cSrcweir sal_Bool bRet = sal_False; 1843*cdf0e10cSrcweir SwDSParam* pFound = 0; 1844*cdf0e10cSrcweir //check if it's the merge data source 1845*cdf0e10cSrcweir if(pImpl->pMergeData && 1846*cdf0e10cSrcweir rSourceName == (String)pImpl->pMergeData->sDataSource && 1847*cdf0e10cSrcweir rTableName == (String)pImpl->pMergeData->sCommand) 1848*cdf0e10cSrcweir { 1849*cdf0e10cSrcweir pFound = pImpl->pMergeData; 1850*cdf0e10cSrcweir } 1851*cdf0e10cSrcweir else 1852*cdf0e10cSrcweir { 1853*cdf0e10cSrcweir SwDBData aData; 1854*cdf0e10cSrcweir aData.sDataSource = rSourceName; 1855*cdf0e10cSrcweir aData.sCommand = rTableName; 1856*cdf0e10cSrcweir aData.nCommandType = -1; 1857*cdf0e10cSrcweir pFound = FindDSData(aData, sal_False); 1858*cdf0e10cSrcweir } 1859*cdf0e10cSrcweir //check validity of supplied record Id 1860*cdf0e10cSrcweir if(pFound->aSelection.getLength()) 1861*cdf0e10cSrcweir { 1862*cdf0e10cSrcweir //the destination has to be an element of the selection 1863*cdf0e10cSrcweir const Any* pSelection = pFound->aSelection.getConstArray(); 1864*cdf0e10cSrcweir sal_Bool bFound = sal_False; 1865*cdf0e10cSrcweir for(sal_Int32 nPos = 0; !bFound && nPos < pFound->aSelection.getLength(); nPos++) 1866*cdf0e10cSrcweir { 1867*cdf0e10cSrcweir sal_Int32 nSelection = 0; 1868*cdf0e10cSrcweir pSelection[nPos] >>= nSelection; 1869*cdf0e10cSrcweir if(nSelection == static_cast<sal_Int32>(nAbsRecordId)) 1870*cdf0e10cSrcweir bFound = sal_True; 1871*cdf0e10cSrcweir } 1872*cdf0e10cSrcweir if(!bFound) 1873*cdf0e10cSrcweir return sal_False; 1874*cdf0e10cSrcweir } 1875*cdf0e10cSrcweir if(pFound && pFound->xResultSet.is() && !pFound->bAfterSelection) 1876*cdf0e10cSrcweir { 1877*cdf0e10cSrcweir sal_Int32 nOldRow = 0; 1878*cdf0e10cSrcweir try 1879*cdf0e10cSrcweir { 1880*cdf0e10cSrcweir nOldRow = pFound->xResultSet->getRow(); 1881*cdf0e10cSrcweir } 1882*cdf0e10cSrcweir catch(const Exception& ) 1883*cdf0e10cSrcweir { 1884*cdf0e10cSrcweir return sal_False; 1885*cdf0e10cSrcweir } 1886*cdf0e10cSrcweir //position to the desired index 1887*cdf0e10cSrcweir sal_Bool bMove = sal_True; 1888*cdf0e10cSrcweir if ( nOldRow != static_cast<sal_Int32>(nAbsRecordId) ) 1889*cdf0e10cSrcweir bMove = lcl_MoveAbsolute(pFound, nAbsRecordId); 1890*cdf0e10cSrcweir if(bMove) 1891*cdf0e10cSrcweir { 1892*cdf0e10cSrcweir bRet = lcl_GetColumnCnt(pFound, rColumnName, nLanguage, rResult, pNumber); 1893*cdf0e10cSrcweir } 1894*cdf0e10cSrcweir if ( nOldRow != static_cast<sal_Int32>(nAbsRecordId) ) 1895*cdf0e10cSrcweir bMove = lcl_MoveAbsolute(pFound, nOldRow); 1896*cdf0e10cSrcweir } 1897*cdf0e10cSrcweir return bRet; 1898*cdf0e10cSrcweir } 1899*cdf0e10cSrcweir /* -----------------------------06.07.00 16:47-------------------------------- 1900*cdf0e10cSrcweir reads the column data at the current position 1901*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1902*cdf0e10cSrcweir sal_Bool SwNewDBMgr::GetMergeColumnCnt(const String& rColumnName, sal_uInt16 nLanguage, 1903*cdf0e10cSrcweir String &rResult, double *pNumber, sal_uInt32 * /*pFormat*/) 1904*cdf0e10cSrcweir { 1905*cdf0e10cSrcweir if(!pImpl->pMergeData || !pImpl->pMergeData->xResultSet.is() || pImpl->pMergeData->bAfterSelection ) 1906*cdf0e10cSrcweir { 1907*cdf0e10cSrcweir rResult.Erase(); 1908*cdf0e10cSrcweir return sal_False; 1909*cdf0e10cSrcweir } 1910*cdf0e10cSrcweir 1911*cdf0e10cSrcweir sal_Bool bRet = lcl_GetColumnCnt(pImpl->pMergeData, rColumnName, nLanguage, rResult, pNumber); 1912*cdf0e10cSrcweir return bRet; 1913*cdf0e10cSrcweir } 1914*cdf0e10cSrcweir /* -----------------------------07.07.00 14:28-------------------------------- 1915*cdf0e10cSrcweir 1916*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1917*cdf0e10cSrcweir sal_Bool SwNewDBMgr::ToNextMergeRecord() 1918*cdf0e10cSrcweir { 1919*cdf0e10cSrcweir DBG_ASSERT(pImpl->pMergeData && pImpl->pMergeData->xResultSet.is(), "no data source in merge"); 1920*cdf0e10cSrcweir return ToNextRecord(pImpl->pMergeData); 1921*cdf0e10cSrcweir } 1922*cdf0e10cSrcweir /* -----------------------------10.07.01 14:28-------------------------------- 1923*cdf0e10cSrcweir 1924*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1925*cdf0e10cSrcweir sal_Bool SwNewDBMgr::ToNextRecord( 1926*cdf0e10cSrcweir const String& rDataSource, const String& rCommand, sal_Int32 /*nCommandType*/) 1927*cdf0e10cSrcweir { 1928*cdf0e10cSrcweir SwDSParam* pFound = 0; 1929*cdf0e10cSrcweir if(pImpl->pMergeData && 1930*cdf0e10cSrcweir rDataSource == (String)pImpl->pMergeData->sDataSource && 1931*cdf0e10cSrcweir rCommand == (String)pImpl->pMergeData->sCommand) 1932*cdf0e10cSrcweir pFound = pImpl->pMergeData; 1933*cdf0e10cSrcweir else 1934*cdf0e10cSrcweir { 1935*cdf0e10cSrcweir SwDBData aData; 1936*cdf0e10cSrcweir aData.sDataSource = rDataSource; 1937*cdf0e10cSrcweir aData.sCommand = rCommand; 1938*cdf0e10cSrcweir aData.nCommandType = -1; 1939*cdf0e10cSrcweir pFound = FindDSData(aData, sal_False); 1940*cdf0e10cSrcweir } 1941*cdf0e10cSrcweir return ToNextRecord(pFound); 1942*cdf0e10cSrcweir } 1943*cdf0e10cSrcweir /* -----------------------------10.07.01 14:38-------------------------------- 1944*cdf0e10cSrcweir 1945*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1946*cdf0e10cSrcweir sal_Bool SwNewDBMgr::ToNextRecord(SwDSParam* pParam) 1947*cdf0e10cSrcweir { 1948*cdf0e10cSrcweir sal_Bool bRet = sal_True; 1949*cdf0e10cSrcweir if(!pParam || !pParam->xResultSet.is() || pParam->bEndOfDB || 1950*cdf0e10cSrcweir (pParam->aSelection.getLength() && pParam->aSelection.getLength() <= pParam->nSelectionIndex)) 1951*cdf0e10cSrcweir { 1952*cdf0e10cSrcweir if(pParam) 1953*cdf0e10cSrcweir pParam->CheckEndOfDB(); 1954*cdf0e10cSrcweir return sal_False; 1955*cdf0e10cSrcweir } 1956*cdf0e10cSrcweir try 1957*cdf0e10cSrcweir { 1958*cdf0e10cSrcweir if(pParam->aSelection.getLength()) 1959*cdf0e10cSrcweir { 1960*cdf0e10cSrcweir sal_Int32 nPos = 0; 1961*cdf0e10cSrcweir pParam->aSelection.getConstArray()[ pParam->nSelectionIndex++ ] >>= nPos; 1962*cdf0e10cSrcweir pParam->bEndOfDB = !pParam->xResultSet->absolute( nPos ); 1963*cdf0e10cSrcweir pParam->CheckEndOfDB(); 1964*cdf0e10cSrcweir bRet = !pParam->bEndOfDB; 1965*cdf0e10cSrcweir if(pParam->nSelectionIndex >= pParam->aSelection.getLength()) 1966*cdf0e10cSrcweir pParam->bEndOfDB = sal_True; 1967*cdf0e10cSrcweir } 1968*cdf0e10cSrcweir else 1969*cdf0e10cSrcweir { 1970*cdf0e10cSrcweir sal_Int32 nBefore = pParam->xResultSet->getRow(); 1971*cdf0e10cSrcweir pParam->bEndOfDB = !pParam->xResultSet->next(); 1972*cdf0e10cSrcweir if( !pParam->bEndOfDB && nBefore == pParam->xResultSet->getRow()) 1973*cdf0e10cSrcweir { 1974*cdf0e10cSrcweir //next returned true but it didn't move 1975*cdf0e10cSrcweir pParam->bEndOfDB = sal_True; 1976*cdf0e10cSrcweir } 1977*cdf0e10cSrcweir 1978*cdf0e10cSrcweir pParam->CheckEndOfDB(); 1979*cdf0e10cSrcweir bRet = !pParam->bEndOfDB; 1980*cdf0e10cSrcweir ++pParam->nSelectionIndex; 1981*cdf0e10cSrcweir } 1982*cdf0e10cSrcweir } 1983*cdf0e10cSrcweir catch(Exception&) 1984*cdf0e10cSrcweir { 1985*cdf0e10cSrcweir } 1986*cdf0e10cSrcweir return bRet; 1987*cdf0e10cSrcweir } 1988*cdf0e10cSrcweir 1989*cdf0e10cSrcweir /* -----------------------------13.07.00 17:23-------------------------------- 1990*cdf0e10cSrcweir synchronized labels contain a next record field at their end 1991*cdf0e10cSrcweir to assure that the next page can be created in mail merge 1992*cdf0e10cSrcweir the cursor position must be validated 1993*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 1994*cdf0e10cSrcweir sal_Bool SwNewDBMgr::ExistsNextRecord() const 1995*cdf0e10cSrcweir { 1996*cdf0e10cSrcweir return pImpl->pMergeData && !pImpl->pMergeData->bEndOfDB; 1997*cdf0e10cSrcweir } 1998*cdf0e10cSrcweir /* -----------------------------13.07.00 10:41-------------------------------- 1999*cdf0e10cSrcweir 2000*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2001*cdf0e10cSrcweir sal_uInt32 SwNewDBMgr::GetSelectedRecordId() 2002*cdf0e10cSrcweir { 2003*cdf0e10cSrcweir sal_uInt32 nRet = 0; 2004*cdf0e10cSrcweir DBG_ASSERT(pImpl->pMergeData && pImpl->pMergeData->xResultSet.is(), "no data source in merge"); 2005*cdf0e10cSrcweir if(!pImpl->pMergeData || !pImpl->pMergeData->xResultSet.is()) 2006*cdf0e10cSrcweir return sal_False; 2007*cdf0e10cSrcweir try 2008*cdf0e10cSrcweir { 2009*cdf0e10cSrcweir nRet = pImpl->pMergeData->xResultSet->getRow(); 2010*cdf0e10cSrcweir } 2011*cdf0e10cSrcweir catch(Exception& ) 2012*cdf0e10cSrcweir { 2013*cdf0e10cSrcweir } 2014*cdf0e10cSrcweir return nRet; 2015*cdf0e10cSrcweir } 2016*cdf0e10cSrcweir /* -----------------------------13.07.00 10:58-------------------------------- 2017*cdf0e10cSrcweir 2018*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2019*cdf0e10cSrcweir sal_Bool SwNewDBMgr::ToRecordId(sal_Int32 nSet) 2020*cdf0e10cSrcweir { 2021*cdf0e10cSrcweir DBG_ASSERT(pImpl->pMergeData && pImpl->pMergeData->xResultSet.is(), "no data source in merge"); 2022*cdf0e10cSrcweir if(!pImpl->pMergeData || !pImpl->pMergeData->xResultSet.is()|| nSet < 0) 2023*cdf0e10cSrcweir return sal_False; 2024*cdf0e10cSrcweir sal_Bool bRet = sal_False; 2025*cdf0e10cSrcweir sal_Int32 nAbsPos = nSet; 2026*cdf0e10cSrcweir 2027*cdf0e10cSrcweir if(nAbsPos >= 0) 2028*cdf0e10cSrcweir { 2029*cdf0e10cSrcweir bRet = lcl_MoveAbsolute(pImpl->pMergeData, nAbsPos); 2030*cdf0e10cSrcweir pImpl->pMergeData->bEndOfDB = !bRet; 2031*cdf0e10cSrcweir pImpl->pMergeData->CheckEndOfDB(); 2032*cdf0e10cSrcweir } 2033*cdf0e10cSrcweir return bRet; 2034*cdf0e10cSrcweir } 2035*cdf0e10cSrcweir 2036*cdf0e10cSrcweir /* -----------------------------17.07.00 14:17-------------------------------- 2037*cdf0e10cSrcweir 2038*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2039*cdf0e10cSrcweir sal_Bool SwNewDBMgr::OpenDataSource(const String& rDataSource, const String& rTableOrQuery, 2040*cdf0e10cSrcweir sal_Int32 nCommandType, bool bCreate) 2041*cdf0e10cSrcweir { 2042*cdf0e10cSrcweir SwDBData aData; 2043*cdf0e10cSrcweir aData.sDataSource = rDataSource; 2044*cdf0e10cSrcweir aData.sCommand = rTableOrQuery; 2045*cdf0e10cSrcweir aData.nCommandType = nCommandType; 2046*cdf0e10cSrcweir 2047*cdf0e10cSrcweir SwDSParam* pFound = FindDSData(aData, sal_True); 2048*cdf0e10cSrcweir uno::Reference< XDataSource> xSource; 2049*cdf0e10cSrcweir if(pFound->xResultSet.is()) 2050*cdf0e10cSrcweir return sal_True; 2051*cdf0e10cSrcweir SwDSParam* pParam = FindDSConnection(rDataSource, sal_False); 2052*cdf0e10cSrcweir uno::Reference< XConnection> xConnection; 2053*cdf0e10cSrcweir if(pParam && pParam->xConnection.is()) 2054*cdf0e10cSrcweir pFound->xConnection = pParam->xConnection; 2055*cdf0e10cSrcweir else if(bCreate) 2056*cdf0e10cSrcweir { 2057*cdf0e10cSrcweir rtl::OUString sDataSource(rDataSource); 2058*cdf0e10cSrcweir pFound->xConnection = RegisterConnection( sDataSource ); 2059*cdf0e10cSrcweir } 2060*cdf0e10cSrcweir if(pFound->xConnection.is()) 2061*cdf0e10cSrcweir { 2062*cdf0e10cSrcweir try 2063*cdf0e10cSrcweir { 2064*cdf0e10cSrcweir uno::Reference< sdbc::XDatabaseMetaData > xMetaData = pFound->xConnection->getMetaData(); 2065*cdf0e10cSrcweir try 2066*cdf0e10cSrcweir { 2067*cdf0e10cSrcweir pFound->bScrollable = xMetaData 2068*cdf0e10cSrcweir ->supportsResultSetType((sal_Int32)ResultSetType::SCROLL_INSENSITIVE); 2069*cdf0e10cSrcweir } 2070*cdf0e10cSrcweir catch(Exception&) 2071*cdf0e10cSrcweir { 2072*cdf0e10cSrcweir //#98373# DB driver may not be ODBC 3.0 compliant 2073*cdf0e10cSrcweir pFound->bScrollable = sal_True; 2074*cdf0e10cSrcweir } 2075*cdf0e10cSrcweir pFound->xStatement = pFound->xConnection->createStatement(); 2076*cdf0e10cSrcweir rtl::OUString aQuoteChar = xMetaData->getIdentifierQuoteString(); 2077*cdf0e10cSrcweir rtl::OUString sStatement(C2U("SELECT * FROM ")); 2078*cdf0e10cSrcweir sStatement = C2U("SELECT * FROM "); 2079*cdf0e10cSrcweir sStatement += aQuoteChar; 2080*cdf0e10cSrcweir sStatement += rTableOrQuery; 2081*cdf0e10cSrcweir sStatement += aQuoteChar; 2082*cdf0e10cSrcweir pFound->xResultSet = pFound->xStatement->executeQuery( sStatement ); 2083*cdf0e10cSrcweir 2084*cdf0e10cSrcweir //after executeQuery the cursor must be positioned 2085*cdf0e10cSrcweir pFound->bEndOfDB = !pFound->xResultSet->next(); 2086*cdf0e10cSrcweir pFound->bAfterSelection = sal_False; 2087*cdf0e10cSrcweir pFound->CheckEndOfDB(); 2088*cdf0e10cSrcweir ++pFound->nSelectionIndex; 2089*cdf0e10cSrcweir } 2090*cdf0e10cSrcweir catch (Exception&) 2091*cdf0e10cSrcweir { 2092*cdf0e10cSrcweir pFound->xResultSet = 0; 2093*cdf0e10cSrcweir pFound->xStatement = 0; 2094*cdf0e10cSrcweir pFound->xConnection = 0; 2095*cdf0e10cSrcweir } 2096*cdf0e10cSrcweir } 2097*cdf0e10cSrcweir return pFound->xResultSet.is(); 2098*cdf0e10cSrcweir } 2099*cdf0e10cSrcweir /* -----------------------------14.08.2001 10:26------------------------------ 2100*cdf0e10cSrcweir 2101*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2102*cdf0e10cSrcweir uno::Reference< XConnection> SwNewDBMgr::RegisterConnection(rtl::OUString& rDataSource) 2103*cdf0e10cSrcweir { 2104*cdf0e10cSrcweir SwDSParam* pFound = SwNewDBMgr::FindDSConnection(rDataSource, sal_True); 2105*cdf0e10cSrcweir uno::Reference< XDataSource> xSource; 2106*cdf0e10cSrcweir if(!pFound->xConnection.is()) 2107*cdf0e10cSrcweir { 2108*cdf0e10cSrcweir pFound->xConnection = SwNewDBMgr::GetConnection(rDataSource, xSource ); 2109*cdf0e10cSrcweir try 2110*cdf0e10cSrcweir { 2111*cdf0e10cSrcweir uno::Reference<XComponent> xComponent(pFound->xConnection, UNO_QUERY); 2112*cdf0e10cSrcweir if(xComponent.is()) 2113*cdf0e10cSrcweir xComponent->addEventListener(pImpl->xDisposeListener); 2114*cdf0e10cSrcweir } 2115*cdf0e10cSrcweir catch(Exception&) 2116*cdf0e10cSrcweir { 2117*cdf0e10cSrcweir } 2118*cdf0e10cSrcweir } 2119*cdf0e10cSrcweir return pFound->xConnection; 2120*cdf0e10cSrcweir } 2121*cdf0e10cSrcweir /* -----------------------------17.07.00 15:55-------------------------------- 2122*cdf0e10cSrcweir 2123*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2124*cdf0e10cSrcweir sal_uInt32 SwNewDBMgr::GetSelectedRecordId( 2125*cdf0e10cSrcweir const String& rDataSource, const String& rTableOrQuery, sal_Int32 nCommandType) 2126*cdf0e10cSrcweir { 2127*cdf0e10cSrcweir sal_uInt32 nRet = 0xffffffff; 2128*cdf0e10cSrcweir //check for merge data source first 2129*cdf0e10cSrcweir if(pImpl->pMergeData && rDataSource == (String)pImpl->pMergeData->sDataSource && 2130*cdf0e10cSrcweir rTableOrQuery == (String)pImpl->pMergeData->sCommand && 2131*cdf0e10cSrcweir (nCommandType == -1 || nCommandType == pImpl->pMergeData->nCommandType) && 2132*cdf0e10cSrcweir pImpl->pMergeData->xResultSet.is()) 2133*cdf0e10cSrcweir nRet = GetSelectedRecordId(); 2134*cdf0e10cSrcweir else 2135*cdf0e10cSrcweir { 2136*cdf0e10cSrcweir SwDBData aData; 2137*cdf0e10cSrcweir aData.sDataSource = rDataSource; 2138*cdf0e10cSrcweir aData.sCommand = rTableOrQuery; 2139*cdf0e10cSrcweir aData.nCommandType = nCommandType; 2140*cdf0e10cSrcweir SwDSParam* pFound = FindDSData(aData, sal_False); 2141*cdf0e10cSrcweir if(pFound && pFound->xResultSet.is()) 2142*cdf0e10cSrcweir { 2143*cdf0e10cSrcweir try 2144*cdf0e10cSrcweir { //if a selection array is set the current row at the result set may not be set yet 2145*cdf0e10cSrcweir if(pFound->aSelection.getLength()) 2146*cdf0e10cSrcweir { 2147*cdf0e10cSrcweir sal_Int32 nSelIndex = pFound->nSelectionIndex; 2148*cdf0e10cSrcweir if(nSelIndex >= pFound->aSelection.getLength()) 2149*cdf0e10cSrcweir nSelIndex = pFound->aSelection.getLength() -1; 2150*cdf0e10cSrcweir pFound->aSelection.getConstArray()[nSelIndex] >>= nRet; 2151*cdf0e10cSrcweir 2152*cdf0e10cSrcweir } 2153*cdf0e10cSrcweir else 2154*cdf0e10cSrcweir nRet = pFound->xResultSet->getRow(); 2155*cdf0e10cSrcweir } 2156*cdf0e10cSrcweir catch(Exception&){} 2157*cdf0e10cSrcweir } 2158*cdf0e10cSrcweir } 2159*cdf0e10cSrcweir return nRet; 2160*cdf0e10cSrcweir } 2161*cdf0e10cSrcweir 2162*cdf0e10cSrcweir /* -----------------------------17.07.00 14:18-------------------------------- 2163*cdf0e10cSrcweir close all data sources - after fields were updated 2164*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2165*cdf0e10cSrcweir void SwNewDBMgr::CloseAll(sal_Bool bIncludingMerge) 2166*cdf0e10cSrcweir { 2167*cdf0e10cSrcweir //the only thing done here is to reset the selection index 2168*cdf0e10cSrcweir //all connections stay open 2169*cdf0e10cSrcweir for(sal_uInt16 nPos = 0; nPos < aDataSourceParams.Count(); nPos++) 2170*cdf0e10cSrcweir { 2171*cdf0e10cSrcweir SwDSParam* pParam = aDataSourceParams[nPos]; 2172*cdf0e10cSrcweir if(bIncludingMerge || pParam != pImpl->pMergeData) 2173*cdf0e10cSrcweir { 2174*cdf0e10cSrcweir pParam->nSelectionIndex = 0; 2175*cdf0e10cSrcweir pParam->bAfterSelection = sal_False; 2176*cdf0e10cSrcweir pParam->bEndOfDB = sal_False; 2177*cdf0e10cSrcweir try 2178*cdf0e10cSrcweir { 2179*cdf0e10cSrcweir if(!bInMerge && pParam->xResultSet.is()) 2180*cdf0e10cSrcweir pParam->xResultSet->first(); 2181*cdf0e10cSrcweir } 2182*cdf0e10cSrcweir catch(Exception& ) 2183*cdf0e10cSrcweir {} 2184*cdf0e10cSrcweir } 2185*cdf0e10cSrcweir } 2186*cdf0e10cSrcweir } 2187*cdf0e10cSrcweir /* -----------------------------17.07.00 14:54-------------------------------- 2188*cdf0e10cSrcweir 2189*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2190*cdf0e10cSrcweir SwDSParam* SwNewDBMgr::FindDSData(const SwDBData& rData, sal_Bool bCreate) 2191*cdf0e10cSrcweir { 2192*cdf0e10cSrcweir //prefer merge data if available 2193*cdf0e10cSrcweir if(pImpl->pMergeData && rData.sDataSource == pImpl->pMergeData->sDataSource && 2194*cdf0e10cSrcweir rData.sCommand == pImpl->pMergeData->sCommand && 2195*cdf0e10cSrcweir (rData.nCommandType == -1 || rData.nCommandType == pImpl->pMergeData->nCommandType || 2196*cdf0e10cSrcweir (bCreate && pImpl->pMergeData->nCommandType == -1))) 2197*cdf0e10cSrcweir { 2198*cdf0e10cSrcweir return pImpl->pMergeData; 2199*cdf0e10cSrcweir } 2200*cdf0e10cSrcweir 2201*cdf0e10cSrcweir SwDSParam* pFound = 0; 2202*cdf0e10cSrcweir for(sal_uInt16 nPos = aDataSourceParams.Count(); nPos; nPos--) 2203*cdf0e10cSrcweir { 2204*cdf0e10cSrcweir SwDSParam* pParam = aDataSourceParams[nPos - 1]; 2205*cdf0e10cSrcweir if(rData.sDataSource == pParam->sDataSource && 2206*cdf0e10cSrcweir rData.sCommand == pParam->sCommand && 2207*cdf0e10cSrcweir (rData.nCommandType == -1 || rData.nCommandType == pParam->nCommandType || 2208*cdf0e10cSrcweir (bCreate && pParam->nCommandType == -1))) 2209*cdf0e10cSrcweir { 2210*cdf0e10cSrcweir //#94779# calls from the calculator may add a connection with an invalid commandtype 2211*cdf0e10cSrcweir //later added "real" data base connections have to re-use the already available 2212*cdf0e10cSrcweir //DSData and set the correct CommandType 2213*cdf0e10cSrcweir if(bCreate && pParam->nCommandType == -1) 2214*cdf0e10cSrcweir pParam->nCommandType = rData.nCommandType; 2215*cdf0e10cSrcweir pFound = pParam; 2216*cdf0e10cSrcweir break; 2217*cdf0e10cSrcweir } 2218*cdf0e10cSrcweir } 2219*cdf0e10cSrcweir if(bCreate) 2220*cdf0e10cSrcweir { 2221*cdf0e10cSrcweir if(!pFound) 2222*cdf0e10cSrcweir { 2223*cdf0e10cSrcweir pFound = new SwDSParam(rData); 2224*cdf0e10cSrcweir aDataSourceParams.Insert(pFound, aDataSourceParams.Count()); 2225*cdf0e10cSrcweir try 2226*cdf0e10cSrcweir { 2227*cdf0e10cSrcweir uno::Reference<XComponent> xComponent(pFound->xConnection, UNO_QUERY); 2228*cdf0e10cSrcweir if(xComponent.is()) 2229*cdf0e10cSrcweir xComponent->addEventListener(pImpl->xDisposeListener); 2230*cdf0e10cSrcweir } 2231*cdf0e10cSrcweir catch(Exception&) 2232*cdf0e10cSrcweir { 2233*cdf0e10cSrcweir } 2234*cdf0e10cSrcweir } 2235*cdf0e10cSrcweir } 2236*cdf0e10cSrcweir return pFound; 2237*cdf0e10cSrcweir } 2238*cdf0e10cSrcweir /* -----------------------------14.08.2001 10:27------------------------------ 2239*cdf0e10cSrcweir 2240*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2241*cdf0e10cSrcweir 2242*cdf0e10cSrcweir SwDSParam* SwNewDBMgr::FindDSConnection(const rtl::OUString& rDataSource, sal_Bool bCreate) 2243*cdf0e10cSrcweir { 2244*cdf0e10cSrcweir //prefer merge data if available 2245*cdf0e10cSrcweir if(pImpl->pMergeData && rDataSource == pImpl->pMergeData->sDataSource ) 2246*cdf0e10cSrcweir { 2247*cdf0e10cSrcweir return pImpl->pMergeData; 2248*cdf0e10cSrcweir } 2249*cdf0e10cSrcweir SwDSParam* pFound = 0; 2250*cdf0e10cSrcweir for(sal_uInt16 nPos = 0; nPos < aDataSourceParams.Count(); nPos++) 2251*cdf0e10cSrcweir { 2252*cdf0e10cSrcweir SwDSParam* pParam = aDataSourceParams[nPos]; 2253*cdf0e10cSrcweir if(rDataSource == pParam->sDataSource) 2254*cdf0e10cSrcweir { 2255*cdf0e10cSrcweir pFound = pParam; 2256*cdf0e10cSrcweir break; 2257*cdf0e10cSrcweir } 2258*cdf0e10cSrcweir } 2259*cdf0e10cSrcweir if(bCreate && !pFound) 2260*cdf0e10cSrcweir { 2261*cdf0e10cSrcweir SwDBData aData; 2262*cdf0e10cSrcweir aData.sDataSource = rDataSource; 2263*cdf0e10cSrcweir pFound = new SwDSParam(aData); 2264*cdf0e10cSrcweir aDataSourceParams.Insert(pFound, aDataSourceParams.Count()); 2265*cdf0e10cSrcweir try 2266*cdf0e10cSrcweir { 2267*cdf0e10cSrcweir uno::Reference<XComponent> xComponent(pFound->xConnection, UNO_QUERY); 2268*cdf0e10cSrcweir if(xComponent.is()) 2269*cdf0e10cSrcweir xComponent->addEventListener(pImpl->xDisposeListener); 2270*cdf0e10cSrcweir } 2271*cdf0e10cSrcweir catch(Exception&) 2272*cdf0e10cSrcweir { 2273*cdf0e10cSrcweir } 2274*cdf0e10cSrcweir } 2275*cdf0e10cSrcweir return pFound; 2276*cdf0e10cSrcweir } 2277*cdf0e10cSrcweir 2278*cdf0e10cSrcweir /* -----------------------------17.07.00 14:34-------------------------------- 2279*cdf0e10cSrcweir 2280*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2281*cdf0e10cSrcweir const SwDBData& SwNewDBMgr::GetAddressDBName() 2282*cdf0e10cSrcweir { 2283*cdf0e10cSrcweir return SW_MOD()->GetDBConfig()->GetAddressSource(); 2284*cdf0e10cSrcweir } 2285*cdf0e10cSrcweir /* -----------------------------18.07.00 13:13-------------------------------- 2286*cdf0e10cSrcweir 2287*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2288*cdf0e10cSrcweir Sequence<rtl::OUString> SwNewDBMgr::GetExistingDatabaseNames() 2289*cdf0e10cSrcweir { 2290*cdf0e10cSrcweir uno::Reference<XNameAccess> xDBContext; 2291*cdf0e10cSrcweir uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 2292*cdf0e10cSrcweir if( xMgr.is() ) 2293*cdf0e10cSrcweir { 2294*cdf0e10cSrcweir uno::Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" )); 2295*cdf0e10cSrcweir xDBContext = uno::Reference<XNameAccess>(xInstance, UNO_QUERY) ; 2296*cdf0e10cSrcweir } 2297*cdf0e10cSrcweir if(xDBContext.is()) 2298*cdf0e10cSrcweir { 2299*cdf0e10cSrcweir return xDBContext->getElementNames(); 2300*cdf0e10cSrcweir } 2301*cdf0e10cSrcweir return Sequence<rtl::OUString>(); 2302*cdf0e10cSrcweir } 2303*cdf0e10cSrcweir /*-- 26.05.2004 14:33:13--------------------------------------------------- 2304*cdf0e10cSrcweir 2305*cdf0e10cSrcweir -----------------------------------------------------------------------*/ 2306*cdf0e10cSrcweir String SwNewDBMgr::LoadAndRegisterDataSource() 2307*cdf0e10cSrcweir { 2308*cdf0e10cSrcweir sfx2::FileDialogHelper aDlgHelper( TemplateDescription::FILEOPEN_SIMPLE, 0 ); 2309*cdf0e10cSrcweir Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker(); 2310*cdf0e10cSrcweir 2311*cdf0e10cSrcweir String sHomePath(SvtPathOptions().GetWorkPath()); 2312*cdf0e10cSrcweir aDlgHelper.SetDisplayDirectory( sHomePath ); 2313*cdf0e10cSrcweir 2314*cdf0e10cSrcweir Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY); 2315*cdf0e10cSrcweir 2316*cdf0e10cSrcweir String sFilterAll(SW_RES(STR_FILTER_ALL)); 2317*cdf0e10cSrcweir String sFilterAllData(SW_RES(STR_FILTER_ALL_DATA)); 2318*cdf0e10cSrcweir String sFilterSXB(SW_RES(STR_FILTER_SXB)); 2319*cdf0e10cSrcweir String sFilterSXC(SW_RES(STR_FILTER_SXC)); 2320*cdf0e10cSrcweir String sFilterDBF(SW_RES(STR_FILTER_DBF)); 2321*cdf0e10cSrcweir String sFilterXLS(SW_RES(STR_FILTER_XLS)); 2322*cdf0e10cSrcweir String sFilterTXT(SW_RES(STR_FILTER_TXT)); 2323*cdf0e10cSrcweir String sFilterCSV(SW_RES(STR_FILTER_CSV)); 2324*cdf0e10cSrcweir #ifdef WNT 2325*cdf0e10cSrcweir String sFilterMDB(SW_RES(STR_FILTER_MDB)); 2326*cdf0e10cSrcweir String sFilterACCDB(SW_RES(STR_FILTER_ACCDB)); 2327*cdf0e10cSrcweir #endif 2328*cdf0e10cSrcweir xFltMgr->appendFilter( sFilterAll, C2U("*") ); 2329*cdf0e10cSrcweir xFltMgr->appendFilter( sFilterAllData, C2U("*.ods;*.sxc;*.dbf;*.xls;*.txt;*.csv")); 2330*cdf0e10cSrcweir 2331*cdf0e10cSrcweir xFltMgr->appendFilter( sFilterSXB, C2U("*.odb") ); 2332*cdf0e10cSrcweir xFltMgr->appendFilter( sFilterSXC, C2U("*.ods;*.sxc") ); 2333*cdf0e10cSrcweir xFltMgr->appendFilter( sFilterDBF, C2U("*.dbf") ); 2334*cdf0e10cSrcweir xFltMgr->appendFilter( sFilterXLS, C2U("*.xls") ); 2335*cdf0e10cSrcweir xFltMgr->appendFilter( sFilterTXT, C2U("*.txt") ); 2336*cdf0e10cSrcweir xFltMgr->appendFilter( sFilterCSV, C2U("*.csv") ); 2337*cdf0e10cSrcweir #ifdef WNT 2338*cdf0e10cSrcweir xFltMgr->appendFilter( sFilterMDB, C2U("*.mdb") ); 2339*cdf0e10cSrcweir xFltMgr->appendFilter( sFilterACCDB, C2U("*.accdb") ); 2340*cdf0e10cSrcweir #endif 2341*cdf0e10cSrcweir 2342*cdf0e10cSrcweir xFltMgr->setCurrentFilter( sFilterAll ) ; 2343*cdf0e10cSrcweir String sFind; 2344*cdf0e10cSrcweir bool bTextConnection = false; 2345*cdf0e10cSrcweir if( ERRCODE_NONE == aDlgHelper.Execute() ) 2346*cdf0e10cSrcweir { 2347*cdf0e10cSrcweir String sURL = xFP->getFiles().getConstArray()[0]; 2348*cdf0e10cSrcweir //data sources have to be registered depending on their extensions 2349*cdf0e10cSrcweir INetURLObject aURL( sURL ); 2350*cdf0e10cSrcweir String sExt( aURL.GetExtension() ); 2351*cdf0e10cSrcweir Any aURLAny; 2352*cdf0e10cSrcweir Any aTableFilterAny; 2353*cdf0e10cSrcweir Any aSuppressVersionsAny; 2354*cdf0e10cSrcweir Any aInfoAny; 2355*cdf0e10cSrcweir INetURLObject aTempURL(aURL); 2356*cdf0e10cSrcweir bool bStore = true; 2357*cdf0e10cSrcweir if(sExt.EqualsAscii("odb")) 2358*cdf0e10cSrcweir { 2359*cdf0e10cSrcweir bStore = false; 2360*cdf0e10cSrcweir } 2361*cdf0e10cSrcweir else if(sExt.EqualsIgnoreCaseAscii("sxc") 2362*cdf0e10cSrcweir || sExt.EqualsIgnoreCaseAscii("ods") 2363*cdf0e10cSrcweir || sExt.EqualsIgnoreCaseAscii("xls")) 2364*cdf0e10cSrcweir { 2365*cdf0e10cSrcweir rtl::OUString sDBURL(C2U("sdbc:calc:")); 2366*cdf0e10cSrcweir sDBURL += aTempURL.GetMainURL(INetURLObject::NO_DECODE); 2367*cdf0e10cSrcweir aURLAny <<= sDBURL; 2368*cdf0e10cSrcweir } 2369*cdf0e10cSrcweir else if(sExt.EqualsIgnoreCaseAscii("dbf")) 2370*cdf0e10cSrcweir { 2371*cdf0e10cSrcweir aTempURL.removeSegment(); 2372*cdf0e10cSrcweir aTempURL.removeFinalSlash(); 2373*cdf0e10cSrcweir rtl::OUString sDBURL(C2U("sdbc:dbase:")); 2374*cdf0e10cSrcweir sDBURL += aTempURL.GetMainURL(INetURLObject::NO_DECODE); 2375*cdf0e10cSrcweir aURLAny <<= sDBURL; 2376*cdf0e10cSrcweir //set the filter to the file name without extension 2377*cdf0e10cSrcweir Sequence<rtl::OUString> aFilters(1); 2378*cdf0e10cSrcweir rtl::OUString sTmp(aURL.getBase()); 2379*cdf0e10cSrcweir aFilters[0] = aURL.getBase(); 2380*cdf0e10cSrcweir aTableFilterAny <<= aFilters; 2381*cdf0e10cSrcweir } 2382*cdf0e10cSrcweir else if(sExt.EqualsIgnoreCaseAscii("csv") || sExt.EqualsIgnoreCaseAscii("txt")) 2383*cdf0e10cSrcweir { 2384*cdf0e10cSrcweir aTempURL.removeSegment(); 2385*cdf0e10cSrcweir aTempURL.removeFinalSlash(); 2386*cdf0e10cSrcweir rtl::OUString sDBURL(C2U("sdbc:flat:")); 2387*cdf0e10cSrcweir //only the 'path' has to be added 2388*cdf0e10cSrcweir sDBURL += aTempURL.GetMainURL(INetURLObject::NO_DECODE); 2389*cdf0e10cSrcweir aURLAny <<= sDBURL; 2390*cdf0e10cSrcweir 2391*cdf0e10cSrcweir bTextConnection = true; 2392*cdf0e10cSrcweir //set the filter to the file name without extension 2393*cdf0e10cSrcweir Sequence<rtl::OUString> aFilters(1); 2394*cdf0e10cSrcweir rtl::OUString sTmp(aURL.getBase()); 2395*cdf0e10cSrcweir aFilters[0] = aURL.getBase(); 2396*cdf0e10cSrcweir aTableFilterAny <<= aFilters; 2397*cdf0e10cSrcweir } 2398*cdf0e10cSrcweir #ifdef WNT 2399*cdf0e10cSrcweir else if(sExt.EqualsIgnoreCaseAscii("mdb")) 2400*cdf0e10cSrcweir { 2401*cdf0e10cSrcweir rtl::OUString sDBURL(C2U("sdbc:ado:access:PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=")); 2402*cdf0e10cSrcweir sDBURL += aTempURL.PathToFileName(); 2403*cdf0e10cSrcweir aURLAny <<= sDBURL; 2404*cdf0e10cSrcweir aSuppressVersionsAny <<= makeAny(true); 2405*cdf0e10cSrcweir } 2406*cdf0e10cSrcweir else if(sExt.EqualsIgnoreCaseAscii("accdb")) 2407*cdf0e10cSrcweir { 2408*cdf0e10cSrcweir rtl::OUString sDBURL(C2U("sdbc:ado:PROVIDER=Microsoft.ACE.OLEDB.12.0;DATA SOURCE=")); 2409*cdf0e10cSrcweir sDBURL += aTempURL.PathToFileName(); 2410*cdf0e10cSrcweir aURLAny <<= sDBURL; 2411*cdf0e10cSrcweir aSuppressVersionsAny <<= makeAny(true); 2412*cdf0e10cSrcweir } 2413*cdf0e10cSrcweir #endif 2414*cdf0e10cSrcweir try 2415*cdf0e10cSrcweir { 2416*cdf0e10cSrcweir Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 2417*cdf0e10cSrcweir Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" )); 2418*cdf0e10cSrcweir Reference<XNameAccess> xDBContext(xInstance, UNO_QUERY_THROW); 2419*cdf0e10cSrcweir Reference<XSingleServiceFactory> xFact( xDBContext, UNO_QUERY); 2420*cdf0e10cSrcweir 2421*cdf0e10cSrcweir String sNewName = INetURLObject::decode( aURL.getName(), 2422*cdf0e10cSrcweir INET_HEX_ESCAPE, 2423*cdf0e10cSrcweir INetURLObject::DECODE_UNAMBIGUOUS, 2424*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ); 2425*cdf0e10cSrcweir xub_StrLen nExtLen = static_cast< xub_StrLen >(aURL.GetExtension().getLength()); 2426*cdf0e10cSrcweir sNewName.Erase( sNewName.Len() - nExtLen - 1, nExtLen + 1 ); 2427*cdf0e10cSrcweir 2428*cdf0e10cSrcweir //find a unique name if sNewName already exists 2429*cdf0e10cSrcweir sFind = sNewName; 2430*cdf0e10cSrcweir sal_Int32 nIndex = 0; 2431*cdf0e10cSrcweir while(xDBContext->hasByName(sFind)) 2432*cdf0e10cSrcweir { 2433*cdf0e10cSrcweir sFind = sNewName; 2434*cdf0e10cSrcweir sFind += String::CreateFromInt32(++nIndex); 2435*cdf0e10cSrcweir } 2436*cdf0e10cSrcweir 2437*cdf0e10cSrcweir Reference<XInterface> xNewInstance; 2438*cdf0e10cSrcweir if(!bStore) 2439*cdf0e10cSrcweir { 2440*cdf0e10cSrcweir //odb-file 2441*cdf0e10cSrcweir Any aDataSource = xDBContext->getByName(aTempURL.GetMainURL(INetURLObject::NO_DECODE)); 2442*cdf0e10cSrcweir aDataSource >>= xNewInstance; 2443*cdf0e10cSrcweir } 2444*cdf0e10cSrcweir else 2445*cdf0e10cSrcweir { 2446*cdf0e10cSrcweir xNewInstance = xFact->createInstance(); 2447*cdf0e10cSrcweir Reference<XPropertySet> xDataProperties(xNewInstance, UNO_QUERY); 2448*cdf0e10cSrcweir 2449*cdf0e10cSrcweir if(aURLAny.hasValue()) 2450*cdf0e10cSrcweir xDataProperties->setPropertyValue(C2U("URL"), aURLAny); 2451*cdf0e10cSrcweir if(aTableFilterAny.hasValue()) 2452*cdf0e10cSrcweir xDataProperties->setPropertyValue(C2U("TableFilter"), aTableFilterAny); 2453*cdf0e10cSrcweir if(aSuppressVersionsAny.hasValue()) 2454*cdf0e10cSrcweir xDataProperties->setPropertyValue(C2U("SuppressVersionColumns"), aSuppressVersionsAny); 2455*cdf0e10cSrcweir if(aInfoAny.hasValue()) 2456*cdf0e10cSrcweir xDataProperties->setPropertyValue(C2U("Info"), aInfoAny); 2457*cdf0e10cSrcweir 2458*cdf0e10cSrcweir if( bTextConnection ) 2459*cdf0e10cSrcweir { 2460*cdf0e10cSrcweir uno::Reference < ui::dialogs::XExecutableDialog > xSettingsDlg( 2461*cdf0e10cSrcweir xMgr->createInstance( C2U( "com.sun.star.sdb.TextConnectionSettings" ) ), uno::UNO_QUERY); 2462*cdf0e10cSrcweir if( xSettingsDlg->execute() ) 2463*cdf0e10cSrcweir { 2464*cdf0e10cSrcweir uno::Any aSettings = xDataProperties->getPropertyValue( C2U( "Settings" ) ); 2465*cdf0e10cSrcweir uno::Reference < beans::XPropertySet > xDSSettings; 2466*cdf0e10cSrcweir aSettings >>= xDSSettings; 2467*cdf0e10cSrcweir ::comphelper::copyProperties( 2468*cdf0e10cSrcweir uno::Reference < beans::XPropertySet >( xSettingsDlg, uno::UNO_QUERY ), 2469*cdf0e10cSrcweir xDSSettings ); 2470*cdf0e10cSrcweir xDSSettings->setPropertyValue( C2U("Extension"), uno::makeAny( ::rtl::OUString( sExt ))); 2471*cdf0e10cSrcweir } 2472*cdf0e10cSrcweir } 2473*cdf0e10cSrcweir 2474*cdf0e10cSrcweir Reference<XDocumentDataSource> xDS(xNewInstance, UNO_QUERY_THROW); 2475*cdf0e10cSrcweir Reference<XStorable> xStore(xDS->getDatabaseDocument(), UNO_QUERY_THROW); 2476*cdf0e10cSrcweir String sOutputExt = String::CreateFromAscii(".odb"); 2477*cdf0e10cSrcweir String sTmpName; 2478*cdf0e10cSrcweir { 2479*cdf0e10cSrcweir utl::TempFile aTempFile(sNewName , &sOutputExt, &sHomePath); 2480*cdf0e10cSrcweir aTempFile.EnableKillingFile(sal_True); 2481*cdf0e10cSrcweir sTmpName = aTempFile.GetURL(); 2482*cdf0e10cSrcweir } 2483*cdf0e10cSrcweir xStore->storeAsURL(sTmpName, Sequence< PropertyValue >()); 2484*cdf0e10cSrcweir } 2485*cdf0e10cSrcweir Reference<XNamingService> xNaming(xDBContext, UNO_QUERY); 2486*cdf0e10cSrcweir xNaming->registerObject( sFind, xNewInstance ); 2487*cdf0e10cSrcweir 2488*cdf0e10cSrcweir } 2489*cdf0e10cSrcweir catch(Exception&) 2490*cdf0e10cSrcweir { 2491*cdf0e10cSrcweir } 2492*cdf0e10cSrcweir } 2493*cdf0e10cSrcweir return sFind; 2494*cdf0e10cSrcweir 2495*cdf0e10cSrcweir } 2496*cdf0e10cSrcweir /* -----------------------------10.11.00 17:10-------------------------------- 2497*cdf0e10cSrcweir 2498*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2499*cdf0e10cSrcweir void SwNewDBMgr::ExecuteFormLetter( SwWrtShell& rSh, 2500*cdf0e10cSrcweir const Sequence<PropertyValue>& rProperties, 2501*cdf0e10cSrcweir sal_Bool bWithDataSourceBrowser) 2502*cdf0e10cSrcweir { 2503*cdf0e10cSrcweir //prevent second call 2504*cdf0e10cSrcweir if(pImpl->pMergeDialog) 2505*cdf0e10cSrcweir return ; 2506*cdf0e10cSrcweir rtl::OUString sDataSource, sDataTableOrQuery; 2507*cdf0e10cSrcweir Sequence<Any> aSelection; 2508*cdf0e10cSrcweir 2509*cdf0e10cSrcweir sal_Int16 nCmdType = CommandType::TABLE; 2510*cdf0e10cSrcweir uno::Reference< XConnection> xConnection; 2511*cdf0e10cSrcweir 2512*cdf0e10cSrcweir ODataAccessDescriptor aDescriptor(rProperties); 2513*cdf0e10cSrcweir sDataSource = aDescriptor.getDataSource(); 2514*cdf0e10cSrcweir aDescriptor[daCommand] >>= sDataTableOrQuery; 2515*cdf0e10cSrcweir aDescriptor[daCommandType] >>= nCmdType; 2516*cdf0e10cSrcweir 2517*cdf0e10cSrcweir if ( aDescriptor.has(daSelection) ) 2518*cdf0e10cSrcweir aDescriptor[daSelection] >>= aSelection; 2519*cdf0e10cSrcweir if ( aDescriptor.has(daConnection) ) 2520*cdf0e10cSrcweir aDescriptor[daConnection] >>= xConnection; 2521*cdf0e10cSrcweir 2522*cdf0e10cSrcweir if(!sDataSource.getLength() || !sDataTableOrQuery.getLength()) 2523*cdf0e10cSrcweir { 2524*cdf0e10cSrcweir DBG_ERROR("PropertyValues missing or unset"); 2525*cdf0e10cSrcweir return; 2526*cdf0e10cSrcweir } 2527*cdf0e10cSrcweir 2528*cdf0e10cSrcweir //always create a connection for the dialog and dispose it after the dialog has been closed 2529*cdf0e10cSrcweir SwDSParam* pFound = 0; 2530*cdf0e10cSrcweir if(!xConnection.is()) 2531*cdf0e10cSrcweir { 2532*cdf0e10cSrcweir xConnection = SwNewDBMgr::RegisterConnection(sDataSource); 2533*cdf0e10cSrcweir pFound = FindDSConnection(sDataSource, sal_True); 2534*cdf0e10cSrcweir } 2535*cdf0e10cSrcweir SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); 2536*cdf0e10cSrcweir DBG_ASSERT(pFact, "Dialogdiet fail!"); 2537*cdf0e10cSrcweir pImpl->pMergeDialog = pFact->CreateMailMergeDlg( DLG_MAILMERGE, 2538*cdf0e10cSrcweir &rSh.GetView().GetViewFrame()->GetWindow(), rSh, 2539*cdf0e10cSrcweir sDataSource, 2540*cdf0e10cSrcweir sDataTableOrQuery, 2541*cdf0e10cSrcweir nCmdType, 2542*cdf0e10cSrcweir xConnection, 2543*cdf0e10cSrcweir bWithDataSourceBrowser ? 0 : &aSelection); 2544*cdf0e10cSrcweir DBG_ASSERT(pImpl->pMergeDialog, "Dialogdiet fail!"); 2545*cdf0e10cSrcweir if(pImpl->pMergeDialog->Execute() == RET_OK) 2546*cdf0e10cSrcweir { 2547*cdf0e10cSrcweir aDescriptor[daSelection] <<= pImpl->pMergeDialog->GetSelection(); 2548*cdf0e10cSrcweir 2549*cdf0e10cSrcweir uno::Reference<XResultSet> xResSet = pImpl->pMergeDialog->GetResultSet(); 2550*cdf0e10cSrcweir if(xResSet.is()) 2551*cdf0e10cSrcweir aDescriptor[daCursor] <<= xResSet; 2552*cdf0e10cSrcweir 2553*cdf0e10cSrcweir // SfxObjectShellRef is ok, since there should be no control over the document lifetime here 2554*cdf0e10cSrcweir SfxObjectShellRef xDocShell = rSh.GetView().GetViewFrame()->GetObjectShell(); 2555*cdf0e10cSrcweir SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_MAIL_MERGE, SwDocShell::GetEventName(STR_SW_EVENT_MAIL_MERGE), xDocShell)); 2556*cdf0e10cSrcweir { 2557*cdf0e10cSrcweir //copy rSh to aTempFile 2558*cdf0e10cSrcweir ::rtl::OUString sTempURL; 2559*cdf0e10cSrcweir const SfxFilter *pSfxFlt = SwIoSystem::GetFilterOfFormat( 2560*cdf0e10cSrcweir String::CreateFromAscii( FILTER_XML ), 2561*cdf0e10cSrcweir SwDocShell::Factory().GetFilterContainer() ); 2562*cdf0e10cSrcweir try 2563*cdf0e10cSrcweir { 2564*cdf0e10cSrcweir 2565*cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aValues(1); 2566*cdf0e10cSrcweir beans::PropertyValue* pValues = aValues.getArray(); 2567*cdf0e10cSrcweir pValues[0].Name = C2U("FilterName"); 2568*cdf0e10cSrcweir pValues[0].Value <<= ::rtl::OUString(pSfxFlt->GetFilterName()); 2569*cdf0e10cSrcweir uno::Reference< frame::XStorable > xStore( xDocShell->GetModel(), uno::UNO_QUERY); 2570*cdf0e10cSrcweir sTempURL = URIHelper::SmartRel2Abs( INetURLObject(), utl::TempFile::CreateTempName() ); 2571*cdf0e10cSrcweir xStore->storeToURL( sTempURL, aValues ); 2572*cdf0e10cSrcweir } 2573*cdf0e10cSrcweir catch( const uno::Exception& rEx ) 2574*cdf0e10cSrcweir { 2575*cdf0e10cSrcweir (void) rEx; 2576*cdf0e10cSrcweir } 2577*cdf0e10cSrcweir if( xDocShell->GetError() ) 2578*cdf0e10cSrcweir { 2579*cdf0e10cSrcweir // error message ?? 2580*cdf0e10cSrcweir ErrorHandler::HandleError( xDocShell->GetError() ); 2581*cdf0e10cSrcweir } 2582*cdf0e10cSrcweir else 2583*cdf0e10cSrcweir { 2584*cdf0e10cSrcweir // the shell will be explicitly closed, but it is more safe to use SfxObjectShellLock here 2585*cdf0e10cSrcweir // especially for the case that the loading has failed 2586*cdf0e10cSrcweir SfxObjectShellLock xWorkDocSh( new SwDocShell( SFX_CREATE_MODE_INTERNAL )); 2587*cdf0e10cSrcweir SfxMedium* pWorkMed = new SfxMedium( sTempURL, STREAM_STD_READ, sal_True ); 2588*cdf0e10cSrcweir pWorkMed->SetFilter( pSfxFlt ); 2589*cdf0e10cSrcweir if( xWorkDocSh->DoLoad(pWorkMed) ) 2590*cdf0e10cSrcweir { 2591*cdf0e10cSrcweir SfxViewFrame *pFrame = SfxViewFrame::LoadHiddenDocument( *xWorkDocSh, 0 ); 2592*cdf0e10cSrcweir SwView *pView = (SwView*) pFrame->GetViewShell(); 2593*cdf0e10cSrcweir pView->AttrChangedNotify( &pView->GetWrtShell() );//Damit SelectShell gerufen wird. 2594*cdf0e10cSrcweir //set the current DBMgr 2595*cdf0e10cSrcweir SwDoc* pWorkDoc = pView->GetWrtShell().GetDoc(); 2596*cdf0e10cSrcweir SwNewDBMgr* pWorkDBMgr = pWorkDoc->GetNewDBMgr(); 2597*cdf0e10cSrcweir pWorkDoc->SetNewDBMgr( this ); 2598*cdf0e10cSrcweir 2599*cdf0e10cSrcweir SwMergeDescriptor aMergeDesc( pImpl->pMergeDialog->GetMergeType(), pView->GetWrtShell(), aDescriptor ); 2600*cdf0e10cSrcweir aMergeDesc.sSaveToFilter = pImpl->pMergeDialog->GetSaveFilter(); 2601*cdf0e10cSrcweir aMergeDesc.bCreateSingleFile = !pImpl->pMergeDialog->IsSaveIndividualDocs(); 2602*cdf0e10cSrcweir if( !aMergeDesc.bCreateSingleFile && pImpl->pMergeDialog->IsGenerateFromDataBase() ) 2603*cdf0e10cSrcweir { 2604*cdf0e10cSrcweir aMergeDesc.sAddressFromColumn = pImpl->pMergeDialog->GetColumnName(); 2605*cdf0e10cSrcweir aMergeDesc.sSubject = pImpl->pMergeDialog->GetPath(); 2606*cdf0e10cSrcweir } 2607*cdf0e10cSrcweir 2608*cdf0e10cSrcweir MergeNew(aMergeDesc); 2609*cdf0e10cSrcweir 2610*cdf0e10cSrcweir pWorkDoc->SetNewDBMgr( pWorkDBMgr ); 2611*cdf0e10cSrcweir //close the temporary file 2612*cdf0e10cSrcweir uno::Reference< util::XCloseable > xClose( xWorkDocSh->GetModel(), uno::UNO_QUERY ); 2613*cdf0e10cSrcweir if (xClose.is()) 2614*cdf0e10cSrcweir { 2615*cdf0e10cSrcweir try 2616*cdf0e10cSrcweir { 2617*cdf0e10cSrcweir //! 'sal_True' -> transfer ownership to vetoing object if vetoed! 2618*cdf0e10cSrcweir //! I.e. now that object is responsible for closing the model and doc shell. 2619*cdf0e10cSrcweir xClose->close( sal_True ); 2620*cdf0e10cSrcweir } 2621*cdf0e10cSrcweir catch ( const uno::Exception& ) 2622*cdf0e10cSrcweir { 2623*cdf0e10cSrcweir } 2624*cdf0e10cSrcweir } 2625*cdf0e10cSrcweir } 2626*cdf0e10cSrcweir } 2627*cdf0e10cSrcweir //remove the temporary file 2628*cdf0e10cSrcweir SWUnoHelper::UCB_DeleteFile( sTempURL ); 2629*cdf0e10cSrcweir } 2630*cdf0e10cSrcweir SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_MAIL_MERGE_END, SwDocShell::GetEventName(STR_SW_EVENT_MAIL_MERGE_END), rSh.GetView().GetViewFrame()->GetObjectShell())); 2631*cdf0e10cSrcweir 2632*cdf0e10cSrcweir // reset the cursor inside 2633*cdf0e10cSrcweir xResSet = NULL; 2634*cdf0e10cSrcweir aDescriptor[daCursor] <<= xResSet; 2635*cdf0e10cSrcweir } 2636*cdf0e10cSrcweir if(pFound) 2637*cdf0e10cSrcweir { 2638*cdf0e10cSrcweir for(sal_uInt16 nPos = 0; nPos < aDataSourceParams.Count(); nPos++) 2639*cdf0e10cSrcweir { 2640*cdf0e10cSrcweir SwDSParam* pParam = aDataSourceParams[nPos]; 2641*cdf0e10cSrcweir if(pParam == pFound) 2642*cdf0e10cSrcweir { 2643*cdf0e10cSrcweir try 2644*cdf0e10cSrcweir { 2645*cdf0e10cSrcweir uno::Reference<XComponent> xComp(pParam->xConnection, UNO_QUERY); 2646*cdf0e10cSrcweir if(xComp.is()) 2647*cdf0e10cSrcweir xComp->dispose(); 2648*cdf0e10cSrcweir } 2649*cdf0e10cSrcweir catch(const RuntimeException& ) 2650*cdf0e10cSrcweir { 2651*cdf0e10cSrcweir //may be disposed already since multiple entries may have used the same connection 2652*cdf0e10cSrcweir } 2653*cdf0e10cSrcweir break; 2654*cdf0e10cSrcweir } 2655*cdf0e10cSrcweir //pFound doesn't need to be removed/deleted - 2656*cdf0e10cSrcweir //this has been done by the SwConnectionDisposedListener_Impl already 2657*cdf0e10cSrcweir } 2658*cdf0e10cSrcweir } 2659*cdf0e10cSrcweir DELETEZ(pImpl->pMergeDialog); 2660*cdf0e10cSrcweir } 2661*cdf0e10cSrcweir /* -----------------------------13.11.00 08:20-------------------------------- 2662*cdf0e10cSrcweir 2663*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2664*cdf0e10cSrcweir void SwNewDBMgr::InsertText(SwWrtShell& rSh, 2665*cdf0e10cSrcweir const Sequence< PropertyValue>& rProperties) 2666*cdf0e10cSrcweir { 2667*cdf0e10cSrcweir rtl::OUString sDataSource, sDataTableOrQuery; 2668*cdf0e10cSrcweir uno::Reference<XResultSet> xResSet; 2669*cdf0e10cSrcweir Sequence<Any> aSelection; 2670*cdf0e10cSrcweir sal_Bool bHasSelectionProperty = sal_False; 2671*cdf0e10cSrcweir sal_Int32 nSelectionPos = 0; 2672*cdf0e10cSrcweir sal_Int16 nCmdType = CommandType::TABLE; 2673*cdf0e10cSrcweir const PropertyValue* pValues = rProperties.getConstArray(); 2674*cdf0e10cSrcweir uno::Reference< XConnection> xConnection; 2675*cdf0e10cSrcweir for(sal_Int32 nPos = 0; nPos < rProperties.getLength(); nPos++) 2676*cdf0e10cSrcweir { 2677*cdf0e10cSrcweir if(pValues[nPos].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cDataSourceName))) 2678*cdf0e10cSrcweir pValues[nPos].Value >>= sDataSource; 2679*cdf0e10cSrcweir else if(pValues[nPos].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cCommand))) 2680*cdf0e10cSrcweir pValues[nPos].Value >>= sDataTableOrQuery; 2681*cdf0e10cSrcweir else if(pValues[nPos].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cCursor))) 2682*cdf0e10cSrcweir pValues[nPos].Value >>= xResSet; 2683*cdf0e10cSrcweir else if(pValues[nPos].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cSelection))) 2684*cdf0e10cSrcweir { 2685*cdf0e10cSrcweir bHasSelectionProperty = sal_True; 2686*cdf0e10cSrcweir nSelectionPos = nPos; 2687*cdf0e10cSrcweir pValues[nPos].Value >>= aSelection; 2688*cdf0e10cSrcweir } 2689*cdf0e10cSrcweir else if(pValues[nPos].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cCommandType))) 2690*cdf0e10cSrcweir pValues[nPos].Value >>= nCmdType; 2691*cdf0e10cSrcweir else if(pValues[nPos].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cActiveConnection))) 2692*cdf0e10cSrcweir pValues[nPos].Value >>= xConnection; 2693*cdf0e10cSrcweir } 2694*cdf0e10cSrcweir if(!sDataSource.getLength() || !sDataTableOrQuery.getLength() || !xResSet.is()) 2695*cdf0e10cSrcweir { 2696*cdf0e10cSrcweir DBG_ERROR("PropertyValues missing or unset"); 2697*cdf0e10cSrcweir return; 2698*cdf0e10cSrcweir } 2699*cdf0e10cSrcweir uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 2700*cdf0e10cSrcweir uno::Reference<XDataSource> xSource; 2701*cdf0e10cSrcweir uno::Reference<XChild> xChild(xConnection, UNO_QUERY); 2702*cdf0e10cSrcweir if(xChild.is()) 2703*cdf0e10cSrcweir xSource = uno::Reference<XDataSource>(xChild->getParent(), UNO_QUERY); 2704*cdf0e10cSrcweir if(!xSource.is()) 2705*cdf0e10cSrcweir xSource = SwNewDBMgr::GetDbtoolsClient().getDataSource(sDataSource, xMgr); 2706*cdf0e10cSrcweir uno::Reference< XColumnsSupplier > xColSupp( xResSet, UNO_QUERY ); 2707*cdf0e10cSrcweir SwDBData aDBData; 2708*cdf0e10cSrcweir aDBData.sDataSource = sDataSource; 2709*cdf0e10cSrcweir aDBData.sCommand = sDataTableOrQuery; 2710*cdf0e10cSrcweir aDBData.nCommandType = nCmdType; 2711*cdf0e10cSrcweir 2712*cdf0e10cSrcweir SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); 2713*cdf0e10cSrcweir DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!"); 2714*cdf0e10cSrcweir 2715*cdf0e10cSrcweir AbstractSwInsertDBColAutoPilot* pDlg = pFact->CreateSwInsertDBColAutoPilot( rSh.GetView(), 2716*cdf0e10cSrcweir xSource, 2717*cdf0e10cSrcweir xColSupp, 2718*cdf0e10cSrcweir aDBData, 2719*cdf0e10cSrcweir DLG_AP_INSERT_DB_SEL ); 2720*cdf0e10cSrcweir DBG_ASSERT(pDlg, "Dialogdiet fail!"); 2721*cdf0e10cSrcweir if( RET_OK == pDlg->Execute() ) 2722*cdf0e10cSrcweir { 2723*cdf0e10cSrcweir rtl::OUString sDummy; 2724*cdf0e10cSrcweir if(!xConnection.is()) 2725*cdf0e10cSrcweir xConnection = xSource->getConnection(sDummy, sDummy); 2726*cdf0e10cSrcweir try 2727*cdf0e10cSrcweir { 2728*cdf0e10cSrcweir pDlg->DataToDoc( aSelection , xSource, xConnection, xResSet); 2729*cdf0e10cSrcweir } 2730*cdf0e10cSrcweir catch(Exception& ) 2731*cdf0e10cSrcweir { 2732*cdf0e10cSrcweir DBG_ERROR("exception caught"); 2733*cdf0e10cSrcweir } 2734*cdf0e10cSrcweir } 2735*cdf0e10cSrcweir delete pDlg; 2736*cdf0e10cSrcweir 2737*cdf0e10cSrcweir } 2738*cdf0e10cSrcweir /* -----------------------------30.08.2001 12:00------------------------------ 2739*cdf0e10cSrcweir 2740*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2741*cdf0e10cSrcweir SwDbtoolsClient* SwNewDBMgr::pDbtoolsClient = NULL; 2742*cdf0e10cSrcweir 2743*cdf0e10cSrcweir SwDbtoolsClient& SwNewDBMgr::GetDbtoolsClient() 2744*cdf0e10cSrcweir { 2745*cdf0e10cSrcweir if ( !pDbtoolsClient ) 2746*cdf0e10cSrcweir pDbtoolsClient = new SwDbtoolsClient; 2747*cdf0e10cSrcweir return *pDbtoolsClient; 2748*cdf0e10cSrcweir } 2749*cdf0e10cSrcweir /* -----------------13.05.2003 15:34----------------- 2750*cdf0e10cSrcweir 2751*cdf0e10cSrcweir --------------------------------------------------*/ 2752*cdf0e10cSrcweir void SwNewDBMgr::RemoveDbtoolsClient() 2753*cdf0e10cSrcweir { 2754*cdf0e10cSrcweir delete pDbtoolsClient; 2755*cdf0e10cSrcweir pDbtoolsClient = 0; 2756*cdf0e10cSrcweir } 2757*cdf0e10cSrcweir /* -----------------------------20.08.2002 12:00------------------------------ 2758*cdf0e10cSrcweir 2759*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2760*cdf0e10cSrcweir uno::Reference<XDataSource> SwNewDBMgr::getDataSourceAsParent(const uno::Reference< XConnection>& _xConnection,const ::rtl::OUString& _sDataSourceName) 2761*cdf0e10cSrcweir { 2762*cdf0e10cSrcweir uno::Reference<XDataSource> xSource; 2763*cdf0e10cSrcweir try 2764*cdf0e10cSrcweir { 2765*cdf0e10cSrcweir uno::Reference<XChild> xChild(_xConnection, UNO_QUERY); 2766*cdf0e10cSrcweir if ( xChild.is() ) 2767*cdf0e10cSrcweir xSource = uno::Reference<XDataSource>(xChild->getParent(), UNO_QUERY); 2768*cdf0e10cSrcweir if ( !xSource.is() ) 2769*cdf0e10cSrcweir xSource = SwNewDBMgr::GetDbtoolsClient().getDataSource(_sDataSourceName, ::comphelper::getProcessServiceFactory()); 2770*cdf0e10cSrcweir } 2771*cdf0e10cSrcweir catch(const Exception&) 2772*cdf0e10cSrcweir { 2773*cdf0e10cSrcweir DBG_ERROR("exception in getDataSourceAsParent caught"); 2774*cdf0e10cSrcweir } 2775*cdf0e10cSrcweir return xSource; 2776*cdf0e10cSrcweir } 2777*cdf0e10cSrcweir /* -----------------------------20.08.2002 12:00------------------------------ 2778*cdf0e10cSrcweir 2779*cdf0e10cSrcweir ---------------------------------------------------------------------------*/ 2780*cdf0e10cSrcweir uno::Reference<XResultSet> SwNewDBMgr::createCursor(const ::rtl::OUString& _sDataSourceName, 2781*cdf0e10cSrcweir const ::rtl::OUString& _sCommand, 2782*cdf0e10cSrcweir sal_Int32 _nCommandType, 2783*cdf0e10cSrcweir const uno::Reference<XConnection>& _xConnection 2784*cdf0e10cSrcweir ) 2785*cdf0e10cSrcweir { 2786*cdf0e10cSrcweir uno::Reference<XResultSet> xResultSet; 2787*cdf0e10cSrcweir try 2788*cdf0e10cSrcweir { 2789*cdf0e10cSrcweir uno::Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 2790*cdf0e10cSrcweir if( xMgr.is() ) 2791*cdf0e10cSrcweir { 2792*cdf0e10cSrcweir uno::Reference<XInterface> xInstance = xMgr->createInstance( 2793*cdf0e10cSrcweir C2U( "com.sun.star.sdb.RowSet" )); 2794*cdf0e10cSrcweir uno::Reference<XPropertySet> xRowSetPropSet(xInstance, UNO_QUERY); 2795*cdf0e10cSrcweir if(xRowSetPropSet.is()) 2796*cdf0e10cSrcweir { 2797*cdf0e10cSrcweir xRowSetPropSet->setPropertyValue(C2U("DataSourceName"), makeAny(_sDataSourceName)); 2798*cdf0e10cSrcweir xRowSetPropSet->setPropertyValue(C2U("ActiveConnection"), makeAny(_xConnection)); 2799*cdf0e10cSrcweir xRowSetPropSet->setPropertyValue(C2U("Command"), makeAny(_sCommand)); 2800*cdf0e10cSrcweir xRowSetPropSet->setPropertyValue(C2U("CommandType"), makeAny(_nCommandType)); 2801*cdf0e10cSrcweir 2802*cdf0e10cSrcweir uno::Reference< XCompletedExecution > xRowSet(xInstance, UNO_QUERY); 2803*cdf0e10cSrcweir 2804*cdf0e10cSrcweir if ( xRowSet.is() ) 2805*cdf0e10cSrcweir { 2806*cdf0e10cSrcweir uno::Reference< XInteractionHandler > xHandler(xMgr->createInstance(C2U("com.sun.star.task.InteractionHandler")), UNO_QUERY); 2807*cdf0e10cSrcweir xRowSet->executeWithCompletion(xHandler); 2808*cdf0e10cSrcweir } 2809*cdf0e10cSrcweir xResultSet = uno::Reference<XResultSet>(xRowSet, UNO_QUERY); 2810*cdf0e10cSrcweir } 2811*cdf0e10cSrcweir } 2812*cdf0e10cSrcweir } 2813*cdf0e10cSrcweir catch(const Exception&) 2814*cdf0e10cSrcweir { 2815*cdf0e10cSrcweir DBG_ASSERT(0,"Caught exception while creating a new RowSet!"); 2816*cdf0e10cSrcweir } 2817*cdf0e10cSrcweir return xResultSet; 2818*cdf0e10cSrcweir } 2819*cdf0e10cSrcweir /*-- 13.05.2004 16:14:15--------------------------------------------------- 2820*cdf0e10cSrcweir merge all data into one resulting document and return the number of 2821*cdf0e10cSrcweir merged documents 2822*cdf0e10cSrcweir -----------------------------------------------------------------------*/ 2823*cdf0e10cSrcweir 2824*cdf0e10cSrcweir sal_Int32 SwNewDBMgr::MergeDocuments( SwMailMergeConfigItem& rMMConfig, 2825*cdf0e10cSrcweir SwView& rSourceView ) 2826*cdf0e10cSrcweir { 2827*cdf0e10cSrcweir // check the availability of all data in the config item 2828*cdf0e10cSrcweir uno::Reference< XResultSet> xResultSet = rMMConfig.GetResultSet(); 2829*cdf0e10cSrcweir if(!xResultSet.is()) 2830*cdf0e10cSrcweir return false; 2831*cdf0e10cSrcweir bInMerge = sal_True; 2832*cdf0e10cSrcweir sal_Int32 nRet = 0; 2833*cdf0e10cSrcweir pImpl->pMergeData = new SwDSParam( 2834*cdf0e10cSrcweir rMMConfig.GetCurrentDBData(), xResultSet, rMMConfig.GetSelection()); 2835*cdf0e10cSrcweir 2836*cdf0e10cSrcweir try{ 2837*cdf0e10cSrcweir //set to start position 2838*cdf0e10cSrcweir if(pImpl->pMergeData->aSelection.getLength()) 2839*cdf0e10cSrcweir { 2840*cdf0e10cSrcweir sal_Int32 nPos = 0; 2841*cdf0e10cSrcweir pImpl->pMergeData->aSelection.getConstArray()[ pImpl->pMergeData->nSelectionIndex++ ] >>= nPos; 2842*cdf0e10cSrcweir pImpl->pMergeData->bEndOfDB = !pImpl->pMergeData->xResultSet->absolute( nPos ); 2843*cdf0e10cSrcweir pImpl->pMergeData->CheckEndOfDB(); 2844*cdf0e10cSrcweir if(pImpl->pMergeData->nSelectionIndex >= pImpl->pMergeData->aSelection.getLength()) 2845*cdf0e10cSrcweir pImpl->pMergeData->bEndOfDB = sal_True; 2846*cdf0e10cSrcweir } 2847*cdf0e10cSrcweir else 2848*cdf0e10cSrcweir { 2849*cdf0e10cSrcweir pImpl->pMergeData->bEndOfDB = !pImpl->pMergeData->xResultSet->first(); 2850*cdf0e10cSrcweir pImpl->pMergeData->CheckEndOfDB(); 2851*cdf0e10cSrcweir } 2852*cdf0e10cSrcweir } 2853*cdf0e10cSrcweir catch(Exception&) 2854*cdf0e10cSrcweir { 2855*cdf0e10cSrcweir pImpl->pMergeData->bEndOfDB = sal_True; 2856*cdf0e10cSrcweir pImpl->pMergeData->CheckEndOfDB(); 2857*cdf0e10cSrcweir DBG_ERROR("exception in MergeNew()"); 2858*cdf0e10cSrcweir } 2859*cdf0e10cSrcweir 2860*cdf0e10cSrcweir //bCancel is set from the PrintMonitor 2861*cdf0e10cSrcweir bCancel = sal_False; 2862*cdf0e10cSrcweir 2863*cdf0e10cSrcweir CreateMonitor aMonitorDlg(&rSourceView.GetEditWin()); 2864*cdf0e10cSrcweir aMonitorDlg.SetCancelHdl(LINK(this, SwNewDBMgr, PrtCancelHdl)); 2865*cdf0e10cSrcweir if (!IsMergeSilent()) 2866*cdf0e10cSrcweir { 2867*cdf0e10cSrcweir aMonitorDlg.Show(); 2868*cdf0e10cSrcweir aMonitorDlg.Invalidate(); 2869*cdf0e10cSrcweir aMonitorDlg.Update(); 2870*cdf0e10cSrcweir // the print monitor needs some time to act 2871*cdf0e10cSrcweir for( sal_uInt16 i = 0; i < 25; i++) 2872*cdf0e10cSrcweir Application::Reschedule(); 2873*cdf0e10cSrcweir } 2874*cdf0e10cSrcweir 2875*cdf0e10cSrcweir SwWrtShell& rSourceShell = rSourceView.GetWrtShell(); 2876*cdf0e10cSrcweir sal_Bool bSynchronizedDoc = rSourceShell.IsLabelDoc() && rSourceShell.GetSectionFmtCount() > 1; 2877*cdf0e10cSrcweir //save the settings of the first 2878*cdf0e10cSrcweir rSourceShell.SttEndDoc(sal_True); 2879*cdf0e10cSrcweir sal_uInt16 nStartingPageNo = rSourceShell.GetVirtPageNum(); 2880*cdf0e10cSrcweir String sModifiedStartingPageDesc; 2881*cdf0e10cSrcweir String sStartingPageDesc = sModifiedStartingPageDesc = rSourceShell.GetPageDesc( 2882*cdf0e10cSrcweir rSourceShell.GetCurPageDesc()).GetName(); 2883*cdf0e10cSrcweir 2884*cdf0e10cSrcweir try 2885*cdf0e10cSrcweir { 2886*cdf0e10cSrcweir // create a target docshell to put the merged document into 2887*cdf0e10cSrcweir SfxObjectShellRef xTargetDocShell( new SwDocShell( SFX_CREATE_MODE_STANDARD ) ); 2888*cdf0e10cSrcweir xTargetDocShell->DoInitNew( 0 ); 2889*cdf0e10cSrcweir SfxViewFrame* pTargetFrame = SfxViewFrame::LoadHiddenDocument( *xTargetDocShell, 0 ); 2890*cdf0e10cSrcweir 2891*cdf0e10cSrcweir //the created window has to be located at the same position as the source window 2892*cdf0e10cSrcweir Window& rTargetWindow = pTargetFrame->GetFrame().GetWindow(); 2893*cdf0e10cSrcweir Window& rSourceWindow = rSourceView.GetViewFrame()->GetFrame().GetWindow(); 2894*cdf0e10cSrcweir rTargetWindow.SetPosPixel(rSourceWindow.GetPosPixel()); 2895*cdf0e10cSrcweir 2896*cdf0e10cSrcweir // pTargetFrame->GetFrame().Appear(); 2897*cdf0e10cSrcweir SwView* pTargetView = static_cast<SwView*>( pTargetFrame->GetViewShell() ); 2898*cdf0e10cSrcweir rMMConfig.SetTargetView(pTargetView); 2899*cdf0e10cSrcweir //initiate SelectShell() to create sub shells 2900*cdf0e10cSrcweir pTargetView->AttrChangedNotify( &pTargetView->GetWrtShell() ); 2901*cdf0e10cSrcweir SwWrtShell* pTargetShell = pTargetView->GetWrtShellPtr(); 2902*cdf0e10cSrcweir // #i63806# 2903*cdf0e10cSrcweir const SwPageDesc* pSourcePageDesc = rSourceShell.FindPageDescByName( sStartingPageDesc ); 2904*cdf0e10cSrcweir const SwFrmFmt& rMaster = pSourcePageDesc->GetMaster(); 2905*cdf0e10cSrcweir bool bPageStylesWithHeaderFooter = rMaster.GetHeader().IsActive() || 2906*cdf0e10cSrcweir rMaster.GetFooter().IsActive(); 2907*cdf0e10cSrcweir 2908*cdf0e10cSrcweir 2909*cdf0e10cSrcweir // #122799# copy compatibility options 2910*cdf0e10cSrcweir lcl_CopyCompatibilityOptions( rSourceShell, *pTargetShell); 2911*cdf0e10cSrcweir // #72821# copy dynamic defaults 2912*cdf0e10cSrcweir lcl_CopyDynamicDefaults( *rSourceShell.GetDoc(), *pTargetShell->GetDoc() ); 2913*cdf0e10cSrcweir 2914*cdf0e10cSrcweir 2915*cdf0e10cSrcweir long nStartRow, nEndRow; 2916*cdf0e10cSrcweir sal_uLong nDocNo = 1; 2917*cdf0e10cSrcweir sal_Int32 nDocCount = 0; 2918*cdf0e10cSrcweir if( !IsMergeSilent() && lcl_getCountFromResultSet( nDocCount, pImpl->pMergeData->xResultSet ) ) 2919*cdf0e10cSrcweir aMonitorDlg.SetTotalCount( nDocCount ); 2920*cdf0e10cSrcweir 2921*cdf0e10cSrcweir do 2922*cdf0e10cSrcweir { 2923*cdf0e10cSrcweir nStartRow = pImpl->pMergeData->xResultSet->getRow(); 2924*cdf0e10cSrcweir if (!IsMergeSilent()) 2925*cdf0e10cSrcweir { 2926*cdf0e10cSrcweir aMonitorDlg.SetCurrentPosition( nDocNo ); 2927*cdf0e10cSrcweir aMonitorDlg.Invalidate(); 2928*cdf0e10cSrcweir aMonitorDlg.Update(); 2929*cdf0e10cSrcweir // the print monitor needs some time to act 2930*cdf0e10cSrcweir for( sal_uInt16 i = 0; i < 25; i++) 2931*cdf0e10cSrcweir Application::Reschedule(); 2932*cdf0e10cSrcweir } 2933*cdf0e10cSrcweir 2934*cdf0e10cSrcweir // copy the source document 2935*cdf0e10cSrcweir // the copy will be closed later, but it is more safe to use SfxObjectShellLock here 2936*cdf0e10cSrcweir SfxObjectShellLock xWorkDocSh; 2937*cdf0e10cSrcweir if(nDocNo == 1 ) 2938*cdf0e10cSrcweir { 2939*cdf0e10cSrcweir uno::Reference< util::XCloneable > xClone( rSourceView.GetDocShell()->GetModel(), uno::UNO_QUERY); 2940*cdf0e10cSrcweir uno::Reference< lang::XUnoTunnel > xWorkDocShell( xClone->createClone(), uno::UNO_QUERY); 2941*cdf0e10cSrcweir SwXTextDocument* pWorkModel = reinterpret_cast<SwXTextDocument*>(xWorkDocShell->getSomething(SwXTextDocument::getUnoTunnelId())); 2942*cdf0e10cSrcweir xWorkDocSh = pWorkModel->GetDocShell(); 2943*cdf0e10cSrcweir } 2944*cdf0e10cSrcweir else 2945*cdf0e10cSrcweir { 2946*cdf0e10cSrcweir xWorkDocSh = rSourceView.GetDocShell()->GetDoc()->CreateCopy(true); 2947*cdf0e10cSrcweir } 2948*cdf0e10cSrcweir //create a ViewFrame 2949*cdf0e10cSrcweir SwView* pWorkView = static_cast< SwView* >( SfxViewFrame::LoadHiddenDocument( *xWorkDocSh, 0 )->GetViewShell() ); 2950*cdf0e10cSrcweir SwWrtShell& rWorkShell = pWorkView->GetWrtShell(); 2951*cdf0e10cSrcweir pWorkView->AttrChangedNotify( &rWorkShell );//Damit SelectShell gerufen wird. 2952*cdf0e10cSrcweir 2953*cdf0e10cSrcweir // merge the data 2954*cdf0e10cSrcweir SwDoc* pWorkDoc = rWorkShell.GetDoc(); 2955*cdf0e10cSrcweir SwNewDBMgr* pWorkDBMgr = pWorkDoc->GetNewDBMgr(); 2956*cdf0e10cSrcweir pWorkDoc->SetNewDBMgr( this ); 2957*cdf0e10cSrcweir pWorkDoc->EmbedAllLinks(); 2958*cdf0e10cSrcweir SwUndoId nLastUndoId(UNDO_EMPTY); 2959*cdf0e10cSrcweir if (rWorkShell.GetLastUndoInfo(0, & nLastUndoId)) 2960*cdf0e10cSrcweir { 2961*cdf0e10cSrcweir if (UNDO_UI_DELETE_INVISIBLECNTNT == nLastUndoId) 2962*cdf0e10cSrcweir { 2963*cdf0e10cSrcweir rWorkShell.Undo(); 2964*cdf0e10cSrcweir } 2965*cdf0e10cSrcweir } 2966*cdf0e10cSrcweir // #i69485# lock fields to prevent access to the result set while calculating layout 2967*cdf0e10cSrcweir rWorkShell.LockExpFlds(); 2968*cdf0e10cSrcweir // create a layout 2969*cdf0e10cSrcweir rWorkShell.CalcLayout(); 2970*cdf0e10cSrcweir rWorkShell.UnlockExpFlds(); 2971*cdf0e10cSrcweir SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_FIELD_MERGE, SwDocShell::GetEventName(STR_SW_EVENT_FIELD_MERGE), rWorkShell.GetView().GetViewFrame()->GetObjectShell())); 2972*cdf0e10cSrcweir rWorkShell.ViewShell::UpdateFlds(); 2973*cdf0e10cSrcweir SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_FIELD_MERGE_FINISHED, SwDocShell::GetEventName(STR_SW_EVENT_FIELD_MERGE_FINISHED), rWorkShell.GetView().GetViewFrame()->GetObjectShell())); 2974*cdf0e10cSrcweir 2975*cdf0e10cSrcweir // strip invisible content and convert fields to text 2976*cdf0e10cSrcweir rWorkShell.RemoveInvisibleContent(); 2977*cdf0e10cSrcweir rWorkShell.ConvertFieldsToText(); 2978*cdf0e10cSrcweir rWorkShell.SetNumberingRestart(); 2979*cdf0e10cSrcweir if( bSynchronizedDoc ) 2980*cdf0e10cSrcweir { 2981*cdf0e10cSrcweir lcl_RemoveSectionLinks( rWorkShell ); 2982*cdf0e10cSrcweir } 2983*cdf0e10cSrcweir 2984*cdf0e10cSrcweir // insert the document into the target document 2985*cdf0e10cSrcweir rWorkShell.SttEndDoc(sal_False); 2986*cdf0e10cSrcweir rWorkShell.SttEndDoc(sal_True); 2987*cdf0e10cSrcweir rWorkShell.SelAll(); 2988*cdf0e10cSrcweir pTargetShell->SttEndDoc(sal_False); 2989*cdf0e10cSrcweir 2990*cdf0e10cSrcweir //#i63806# put the styles to the target document 2991*cdf0e10cSrcweir //if the source uses headers or footers each new copy need to copy a new page styles 2992*cdf0e10cSrcweir if(bPageStylesWithHeaderFooter) 2993*cdf0e10cSrcweir { 2994*cdf0e10cSrcweir //create a new pagestyle 2995*cdf0e10cSrcweir //copy the pagedesc from the current document to the new document and change the name of the to-be-applied style 2996*cdf0e10cSrcweir 2997*cdf0e10cSrcweir SwDoc* pTargetDoc = pTargetShell->GetDoc(); 2998*cdf0e10cSrcweir String sNewPageDescName = lcl_FindUniqueName(pTargetShell, sStartingPageDesc, nDocNo ); 2999*cdf0e10cSrcweir pTargetShell->GetDoc()->MakePageDesc( sNewPageDescName ); 3000*cdf0e10cSrcweir SwPageDesc* pTargetPageDesc = pTargetShell->FindPageDescByName( sNewPageDescName ); 3001*cdf0e10cSrcweir const SwPageDesc* pWorkPageDesc = rWorkShell.FindPageDescByName( sStartingPageDesc ); 3002*cdf0e10cSrcweir 3003*cdf0e10cSrcweir if(pWorkPageDesc && pTargetPageDesc) 3004*cdf0e10cSrcweir { 3005*cdf0e10cSrcweir pTargetDoc->CopyPageDesc( *pWorkPageDesc, *pTargetPageDesc, sal_False ); 3006*cdf0e10cSrcweir sModifiedStartingPageDesc = sNewPageDescName; 3007*cdf0e10cSrcweir lcl_CopyFollowPageDesc( *pTargetShell, *pWorkPageDesc, *pTargetPageDesc, nDocNo ); 3008*cdf0e10cSrcweir } 3009*cdf0e10cSrcweir } 3010*cdf0e10cSrcweir if(nDocNo == 1 || bPageStylesWithHeaderFooter) 3011*cdf0e10cSrcweir { 3012*cdf0e10cSrcweir pTargetView->GetDocShell()->_LoadStyles( *rSourceView.GetDocShell(), sal_True ); 3013*cdf0e10cSrcweir } 3014*cdf0e10cSrcweir if(nDocNo > 1) 3015*cdf0e10cSrcweir { 3016*cdf0e10cSrcweir pTargetShell->InsertPageBreak( &sModifiedStartingPageDesc, nStartingPageNo ); 3017*cdf0e10cSrcweir } 3018*cdf0e10cSrcweir else 3019*cdf0e10cSrcweir { 3020*cdf0e10cSrcweir pTargetShell->SetPageStyle(sModifiedStartingPageDesc); 3021*cdf0e10cSrcweir } 3022*cdf0e10cSrcweir sal_uInt16 nPageCountBefore = pTargetShell->GetPageCnt(); 3023*cdf0e10cSrcweir DBG_ASSERT(!pTargetShell->GetTableFmt(),"target document ends with a table - paragraph should be appended"); 3024*cdf0e10cSrcweir //#i51359# add a second paragraph in case there's only one 3025*cdf0e10cSrcweir { 3026*cdf0e10cSrcweir SwNodeIndex aIdx( pWorkDoc->GetNodes().GetEndOfExtras(), 2 ); 3027*cdf0e10cSrcweir SwPosition aTestPos( aIdx ); 3028*cdf0e10cSrcweir SwCursor aTestCrsr(aTestPos,0,false); 3029*cdf0e10cSrcweir if(!aTestCrsr.MovePara(fnParaNext, fnParaStart)) 3030*cdf0e10cSrcweir { 3031*cdf0e10cSrcweir //append a paragraph 3032*cdf0e10cSrcweir pWorkDoc->AppendTxtNode( aTestPos ); 3033*cdf0e10cSrcweir } 3034*cdf0e10cSrcweir } 3035*cdf0e10cSrcweir pTargetShell->Paste( rWorkShell.GetDoc(), sal_True ); 3036*cdf0e10cSrcweir //convert fields in page styles (header/footer - has to be done after the first document has been pasted 3037*cdf0e10cSrcweir if(1 == nDocNo) 3038*cdf0e10cSrcweir { 3039*cdf0e10cSrcweir pTargetShell->CalcLayout(); 3040*cdf0e10cSrcweir pTargetShell->ConvertFieldsToText(); 3041*cdf0e10cSrcweir } 3042*cdf0e10cSrcweir //add the document info to the config item 3043*cdf0e10cSrcweir SwDocMergeInfo aMergeInfo; 3044*cdf0e10cSrcweir aMergeInfo.nStartPageInTarget = nPageCountBefore; 3045*cdf0e10cSrcweir //#i72820# calculate layout to be able to find the correct page index 3046*cdf0e10cSrcweir pTargetShell->CalcLayout(); 3047*cdf0e10cSrcweir aMergeInfo.nEndPageInTarget = pTargetShell->GetPageCnt(); 3048*cdf0e10cSrcweir aMergeInfo.nDBRow = nStartRow; 3049*cdf0e10cSrcweir rMMConfig.AddMergedDocument( aMergeInfo ); 3050*cdf0e10cSrcweir ++nRet; 3051*cdf0e10cSrcweir 3052*cdf0e10cSrcweir // the print monitor needs some time to act 3053*cdf0e10cSrcweir for( sal_uInt16 i = 0; i < 25; i++) 3054*cdf0e10cSrcweir Application::Reschedule(); 3055*cdf0e10cSrcweir 3056*cdf0e10cSrcweir //restore the ole DBMgr 3057*cdf0e10cSrcweir pWorkDoc->SetNewDBMgr( pWorkDBMgr ); 3058*cdf0e10cSrcweir //now the temporary document should be closed 3059*cdf0e10cSrcweir SfxObjectShellRef xDocSh(pWorkView->GetDocShell()); 3060*cdf0e10cSrcweir xDocSh->DoClose(); 3061*cdf0e10cSrcweir nEndRow = pImpl->pMergeData->xResultSet->getRow(); 3062*cdf0e10cSrcweir ++nDocNo; 3063*cdf0e10cSrcweir } while( !bCancel && 3064*cdf0e10cSrcweir (bSynchronizedDoc && (nStartRow != nEndRow)? ExistsNextRecord() : ToNextMergeRecord())); 3065*cdf0e10cSrcweir 3066*cdf0e10cSrcweir //deselect all, go out of the frame and go to the beginning of the document 3067*cdf0e10cSrcweir Point aPt(LONG_MIN, LONG_MIN); 3068*cdf0e10cSrcweir pTargetShell->SelectObj(aPt, SW_LEAVE_FRAME); 3069*cdf0e10cSrcweir if (pTargetShell->IsSelFrmMode()) 3070*cdf0e10cSrcweir { 3071*cdf0e10cSrcweir pTargetShell->UnSelectFrm(); 3072*cdf0e10cSrcweir pTargetShell->LeaveSelFrmMode(); 3073*cdf0e10cSrcweir } 3074*cdf0e10cSrcweir pTargetShell->EnterStdMode(); 3075*cdf0e10cSrcweir pTargetShell->SttDoc(); 3076*cdf0e10cSrcweir // 3077*cdf0e10cSrcweir } 3078*cdf0e10cSrcweir catch( Exception& rEx) 3079*cdf0e10cSrcweir { 3080*cdf0e10cSrcweir (void)rEx; 3081*cdf0e10cSrcweir DBG_ERROR("exception caught in SwNewDBMgr::MergeDocuments"); 3082*cdf0e10cSrcweir } 3083*cdf0e10cSrcweir DELETEZ(pImpl->pMergeData); 3084*cdf0e10cSrcweir bInMerge = sal_False; 3085*cdf0e10cSrcweir return nRet; 3086*cdf0e10cSrcweir } 3087*cdf0e10cSrcweir /* -----------------09.12.2002 12:38----------------- 3088*cdf0e10cSrcweir * 3089*cdf0e10cSrcweir * --------------------------------------------------*/ 3090*cdf0e10cSrcweir SwConnectionDisposedListener_Impl::SwConnectionDisposedListener_Impl(SwNewDBMgr& rMgr) : 3091*cdf0e10cSrcweir rDBMgr(rMgr) 3092*cdf0e10cSrcweir {}; 3093*cdf0e10cSrcweir /* -----------------09.12.2002 12:39----------------- 3094*cdf0e10cSrcweir * 3095*cdf0e10cSrcweir * --------------------------------------------------*/ 3096*cdf0e10cSrcweir SwConnectionDisposedListener_Impl::~SwConnectionDisposedListener_Impl() 3097*cdf0e10cSrcweir {}; 3098*cdf0e10cSrcweir /* -----------------09.12.2002 12:39----------------- 3099*cdf0e10cSrcweir * 3100*cdf0e10cSrcweir * --------------------------------------------------*/ 3101*cdf0e10cSrcweir void SwConnectionDisposedListener_Impl::disposing( const EventObject& rSource ) 3102*cdf0e10cSrcweir throw (RuntimeException) 3103*cdf0e10cSrcweir { 3104*cdf0e10cSrcweir ::vos::OGuard aGuard(Application::GetSolarMutex()); 3105*cdf0e10cSrcweir uno::Reference<XConnection> xSource(rSource.Source, UNO_QUERY); 3106*cdf0e10cSrcweir for(sal_uInt16 nPos = rDBMgr.aDataSourceParams.Count(); nPos; nPos--) 3107*cdf0e10cSrcweir { 3108*cdf0e10cSrcweir SwDSParam* pParam = rDBMgr.aDataSourceParams[nPos - 1]; 3109*cdf0e10cSrcweir if(pParam->xConnection.is() && 3110*cdf0e10cSrcweir (xSource == pParam->xConnection)) 3111*cdf0e10cSrcweir { 3112*cdf0e10cSrcweir rDBMgr.aDataSourceParams.DeleteAndDestroy(nPos - 1); 3113*cdf0e10cSrcweir } 3114*cdf0e10cSrcweir } 3115*cdf0e10cSrcweir } 3116