/**************************************************************
 * 
 * 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 "pcrunodialogs.hxx"
#include "formstrings.hxx"
#include "pcrstrings.hxx"
#include "taborder.hxx"
#include "pcrcommon.hxx"

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

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

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

	//====================================================================
	//= OTabOrderDialog
	//====================================================================
	//---------------------------------------------------------------------
	OTabOrderDialog::OTabOrderDialog( const Reference< XComponentContext >& _rxContext )
		:OGenericUnoDialog( _rxContext )
	{
		registerProperty( PROPERTY_CONTROLCONTEXT, OWN_PROPERTY_ID_CONTROLCONTEXT,
			PropertyAttribute::BOUND | PropertyAttribute::TRANSIENT,
			&m_xControlContext, ::getCppuType( &m_xControlContext ) );

        registerProperty( PROPERTY_TABBINGMODEL, OWN_PROPERTY_ID_TABBINGMODEL,
			PropertyAttribute::BOUND | PropertyAttribute::TRANSIENT,
			&m_xTabbingModel, ::getCppuType( &m_xTabbingModel ) );
	}

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

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

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

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

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

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

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

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

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

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

	//--------------------------------------------------------------------------
	Dialog*	OTabOrderDialog::createDialog( Window* _pParent )
	{
        return new TabOrderDialog( _pParent, m_xTabbingModel, m_xControlContext, m_aContext.getLegacyServiceFactory() );
	}

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

