1*96de5490SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*96de5490SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*96de5490SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*96de5490SAndrew Rist  * distributed with this work for additional information
6*96de5490SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*96de5490SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*96de5490SAndrew Rist  * "License"); you may not use this file except in compliance
9*96de5490SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*96de5490SAndrew Rist  *
11*96de5490SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*96de5490SAndrew Rist  *
13*96de5490SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*96de5490SAndrew Rist  * software distributed under the License is distributed on an
15*96de5490SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*96de5490SAndrew Rist  * KIND, either express or implied.  See the License for the
17*96de5490SAndrew Rist  * specific language governing permissions and limitations
18*96de5490SAndrew Rist  * under the License.
19*96de5490SAndrew Rist  *
20*96de5490SAndrew Rist  *************************************************************/
21*96de5490SAndrew Rist 
22*96de5490SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_dbaccess.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #ifndef DBAUI_APPCONTROLLER_HXX
28cdf0e10cSrcweir #include "AppController.hxx"
29cdf0e10cSrcweir #endif
30cdf0e10cSrcweir #ifndef _COMPHELPER_SEQUENCE_HXX_
31cdf0e10cSrcweir #include <comphelper/sequence.hxx>
32cdf0e10cSrcweir #endif
33cdf0e10cSrcweir #ifndef _COMPHELPER_PROPERTY_HXX_
34cdf0e10cSrcweir #include <comphelper/property.hxx>
35cdf0e10cSrcweir #endif
36cdf0e10cSrcweir #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
37cdf0e10cSrcweir #include "dbustrings.hrc"
38cdf0e10cSrcweir #endif
39cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBCX_XDATADESCRIPTORFACTORY_HPP_
40cdf0e10cSrcweir #include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp>
41cdf0e10cSrcweir #endif
42cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBCX_XAPPEND_HPP_
43cdf0e10cSrcweir #include <com/sun/star/sdbcx/XAppend.hpp>
44cdf0e10cSrcweir #endif
45cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
46cdf0e10cSrcweir #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
47cdf0e10cSrcweir #endif
48cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_XSINGLESELECTQUERYCOMPOSER_HPP_
49cdf0e10cSrcweir #include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
50cdf0e10cSrcweir #endif
51cdf0e10cSrcweir #ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_
52cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
53cdf0e10cSrcweir #endif
54cdf0e10cSrcweir #ifndef _COM_SUN_STAR_UNO_XNAMINGSERVICE_HPP_
55cdf0e10cSrcweir #include <com/sun/star/uno/XNamingService.hpp>
56cdf0e10cSrcweir #endif
57cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_
58cdf0e10cSrcweir #include <com/sun/star/sdbc/XDataSource.hpp>
59cdf0e10cSrcweir #endif
60cdf0e10cSrcweir #ifndef _COM_SUN_STAR_FRAME_XSTORABLE_HPP_
61cdf0e10cSrcweir #include <com/sun/star/frame/XStorable.hpp>
62cdf0e10cSrcweir #endif
63cdf0e10cSrcweir #ifndef _COM_SUN_STAR_CONTAINER_XCHILD_HPP_
64cdf0e10cSrcweir #include <com/sun/star/container/XChild.hpp>
65cdf0e10cSrcweir #endif
66cdf0e10cSrcweir #ifndef _COM_SUN_STAR_CONTAINER_XHIERARCHICALNAMECONTAINER_HPP_
67cdf0e10cSrcweir #include <com/sun/star/container/XHierarchicalNameContainer.hpp>
68cdf0e10cSrcweir #endif
69cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
70cdf0e10cSrcweir #include <com/sun/star/sdbc/DataType.hpp>
71cdf0e10cSrcweir #endif
72cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_COMMANDTYPE_HPP_
73cdf0e10cSrcweir #include <com/sun/star/sdb/CommandType.hpp>
74cdf0e10cSrcweir #endif
75cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_XBOOKMARKSSUPPLIER_HPP_
76cdf0e10cSrcweir #include <com/sun/star/sdb/XBookmarksSupplier.hpp>
77cdf0e10cSrcweir #endif
78cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_SQLCONTEXT_HPP_
79cdf0e10cSrcweir #include <com/sun/star/sdb/SQLContext.hpp>
80cdf0e10cSrcweir #endif
81cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
82cdf0e10cSrcweir #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
83cdf0e10cSrcweir #endif
84cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBCX_XVIEWSSUPPLIER_HPP_
85cdf0e10cSrcweir #include <com/sun/star/sdbcx/XViewsSupplier.hpp>
86cdf0e10cSrcweir #endif
87cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_XQUERYDEFINITIONSSUPPLIER_HPP_
88cdf0e10cSrcweir #include <com/sun/star/sdb/XQueryDefinitionsSupplier.hpp>
89cdf0e10cSrcweir #endif
90cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDBCX_XDROP_HPP_
91cdf0e10cSrcweir #include <com/sun/star/sdbcx/XDrop.hpp>
92cdf0e10cSrcweir #endif
93cdf0e10cSrcweir #ifndef _TOOLS_DEBUG_HXX
94cdf0e10cSrcweir #include <tools/debug.hxx>
95cdf0e10cSrcweir #endif
96cdf0e10cSrcweir #ifndef _URLOBJ_HXX
97cdf0e10cSrcweir #include <tools/urlobj.hxx>
98cdf0e10cSrcweir #endif
99cdf0e10cSrcweir #ifndef _UNOTOOLS_UCBHELPER_HXX
100cdf0e10cSrcweir #include <unotools/ucbhelper.hxx>
101cdf0e10cSrcweir #endif
102cdf0e10cSrcweir #ifndef DBAUI_DLGSAVE_HXX
103cdf0e10cSrcweir #include "dlgsave.hxx"
104cdf0e10cSrcweir #endif
105cdf0e10cSrcweir #ifndef _COMPHELPER_TYPES_HXX_
106cdf0e10cSrcweir #include <comphelper/types.hxx>
107cdf0e10cSrcweir #endif
108cdf0e10cSrcweir #ifndef _SV_MSGBOX_HXX
109cdf0e10cSrcweir #include <vcl/msgbox.hxx>
110cdf0e10cSrcweir #endif
111cdf0e10cSrcweir #ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
112cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx>
113cdf0e10cSrcweir #endif
114cdf0e10cSrcweir #ifndef _CPPUHELPER_EXC_HLP_HXX_
115cdf0e10cSrcweir #include <cppuhelper/exc_hlp.hxx>
116cdf0e10cSrcweir #endif
117cdf0e10cSrcweir #ifndef _DBHELPER_DBEXCEPTION_HXX_
118cdf0e10cSrcweir #include <connectivity/dbexception.hxx>
119cdf0e10cSrcweir #endif
120cdf0e10cSrcweir #ifndef _SV_WAITOBJ_HXX
121cdf0e10cSrcweir #include <vcl/waitobj.hxx>
122cdf0e10cSrcweir #endif
123cdf0e10cSrcweir #ifndef _RTL_USTRBUF_HXX_
124cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
125cdf0e10cSrcweir #endif
126cdf0e10cSrcweir #ifndef DBAUI_APPVIEW_HXX
127cdf0e10cSrcweir #include "AppView.hxx"
128cdf0e10cSrcweir #endif
129cdf0e10cSrcweir #ifndef _SVX_DATACCESSDESCRIPTOR_HXX_
130cdf0e10cSrcweir #include <svx/dataaccessdescriptor.hxx>
131cdf0e10cSrcweir #endif
132cdf0e10cSrcweir #ifndef SVX_DBAOBJECTEX_HXX
133cdf0e10cSrcweir #include <svx/dbaobjectex.hxx>
134cdf0e10cSrcweir #endif
135cdf0e10cSrcweir #ifndef DBACCESS_UI_BROWSER_ID_HXX
136cdf0e10cSrcweir #include "browserids.hxx"
137cdf0e10cSrcweir #endif
138cdf0e10cSrcweir #ifndef _DBAU_REGHELPER_HXX_
139cdf0e10cSrcweir #include "dbu_reghelper.hxx"
140cdf0e10cSrcweir #endif
141cdf0e10cSrcweir #ifndef _DBU_APP_HRC_
142cdf0e10cSrcweir #include "dbu_app.hrc"
143cdf0e10cSrcweir #endif
144cdf0e10cSrcweir #ifndef _SV_MENU_HXX
145cdf0e10cSrcweir #include <vcl/menu.hxx>
146cdf0e10cSrcweir #endif
147cdf0e10cSrcweir #ifndef _COMPHELPER_UNO3_HXX_
148cdf0e10cSrcweir #include <comphelper/uno3.hxx>
149cdf0e10cSrcweir #endif
150cdf0e10cSrcweir #ifndef _SV_SVAPP_HXX //autogen
151cdf0e10cSrcweir #include <vcl/svapp.hxx>
152cdf0e10cSrcweir #endif
153cdf0e10cSrcweir #ifndef _SVLBOXITM_HXX
154cdf0e10cSrcweir #include <svtools/svlbitm.hxx>
155cdf0e10cSrcweir #endif
156cdf0e10cSrcweir #ifndef _DBAUI_LISTVIEWITEMS_HXX_
157cdf0e10cSrcweir #include "listviewitems.hxx"
158cdf0e10cSrcweir #endif
159cdf0e10cSrcweir #ifndef DBAUI_APPDETAILVIEW_HXX
160cdf0e10cSrcweir #include "AppDetailView.hxx"
161cdf0e10cSrcweir #endif
162cdf0e10cSrcweir #ifndef _DBAUI_LINKEDDOCUMENTS_HXX_
163cdf0e10cSrcweir #include "linkeddocuments.hxx"
164cdf0e10cSrcweir #endif
165cdf0e10cSrcweir #ifndef _SV_LSTBOX_HXX
166cdf0e10cSrcweir #include <vcl/lstbox.hxx>
167cdf0e10cSrcweir #endif
168cdf0e10cSrcweir #ifndef _DBHELPER_DBEXCEPTION_HXX_
169cdf0e10cSrcweir #include <connectivity/dbexception.hxx>
170cdf0e10cSrcweir #endif
171cdf0e10cSrcweir #ifndef _CONNECTIVITY_DBTOOLS_HXX_
172cdf0e10cSrcweir #include <connectivity/dbtools.hxx>
173cdf0e10cSrcweir #endif
174cdf0e10cSrcweir #ifndef _DBAUI_SQLMESSAGE_HXX_
175cdf0e10cSrcweir #include "sqlmessage.hxx"
176cdf0e10cSrcweir #endif
177cdf0e10cSrcweir #ifndef _STRING_HXX
178cdf0e10cSrcweir #include <tools/string.hxx>
179cdf0e10cSrcweir #endif
180cdf0e10cSrcweir #ifndef DBAUI_DBEXCHANGE_HXX
181cdf0e10cSrcweir #include "dbexchange.hxx"
182cdf0e10cSrcweir #endif
183cdf0e10cSrcweir #ifndef DBAUI_TOOLS_HXX
184cdf0e10cSrcweir #include "UITools.hxx"
185cdf0e10cSrcweir #endif
186cdf0e10cSrcweir #include <algorithm>
187cdf0e10cSrcweir #ifndef _SVTREEBOX_HXX
188cdf0e10cSrcweir #include <svtools/svtreebx.hxx>
189cdf0e10cSrcweir #endif
190cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_XREPORTDOCUMENTSSUPPLIER_HPP_
191cdf0e10cSrcweir #include <com/sun/star/sdb/XReportDocumentsSupplier.hpp>
192cdf0e10cSrcweir #endif
193cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SDB_XFORMDOCUMENTSSUPPLIER_HPP_
194cdf0e10cSrcweir #include <com/sun/star/sdb/XFormDocumentsSupplier.hpp>
195cdf0e10cSrcweir #endif
196cdf0e10cSrcweir #ifndef _FILEDLGHELPER_HXX
197cdf0e10cSrcweir #include <sfx2/filedlghelper.hxx>
198cdf0e10cSrcweir #endif
199cdf0e10cSrcweir #ifndef INCLUDED_SVTOOLS_PATHOPTIONS_HXX
200cdf0e10cSrcweir #include <unotools/pathoptions.hxx>
201cdf0e10cSrcweir #endif
202cdf0e10cSrcweir #ifndef _SFX_DOCFILT_HACK_HXX
203cdf0e10cSrcweir #include <sfx2/docfilt.hxx>
204cdf0e10cSrcweir #endif
205cdf0e10cSrcweir #ifndef _SVT_FILEVIEW_HXX
206cdf0e10cSrcweir #include <svtools/fileview.hxx>
207cdf0e10cSrcweir #endif
208cdf0e10cSrcweir #ifndef TOOLS_DIAGNOSE_EX_H
209cdf0e10cSrcweir #include <tools/diagnose_ex.h>
210cdf0e10cSrcweir #endif
211cdf0e10cSrcweir #ifndef DBACCESS_SOURCE_UI_MISC_DEFAULTOBJECTNAMECHECK_HXX
212cdf0e10cSrcweir #include "defaultobjectnamecheck.hxx"
213cdf0e10cSrcweir #endif
214cdf0e10cSrcweir #ifndef _VOS_MUTEX_HXX_
215cdf0e10cSrcweir #include <vos/mutex.hxx>
216cdf0e10cSrcweir #endif
217cdf0e10cSrcweir #include "subcomponentmanager.hxx"
218cdf0e10cSrcweir 
219cdf0e10cSrcweir //........................................................................
220cdf0e10cSrcweir namespace dbaui
221cdf0e10cSrcweir {
222cdf0e10cSrcweir //........................................................................
223cdf0e10cSrcweir using namespace ::dbtools;
224cdf0e10cSrcweir using namespace ::svx;
225cdf0e10cSrcweir using namespace ::svtools;
226cdf0e10cSrcweir using namespace ::com::sun::star::uno;
227cdf0e10cSrcweir using namespace ::com::sun::star::task;
228cdf0e10cSrcweir using namespace ::com::sun::star::beans;
229cdf0e10cSrcweir using namespace ::com::sun::star::lang;
230cdf0e10cSrcweir using namespace ::com::sun::star::container;
231cdf0e10cSrcweir using namespace ::com::sun::star::sdb;
232cdf0e10cSrcweir using namespace ::com::sun::star::sdbc;
233cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx;
234cdf0e10cSrcweir using namespace ::com::sun::star::frame;
235cdf0e10cSrcweir using namespace ::com::sun::star::ucb;
236cdf0e10cSrcweir using namespace ::com::sun::star::util;
237cdf0e10cSrcweir 
238cdf0e10cSrcweir // -----------------------------------------------------------------------------
deleteTables(const::std::vector<::rtl::OUString> & _rList)239cdf0e10cSrcweir void OApplicationController::deleteTables(const ::std::vector< ::rtl::OUString>& _rList)
240cdf0e10cSrcweir {
241cdf0e10cSrcweir     SharedConnection xConnection( ensureConnection() );
242cdf0e10cSrcweir 
243cdf0e10cSrcweir 	Reference<XTablesSupplier> xSup(xConnection,UNO_QUERY);
244cdf0e10cSrcweir 	OSL_ENSURE(xSup.is(),"OApplicationController::deleteTable: no XTablesSuppier!");
245cdf0e10cSrcweir 	if ( xSup.is() )
246cdf0e10cSrcweir 	{
247cdf0e10cSrcweir 		Reference<XNameAccess> xTables = xSup->getTables();
248cdf0e10cSrcweir 		Reference<XDrop> xDrop(xTables,UNO_QUERY);
249cdf0e10cSrcweir 		if ( xDrop.is() )
250cdf0e10cSrcweir 		{
251cdf0e10cSrcweir 			bool bConfirm = true;
252cdf0e10cSrcweir 			::std::vector< ::rtl::OUString>::const_iterator aEnd = _rList.end();
253cdf0e10cSrcweir 			for (::std::vector< ::rtl::OUString>::const_iterator aIter = _rList.begin(); aIter != aEnd; ++aIter)
254cdf0e10cSrcweir 			{
255cdf0e10cSrcweir 				::rtl::OUString sTableName = *aIter;
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 				sal_Int32 nResult = RET_YES;
258cdf0e10cSrcweir 				if ( bConfirm )
259cdf0e10cSrcweir 					nResult = ::dbaui::askForUserAction(getView(),STR_TITLE_CONFIRM_DELETION ,STR_QUERY_DELETE_TABLE,_rList.size() > 1 && (aIter+1) != _rList.end(),sTableName);
260cdf0e10cSrcweir 
261cdf0e10cSrcweir                 bool bUserConfirmedDelete =
262cdf0e10cSrcweir                             ( RET_YES == nResult )
263cdf0e10cSrcweir                         ||  ( RET_ALL == nResult );
264cdf0e10cSrcweir 				if ( bUserConfirmedDelete && m_pSubComponentManager->closeSubFrames( sTableName, E_TABLE ) )
265cdf0e10cSrcweir 				{
266cdf0e10cSrcweir 					SQLExceptionInfo aErrorInfo;
267cdf0e10cSrcweir 					try
268cdf0e10cSrcweir 					{
269cdf0e10cSrcweir 						if ( xTables->hasByName(sTableName) )
270cdf0e10cSrcweir 							xDrop->dropByName(sTableName);
271cdf0e10cSrcweir 						else
272cdf0e10cSrcweir 						{// could be a view
273cdf0e10cSrcweir 							Reference<XViewsSupplier> xViewsSup(xConnection,UNO_QUERY);
274cdf0e10cSrcweir 
275cdf0e10cSrcweir 							Reference<XNameAccess> xViews;
276cdf0e10cSrcweir 							if ( xViewsSup.is() )
277cdf0e10cSrcweir 							{
278cdf0e10cSrcweir 								xViews = xViewsSup->getViews();
279cdf0e10cSrcweir 								if ( xViews.is() && xViews->hasByName(sTableName) )
280cdf0e10cSrcweir 								{
281cdf0e10cSrcweir 									xDrop.set(xViews,UNO_QUERY);
282cdf0e10cSrcweir 									if ( xDrop.is() )
283cdf0e10cSrcweir 										xDrop->dropByName(sTableName);
284cdf0e10cSrcweir 								}
285cdf0e10cSrcweir 							}
286cdf0e10cSrcweir 						}
287cdf0e10cSrcweir 					}
288cdf0e10cSrcweir 					catch(SQLContext& e) { aErrorInfo = e; }
289cdf0e10cSrcweir 					catch(SQLWarning& e) { aErrorInfo = e; }
290cdf0e10cSrcweir 					catch(SQLException& e) { aErrorInfo = e; }
291cdf0e10cSrcweir 					catch(WrappedTargetException& e)
292cdf0e10cSrcweir 					{
293cdf0e10cSrcweir 						SQLException aSql;
294cdf0e10cSrcweir 						if(e.TargetException >>= aSql)
295cdf0e10cSrcweir 							aErrorInfo = aSql;
296cdf0e10cSrcweir 						else
297cdf0e10cSrcweir 							OSL_ENSURE(sal_False, "OApplicationController::implDropTable: something strange happended!");
298cdf0e10cSrcweir 					}
299cdf0e10cSrcweir 		            catch( const Exception& )
300cdf0e10cSrcweir 		            {
301cdf0e10cSrcweir                         DBG_UNHANDLED_EXCEPTION();
302cdf0e10cSrcweir 		            }
303cdf0e10cSrcweir 
304cdf0e10cSrcweir 					if ( aErrorInfo.isValid() )
305cdf0e10cSrcweir 						showError(aErrorInfo);
306cdf0e10cSrcweir 
307cdf0e10cSrcweir 					if ( RET_ALL == nResult )
308cdf0e10cSrcweir 						bConfirm = false;
309cdf0e10cSrcweir 				}
310cdf0e10cSrcweir 				else
311cdf0e10cSrcweir 					break;
312cdf0e10cSrcweir 			}
313cdf0e10cSrcweir 		}
314cdf0e10cSrcweir 		else
315cdf0e10cSrcweir 		{
316cdf0e10cSrcweir 			String sMessage(ModuleRes(STR_MISSING_TABLES_XDROP));
317cdf0e10cSrcweir 			ErrorBox aError(getView(), WB_OK, sMessage);
318cdf0e10cSrcweir 			aError.Execute();
319cdf0e10cSrcweir 		}
320cdf0e10cSrcweir 	}
321cdf0e10cSrcweir }
322cdf0e10cSrcweir // -----------------------------------------------------------------------------
deleteObjects(ElementType _eType,const::std::vector<::rtl::OUString> & _rList,bool _bConfirm)323cdf0e10cSrcweir void OApplicationController::deleteObjects( ElementType _eType, const ::std::vector< ::rtl::OUString>& _rList, bool _bConfirm )
324cdf0e10cSrcweir {
325cdf0e10cSrcweir     Reference< XNameContainer > xNames( getElements( _eType ), UNO_QUERY );
326cdf0e10cSrcweir 	Reference< XHierarchicalNameContainer > xHierarchyName( xNames, UNO_QUERY );
327cdf0e10cSrcweir 	if ( xNames.is() )
328cdf0e10cSrcweir 	{
329cdf0e10cSrcweir 		ByteString sDialogPosition;
330cdf0e10cSrcweir 		svtools::QueryDeleteResult_Impl eResult = _bConfirm ? svtools::QUERYDELETE_YES : svtools::QUERYDELETE_ALL;
331cdf0e10cSrcweir 
332cdf0e10cSrcweir         // The list of elements to delete is allowed to contain related elements: A given element may
333cdf0e10cSrcweir         // be the ancestor or child of another element from the list.
334cdf0e10cSrcweir         // We want to ensure that ancestors get deleted first, so we normalize the list in this respect.
335cdf0e10cSrcweir         // #i33353# - 2004-09-27 - fs@openoffice.org
336cdf0e10cSrcweir         ::std::set< ::rtl::OUString > aDeleteNames;
337cdf0e10cSrcweir             // Note that this implicitly uses ::std::less< ::rtl::OUString > a comparison operation, which
338cdf0e10cSrcweir             // results in lexicographical order, which is exactly what we need, because "foo" is *before*
339cdf0e10cSrcweir             // any "foo/bar" in this order.
340cdf0e10cSrcweir         ::std::copy(
341cdf0e10cSrcweir             _rList.begin(), _rList.end(),
342cdf0e10cSrcweir             ::std::insert_iterator< ::std::set< ::rtl::OUString > >( aDeleteNames, aDeleteNames.begin() )
343cdf0e10cSrcweir         );
344cdf0e10cSrcweir 
345cdf0e10cSrcweir         ::std::set< ::rtl::OUString >::size_type nCount = aDeleteNames.size();
346cdf0e10cSrcweir         for ( ::std::set< ::rtl::OUString >::size_type nObjectsLeft = nCount; !aDeleteNames.empty(); )
347cdf0e10cSrcweir 		{
348cdf0e10cSrcweir             ::std::set< ::rtl::OUString >::iterator  aThisRound = aDeleteNames.begin();
349cdf0e10cSrcweir 
350cdf0e10cSrcweir 			if ( eResult != svtools::QUERYDELETE_ALL )
351cdf0e10cSrcweir 			{
352cdf0e10cSrcweir 				svtools::QueryDeleteDlg_Impl aDlg( getView(), *aThisRound );
353cdf0e10cSrcweir 
354cdf0e10cSrcweir                 if ( sDialogPosition.Len() )
355cdf0e10cSrcweir 					aDlg.SetWindowState( sDialogPosition );
356cdf0e10cSrcweir 
357cdf0e10cSrcweir                 if ( nObjectsLeft > 1 )
358cdf0e10cSrcweir 					aDlg.EnableAllButton();
359cdf0e10cSrcweir 
360cdf0e10cSrcweir                 if ( aDlg.Execute() == RET_OK )
361cdf0e10cSrcweir 					eResult = aDlg.GetResult();
362cdf0e10cSrcweir 				else
363cdf0e10cSrcweir 					return;
364cdf0e10cSrcweir 
365cdf0e10cSrcweir 				sDialogPosition = aDlg.GetWindowState( );
366cdf0e10cSrcweir 			}
367cdf0e10cSrcweir 
368cdf0e10cSrcweir             bool bSuccess = false;
369cdf0e10cSrcweir 
370cdf0e10cSrcweir             bool bUserConfirmedDelete =
371cdf0e10cSrcweir                         ( eResult == svtools::QUERYDELETE_ALL )
372cdf0e10cSrcweir                     ||  ( eResult == svtools::QUERYDELETE_YES );
373cdf0e10cSrcweir 
374cdf0e10cSrcweir             if  (   bUserConfirmedDelete
375cdf0e10cSrcweir                 &&  (   ( _eType == E_QUERY ) ? m_pSubComponentManager->closeSubFrames( *aThisRound, _eType ) : true )
376cdf0e10cSrcweir                 )
377cdf0e10cSrcweir 			{
378cdf0e10cSrcweir 				try
379cdf0e10cSrcweir 				{
380cdf0e10cSrcweir 					if ( xHierarchyName.is() )
381cdf0e10cSrcweir 						xHierarchyName->removeByHierarchicalName( *aThisRound );
382cdf0e10cSrcweir 					else
383cdf0e10cSrcweir 						xNames->removeByName( *aThisRound );
384cdf0e10cSrcweir 
385cdf0e10cSrcweir                     bSuccess = true;
386cdf0e10cSrcweir 
387cdf0e10cSrcweir                     // now that we removed the element, care for all it's child elements
388cdf0e10cSrcweir                     // which may also be a part of the list
389cdf0e10cSrcweir                     // #i33353# - 2004-09-27 - fs@openoffice.org
390cdf0e10cSrcweir                     OSL_ENSURE( aThisRound->getLength() - 1 >= 0, "OApplicationController::deleteObjects: empty name?" );
391cdf0e10cSrcweir 					::rtl::OUStringBuffer sSmallestSiblingName( *aThisRound );
392cdf0e10cSrcweir                     sSmallestSiblingName.append( (sal_Unicode)( '/' + 1) );
393cdf0e10cSrcweir 
394cdf0e10cSrcweir                     ::std::set< ::rtl::OUString >::iterator aUpperChildrenBound = aDeleteNames.lower_bound( sSmallestSiblingName.makeStringAndClear() );
395cdf0e10cSrcweir                     for ( ::std::set< ::rtl::OUString >::iterator aObsolete = aThisRound;
396cdf0e10cSrcweir                           aObsolete != aUpperChildrenBound;
397cdf0e10cSrcweir                         )
398cdf0e10cSrcweir                     {
399cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0
400cdf0e10cSrcweir                         ::rtl::OUString sObsoleteName = *aObsolete;
401cdf0e10cSrcweir #endif
402cdf0e10cSrcweir                         ::std::set< ::rtl::OUString >::iterator aNextObsolete = aObsolete; ++aNextObsolete;
403cdf0e10cSrcweir                         aDeleteNames.erase( aObsolete );
404cdf0e10cSrcweir                         --nObjectsLeft;
405cdf0e10cSrcweir                         aObsolete = aNextObsolete;
406cdf0e10cSrcweir                     }
407cdf0e10cSrcweir 				}
408cdf0e10cSrcweir 				catch(const SQLException&)
409cdf0e10cSrcweir 				{
410cdf0e10cSrcweir                     showError( SQLExceptionInfo( ::cppu::getCaughtException() ) );
411cdf0e10cSrcweir 				}
412cdf0e10cSrcweir 				catch(WrappedTargetException& e)
413cdf0e10cSrcweir 				{
414cdf0e10cSrcweir 					SQLException aSql;
415cdf0e10cSrcweir 					if ( e.TargetException >>= aSql )
416cdf0e10cSrcweir 						showError( SQLExceptionInfo( e.TargetException ) );
417cdf0e10cSrcweir 					else
418cdf0e10cSrcweir 						OSL_ENSURE( sal_False, "OApplicationController::deleteObjects: something strange happended!" );
419cdf0e10cSrcweir 				}
420cdf0e10cSrcweir                 catch( const Exception& )
421cdf0e10cSrcweir                 {
422cdf0e10cSrcweir                     DBG_UNHANDLED_EXCEPTION();
423cdf0e10cSrcweir                 }
424cdf0e10cSrcweir 			}
425cdf0e10cSrcweir 
426cdf0e10cSrcweir             if ( !bSuccess )
427cdf0e10cSrcweir             {
428cdf0e10cSrcweir                 // okay, this object could not be deleted (or the user did not want to delete it),
429cdf0e10cSrcweir                 // but continue with the rest
430cdf0e10cSrcweir                 aDeleteNames.erase( aThisRound );
431cdf0e10cSrcweir                 --nObjectsLeft;
432cdf0e10cSrcweir             }
433cdf0e10cSrcweir 		}
434cdf0e10cSrcweir 	}
435cdf0e10cSrcweir }
436cdf0e10cSrcweir // -----------------------------------------------------------------------------
deleteEntries()437cdf0e10cSrcweir void OApplicationController::deleteEntries()
438cdf0e10cSrcweir {
439cdf0e10cSrcweir 	::vos::OGuard aSolarGuard(Application::GetSolarMutex());
440cdf0e10cSrcweir 	::osl::MutexGuard aGuard( getMutex() );
441cdf0e10cSrcweir 
442cdf0e10cSrcweir 	if ( getContainer() )
443cdf0e10cSrcweir 	{
444cdf0e10cSrcweir 		::std::vector< ::rtl::OUString> aList;
445cdf0e10cSrcweir 		getSelectionElementNames(aList);
446cdf0e10cSrcweir 		ElementType eType = getContainer()->getElementType();
447cdf0e10cSrcweir 		switch(eType)
448cdf0e10cSrcweir 		{
449cdf0e10cSrcweir 		case E_TABLE:
450cdf0e10cSrcweir 			deleteTables(aList);
451cdf0e10cSrcweir 			break;
452cdf0e10cSrcweir 		case E_QUERY:
453cdf0e10cSrcweir 			deleteObjects( E_QUERY, aList, true );
454cdf0e10cSrcweir 			break;
455cdf0e10cSrcweir 		case E_FORM:
456cdf0e10cSrcweir 			deleteObjects( E_FORM, aList, true );
457cdf0e10cSrcweir 			break;
458cdf0e10cSrcweir 		case E_REPORT:
459cdf0e10cSrcweir 			deleteObjects( E_REPORT, aList, true );
460cdf0e10cSrcweir 			break;
461cdf0e10cSrcweir         case E_NONE:
462cdf0e10cSrcweir             break;
463cdf0e10cSrcweir 		}
464cdf0e10cSrcweir 	}
465cdf0e10cSrcweir }
466cdf0e10cSrcweir // -----------------------------------------------------------------------------
ensureConnection(::dbtools::SQLExceptionInfo * _pErrorInfo)467cdf0e10cSrcweir const SharedConnection& OApplicationController::ensureConnection( ::dbtools::SQLExceptionInfo* _pErrorInfo )
468cdf0e10cSrcweir {
469cdf0e10cSrcweir 	::vos::OGuard aSolarGuard(Application::GetSolarMutex());
470cdf0e10cSrcweir 	::osl::MutexGuard aGuard( getMutex() );
471cdf0e10cSrcweir 
472cdf0e10cSrcweir     if ( !m_xDataSourceConnection.is() )
473cdf0e10cSrcweir     {
474cdf0e10cSrcweir 		WaitObject aWO(getView());
475cdf0e10cSrcweir 		String sConnectingContext( ModuleRes( STR_COULDNOTCONNECT_DATASOURCE ) );
476cdf0e10cSrcweir 		sConnectingContext.SearchAndReplaceAscii("$name$", getStrippedDatabaseName());
477cdf0e10cSrcweir 
478cdf0e10cSrcweir 		m_xDataSourceConnection.reset( connect( getDatabaseName(), sConnectingContext, _pErrorInfo ) );
479cdf0e10cSrcweir         if ( m_xDataSourceConnection.is() )
480cdf0e10cSrcweir         {
481cdf0e10cSrcweir             SQLExceptionInfo aError;
482cdf0e10cSrcweir             try
483cdf0e10cSrcweir             {
484cdf0e10cSrcweir                 m_xMetaData = m_xDataSourceConnection->getMetaData();
485cdf0e10cSrcweir             }
486cdf0e10cSrcweir             catch( const SQLException& )
487cdf0e10cSrcweir             {
488cdf0e10cSrcweir                 aError = ::cppu::getCaughtException();
489cdf0e10cSrcweir             }
490cdf0e10cSrcweir             catch( const Exception& )
491cdf0e10cSrcweir             {
492cdf0e10cSrcweir             	DBG_UNHANDLED_EXCEPTION();
493cdf0e10cSrcweir             }
494cdf0e10cSrcweir             if ( aError.isValid() )
495cdf0e10cSrcweir             {
496cdf0e10cSrcweir                 if ( _pErrorInfo )
497cdf0e10cSrcweir                 {
498cdf0e10cSrcweir                     *_pErrorInfo = aError;
499cdf0e10cSrcweir                 }
500cdf0e10cSrcweir                 else
501cdf0e10cSrcweir                 {
502cdf0e10cSrcweir                     showError( aError );
503cdf0e10cSrcweir                 }
504cdf0e10cSrcweir             }
505cdf0e10cSrcweir         }
506cdf0e10cSrcweir 	}
507cdf0e10cSrcweir     return m_xDataSourceConnection;
508cdf0e10cSrcweir }
509cdf0e10cSrcweir // -----------------------------------------------------------------------------
isDataSourceReadOnly() const510cdf0e10cSrcweir sal_Bool OApplicationController::isDataSourceReadOnly() const
511cdf0e10cSrcweir {
512cdf0e10cSrcweir 	Reference<XStorable> xStore(m_xModel,UNO_QUERY);
513cdf0e10cSrcweir 	return !xStore.is() || xStore->isReadonly();
514cdf0e10cSrcweir }
515cdf0e10cSrcweir // -----------------------------------------------------------------------------
isConnectionReadOnly() const516cdf0e10cSrcweir sal_Bool OApplicationController::isConnectionReadOnly() const
517cdf0e10cSrcweir {
518cdf0e10cSrcweir 	sal_Bool bIsConnectionReadOnly = sal_True;
519cdf0e10cSrcweir 	if ( m_xMetaData.is() )
520cdf0e10cSrcweir 	{
521cdf0e10cSrcweir 		try
522cdf0e10cSrcweir 		{
523cdf0e10cSrcweir 			bIsConnectionReadOnly = m_xMetaData->isReadOnly();
524cdf0e10cSrcweir 		}
525cdf0e10cSrcweir 		catch(const SQLException&)
526cdf0e10cSrcweir 		{
527cdf0e10cSrcweir             DBG_UNHANDLED_EXCEPTION();
528cdf0e10cSrcweir 		}
529cdf0e10cSrcweir 	}
530cdf0e10cSrcweir 	// TODO check configuration
531cdf0e10cSrcweir 	return bIsConnectionReadOnly;
532cdf0e10cSrcweir }
533cdf0e10cSrcweir // -----------------------------------------------------------------------------
getElements(ElementType _eType)534cdf0e10cSrcweir Reference< XNameAccess > OApplicationController::getElements( ElementType _eType )
535cdf0e10cSrcweir {
536cdf0e10cSrcweir 	Reference< XNameAccess > xElements;
537cdf0e10cSrcweir 	try
538cdf0e10cSrcweir 	{
539cdf0e10cSrcweir 		switch ( _eType )
540cdf0e10cSrcweir 		{
541cdf0e10cSrcweir 		case E_REPORT:
542cdf0e10cSrcweir 		{
543cdf0e10cSrcweir 			Reference< XReportDocumentsSupplier > xSupp( m_xModel, UNO_QUERY_THROW );
544cdf0e10cSrcweir             xElements.set( xSupp->getReportDocuments(), UNO_SET_THROW );
545cdf0e10cSrcweir 		}
546cdf0e10cSrcweir 		break;
547cdf0e10cSrcweir 
548cdf0e10cSrcweir         case E_FORM:
549cdf0e10cSrcweir 		{
550cdf0e10cSrcweir 			Reference< XFormDocumentsSupplier > xSupp( m_xModel, UNO_QUERY_THROW );
551cdf0e10cSrcweir             xElements.set( xSupp->getFormDocuments(), UNO_SET_THROW );
552cdf0e10cSrcweir 		}
553cdf0e10cSrcweir 		break;
554cdf0e10cSrcweir 
555cdf0e10cSrcweir         case E_QUERY:
556cdf0e10cSrcweir 		{
557cdf0e10cSrcweir 			xElements.set( getQueryDefintions(), UNO_QUERY_THROW );
558cdf0e10cSrcweir 		}
559cdf0e10cSrcweir 		break;
560cdf0e10cSrcweir 
561cdf0e10cSrcweir 		case E_TABLE:
562cdf0e10cSrcweir 		{
563cdf0e10cSrcweir             if ( m_xDataSourceConnection.is() )
564cdf0e10cSrcweir 			{
565cdf0e10cSrcweir 				Reference< XTablesSupplier > xSup( getConnection(), UNO_QUERY_THROW );
566cdf0e10cSrcweir 				xElements.set( xSup->getTables(), UNO_SET_THROW );
567cdf0e10cSrcweir 			}
568cdf0e10cSrcweir 		}
569cdf0e10cSrcweir 		break;
570cdf0e10cSrcweir 
571cdf0e10cSrcweir         default:
572cdf0e10cSrcweir             break;
573cdf0e10cSrcweir 		}
574cdf0e10cSrcweir 	}
575cdf0e10cSrcweir 	catch(const Exception&)
576cdf0e10cSrcweir 	{
577cdf0e10cSrcweir         DBG_UNHANDLED_EXCEPTION();
578cdf0e10cSrcweir 	}
579cdf0e10cSrcweir 
580cdf0e10cSrcweir 	return xElements;
581cdf0e10cSrcweir }
582cdf0e10cSrcweir // -----------------------------------------------------------------------------
getSelectionElementNames(::std::vector<::rtl::OUString> & _rNames) const583cdf0e10cSrcweir void OApplicationController::getSelectionElementNames(::std::vector< ::rtl::OUString>& _rNames) const
584cdf0e10cSrcweir {
585cdf0e10cSrcweir 	::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
586cdf0e10cSrcweir 	::osl::MutexGuard aGuard( getMutex() );
587cdf0e10cSrcweir 
588cdf0e10cSrcweir 	OSL_ENSURE(getContainer(),"View isn't valid! -> GPF");
589cdf0e10cSrcweir 
590cdf0e10cSrcweir 	getContainer()->getSelectionElementNames( _rNames );
591cdf0e10cSrcweir }
592cdf0e10cSrcweir 
593cdf0e10cSrcweir // -----------------------------------------------------------------------------
getDocumentsAccess(ElementType _eType)594cdf0e10cSrcweir ::std::auto_ptr< OLinkedDocumentsAccess > OApplicationController::getDocumentsAccess( ElementType _eType )
595cdf0e10cSrcweir {
596cdf0e10cSrcweir     OSL_ENSURE( ( _eType == E_TABLE ) || ( _eType == E_QUERY ) || ( _eType == E_FORM ) || ( _eType == E_REPORT ),
597cdf0e10cSrcweir         "OApplicationController::getDocumentsAccess: only forms and reports are supported here!" );
598cdf0e10cSrcweir 
599cdf0e10cSrcweir     SharedConnection xConnection( ensureConnection() );
600cdf0e10cSrcweir     Reference< XNameAccess > xDocContainer;
601cdf0e10cSrcweir 
602cdf0e10cSrcweir     if ( ( _eType == E_FORM ) | ( _eType == E_REPORT ) )
603cdf0e10cSrcweir     {
604cdf0e10cSrcweir         xDocContainer.set( getElements( _eType ) );
605cdf0e10cSrcweir         OSL_ENSURE( xDocContainer.is(), "OApplicationController::getDocumentsAccess: invalid container!" );
606cdf0e10cSrcweir     }
607cdf0e10cSrcweir 
608cdf0e10cSrcweir     ::std::auto_ptr< OLinkedDocumentsAccess > pDocuments( new OLinkedDocumentsAccess(
609cdf0e10cSrcweir         getView(), this, getORB(), xDocContainer, xConnection, getDatabaseName()
610cdf0e10cSrcweir     ) );
611cdf0e10cSrcweir     return pDocuments;
612cdf0e10cSrcweir }
613cdf0e10cSrcweir // -----------------------------------------------------------------------------
copyObject()614cdf0e10cSrcweir TransferableHelper* OApplicationController::copyObject()
615cdf0e10cSrcweir {
616cdf0e10cSrcweir 	try
617cdf0e10cSrcweir 	{
618cdf0e10cSrcweir 		::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
619cdf0e10cSrcweir 		::osl::MutexGuard aGuard( getMutex() );
620cdf0e10cSrcweir 
621cdf0e10cSrcweir 		ElementType eType = getContainer()->getElementType();
622cdf0e10cSrcweir 		TransferableHelper* pData = NULL;
623cdf0e10cSrcweir 		switch( eType )
624cdf0e10cSrcweir 		{
625cdf0e10cSrcweir 			case E_TABLE:
626cdf0e10cSrcweir 			case E_QUERY:
627cdf0e10cSrcweir 			{
628cdf0e10cSrcweir                 SharedConnection xConnection( ensureConnection() );
629cdf0e10cSrcweir 				Reference< XDatabaseMetaData> xMetaData;
630cdf0e10cSrcweir 				if ( xConnection.is() )
631cdf0e10cSrcweir 					xMetaData = xConnection->getMetaData();
632cdf0e10cSrcweir 
633cdf0e10cSrcweir 				::rtl::OUString sName = getContainer()->getQualifiedName( NULL );
634cdf0e10cSrcweir                 if ( sName.getLength() )
635cdf0e10cSrcweir                 {
636cdf0e10cSrcweir 				    ::rtl::OUString sDataSource	= getDatabaseName();
637cdf0e10cSrcweir 
638cdf0e10cSrcweir 				    if ( eType == E_TABLE )
639cdf0e10cSrcweir 				    {
640cdf0e10cSrcweir 					    pData = new ODataClipboard(sDataSource, CommandType::TABLE, sName, xConnection, getNumberFormatter(xConnection,getORB()), getORB());
641cdf0e10cSrcweir 				    }
642cdf0e10cSrcweir 				    else
643cdf0e10cSrcweir 				    {
644cdf0e10cSrcweir 					    pData = new ODataClipboard(sDataSource, CommandType::QUERY, sName, getNumberFormatter(xConnection,getORB()), getORB());
645cdf0e10cSrcweir 				    }
646cdf0e10cSrcweir                 }
647cdf0e10cSrcweir 			}
648cdf0e10cSrcweir 				break;
649cdf0e10cSrcweir 			case E_FORM:
650cdf0e10cSrcweir 			case E_REPORT:
651cdf0e10cSrcweir 			{
652cdf0e10cSrcweir 				::std::vector< ::rtl::OUString> aList;
653cdf0e10cSrcweir 				getSelectionElementNames(aList);
654cdf0e10cSrcweir 				Reference< XHierarchicalNameAccess > xElements(getElements(eType),UNO_QUERY);
655cdf0e10cSrcweir 				if ( xElements.is() && !aList.empty() )
656cdf0e10cSrcweir 				{
657cdf0e10cSrcweir 					Reference< XContent> xContent(xElements->getByHierarchicalName(*aList.begin()),UNO_QUERY);
658cdf0e10cSrcweir 					pData = new OComponentTransferable( getDatabaseName(), xContent );
659cdf0e10cSrcweir 				}
660cdf0e10cSrcweir 			}
661cdf0e10cSrcweir 			break;
662cdf0e10cSrcweir             default:
663cdf0e10cSrcweir                 break;
664cdf0e10cSrcweir 		}
665cdf0e10cSrcweir 
666cdf0e10cSrcweir 		// the owner ship goes to ODataClipboards
667cdf0e10cSrcweir 		return pData;
668cdf0e10cSrcweir 	}
669cdf0e10cSrcweir     catch(const SQLException&)
670cdf0e10cSrcweir     {
671cdf0e10cSrcweir         showError( SQLExceptionInfo( ::cppu::getCaughtException() ) );
672cdf0e10cSrcweir     }
673cdf0e10cSrcweir 	catch( const Exception& )
674cdf0e10cSrcweir 	{
675cdf0e10cSrcweir         DBG_UNHANDLED_EXCEPTION();
676cdf0e10cSrcweir 	}
677cdf0e10cSrcweir 	return NULL;
678cdf0e10cSrcweir }
679cdf0e10cSrcweir // -----------------------------------------------------------------------------
paste(ElementType _eType,const::svx::ODataAccessDescriptor & _rPasteData,const String & _sParentFolder,sal_Bool _bMove)680cdf0e10cSrcweir sal_Bool OApplicationController::paste( ElementType _eType,const ::svx::ODataAccessDescriptor& _rPasteData,const String& _sParentFolder ,sal_Bool _bMove)
681cdf0e10cSrcweir {
682cdf0e10cSrcweir 	try
683cdf0e10cSrcweir 	{
684cdf0e10cSrcweir 		if ( _eType == E_QUERY )
685cdf0e10cSrcweir 		{
686cdf0e10cSrcweir 			sal_Int32 nCommandType = CommandType::TABLE;
687cdf0e10cSrcweir 			if ( _rPasteData.has(daCommandType) )
688cdf0e10cSrcweir 				_rPasteData[daCommandType]		>>= nCommandType;
689cdf0e10cSrcweir 
690cdf0e10cSrcweir 			if ( CommandType::QUERY == nCommandType || CommandType::COMMAND == nCommandType )
691cdf0e10cSrcweir 			{
692cdf0e10cSrcweir 				// read all nescessary data
693cdf0e10cSrcweir 
694cdf0e10cSrcweir 				::rtl::OUString	sCommand;
695cdf0e10cSrcweir 				sal_Bool bEscapeProcessing = sal_True;
696cdf0e10cSrcweir 
697cdf0e10cSrcweir 				_rPasteData[daCommand] >>= sCommand;
698cdf0e10cSrcweir 				if ( _rPasteData.has(daEscapeProcessing) )
699cdf0e10cSrcweir 					_rPasteData[daEscapeProcessing]	>>= bEscapeProcessing;
700cdf0e10cSrcweir 
701cdf0e10cSrcweir 				// plausibility check
702cdf0e10cSrcweir 				sal_Bool bValidDescriptor = sal_False;
703cdf0e10cSrcweir                 ::rtl::OUString	sDataSourceName = _rPasteData.getDataSource();
704cdf0e10cSrcweir 				if (CommandType::QUERY == nCommandType)
705cdf0e10cSrcweir 					bValidDescriptor = sDataSourceName.getLength() && sCommand.getLength();
706cdf0e10cSrcweir 				else if (CommandType::COMMAND == nCommandType)
707cdf0e10cSrcweir 					bValidDescriptor = (0 != sCommand.getLength());
708cdf0e10cSrcweir 				if (!bValidDescriptor)
709cdf0e10cSrcweir 				{
710cdf0e10cSrcweir 					DBG_ERROR("OApplicationController::paste: invalid descriptor!");
711cdf0e10cSrcweir 					return sal_False;
712cdf0e10cSrcweir 				}
713cdf0e10cSrcweir 
714cdf0e10cSrcweir 				// the target object name (as we'll suggest it to the user)
715cdf0e10cSrcweir                 ::rtl::OUString sTargetName;
716cdf0e10cSrcweir 				try
717cdf0e10cSrcweir 				{
718cdf0e10cSrcweir 				    if ( CommandType::QUERY == nCommandType )
719cdf0e10cSrcweir                         sTargetName = sCommand;
720cdf0e10cSrcweir 
721cdf0e10cSrcweir                     if ( !sTargetName.getLength() )
722cdf0e10cSrcweir                     {
723cdf0e10cSrcweir                         String sDefaultName = String( ModuleRes( STR_QRY_TITLE ) );
724cdf0e10cSrcweir                         sDefaultName = sDefaultName.GetToken( 0, ' ' );
725cdf0e10cSrcweir 
726cdf0e10cSrcweir                         Reference< XNameAccess > xQueries( getQueryDefintions(), UNO_QUERY_THROW );
727cdf0e10cSrcweir 				        sTargetName = ::dbtools::createUniqueName( xQueries, sDefaultName, sal_False );
728cdf0e10cSrcweir                     }
729cdf0e10cSrcweir 				}
730cdf0e10cSrcweir 				catch(const Exception&)
731cdf0e10cSrcweir 				{
732cdf0e10cSrcweir 					DBG_UNHANDLED_EXCEPTION();
733cdf0e10cSrcweir 				}
734cdf0e10cSrcweir 
735cdf0e10cSrcweir                 Reference< XPropertySet > xQuery;
736cdf0e10cSrcweir 				if (CommandType::QUERY == nCommandType)
737cdf0e10cSrcweir 				{
738cdf0e10cSrcweir 					// need to extract the statement and the escape processing flag from the query object
739cdf0e10cSrcweir 					sal_Bool bSuccess = sal_False;
740cdf0e10cSrcweir 					try
741cdf0e10cSrcweir 					{
742cdf0e10cSrcweir 						// the concrete query
743cdf0e10cSrcweir 						Reference< XQueryDefinitionsSupplier > xSourceQuerySup(
744cdf0e10cSrcweir                             getDataSourceByName( sDataSourceName, getView(), getORB(), NULL ),
745cdf0e10cSrcweir                             UNO_QUERY_THROW );
746cdf0e10cSrcweir                         Reference< XNameAccess > xQueries( xSourceQuerySup->getQueryDefinitions(), UNO_SET_THROW );
747cdf0e10cSrcweir 						if ( xQueries->hasByName( sCommand ) )
748cdf0e10cSrcweir 						{
749cdf0e10cSrcweir 							xQuery.set( xQueries->getByName(sCommand), UNO_QUERY_THROW );
750cdf0e10cSrcweir 							bSuccess = true;
751cdf0e10cSrcweir 						}
752cdf0e10cSrcweir 					}
753cdf0e10cSrcweir 					catch(SQLException&) { throw; }	// caught and handled by the outer catch
754cdf0e10cSrcweir                     catch( const Exception& )
755cdf0e10cSrcweir                     {
756cdf0e10cSrcweir                         DBG_UNHANDLED_EXCEPTION();
757cdf0e10cSrcweir                     }
758cdf0e10cSrcweir 
759cdf0e10cSrcweir 					if (!bSuccess)
760cdf0e10cSrcweir 					{
761cdf0e10cSrcweir 						DBG_ERROR("OApplicationController::paste: could not extract the source query object!");
762cdf0e10cSrcweir 						// TODO: maybe this is worth an error message to be displayed to the user ....
763cdf0e10cSrcweir 						return sal_False;
764cdf0e10cSrcweir 					}
765cdf0e10cSrcweir 				}
766cdf0e10cSrcweir 
767cdf0e10cSrcweir 
768cdf0e10cSrcweir 				Reference< XNameContainer > xDestQueries(getQueryDefintions(), UNO_QUERY);
769cdf0e10cSrcweir 				Reference< XSingleServiceFactory > xQueryFactory(xDestQueries, UNO_QUERY);
770cdf0e10cSrcweir 				if (!xQueryFactory.is())
771cdf0e10cSrcweir 				{
772cdf0e10cSrcweir 					DBG_ERROR("OApplicationController::paste: invalid destination query container!");
773cdf0e10cSrcweir 					return sal_False;
774cdf0e10cSrcweir 				}
775cdf0e10cSrcweir 
776cdf0e10cSrcweir 				// here we have everything needed to create a new query object ...
777cdf0e10cSrcweir 				// ... ehm, except a new name
778cdf0e10cSrcweir                 ensureConnection();
779cdf0e10cSrcweir 
780cdf0e10cSrcweir                 DynamicTableOrQueryNameCheck aNameChecker( getConnection(), CommandType::QUERY );
781cdf0e10cSrcweir                 ::dbtools::SQLExceptionInfo aDummy;
782cdf0e10cSrcweir                 bool bNeedAskForName =  ( sCommand.getLength() == 0 )
783cdf0e10cSrcweir                                             /* we did not have a source name, so the target name was auto-generated */
784cdf0e10cSrcweir                                     ||  ( !aNameChecker.isNameValid( sTargetName, aDummy ) );
785cdf0e10cSrcweir                                             /*  name is invalid in the target DB (e.g. because it already
786cdf0e10cSrcweir                                                 has a /table/ with that name) */
787cdf0e10cSrcweir                 if ( bNeedAskForName )
788cdf0e10cSrcweir                 {
789cdf0e10cSrcweir 				    OSaveAsDlg aAskForName(	getView(),
790cdf0e10cSrcweir 										    CommandType::QUERY,
791cdf0e10cSrcweir                                             getORB(),
792cdf0e10cSrcweir 										    getConnection(),
793cdf0e10cSrcweir 										    sTargetName,
794cdf0e10cSrcweir                                             aNameChecker,
795cdf0e10cSrcweir 										    SAD_ADDITIONAL_DESCRIPTION | SAD_TITLE_PASTE_AS);
796cdf0e10cSrcweir 				    if ( RET_OK != aAskForName.Execute() )
797cdf0e10cSrcweir 					    // cancelled by the user
798cdf0e10cSrcweir 					    return sal_False;
799cdf0e10cSrcweir 				    sTargetName = aAskForName.getName();
800cdf0e10cSrcweir                 }
801cdf0e10cSrcweir 
802cdf0e10cSrcweir 				// create a new object
803cdf0e10cSrcweir 				Reference< XPropertySet > xNewQuery(xQueryFactory->createInstance(), UNO_QUERY);
804cdf0e10cSrcweir 				DBG_ASSERT(xNewQuery.is(), "OApplicationController::paste: invalid object created by factory!");
805cdf0e10cSrcweir 				if (xNewQuery.is())
806cdf0e10cSrcweir 				{
807cdf0e10cSrcweir 					// initialize
808cdf0e10cSrcweir 					if ( xQuery.is() )
809cdf0e10cSrcweir 	                    ::comphelper::copyProperties(xQuery,xNewQuery);
810cdf0e10cSrcweir 					else
811cdf0e10cSrcweir 					{
812cdf0e10cSrcweir                         xNewQuery->setPropertyValue(PROPERTY_COMMAND,makeAny(sCommand));
813cdf0e10cSrcweir                         xNewQuery->setPropertyValue(PROPERTY_ESCAPE_PROCESSING,makeAny(bEscapeProcessing));
814cdf0e10cSrcweir                     }
815cdf0e10cSrcweir 					// insert
816cdf0e10cSrcweir 					xDestQueries->insertByName( sTargetName, makeAny(xNewQuery) );
817cdf0e10cSrcweir                     xNewQuery.set(xDestQueries->getByName( sTargetName),UNO_QUERY);
818cdf0e10cSrcweir                     if ( xQuery.is() && xNewQuery.is() )
819cdf0e10cSrcweir                     {
820cdf0e10cSrcweir                         Reference<XColumnsSupplier> xSrcColSup(xQuery,UNO_QUERY);
821cdf0e10cSrcweir                         Reference<XColumnsSupplier> xDstColSup(xNewQuery,UNO_QUERY);
822cdf0e10cSrcweir                         if ( xSrcColSup.is() && xDstColSup.is() )
823cdf0e10cSrcweir 	                    {
824cdf0e10cSrcweir 		                    Reference<XNameAccess> xSrcNameAccess = xSrcColSup->getColumns();
825cdf0e10cSrcweir                             Reference<XNameAccess> xDstNameAccess = xDstColSup->getColumns();
826cdf0e10cSrcweir                             Reference<XDataDescriptorFactory> xFac(xDstNameAccess,UNO_QUERY);
827cdf0e10cSrcweir                             Reference<XAppend> xAppend(xFac,UNO_QUERY);
828cdf0e10cSrcweir 		                    if ( xSrcNameAccess.is() && xDstNameAccess.is() && xSrcNameAccess->hasElements() && xAppend.is() )
829cdf0e10cSrcweir                             {
830cdf0e10cSrcweir                                 Reference<XPropertySet> xDstProp(xFac->createDataDescriptor());
831cdf0e10cSrcweir 
832cdf0e10cSrcweir                                 Sequence< ::rtl::OUString> aSeq = xSrcNameAccess->getElementNames();
833cdf0e10cSrcweir 			                    const ::rtl::OUString* pIter = aSeq.getConstArray();
834cdf0e10cSrcweir 			                    const ::rtl::OUString* pEnd	  = pIter + aSeq.getLength();
835cdf0e10cSrcweir 			                    for( ; pIter != pEnd ; ++pIter)
836cdf0e10cSrcweir 			                    {
837cdf0e10cSrcweir 				                    Reference<XPropertySet> xSrcProp(xSrcNameAccess->getByName(*pIter),UNO_QUERY);
838cdf0e10cSrcweir                                     ::comphelper::copyProperties(xSrcProp,xDstProp);
839cdf0e10cSrcweir                                     xAppend->appendByDescriptor(xDstProp);
840cdf0e10cSrcweir                                 }
841cdf0e10cSrcweir                             }
842cdf0e10cSrcweir                         }
843cdf0e10cSrcweir 					}
844cdf0e10cSrcweir 				}
845cdf0e10cSrcweir 			}
846cdf0e10cSrcweir 			else
847cdf0e10cSrcweir 				OSL_TRACE("There should be a sequence in it!");
848cdf0e10cSrcweir 			return sal_True;
849cdf0e10cSrcweir 		}
850cdf0e10cSrcweir 		else if ( _rPasteData.has(daComponent) ) // forms or reports
851cdf0e10cSrcweir 		{
852cdf0e10cSrcweir 			Reference<XContent> xContent;
853cdf0e10cSrcweir 			_rPasteData[daComponent] >>= xContent;
854cdf0e10cSrcweir 			return insertHierachyElement(_eType,_sParentFolder,Reference<XNameAccess>(xContent,UNO_QUERY).is(),xContent,_bMove);
855cdf0e10cSrcweir 		}
856cdf0e10cSrcweir 	}
857cdf0e10cSrcweir     catch(const SQLException&) { showError( SQLExceptionInfo( ::cppu::getCaughtException() ) ); }
858cdf0e10cSrcweir 	catch(const Exception& )
859cdf0e10cSrcweir 	{
860cdf0e10cSrcweir         DBG_UNHANDLED_EXCEPTION();
861cdf0e10cSrcweir 	}
862cdf0e10cSrcweir 	return sal_False;
863cdf0e10cSrcweir }
864cdf0e10cSrcweir // -----------------------------------------------------------------------------
getQueryDefintions() const865cdf0e10cSrcweir Reference<XNameContainer> OApplicationController::getQueryDefintions() const
866cdf0e10cSrcweir {
867cdf0e10cSrcweir 	Reference<XQueryDefinitionsSupplier> xSet(m_xDataSource,UNO_QUERY);
868cdf0e10cSrcweir 	Reference<XNameContainer> xNames;
869cdf0e10cSrcweir 	if ( xSet.is() )
870cdf0e10cSrcweir 	{
871cdf0e10cSrcweir 		xNames.set(xSet->getQueryDefinitions(),UNO_QUERY);
872cdf0e10cSrcweir 	}
873cdf0e10cSrcweir 	return xNames;
874cdf0e10cSrcweir }
875cdf0e10cSrcweir // -----------------------------------------------------------------------------
getSupportedFormats(ElementType _eType,::std::vector<SotFormatStringId> & _rFormatIds) const876cdf0e10cSrcweir void OApplicationController::getSupportedFormats(ElementType _eType,::std::vector<SotFormatStringId>& _rFormatIds) const
877cdf0e10cSrcweir {
878cdf0e10cSrcweir 	switch( _eType )
879cdf0e10cSrcweir 	{
880cdf0e10cSrcweir 		case E_TABLE:
881cdf0e10cSrcweir 			_rFormatIds.push_back(SOT_FORMATSTR_ID_DBACCESS_TABLE);
882cdf0e10cSrcweir 			_rFormatIds.push_back(SOT_FORMAT_RTF);
883cdf0e10cSrcweir 			_rFormatIds.push_back(SOT_FORMATSTR_ID_HTML);
884cdf0e10cSrcweir 			// run through
885cdf0e10cSrcweir 		case E_QUERY:
886cdf0e10cSrcweir 			_rFormatIds.push_back(SOT_FORMATSTR_ID_DBACCESS_QUERY);
887cdf0e10cSrcweir 			break;
888cdf0e10cSrcweir         default:
889cdf0e10cSrcweir             break;
890cdf0e10cSrcweir 	}
891cdf0e10cSrcweir }
892cdf0e10cSrcweir // -----------------------------------------------------------------------------
isTableFormat() const893cdf0e10cSrcweir sal_Bool OApplicationController::isTableFormat()  const
894cdf0e10cSrcweir {
895cdf0e10cSrcweir 	return m_aTableCopyHelper.isTableFormat(getViewClipboard());
896cdf0e10cSrcweir }
897cdf0e10cSrcweir // -----------------------------------------------------------------------------
898cdf0e10cSrcweir IMPL_LINK( OApplicationController, OnAsyncDrop, void*, /*NOTINTERESTEDIN*/ )
899cdf0e10cSrcweir {
900cdf0e10cSrcweir 	m_nAsyncDrop = 0;
901cdf0e10cSrcweir 	::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
902cdf0e10cSrcweir 	::osl::MutexGuard aGuard( getMutex() );
903cdf0e10cSrcweir 
904cdf0e10cSrcweir 
905cdf0e10cSrcweir 	if ( m_aAsyncDrop.nType == E_TABLE )
906cdf0e10cSrcweir 	{
907cdf0e10cSrcweir         SharedConnection xConnection( ensureConnection() );
908cdf0e10cSrcweir         if ( xConnection.is() )
909cdf0e10cSrcweir 		    m_aTableCopyHelper.asyncCopyTagTable( m_aAsyncDrop, getDatabaseName(), xConnection );
910cdf0e10cSrcweir 	}
911cdf0e10cSrcweir 	else
912cdf0e10cSrcweir 	{
913cdf0e10cSrcweir 		if ( paste(m_aAsyncDrop.nType,m_aAsyncDrop.aDroppedData,m_aAsyncDrop.aUrl,m_aAsyncDrop.nAction == DND_ACTION_MOVE)
914cdf0e10cSrcweir 			&& m_aAsyncDrop.nAction == DND_ACTION_MOVE )
915cdf0e10cSrcweir 		{
916cdf0e10cSrcweir 			Reference<XContent> xContent;
917cdf0e10cSrcweir 			m_aAsyncDrop.aDroppedData[daComponent] >>= xContent;
918cdf0e10cSrcweir 			::std::vector< ::rtl::OUString> aList;
919cdf0e10cSrcweir 			sal_Int32 nIndex = 0;
920cdf0e10cSrcweir 			::rtl::OUString sName = xContent->getIdentifier()->getContentIdentifier();
921cdf0e10cSrcweir 			::rtl::OUString sErase = sName.getToken(0,'/',nIndex); // we don't want to have the "private:forms" part
922cdf0e10cSrcweir 			if ( nIndex != -1 )
923cdf0e10cSrcweir 			{
924cdf0e10cSrcweir 				aList.push_back(sName.copy(sErase.getLength() + 1));
925cdf0e10cSrcweir 				deleteObjects( m_aAsyncDrop.nType, aList, false );
926cdf0e10cSrcweir 			}
927cdf0e10cSrcweir 		}
928cdf0e10cSrcweir 	}
929cdf0e10cSrcweir 
930cdf0e10cSrcweir 	m_aAsyncDrop.aDroppedData.clear();
931cdf0e10cSrcweir 
932cdf0e10cSrcweir 	return 0L;
933cdf0e10cSrcweir }
934cdf0e10cSrcweir //........................................................................
935cdf0e10cSrcweir }	// namespace dbaui
936cdf0e10cSrcweir //........................................................................
937cdf0e10cSrcweir 
938cdf0e10cSrcweir 
939