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 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_dbaccess.hxx"
26 
27 #ifndef DBACCESS_SOURCE_UI_UNO_COMPOSERDIALOGS_HXX
28 #include "composerdialogs.hxx"
29 #endif
30 
31 /** === begin UNO includes === **/
32 #ifndef _DBU_REGHELPER_HXX_
33 #include "dbu_reghelper.hxx"
34 #endif
35 #ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
36 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
37 #endif
38 /** === end UNO includes === **/
39 #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
40 #include "dbustrings.hrc"
41 #endif
42 #ifndef DBAUI_QUERYFILTER_HXX
43 #include "queryfilter.hxx"
44 #endif
45 #ifndef DBAUI_QUERYORDER_HXX
46 #include "queryorder.hxx"
47 #endif
48 #ifndef _CONNECTIVITY_DBTOOLS_HXX_
49 #include <connectivity/dbtools.hxx>
50 #endif
51 #ifndef _TOOLS_DEBUG_HXX
52 #include <tools/debug.hxx>
53 #endif
54 #ifndef TOOLS_DIAGNOSE_EX_H
55 #include <tools/diagnose_ex.h>
56 #endif
57 
58 extern "C" void SAL_CALL createRegistryInfo_ComposerDialogs()
59 {
60 	static ::dbaui::OMultiInstanceAutoRegistration< ::dbaui::RowsetOrderDialog > aOrderDialogRegistration;
61 	static ::dbaui::OMultiInstanceAutoRegistration< ::dbaui::RowsetFilterDialog > aFilterDialogRegistration;
62 }
63 
64 //.........................................................................
65 namespace dbaui
66 {
67 //.........................................................................
68 
69 #define PROPERTY_ID_QUERYCOMPOSER		100
70 #define PROPERTY_ID_ROWSET				101
71 
72 	IMPLEMENT_CONSTASCII_USTRING( PROPERTY_QUERYCOMPOSER,	"QueryComposer" );
73 	IMPLEMENT_CONSTASCII_USTRING( PROPERTY_ROWSET,			"RowSet" );
74 
75 	using namespace ::com::sun::star::uno;
76 	using namespace ::com::sun::star::lang;
77 	using namespace ::com::sun::star::beans;
78 	using namespace ::com::sun::star::container;
79 	using namespace ::com::sun::star::sdbcx;
80 	using namespace ::com::sun::star::sdbc;
81 	using namespace ::com::sun::star::sdb;
82 
83 	//=====================================================================
84 	//= ComposerDialog
85 	//=====================================================================
86     DBG_NAME(ComposerDialog)
87     //---------------------------------------------------------------------
88 	ComposerDialog::ComposerDialog(const Reference< XMultiServiceFactory >& _rxORB)
89 		:ComposerDialog_BASE( _rxORB )
90 	{
91         DBG_CTOR(ComposerDialog,NULL);
92 
93 		registerProperty( PROPERTY_QUERYCOMPOSER, PROPERTY_ID_QUERYCOMPOSER, PropertyAttribute::TRANSIENT,
94 			&m_xComposer, ::getCppuType( &m_xComposer ) );
95 		registerProperty( PROPERTY_ROWSET, PROPERTY_ID_ROWSET, PropertyAttribute::TRANSIENT,
96 			&m_xRowSet, ::getCppuType( &m_xRowSet ) );
97 	}
98 
99 	//---------------------------------------------------------------------
100 	ComposerDialog::~ComposerDialog()
101 	{
102 
103         DBG_DTOR(ComposerDialog,NULL);
104     }
105 
106 	//---------------------------------------------------------------------
107 	IMPLEMENT_IMPLEMENTATION_ID( ComposerDialog )
108 
109 	//---------------------------------------------------------------------
110 	IMPLEMENT_PROPERTYCONTAINER_DEFAULTS( ComposerDialog )
111 
112 	//---------------------------------------------------------------------
113 	Dialog*	ComposerDialog::createDialog(Window* _pParent)
114 	{
115 		// obtain all the objects needed for the dialog
116 		Reference< XConnection > xConnection;
117 		Reference< XNameAccess > xColumns;
118 		try
119 		{
120 			// the connection the row set is working with
121             if ( !::dbtools::isEmbeddedInDatabase( m_xRowSet, xConnection ) )
122             {
123 			    Reference< XPropertySet > xRowsetProps( m_xRowSet, UNO_QUERY );
124 			    if ( xRowsetProps.is() )
125 				    xRowsetProps->getPropertyValue( PROPERTY_ACTIVE_CONNECTION ) >>= xConnection;
126             }
127 
128             // fallback: if there is a connection and thus a row set, but no composer, create one
129             if ( xConnection.is() && !m_xComposer.is() )
130                 m_xComposer = ::dbtools::getCurrentSettingsComposer( Reference< XPropertySet >( m_xRowSet, UNO_QUERY ), m_aContext.getLegacyServiceFactory() );
131 
132             // the columns of the row set
133             Reference< XColumnsSupplier > xSuppColumns( m_xRowSet, UNO_QUERY );
134 			if ( xSuppColumns.is() )
135 				xColumns = xSuppColumns->getColumns();
136 
137             if ( !xColumns.is() || !xColumns->hasElements() )
138             {   // perhaps the composer can supply us with columns? This is necessary for cases
139                 // where the dialog is invoked for a rowset which is not yet loaded
140                 // #i22878# - 2003-12-16 - fs@openoffice.org
141 			    xSuppColumns = xSuppColumns.query( m_xComposer );
142 			    if ( xSuppColumns.is() )
143 				    xColumns = xSuppColumns->getColumns();
144             }
145 
146             DBG_ASSERT( xColumns.is() && xColumns->hasElements(), "ComposerDialog::createDialog: not much fun without any columns!" );
147 		}
148         catch( const Exception& )
149         {
150             DBG_UNHANDLED_EXCEPTION();
151         }
152 
153 		if ( !xConnection.is() || !xColumns.is() || !m_xComposer.is() )
154 			// can't create the dialog if I have improper settings
155 			return NULL;
156 
157         return createComposerDialog( _pParent, xConnection, xColumns );
158 	}
159 
160 	//=====================================================================
161 	//= RowsetFilterDialog
162 	//=====================================================================
163 	//---------------------------------------------------------------------
164     RowsetFilterDialog::RowsetFilterDialog( const Reference< XMultiServiceFactory >& _rxORB )
165         :ComposerDialog( _rxORB )
166     {
167     }
168 
169 	//---------------------------------------------------------------------
170 	IMPLEMENT_SERVICE_INFO1_STATIC( RowsetFilterDialog, "com.sun.star.uno.comp.sdb.RowsetFilterDialog", "com.sun.star.sdb.FilterDialog" )
171 
172     //---------------------------------------------------------------------
173     Dialog* RowsetFilterDialog::createComposerDialog( Window* _pParent, const Reference< XConnection >& _rxConnection, const Reference< XNameAccess >& _rxColumns )
174     {
175 		return new DlgFilterCrit( _pParent, m_aContext.getLegacyServiceFactory(), _rxConnection, m_xComposer, _rxColumns );
176     }
177 
178 	//---------------------------------------------------------------------
179 	void RowsetFilterDialog::executedDialog( sal_Int16 _nExecutionResult )
180     {
181 		ComposerDialog::executedDialog( _nExecutionResult );
182 
183 		if ( _nExecutionResult && m_pDialog )
184 			static_cast< DlgFilterCrit* >( m_pDialog )->BuildWherePart();
185     }
186 
187 	//=====================================================================
188 	//= RowsetOrderDialog
189 	//=====================================================================
190 	//---------------------------------------------------------------------
191     RowsetOrderDialog::RowsetOrderDialog( const Reference< XMultiServiceFactory >& _rxORB )
192         :ComposerDialog( _rxORB )
193     {
194     }
195 
196 	//---------------------------------------------------------------------
197 	IMPLEMENT_SERVICE_INFO1_STATIC( RowsetOrderDialog, "com.sun.star.uno.comp.sdb.RowsetOrderDialog", "com.sun.star.sdb.OrderDialog" )
198 
199     //---------------------------------------------------------------------
200     Dialog* RowsetOrderDialog::createComposerDialog( Window* _pParent, const Reference< XConnection >& _rxConnection, const Reference< XNameAccess >& _rxColumns )
201     {
202 		return new DlgOrderCrit( _pParent, _rxConnection, m_xComposer, _rxColumns );
203     }
204 
205 	//---------------------------------------------------------------------
206 	void RowsetOrderDialog::executedDialog( sal_Int16 _nExecutionResult )
207     {
208 		ComposerDialog::executedDialog( _nExecutionResult );
209 
210         if ( !m_pDialog )
211             return;
212 
213         if ( _nExecutionResult )
214 			static_cast< DlgOrderCrit* >( m_pDialog )->BuildOrderPart();
215 		else if ( m_xComposer.is() )
216     		m_xComposer->setOrder( static_cast< DlgOrderCrit* >( m_pDialog )->GetOrignalOrder() );
217     }
218 
219 //.........................................................................
220 }	// namespace dbaui
221 //.........................................................................
222 
223 
224