xref: /trunk/main/sw/inc/dbmgr.hxx (revision 1d2dbeb0)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _SWDBMGR_HXX
24 #define _SWDBMGR_HXX
25 
26 
27 #include <tools/string.hxx>
28 #include <tools/link.hxx>
29 #include <svl/svarray.hxx>
30 #include <com/sun/star/util/Date.hpp>
31 #include "swdllapi.h"
32 #include <swdbdata.hxx>
33 #include <com/sun/star/uno/Reference.h>
34 #include <com/sun/star/uno/Sequence.hxx>
35 #include <com/sun/star/lang/Locale.hpp>
36 #include <com/sun/star/beans/PropertyValue.hpp>
37 namespace com{namespace sun{namespace star{
38 	namespace sdbc{
39 		class XConnection;
40 		class XStatement;
41 		class XDataSource;
42 		class XResultSet;
43 	}
44 	namespace beans{
45 
46 		class XPropertySet;
47 		struct PropertyValue;
48 	}
49 	namespace sdbcx{
50 		class XColumnsSupplier;
51 	}
52 	namespace util{
53 		class XNumberFormatter;
54 	}
55     namespace mail{
56         class XSmtpService;
57     }
58 }}}
59 namespace svx {
60 	class ODataAccessDescriptor;
61 }
62 
63 struct SwDBFormatData
64 {
65 	com::sun::star::util::Date aNullDate;
66 	com::sun::star::uno::Reference< com::sun::star::util::XNumberFormatter> xFormatter;
67 	com::sun::star::lang::Locale aLocale;
68 };
69 
70 class SwView;
71 class SwWrtShell;
72 class SfxProgress;
73 class ListBox;
74 class Button;
75 class SvNumberFormatter;
76 class SwDbtoolsClient;
77 class SwXMailMerge;
78 class SwMailMergeConfigItem;
79 
80 // -----------------------------------------------------------------------
81 
82 enum DBMgrOptions
83 {
84 	DBMGR_MERGE,			// Datensaetze in Felder
85 	DBMGR_INSERT,			// Datensaetze in Text
86 	DBMGR_MERGE_MAILMERGE,	// Serienbriefe drucken
87 	DBMGR_MERGE_MAILING,	// Serienbriefe als email versenden
88     DBMGR_MERGE_MAILFILES,  // Serienbriefe als Datei(en) speichern
89     DBMGR_MERGE_DOCUMENTS,   // Print merged documents
90     DBMGR_MERGE_SINGLE_FILE  // save merge as single file
91 };
92 
93 // -----------------------------------------------------------------------
94 
95 /*--------------------------------------------------------------------
96 	 Beschreibung: (neue) Logische Datenbanken verwalten
97  --------------------------------------------------------------------*/
98 #define SW_DB_SELECT_UNKNOWN 	0
99 #define SW_DB_SELECT_TABLE		1
100 #define SW_DB_SELECT_QUERY      2
101 
102 struct SwDSParam : public SwDBData
103 {
104 	com::sun::star::util::Date 	aNullDate;
105 
106 	::com::sun::star::uno::Reference<com::sun::star::util::XNumberFormatter> 	xFormatter;
107 	::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> 		xConnection;
108 	::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XStatement>		xStatement;
109 	::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet>   	xResultSet;
110 	::com::sun::star::uno::Sequence<  ::com::sun::star::uno::Any > 				aSelection;
111 	sal_Bool bScrollable;
112 	sal_Bool bEndOfDB;
113 	sal_Bool bAfterSelection;
114 	long nSelectionIndex;
115 
SwDSParamSwDSParam116     SwDSParam(const SwDBData& rData) :
117         SwDBData(rData),
118         bScrollable(sal_False),
119 		bEndOfDB(sal_False),
120 		bAfterSelection(sal_False),
121 		nSelectionIndex(0)
122 		{}
123 
SwDSParamSwDSParam124     SwDSParam(const SwDBData& rData,
125 		const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet>&   	xResSet,
126 		const ::com::sun::star::uno::Sequence<  ::com::sun::star::uno::Any >& 	rSelection) :
127         SwDBData(rData),
128 		xResultSet(xResSet),
129 		aSelection(rSelection),
130 		bScrollable(sal_True),
131 		bEndOfDB(sal_False),
132 		bAfterSelection(sal_False),
133 		nSelectionIndex(0)
134 		{}
135 
CheckEndOfDBSwDSParam136 		void CheckEndOfDB()
137 		{
138 			if(bEndOfDB)
139 				bAfterSelection = sal_True;
140 		}
141 };
142 typedef SwDSParam* SwDSParamPtr;
143 SV_DECL_PTRARR_DEL(SwDSParamArr, SwDSParamPtr, 0, 5)
144 
145 struct SwMergeDescriptor
146 {
147     sal_uInt16                                              nMergeType;
148     SwWrtShell&                                         rSh;
149     const ::svx::ODataAccessDescriptor&                 rDescriptor;
150     String                                              sSaveToFilter; //export filter to save resulting files
151     String                                              sSaveToFilterOptions; //
152     com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aSaveToFilterData;
153 
154     String                                              sSubject;
155     String                                              sAddressFromColumn;
156     String                                              sMailBody;
157     String                                              sAttachmentName;
158     ::com::sun::star::uno::Sequence< ::rtl::OUString >  aCopiesTo;
159     ::com::sun::star::uno::Sequence< ::rtl::OUString >  aBlindCopiesTo;
160 
161     ::com::sun::star::uno::Reference< com::sun::star::mail::XSmtpService > xSmtpServer;
162 
163     sal_Bool                                            bSendAsHTML;
164     sal_Bool                                            bSendAsAttachment;
165 
166     sal_Bool                                            bPrintAsync;
167     sal_Bool                                            bCreateSingleFile;
168 
169     SwMailMergeConfigItem*                              pMailMergeConfigItem;
170 
171     ::com::sun::star::uno::Sequence<  ::com::sun::star::beans::PropertyValue >  aPrintOptions;
172 
SwMergeDescriptorSwMergeDescriptor173     SwMergeDescriptor( sal_uInt16 nType, SwWrtShell& rShell, ::svx::ODataAccessDescriptor& rDesc ) :
174         nMergeType(nType),
175         rSh(rShell),
176         rDescriptor(rDesc),
177         bSendAsHTML( sal_True ),
178         bSendAsAttachment( sal_False ),
179         bPrintAsync( sal_False ),
180         bCreateSingleFile( sal_False ),
181         pMailMergeConfigItem(0)
182         {}
183 
184 };
185 
186 struct SwNewDBMgr_Impl;
187 class SwConnectionDisposedListener_Impl;
188 class AbstractMailMergeDlg;
189 
190 class SW_DLLPUBLIC SwNewDBMgr
191 {
192 friend class SwConnectionDisposedListener_Impl;
193 
194     static SwDbtoolsClient* pDbtoolsClient;
195 
196     String              sEMailAddrFld;  // Mailing: Spaltenname der E-Mail Adresse
197 	String				sSubject;		// Mailing: Subject
198 	String				sAttached;		// Mailing: Attachte Files
199 	sal_uInt16				nMergeType;
200 	sal_Bool				bInitDBFields : 1;	// sal_True: Datenbank an Feldern beim Mergen
201     sal_Bool                bSingleJobs : 1;    // Einzelne Druckjobs bei Aufruf aus Basic
202 	sal_Bool				bCancel : 1;		// Serienbrief-Save abgebrochen
203 
204 	sal_Bool 				bInMerge	: 1;	//merge process active
205     sal_Bool                bMergeSilent : 1;   // suppress display of dialogs/boxes (used when called over API)
206     sal_Bool                bMergeLock : 1;     // prevent update of database fields while document is
207                                             // actually printed at the ViewShell
208 	SwDSParamArr		aDataSourceParams;
209     SwNewDBMgr_Impl*    pImpl;
210     const SwXMailMerge* pMergeEvtSrc;   // != 0 if mail merge events are to be send
211 
212     SW_DLLPRIVATE SwDSParam*          FindDSData(const SwDBData& rData, sal_Bool bCreate);
213     SW_DLLPRIVATE SwDSParam*          FindDSConnection(const ::rtl::OUString& rSource, sal_Bool bCreate);
214 
215 
216 	SW_DLLPRIVATE DECL_LINK( PrtCancelHdl, Button * );
217 
218 	// Datensaetze als Text ins Dokument einfuegen
219 	SW_DLLPRIVATE void ImportFromConnection( SwWrtShell* pSh);
220 
221 	// Einzelnen Datensatz als Text ins Dokument einfuegen
222 	SW_DLLPRIVATE void ImportDBEntry(SwWrtShell* pSh);
223 
224     // merge to file _and_ merge to e-Mail
225     SW_DLLPRIVATE sal_Bool          MergeMailFiles(SwWrtShell* pSh,
226                                         const SwMergeDescriptor& rMergeDescriptor );
227     SW_DLLPRIVATE sal_Bool          ToNextRecord(SwDSParam* pParam);
228 
229 public:
230 	SwNewDBMgr();
231 	~SwNewDBMgr();
232 
233 	// Art des aktellen Mergens. Siehe DBMgrOptions-enum
GetMergeType() const234 	inline sal_uInt16	GetMergeType() const			{ return nMergeType; }
SetMergeType(sal_uInt16 nTyp)235 	inline void 	SetMergeType( sal_uInt16 nTyp ) 	{ nMergeType = nTyp; }
236 
237     // MailMergeEvent source
GetMailMergeEvtSrc() const238     const SwXMailMerge *    GetMailMergeEvtSrc() const  { return pMergeEvtSrc; }
SetMailMergeEvtSrc(const SwXMailMerge * pSrc)239     void SetMailMergeEvtSrc( const SwXMailMerge *pSrc ) { pMergeEvtSrc = pSrc; }
240 
IsMergeSilent() const241     inline sal_Bool     IsMergeSilent() const           { return bMergeSilent != 0; }
SetMergeSilent(sal_Bool bVal)242     inline void     SetMergeSilent( sal_Bool bVal )     { bMergeSilent = bVal; }
243 
244 	// Mischen von Datensaetzen in Felder
245     sal_Bool            MergeNew( const SwMergeDescriptor& rMergeDesc );
246     sal_Bool            Merge(SwWrtShell* pSh);
247 
248     // Datenbankfelder mit fehlendem Datenbankname initialisieren
IsInitDBFields() const249 	inline sal_Bool 	IsInitDBFields() const 	{ return bInitDBFields;	}
SetInitDBFields(sal_Bool b)250 	inline void 	SetInitDBFields(sal_Bool b)	{ bInitDBFields = b;	}
251 
252 	// Serienbriefe einzelnd oder alle zusammen drucken/speichern
IsSingleJobs() const253     inline sal_Bool     IsSingleJobs() const    { return bSingleJobs;   }
SetSingleJobs(sal_Bool b)254     inline void     SetSingleJobs(sal_Bool b)   { bSingleJobs = b;  }
255 
256 	// Mailing
257 	// email-Daten setzen
SetEMailColumn(const String & sColName)258 	inline void		SetEMailColumn(const String& sColName) { sEMailAddrFld = sColName; }
SetSubject(const String & sSbj)259 	inline void		SetSubject(const String& sSbj) { sSubject = sSbj; }
SetAttachment(const String & sAtt)260 	inline void		SetAttachment(const String& sAtt) { sAttached = sAtt; }
261 
262 
263 	// Listbox mit allen Tabellennamen einer Datenbank fuellen
264 	sal_Bool			GetTableNames(ListBox* pListBox, const String& rDBName );
265 
266 	// Listbox mit allen Spaltennamen einer Datenbanktabelle fuellen
267 	sal_Bool			GetColumnNames(ListBox* pListBox,
268 						const String& rDBName, const String& rTableName, sal_Bool bAppend = sal_False);
269     sal_Bool            GetColumnNames(ListBox* pListBox,
270                         ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> xConnection,
271                         const String& rTableName, sal_Bool bAppend = sal_False);
272 
273     sal_uLong GetColumnFmt( ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource> xSource,
274                         ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> xConnection,
275                         ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> xColumn,
276 						SvNumberFormatter* pNFmtr,
277 						long nLanguage );
278 
279     sal_uLong GetColumnFmt( const String& rDBName,
280 						const String& rTableName,
281 						const String& rColNm,
282 						SvNumberFormatter* pNFmtr,
283 						long nLanguage );
284 	sal_Int32 GetColumnType( const String& rDBName,
285 						  const String& rTableName,
286 						  const String& rColNm );
287 
IsInMerge() const288 	inline sal_Bool		IsInMerge() const	{ return bInMerge; }
289 	void			EndMerge();
290 
291 	void 			ExecuteFormLetter(SwWrtShell& rSh,
292                         const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>& rProperties,
293                         sal_Bool bWithDataSourceBrowser = sal_False);
294 
295 	void 			InsertText(SwWrtShell& rSh,
296 						const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>& rProperties);
297 
298     // check if a data source is open
299     sal_Bool            IsDataSourceOpen(const String& rDataSource,
300                                     const String& rTableOrQuery, sal_Bool bMergeOnly);
301 
302 	// open the source while fields are updated - for the calculator only!
303     sal_Bool            OpenDataSource(const String& rDataSource, const String& rTableOrQuery,
304                         sal_Int32 nCommandType = -1, bool bCreate = false);
305     sal_uInt32      GetSelectedRecordId(const String& rDataSource, const String& rTableOrQuery, sal_Int32 nCommandType = -1);
306 	sal_Bool			GetColumnCnt(const String& rSourceName, const String& rTableName,
307 							const String& rColumnName, sal_uInt32 nAbsRecordId, long nLanguage,
308 							String& rResult, double* pNumber);
309     //create and store or find an already stored connection to a data source for use
310     //in SwFldMgr and SwDBTreeList
311     ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>
312                     RegisterConnection(::rtl::OUString& rSource);
313 
CreateDSData(const SwDBData & rData)314     const SwDSParam* CreateDSData(const SwDBData& rData)
315                         {return FindDSData(rData, sal_True);}
GetDSParamArray() const316 	const SwDSParamArr& GetDSParamArray() const {return aDataSourceParams;}
317 
318 
319 	//close all data sources - after fields were updated
320 	void			CloseAll(sal_Bool bIncludingMerge = sal_True);
321 
322 	sal_Bool			GetMergeColumnCnt(const String& rColumnName, sal_uInt16 nLanguage,
323 								String &rResult, double *pNumber, sal_uInt32 *pFormat);
324 	sal_Bool			ToNextMergeRecord();
325     sal_Bool            ToNextRecord(const String& rDataSource, const String& rTableOrQuery, sal_Int32 nCommandType = -1);
326 
327 	sal_Bool			ExistsNextRecord()const;
328 	sal_uInt32 		GetSelectedRecordId();
329 	sal_Bool 		ToRecordId(sal_Int32 nSet);
330 
331 	const SwDBData&	GetAddressDBName();
332 
333 	static String GetDBField(
334 					::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xColumnProp,
335 					const SwDBFormatData& rDBFormatData,
336 					double *pNumber = NULL);
337 
338 	static ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>
339 			GetConnection(const String& rDataSource,
340 				::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource>& rxSource);
341 
342 	static ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XColumnsSupplier>
343 			GetColumnSupplier(::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>,
344 									const String& rTableOrQuery,
345 									sal_uInt8	eTableOrQuery = SW_DB_SELECT_UNKNOWN);
346 
347 	static ::com::sun::star::uno::Sequence<rtl::OUString> GetExistingDatabaseNames();
348 
349     /**
350      Loads a data source from file and registers it. Returns the registered name.
351      */
352     static String               LoadAndRegisterDataSource();
353 
354     static SwDbtoolsClient&    GetDbtoolsClient();
355     // has to be called from _FinitUI()
356     static void                RemoveDbtoolsClient();
357 
358 	/** try to get the data source from the given connection through the XChild interface.
359 		If this is not possible, the data source will be created through its name.
360 		@param _xConnection
361 			The connection which should support the XChild interface. (not a must)
362 		@param _sDataSourceName
363 			The data source name will be used to create the data source when the connection can not be used for it.
364 		@return
365 			The data source.
366 	*/
367 	static ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource>
368 			getDataSourceAsParent(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection,const ::rtl::OUString& _sDataSourceName);
369 
370 	/** creates a RowSet, which must be disposed after use.
371 		@param	_sDataSourceName
372 			The data source name
373 		@param	_sCommand
374 			The command.
375 		@param	_nCommandType
376 			The type of the command.
377 		@param	_xConnection
378 			The active connection which may be <NULL/>.
379 		@return
380 			The new created RowSet.
381 
382 	*/
383 	static ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet>
384 			createCursor(	const ::rtl::OUString& _sDataSourceName,
385 							const ::rtl::OUString& _sCommand,
386 							sal_Int32 _nCommandType,
387 							const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection
388 							);
389     //merge into one document - returns the number of merged docs
390     sal_Int32 MergeDocuments( SwMailMergeConfigItem& rMMConfig, SwView& rSourceView );
391 };
392 
393 #endif
394 
395