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_extensions.hxx"
26 #include "commonpagesdbp.hxx"
27 #ifndef _EXTENSIONS_DBP_DBPRESID_HRC_
28 #include "dbpresid.hrc"
29 #endif
30 #include "componentmodule.hxx"
31 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
32 #include <com/sun/star/sdb/XCompletedConnection.hpp>
33 #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
34 #include <com/sun/star/sdb/XQueriesSupplier.hpp>
35 #include <com/sun/star/sdbc/XConnection.hpp>
36 #include <com/sun/star/sdb/SQLContext.hpp>
37 #include <com/sun/star/sdbc/SQLWarning.hpp>
38 #include <com/sun/star/sdb/CommandType.hpp>
39 #include <tools/debug.hxx>
40 #include <svtools/localresaccess.hxx>
41 #include <comphelper/interaction.hxx>
42 #include <connectivity/dbtools.hxx>
43 #include <vcl/stdtext.hxx>
44 #include <vcl/waitobj.hxx>
45 #include <sfx2/docfilt.hxx>
46 #include <unotools/pathoptions.hxx>
47 #include <sfx2/filedlghelper.hxx>
48 #ifndef SVTOOLS_FILENOTATION_HXX_
49 #include <svl/filenotation.hxx>
50 #endif
51 //.........................................................................
52 namespace dbp
53 {
54 //.........................................................................
55 
56 	using namespace ::com::sun::star::uno;
57 	using namespace ::com::sun::star::lang;
58 	using namespace ::com::sun::star::container;
59 	using namespace ::com::sun::star::sdb;
60 	using namespace ::com::sun::star::sdbc;
61 	using namespace ::com::sun::star::sdbcx;
62 	using namespace ::com::sun::star::task;
63 	using namespace ::comphelper;
64 
65 	//=====================================================================
66 	//= OTableSelectionPage
67 	//=====================================================================
68 	//---------------------------------------------------------------------
OTableSelectionPage(OControlWizard * _pParent)69 	OTableSelectionPage::OTableSelectionPage(OControlWizard* _pParent)
70 		:OControlWizardPage(_pParent, ModuleRes(RID_PAGE_TABLESELECTION))
71 		,m_aData			(this, ModuleRes(FL_DATA))
72 		,m_aExplanation		(this, ModuleRes(FT_EXPLANATION))
73 		,m_aDatasourceLabel	(this, ModuleRes(FT_DATASOURCE))
74 		,m_aDatasource		(this, ModuleRes(LB_DATASOURCE))
75 		,m_aSearchDatabase	(this, ModuleRes(PB_FORMDATASOURCE))
76 		,m_aTableLabel		(this, ModuleRes(FT_TABLE))
77 		,m_aTable			(this, ModuleRes(LB_TABLE))
78 	{
79 		FreeResource();
80 
81 		implCollectDatasource();
82 
83 		m_aDatasource.SetSelectHdl(LINK(this, OTableSelectionPage, OnListboxSelection));
84 		m_aTable.SetSelectHdl(LINK(this, OTableSelectionPage, OnListboxSelection));
85 		m_aTable.SetDoubleClickHdl(LINK(this, OTableSelectionPage, OnListboxDoubleClicked));
86 		m_aSearchDatabase.SetClickHdl(LINK(this, OTableSelectionPage, OnSearchClicked));
87 
88 		m_aDatasource.SetDropDownLineCount(10);
89 	}
90 
91 	//---------------------------------------------------------------------
ActivatePage()92 	void OTableSelectionPage::ActivatePage()
93 	{
94 		OControlWizardPage::ActivatePage();
95 		m_aDatasource.GrabFocus();
96 	}
97 
98 	//---------------------------------------------------------------------
canAdvance() const99 	bool OTableSelectionPage::canAdvance() const
100 	{
101 		if (!OControlWizardPage::canAdvance())
102 			return false;
103 
104 		if (0 == m_aDatasource.GetSelectEntryCount())
105 			return false;
106 
107 		if (0 == m_aTable.GetSelectEntryCount())
108 			return false;
109 
110 		return sal_True;
111 	}
112 
113 	//---------------------------------------------------------------------
initializePage()114 	void OTableSelectionPage::initializePage()
115 	{
116 		OControlWizardPage::initializePage();
117 
118 		const OControlWizardContext& rContext = getContext();
119 		try
120 		{
121 			::rtl::OUString sDataSourceName;
122 			rContext.xForm->getPropertyValue(::rtl::OUString::createFromAscii("DataSourceName")) >>= sDataSourceName;
123 
124             Reference< XConnection > xConnection;
125             bool bEmbedded = ::dbtools::isEmbeddedInDatabase( rContext.xForm, xConnection );
126             if ( bEmbedded )
127 			{
128 				m_aDatasource.Hide();
129 				m_aDatasourceLabel.Hide();
130 				m_aSearchDatabase.Hide();
131 				m_aTableLabel.SetPosPixel(m_aDatasourceLabel.GetPosPixel());
132 				m_aTable.SetPosPixel(m_aDatasource.GetPosPixel());
133 				m_aDatasource.InsertEntry(sDataSourceName);
134 			}
135 			m_aDatasource.SelectEntry(sDataSourceName);
136 
137 			implFillTables(xConnection);
138 
139 			::rtl::OUString sCommand;
140 			OSL_VERIFY( rContext.xForm->getPropertyValue( ::rtl::OUString::createFromAscii("Command") ) >>= sCommand );
141             sal_Int32 nCommandType = CommandType::TABLE;
142 			OSL_VERIFY( rContext.xForm->getPropertyValue( ::rtl::OUString::createFromAscii("CommandType") ) >>= nCommandType );
143 
144             // search the entry of the given type with the given name
145             XubString sLookup( sCommand );
146             for ( sal_uInt16 nLookup = 0; nLookup < m_aTable.GetEntryCount(); ++nLookup )
147             {
148                 if ( m_aTable.GetEntry( nLookup ) == sLookup )
149                     if ( reinterpret_cast< sal_IntPtr >( m_aTable.GetEntryData( nLookup ) ) == nCommandType )
150                     {
151                         m_aTable.SelectEntryPos( nLookup );
152                         break;
153                     }
154             }
155 		}
156 		catch(Exception&)
157 		{
158 			DBG_ERROR("OTableSelectionPage::initializePage: caught an exception!");
159 		}
160 	}
161 
162 	//---------------------------------------------------------------------
commitPage(::svt::WizardTypes::CommitPageReason _eReason)163 	sal_Bool OTableSelectionPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
164 	{
165 		if (!OControlWizardPage::commitPage(_eReason))
166 			return sal_False;
167 
168 		const OControlWizardContext& rContext = getContext();
169 		try
170 		{
171 			Reference< XConnection > xOldConn;
172 			if ( !rContext.bEmbedded )
173 			{
174 				xOldConn = getFormConnection();
175 
176 				::rtl::OUString sDataSource = m_aDatasource.GetSelectEntry();
177 				rContext.xForm->setPropertyValue( ::rtl::OUString::createFromAscii("DataSourceName"), makeAny( sDataSource ) );
178 			}
179             ::rtl::OUString sCommand = m_aTable.GetSelectEntry();
180             sal_Int32 nCommandType = reinterpret_cast< sal_IntPtr >( m_aTable.GetEntryData( m_aTable.GetSelectEntryPos() ) );
181 
182 			rContext.xForm->setPropertyValue( ::rtl::OUString::createFromAscii("Command"), makeAny( sCommand ) );
183 			rContext.xForm->setPropertyValue( ::rtl::OUString::createFromAscii("CommandType"), makeAny( nCommandType ) );
184 
185 			if ( !rContext.bEmbedded )
186 				setFormConnection( xOldConn, sal_False );
187 
188 			if (!updateContext())
189 				return sal_False;
190 		}
191 		catch(Exception&)
192 		{
193 			DBG_ERROR("OTableSelectionPage::commitPage: caught an exception!");
194 		}
195 
196 		return sal_True;
197 	}
198 
199 	//---------------------------------------------------------------------
200 	IMPL_LINK( OTableSelectionPage, OnSearchClicked, PushButton*, /*_pButton*/ )
201 	{
202 		::sfx2::FileDialogHelper aFileDlg(WB_3DLOOK);
203 		aFileDlg.SetDisplayDirectory( SvtPathOptions().GetWorkPath() );
204 
205 		static const String s_sDatabaseType = String::CreateFromAscii("StarOffice XML (Base)");
206 		const SfxFilter* pFilter = SfxFilter::GetFilterByName( s_sDatabaseType);
207 		OSL_ENSURE(pFilter,"Filter: StarOffice XML (Base) could not be found!");
208 		if ( pFilter )
209 		{
210 			aFileDlg.AddFilter(pFilter->GetUIName(),pFilter->GetDefaultExtension());
211 		}
212 
213 		if (0 == aFileDlg.Execute())
214 		{
215 			String sDataSourceName = aFileDlg.GetPath();
216 			::svt::OFileNotation aFileNotation(sDataSourceName);
217 			sDataSourceName = aFileNotation.get(::svt::OFileNotation::N_SYSTEM);
218 			m_aDatasource.InsertEntry(sDataSourceName);
219 			m_aDatasource.SelectEntry(sDataSourceName);
220 			LINK(this, OTableSelectionPage, OnListboxSelection).Call(&m_aDatasource);
221 		}
222 		return 0L;
223 	}
224 	//---------------------------------------------------------------------
IMPL_LINK(OTableSelectionPage,OnListboxDoubleClicked,ListBox *,_pBox)225 	IMPL_LINK( OTableSelectionPage, OnListboxDoubleClicked, ListBox*, _pBox )
226 	{
227 		if (_pBox->GetSelectEntryCount())
228 			getDialog()->travelNext();
229 		return 0L;
230 	}
231 
232 	//---------------------------------------------------------------------
IMPL_LINK(OTableSelectionPage,OnListboxSelection,ListBox *,_pBox)233 	IMPL_LINK( OTableSelectionPage, OnListboxSelection, ListBox*, _pBox )
234 	{
235 		if (&m_aDatasource == _pBox)
236 		{	// new data source selected
237 			implFillTables();
238 		}
239 		else
240 		{
241 		}
242 
243 		updateDialogTravelUI();
244 
245 		return 0L;
246 	}
247 
248 	//---------------------------------------------------------------------
249     namespace
250     {
lcl_fillEntries(ListBox & _rListBox,const Sequence<::rtl::OUString> & _rNames,const Image & _rImage,sal_Int32 _nCommandType)251         void    lcl_fillEntries( ListBox& _rListBox, const Sequence< ::rtl::OUString >& _rNames, const Image& _rImage, sal_Int32 _nCommandType )
252         {
253             const ::rtl::OUString* pNames = _rNames.getConstArray();
254             const ::rtl::OUString* pNamesEnd = _rNames.getConstArray() + _rNames.getLength();
255             sal_uInt16 nPos = 0;
256             while ( pNames != pNamesEnd )
257             {
258                 nPos = _rListBox.InsertEntry( *pNames++, _rImage );
259                 _rListBox.SetEntryData( nPos, reinterpret_cast< void* >( _nCommandType ) );
260             }
261         }
262     }
263 
264 	//---------------------------------------------------------------------
implFillTables(const Reference<XConnection> & _rxConn)265 	void OTableSelectionPage::implFillTables(const Reference< XConnection >& _rxConn)
266 	{
267 		m_aTable.Clear();
268 
269 		WaitObject aWaitCursor(this);
270 
271 		// will be the table tables of the selected data source
272 		Sequence< ::rtl::OUString > aTableNames;
273 		Sequence< ::rtl::OUString > aQueryNames;
274 
275 		// connect to the data source
276 		Any aSQLException;
277 		Reference< XConnection > xConn = _rxConn;
278 		if ( !xConn.is() )
279 		{
280 			if (!m_xDSContext.is())
281 				return;
282 			// connect to the data source
283 			try
284 			{
285 				::rtl::OUString sCurrentDatasource = m_aDatasource.GetSelectEntry();
286 				if (sCurrentDatasource.getLength())
287 				{
288 					// obtain the DS object
289 					Reference< XCompletedConnection > xDatasource;
290 					// check if I know this one otherwise transform it into a file URL
291 					if ( !m_xDSContext->hasByName(sCurrentDatasource) )
292 					{
293 						::svt::OFileNotation aFileNotation(sCurrentDatasource);
294 						sCurrentDatasource = aFileNotation.get(::svt::OFileNotation::N_URL);
295 					}
296 
297 					if (m_xDSContext->getByName(sCurrentDatasource) >>= xDatasource)
298 					{	// connect
299                         // get the default SDB interaction handler
300 		                Reference< XInteractionHandler > xHandler = getDialog()->getInteractionHandler(this);
301 		                if (!xHandler.is() )
302 			                return;
303 						xConn = xDatasource->connectWithCompletion(xHandler);
304 						setFormConnection( xConn );
305 					}
306 					else
307 					{
308 						DBG_ERROR("OTableSelectionPage::implFillTables: invalid data source object returned by the context");
309 					}
310 				}
311 			}
312 			catch(SQLContext& e) { aSQLException <<= e; }
313 			catch(SQLWarning& e) { aSQLException <<= e; }
314 			catch(SQLException& e) { aSQLException <<= e; }
315 			catch (Exception&)
316 			{
317 				DBG_ERROR("OTableSelectionPage::implFillTables: could not fill the table list!");
318 			}
319 		}
320 
321 		// will be the table tables of the selected data source
322 		if ( xConn.is() )
323 		{
324 			try
325 			{
326 				// get the tables
327 				Reference< XTablesSupplier > xSupplTables(xConn, UNO_QUERY);
328 				if ( xSupplTables.is() )
329 				{
330 					Reference< XNameAccess > xTables(xSupplTables->getTables(), UNO_QUERY);
331 					if (xTables.is())
332 						aTableNames = xTables->getElementNames();
333 				}
334 
335                 // and the queries
336                 Reference< XQueriesSupplier > xSuppQueries( xConn, UNO_QUERY );
337                 if ( xSuppQueries.is() )
338                 {
339 					Reference< XNameAccess > xQueries( xSuppQueries->getQueries(), UNO_QUERY );
340 					if ( xQueries.is() )
341 						aQueryNames = xQueries->getElementNames();
342                 }
343 			}
344 			catch(SQLContext& e) { aSQLException <<= e; }
345 			catch(SQLWarning& e) { aSQLException <<= e; }
346 			catch(SQLException& e) { aSQLException <<= e; }
347 			catch (Exception&)
348 			{
349 				DBG_ERROR("OTableSelectionPage::implFillTables: could not fill the table list!");
350 			}
351 		}
352 
353 
354 		if ( aSQLException.hasValue() )
355 		{	// an SQLException (or derivee) was thrown ...
356 			Reference< XInteractionRequest > xRequest = new OInteractionRequest(aSQLException);
357 			try
358 			{
359                 // get the default SDB interaction handler
360 		        Reference< XInteractionHandler > xHandler = getDialog()->getInteractionHandler(this);
361 		        if ( xHandler.is() )
362 				    xHandler->handle(xRequest);
363 			}
364 			catch(Exception&) { }
365 			return;
366 		}
367 
368         Image aTableImage, aQueryImage;
369         {
370             ::svt::OLocalResourceAccess aLocalResAccess( ModuleRes( RID_PAGE_TABLESELECTION ), RSC_TABPAGE );
371 
372             bool bIsHiContrast = m_aTable.GetSettings().GetStyleSettings().GetHighContrastMode();
373             aTableImage = Image( ModuleRes( bIsHiContrast ? IMG_TABLE_HC : IMG_TABLE ) );
374             aQueryImage = Image( ModuleRes( bIsHiContrast ? IMG_QUERY_HC : IMG_QUERY ) );
375         }
376         lcl_fillEntries( m_aTable, aTableNames, aTableImage, CommandType::TABLE );
377         lcl_fillEntries( m_aTable, aQueryNames, aQueryImage, CommandType::QUERY );
378 	}
379 
380 	//---------------------------------------------------------------------
implCollectDatasource()381 	void OTableSelectionPage::implCollectDatasource()
382 	{
383 		try
384 		{
385 			m_xDSContext = getContext().xDatasourceContext;
386 			if (m_xDSContext.is())
387 				fillListBox(m_aDatasource, m_xDSContext->getElementNames());
388 		}
389 		catch (Exception&)
390 		{
391 			DBG_ERROR("OTableSelectionPage::implCollectDatasource: could not collect the data source names!");
392 		}
393 	}
394 
395 	//=====================================================================
396 	//= OMaybeListSelectionPage
397 	//=====================================================================
398 	//---------------------------------------------------------------------
OMaybeListSelectionPage(OControlWizard * _pParent,const ResId & _rId)399 	OMaybeListSelectionPage::OMaybeListSelectionPage( OControlWizard* _pParent, const ResId& _rId )
400 		:OControlWizardPage(_pParent, _rId)
401 		,m_pYes(NULL)
402 		,m_pNo(NULL)
403 		,m_pList(NULL)
404 	{
405 	}
406 
407 	//---------------------------------------------------------------------
announceControls(RadioButton & _rYesButton,RadioButton & _rNoButton,ListBox & _rSelection)408 	void OMaybeListSelectionPage::announceControls(RadioButton& _rYesButton, RadioButton& _rNoButton, ListBox& _rSelection)
409 	{
410 		m_pYes = &_rYesButton;
411 		m_pNo = &_rNoButton;
412 		m_pList = &_rSelection;
413 
414 		m_pYes->SetClickHdl(LINK(this, OMaybeListSelectionPage, OnRadioSelected));
415 		m_pNo->SetClickHdl(LINK(this, OMaybeListSelectionPage, OnRadioSelected));
416 		implEnableWindows();
417 	}
418 
419 	//---------------------------------------------------------------------
420 	IMPL_LINK( OMaybeListSelectionPage, OnRadioSelected, RadioButton*, /*NOTINTERESTEDIN*/ )
421 	{
422 		implEnableWindows();
423 		return 0L;
424 	}
425 
426 	//---------------------------------------------------------------------
implInitialize(const String & _rSelection)427 	void OMaybeListSelectionPage::implInitialize(const String& _rSelection)
428 	{
429 		DBG_ASSERT(m_pYes, "OMaybeListSelectionPage::implInitialize: no controls announced!");
430 		sal_Bool bIsSelection = (0 != _rSelection.Len());
431 		m_pYes->Check(bIsSelection);
432 		m_pNo->Check(!bIsSelection);
433 		m_pList->Enable(bIsSelection);
434 
435 		m_pList->SelectEntry(bIsSelection ? _rSelection : String());
436 	}
437 
438 	//---------------------------------------------------------------------
implCommit(String & _rSelection)439 	void OMaybeListSelectionPage::implCommit(String& _rSelection)
440 	{
441 		_rSelection = m_pYes->IsChecked() ? m_pList->GetSelectEntry() : String();
442 	}
443 
444 	//---------------------------------------------------------------------
implEnableWindows()445 	void OMaybeListSelectionPage::implEnableWindows()
446 	{
447 		m_pList->Enable(m_pYes->IsChecked());
448 	}
449 
450 	//---------------------------------------------------------------------
ActivatePage()451 	void OMaybeListSelectionPage::ActivatePage()
452 	{
453 		OControlWizardPage::ActivatePage();
454 
455 		DBG_ASSERT(m_pYes, "OMaybeListSelectionPage::ActivatePage: no controls announced!");
456 		if (m_pYes->IsChecked())
457 			m_pList->GrabFocus();
458 		else
459 			m_pNo->GrabFocus();
460 	}
461 
462 	//=====================================================================
463 	//= ODBFieldPage
464 	//=====================================================================
465 	//---------------------------------------------------------------------
ODBFieldPage(OControlWizard * _pParent)466 	ODBFieldPage::ODBFieldPage( OControlWizard* _pParent )
467 		:OMaybeListSelectionPage(_pParent, ModuleRes(RID_PAGE_OPTION_DBFIELD))
468 		,m_aFrame			(this, ModuleRes(FL_DATABASEFIELD_EXPL))
469 		,m_aDescription		(this, ModuleRes(FT_DATABASEFIELD_EXPL))
470 		,m_aQuestion		(this, ModuleRes(FT_DATABASEFIELD_QUEST))
471 		,m_aStoreYes		(this, ModuleRes(RB_STOREINFIELD_YES))
472 		,m_aStoreNo			(this, ModuleRes(LB_STOREINFIELD))
473 		,m_aStoreWhere		(this, ModuleRes(RB_STOREINFIELD_NO))
474 	{
475 		FreeResource();
476 		announceControls(m_aStoreYes, m_aStoreNo, m_aStoreWhere);
477 		m_aStoreWhere.SetDropDownLineCount(10);
478 	}
479 
480 	//---------------------------------------------------------------------
initializePage()481 	void ODBFieldPage::initializePage()
482 	{
483 		OMaybeListSelectionPage::initializePage();
484 
485 		// fill the fields page
486 		fillListBox(m_aStoreWhere, getContext().aFieldNames);
487 
488 		implInitialize(getDBFieldSetting());
489 	}
490 
491 	//---------------------------------------------------------------------
commitPage(::svt::WizardTypes::CommitPageReason _eReason)492 	sal_Bool ODBFieldPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
493 	{
494 		if (!OMaybeListSelectionPage::commitPage(_eReason))
495 			return sal_False;
496 
497 		implCommit(getDBFieldSetting());
498 
499 		return sal_True;
500 	}
501 
502 //.........................................................................
503 }	// namespace dbp
504 //.........................................................................
505 
506