/**************************************************************
 *
 * 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 "fieldmappingpage.hxx"
#include "fieldmappingimpl.hxx"
#include "addresssettings.hxx"
#include "abspilot.hxx"

//.........................................................................
namespace abp
{
//.........................................................................

	//=====================================================================
	//= FieldMappingPage
	//=====================================================================
	//---------------------------------------------------------------------
	FieldMappingPage::FieldMappingPage( OAddessBookSourcePilot* _pParent )
		:AddressBookSourcePage( _pParent, ModuleRes( RID_PAGE_FIELDMAPPING ) )
		,m_aExplanation		( this, ModuleRes( FT_FIELDASSIGMENTEXPL ) )
		,m_aInvokeDialog	( this, ModuleRes( PB_INVOKE_FIELDS_DIALOG ) )
		,m_aHint			( this, ModuleRes( FT_ASSIGNEDFIELDS ) )
	{
		FreeResource();

		m_aInvokeDialog.SetClickHdl( LINK( this, FieldMappingPage, OnInvokeDialog ) );

		// check the size of the InvokeDialog button - some languages are very ... gossipy here ....
		// 96349 - 09.01.2002 - fs@openoffice.org
		sal_Int32 nTextWidth = m_aInvokeDialog.GetTextWidth( m_aInvokeDialog.GetText() );

		sal_Int32 nBorderSpace = m_aInvokeDialog.LogicToPixel( Point( 4, 0 ), MAP_APPFONT ).X();
		sal_Int32 nSpace = m_aInvokeDialog.GetOutputSizePixel().Width() - 2 * nBorderSpace;

		if ( nSpace < nTextWidth )
		{
			Size aButtonSize = m_aInvokeDialog.GetSizePixel();
			aButtonSize.Width() += nTextWidth - nSpace;
			m_aInvokeDialog.SetSizePixel( aButtonSize );
		}
	}

	//---------------------------------------------------------------------
	void FieldMappingPage::ActivatePage()
	{
		AddressBookSourcePage::ActivatePage();
		m_aInvokeDialog.GrabFocus();
	}

	//---------------------------------------------------------------------
	void FieldMappingPage::DeactivatePage()
	{
		AddressBookSourcePage::DeactivatePage();
	}

	//---------------------------------------------------------------------
	void FieldMappingPage::initializePage()
	{
		AddressBookSourcePage::initializePage();
		implUpdateHint();
	}

	//---------------------------------------------------------------------
	void FieldMappingPage::implUpdateHint()
	{
		const AddressSettings& rSettings = getSettings();
		String sHint;
		if ( 0 == rSettings.aFieldMapping.size() )
			sHint = String( ModuleRes( RID_STR_NOFIELDSASSIGNED ) );
		m_aHint.SetText( sHint );
	}

	//---------------------------------------------------------------------
	IMPL_LINK( FieldMappingPage, OnInvokeDialog, void*, /*NOTINTERESTEDIN*/ )
	{
		AddressSettings& rSettings = getSettings();

		// invoke the dialog doing the mapping
		if ( fieldmapping::invokeDialog( getORB(), this, getDialog()->getDataSource().getDataSource(), rSettings ) )
		{
			if ( rSettings.aFieldMapping.size() )
				getDialog()->travelNext();
			else
				implUpdateHint();
		}

		return 0L;
	}

//.........................................................................
}	// namespace abp
//.........................................................................
