1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: databaseobjectview.cxx,v $
10 * $Revision: 1.8.6.3 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_dbaccess.hxx"
34 #ifndef DBACCESS_DATABASE_OBJECT_VIEW_HXX
35 #include "databaseobjectview.hxx"
37 #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
38 #include "dbustrings.hrc"
40 #ifndef DBACCESS_ASYNCMODALDIALOG_HXX
41 #include "asyncmodaldialog.hxx"
44 /** === begin UNO includes === **/
45 #ifndef _COM_SUN_STAR_LANG_XSINGLESERVICEFACTORY_HPP_
46 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
48 #ifndef _COM_SUN_STAR_FRAME_XDISPATCHPROVIDER_HPP_
49 #include <com/sun/star/frame/XDispatchProvider.hpp>
51 #ifndef _COM_SUN_STAR_FRAME_XFRAME_HPP_
52 #include <com/sun/star/frame/XFrame.hpp>
54 #ifndef _COM_SUN_STAR_FRAME_XFRAMES_HPP_
55 #include <com/sun/star/frame/XFrames.hpp>
57 #ifndef _COM_SUN_STAR_FRAME_FRAMESEARCHFLAG_HPP_
58 #include <com/sun/star/frame/FrameSearchFlag.hpp>
60 #ifndef _COM_SUN_STAR_SDB_COMMANDTYPE_HPP_
61 #include <com/sun/star/sdb/CommandType.hpp>
63 #ifndef _COM_SUN_STAR_SDB_APPLICATION_XTABLEUIPROVIDER_HPP_
64 #include <com/sun/star/sdb/application/XTableUIProvider.hpp>
66 #ifndef _COM_SUN_STAR_BEANS_NAMEDVALUE_HPP_
67 #include <com/sun/star/beans/NamedValue.hpp>
69 #ifndef _COM_SUN_STAR_AWT_RECTANGLE_HPP_
70 #include <com/sun/star/awt/Rectangle.hpp>
72 /** === end UNO includes === **/
74 #ifndef _COMPHELPER_EXTRACT_HXX_
75 #include <comphelper/extract.hxx>
77 #ifndef _COMPHELPER_SEQUENCE_HXX_
78 #include <comphelper/sequence.hxx>
80 #ifndef COMPHELPER_NAMEDVALUECOLLECTION_HXX
81 #include <comphelper/namedvaluecollection.hxx>
84 #ifndef _CONNECTIVITY_DBTOOLS_HXX_
85 #include <connectivity/dbtools.hxx>
88 #ifndef _OSL_DIAGNOSE_H_
89 #include <osl/diagnose.h>
91 #ifndef TOOLS_DIAGNOSE_EX_H
92 #include <tools/diagnose_ex.h>
95 // .........................................................................
98 // .........................................................................
100 using namespace ::com::sun::star::uno
;
101 using namespace ::com::sun::star::sdbc
;
102 using namespace ::com::sun::star::sdb
;
103 using namespace ::com::sun::star::sdb::application
;
104 using namespace ::com::sun::star::ui::dialogs
;
105 using namespace ::com::sun::star::frame
;
106 using namespace ::com::sun::star::lang
;
107 using namespace ::com::sun::star::beans
;
108 using namespace ::com::sun::star::awt
;
110 //======================================================================
111 //= DatabaseObjectView
112 //======================================================================
113 DatabaseObjectView::DatabaseObjectView( const Reference
< XMultiServiceFactory
>& _rxORB
,
114 const Reference
< XDatabaseDocumentUI
>& _rxApplication
,
115 const Reference
< XFrame
>& _rxParentFrame
,
116 const ::rtl::OUString
& _rComponentURL
)
118 ,m_xParentFrame ( _rxParentFrame
)
120 ,m_xApplication ( _rxApplication
)
121 ,m_sComponentURL( _rComponentURL
)
123 OSL_ENSURE( m_xORB
.is(), "DatabaseObjectView::DatabaseObjectView: invalid service factory!" );
124 OSL_ENSURE( m_xApplication
.is(), "DatabaseObjectView::DatabaseObjectView: invalid connection!" );
127 //----------------------------------------------------------------------
128 Reference
< XConnection
> DatabaseObjectView::getConnection() const
130 Reference
< XConnection
> xConnection
;
131 if ( m_xApplication
.is() )
132 xConnection
= m_xApplication
->getActiveConnection();
136 //----------------------------------------------------------------------
137 Reference
< XComponent
> DatabaseObjectView::createNew(const Reference
< XDataSource
>& _xDataSource
)
139 return doCreateView( makeAny( _xDataSource
), ::rtl::OUString(), Sequence
< PropertyValue
>() );
142 //----------------------------------------------------------------------
143 Reference
< XComponent
> DatabaseObjectView::openExisting( const Any
& _rDataSource
, const ::rtl::OUString
& _rName
, const Sequence
< PropertyValue
>& _rArgs
)
145 return doCreateView( _rDataSource
, _rName
, _rArgs
);
148 //----------------------------------------------------------------------
149 Reference
< XComponent
> DatabaseObjectView::doCreateView( const Any
& _rDataSource
, const ::rtl::OUString
& _rObjectName
,
150 const Sequence
< PropertyValue
>& _rCreationArgs
)
152 Sequence
< PropertyValue
> aDispatchArgs
;
153 fillDispatchArgs( aDispatchArgs
, _rDataSource
, _rObjectName
);
155 ::comphelper::NamedValueCollection
aDispArgs( aDispatchArgs
);
156 aDispArgs
.merge( _rCreationArgs
, true );
158 return doDispatch( aDispArgs
.getPropertyValues() );
161 //----------------------------------------------------------------------
162 Reference
< XComponent
> DatabaseObjectView::doDispatch( const Sequence
< PropertyValue
>& _rArgs
)
164 Reference
< XComponent
> xReturn
;
169 // if we have no externally provided frame, create one
170 if ( !m_xFrameLoader
.is() )
172 Reference
< XSingleServiceFactory
> xFact(m_xORB
->createInstance(::rtl::OUString::createFromAscii("com.sun.star.frame.TaskCreator")), UNO_QUERY_THROW
);
173 Sequence
< Any
> lArgs(2);
177 aProp
.Name
= ::rtl::OUString::createFromAscii("ParentFrame");
178 aProp
.Value
<<= m_xParentFrame
;
179 lArgs
[nArg
++] <<= aProp
;
181 aProp
.Name
= ::rtl::OUString::createFromAscii("TopWindow");
182 aProp
.Value
<<= sal_True
;
183 lArgs
[nArg
++] <<= aProp
;
185 m_xFrameLoader
.set(xFact
->createInstanceWithArguments(lArgs
), UNO_QUERY_THROW
);
188 Reference
< XComponentLoader
> xFrameLoader( m_xFrameLoader
, UNO_QUERY_THROW
);
189 xReturn
= xFrameLoader
->loadComponentFromURL(
191 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_self")),
197 xReturn
.set( m_xFrameLoader
, UNO_QUERY
);
199 catch( const Exception
& )
201 DBG_UNHANDLED_EXCEPTION();
207 //----------------------------------------------------------------------
208 void DatabaseObjectView::fillDispatchArgs(
209 Sequence
< PropertyValue
>& _rDispatchArguments
,
210 const Any
& _aDataSource
,
211 const ::rtl::OUString
& /* _rName */
214 sal_Int32 nPos
= _rDispatchArguments
.getLength();
215 _rDispatchArguments
.realloc( nPos
+ 2 );
217 ::rtl::OUString sDataSource
;
218 Reference
<XDataSource
> xDataSource
;
219 if ( _aDataSource
>>= sDataSource
)
221 _rDispatchArguments
[nPos
].Name
= PROPERTY_DATASOURCENAME
;
222 _rDispatchArguments
[nPos
++].Value
<<= sDataSource
;
224 else if ( _aDataSource
>>= xDataSource
)
226 _rDispatchArguments
[nPos
].Name
= PROPERTY_DATASOURCE
;
227 _rDispatchArguments
[nPos
++].Value
<<= xDataSource
;
230 _rDispatchArguments
[nPos
].Name
= PROPERTY_ACTIVE_CONNECTION
;
231 _rDispatchArguments
[nPos
++].Value
<<= getConnection();
234 //======================================================================
236 //======================================================================
237 //----------------------------------------------------------------------
238 QueryDesigner::QueryDesigner( const Reference
< XMultiServiceFactory
>& _rxORB
, const Reference
< XDatabaseDocumentUI
>& _rxApplication
,
239 const Reference
< XFrame
>& _rxParentFrame
,
240 bool _bCreateView
, sal_Bool _bPreferSQLView
)
241 :DatabaseObjectView( _rxORB
, _rxApplication
, _rxParentFrame
, static_cast< ::rtl::OUString
>( _bCreateView
? URL_COMPONENT_VIEWDESIGN
: URL_COMPONENT_QUERYDESIGN
) )
242 ,m_nCommandType( _bCreateView
? CommandType::TABLE
: CommandType::QUERY
)
243 ,m_bPreferSQLView( _bPreferSQLView
)
247 //----------------------------------------------------------------------
248 void QueryDesigner::fillDispatchArgs( Sequence
< PropertyValue
>& _rDispatchArguments
, const Any
& _aDataSource
,
249 const ::rtl::OUString
& _rObjectName
)
251 DatabaseObjectView::fillDispatchArgs( _rDispatchArguments
, _aDataSource
, _rObjectName
);
253 bool bIncludeQueryName
= 0 != _rObjectName
.getLength();
254 bool bEditViewAsSQLCommand
= ( m_nCommandType
== CommandType::TABLE
) && m_bPreferSQLView
;
256 sal_Int32 nPos
= _rDispatchArguments
.getLength();
258 sal_Int32 nNewLen
= _rDispatchArguments
.getLength() + 2;
259 if ( bIncludeQueryName
)
261 if ( bEditViewAsSQLCommand
)
263 _rDispatchArguments
.realloc( nNewLen
);
265 _rDispatchArguments
[nPos
].Name
= PROPERTY_GRAPHICAL_DESIGN
;
266 _rDispatchArguments
[nPos
++].Value
<<= ::cppu::bool2any( !m_bPreferSQLView
);
268 _rDispatchArguments
[nPos
].Name
= PROPERTY_COMMAND_TYPE
;
269 _rDispatchArguments
[nPos
++].Value
<<= m_nCommandType
;
271 if ( bIncludeQueryName
)
273 _rDispatchArguments
[nPos
].Name
= PROPERTY_COMMAND
;
274 _rDispatchArguments
[nPos
++].Value
<<= _rObjectName
;
277 if ( bEditViewAsSQLCommand
)
279 _rDispatchArguments
[nPos
].Name
= PROPERTY_ESCAPE_PROCESSING
;
280 _rDispatchArguments
[nPos
++].Value
<<= sal_Bool( sal_False
);
284 //======================================================================
286 //======================================================================
287 //----------------------------------------------------------------------
288 TableDesigner::TableDesigner( const Reference
< XMultiServiceFactory
>& _rxORB
, const Reference
< XDatabaseDocumentUI
>& _rxApplication
, const Reference
< XFrame
>& _rxParentFrame
)
289 :DatabaseObjectView( _rxORB
, _rxApplication
, _rxParentFrame
, static_cast< ::rtl::OUString
>( URL_COMPONENT_TABLEDESIGN
) )
293 //----------------------------------------------------------------------
294 void TableDesigner::fillDispatchArgs( Sequence
< PropertyValue
>& _rDispatchArguments
, const Any
& _aDataSource
,
295 const ::rtl::OUString
& _rObjectName
)
297 DatabaseObjectView::fillDispatchArgs( _rDispatchArguments
, _aDataSource
, _rObjectName
);
298 sal_Bool bIncludeName
= 0 != _rObjectName
.getLength();
302 sal_Int32 nPos
= _rDispatchArguments
.getLength();
303 _rDispatchArguments
.realloc(_rDispatchArguments
.getLength() + 1);
304 _rDispatchArguments
[nPos
].Name
= PROPERTY_CURRENTTABLE
;
305 _rDispatchArguments
[nPos
++].Value
<<= _rObjectName
;
309 //----------------------------------------------------------------------
310 Reference
< XComponent
> TableDesigner::doCreateView( const Any
& _rDataSource
, const ::rtl::OUString
& _rObjectName
,
311 const Sequence
< PropertyValue
>& _rCreationArgs
)
313 bool bIsNewDesign
= ( _rObjectName
.getLength() == 0 );
315 // let's see whether the connection can provide a dedicated table desginer
316 Reference
< XInterface
> xDesigner
;
318 xDesigner
= impl_getConnectionProvidedDesigner_nothrow( _rObjectName
);
320 if ( !xDesigner
.is() )
321 return DatabaseObjectView::doCreateView( _rDataSource
, _rObjectName
, _rCreationArgs
);
323 // try whether the designer is a dialog
324 Reference
< XExecutableDialog
> xDialog( xDesigner
, UNO_QUERY_THROW
);
327 try { AsyncDialogExecutor::executeModalDialogAsync( xDialog
); }
328 catch( const Exception
& ) { DBG_UNHANDLED_EXCEPTION(); }
332 Reference
< XComponent
> xDesignerComponent( xDesigner
, UNO_QUERY
);
333 OSL_ENSURE( xDesignerComponent
.is(), "TableDesigner::doCreateView: a designer which is no dialog and no component?" );
334 return xDesignerComponent
;
337 //----------------------------------------------------------------------
338 Reference
< XInterface
> TableDesigner::impl_getConnectionProvidedDesigner_nothrow( const ::rtl::OUString
& _rTableName
)
340 Reference
< XInterface
> xDesigner
;
343 Reference
< XTableUIProvider
> xTableUIProv( getConnection(), UNO_QUERY
);
344 if ( xTableUIProv
.is() )
345 xDesigner
= xTableUIProv
->getTableEditor( getApplicationUI(), _rTableName
);
347 catch( const Exception
& )
349 DBG_UNHANDLED_EXCEPTION();
354 //======================================================================
356 //======================================================================
357 //----------------------------------------------------------------------
358 ResultSetBrowser::ResultSetBrowser( const Reference
< XMultiServiceFactory
>& _rxORB
, const Reference
< XDatabaseDocumentUI
>& _rxApplication
, const Reference
< XFrame
>& _rxParentFrame
,
360 :DatabaseObjectView( _rxORB
, _rxApplication
, _rxParentFrame
, static_cast < ::rtl::OUString
>( URL_COMPONENT_DATASOURCEBROWSER
) )
365 //----------------------------------------------------------------------
366 void ResultSetBrowser::fillDispatchArgs(Sequence
< PropertyValue
>& _rDispatchArguments
, const Any
& _aDataSource
,
367 const ::rtl::OUString
& _rQualifiedName
)
369 DatabaseObjectView::fillDispatchArgs( _rDispatchArguments
, _aDataSource
, _rQualifiedName
);
370 OSL_ENSURE( 0 != _rQualifiedName
.getLength(),"A Table name must be set");
371 ::rtl::OUString sCatalog
;
372 ::rtl::OUString sSchema
;
373 ::rtl::OUString sTable
;
375 ::dbtools::qualifiedNameComponents( getConnection()->getMetaData(), _rQualifiedName
, sCatalog
, sSchema
, sTable
, ::dbtools::eInDataManipulation
);
377 sal_Int32 nPos
= _rDispatchArguments
.getLength();
378 _rDispatchArguments
.realloc( _rDispatchArguments
.getLength() + 3 + ( m_bTable
? 3 : 0 ) );
380 _rDispatchArguments
[nPos
].Name
= PROPERTY_COMMAND_TYPE
;
381 _rDispatchArguments
[nPos
++].Value
<<= (m_bTable
? CommandType::TABLE
: CommandType::QUERY
);
383 _rDispatchArguments
[nPos
].Name
= PROPERTY_COMMAND
;
384 _rDispatchArguments
[nPos
++].Value
<<= _rQualifiedName
;
386 _rDispatchArguments
[nPos
].Name
= PROPERTY_ENABLE_BROWSER
;
387 _rDispatchArguments
[nPos
++].Value
<<= sal_False
;
391 _rDispatchArguments
[nPos
].Name
= PROPERTY_UPDATE_CATALOGNAME
;
392 _rDispatchArguments
[nPos
++].Value
<<= sCatalog
;
393 _rDispatchArguments
[nPos
].Name
= PROPERTY_UPDATE_SCHEMANAME
;
394 _rDispatchArguments
[nPos
++].Value
<<= sSchema
;
395 _rDispatchArguments
[nPos
].Name
= PROPERTY_UPDATE_TABLENAME
;
396 _rDispatchArguments
[nPos
++].Value
<<= sTable
;
400 //======================================================================
402 //======================================================================
403 //----------------------------------------------------------------------
404 RelationDesigner::RelationDesigner( const Reference
< XMultiServiceFactory
>& _rxORB
, const Reference
< XDatabaseDocumentUI
>& _rxApplication
, const Reference
< XFrame
>& _rxParentFrame
)
405 :DatabaseObjectView( _rxORB
, _rxApplication
, _rxParentFrame
, static_cast< ::rtl::OUString
>( URL_COMPONENT_RELATIONDESIGN
) )
408 //======================================================================
410 //======================================================================
411 //----------------------------------------------------------------------
412 ReportDesigner::ReportDesigner( const Reference
< XMultiServiceFactory
>& _rxORB
, const Reference
< XDatabaseDocumentUI
>& _rxApplication
, const Reference
< XFrame
>& _rxParentFrame
)
413 :DatabaseObjectView( _rxORB
, _rxApplication
, _rxParentFrame
,static_cast< ::rtl::OUString
>( URL_COMPONENT_REPORTDESIGN
) )
418 // .........................................................................
420 // .........................................................................