xref: /AOO41X/main/sw/source/ui/dbui/dbmgr.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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