/**************************************************************
 * 
 * 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_DBWIZ2_HXX
#define DBAUI_DBWIZ2_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 _URLOBJ_HXX 
#include <tools/urlobj.hxx>
#endif
#include <memory>
#ifndef SVTOOLS_INC_ROADMAPWIZARD_HXX
#include <svtools/roadmapwizard.hxx>
#endif
#ifndef _CONNECTIVITY_DBTOOLS_HXX_
#include <connectivity/dbtools.hxx>
#endif
#ifndef _DBAUI_MODULE_DBU_HXX_
#include "moduledbu.hxx"
#endif

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

//.........................................................................
namespace dbaui
{
//.........................................................................

class OGenericAdministrationPage;

//=========================================================================
//= ODbTypeWizDialogSetup
//=========================================================================
class OGeneralPage;
class ODbDataSourceAdministrationHelper;
/** tab dialog for administrating the office wide registered data sources
*/
class OMySQLIntroPageSetup;

class ODbTypeWizDialogSetup : public svt::RoadmapWizard , public IItemSetHelper, public IDatabaseSettingsDialog,public dbaui::OModuleClient
{

private:
	OModuleClient m_aModuleClient;
	::std::auto_ptr<ODbDataSourceAdministrationHelper>	m_pImpl;
	SfxItemSet*				m_pOutSet;
	::rtl::OUString         m_sURL;
    ::rtl::OUString         m_sOldURL;
	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/>
    sal_Bool                m_bIsConnectable : 1;
    String                  m_sRM_IntroText;
    String                  m_sRM_dBaseText;
    String                  m_sRM_TextText;
    String                  m_sRM_MSAccessText;
    String                  m_sRM_LDAPText;
    String                  m_sRM_ADABASText;
    String                  m_sRM_ADOText;
    String                  m_sRM_JDBCText;
    String                  m_sRM_MySQLNativePageTitle;
    String                  m_sRM_OracleText;
    String                  m_sRM_MySQLText;
    String                  m_sRM_ODBCText;
    String                  m_sRM_SpreadSheetText;
    String                  m_sRM_AuthentificationText;
    String                  m_sRM_FinalText;
    INetURLObject           m_aDocURL;
    String                  m_sWorkPath;
    OGeneralPage*           m_pGeneralPage;
	OMySQLIntroPageSetup*	m_pMySQLIntroPage;
    ::dbaccess::ODsnTypeCollection*	    
                            m_pCollection;	/// the DSN type collection instance



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

	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 void setTitle(const ::rtl::OUString& _sTitle);
    virtual void enableConfirmSettings( bool _bEnable );
    virtual sal_Bool saveDatasource();
    virtual String  getStateDisplayName( WizardState _nState ) const;

    /** returns <TRUE/> if the database should be opened, otherwise <FALSE/>.
    */
    sal_Bool IsDatabaseDocumentToBeOpened() const;

    /** returns <TRUE/> if the table wizard should be opened, otherwise <FALSE/>.
    */
    sal_Bool IsTableWizardToBeStarted() const;

protected:
	/// to override to create new pages
	virtual TabPage*	createPage(WizardState _nState);
	virtual	sal_Bool	leaveState(WizardState _nState);
    virtual void enterState(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)
	};

private:
    /** declares a path with or without authentication, as indicated by the database type

        @param _sURL
            the data source type for which the path is declared. If this
            data source type does not support authentication, the PAGE_DBSETUPWIZARD_AUTHENTIFICATION
            state will be stripped from the sequence of states.
        @param _nPathId
            the ID of the path
        @path
            the first state in this path, following by an arbitrary number of others, as in
            RoadmapWizard::declarePath.
    */
    void declareAuthDepPath( const ::rtl::OUString& _sURL, PathId _nPathId, const svt::RoadmapWizardTypes::WizardPath& _rPaths);

    void RegisterDataSourceByLocation(const ::rtl::OUString& sPath);
    sal_Bool SaveDatabaseDocument();
    void activateDatabasePath();
    String createUniqueFileName(const INetURLObject& rURL);
    void CreateDatabase();
    void createUniqueFolderName(INetURLObject* pURL);
	::dbaccess::DATASOURCE_TYPE VerifyDataSourceType(const ::dbaccess::DATASOURCE_TYPE _DatabaseType) const;

    ::rtl::OUString getDefaultDatabaseType() const;

    void updateTypeDependentStates();
    sal_Bool callSaveAsDialog();
    sal_Bool IsConnectionUrlRequired();
	DECL_LINK(OnTypeSelected, OGeneralPage*);
	DECL_LINK(OnChangeCreationMode, OGeneralPage*);
    DECL_LINK(OnRecentDocumentSelected, OGeneralPage*);
    DECL_LINK(OnSingleDocumentChosen, OGeneralPage*);
    DECL_LINK(ImplClickHdl, OMySQLIntroPageSetup*);
    DECL_LINK(ImplModifiedHdl, OGenericAdministrationPage*);
};

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

#endif // DBAUI_DBWIZ2_HXX

