/**************************************************************
 * 
 * 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_xmloff.hxx"
#include "officeforms.hxx"
#include <xmloff/xmluconv.hxx>
#include <xmloff/xmltoken.hxx>
#include "xmloff/xmlnmspe.hxx"
#include <xmloff/xmlexp.hxx>
#include <xmloff/xmlimp.hxx>
#include <xmloff/nmspmap.hxx>
#include <comphelper/extract.hxx>
#include "strings.hxx"
#include <rtl/logfile.hxx>

//.........................................................................
namespace xmloff
{
//.........................................................................

	using namespace ::com::sun::star::uno;
	using namespace ::com::sun::star::beans;
	using namespace ::com::sun::star::frame;
	using namespace ::com::sun::star::xml;
    using ::xmloff::token::XML_FORMS;

	//=========================================================================
	//= OFormsRootImport
	//=========================================================================
	OFormsRootImport::OFormsRootImport( SvXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLocalName )
		:SvXMLImportContext(rImport, nPrfx, rLocalName)
	{
	}

	//-------------------------------------------------------------------------
	OFormsRootImport::~OFormsRootImport()
	{
	}

	//-------------------------------------------------------------------------
	SvXMLImportContext* OFormsRootImport::CreateChildContext( sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName,
			const Reference< sax::XAttributeList>& xAttrList )
	{
		return GetImport().GetFormImport()->createContext( _nPrefix, _rLocalName, xAttrList );
	}

	//-------------------------------------------------------------------------
	void OFormsRootImport::implImportBool(const Reference< sax::XAttributeList >& _rxAttributes, OfficeFormsAttributes _eAttribute,
			const Reference< XPropertySet >& _rxProps, const Reference< XPropertySetInfo >& _rxPropInfo,
			const ::rtl::OUString& _rPropName, sal_Bool _bDefault)
	{
		// the complete attribute name to look for
		::rtl::OUString sCompleteAttributeName = GetImport().GetNamespaceMap().GetQNameByIndex(
			OAttributeMetaData::getOfficeFormsAttributeNamespace(_eAttribute),
			::rtl::OUString::createFromAscii(OAttributeMetaData::getOfficeFormsAttributeName(_eAttribute)));

		// get and convert the value
		::rtl::OUString sAttributeValue = _rxAttributes->getValueByName(sCompleteAttributeName);
		sal_Bool bValue = _bDefault;
		GetImport().GetMM100UnitConverter().convertBool(bValue, sAttributeValue);

		// set the property
		if (_rxPropInfo->hasPropertyByName(_rPropName))
			_rxProps->setPropertyValue(_rPropName, ::cppu::bool2any(bValue));
	}

	//-------------------------------------------------------------------------
	void OFormsRootImport::StartElement( const Reference< sax::XAttributeList >& _rxAttrList )
	{
		ENTER_LOG_CONTEXT( "xmloff::OFormsRootImport - importing the complete tree" );
		SvXMLImportContext::StartElement( _rxAttrList );

		try
		{
			Reference< XPropertySet > xDocProperties(GetImport().GetModel(), UNO_QUERY);
			if ( xDocProperties.is() )
			{	// an empty model is allowed: when doing a copy'n'paste from e.g. Writer to Calc,
				// this is done via streaming the controls as XML.
				Reference< XPropertySetInfo > xDocPropInfo;
				if (xDocProperties.is())
					xDocPropInfo = xDocProperties->getPropertySetInfo();

				implImportBool(_rxAttrList, ofaAutomaticFocus, xDocProperties, xDocPropInfo, PROPERTY_AUTOCONTROLFOCUS, sal_False);
				implImportBool(_rxAttrList, ofaApplyDesignMode, xDocProperties, xDocPropInfo, PROPERTY_APPLYDESIGNMODE, sal_True);
			}
		}
		catch(Exception&)
		{
			OSL_ENSURE(sal_False, "OFormsRootImport::StartElement: caught an exception while setting the document properties!");
		}
	}

	//-------------------------------------------------------------------------
	void OFormsRootImport::EndElement()
	{
		SvXMLImportContext::EndElement();
		LEAVE_LOG_CONTEXT( );
	}

	//=====================================================================
	//= OFormsRootExport
	//=====================================================================
	//---------------------------------------------------------------------
	OFormsRootExport::OFormsRootExport( SvXMLExport& _rExp )
		:m_pImplElement(NULL)
	{
		addModelAttributes(_rExp);

		m_pImplElement = new SvXMLElementExport(_rExp, XML_NAMESPACE_OFFICE, XML_FORMS, sal_True, sal_True);
	}

	//---------------------------------------------------------------------
	OFormsRootExport::~OFormsRootExport( )
	{
		delete m_pImplElement;
	}

	//-------------------------------------------------------------------------
	void OFormsRootExport::implExportBool(SvXMLExport& _rExp, OfficeFormsAttributes _eAttribute,
		const Reference< XPropertySet >& _rxProps, const Reference< XPropertySetInfo >& _rxPropInfo,
		const ::rtl::OUString& _rPropName, sal_Bool _bDefault)
	{
		// retrieve the property value
		sal_Bool bValue = _bDefault;
		if (_rxPropInfo->hasPropertyByName(_rPropName))
			bValue = ::cppu::any2bool(_rxProps->getPropertyValue(_rPropName));

		// convert into a string
		::rtl::OUStringBuffer aValue;
		_rExp.GetMM100UnitConverter().convertBool(aValue, bValue);

		// add the attribute
		_rExp.AddAttribute(
			OAttributeMetaData::getOfficeFormsAttributeNamespace(_eAttribute),
			OAttributeMetaData::getOfficeFormsAttributeName(_eAttribute),
			aValue.makeStringAndClear());
	}

	//-------------------------------------------------------------------------
	void OFormsRootExport::addModelAttributes(SvXMLExport& _rExp) SAL_THROW(())
	{
		try
		{
			Reference< XPropertySet > xDocProperties(_rExp.GetModel(), UNO_QUERY);
			if ( xDocProperties.is() )
			{	// an empty model is allowed: when doing a copy'n'paste from e.g. Writer to Calc,
				// this is done via streaming the controls as XML.
				Reference< XPropertySetInfo > xDocPropInfo;
				if (xDocProperties.is())
					xDocPropInfo = xDocProperties->getPropertySetInfo();

				implExportBool(_rExp, ofaAutomaticFocus, xDocProperties, xDocPropInfo, PROPERTY_AUTOCONTROLFOCUS, sal_False);
				implExportBool(_rExp, ofaApplyDesignMode, xDocProperties, xDocPropInfo, PROPERTY_APPLYDESIGNMODE, sal_True);
			}
		}
		catch(Exception&)
		{
			OSL_ENSURE(sal_False, "OFormsRootExport::addModelAttributes: caught an exception while retrieving the document properties!");
		}
	}

//.........................................................................
}	// namespace xmloff
//.........................................................................


