/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef DBAUI_DBWIZ_HXX
#define DBAUI_DBWIZ_HXX

#ifndef _SFXTABDLG_HXX
#include <sfx2/tabdlg.hxx>
#endif
#ifndef _DBAUI_DSNTYPES_HXX_
#include "dsntypes.hxx"
#endif
#ifndef DBAUI_ITEMSETHELPER_HXX
#include "IItemSetHelper.hxx"
#endif
#ifndef _COMPHELPER_UNO3_HXX_
#include <comphelper/uno3.hxx>
#endif
#ifndef _SVTOOLS_WIZARDMACHINE_HXX_
#include <svtools/wizardmachine.hxx>
#endif
#ifndef _DBAUI_MODULE_DBU_HXX_
#include "moduledbu.hxx"
#endif
#include <memory>

FORWARD_DECLARE_INTERFACE(beans,XPropertySet)
FORWARD_DECLARE_INTERFACE(sdbc,XConnection)
FORWARD_DECLARE_INTERFACE(lang,XMultiServiceFactory)

namespace dbaccess
{
    class ODsnTypeCollection;
}
//.........................................................................
namespace dbaui
{
//.........................................................................

//=========================================================================
//= ODbTypeWizDialog
//=========================================================================
class OGeneralPage;
class ODbDataSourceAdministrationHelper;
/** tab dialog for administrating the office wide registered data sources
*/
class ODbTypeWizDialog : public svt::OWizardMachine , public IItemSetHelper, public IDatabaseSettingsDialog,public dbaui::OModuleClient
{
private:
	OModuleClient m_aModuleClient;
	::std::auto_ptr<ODbDataSourceAdministrationHelper>	m_pImpl;
	SfxItemSet*				m_pOutSet;
    ::dbaccess::ODsnTypeCollection*	    
                            m_pCollection;	/// the DSN type collection instance
	::rtl::OUString         m_eType;

	sal_Bool				m_bResetting : 1;	/// sal_True while we're resetting the pages
	sal_Bool				m_bApplied : 1;		/// sal_True if any changes have been applied while the dialog was executing
	sal_Bool				m_bUIEnabled : 1;	/// <TRUE/> if the UI is enabled, false otherwise. Cannot be switched back to <TRUE/>, once it is <FALSE/>

public:
	/** ctor. The itemset given should have been created by <method>createItemSet</method> and should be destroyed
		after the dialog has been destroyed
	*/
	ODbTypeWizDialog(Window* pParent
		,SfxItemSet* _pItems
		,const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB
		,const ::com::sun::star::uno::Any& _aDataSourceName
		);
	virtual ~ODbTypeWizDialog();

	virtual const SfxItemSet* getOutputSet() const;
	virtual SfxItemSet* getWriteOutputSet();

	// forwards to ODbDataSourceAdministrationHelper
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > getORB() const;
	virtual ::std::pair< ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >,sal_Bool> createConnection();
	virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDriver >	getDriver();
	virtual ::rtl::OUString getDatasourceType(const SfxItemSet& _rSet) const;
	virtual void clearPassword();
	virtual sal_Bool saveDatasource();
	virtual void setTitle(const ::rtl::OUString& _sTitle);
    virtual void enableConfirmSettings( bool _bEnable );

protected:
	/// to override to create new pages
	virtual TabPage*	createPage(WizardState _nState);
	virtual WizardState	determineNextState(WizardState _nCurrentState) const;
	virtual	sal_Bool	leaveState(WizardState _nState);
	virtual ::svt::IWizardPageController*
                        getPageController( TabPage* _pCurrentPage ) const;
	virtual sal_Bool    onFinish();

protected:
	inline sal_Bool	isUIEnabled() const { return m_bUIEnabled; }
	inline void		disabledUI() { m_bUIEnabled = sal_False; }

	/// select a datasource with a given name, adjust the item set accordingly, and everything like that ..
	void implSelectDatasource(const ::rtl::OUString& _rRegisteredName);
	void resetPages(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxDatasource);

	enum ApplyResult
	{
		AR_LEAVE_MODIFIED,		// somthing was modified and has successfully been committed
		AR_LEAVE_UNCHANGED,		// no changes were made
		AR_KEEP					// don't leave the page (e.g. because an error occured)
	};
	/** apply all changes made
	*/
	ApplyResult	implApplyChanges();

private:
	DECL_LINK(OnTypeSelected, OGeneralPage*);
};

//.........................................................................
}	// namespace dbaui
//.........................................................................

#endif // DBAUI_DBWIZ_HXX

