/**************************************************************
 * 
 * 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_svtools.hxx"
#include "svtools/genericunodialog.hxx"
#include <svtools/addresstemplate.hxx>
#include <comphelper/extract.hxx>
#include <cppuhelper/typeprovider.hxx>
#include <comphelper/property.hxx>
#include <com/sun/star/sdbc/XDataSource.hpp>

class SfxItemSet;
class SfxItemPool;
class SfxPoolItem;

// .......................................................................
namespace svt
{
// .......................................................................

#define UNODIALOG_PROPERTY_ID_ALIASES		100
#define UNODIALOG_PROPERTY_ALIASES			"FieldMapping"

	using namespace com::sun::star::uno;
	using namespace com::sun::star::lang;
	using namespace com::sun::star::util;
	using namespace com::sun::star::beans;
	using namespace com::sun::star::sdbc;

	//=========================================================================
	//= OAddressBookSourceDialogUno
	//=========================================================================
	typedef OGenericUnoDialog OAddressBookSourceDialogUnoBase;
	class OAddressBookSourceDialogUno
			:public OAddressBookSourceDialogUnoBase
			,public ::comphelper::OPropertyArrayUsageHelper< OAddressBookSourceDialogUno >
	{
	protected:
		Sequence< AliasProgrammaticPair >	m_aAliases;
        Reference< XDataSource >            m_xDataSource;
        ::rtl::OUString                     m_sDataSourceName;
		::rtl::OUString						m_sTable;

	protected:
		OAddressBookSourceDialogUno(const Reference< XMultiServiceFactory >& _rxORB);

	public:
		// XTypeProvider
		virtual Sequence<sal_Int8> SAL_CALL getImplementationId(  ) throw(RuntimeException);

		// XServiceInfo
		virtual ::rtl::OUString SAL_CALL getImplementationName() throw(RuntimeException);
		virtual ::comphelper::StringSequence SAL_CALL getSupportedServiceNames() throw(RuntimeException);

		// XServiceInfo - static methods
		static Sequence< ::rtl::OUString > getSupportedServiceNames_Static(void) throw( RuntimeException );
		static ::rtl::OUString getImplementationName_Static(void) throw( RuntimeException );
		static Reference< XInterface >
				SAL_CALL Create(const Reference< com::sun::star::lang::XMultiServiceFactory >&);

		// XPropertySet
		virtual Reference< XPropertySetInfo>  SAL_CALL getPropertySetInfo() throw(RuntimeException);
		virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper();

		// OPropertyArrayUsageHelper
		virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const;

	protected:
	// OGenericUnoDialog overridables
		virtual Dialog*	createDialog(Window* _pParent);

		virtual void implInitialize(const com::sun::star::uno::Any& _rValue);

		virtual void executedDialog(sal_Int16 _nExecutionResult);
	};


	//=========================================================================
	//= OAddressBookSourceDialogUno
	//=========================================================================
	Reference< XInterface > SAL_CALL OAddressBookSourceDialogUno_CreateInstance( const Reference< XMultiServiceFactory >& _rxFactory)
	{
		return OAddressBookSourceDialogUno::Create(_rxFactory);
	}

	//-------------------------------------------------------------------------
	OAddressBookSourceDialogUno::OAddressBookSourceDialogUno(const Reference< XMultiServiceFactory >& _rxORB)
		:OGenericUnoDialog(_rxORB)
	{
		registerProperty(::rtl::OUString::createFromAscii(UNODIALOG_PROPERTY_ALIASES), UNODIALOG_PROPERTY_ID_ALIASES, PropertyAttribute::READONLY,
			&m_aAliases, getCppuType(&m_aAliases));
	}

	//-------------------------------------------------------------------------
	Sequence<sal_Int8> SAL_CALL OAddressBookSourceDialogUno::getImplementationId(  ) throw(RuntimeException)
	{
		static ::cppu::OImplementationId aId;
		return aId.getImplementationId();
	}

	//-------------------------------------------------------------------------
	Reference< XInterface > SAL_CALL OAddressBookSourceDialogUno::Create(const Reference< XMultiServiceFactory >& _rxFactory)
	{
		return *(new OAddressBookSourceDialogUno(_rxFactory));
	}

	//-------------------------------------------------------------------------
	::rtl::OUString SAL_CALL OAddressBookSourceDialogUno::getImplementationName() throw(RuntimeException)
	{
		return getImplementationName_Static();
	}

	//-------------------------------------------------------------------------
	::rtl::OUString OAddressBookSourceDialogUno::getImplementationName_Static() throw(RuntimeException)
	{
		return ::rtl::OUString::createFromAscii("com.sun.star.comp.svtools.OAddressBookSourceDialogUno");
	}

	//-------------------------------------------------------------------------
	::comphelper::StringSequence SAL_CALL OAddressBookSourceDialogUno::getSupportedServiceNames() throw(RuntimeException)
	{
		return getSupportedServiceNames_Static();
	}

	//-------------------------------------------------------------------------
	::comphelper::StringSequence OAddressBookSourceDialogUno::getSupportedServiceNames_Static() throw(RuntimeException)
	{
		::comphelper::StringSequence aSupported(1);
		aSupported.getArray()[0] = ::rtl::OUString::createFromAscii("com.sun.star.ui.AddressBookSourceDialog");
		return aSupported;
	}

	//-------------------------------------------------------------------------
	Reference<XPropertySetInfo>  SAL_CALL OAddressBookSourceDialogUno::getPropertySetInfo() throw(RuntimeException)
	{
		Reference<XPropertySetInfo>  xInfo( createPropertySetInfo( getInfoHelper() ) );
		return xInfo;
	}

	//-------------------------------------------------------------------------
	::cppu::IPropertyArrayHelper& OAddressBookSourceDialogUno::getInfoHelper()
	{
		return *const_cast<OAddressBookSourceDialogUno*>(this)->getArrayHelper();
	}

	//------------------------------------------------------------------------------
	::cppu::IPropertyArrayHelper* OAddressBookSourceDialogUno::createArrayHelper( ) const
	{
		Sequence< Property > aProps;
		describeProperties(aProps);
		return new ::cppu::OPropertyArrayHelper(aProps);
	}

	//------------------------------------------------------------------------------
	void OAddressBookSourceDialogUno::executedDialog(sal_Int16 _nExecutionResult)
	{
		OAddressBookSourceDialogUnoBase::executedDialog(_nExecutionResult);

		if ( _nExecutionResult )
			if ( m_pDialog )
				static_cast< AddressBookSourceDialog* >( m_pDialog )->getFieldMapping( m_aAliases );
	}

	//------------------------------------------------------------------------------
	void OAddressBookSourceDialogUno::implInitialize(const com::sun::star::uno::Any& _rValue)
	{
		PropertyValue aVal;
		if (_rValue >>= aVal)
		{
			if (0 == aVal.Name.compareToAscii("DataSource"))
			{
#if OSL_DEBUG_LEVEL > 0
				sal_Bool bSuccess =
#endif
				aVal.Value >>= m_xDataSource;
				OSL_ENSURE( bSuccess, "OAddressBookSourceDialogUno::implInitialize: invalid type for DataSource!" );
				return;
			}

			if (0 == aVal.Name.compareToAscii("DataSourceName"))
			{
#if OSL_DEBUG_LEVEL > 0
				sal_Bool bSuccess =
#endif
				aVal.Value >>= m_sDataSourceName;
				OSL_ENSURE( bSuccess, "OAddressBookSourceDialogUno::implInitialize: invalid type for DataSourceName!" );
				return;
            }

			if (0 == aVal.Name.compareToAscii("Command"))
			{
#if OSL_DEBUG_LEVEL > 0
				sal_Bool bSuccess =
#endif
				aVal.Value >>= m_sTable;
				OSL_ENSURE( bSuccess, "OAddressBookSourceDialogUno::implInitialize: invalid type for Command!" );
				return;
			}
		}

		OAddressBookSourceDialogUnoBase::implInitialize( _rValue );
	}

	//------------------------------------------------------------------------------
	Dialog*	OAddressBookSourceDialogUno::createDialog(Window* _pParent)
	{
		if ( m_xDataSource.is() && m_sTable.getLength() )
			return new AddressBookSourceDialog(_pParent, m_aContext.getLegacyServiceFactory(), m_xDataSource, m_sDataSourceName, m_sTable, m_aAliases );
		else
			return new AddressBookSourceDialog( _pParent, m_aContext.getLegacyServiceFactory() );
	}

// .......................................................................
}	// namespace svt
// .......................................................................

