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

#ifndef _EXTENSIONS_PROPCTRLR_FONTITEMIDS_HXX_
#include "controlfontdialog.hxx"
#endif
#include <cppuhelper/typeprovider.hxx>
#include "fontdialog.hxx"
#include "formstrings.hxx"
#include "pcrcommon.hxx"

extern "C" void SAL_CALL createRegistryInfo_OControlFontDialog()
{
	::pcr::OAutoRegistration< ::pcr::OControlFontDialog > aAutoRegistration;
}

//........................................................................
namespace pcr
{
//........................................................................

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

	//====================================================================
	//= OControlFontDialog
	//====================================================================
	//---------------------------------------------------------------------
	OControlFontDialog::OControlFontDialog(const Reference< XComponentContext >& _rxContext )
		:OGenericUnoDialog( _rxContext )
		,m_pFontItems(NULL)
		,m_pItemPool(NULL)
		,m_pItemPoolDefaults(NULL)
	{
		registerProperty(PROPERTY_INTROSPECTEDOBJECT, OWN_PROPERTY_ID_INTROSPECTEDOBJECT,
			PropertyAttribute::BOUND | PropertyAttribute::TRANSIENT,
			&m_xControlModel, ::getCppuType(&m_xControlModel));
	}

	//---------------------------------------------------------------------
	OControlFontDialog::~OControlFontDialog()
	{
		if (m_pDialog)
		{
			::osl::MutexGuard aGuard(m_aMutex);
			if (m_pDialog)
				destroyDialog();
		}
	}

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

	//---------------------------------------------------------------------
	Reference< XInterface > SAL_CALL OControlFontDialog::Create( const Reference< XComponentContext >& _rxContext )
	{
		return *( new OControlFontDialog( _rxContext ) );
	}

	//---------------------------------------------------------------------
	::rtl::OUString SAL_CALL OControlFontDialog::getImplementationName() throw(RuntimeException)
	{
		return getImplementationName_static();
	}

	//---------------------------------------------------------------------
	::rtl::OUString OControlFontDialog::getImplementationName_static() throw(RuntimeException)
	{
		return ::rtl::OUString::createFromAscii("org.openoffice.comp.form.ui.OControlFontDialog");
	}

	//---------------------------------------------------------------------
	::comphelper::StringSequence SAL_CALL OControlFontDialog::getSupportedServiceNames() throw(RuntimeException)
	{
		return getSupportedServiceNames_static();
	}

	//---------------------------------------------------------------------
	::comphelper::StringSequence OControlFontDialog::getSupportedServiceNames_static() throw(RuntimeException)
	{
		::comphelper::StringSequence aSupported(1);
		aSupported.getArray()[0] = ::rtl::OUString::createFromAscii("com.sun.star.form.ControlFontDialog");
		return aSupported;
	}

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

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

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

	//--------------------------------------------------------------------------
	Dialog*	OControlFontDialog::createDialog(Window* _pParent)
	{
		ControlCharacterDialog::createItemSet(m_pFontItems, m_pItemPool, m_pItemPoolDefaults);

		OSL_ENSURE(m_xControlModel.is(), "OControlFontDialog::createDialog: no introspectee set!");
		if (m_xControlModel.is())
			ControlCharacterDialog::translatePropertiesToItems(m_xControlModel, m_pFontItems);
		// TODO: we need a mechanism to prevent that somebody creates us, sets an introspectee, executes us,
		// sets a new introspectee and re-executes us. In this case, the dialog returned here (upon the first
		// execute) will be re-used upon the second execute, and thus it won't be initialized correctly.

		ControlCharacterDialog* pDialog = new ControlCharacterDialog(_pParent, *m_pFontItems);
		return pDialog;
	}

	//-------------------------------------------------------------------------
	void OControlFontDialog::destroyDialog()
	{
		OGenericUnoDialog::destroyDialog();
		ControlCharacterDialog::destroyItemSet(m_pFontItems, m_pItemPool, m_pItemPoolDefaults);
	}

	//-------------------------------------------------------------------------
	void OControlFontDialog::executedDialog(sal_Int16 _nExecutionResult)
	{
		OSL_ENSURE(m_pDialog, "OControlFontDialog::executedDialog: no dialog anymore?!!");
		if (m_pDialog && (sal_True == _nExecutionResult) && m_xControlModel.is())
		{
			const SfxItemSet* pOutput = static_cast<ControlCharacterDialog*>(m_pDialog)->GetOutputItemSet();
			if (pOutput)
				ControlCharacterDialog::translateItemsToProperties( *pOutput, m_xControlModel );
		}
	}

//........................................................................
}	// namespace pcr
//........................................................................
