xref: /aoo41x/main/sw/source/ui/shells/textsh2.cxx (revision efeef26f)
1*efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*efeef26fSAndrew Rist  * distributed with this work for additional information
6*efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9*efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*efeef26fSAndrew Rist  *
11*efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*efeef26fSAndrew Rist  *
13*efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15*efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17*efeef26fSAndrew Rist  * specific language governing permissions and limitations
18*efeef26fSAndrew Rist  * under the License.
19*efeef26fSAndrew Rist  *
20*efeef26fSAndrew Rist  *************************************************************/
21*efeef26fSAndrew Rist 
22*efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #if STLPORT_VERSION>=321
30cdf0e10cSrcweir #include <cstdarg>
31cdf0e10cSrcweir #endif
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include <svtools/svmedit.hxx>
34cdf0e10cSrcweir #include <svl/eitem.hxx>
35cdf0e10cSrcweir #include <svl/whiter.hxx>
36cdf0e10cSrcweir #include <sfx2/event.hxx>
37cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
38cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
39cdf0e10cSrcweir #ifndef _MSGBOX_HXX //autogen
40cdf0e10cSrcweir #include <vcl/msgbox.hxx>
41cdf0e10cSrcweir #endif
42cdf0e10cSrcweir #include <svl/stritem.hxx>
43cdf0e10cSrcweir #include <svl/itemset.hxx>
44cdf0e10cSrcweir #include <sfx2/request.hxx>
45cdf0e10cSrcweir #include <com/sun/star/sdb/CommandType.hpp>
46cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
47cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
48cdf0e10cSrcweir #include <com/sun/star/sdbc/XDataSource.hpp>
49cdf0e10cSrcweir #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
50cdf0e10cSrcweir #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
51cdf0e10cSrcweir #include <com/sun/star/sdb/XQueriesSupplier.hpp>
52cdf0e10cSrcweir #include <com/sun/star/sdb/XDatabaseAccess.hpp>
53cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
54cdf0e10cSrcweir #include <com/sun/star/container/XChild.hpp>
55cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
56cdf0e10cSrcweir #include <com/sun/star/sdbc/XRowSet.hpp>
57cdf0e10cSrcweir #include <sfx2/frame.hxx>
58cdf0e10cSrcweir #include <fldmgr.hxx>
59cdf0e10cSrcweir #include <fldbas.hxx>
60cdf0e10cSrcweir #include "dbmgr.hxx"
61cdf0e10cSrcweir #include <comphelper/uno3.hxx>
62cdf0e10cSrcweir #include <svx/dataaccessdescriptor.hxx>
63cdf0e10cSrcweir #include <memory>
64cdf0e10cSrcweir 
65cdf0e10cSrcweir #include <vcl/svapp.hxx>
66cdf0e10cSrcweir 
67cdf0e10cSrcweir #include "view.hxx"
68cdf0e10cSrcweir #include "wrtsh.hxx"
69cdf0e10cSrcweir #include "swtypes.hxx"
70cdf0e10cSrcweir #include "cmdid.h"
71cdf0e10cSrcweir #include "swevent.hxx"
72cdf0e10cSrcweir #include "shells.hrc"
73cdf0e10cSrcweir #include "textsh.hxx"
74cdf0e10cSrcweir #include "swabstdlg.hxx"
75cdf0e10cSrcweir #include "dbui.hrc"
76cdf0e10cSrcweir 
77cdf0e10cSrcweir #include <unomid.h>
78cdf0e10cSrcweir 
79cdf0e10cSrcweir using namespace ::svx;
80cdf0e10cSrcweir using namespace ::com::sun::star;
81cdf0e10cSrcweir using namespace ::com::sun::star::uno;
82cdf0e10cSrcweir using namespace ::com::sun::star::container;
83cdf0e10cSrcweir using namespace ::com::sun::star::lang;
84cdf0e10cSrcweir using namespace ::com::sun::star::sdb;
85cdf0e10cSrcweir using namespace ::com::sun::star::sdbc;
86cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx;
87cdf0e10cSrcweir using namespace ::com::sun::star::beans;
88cdf0e10cSrcweir 
89cdf0e10cSrcweir 
90cdf0e10cSrcweir #define DB_DD_DELIM 0x0b
91cdf0e10cSrcweir 
92cdf0e10cSrcweir struct DBTextStruct_Impl
93cdf0e10cSrcweir {
94cdf0e10cSrcweir     SwDBData aDBData;
95cdf0e10cSrcweir     Sequence<Any> aSelection;
96cdf0e10cSrcweir 	Reference<XResultSet>	xCursor;
97cdf0e10cSrcweir 	Reference<XConnection>	xConnection;
98cdf0e10cSrcweir };
99cdf0e10cSrcweir inline void AddSelList( List& rLst, long nRow )
100cdf0e10cSrcweir {
101cdf0e10cSrcweir 	rLst.Insert( (void*)nRow , LIST_APPEND );
102cdf0e10cSrcweir }
103cdf0e10cSrcweir void SwTextShell::ExecDB(SfxRequest &rReq)
104cdf0e10cSrcweir {
105cdf0e10cSrcweir 	const SfxItemSet *pArgs = rReq.GetArgs();
106cdf0e10cSrcweir 	SwNewDBMgr* pNewDBMgr = GetShell().GetNewDBMgr();
107cdf0e10cSrcweir 	sal_uInt16 nSlot = rReq.GetSlot();
108cdf0e10cSrcweir     ::rtl::OUString sSourceArg, sCommandArg;
109cdf0e10cSrcweir     sal_Int32 nCommandTypeArg = 0;
110cdf0e10cSrcweir 
111cdf0e10cSrcweir     const SfxPoolItem* pSourceItem = 0;
112cdf0e10cSrcweir 	const SfxPoolItem* pCursorItem = 0;
113cdf0e10cSrcweir 	const SfxPoolItem* pConnectionItem = 0;
114cdf0e10cSrcweir     const SfxPoolItem* pCommandItem = 0;
115cdf0e10cSrcweir     const SfxPoolItem* pCommandTypeItem = 0;
116cdf0e10cSrcweir     const SfxPoolItem* pSelectionItem = 0;
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 	// first get the selection of rows to be inserted
119cdf0e10cSrcweir     pArgs->GetItemState(FN_DB_DATA_SELECTION_ANY, sal_False, &pSelectionItem);
120cdf0e10cSrcweir 
121cdf0e10cSrcweir     Sequence<Any> aSelection;
122cdf0e10cSrcweir     if(pSelectionItem)
123cdf0e10cSrcweir         ((SfxUsrAnyItem*)pSelectionItem)->GetValue() >>= aSelection;
124cdf0e10cSrcweir 
125cdf0e10cSrcweir 	// get the data source name
126cdf0e10cSrcweir     pArgs->GetItemState(FN_DB_DATA_SOURCE_ANY, sal_False, &pSourceItem);
127cdf0e10cSrcweir     if(pSourceItem)
128cdf0e10cSrcweir         ((const SfxUsrAnyItem*)pSourceItem)->GetValue() >>= sSourceArg;
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 	// get the command
131cdf0e10cSrcweir     pArgs->GetItemState(FN_DB_DATA_COMMAND_ANY, sal_False, &pCommandItem);
132cdf0e10cSrcweir     if(pCommandItem)
133cdf0e10cSrcweir         ((const SfxUsrAnyItem*)pCommandItem)->GetValue() >>= sCommandArg;
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 	// get the command type
136cdf0e10cSrcweir     pArgs->GetItemState(FN_DB_DATA_COMMAND_TYPE_ANY, sal_False, &pCommandTypeItem);
137cdf0e10cSrcweir     if(pCommandTypeItem)
138cdf0e10cSrcweir         ((const SfxUsrAnyItem*)pCommandTypeItem)->GetValue() >>= nCommandTypeArg;
139cdf0e10cSrcweir 
140cdf0e10cSrcweir 	Reference<XConnection> xConnection;
141cdf0e10cSrcweir 	pArgs->GetItemState(FN_DB_CONNECTION_ANY, sal_False, &pConnectionItem);
142cdf0e10cSrcweir 	if ( pConnectionItem )
143cdf0e10cSrcweir         ((const SfxUsrAnyItem*)pConnectionItem)->GetValue() >>= xConnection;
144cdf0e10cSrcweir 	// may be we even get no connection
145cdf0e10cSrcweir 	if ( !xConnection.is() )
146cdf0e10cSrcweir 	{
147cdf0e10cSrcweir 		Reference<XDataSource> xSource;
148cdf0e10cSrcweir 		xConnection = pNewDBMgr->GetConnection(sSourceArg, xSource);
149cdf0e10cSrcweir 	}
150cdf0e10cSrcweir     if(!xConnection.is())
151cdf0e10cSrcweir         return ;
152cdf0e10cSrcweir 
153cdf0e10cSrcweir 	// get the cursor, we use to travel, may be NULL
154cdf0e10cSrcweir 	Reference<XResultSet> xCursor;
155cdf0e10cSrcweir 	pArgs->GetItemState(FN_DB_DATA_CURSOR_ANY, sal_False, &pCursorItem);
156cdf0e10cSrcweir 	if ( pCursorItem )
157cdf0e10cSrcweir         ((const SfxUsrAnyItem*)pCursorItem)->GetValue() >>= xCursor;
158cdf0e10cSrcweir 
159cdf0e10cSrcweir 	switch (nSlot)
160cdf0e10cSrcweir 	{
161cdf0e10cSrcweir 		case FN_QRY_INSERT:
162cdf0e10cSrcweir 			{
163cdf0e10cSrcweir                 if(pSourceItem && pCommandItem && pCommandTypeItem)
164cdf0e10cSrcweir                 {
165cdf0e10cSrcweir                     DBTextStruct_Impl* pNew		= new DBTextStruct_Impl;
166cdf0e10cSrcweir                     pNew->aDBData.sDataSource	= sSourceArg;
167cdf0e10cSrcweir                     pNew->aDBData.sCommand		= sCommandArg;
168cdf0e10cSrcweir                     pNew->aDBData.nCommandType	= nCommandTypeArg;
169cdf0e10cSrcweir                     pNew->aSelection			= aSelection;
170cdf0e10cSrcweir 					//if the cursor is NULL, it must be created inside InsertDBTextHdl
171cdf0e10cSrcweir 					// because it called via a PostUserEvent
172cdf0e10cSrcweir 					pNew->xCursor				= xCursor;
173cdf0e10cSrcweir 					pNew->xConnection			= xConnection;
174cdf0e10cSrcweir 
175cdf0e10cSrcweir                     Application::PostUserEvent( STATIC_LINK( this, SwBaseShell,
176cdf0e10cSrcweir 											InsertDBTextHdl ), pNew );
177cdf0e10cSrcweir                     // the pNew will be removed in InsertDBTextHdl !!
178cdf0e10cSrcweir                 }
179cdf0e10cSrcweir 			}
180cdf0e10cSrcweir 			break;
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 		case FN_QRY_MERGE_FIELD:
183cdf0e10cSrcweir 			{
184cdf0e10cSrcweir 				// we don't get any cursor, so we must create our own
185cdf0e10cSrcweir 				sal_Bool bDisposeResultSet = sal_False;
186cdf0e10cSrcweir 				if ( !xCursor.is() )
187cdf0e10cSrcweir 				{
188cdf0e10cSrcweir 					xCursor = SwNewDBMgr::createCursor(sSourceArg,sCommandArg,nCommandTypeArg,xConnection);
189cdf0e10cSrcweir 					bDisposeResultSet = xCursor.is();
190cdf0e10cSrcweir 				}
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 				ODataAccessDescriptor aDescriptor;
193cdf0e10cSrcweir 				aDescriptor.setDataSource(sSourceArg);
194cdf0e10cSrcweir 				aDescriptor[daCommand]		<<= sCommandArg;
195cdf0e10cSrcweir 				aDescriptor[daCursor]		<<= xCursor;
196cdf0e10cSrcweir 				aDescriptor[daSelection]	<<= aSelection;
197cdf0e10cSrcweir 				aDescriptor[daCommandType]	<<= nCommandTypeArg;
198cdf0e10cSrcweir 
199cdf0e10cSrcweir                 SwMergeDescriptor aMergeDesc( DBMGR_MERGE, *GetShellPtr(), aDescriptor );
200cdf0e10cSrcweir                 pNewDBMgr->MergeNew(aMergeDesc);
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 				if ( bDisposeResultSet )
203cdf0e10cSrcweir 					::comphelper::disposeComponent(xCursor);
204cdf0e10cSrcweir             }
205cdf0e10cSrcweir 			break;
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 		case FN_QRY_INSERT_FIELD:
208cdf0e10cSrcweir 			{
209cdf0e10cSrcweir                 const SfxPoolItem* pColumnItem = 0;
210cdf0e10cSrcweir                 const SfxPoolItem* pColumnNameItem = 0;
211cdf0e10cSrcweir 
212cdf0e10cSrcweir                 pArgs->GetItemState(FN_DB_COLUMN_ANY, sal_False, &pColumnItem);
213cdf0e10cSrcweir                 pArgs->GetItemState(FN_DB_DATA_COLUMN_NAME_ANY, sal_False, &pColumnNameItem);
214cdf0e10cSrcweir 
215cdf0e10cSrcweir                 ::rtl::OUString sColumnName;
216cdf0e10cSrcweir                 if(pColumnNameItem)
217cdf0e10cSrcweir                     ((SfxUsrAnyItem*)pColumnNameItem)->GetValue() >>= sColumnName;
218cdf0e10cSrcweir                 String sDBName = sSourceArg;
219cdf0e10cSrcweir                 sDBName += DB_DELIM;
220cdf0e10cSrcweir                 sDBName += (String)sCommandArg;
221cdf0e10cSrcweir                 sDBName += DB_DELIM;
222cdf0e10cSrcweir                 sDBName += String::CreateFromInt32(nCommandTypeArg);
223cdf0e10cSrcweir                 sDBName += DB_DELIM;
224cdf0e10cSrcweir                 sDBName += (String)sColumnName;
225cdf0e10cSrcweir 
226cdf0e10cSrcweir                 SwFldMgr aFldMgr(GetShellPtr());
227cdf0e10cSrcweir                 SwInsertFld_Data aData(TYP_DBFLD, 0, sDBName, aEmptyStr, 0, sal_False, sal_True);
228cdf0e10cSrcweir                 if(pConnectionItem)
229cdf0e10cSrcweir                     aData.aDBConnection = ((SfxUsrAnyItem*)pConnectionItem)->GetValue();
230cdf0e10cSrcweir                 if(pColumnItem)
231cdf0e10cSrcweir                     aData.aDBColumn = ((SfxUsrAnyItem*)pColumnItem)->GetValue();
232cdf0e10cSrcweir                 aFldMgr.InsertFld(aData);
233cdf0e10cSrcweir                 SfxViewFrame* pViewFrame = GetView().GetViewFrame();
234cdf0e10cSrcweir                 uno::Reference< frame::XDispatchRecorder > xRecorder =
235cdf0e10cSrcweir                         pViewFrame->GetBindings().GetRecorder();
236cdf0e10cSrcweir                 if ( xRecorder.is() )
237cdf0e10cSrcweir                 {
238cdf0e10cSrcweir                     SfxRequest aReq( pViewFrame, FN_INSERT_DBFIELD );
239cdf0e10cSrcweir                     aReq.AppendItem( SfxUInt16Item(FN_PARAM_FIELD_TYPE, TYP_DBFLD));
240cdf0e10cSrcweir                     aReq.AppendItem( SfxStringItem( FN_INSERT_DBFIELD, sDBName ));
241cdf0e10cSrcweir                     aReq.AppendItem( SfxStringItem( FN_PARAM_1, sCommandArg ));
242cdf0e10cSrcweir                     aReq.AppendItem( SfxStringItem( FN_PARAM_2, sColumnName ));
243cdf0e10cSrcweir                     aReq.AppendItem( SfxInt32Item( FN_PARAM_3, nCommandTypeArg));
244cdf0e10cSrcweir                     aReq.Done();
245cdf0e10cSrcweir                 }
246cdf0e10cSrcweir 			}
247cdf0e10cSrcweir 			break;
248cdf0e10cSrcweir 
249cdf0e10cSrcweir 		default:
250cdf0e10cSrcweir 			ASSERT(!this, falscher Dispatcher);
251cdf0e10cSrcweir 			return;
252cdf0e10cSrcweir 	}
253cdf0e10cSrcweir }
254cdf0e10cSrcweir 
255cdf0e10cSrcweir /*--------------------------------------------------------------------
256cdf0e10cSrcweir 	Beschreibung:
257cdf0e10cSrcweir  --------------------------------------------------------------------*/
258cdf0e10cSrcweir 
259cdf0e10cSrcweir IMPL_STATIC_LINK( SwBaseShell, InsertDBTextHdl, DBTextStruct_Impl*, pDBStruct )
260cdf0e10cSrcweir {
261cdf0e10cSrcweir     if( pDBStruct )
262cdf0e10cSrcweir 	{
263cdf0e10cSrcweir 		sal_Bool bDispose = sal_False;
264cdf0e10cSrcweir 		Reference< sdbc::XConnection> xConnection = pDBStruct->xConnection;
265cdf0e10cSrcweir 		Reference<XDataSource> xSource = SwNewDBMgr::getDataSourceAsParent(xConnection,pDBStruct->aDBData.sDataSource);
266cdf0e10cSrcweir         // #111987# the connection is disposed an so no parent has been found
267cdf0e10cSrcweir         if(xConnection.is() && !xSource.is())
268cdf0e10cSrcweir             return 0;
269cdf0e10cSrcweir 
270cdf0e10cSrcweir         if ( !xConnection.is()  )
271cdf0e10cSrcweir 		{
272cdf0e10cSrcweir             xConnection = SwNewDBMgr::GetConnection(pDBStruct->aDBData.sDataSource, xSource);
273cdf0e10cSrcweir 			bDispose = sal_True;
274cdf0e10cSrcweir 		}
275cdf0e10cSrcweir 
276cdf0e10cSrcweir 		Reference< XColumnsSupplier> xColSupp;
277cdf0e10cSrcweir 		if(xConnection.is())
278cdf0e10cSrcweir 			xColSupp = SwNewDBMgr::GetColumnSupplier(xConnection,
279cdf0e10cSrcweir                                     pDBStruct->aDBData.sCommand,
280cdf0e10cSrcweir                                     pDBStruct->aDBData.nCommandType == CommandType::QUERY ?
281cdf0e10cSrcweir                                         SW_DB_SELECT_QUERY : SW_DB_SELECT_TABLE);
282cdf0e10cSrcweir 
283cdf0e10cSrcweir 		if( xColSupp.is() )
284cdf0e10cSrcweir 		{
285cdf0e10cSrcweir             SwDBData aDBData = pDBStruct->aDBData;
286cdf0e10cSrcweir             SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
287cdf0e10cSrcweir             DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
288cdf0e10cSrcweir 			::std::auto_ptr<AbstractSwInsertDBColAutoPilot>pDlg (pFact->CreateSwInsertDBColAutoPilot( pThis->GetView(),
289cdf0e10cSrcweir 																								xSource,
290cdf0e10cSrcweir 																								xColSupp,
291cdf0e10cSrcweir 																								aDBData,
292cdf0e10cSrcweir                                                                                                 DLG_AP_INSERT_DB_SEL ));
293cdf0e10cSrcweir 			if( RET_OK == pDlg->Execute() )
294cdf0e10cSrcweir 			{
295cdf0e10cSrcweir                 Reference <XResultSet> xResSet = pDBStruct->xCursor;
296cdf0e10cSrcweir                 pDlg->DataToDoc( pDBStruct->aSelection, xSource, xConnection, xResSet);
297cdf0e10cSrcweir 			}
298cdf0e10cSrcweir 		}
299cdf0e10cSrcweir 		if ( bDispose )
300cdf0e10cSrcweir 			::comphelper::disposeComponent(xConnection);
301cdf0e10cSrcweir 	}
302cdf0e10cSrcweir 
303cdf0e10cSrcweir     delete pDBStruct;
304cdf0e10cSrcweir 	return 0;
305cdf0e10cSrcweir }
306cdf0e10cSrcweir 
307cdf0e10cSrcweir 
308cdf0e10cSrcweir 
309