/**************************************************************
 *
 * 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.
 *
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_extensions.hxx"
#include "abpfinalpage.hxx"
#include "addresssettings.hxx"
#include "abspilot.hxx"
#include <tools/debug.hxx>
#include <tools/urlobj.hxx>
#include <unotools/ucbhelper.hxx>
#include <sfx2/filedlghelper.hxx>
#include <unotools/pathoptions.hxx>
#ifndef SVTOOLS_FILENOTATION_HXX_
#include <svl/filenotation.hxx>
#endif
#include <sfx2/docfilt.hxx>
#include <vcl/msgbox.hxx>
#include <comphelper/componentcontext.hxx>
#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>

//.........................................................................
namespace abp
{
//.........................................................................
	using namespace ::svt;
	using namespace ::utl;

	const SfxFilter* lcl_getBaseFilter()
	{
		static const String s_sDatabaseType = String::CreateFromAscii("StarOffice XML (Base)");
		const SfxFilter* pFilter = SfxFilter::GetFilterByName( s_sDatabaseType);
		OSL_ENSURE(pFilter,"Filter: StarOffice XML (Base) could not be found!");
		return pFilter;
	}
	//=====================================================================
	//= FinalPage
	//=====================================================================
	//---------------------------------------------------------------------
	FinalPage::FinalPage( OAddessBookSourcePilot* _pParent )
		:AddressBookSourcePage(_pParent, ModuleRes(RID_PAGE_FINAL))
		,m_aExplanation			( this, ModuleRes( FT_FINISH_EXPL ) )
		,m_aLocationLabel		( this, ModuleRes( FT_LOCATION ) )
		,m_aLocation			( this, ModuleRes( CBB_LOCATION ) )
		,m_aBrowse				( this, ModuleRes( PB_BROWSE ) )
		,m_aRegisterName		( this, ModuleRes( CB_REGISTER_DS ) )
		,m_aNameLabel			( this, ModuleRes( FT_NAME_EXPL ) )
		,m_aName				( this, ModuleRes( ET_DATASOURCENAME ) )
		,m_aDuplicateNameError	( this, ModuleRes( FT_DUPLICATENAME ) )
        ,m_aLocationController( ::comphelper::ComponentContext( _pParent->getORB() ), m_aLocation, m_aBrowse )
	{
		FreeResource();

		m_aName.SetModifyHdl( LINK(this, FinalPage, OnNameModified) );
		m_aLocation.SetModifyHdl( LINK(this, FinalPage, OnNameModified) );
		m_aRegisterName.SetClickHdl( LINK( this, FinalPage, OnRegister ) );
		m_aRegisterName.Check(sal_True);
	}

	//---------------------------------------------------------------------
	sal_Bool FinalPage::isValidName() const
	{
		::rtl::OUString sCurrentName(m_aName.GetText());

		if (0 == sCurrentName.getLength())
			// the name must not be empty
			return sal_False;

		if ( m_aInvalidDataSourceNames.find( sCurrentName ) != m_aInvalidDataSourceNames.end() )
			// there already is a data source with this name
			return sal_False;

		return sal_True;
	}

	//---------------------------------------------------------------------
	void FinalPage::setFields()
	{
		AddressSettings& rSettings = getSettings();

		INetURLObject aURL( rSettings.sDataSourceName );
		if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
		{
			String sPath = SvtPathOptions().GetWorkPath();
			sPath += '/';
			sPath += String(rSettings.sDataSourceName);

			const SfxFilter* pFilter = lcl_getBaseFilter();
			if ( pFilter )
			{
				String sExt = pFilter->GetDefaultExtension();
				sPath += sExt.GetToken(1,'*');
			}

			aURL.SetURL(sPath);
		}
		OSL_ENSURE( aURL.GetProtocol() != INET_PROT_NOT_VALID ,"No valid file name!");
		rSettings.sDataSourceName = aURL.GetMainURL( INetURLObject::NO_DECODE );
        m_aLocationController.setURL( rSettings.sDataSourceName );
		String sName = aURL.getName( );
		xub_StrLen nPos = sName.Search(String(aURL.GetExtension()));
		if ( nPos != STRING_NOTFOUND )
		{
			sName.Erase(nPos-1,4);
		}
		m_aName.SetText(sName);

		OnRegister(&m_aRegisterName);
	}

	//---------------------------------------------------------------------
	void FinalPage::initializePage()
	{
		AddressBookSourcePage::initializePage();

		setFields();
	}

	//---------------------------------------------------------------------
    sal_Bool FinalPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
	{
		if (!AddressBookSourcePage::commitPage(_eReason))
			return sal_False;

        if  (   ( ::svt::WizardTypes::eTravelBackward != _eReason )
            &&  ( !m_aLocationController.prepareCommit() )
            )
            return sal_False;

		AddressSettings& rSettings = getSettings();
		rSettings.sDataSourceName = m_aLocationController.getURL();
		rSettings.bRegisterDataSource = m_aRegisterName.IsChecked();
		if ( rSettings.bRegisterDataSource )
			rSettings.sRegisteredDataSourceName = m_aName.GetText();

		return sal_True;
	}

	//---------------------------------------------------------------------
	void FinalPage::ActivatePage()
	{
		AddressBookSourcePage::ActivatePage();

		// get the names of all data sources
		ODataSourceContext aContext( getORB() );
		aContext.getDataSourceNames( m_aInvalidDataSourceNames );

		// give the name edit the focus
		m_aLocation.GrabFocus();

		// default the finish button
		getDialog()->defaultButton( WZB_FINISH );
	}

	//---------------------------------------------------------------------
	void FinalPage::DeactivatePage()
	{
		AddressBookSourcePage::DeactivatePage();

		// default the "next" button, again
		getDialog()->defaultButton( WZB_NEXT );
		// disable the finish button
		getDialog()->enableButtons( WZB_FINISH, sal_False );
	}

	//---------------------------------------------------------------------
	bool FinalPage::canAdvance() const
	{
		return false;
	}

	//---------------------------------------------------------------------
	void FinalPage::implCheckName()
	{
		sal_Bool bValidName = isValidName();
		sal_Bool bEmptyName = 0 == m_aName.GetText().Len();
		sal_Bool bEmptyLocation = 0 == m_aLocation.GetText().Len();

		// enable or disable the finish button
		getDialog()->enableButtons( WZB_FINISH, !bEmptyLocation && (!m_aRegisterName.IsChecked() || bValidName) );

		// show the error message for an invalid name
		m_aDuplicateNameError.Show( !bValidName && !bEmptyName );
	}

	//---------------------------------------------------------------------
	IMPL_LINK( FinalPage, OnNameModified, Edit*, /**/ )
	{
		implCheckName();
		return 0L;
	}

    // -----------------------------------------------------------------------------
	IMPL_LINK( FinalPage, OnRegister, CheckBox*, EMPTYARG )
	{
		sal_Bool bEnable = m_aRegisterName.IsChecked();
		m_aNameLabel.Enable(bEnable);
		m_aName.Enable(bEnable);
		implCheckName();
		return 0L;
	}
//.........................................................................
}	// namespace abp
//.........................................................................
