/**************************************************************
 * 
 * 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 <com/sun/star/style/XStyle.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/style/PageStyleLayout.hpp>
#include <com/sun/star/beans/XMultiPropertyStates.hpp>
#include <xmloff/nmspmap.hxx>
#include "xmloff/xmlnmspe.hxx"
#include <xmloff/xmltoken.hxx>
#include <xmloff/XMLTextMasterPageContext.hxx>
#include "XMLTextHeaderFooterContext.hxx"
#include <xmloff/xmlimp.hxx>
#include "PageMasterImportContext.hxx"


using ::rtl::OUString;
using ::rtl::OUStringBuffer;

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::xml::sax;
using namespace ::com::sun::star::style;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::lang;
//using namespace ::com::sun::star::text;
using namespace ::xmloff::token;

Reference < XStyle > XMLTextMasterPageContext::Create()
{
	Reference < XStyle > xNewStyle;

	Reference< XMultiServiceFactory > xFactory( GetImport().GetModel(),
													UNO_QUERY );
	if( xFactory.is() )
	{
		Reference < XInterface > xIfc =
			xFactory->createInstance(OUString(RTL_CONSTASCII_USTRINGPARAM(
									"com.sun.star.style.PageStyle")) );
		if( xIfc.is() )
			xNewStyle = Reference < XStyle >( xIfc, UNO_QUERY );
	}

	return xNewStyle;
}

XMLTextMasterPageContext::XMLTextMasterPageContext( SvXMLImport& rImport,
		sal_uInt16 nPrfx, const OUString& rLName,
		const Reference< XAttributeList > & xAttrList,
		sal_Bool bOverwrite )
:	SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_MASTER_PAGE )
,	sIsPhysical( RTL_CONSTASCII_USTRINGPARAM( "IsPhysical" ) )
,	sPageStyleLayout( RTL_CONSTASCII_USTRINGPARAM( "PageStyleLayout" ) )
,	sFollowStyle( RTL_CONSTASCII_USTRINGPARAM( "FollowStyle" ) )
,	bInsertHeader( sal_False )
,	bInsertFooter( sal_False )
,	bInsertHeaderLeft( sal_False )
,	bInsertFooterLeft( sal_False )
,	bHeaderInserted( sal_False )
,	bFooterInserted( sal_False )
,	bHeaderLeftInserted( sal_False )
,	bFooterLeftInserted( sal_False )
{
	OUString sName, sDisplayName;
	sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
	for( sal_Int16 i=0; i < nAttrCount; i++ )
	{
		const OUString& rAttrName = xAttrList->getNameByIndex( i );
		OUString aLocalName;
		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,	&aLocalName );
		if( XML_NAMESPACE_STYLE == nPrefix )
		{
			if( IsXMLToken( aLocalName, XML_NAME ) )
			{
				sName = xAttrList->getValueByIndex( i );
			}
			else if( IsXMLToken( aLocalName, XML_DISPLAY_NAME ) )
			{
				sDisplayName = xAttrList->getValueByIndex( i );
			}
			else if( IsXMLToken( aLocalName, XML_NEXT_STYLE_NAME ) )
			{
				sFollow = xAttrList->getValueByIndex( i );
			}
			else if( IsXMLToken( aLocalName, XML_PAGE_LAYOUT_NAME ) )
			{
				sPageMasterName = xAttrList->getValueByIndex( i );
			}
		}
	}

	if( sDisplayName.getLength() )
	{
		rImport.AddStyleDisplayName( XML_STYLE_FAMILY_MASTER_PAGE, sName,
									 sDisplayName );
	}
	else
	{
		sDisplayName = sName;
	}

	if( 0 == sDisplayName.getLength() )
		return;

	Reference < XNameContainer > xPageStyles =
			GetImport().GetTextImport()->GetPageStyles();
	if( !xPageStyles.is() )
		return;

	Any aAny;
	sal_Bool bNew = sal_False;
	if( xPageStyles->hasByName( sDisplayName ) )
	{
		aAny = xPageStyles->getByName( sDisplayName );
		aAny >>= xStyle;
	}
	else
	{
		xStyle = Create();
		if( !xStyle.is() )
			return;

		aAny <<= xStyle;
		xPageStyles->insertByName( sDisplayName, aAny );
		bNew = sal_True;
	}

	Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY );
	Reference< XPropertySetInfo > xPropSetInfo =
				xPropSet->getPropertySetInfo();
	if( !bNew && xPropSetInfo->hasPropertyByName( sIsPhysical ) )
	{
		aAny = xPropSet->getPropertyValue( sIsPhysical );
		bNew = !*(sal_Bool *)aAny.getValue();
	}
	SetNew( bNew );

	if( bOverwrite || bNew )
	{
		Reference < XMultiPropertyStates > xMultiStates( xPropSet,
														 UNO_QUERY );
		OSL_ENSURE( xMultiStates.is(), 
					"text page style does not support multi property set" );
		if( xMultiStates.is() )
			xMultiStates->setAllPropertiesToDefault();

		bInsertHeader = bInsertFooter = sal_True;
		bInsertHeaderLeft = bInsertFooterLeft = sal_True;
	}
}

XMLTextMasterPageContext::~XMLTextMasterPageContext()
{
}

SvXMLImportContext *XMLTextMasterPageContext::CreateChildContext(
		sal_uInt16 nPrefix,
		const OUString& rLocalName,
		const Reference< XAttributeList > & xAttrList )
{
	SvXMLImportContext *pContext = 0;

	const SvXMLTokenMap& rTokenMap =
		GetImport().GetTextImport()->GetTextMasterPageElemTokenMap();

	sal_Bool bInsert = sal_False, bFooter = sal_False, bLeft = sal_False;
	switch( rTokenMap.Get( nPrefix, rLocalName ) )
	{
	case XML_TOK_TEXT_MP_HEADER:
		if( bInsertHeader && !bHeaderInserted )
		{
			bInsert = sal_True;
			bHeaderInserted = sal_True;
		}
		break;
	case XML_TOK_TEXT_MP_FOOTER:
		if( bInsertFooter && !bFooterInserted )
		{
			bInsert = bFooter = sal_True;
			bFooterInserted = sal_True;
		}
		break;
	case XML_TOK_TEXT_MP_HEADER_LEFT:
		if( bInsertHeaderLeft && bHeaderInserted && !bHeaderLeftInserted )
			bInsert = bLeft = sal_True;
		break;
	case XML_TOK_TEXT_MP_FOOTER_LEFT:
		if( bInsertFooterLeft && bFooterInserted && !bFooterLeftInserted )
			bInsert = bFooter = bLeft = sal_True;
		break;
	}

	if( bInsert && xStyle.is() )
	{
		pContext = CreateHeaderFooterContext( nPrefix, rLocalName,
													xAttrList,
													bFooter, bLeft );
	}
	else
	{
		pContext = SvXMLStyleContext::CreateChildContext( nPrefix, rLocalName,
														  xAttrList );
	}

	return pContext;
}

SvXMLImportContext *XMLTextMasterPageContext::CreateHeaderFooterContext(
			sal_uInt16 nPrefix,
			const ::rtl::OUString& rLocalName,
			const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList > & xAttrList,
			const sal_Bool bFooter,
			const sal_Bool bLeft )
{
	Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY );
	return new XMLTextHeaderFooterContext( GetImport(),
												nPrefix, rLocalName,
												xAttrList,
												xPropSet,
												bFooter, bLeft );
}

void XMLTextMasterPageContext::Finish( sal_Bool bOverwrite )
{
	if( xStyle.is() && (IsNew() || bOverwrite) )
	{
		Reference < XPropertySet > xPropSet( xStyle, UNO_QUERY );
		if( sPageMasterName.getLength() )
		{
			XMLPropStyleContext* pStyle =
				GetImport().GetTextImport()->FindPageMaster( sPageMasterName );
			if (pStyle)
			{
				pStyle->FillPropertySet(xPropSet);
			}
		}

		Reference < XNameContainer > xPageStyles =
			GetImport().GetTextImport()->GetPageStyles();
		if( !xPageStyles.is() )
			return;

		Reference< XPropertySetInfo > xPropSetInfo =
			xPropSet->getPropertySetInfo();
		if( xPropSetInfo->hasPropertyByName( sFollowStyle ) )
		{
			OUString sDisplayFollow(
				GetImport().GetStyleDisplayName(
						XML_STYLE_FAMILY_MASTER_PAGE, sFollow ) );
			if( !sDisplayFollow.getLength() || 
				!xPageStyles->hasByName( sDisplayFollow ) )
				sDisplayFollow = xStyle->getName();

			Any aAny = xPropSet->getPropertyValue( sFollowStyle );
			OUString sCurrFollow;
			aAny >>= sCurrFollow;
			if( sCurrFollow != sDisplayFollow )
			{
				aAny <<= sDisplayFollow;
				xPropSet->setPropertyValue( sFollowStyle, aAny );
			}
		}
	}
}
